ERC-20
Overview
Max Total Supply
1,463,636,349,000,000 AVAV
Holders
192
Market
Price
$0.00 @ 0.000000 ETH (+0.23%)
Onchain Market Cap
$4,837,350.37
Circulating Supply Market Cap
$0.00
Other Info
Token Contract (WITH 18 Decimals)
Balance
15,333,333,180 AVAVValue
$50.68 ( ~0.0156505925168469 Eth) [0.0010%]Loading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
AvabToken
Compiler Version
v0.8.19+commit.7dd6d404
Optimization Enabled:
Yes with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
//SPDX-License-Identifier: UNLICENSED pragma solidity ^0.8.19; import "./ERC404.sol"; import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; import "@openzeppelin/contracts/utils/Strings.sol"; import "@openzeppelin/contracts/utils/Address.sol"; contract AvabToken is ERC404 { string public baseTokenURI; string public dataURI; uint256 unit; constructor( address _owner, string memory _symbol, uint256 supply, uint256 _unit ) ERC404(_symbol, _symbol, 18, supply, _owner, _unit) { } function mint(uint256 amount, address user) public onlyOwner { _mintToken(user, amount); } function blur(uint256 amount, address user) public onlyOwner { _blurToken(user, amount); } function setDataURI(string memory _dataURI) public onlyOwner { dataURI = _dataURI; } function setTokenURI(string memory _tokenURI) public onlyOwner { baseTokenURI = _tokenURI; } function tokenURI(uint256 id) public view override returns (string memory) { if (bytes(baseTokenURI).length > 0) { return string.concat(baseTokenURI, Strings.toString(id)); } else { uint8 seed = uint8(bytes1(keccak256(abi.encodePacked(id)))); string memory image; string memory description; string memory series; if (seed <= 25) { image = "Diamond.jpg"; description = "Diamond Epoch : At the pinnacle stands the Diamond Epoch, the zenith of rarity and luxury. These boxes are the rarest of all, transcending the commonality of the collection to offer a piece of history, a timeless epoch captured in a digital format. Reserved for the elite, the Diamond Epoch is the ultimate symbol of status and achievement in the world of NFTs."; series = "Diamond Epoch"; } else if (seed <= 63) { image = "Emerald.jpg"; description = "Emerald Legend : Step into a world of myths with the Emerald Legend. Shrouded in the hues of the richest green, these boxes are as rare as they are legendary, offering a glimpse into a narrative woven from the threads of digital destiny. Only the most dedicated holders will unveil the legends within."; series = "Emerald Legend"; } else if (seed <= 114) { image = "Gold.jpg"; description = "Gold Glory : Indulge in the opulence of the Gold Glory. This box is a testament to the splendor and prestige that only the few will know. It's a trove of value, a mark of distinction for serious collectors seeking to cement their legacy in the annals of the digital realm."; series = "Gold Glory"; } else if (seed <= 177) { image = "Silver.jpg"; description = "Silver Fantasy : Elevate your quest with the Silver Fantasy. Within its confines lies the allure of possibility, a step above the ordinary with treasures that spark the imagination. A collection that's rare, filled with wonders waiting to be revealed by those with the vision to see beyond."; series = "Silver Fantasy"; } else { image = "Bronze.jpg"; description = "Bronze Mystery : Begin your adventure with the Bronze Mystery, where every twist and turn holds the potential of hidden treasures. Common yet unpredictable, these boxes are the first step in a journey of discovery for any collector on the Ethereum blockchain."; series = "Bronze Mystery"; } string memory jsonPreImage = string.concat( string.concat( string.concat('{"name": "',name,' #', Strings.toString(id)), '","description":"',description,'","image":"' ), string.concat(dataURI, image) ); string memory jsonPostImage = string.concat( '","attributes":[{"trait_type":"Series","value":"', series ); string memory jsonPostTraits = '"}]}'; return string.concat( "data:application/json;utf8,", string.concat( string.concat(jsonPreImage, jsonPostImage), jsonPostTraits ) ); } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/draft-IERC20Permit.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612]. * * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by * presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't * need to send a transaction, and thus is not required to hold Ether at all. */ interface IERC20Permit { /** * @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens, * given ``owner``'s signed approval. * * IMPORTANT: The same issues {IERC20-approve} has related to transaction * ordering also apply here. * * Emits an {Approval} event. * * Requirements: * * - `spender` cannot be the zero address. * - `deadline` must be a timestamp in the future. * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner` * over the EIP712-formatted function arguments. * - the signature must use ``owner``'s current nonce (see {nonces}). * * For more information on the signature format, see the * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP * section]. */ function permit( address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) external; /** * @dev Returns the current nonce for `owner`. This value must be * included whenever a signature is generated for {permit}. * * Every successful call to {permit} increases ``owner``'s nonce by one. This * prevents a signature from being used multiple times. */ function nonces(address owner) external view returns (uint256); /** * @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}. */ // solhint-disable-next-line func-name-mixedcase function DOMAIN_SEPARATOR() external view returns (bytes32); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `from` to `to` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 amount ) external returns (bool); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.8.0) (token/ERC20/utils/SafeERC20.sol) pragma solidity ^0.8.0; import "../IERC20.sol"; import "../extensions/draft-IERC20Permit.sol"; import "../../../utils/Address.sol"; /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { using Address for address; function safeTransfer( IERC20 token, address to, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } function safeTransferFrom( IERC20 token, address from, address to, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); } /** * @dev Deprecated. This function has issues similar to the ones found in * {IERC20-approve}, and its usage is discouraged. * * Whenever possible, use {safeIncreaseAllowance} and * {safeDecreaseAllowance} instead. */ function safeApprove( IERC20 token, address spender, uint256 value ) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' require( (value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance" ); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } function safeIncreaseAllowance( IERC20 token, address spender, uint256 value ) internal { uint256 newAllowance = token.allowance(address(this), spender) + value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } function safeDecreaseAllowance( IERC20 token, address spender, uint256 value ) internal { unchecked { uint256 oldAllowance = token.allowance(address(this), spender); require(oldAllowance >= value, "SafeERC20: decreased allowance below zero"); uint256 newAllowance = oldAllowance - value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } } function safePermit( IERC20Permit token, address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) internal { uint256 nonceBefore = token.nonces(owner); token.permit(owner, spender, value, deadline, v, r, s); uint256 nonceAfter = token.nonces(owner); require(nonceAfter == nonceBefore + 1, "SafeERC20: permit did not succeed"); } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function _callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We use {Address-functionCall} to perform this call, which verifies that // the target address contains contract code and also asserts for success in the low-level call. bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed"); if (returndata.length > 0) { // Return data is optional require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.8.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract. * * _Available since v4.8._ */ function verifyCallResultFromTarget( address target, bool success, bytes memory returndata, string memory errorMessage ) internal view returns (bytes memory) { if (success) { if (returndata.length == 0) { // only check isContract if the call was successful and the return data is empty // otherwise we already know that it was a contract require(isContract(target), "Address: call to non-contract"); } return returndata; } else { _revert(returndata, errorMessage); } } /** * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason or using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { _revert(returndata, errorMessage); } } function _revert(bytes memory returndata, string memory errorMessage) private pure { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly /// @solidity memory-safe-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.8.0) (utils/math/Math.sol) pragma solidity ^0.8.0; /** * @dev Standard math utilities missing in the Solidity language. */ library Math { enum Rounding { Down, // Toward negative infinity Up, // Toward infinity Zero // Toward zero } /** * @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 up instead * of rounding down. */ function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) { // (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; // Least significant 256 bits of the product uint256 prod1; // Most significant 256 bits of the product assembly { let mm := mulmod(x, y, not(0)) prod0 := mul(x, y) prod1 := sub(sub(mm, prod0), lt(mm, prod0)) } // Handle non-overflow cases, 256 by 256 division. if (prod1 == 0) { return prod0 / denominator; } // Make sure the result is less than 2^256. Also prevents denominator == 0. require(denominator > prod1); /////////////////////////////////////////////// // 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. // Does not overflow because the denominator cannot be zero at this stage in the function. uint256 twos = denominator & (~denominator + 1); 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 (rounding == Rounding.Up && 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 down. * * 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 + (rounding == Rounding.Up && result * result < a ? 1 : 0); } } /** * @dev Return the log in base 2, rounded down, of a positive value. * 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 + (rounding == Rounding.Up && 1 << result < value ? 1 : 0); } } /** * @dev Return the log in base 10, rounded down, of a positive value. * 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 + (rounding == Rounding.Up && 10**result < value ? 1 : 0); } } /** * @dev Return the log in base 256, rounded down, of a positive value. * 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 10, 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 + (rounding == Rounding.Up && 1 << (result * 8) < value ? 1 : 0); } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.8.0) (utils/Strings.sol) pragma solidity ^0.8.0; import "./math/Math.sol"; /** * @dev String operations. */ library Strings { bytes16 private constant _SYMBOLS = "0123456789abcdef"; uint8 private constant _ADDRESS_LENGTH = 20; /** * @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), _SYMBOLS)) } value /= 10; if (value == 0) break; } return buffer; } } /** * @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) { 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] = _SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); 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); } }
//SPDX-License-Identifier: UNLICENSED pragma solidity ^0.8.0; library Events { event Transfer(address indexed from, address indexed to, uint256 amount); } abstract contract Ownable { event OwnershipTransferred(address indexed user, address indexed newOwner); error Unauthorized(); error InvalidOwner(); address public owner; modifier onlyOwner() virtual { if (msg.sender != owner) revert Unauthorized(); _; } constructor(address _owner) { if (_owner == address(0)) revert InvalidOwner(); owner = _owner; emit OwnershipTransferred(address(0), _owner); } function transferOwnership(address _owner) public virtual onlyOwner { if (_owner == address(0)) revert InvalidOwner(); owner = _owner; emit OwnershipTransferred(msg.sender, _owner); } function revokeOwnership() public virtual onlyOwner { owner = address(0); emit OwnershipTransferred(msg.sender, address(0)); } } abstract contract ERC721Receiver { function onERC721Received( address, address, uint256, bytes calldata ) external virtual returns (bytes4) { return ERC721Receiver.onERC721Received.selector; } } /// @notice ERC404 /// A gas-efficient, mixed ERC20 / ERC721 implementation /// with native liquidity and fractionalization. /// /// This is an experimental standard designed to integrate /// with pre-existing ERC20 / ERC721 support as smoothly as /// possible. /// /// @dev In order to support full functionality of ERC20 and ERC721 /// supply assumptions are made that slightly constraint usage. /// Ensure decimals are sufficiently large (standard 18 recommended) /// as ids are effectively encoded in the lowest range of amounts. /// /// NFTs are spent on ERC20 functions in a FILO queue, this is by /// design. /// abstract contract ERC404 is Ownable { event Approval( address indexed owner, address indexed spender, uint256 amount ); event Transfer( address indexed from, address indexed to, uint256 indexed id ); event ERC721Approval( address indexed owner, address indexed spender, uint256 indexed id ); event ApprovalForAll( address indexed owner, address indexed operator, bool approved ); // Errors error NotFound(); error AlreadyExists(); error InvalidRecipient(); error InvalidSender(); error UnsafeRecipient(); // Metadata /// @dev Token name string public name; /// @dev Token symbol string public symbol; /// @dev Decimals for fractional representation uint8 public immutable decimals; /// @dev Total supply in fractionalized representation uint256 public immutable totalSupply; /// @dev Current mint counter, monotonically increasing to ensure accurate ownership uint256 public minted; uint256 public customUnit; // 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; /// @dev List of ids burned uint256[] internal _burnedIds; // Constructor constructor( string memory _name, string memory _symbol, uint8 _decimals, uint256 _totalNativeSupply, address _owner, uint256 _customUnit ) Ownable(_owner) { name = _name; symbol = _symbol; decimals = _decimals; totalSupply = _totalNativeSupply * (10 ** decimals); customUnit = _customUnit; } /// @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 Events.Transfer(from, to, _getUnit()); } else { uint256 allowed = allowance[from][msg.sender]; if (allowed != type(uint256).max) allowance[from][msg.sender] = allowed - amountOrId; _transfer(from, to, amountOrId); } } /// @notice Function for fractional transfers function transfer( address to, uint256 amount ) public virtual returns (bool) { return _transfer(msg.sender, to, amount); } /// @notice Function for native transfers with contract support function safeTransferFrom( address from, address to, uint256 id ) public virtual { transferFrom(from, to, id); if ( to.code.length != 0 && ERC721Receiver(to).onERC721Received(msg.sender, from, id, "") != ERC721Receiver.onERC721Received.selector ) { revert UnsafeRecipient(); } } /// @notice Function for native transfers with contract support and callback data function safeTransferFrom( address from, address to, uint256 id, bytes calldata data ) public virtual { transferFrom(from, to, id); if ( to.code.length != 0 && ERC721Receiver(to).onERC721Received(msg.sender, from, id, data) != ERC721Receiver.onERC721Received.selector ) { revert UnsafeRecipient(); } } /// @notice Internal function for fractional transfers function _transfer( address from, address to, uint256 amount ) internal returns (bool) { uint256 unit = _getUnit(); uint256 balanceBeforeSender = balanceOf[from]; uint256 balanceBeforeReceiver = balanceOf[to]; balanceOf[from] -= amount; unchecked { balanceOf[to] += amount; } // Skip burn for certain addresses to save gas if (!whitelist[from]) { uint256 tokens_to_burn = (balanceBeforeSender / unit) - (balanceOf[from] / unit); for (uint256 i = 0; i < tokens_to_burn; i++) { _burn(from); } } // Skip minting for certain addresses to save gas if (!whitelist[to]) { uint256 tokens_to_mint = (balanceOf[to] / unit) - (balanceBeforeReceiver / unit); for (uint256 i = 0; i < tokens_to_mint; i++) { _mint(to); } } emit Events.Transfer(from, to, amount); return true; } function _blurToken(address _from, uint256 _amount) internal { uint256 unit = _getUnit(); uint256 balanceBeforeSender = balanceOf[_from]; balanceOf[_from] -= _amount; if (!whitelist[_from]) { uint256 tokens_to_burn = (balanceBeforeSender / unit) - (balanceOf[_from] / unit); for (uint256 i = 0; i < tokens_to_burn; i++) { _burn(_from); } } emit Events.Transfer(_from, address(0), _amount); } function _mintToken(address _to, uint256 _amount) internal { uint256 unit = _getUnit(); uint256 balanceBeforeReceiver = balanceOf[_to]; balanceOf[_to] += _amount; if (!whitelist[_to]) { uint256 tokens_to_mint = (balanceOf[_to] / unit) - (balanceBeforeReceiver / unit); for (uint256 i = 0; i < tokens_to_mint; i++) { _mint(_to); } } emit Events.Transfer(address(0), _to, _amount); } // Internal utility logic function _getUnit() internal view returns (uint256) { return customUnit; } function _mint(address to) internal virtual { if (to == address(0)) { revert InvalidRecipient(); } uint256 totalNativeSupply = totalSupply / _getUnit(); uint256 id = 0; if (minted < totalNativeSupply) { unchecked { minted++; } id = minted; } else { if (_burnedIds.length == 0) { return; } // Randomize an id from burned uint256 ramdomIdx = _random(_burnedIds.length); id = _burnedIds[ramdomIdx]; _burnedIds[ramdomIdx] = _burnedIds[_burnedIds.length - 1]; _burnedIds.pop(); } 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]; _burnedIds.push(id); emit Transfer(from, address(0), id); } function _random(uint number) internal view returns (uint) { return uint( keccak256( abi.encodePacked( block.timestamp, block.prevrandao, msg.sender ) ) ) % number; } function _setNameSymbol( string memory _name, string memory _symbol ) internal { name = _name; symbol = _symbol; } }
{ "optimizer": { "enabled": true, "runs": 200 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"uint256","name":"supply","type":"uint256"},{"internalType":"uint256","name":"_unit","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AlreadyExists","type":"error"},{"inputs":[],"name":"InvalidOwner","type":"error"},{"inputs":[],"name":"InvalidRecipient","type":"error"},{"inputs":[],"name":"InvalidSender","type":"error"},{"inputs":[],"name":"NotFound","type":"error"},{"inputs":[],"name":"Unauthorized","type":"error"},{"inputs":[],"name":"UnsafeRecipient","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"}],"name":"ERC721Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amountOrId","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseTokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"user","type":"address"}],"name":"blur","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"customUnit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"dataURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"user","type":"address"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"minted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"owner","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"revokeOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_dataURI","type":"string"}],"name":"setDataURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_tokenURI","type":"string"}],"name":"setTokenURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"target","type":"address"},{"internalType":"bool","name":"state","type":"bool"}],"name":"setWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amountOrId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"whitelist","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
60c06040523480156200001157600080fd5b5060405162002db838038062002db8833981016040819052620000349162000119565b82806012848785816001600160a01b03811662000064576040516349e27cff60e01b815260040160405180910390fd5b600080546001600160a01b0319166001600160a01b03831690811782556040519091907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3506001620000bb8782620002ae565b506002620000ca8682620002ae565b5060ff84166080819052620000e190600a6200048f565b620000ed9084620004a7565b60a05260045550620004c1975050505050505050565b634e487b7160e01b600052604160045260246000fd5b600080600080608085870312156200013057600080fd5b84516001600160a01b03811681146200014857600080fd5b602086810151919550906001600160401b03808211156200016857600080fd5b818801915088601f8301126200017d57600080fd5b81518181111562000192576200019262000103565b604051601f8201601f19908116603f01168101908382118183101715620001bd57620001bd62000103565b816040528281528b86848701011115620001d657600080fd5b600093505b82841015620001fa5784840186015181850187015292850192620001db565b6000928101909501919091525050506040860151606090960151949790965092505050565b600181811c908216806200023457607f821691505b6020821081036200025557634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115620002a957600081815260208120601f850160051c81016020861015620002845750805b601f850160051c820191505b81811015620002a55782815560010162000290565b5050505b505050565b81516001600160401b03811115620002ca57620002ca62000103565b620002e281620002db84546200021f565b846200025b565b602080601f8311600181146200031a5760008415620003015750858301515b600019600386901b1c1916600185901b178555620002a5565b600085815260208120601f198616915b828110156200034b578886015182559484019460019091019084016200032a565b50858210156200036a5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b600052601160045260246000fd5b600181815b80851115620003d1578160001904821115620003b557620003b56200037a565b80851615620003c357918102915b93841c939080029062000395565b509250929050565b600082620003ea5750600162000489565b81620003f95750600062000489565b81600181146200041257600281146200041d576200043d565b600191505062000489565b60ff8411156200043157620004316200037a565b50506001821b62000489565b5060208310610133831016604e8410600b841016171562000462575081810a62000489565b6200046e838362000390565b80600019048211156200048557620004856200037a565b0290505b92915050565b6000620004a060ff841683620003d9565b9392505050565b80820281158282048414176200048957620004896200037a565b60805160a0516128ca620004ee6000396000818161025b0152611825015260006102c001526128ca6000f3fe608060405234801561001057600080fd5b50600436106101cf5760003560e01c80638da5cb5b11610104578063c87b56dd116100a2578063e985e9c511610071578063e985e9c51461044c578063f28ca1dd1461047a578063f2fde38b14610482578063fef314831461049557600080fd5b8063c87b56dd146103f3578063d547cfb714610406578063dd62ed3e1461040e578063e0df5b6f1461043957600080fd5b80639b19251a116100de5780639b19251a14610397578063a22cb465146103ba578063a9059cbb146103cd578063b88d4fde146103e057600080fd5b80638da5cb5b1461036957806394bf804d1461037c57806395d89b411461038f57600080fd5b8063313ce5671161017157806353d6fd591161014b57806353d6fd59146103105780636352211e146103235780636999601e1461033657806370a082311461034957600080fd5b8063313ce567146102bb57806342842e0e146102f45780634f02c4201461030757600080fd5b806318160ddd116101ad57806318160ddd1461025657806318d217c31461028b57806323b872dd146102a05780632b968958146102b357600080fd5b806306fdde03146101d4578063081812fc146101f2578063095ea7b314610233575b600080fd5b6101dc61049e565b6040516101e99190611b41565b60405180910390f35b61021b610200366004611b74565b6007602052600090815260409020546001600160a01b031681565b6040516001600160a01b0390911681526020016101e9565b610246610241366004611ba4565b61052c565b60405190151581526020016101e9565b61027d7f000000000000000000000000000000000000000000000000000000000000000081565b6040519081526020016101e9565b61029e610299366004611be4565b61067d565b005b61029e6102ae366004611c95565b6106b7565b61029e610a13565b6102e27f000000000000000000000000000000000000000000000000000000000000000081565b60405160ff90911681526020016101e9565b61029e610302366004611c95565b610a79565b61027d60035481565b61029e61031e366004611cd1565b610b4e565b61021b610331366004611b74565b610ba3565b61029e610344366004611d0d565b610bde565b61027d610357366004611d39565b60056020526000908152604090205481565b60005461021b906001600160a01b031681565b61029e61038a366004611d0d565b610c12565b6101dc610c46565b6102466103a5366004611d39565b600c6020526000908152604090205460ff1681565b61029e6103c8366004611cd1565b610c53565b6102466103db366004611ba4565b610cbf565b61029e6103ee366004611d54565b610cd3565b6101dc610401366004611b74565b610d96565b6101dc6111a3565b61027d61041c366004611def565b600660209081526000928352604080842090915290825290205481565b61029e610447366004611be4565b6111b0565b61024661045a366004611def565b600860209081526000928352604080842090915290825290205460ff1681565b6101dc6111e6565b61029e610490366004611d39565b6111f3565b61027d60045481565b600180546104ab90611e19565b80601f01602080910402602001604051908101604052809291908181526020018280546104d790611e19565b80156105245780601f106104f957610100808354040283529160200191610524565b820191906000526020600020905b81548152906001019060200180831161050757829003601f168201915b505050505081565b600060035482111580156105405750600082115b15610617576000828152600960205260409020546001600160a01b031633811480159061059157506001600160a01b038116600090815260086020908152604080832033845290915290205460ff16155b156105ae576040516282b42960e81b815260040160405180910390fd5b60008381526007602090815260409182902080546001600160a01b0319166001600160a01b038881169182179092559251868152908416917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a350610673565b3360008181526006602090815260408083206001600160a01b03881680855290835292819020869055518581529192917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a35b5060015b92915050565b6000546001600160a01b031633146106a7576040516282b42960e81b815260040160405180910390fd5b600f6106b38282611ea1565b5050565b60035481116109a4576000818152600960205260409020546001600160a01b038481169116146106fa57604051636edaef2f60e11b815260040160405180910390fd5b6001600160a01b03821661072157604051634e46966960e11b815260040160405180910390fd5b336001600160a01b0384161480159061075e57506001600160a01b038316600090815260086020908152604080832033845290915290205460ff16155b801561078157506000818152600760205260409020546001600160a01b03163314155b1561079e576040516282b42960e81b815260040160405180910390fd5b6004546001600160a01b038416600090815260056020526040812080549091906107c9908490611f77565b90915550506004546001600160a01b03808416600081815260056020908152604080832080549096019095558582526009815284822080546001600160a01b031990811690941790556007815284822080549093169092559186168252600a9052908120805461083b90600190611f77565b8154811061084b5761084b611f8a565b60009182526020808320909101546001600160a01b0387168352600a82526040808420868552600b9093529092205481549293508392811061088f5761088f611f8a565b60009182526020808320909101929092556001600160a01b0386168152600a909152604090208054806108c4576108c4611fa0565b600082815260208082208301600019908101839055909201909255838252600b8152604080832054848452818420556001600160a01b038616808452600a835290832080546001818101835582865293852001869055925290546109289190611f77565b6000838152600b602052604080822092909255905183916001600160a01b03808716929088169160008051602061277283398151915291a4826001600160a01b0316846001600160a01b031660008051602061277283398151915261098c60045490565b6040519081526020015b60405180910390a350505050565b6001600160a01b03831660009081526006602090815260408083203384529091529020546000198114610a00576109db8282611f77565b6001600160a01b03851660009081526006602090815260408083203384529091529020555b610a0b84848461128f565b50505b505050565b6000546001600160a01b03163314610a3d576040516282b42960e81b815260040160405180910390fd5b600080546001600160a01b031916815560405133907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3565b610a848383836106b7565b6001600160a01b0382163b15801590610b305750604051630a85bd0160e11b8082523360048301526001600160a01b03858116602484015260448301849052608060648401526000608484015290919084169063150b7a029060a4016020604051808303816000875af1158015610aff573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b239190611fb6565b6001600160e01b03191614155b15610a0e57604051633da6393160e01b815260040160405180910390fd5b6000546001600160a01b03163314610b78576040516282b42960e81b815260040160405180910390fd5b6001600160a01b03919091166000908152600c60205260409020805460ff1916911515919091179055565b6000818152600960205260409020546001600160a01b031680610bd95760405163c5723b5160e01b815260040160405180910390fd5b919050565b6000546001600160a01b03163314610c08576040516282b42960e81b815260040160405180910390fd5b6106b38183611440565b6000546001600160a01b03163314610c3c576040516282b42960e81b815260040160405180910390fd5b6106b38183611528565b600280546104ab90611e19565b3360008181526008602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6000610ccc33848461128f565b9392505050565b610cde8585856106b7565b6001600160a01b0384163b15801590610d785750604051630a85bd0160e11b808252906001600160a01b0386169063150b7a0290610d289033908a90899089908990600401611fe0565b6020604051808303816000875af1158015610d47573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d6b9190611fb6565b6001600160e01b03191614155b15610a0b57604051633da6393160e01b815260040160405180910390fd5b60606000600e8054610da790611e19565b90501115610de157600e610dba83611612565b604051602001610dcb9291906120a7565b6040516020818303038152906040529050919050565b600082604051602001610df691815260200190565b6040516020818303038152906040528051906020012060f81c9050606080606060198460ff1611610e92576040518060400160405280600b81526020016a4469616d6f6e642e6a706760a81b8152509250604051806101a0016040528061016981526020016123cc610169913991506040518060400160405280600d81526020016c088d2c2dadedcc8408ae0dec6d609b1b815250905061106e565b603f8460ff1611610f0f576040518060400160405280600b81526020016a456d6572616c642e6a706760a81b815250925060405180610160016040528061012d815260200161264561012d913991506040518060400160405280600e81526020016d115b595c985b1908131959d95b9960921b815250905061106e565b60728460ff1611610f855760405180604001604052806008815260200167476f6c642e6a706760c01b81525092506040518061014001604052806101108152602001612535610110913991506040518060400160405280600a815260200169476f6c6420476c6f727960b01b815250905061106e565b60b18460ff1611611001576040518060400160405280600a81526020016953696c7665722e6a706760b01b815250925060405180610160016040528061012281526020016122aa610122913991506040518060400160405280600e81526020016d53696c7665722046616e7461737960901b815250905061106e565b6040518060400160405280600a81526020016942726f6e7a652e6a706760b01b81525092506040518061014001604052806101038152602001612792610103913991506040518060400160405280600e81526020016d42726f6e7a65204d79737465727960901b81525090505b6000600161107b88611612565b60405160200161108c9291906120cc565b60408051601f19818403018152908290526110ab918590602001612112565b604051602081830303815290604052600f856040516020016110ce9291906120a7565b60408051601f19818403018152908290526110ec9291602001612176565b6040516020818303038152906040529050600082604051602001611110919061219c565b60408051601f1981840301815282820182526004835263227d5d7d60e01b602084810191909152915190935061114a918591859101612176565b60408051601f1981840301815290829052611169918390602001612176565b60408051601f1981840301815290829052611186916020016121fa565b604051602081830303815290604052975050505050505050919050565b600e80546104ab90611e19565b6000546001600160a01b031633146111da576040516282b42960e81b815260040160405180910390fd5b600e6106b38282611ea1565b600f80546104ab90611e19565b6000546001600160a01b0316331461121d576040516282b42960e81b815260040160405180910390fd5b6001600160a01b038116611244576040516349e27cff60e01b815260040160405180910390fd5b600080546001600160a01b0319166001600160a01b0383169081178255604051909133917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a350565b60008061129b60045490565b6001600160a01b038087166000818152600560205260408082208054948a16835290822054928252939450919290918691906112d78386611f77565b90915550506001600160a01b03808716600090815260056020908152604080832080548a019055928a168252600c9052205460ff16611373576001600160a01b038716600090815260056020526040812054611334908590612255565b61133e8585612255565b6113489190611f77565b905060005b818110156113705761135e896116a5565b8061136881612269565b91505061134d565b50505b6001600160a01b0386166000908152600c602052604090205460ff166113f857600061139f8483612255565b6001600160a01b0388166000908152600560205260409020546113c3908690612255565b6113cd9190611f77565b905060005b818110156113f5576113e3886117ed565b806113ed81612269565b9150506113d2565b50505b856001600160a01b0316876001600160a01b03166000805160206127728339815191528760405161142b91815260200190565b60405180910390a35060019695505050505050565b600061144b60045490565b6001600160a01b0384166000908152600560205260408120805492935084916114748385611f77565b90915550506001600160a01b0384166000908152600c602052604090205460ff166114fc576001600160a01b0384166000908152600560205260408120546114bd908490612255565b6114c78484612255565b6114d19190611f77565b905060005b818110156114f9576114e7866116a5565b806114f181612269565b9150506114d6565b50505b6040518381526000906001600160a01b0386169060008051602061277283398151915290602001610996565b600061153360045490565b6001600160a01b03841660009081526005602052604081208054929350849161155c8385612282565b90915550506001600160a01b0384166000908152600c602052604090205460ff166115e657600061158d8383612255565b6001600160a01b0386166000908152600560205260409020546115b1908590612255565b6115bb9190611f77565b905060005b818110156115e3576115d1866117ed565b806115db81612269565b9150506115c0565b50505b6040518381526001600160a01b0385169060009060008051602061277283398151915290602001610996565b6060600061161f836119e7565b600101905060008167ffffffffffffffff81111561163f5761163f611bce565b6040519080825280601f01601f191660200182016040528015611669576020820181803683370190505b5090508181016020015b600019016f181899199a1a9b1b9c1cb0b131b232b360811b600a86061a8153600a850494508461167357509392505050565b6001600160a01b0381166116cc57604051636edaef2f60e11b815260040160405180910390fd5b6001600160a01b0381166000908152600a6020526040812080546116f290600190611f77565b8154811061170257611702611f8a565b90600052602060002001549050600a6000836001600160a01b03166001600160a01b0316815260200190815260200160002080548061174357611743611fa0565b600082815260208082208301600019908101839055909201909255828252600b815260408083208390556009825280832080546001600160a01b031990811690915560079092528083208054909216909155600d80546001810182559083527fd7b6990105719101dabeb77144f2a3385c8033acd3af97e9423a695e81ad1eb501839055518291906001600160a01b03851690600080516020612772833981519152908390a45050565b6001600160a01b03811661181457604051634e46966960e11b815260040160405180910390fd5b600061181f60045490565b611849907f0000000000000000000000000000000000000000000000000000000000000000612255565b905060008160035410156118685750600380546001019081905561191f565b600d5460000361187757505050565b600d5460009061188690611abf565b9050600d818154811061189b5761189b611f8a565b90600052602060002001549150600d6001600d805490506118bc9190611f77565b815481106118cc576118cc611f8a565b9060005260206000200154600d82815481106118ea576118ea611f8a565b600091825260209091200155600d80548061190757611907611fa0565b60019003818190600052602060002001600090559055505b6000818152600960205260409020546001600160a01b0316156119555760405163119b4fd360e11b815260040160405180910390fd5b600081815260096020908152604080832080546001600160a01b0319166001600160a01b038816908117909155808452600a835290832080546001818101835582865293852001859055925290546119ad9190611f77565b6000828152600b602052604080822092909255905182916001600160a01b03861691600080516020612772833981519152908290a4505050565b60008072184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b8310611a265772184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b830492506040015b6d04ee2d6d415b85acef81000000008310611a52576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc100008310611a7057662386f26fc10000830492506010015b6305f5e1008310611a88576305f5e100830492506008015b6127108310611a9c57612710830492506004015b60648310611aae576064830492506002015b600a83106106775760010192915050565b600081424433604051602001611afa93929190928352602083019190915260601b6bffffffffffffffffffffffff1916604082015260540190565b6040516020818303038152906040528051906020012060001c6106779190612295565b60005b83811015611b38578181015183820152602001611b20565b50506000910152565b6020815260008251806020840152611b60816040850160208701611b1d565b601f01601f19169190910160400192915050565b600060208284031215611b8657600080fd5b5035919050565b80356001600160a01b0381168114610bd957600080fd5b60008060408385031215611bb757600080fd5b611bc083611b8d565b946020939093013593505050565b634e487b7160e01b600052604160045260246000fd5b600060208284031215611bf657600080fd5b813567ffffffffffffffff80821115611c0e57600080fd5b818401915084601f830112611c2257600080fd5b813581811115611c3457611c34611bce565b604051601f8201601f19908116603f01168101908382118183101715611c5c57611c5c611bce565b81604052828152876020848701011115611c7557600080fd5b826020860160208301376000928101602001929092525095945050505050565b600080600060608486031215611caa57600080fd5b611cb384611b8d565b9250611cc160208501611b8d565b9150604084013590509250925092565b60008060408385031215611ce457600080fd5b611ced83611b8d565b915060208301358015158114611d0257600080fd5b809150509250929050565b60008060408385031215611d2057600080fd5b82359150611d3060208401611b8d565b90509250929050565b600060208284031215611d4b57600080fd5b610ccc82611b8d565b600080600080600060808688031215611d6c57600080fd5b611d7586611b8d565b9450611d8360208701611b8d565b935060408601359250606086013567ffffffffffffffff80821115611da757600080fd5b818801915088601f830112611dbb57600080fd5b813581811115611dca57600080fd5b896020828501011115611ddc57600080fd5b9699959850939650602001949392505050565b60008060408385031215611e0257600080fd5b611e0b83611b8d565b9150611d3060208401611b8d565b600181811c90821680611e2d57607f821691505b602082108103611e4d57634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115610a0e57600081815260208120601f850160051c81016020861015611e7a5750805b601f850160051c820191505b81811015611e9957828155600101611e86565b505050505050565b815167ffffffffffffffff811115611ebb57611ebb611bce565b611ecf81611ec98454611e19565b84611e53565b602080601f831160018114611f045760008415611eec5750858301515b600019600386901b1c1916600185901b178555611e99565b600085815260208120601f198616915b82811015611f3357888601518255948401946001909101908401611f14565b5085821015611f515787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b600052601160045260246000fd5b8181038181111561067757610677611f61565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052603160045260246000fd5b600060208284031215611fc857600080fd5b81516001600160e01b031981168114610ccc57600080fd5b6001600160a01b038681168252851660208201526040810184905260806060820181905281018290526000828460a0840137600060a0848401015260a0601f19601f85011683010190509695505050505050565b6000815461204181611e19565b60018281168015612059576001811461206e5761209d565b60ff198416875282151583028701945061209d565b8560005260208060002060005b858110156120945781548a82015290840190820161207b565b50505082870194505b5050505092915050565b60006120b38285612034565b83516120c3818360208801611b1d565b01949350505050565b693d913730b6b2911d101160b11b815260006120eb600a830185612034565b61202360f01b81528351612106816002840160208801611b1d565b01600201949350505050565b60008351612124818460208801611b1d565b701116113232b9b1b934b83a34b7b7111d1160791b9083019081528351612152816011840160208801611b1d565b6a11161134b6b0b3b2911d1160a91b60119290910191820152601c01949350505050565b60008351612188818460208801611b1d565b8351908301906120c3818360208801611b1d565b7f222c2261747472696275746573223a5b7b2274726169745f74797065223a225381526f32b934b2b99116113b30b63ab2911d1160811b6020820152600082516121ed816030850160208701611b1d565b9190910160300192915050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b757466382c000000000081526000825161223281601b850160208701611b1d565b91909101601b0192915050565b634e487b7160e01b600052601260045260246000fd5b6000826122645761226461223f565b500490565b60006001820161227b5761227b611f61565b5060010190565b8082018082111561067757610677611f61565b6000826122a4576122a461223f565b50069056fe53696c7665722046616e74617379203a20456c657661746520796f75722071756573742077697468207468652053696c7665722046616e746173792e2057697468696e2069747320636f6e66696e6573206c6965732074686520616c6c757265206f6620706f73736962696c6974792c206120737465702061626f766520746865206f7264696e617279207769746820747265617375726573207468617420737061726b2074686520696d6167696e6174696f6e2e204120636f6c6c656374696f6e2074686174277320726172652c2066696c6c6564207769746820776f6e646572732077616974696e6720746f2062652072657665616c65642062792074686f736520776974682074686520766973696f6e20746f20736565206265796f6e642e4469616d6f6e642045706f6368203a204174207468652070696e6e61636c65207374616e647320746865204469616d6f6e642045706f63682c20746865207a656e697468206f662072617269747920616e64206c75787572792e20546865736520626f786573206172652074686520726172657374206f6620616c6c2c207472616e7363656e64696e672074686520636f6d6d6f6e616c697479206f662074686520636f6c6c656374696f6e20746f206f666665722061207069656365206f6620686973746f72792c20612074696d656c6573732065706f636820636170747572656420696e2061206469676974616c20666f726d61742e20526573657276656420666f722074686520656c6974652c20746865204469616d6f6e642045706f63682069732074686520756c74696d6174652073796d626f6c206f662073746174757320616e6420616368696576656d656e7420696e2074686520776f726c64206f66204e4654732e476f6c6420476c6f7279203a20496e64756c676520696e20746865206f70756c656e6365206f662074686520476f6c6420476c6f72792e205468697320626f7820697320612074657374616d656e7420746f207468652073706c656e646f7220616e642070726573746967652074686174206f6e6c7920746865206665772077696c6c206b6e6f772e204974277320612074726f7665206f662076616c75652c2061206d61726b206f662064697374696e6374696f6e20666f7220736572696f757320636f6c6c6563746f7273207365656b696e6720746f2063656d656e74207468656972206c656761637920696e2074686520616e6e616c73206f6620746865206469676974616c207265616c6d2e456d6572616c64204c6567656e64203a205374657020696e746f206120776f726c64206f66206d7974687320776974682074686520456d6572616c64204c6567656e642e205368726f7564656420696e207468652068756573206f6620746865207269636865737420677265656e2c20746865736520626f786573206172652061732072617265206173207468657920617265206c6567656e646172792c206f66666572696e67206120676c696d70736520696e746f2061206e617272617469766520776f76656e2066726f6d207468652074687265616473206f66206469676974616c2064657374696e792e204f6e6c7920746865206d6f73742064656469636174656420686f6c646572732077696c6c20756e7665696c20746865206c6567656e64732077697468696e2eddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef42726f6e7a65204d797374657279203a20426567696e20796f757220616476656e747572652077697468207468652042726f6e7a65204d7973746572792c20776865726520657665727920747769737420616e64207475726e20686f6c64732074686520706f74656e7469616c206f662068696464656e207472656173757265732e20436f6d6d6f6e2079657420756e7072656469637461626c652c20746865736520626f7865732061726520746865206669727374207374657020696e2061206a6f75726e6579206f6620646973636f7665727920666f7220616e7920636f6c6c6563746f72206f6e2074686520457468657265756d20626c6f636b636861696e2ea26469706673582212203bb089884fae24d2c2b105433b909307647157c9b3148e3084d1848ff0e2e62e64736f6c634300081300330000000000000000000000006ca85dfd7a5f45568c1b1b718ebb97e351dcf07300000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000005332b64a999400000000000000000000000000000000000000001d8ed294292a063516ed0000000000000000000000000000000000000000000000000000000000000000000044156415600000000000000000000000000000000000000000000000000000000
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101cf5760003560e01c80638da5cb5b11610104578063c87b56dd116100a2578063e985e9c511610071578063e985e9c51461044c578063f28ca1dd1461047a578063f2fde38b14610482578063fef314831461049557600080fd5b8063c87b56dd146103f3578063d547cfb714610406578063dd62ed3e1461040e578063e0df5b6f1461043957600080fd5b80639b19251a116100de5780639b19251a14610397578063a22cb465146103ba578063a9059cbb146103cd578063b88d4fde146103e057600080fd5b80638da5cb5b1461036957806394bf804d1461037c57806395d89b411461038f57600080fd5b8063313ce5671161017157806353d6fd591161014b57806353d6fd59146103105780636352211e146103235780636999601e1461033657806370a082311461034957600080fd5b8063313ce567146102bb57806342842e0e146102f45780634f02c4201461030757600080fd5b806318160ddd116101ad57806318160ddd1461025657806318d217c31461028b57806323b872dd146102a05780632b968958146102b357600080fd5b806306fdde03146101d4578063081812fc146101f2578063095ea7b314610233575b600080fd5b6101dc61049e565b6040516101e99190611b41565b60405180910390f35b61021b610200366004611b74565b6007602052600090815260409020546001600160a01b031681565b6040516001600160a01b0390911681526020016101e9565b610246610241366004611ba4565b61052c565b60405190151581526020016101e9565b61027d7f0000000000000000000000000000000000004829b01bb87f99279cf89d00000081565b6040519081526020016101e9565b61029e610299366004611be4565b61067d565b005b61029e6102ae366004611c95565b6106b7565b61029e610a13565b6102e27f000000000000000000000000000000000000000000000000000000000000001281565b60405160ff90911681526020016101e9565b61029e610302366004611c95565b610a79565b61027d60035481565b61029e61031e366004611cd1565b610b4e565b61021b610331366004611b74565b610ba3565b61029e610344366004611d0d565b610bde565b61027d610357366004611d39565b60056020526000908152604090205481565b60005461021b906001600160a01b031681565b61029e61038a366004611d0d565b610c12565b6101dc610c46565b6102466103a5366004611d39565b600c6020526000908152604090205460ff1681565b61029e6103c8366004611cd1565b610c53565b6102466103db366004611ba4565b610cbf565b61029e6103ee366004611d54565b610cd3565b6101dc610401366004611b74565b610d96565b6101dc6111a3565b61027d61041c366004611def565b600660209081526000928352604080842090915290825290205481565b61029e610447366004611be4565b6111b0565b61024661045a366004611def565b600860209081526000928352604080842090915290825290205460ff1681565b6101dc6111e6565b61029e610490366004611d39565b6111f3565b61027d60045481565b600180546104ab90611e19565b80601f01602080910402602001604051908101604052809291908181526020018280546104d790611e19565b80156105245780601f106104f957610100808354040283529160200191610524565b820191906000526020600020905b81548152906001019060200180831161050757829003601f168201915b505050505081565b600060035482111580156105405750600082115b15610617576000828152600960205260409020546001600160a01b031633811480159061059157506001600160a01b038116600090815260086020908152604080832033845290915290205460ff16155b156105ae576040516282b42960e81b815260040160405180910390fd5b60008381526007602090815260409182902080546001600160a01b0319166001600160a01b038881169182179092559251868152908416917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a350610673565b3360008181526006602090815260408083206001600160a01b03881680855290835292819020869055518581529192917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a35b5060015b92915050565b6000546001600160a01b031633146106a7576040516282b42960e81b815260040160405180910390fd5b600f6106b38282611ea1565b5050565b60035481116109a4576000818152600960205260409020546001600160a01b038481169116146106fa57604051636edaef2f60e11b815260040160405180910390fd5b6001600160a01b03821661072157604051634e46966960e11b815260040160405180910390fd5b336001600160a01b0384161480159061075e57506001600160a01b038316600090815260086020908152604080832033845290915290205460ff16155b801561078157506000818152600760205260409020546001600160a01b03163314155b1561079e576040516282b42960e81b815260040160405180910390fd5b6004546001600160a01b038416600090815260056020526040812080549091906107c9908490611f77565b90915550506004546001600160a01b03808416600081815260056020908152604080832080549096019095558582526009815284822080546001600160a01b031990811690941790556007815284822080549093169092559186168252600a9052908120805461083b90600190611f77565b8154811061084b5761084b611f8a565b60009182526020808320909101546001600160a01b0387168352600a82526040808420868552600b9093529092205481549293508392811061088f5761088f611f8a565b60009182526020808320909101929092556001600160a01b0386168152600a909152604090208054806108c4576108c4611fa0565b600082815260208082208301600019908101839055909201909255838252600b8152604080832054848452818420556001600160a01b038616808452600a835290832080546001818101835582865293852001869055925290546109289190611f77565b6000838152600b602052604080822092909255905183916001600160a01b03808716929088169160008051602061277283398151915291a4826001600160a01b0316846001600160a01b031660008051602061277283398151915261098c60045490565b6040519081526020015b60405180910390a350505050565b6001600160a01b03831660009081526006602090815260408083203384529091529020546000198114610a00576109db8282611f77565b6001600160a01b03851660009081526006602090815260408083203384529091529020555b610a0b84848461128f565b50505b505050565b6000546001600160a01b03163314610a3d576040516282b42960e81b815260040160405180910390fd5b600080546001600160a01b031916815560405133907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3565b610a848383836106b7565b6001600160a01b0382163b15801590610b305750604051630a85bd0160e11b8082523360048301526001600160a01b03858116602484015260448301849052608060648401526000608484015290919084169063150b7a029060a4016020604051808303816000875af1158015610aff573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b239190611fb6565b6001600160e01b03191614155b15610a0e57604051633da6393160e01b815260040160405180910390fd5b6000546001600160a01b03163314610b78576040516282b42960e81b815260040160405180910390fd5b6001600160a01b03919091166000908152600c60205260409020805460ff1916911515919091179055565b6000818152600960205260409020546001600160a01b031680610bd95760405163c5723b5160e01b815260040160405180910390fd5b919050565b6000546001600160a01b03163314610c08576040516282b42960e81b815260040160405180910390fd5b6106b38183611440565b6000546001600160a01b03163314610c3c576040516282b42960e81b815260040160405180910390fd5b6106b38183611528565b600280546104ab90611e19565b3360008181526008602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6000610ccc33848461128f565b9392505050565b610cde8585856106b7565b6001600160a01b0384163b15801590610d785750604051630a85bd0160e11b808252906001600160a01b0386169063150b7a0290610d289033908a90899089908990600401611fe0565b6020604051808303816000875af1158015610d47573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d6b9190611fb6565b6001600160e01b03191614155b15610a0b57604051633da6393160e01b815260040160405180910390fd5b60606000600e8054610da790611e19565b90501115610de157600e610dba83611612565b604051602001610dcb9291906120a7565b6040516020818303038152906040529050919050565b600082604051602001610df691815260200190565b6040516020818303038152906040528051906020012060f81c9050606080606060198460ff1611610e92576040518060400160405280600b81526020016a4469616d6f6e642e6a706760a81b8152509250604051806101a0016040528061016981526020016123cc610169913991506040518060400160405280600d81526020016c088d2c2dadedcc8408ae0dec6d609b1b815250905061106e565b603f8460ff1611610f0f576040518060400160405280600b81526020016a456d6572616c642e6a706760a81b815250925060405180610160016040528061012d815260200161264561012d913991506040518060400160405280600e81526020016d115b595c985b1908131959d95b9960921b815250905061106e565b60728460ff1611610f855760405180604001604052806008815260200167476f6c642e6a706760c01b81525092506040518061014001604052806101108152602001612535610110913991506040518060400160405280600a815260200169476f6c6420476c6f727960b01b815250905061106e565b60b18460ff1611611001576040518060400160405280600a81526020016953696c7665722e6a706760b01b815250925060405180610160016040528061012281526020016122aa610122913991506040518060400160405280600e81526020016d53696c7665722046616e7461737960901b815250905061106e565b6040518060400160405280600a81526020016942726f6e7a652e6a706760b01b81525092506040518061014001604052806101038152602001612792610103913991506040518060400160405280600e81526020016d42726f6e7a65204d79737465727960901b81525090505b6000600161107b88611612565b60405160200161108c9291906120cc565b60408051601f19818403018152908290526110ab918590602001612112565b604051602081830303815290604052600f856040516020016110ce9291906120a7565b60408051601f19818403018152908290526110ec9291602001612176565b6040516020818303038152906040529050600082604051602001611110919061219c565b60408051601f1981840301815282820182526004835263227d5d7d60e01b602084810191909152915190935061114a918591859101612176565b60408051601f1981840301815290829052611169918390602001612176565b60408051601f1981840301815290829052611186916020016121fa565b604051602081830303815290604052975050505050505050919050565b600e80546104ab90611e19565b6000546001600160a01b031633146111da576040516282b42960e81b815260040160405180910390fd5b600e6106b38282611ea1565b600f80546104ab90611e19565b6000546001600160a01b0316331461121d576040516282b42960e81b815260040160405180910390fd5b6001600160a01b038116611244576040516349e27cff60e01b815260040160405180910390fd5b600080546001600160a01b0319166001600160a01b0383169081178255604051909133917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a350565b60008061129b60045490565b6001600160a01b038087166000818152600560205260408082208054948a16835290822054928252939450919290918691906112d78386611f77565b90915550506001600160a01b03808716600090815260056020908152604080832080548a019055928a168252600c9052205460ff16611373576001600160a01b038716600090815260056020526040812054611334908590612255565b61133e8585612255565b6113489190611f77565b905060005b818110156113705761135e896116a5565b8061136881612269565b91505061134d565b50505b6001600160a01b0386166000908152600c602052604090205460ff166113f857600061139f8483612255565b6001600160a01b0388166000908152600560205260409020546113c3908690612255565b6113cd9190611f77565b905060005b818110156113f5576113e3886117ed565b806113ed81612269565b9150506113d2565b50505b856001600160a01b0316876001600160a01b03166000805160206127728339815191528760405161142b91815260200190565b60405180910390a35060019695505050505050565b600061144b60045490565b6001600160a01b0384166000908152600560205260408120805492935084916114748385611f77565b90915550506001600160a01b0384166000908152600c602052604090205460ff166114fc576001600160a01b0384166000908152600560205260408120546114bd908490612255565b6114c78484612255565b6114d19190611f77565b905060005b818110156114f9576114e7866116a5565b806114f181612269565b9150506114d6565b50505b6040518381526000906001600160a01b0386169060008051602061277283398151915290602001610996565b600061153360045490565b6001600160a01b03841660009081526005602052604081208054929350849161155c8385612282565b90915550506001600160a01b0384166000908152600c602052604090205460ff166115e657600061158d8383612255565b6001600160a01b0386166000908152600560205260409020546115b1908590612255565b6115bb9190611f77565b905060005b818110156115e3576115d1866117ed565b806115db81612269565b9150506115c0565b50505b6040518381526001600160a01b0385169060009060008051602061277283398151915290602001610996565b6060600061161f836119e7565b600101905060008167ffffffffffffffff81111561163f5761163f611bce565b6040519080825280601f01601f191660200182016040528015611669576020820181803683370190505b5090508181016020015b600019016f181899199a1a9b1b9c1cb0b131b232b360811b600a86061a8153600a850494508461167357509392505050565b6001600160a01b0381166116cc57604051636edaef2f60e11b815260040160405180910390fd5b6001600160a01b0381166000908152600a6020526040812080546116f290600190611f77565b8154811061170257611702611f8a565b90600052602060002001549050600a6000836001600160a01b03166001600160a01b0316815260200190815260200160002080548061174357611743611fa0565b600082815260208082208301600019908101839055909201909255828252600b815260408083208390556009825280832080546001600160a01b031990811690915560079092528083208054909216909155600d80546001810182559083527fd7b6990105719101dabeb77144f2a3385c8033acd3af97e9423a695e81ad1eb501839055518291906001600160a01b03851690600080516020612772833981519152908390a45050565b6001600160a01b03811661181457604051634e46966960e11b815260040160405180910390fd5b600061181f60045490565b611849907f0000000000000000000000000000000000004829b01bb87f99279cf89d000000612255565b905060008160035410156118685750600380546001019081905561191f565b600d5460000361187757505050565b600d5460009061188690611abf565b9050600d818154811061189b5761189b611f8a565b90600052602060002001549150600d6001600d805490506118bc9190611f77565b815481106118cc576118cc611f8a565b9060005260206000200154600d82815481106118ea576118ea611f8a565b600091825260209091200155600d80548061190757611907611fa0565b60019003818190600052602060002001600090559055505b6000818152600960205260409020546001600160a01b0316156119555760405163119b4fd360e11b815260040160405180910390fd5b600081815260096020908152604080832080546001600160a01b0319166001600160a01b038816908117909155808452600a835290832080546001818101835582865293852001859055925290546119ad9190611f77565b6000828152600b602052604080822092909255905182916001600160a01b03861691600080516020612772833981519152908290a4505050565b60008072184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b8310611a265772184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b830492506040015b6d04ee2d6d415b85acef81000000008310611a52576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc100008310611a7057662386f26fc10000830492506010015b6305f5e1008310611a88576305f5e100830492506008015b6127108310611a9c57612710830492506004015b60648310611aae576064830492506002015b600a83106106775760010192915050565b600081424433604051602001611afa93929190928352602083019190915260601b6bffffffffffffffffffffffff1916604082015260540190565b6040516020818303038152906040528051906020012060001c6106779190612295565b60005b83811015611b38578181015183820152602001611b20565b50506000910152565b6020815260008251806020840152611b60816040850160208701611b1d565b601f01601f19169190910160400192915050565b600060208284031215611b8657600080fd5b5035919050565b80356001600160a01b0381168114610bd957600080fd5b60008060408385031215611bb757600080fd5b611bc083611b8d565b946020939093013593505050565b634e487b7160e01b600052604160045260246000fd5b600060208284031215611bf657600080fd5b813567ffffffffffffffff80821115611c0e57600080fd5b818401915084601f830112611c2257600080fd5b813581811115611c3457611c34611bce565b604051601f8201601f19908116603f01168101908382118183101715611c5c57611c5c611bce565b81604052828152876020848701011115611c7557600080fd5b826020860160208301376000928101602001929092525095945050505050565b600080600060608486031215611caa57600080fd5b611cb384611b8d565b9250611cc160208501611b8d565b9150604084013590509250925092565b60008060408385031215611ce457600080fd5b611ced83611b8d565b915060208301358015158114611d0257600080fd5b809150509250929050565b60008060408385031215611d2057600080fd5b82359150611d3060208401611b8d565b90509250929050565b600060208284031215611d4b57600080fd5b610ccc82611b8d565b600080600080600060808688031215611d6c57600080fd5b611d7586611b8d565b9450611d8360208701611b8d565b935060408601359250606086013567ffffffffffffffff80821115611da757600080fd5b818801915088601f830112611dbb57600080fd5b813581811115611dca57600080fd5b896020828501011115611ddc57600080fd5b9699959850939650602001949392505050565b60008060408385031215611e0257600080fd5b611e0b83611b8d565b9150611d3060208401611b8d565b600181811c90821680611e2d57607f821691505b602082108103611e4d57634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115610a0e57600081815260208120601f850160051c81016020861015611e7a5750805b601f850160051c820191505b81811015611e9957828155600101611e86565b505050505050565b815167ffffffffffffffff811115611ebb57611ebb611bce565b611ecf81611ec98454611e19565b84611e53565b602080601f831160018114611f045760008415611eec5750858301515b600019600386901b1c1916600185901b178555611e99565b600085815260208120601f198616915b82811015611f3357888601518255948401946001909101908401611f14565b5085821015611f515787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b600052601160045260246000fd5b8181038181111561067757610677611f61565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052603160045260246000fd5b600060208284031215611fc857600080fd5b81516001600160e01b031981168114610ccc57600080fd5b6001600160a01b038681168252851660208201526040810184905260806060820181905281018290526000828460a0840137600060a0848401015260a0601f19601f85011683010190509695505050505050565b6000815461204181611e19565b60018281168015612059576001811461206e5761209d565b60ff198416875282151583028701945061209d565b8560005260208060002060005b858110156120945781548a82015290840190820161207b565b50505082870194505b5050505092915050565b60006120b38285612034565b83516120c3818360208801611b1d565b01949350505050565b693d913730b6b2911d101160b11b815260006120eb600a830185612034565b61202360f01b81528351612106816002840160208801611b1d565b01600201949350505050565b60008351612124818460208801611b1d565b701116113232b9b1b934b83a34b7b7111d1160791b9083019081528351612152816011840160208801611b1d565b6a11161134b6b0b3b2911d1160a91b60119290910191820152601c01949350505050565b60008351612188818460208801611b1d565b8351908301906120c3818360208801611b1d565b7f222c2261747472696275746573223a5b7b2274726169745f74797065223a225381526f32b934b2b99116113b30b63ab2911d1160811b6020820152600082516121ed816030850160208701611b1d565b9190910160300192915050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b757466382c000000000081526000825161223281601b850160208701611b1d565b91909101601b0192915050565b634e487b7160e01b600052601260045260246000fd5b6000826122645761226461223f565b500490565b60006001820161227b5761227b611f61565b5060010190565b8082018082111561067757610677611f61565b6000826122a4576122a461223f565b50069056fe53696c7665722046616e74617379203a20456c657661746520796f75722071756573742077697468207468652053696c7665722046616e746173792e2057697468696e2069747320636f6e66696e6573206c6965732074686520616c6c757265206f6620706f73736962696c6974792c206120737465702061626f766520746865206f7264696e617279207769746820747265617375726573207468617420737061726b2074686520696d6167696e6174696f6e2e204120636f6c6c656374696f6e2074686174277320726172652c2066696c6c6564207769746820776f6e646572732077616974696e6720746f2062652072657665616c65642062792074686f736520776974682074686520766973696f6e20746f20736565206265796f6e642e4469616d6f6e642045706f6368203a204174207468652070696e6e61636c65207374616e647320746865204469616d6f6e642045706f63682c20746865207a656e697468206f662072617269747920616e64206c75787572792e20546865736520626f786573206172652074686520726172657374206f6620616c6c2c207472616e7363656e64696e672074686520636f6d6d6f6e616c697479206f662074686520636f6c6c656374696f6e20746f206f666665722061207069656365206f6620686973746f72792c20612074696d656c6573732065706f636820636170747572656420696e2061206469676974616c20666f726d61742e20526573657276656420666f722074686520656c6974652c20746865204469616d6f6e642045706f63682069732074686520756c74696d6174652073796d626f6c206f662073746174757320616e6420616368696576656d656e7420696e2074686520776f726c64206f66204e4654732e476f6c6420476c6f7279203a20496e64756c676520696e20746865206f70756c656e6365206f662074686520476f6c6420476c6f72792e205468697320626f7820697320612074657374616d656e7420746f207468652073706c656e646f7220616e642070726573746967652074686174206f6e6c7920746865206665772077696c6c206b6e6f772e204974277320612074726f7665206f662076616c75652c2061206d61726b206f662064697374696e6374696f6e20666f7220736572696f757320636f6c6c6563746f7273207365656b696e6720746f2063656d656e74207468656972206c656761637920696e2074686520616e6e616c73206f6620746865206469676974616c207265616c6d2e456d6572616c64204c6567656e64203a205374657020696e746f206120776f726c64206f66206d7974687320776974682074686520456d6572616c64204c6567656e642e205368726f7564656420696e207468652068756573206f6620746865207269636865737420677265656e2c20746865736520626f786573206172652061732072617265206173207468657920617265206c6567656e646172792c206f66666572696e67206120676c696d70736520696e746f2061206e617272617469766520776f76656e2066726f6d207468652074687265616473206f66206469676974616c2064657374696e792e204f6e6c7920746865206d6f73742064656469636174656420686f6c646572732077696c6c20756e7665696c20746865206c6567656e64732077697468696e2eddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef42726f6e7a65204d797374657279203a20426567696e20796f757220616476656e747572652077697468207468652042726f6e7a65204d7973746572792c20776865726520657665727920747769737420616e64207475726e20686f6c64732074686520706f74656e7469616c206f662068696464656e207472656173757265732e20436f6d6d6f6e2079657420756e7072656469637461626c652c20746865736520626f7865732061726520746865206669727374207374657020696e2061206a6f75726e6579206f6620646973636f7665727920666f7220616e7920636f6c6c6563746f72206f6e2074686520457468657265756d20626c6f636b636861696e2ea26469706673582212203bb089884fae24d2c2b105433b909307647157c9b3148e3084d1848ff0e2e62e64736f6c63430008130033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000006ca85dfd7a5f45568c1b1b718ebb97e351dcf07300000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000005332b64a999400000000000000000000000000000000000000001d8ed294292a063516ed0000000000000000000000000000000000000000000000000000000000000000000044156415600000000000000000000000000000000000000000000000000000000
-----Decoded View---------------
Arg [0] : _owner (address): 0x6cA85DFd7a5f45568C1b1b718eBb97e351Dcf073
Arg [1] : _symbol (string): AVAV
Arg [2] : supply (uint256): 1463636349000000
Arg [3] : _unit (uint256): 146363634900000000000000000000
-----Encoded View---------------
6 Constructor Arguments found :
Arg [0] : 0000000000000000000000006ca85dfd7a5f45568c1b1b718ebb97e351dcf073
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000080
Arg [2] : 0000000000000000000000000000000000000000000000000005332b64a99940
Arg [3] : 0000000000000000000000000000000000000001d8ed294292a063516ed00000
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000004
Arg [5] : 4156415600000000000000000000000000000000000000000000000000000000
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.