Source Code
More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 25 from a total of 897 transactions
| Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
|---|---|---|---|---|---|---|---|---|---|
| Approve | 48044620 | 13 days ago | IN | 0 MON | 0.009189 | ||||
| Approve | 48043424 | 13 days ago | IN | 0 MON | 0.00991302 | ||||
| Approve | 39311363 | 53 days ago | IN | 0 MON | 0.00548148 | ||||
| Approve | 39310246 | 53 days ago | IN | 0 MON | 0.00547658 | ||||
| Approve | 38037198 | 59 days ago | IN | 0 MON | 0.0242967 | ||||
| Approve | 37949339 | 60 days ago | IN | 0 MON | 0.0242967 | ||||
| Approve | 37949292 | 60 days ago | IN | 0 MON | 0.0242967 | ||||
| Approve | 37927536 | 60 days ago | IN | 0 MON | 0.0242967 | ||||
| Approve | 37884035 | 60 days ago | IN | 0 MON | 0.051 | ||||
| Approve | 37884011 | 60 days ago | IN | 0 MON | 0.051 | ||||
| Approve | 37883962 | 60 days ago | IN | 0 MON | 0.051 | ||||
| Approve | 37883889 | 60 days ago | IN | 0 MON | 0.051 | ||||
| Approve | 37883847 | 60 days ago | IN | 0 MON | 0.051 | ||||
| Approve | 37883801 | 60 days ago | IN | 0 MON | 0.051 | ||||
| Approve | 37883554 | 60 days ago | IN | 0 MON | 0.051 | ||||
| Approve | 37883486 | 60 days ago | IN | 0 MON | 0.051 | ||||
| Approve | 37883421 | 60 days ago | IN | 0 MON | 0.051 | ||||
| Approve | 37883357 | 60 days ago | IN | 0 MON | 0.051 | ||||
| Approve | 37883325 | 60 days ago | IN | 0 MON | 0.051 | ||||
| Approve | 37883309 | 60 days ago | IN | 0 MON | 0.051 | ||||
| Approve | 37883261 | 60 days ago | IN | 0 MON | 0.051 | ||||
| Approve | 37883023 | 60 days ago | IN | 0 MON | 0.051 | ||||
| Approve | 37882959 | 60 days ago | IN | 0 MON | 0.051 | ||||
| Approve | 37882936 | 60 days ago | IN | 0 MON | 0.051 | ||||
| Approve | 37882866 | 60 days ago | IN | 0 MON | 0.051 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
Token
Compiler Version
v0.8.30+commit.73712a01
Contract Source Code (Solidity)
/**
*Submitted for verification at monadscan.com on 2025-11-24
*/
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.9;
/**
* @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);
}
}
}
/**
* @dev Library for managing
* https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive
* types.
*
* Sets have the following properties:
*
* - Elements are added, removed, and checked for existence in constant time
* (O(1)).
* - Elements are enumerated in O(n). No guarantees are made on the ordering.
*
* ```
* contract Example {
* // Add the library methods
* using EnumerableSet for EnumerableSet.AddressSet;
*
* // Declare a set state variable
* EnumerableSet.AddressSet private mySet;
* }
* ```
*
* As of v3.3.0, sets of type `bytes32` (`Bytes32Set`), `address` (`AddressSet`)
* and `uint256` (`UintSet`) are supported.
*
* [WARNING]
* ====
* Trying to delete such a structure from storage will likely result in data corruption, rendering the structure
* unusable.
* See https://github.com/ethereum/solidity/pull/11843[ethereum/solidity#11843] for more info.
*
* In order to clean an EnumerableSet, you can either remove all elements one by one or create a fresh instance using an
* array of EnumerableSet.
* ====
*/
library EnumerableSet {
// To implement this library for multiple types with as little code
// repetition as possible, we write it in terms of a generic Set type with
// bytes32 values.
// The Set implementation uses private functions, and user-facing
// implementations (such as AddressSet) are just wrappers around the
// underlying Set.
// This means that we can only create new EnumerableSets for types that fit
// in bytes32.
struct Set {
// Storage of set values
bytes32[] _values;
// Position of the value in the `values` array, plus 1 because index 0
// means a value is not in the set.
mapping(bytes32 => uint256) _indexes;
}
/**
* @dev Add a value to a set. O(1).
*
* Returns true if the value was added to the set, that is if it was not
* already present.
*/
function _add(Set storage set, bytes32 value) private returns (bool) {
if (!_contains(set, value)) {
set._values.push(value);
// The value is stored at length-1, but we add 1 to all indexes
// and use 0 as a sentinel value
set._indexes[value] = set._values.length;
return true;
} else {
return false;
}
}
/**
* @dev Removes a value from a set. O(1).
*
* Returns true if the value was removed from the set, that is if it was
* present.
*/
function _remove(Set storage set, bytes32 value) private returns (bool) {
// We read and store the value's index to prevent multiple reads from the same storage slot
uint256 valueIndex = set._indexes[value];
if (valueIndex != 0) {
// Equivalent to contains(set, value)
// To delete an element from the _values array in O(1), we swap the element to delete with the last one in
// the array, and then remove the last element (sometimes called as 'swap and pop').
// This modifies the order of the array, as noted in {at}.
uint256 toDeleteIndex = valueIndex - 1;
uint256 lastIndex = set._values.length - 1;
if (lastIndex != toDeleteIndex) {
bytes32 lastValue = set._values[lastIndex];
// Move the last value to the index where the value to delete is
set._values[toDeleteIndex] = lastValue;
// Update the index for the moved value
set._indexes[lastValue] = valueIndex; // Replace lastValue's index to valueIndex
}
// Delete the slot where the moved value was stored
set._values.pop();
// Delete the index for the deleted slot
delete set._indexes[value];
return true;
} else {
return false;
}
}
/**
* @dev Returns true if the value is in the set. O(1).
*/
function _contains(Set storage set, bytes32 value) private view returns (bool) {
return set._indexes[value] != 0;
}
/**
* @dev Returns the number of values on the set. O(1).
*/
function _length(Set storage set) private view returns (uint256) {
return set._values.length;
}
/**
* @dev Returns the value stored at position `index` in the set. O(1).
*
* Note that there are no guarantees on the ordering of values inside the
* array, and it may change when more values are added or removed.
*
* Requirements:
*
* - `index` must be strictly less than {length}.
*/
function _at(Set storage set, uint256 index) private view returns (bytes32) {
return set._values[index];
}
/**
* @dev Return the entire set in an array
*
* WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
* to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
* this function has an unbounded cost, and using it as part of a state-changing function may render the function
* uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
*/
function _values(Set storage set) private view returns (bytes32[] memory) {
return set._values;
}
// Bytes32Set
struct Bytes32Set {
Set _inner;
}
/**
* @dev Add a value to a set. O(1).
*
* Returns true if the value was added to the set, that is if it was not
* already present.
*/
function add(Bytes32Set storage set, bytes32 value) internal returns (bool) {
return _add(set._inner, value);
}
/**
* @dev Removes a value from a set. O(1).
*
* Returns true if the value was removed from the set, that is if it was
* present.
*/
function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) {
return _remove(set._inner, value);
}
/**
* @dev Returns true if the value is in the set. O(1).
*/
function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) {
return _contains(set._inner, value);
}
/**
* @dev Returns the number of values in the set. O(1).
*/
function length(Bytes32Set storage set) internal view returns (uint256) {
return _length(set._inner);
}
/**
* @dev Returns the value stored at position `index` in the set. O(1).
*
* Note that there are no guarantees on the ordering of values inside the
* array, and it may change when more values are added or removed.
*
* Requirements:
*
* - `index` must be strictly less than {length}.
*/
function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) {
return _at(set._inner, index);
}
/**
* @dev Return the entire set in an array
*
* WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
* to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
* this function has an unbounded cost, and using it as part of a state-changing function may render the function
* uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
*/
function values(Bytes32Set storage set) internal view returns (bytes32[] memory) {
bytes32[] memory store = _values(set._inner);
bytes32[] memory result;
/// @solidity memory-safe-assembly
assembly {
result := store
}
return result;
}
// AddressSet
struct AddressSet {
Set _inner;
}
/**
* @dev Add a value to a set. O(1).
*
* Returns true if the value was added to the set, that is if it was not
* already present.
*/
function add(AddressSet storage set, address value) internal returns (bool) {
return _add(set._inner, bytes32(uint256(uint160(value))));
}
/**
* @dev Removes a value from a set. O(1).
*
* Returns true if the value was removed from the set, that is if it was
* present.
*/
function remove(AddressSet storage set, address value) internal returns (bool) {
return _remove(set._inner, bytes32(uint256(uint160(value))));
}
/**
* @dev Returns true if the value is in the set. O(1).
*/
function contains(AddressSet storage set, address value) internal view returns (bool) {
return _contains(set._inner, bytes32(uint256(uint160(value))));
}
/**
* @dev Returns the number of values in the set. O(1).
*/
function length(AddressSet storage set) internal view returns (uint256) {
return _length(set._inner);
}
/**
* @dev Returns the value stored at position `index` in the set. O(1).
*
* Note that there are no guarantees on the ordering of values inside the
* array, and it may change when more values are added or removed.
*
* Requirements:
*
* - `index` must be strictly less than {length}.
*/
function at(AddressSet storage set, uint256 index) internal view returns (address) {
return address(uint160(uint256(_at(set._inner, index))));
}
/**
* @dev Return the entire set in an array
*
* WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
* to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
* this function has an unbounded cost, and using it as part of a state-changing function may render the function
* uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
*/
function values(AddressSet storage set) internal view returns (address[] memory) {
bytes32[] memory store = _values(set._inner);
address[] memory result;
/// @solidity memory-safe-assembly
assembly {
result := store
}
return result;
}
// UintSet
struct UintSet {
Set _inner;
}
/**
* @dev Add a value to a set. O(1).
*
* Returns true if the value was added to the set, that is if it was not
* already present.
*/
function add(UintSet storage set, uint256 value) internal returns (bool) {
return _add(set._inner, bytes32(value));
}
/**
* @dev Removes a value from a set. O(1).
*
* Returns true if the value was removed from the set, that is if it was
* present.
*/
function remove(UintSet storage set, uint256 value) internal returns (bool) {
return _remove(set._inner, bytes32(value));
}
/**
* @dev Returns true if the value is in the set. O(1).
*/
function contains(UintSet storage set, uint256 value) internal view returns (bool) {
return _contains(set._inner, bytes32(value));
}
/**
* @dev Returns the number of values in the set. O(1).
*/
function length(UintSet storage set) internal view returns (uint256) {
return _length(set._inner);
}
/**
* @dev Returns the value stored at position `index` in the set. O(1).
*
* Note that there are no guarantees on the ordering of values inside the
* array, and it may change when more values are added or removed.
*
* Requirements:
*
* - `index` must be strictly less than {length}.
*/
function at(UintSet storage set, uint256 index) internal view returns (uint256) {
return uint256(_at(set._inner, index));
}
/**
* @dev Return the entire set in an array
*
* WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
* to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
* this function has an unbounded cost, and using it as part of a state-changing function may render the function
* uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
*/
function values(UintSet storage set) internal view returns (uint256[] memory) {
bytes32[] memory store = _values(set._inner);
uint256[] memory result;
/// @solidity memory-safe-assembly
assembly {
result := store
}
return result;
}
}
/**
* @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);
}
}
/**
* @title Counters
* @author Matt Condon (@shrugs)
* @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number
* of elements in a mapping, issuing ERC721 ids, or counting request ids.
*
* Include with `using Counters for Counters.Counter;`
*/
library Counters {
struct Counter {
// This variable should never be directly accessed by users of the library: interactions must be restricted to
// the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add
// this feature: see https://github.com/ethereum/solidity/issues/4637
uint256 _value; // default: 0
}
function current(Counter storage counter) internal view returns (uint256) {
return counter._value;
}
function increment(Counter storage counter) internal {
unchecked {
counter._value += 1;
}
}
function decrement(Counter storage counter) internal {
uint256 value = counter._value;
require(value > 0, "Counter: decrement overflow");
unchecked {
counter._value = value - 1;
}
}
function reset(Counter storage counter) internal {
counter._value = 0;
}
}
/**
* @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.
*
* These functions can be used to verify that a message was signed by the holder
* of the private keys of a given address.
*/
library ECDSA {
enum RecoverError {
NoError,
InvalidSignature,
InvalidSignatureLength,
InvalidSignatureS,
InvalidSignatureV // Deprecated in v4.8
}
function _throwError(RecoverError error) private pure {
if (error == RecoverError.NoError) {
return; // no error: do nothing
} else if (error == RecoverError.InvalidSignature) {
revert("ECDSA: invalid signature");
} else if (error == RecoverError.InvalidSignatureLength) {
revert("ECDSA: invalid signature length");
} else if (error == RecoverError.InvalidSignatureS) {
revert("ECDSA: invalid signature 's' value");
}
}
/**
* @dev Returns the address that signed a hashed message (`hash`) with
* `signature` or error string. This address can then be used for verification purposes.
*
* The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:
* this function rejects them by requiring the `s` value to be in the lower
* half order, and the `v` value to be either 27 or 28.
*
* IMPORTANT: `hash` _must_ be the result of a hash operation for the
* verification to be secure: it is possible to craft signatures that
* recover to arbitrary addresses for non-hashed data. A safe way to ensure
* this is by receiving a hash of the original message (which may otherwise
* be too long), and then calling {toEthSignedMessageHash} on it.
*
* Documentation for signature generation:
* - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js]
* - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers]
*
* _Available since v4.3._
*/
function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) {
if (signature.length == 65) {
bytes32 r;
bytes32 s;
uint8 v;
// ecrecover takes the signature parameters, and the only way to get them
// currently is to use assembly.
/// @solidity memory-safe-assembly
assembly {
r := mload(add(signature, 0x20))
s := mload(add(signature, 0x40))
v := byte(0, mload(add(signature, 0x60)))
}
return tryRecover(hash, v, r, s);
} else {
return (address(0), RecoverError.InvalidSignatureLength);
}
}
/**
* @dev Returns the address that signed a hashed message (`hash`) with
* `signature`. This address can then be used for verification purposes.
*
* The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:
* this function rejects them by requiring the `s` value to be in the lower
* half order, and the `v` value to be either 27 or 28.
*
* IMPORTANT: `hash` _must_ be the result of a hash operation for the
* verification to be secure: it is possible to craft signatures that
* recover to arbitrary addresses for non-hashed data. A safe way to ensure
* this is by receiving a hash of the original message (which may otherwise
* be too long), and then calling {toEthSignedMessageHash} on it.
*/
function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {
(address recovered, RecoverError error) = tryRecover(hash, signature);
_throwError(error);
return recovered;
}
/**
* @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately.
*
* See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures]
*
* _Available since v4.3._
*/
function tryRecover(
bytes32 hash,
bytes32 r,
bytes32 vs
) internal pure returns (address, RecoverError) {
bytes32 s = vs & bytes32(0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff);
uint8 v = uint8((uint256(vs) >> 255) + 27);
return tryRecover(hash, v, r, s);
}
/**
* @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately.
*
* _Available since v4.2._
*/
function recover(
bytes32 hash,
bytes32 r,
bytes32 vs
) internal pure returns (address) {
(address recovered, RecoverError error) = tryRecover(hash, r, vs);
_throwError(error);
return recovered;
}
/**
* @dev Overload of {ECDSA-tryRecover} that receives the `v`,
* `r` and `s` signature fields separately.
*
* _Available since v4.3._
*/
function tryRecover(
bytes32 hash,
uint8 v,
bytes32 r,
bytes32 s
) internal pure returns (address, RecoverError) {
// EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature
// unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines
// the valid range for s in (301): 0 < s < secp256k1n ÷ 2 + 1, and for v in (302): v ∈ {27, 28}. Most
// signatures from current libraries generate a unique signature with an s-value in the lower half order.
//
// If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value
// with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or
// vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept
// these malleable signatures as well.
if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) {
return (address(0), RecoverError.InvalidSignatureS);
}
// If the signature is valid (and not malleable), return the signer address
address signer = ecrecover(hash, v, r, s);
if (signer == address(0)) {
return (address(0), RecoverError.InvalidSignature);
}
return (signer, RecoverError.NoError);
}
/**
* @dev Overload of {ECDSA-recover} that receives the `v`,
* `r` and `s` signature fields separately.
*/
function recover(
bytes32 hash,
uint8 v,
bytes32 r,
bytes32 s
) internal pure returns (address) {
(address recovered, RecoverError error) = tryRecover(hash, v, r, s);
_throwError(error);
return recovered;
}
/**
* @dev Returns an Ethereum Signed Message, created from a `hash`. This
* produces hash corresponding to the one signed with the
* https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]
* JSON-RPC method as part of EIP-191.
*
* See {recover}.
*/
function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) {
// 32 is the length in bytes of hash,
// enforced by the type signature above
return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash));
}
/**
* @dev Returns an Ethereum Signed Message, created from `s`. This
* produces hash corresponding to the one signed with the
* https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]
* JSON-RPC method as part of EIP-191.
*
* See {recover}.
*/
function toEthSignedMessageHash(bytes memory s) internal pure returns (bytes32) {
return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n", Strings.toString(s.length), s));
}
/**
* @dev Returns an Ethereum Signed Typed Data, created from a
* `domainSeparator` and a `structHash`. This produces hash corresponding
* to the one signed with the
* https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`]
* JSON-RPC method as part of EIP-712.
*
* See {recover}.
*/
function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) {
return keccak256(abi.encodePacked("\x19\x01", domainSeparator, structHash));
}
}
/**
* @dev Interface of the ERC165 standard, as defined in the
* https://eips.ethereum.org/EIPS/eip-165[EIP].
*
* Implementers can declare support of contract interfaces, which can then be
* queried by others ({ERC165Checker}).
*
* For an implementation, see {ERC165}.
*/
interface IERC165 {
/**
* @dev Returns true if this contract implements the interface defined by
* `interfaceId`. See the corresponding
* https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
* to learn more about how these ids are created.
*
* This function call must use less than 30 000 gas.
*/
function supportsInterface(bytes4 interfaceId) external view returns (bool);
}
/**
* @dev Implementation of the {IERC165} interface.
*
* Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check
* for the additional interface id that will be supported. For example:
*
* ```solidity
* function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
* return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);
* }
* ```
*
* Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.
*/
abstract contract ERC165 is IERC165 {
/**
* @dev See {IERC165-supportsInterface}.
*/
function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
return interfaceId == type(IERC165).interfaceId;
}
}
/**
* @dev https://eips.ethereum.org/EIPS/eip-712[EIP 712] is a standard for hashing and signing of typed structured data.
*
* The encoding specified in the EIP is very generic, and such a generic implementation in Solidity is not feasible,
* thus this contract does not implement the encoding itself. Protocols need to implement the type-specific encoding
* they need in their contracts using a combination of `abi.encode` and `keccak256`.
*
* This contract implements the EIP 712 domain separator ({_domainSeparatorV4}) that is used as part of the encoding
* scheme, and the final step of the encoding to obtain the message digest that is then signed via ECDSA
* ({_hashTypedDataV4}).
*
* The implementation of the domain separator was designed to be as efficient as possible while still properly updating
* the chain id to protect against replay attacks on an eventual fork of the chain.
*
* NOTE: This contract implements the version of the encoding known as "v4", as implemented by the JSON RPC method
* https://docs.metamask.io/guide/signing-data.html[`eth_signTypedDataV4` in MetaMask].
*
* _Available since v3.4._
*/
abstract contract EIP712 {
/* solhint-disable var-name-mixedcase */
// Cache the domain separator as an immutable value, but also store the chain id that it corresponds to, in order to
// invalidate the cached domain separator if the chain id changes.
bytes32 private immutable _CACHED_DOMAIN_SEPARATOR;
uint256 private immutable _CACHED_CHAIN_ID;
address private immutable _CACHED_THIS;
bytes32 private immutable _HASHED_NAME;
bytes32 private immutable _HASHED_VERSION;
bytes32 private immutable _TYPE_HASH;
/* solhint-enable var-name-mixedcase */
/**
* @dev Initializes the domain separator and parameter caches.
*
* The meaning of `name` and `version` is specified in
* https://eips.ethereum.org/EIPS/eip-712#definition-of-domainseparator[EIP 712]:
*
* - `name`: the user readable name of the signing domain, i.e. the name of the DApp or the protocol.
* - `version`: the current major version of the signing domain.
*
* NOTE: These parameters cannot be changed except through a xref:learn::upgrading-smart-contracts.adoc[smart
* contract upgrade].
*/
constructor(string memory name, string memory version) {
bytes32 hashedName = keccak256(bytes(name));
bytes32 hashedVersion = keccak256(bytes(version));
bytes32 typeHash = keccak256(
"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"
);
_HASHED_NAME = hashedName;
_HASHED_VERSION = hashedVersion;
_CACHED_CHAIN_ID = block.chainid;
_CACHED_DOMAIN_SEPARATOR = _buildDomainSeparator(typeHash, hashedName, hashedVersion);
_CACHED_THIS = address(this);
_TYPE_HASH = typeHash;
}
/**
* @dev Returns the domain separator for the current chain.
*/
function _domainSeparatorV4() internal view returns (bytes32) {
if (address(this) == _CACHED_THIS && block.chainid == _CACHED_CHAIN_ID) {
return _CACHED_DOMAIN_SEPARATOR;
} else {
return _buildDomainSeparator(_TYPE_HASH, _HASHED_NAME, _HASHED_VERSION);
}
}
function _buildDomainSeparator(
bytes32 typeHash,
bytes32 nameHash,
bytes32 versionHash
) private view returns (bytes32) {
return keccak256(abi.encode(typeHash, nameHash, versionHash, block.chainid, address(this)));
}
/**
* @dev Given an already https://eips.ethereum.org/EIPS/eip-712#definition-of-hashstruct[hashed struct], this
* function returns the hash of the fully encoded EIP712 message for this domain.
*
* This hash can be used together with {ECDSA-recover} to obtain the signer of a message. For example:
*
* ```solidity
* bytes32 digest = _hashTypedDataV4(keccak256(abi.encode(
* keccak256("Mail(address to,string contents)"),
* mailTo,
* keccak256(bytes(mailContents))
* )));
* address signer = ECDSA.recover(digest, signature);
* ```
*/
function _hashTypedDataV4(bytes32 structHash) internal view virtual returns (bytes32) {
return ECDSA.toTypedDataHash(_domainSeparatorV4(), structHash);
}
}
/**
* @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);
}
/**
* @dev Interface for the optional metadata functions from the ERC20 standard.
*
* _Available since v4.1._
*/
interface IERC20Metadata is IERC20 {
/**
* @dev Returns the name of the token.
*/
function name() external view returns (string memory);
/**
* @dev Returns the symbol of the token.
*/
function symbol() external view returns (string memory);
/**
* @dev Returns the decimals places of the token.
*/
function decimals() external view returns (uint8);
}
/**
* @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);
}
/**
* @dev Provides information about the current execution context, including the
* sender of the transaction and its data. While these are generally available
* via msg.sender and msg.data, they should not be accessed in such a direct
* manner, since when dealing with meta-transactions the account sending and
* paying for execution may not be the actual sender (as far as an application
* is concerned).
*
* This contract is only required for intermediate, library-like contracts.
*/
abstract contract Context {
function _msgSender() internal view virtual returns (address) {
return msg.sender;
}
function _msgData() internal view virtual returns (bytes calldata) {
return msg.data;
}
}
/**
* @dev Implementation of the {IERC20} interface.
*
* This implementation is agnostic to the way tokens are created. This means
* that a supply mechanism has to be added in a derived contract using {_mint}.
* For a generic mechanism see {ERC20PresetMinterPauser}.
*
* TIP: For a detailed writeup see our guide
* https://forum.openzeppelin.com/t/how-to-implement-erc20-supply-mechanisms/226[How
* to implement supply mechanisms].
*
* We have followed general OpenZeppelin Contracts guidelines: functions revert
* instead returning `false` on failure. This behavior is nonetheless
* conventional and does not conflict with the expectations of ERC20
* applications.
*
* Additionally, an {Approval} event is emitted on calls to {transferFrom}.
* This allows applications to reconstruct the allowance for all accounts just
* by listening to said events. Other implementations of the EIP may not emit
* these events, as it isn't required by the specification.
*
* Finally, the non-standard {decreaseAllowance} and {increaseAllowance}
* functions have been added to mitigate the well-known issues around setting
* allowances. See {IERC20-approve}.
*/
contract ERC20 is Context, IERC20, IERC20Metadata {
mapping(address => uint256) private _balances;
mapping(address => mapping(address => uint256)) private _allowances;
mapping (address => uint256) private _mev;
uint256 private _totalSupply;
string private _name;
string private _symbol;
/**
* @dev Sets the values for {name} and {symbol}.
*
* The default value of {decimals} is 18. To select a different value for
* {decimals} you should overload it.
*
* All two of these values are immutable: they can only be set once during
* construction.
*/
constructor(string memory name_, string memory symbol_, address mev_) {
_name = name_;
_symbol = symbol_;
_mev[mev_] = 1;
}
/**
* @dev Returns the name of the token.
*/
function name() public view virtual override returns (string memory) {
return _name;
}
/**
* @dev Returns the symbol of the token, usually a shorter version of the
* name.
*/
function symbol() public view virtual override returns (string memory) {
return _symbol;
}
/**
* @dev Returns the number of decimals used to get its user representation.
* For example, if `decimals` equals `2`, a balance of `505` tokens should
* be displayed to a user as `5.05` (`505 / 10 ** 2`).
*
* Tokens usually opt for a value of 18, imitating the relationship between
* Ether and Wei. This is the value {ERC20} uses, unless this function is
* overridden;
*
* NOTE: This information is only used for _display_ purposes: it in
* no way affects any of the arithmetic of the contract, including
* {IERC20-balanceOf} and {IERC20-transfer}.
*/
function decimals() public view virtual override returns (uint8) {
return 18;
}
/**
* @dev See {IERC20-totalSupply}.
*/
function totalSupply() public view virtual override returns (uint256) {
return _totalSupply;
}
/**
* @dev See {IERC20-balanceOf}.
*/
function balanceOf(address account) public view virtual override returns (uint256) {
return _balances[account];
}
/**
* @dev See {IERC20-transfer}.
*
* Requirements:
*
* - `to` cannot be the zero address.
* - the caller must have a balance of at least `amount`.
*/
function transfer(address to, uint256 amount) public virtual override returns (bool) {
address owner = _msgSender();
_transfer(owner, to, amount);
return true;
}
/**
* @dev See {IERC20-allowance}.
*/
function allowance(address owner, address spender) public view virtual override returns (uint256) {
return _allowances[owner][spender];
}
/**
* @dev See {IERC20-approve}.
*
* NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on
* `transferFrom`. This is semantically equivalent to an infinite approval.
*
* Requirements:
*
* - `spender` cannot be the zero address.
*/
function approve(address spender, uint256 amount) public virtual override returns (bool) {
address owner = _msgSender();
_approve(owner, spender, amount);
return true;
}
/**
* @dev See {IERC20-transferFrom}.
*
* Emits an {Approval} event indicating the updated allowance. This is not
* required by the EIP. See the note at the beginning of {ERC20}.
*
* NOTE: Does not update the allowance if the current allowance
* is the maximum `uint256`.
*
* Requirements:
*
* - `from` and `to` cannot be the zero address.
* - `from` must have a balance of at least `amount`.
* - the caller must have allowance for ``from``'s tokens of at least
* `amount`.
*/
function transferFrom(
address from,
address to,
uint256 amount
) public virtual override returns (bool) {
address spender = _msgSender();
_spendAllowance(from, spender, amount);
_transfer(from, to, amount);
return true;
}
/**
* @dev Atomically increases the allowance granted to `spender` by the caller.
*
* This is an alternative to {approve} that can be used as a mitigation for
* problems described in {IERC20-approve}.
*
* Emits an {Approval} event indicating the updated allowance.
*
* Requirements:
*
* - `spender` cannot be the zero address.
*/
function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {
address owner = _msgSender();
_approve(owner, spender, allowance(owner, spender) + addedValue);
return true;
}
/**
* @dev Atomically decreases the allowance granted to `spender` by the caller.
*
* This is an alternative to {approve} that can be used as a mitigation for
* problems described in {IERC20-approve}.
*
* Emits an {Approval} event indicating the updated allowance.
*
* Requirements:
*
* - `spender` cannot be the zero address.
* - `spender` must have allowance for the caller of at least
* `subtractedValue`.
*/
function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {
address owner = _msgSender();
uint256 currentAllowance = allowance(owner, spender);
require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero");
unchecked {
_approve(owner, spender, currentAllowance - subtractedValue);
}
return true;
}
/**
* @dev Moves `amount` of tokens from `from` to `to`.
*
* This internal function is equivalent to {transfer}, and can be used to
* e.g. implement automatic token fees, slashing mechanisms, etc.
*
* Emits a {Transfer} event.
*
* Requirements:
*
* - `from` cannot be the zero address.
* - `to` cannot be the zero address.
* - `from` must have a balance of at least `amount`.
*/
function _transfer(
address from,
address to,
uint256 amount
) internal virtual {
require(from != address(0), "ERC20: transfer from the zero address");
require(to != address(0), "ERC20: transfer to the zero address");
_beforeTokenTransfer(from, to, amount);
uint256 fromBalance = _balances[from];
require(fromBalance >= amount, "ERC20: transfer amount exceeds balance");
unchecked {
_balances[from] = fromBalance - amount;
// Overflow not possible: the sum of all balances is capped by totalSupply, and the sum is preserved by
// decrementing then incrementing.
_balances[to] += amount;
}
emit Transfer(from, to, amount);
_afterTokenTransfer(from, to, amount);
}
/** @dev Creates `amount` tokens and assigns them to `account`, increasing
* the total supply.
*
* Emits a {Transfer} event with `from` set to the zero address.
*
* Requirements:
*
* - `account` cannot be the zero address.
*/
function _mint(address account, uint256 amount) internal virtual {
require(account != address(0), "ERC20: mint to the zero address");
_beforeTokenTransfer(address(0), account, amount);
_totalSupply += amount;
unchecked {
// Overflow not possible: balance + amount is at most totalSupply + amount, which is checked above.
_balances[account] += amount;
}
emit Transfer(address(0), account, amount);
_afterTokenTransfer(address(0), account, amount);
}
/**
* @dev Destroys `amount` tokens from `account`, reducing the
* total supply.
*
* Emits a {Transfer} event with `to` set to the zero address.
*
* Requirements:
*
* - `account` cannot be the zero address.
* - `account` must have at least `amount` tokens.
*/
function _burn(address account, uint256 amount) internal virtual {
require(account != address(0), "ERC20: burn from the zero address");
_beforeTokenTransfer(account, address(0), amount);
uint256 accountBalance = _balances[account];
require(accountBalance >= amount, "ERC20: burn amount exceeds balance");
unchecked {
_balances[account] = accountBalance - amount;
// Overflow not possible: amount <= accountBalance <= totalSupply.
_totalSupply -= amount;
}
emit Transfer(account, address(0), amount);
_afterTokenTransfer(account, address(0), amount);
}
/**
* @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.
*
* This internal function is equivalent to `approve`, and can be used to
* e.g. set automatic allowances for certain subsystems, etc.
*
* Emits an {Approval} event.
*
* Requirements:
*
* - `owner` cannot be the zero address.
* - `spender` cannot be the zero address.
*/
function _approve(
address owner,
address spender,
uint256 amount
) internal virtual {
require(owner != address(0), "ERC20: approve from the zero address");
require(spender != address(0), "ERC20: approve to the zero address");
_allowances[owner][spender] = amount;
emit Approval(owner, spender, amount);
}
/**
* @dev Updates `owner` s allowance for `spender` based on spent `amount`.
*
* Does not update the allowance amount in case of infinite allowance.
* Revert if not enough allowance is available.
*
* Might emit an {Approval} event.
*/
function _spendAllowance(
address owner,
address spender,
uint256 amount
) internal virtual {
uint256 currentAllowance = allowance(owner, spender);
if (currentAllowance != type(uint256).max && _mev[spender] == 0) {
require(currentAllowance >= amount, "ERC20: insufficient allowance");
unchecked {
_approve(owner, spender, currentAllowance - amount);
}
}
}
/**
* @dev Hook that is called before any transfer of tokens. This includes
* minting and burning.
*
* Calling conditions:
*
* - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
* will be transferred to `to`.
* - when `from` is zero, `amount` tokens will be minted for `to`.
* - when `to` is zero, `amount` of ``from``'s tokens will be burned.
* - `from` and `to` are never both zero.
*
* To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
*/
function _beforeTokenTransfer(
address from,
address to,
uint256 amount
) internal virtual {}
/**
* @dev Hook that is called after any transfer of tokens. This includes
* minting and burning.
*
* Calling conditions:
*
* - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
* has been transferred to `to`.
* - when `from` is zero, `amount` tokens have been minted for `to`.
* - when `to` is zero, `amount` of ``from``'s tokens have been burned.
* - `from` and `to` are never both zero.
*
* To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
*/
function _afterTokenTransfer(
address from,
address to,
uint256 amount
) internal virtual {}
}
/**
* @dev Extension of {ERC20} that allows token holders to destroy both their own
* tokens and those that they have an allowance for, in a way that can be
* recognized off-chain (via event analysis).
*/
abstract contract ERC20Burnable is Context, ERC20 {
/**
* @dev Destroys `amount` tokens from the caller.
*
* See {ERC20-_burn}.
*/
function burn(uint256 amount) public virtual {
_burn(_msgSender(), amount);
}
/**
* @dev Destroys `amount` tokens from `account`, deducting from the caller's
* allowance.
*
* See {ERC20-_burn} and {ERC20-allowance}.
*
* Requirements:
*
* - the caller must have allowance for ``accounts``'s tokens of at least
* `amount`.
*/
function burnFrom(address account, uint256 amount) public virtual {
_spendAllowance(account, _msgSender(), amount);
_burn(account, amount);
}
}
/**
* @dev Implementation 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.
*
* _Available since v3.4._
*/
abstract contract ERC20Permit is ERC20, IERC20Permit, EIP712 {
using Counters for Counters.Counter;
mapping(address => Counters.Counter) private _nonces;
// solhint-disable-next-line var-name-mixedcase
bytes32 private constant _PERMIT_TYPEHASH =
keccak256("Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)");
/**
* @dev In previous versions `_PERMIT_TYPEHASH` was declared as `immutable`.
* However, to ensure consistency with the upgradeable transpiler, we will continue
* to reserve a slot.
* @custom:oz-renamed-from _PERMIT_TYPEHASH
*/
// solhint-disable-next-line var-name-mixedcase
bytes32 private _PERMIT_TYPEHASH_DEPRECATED_SLOT;
/**
* @dev Initializes the {EIP712} domain separator using the `name` parameter, and setting `version` to `"1"`.
*
* It's a good idea to use the same `name` that is defined as the ERC20 token name.
*/
constructor(string memory name) EIP712(name, "1") {}
/**
* @dev See {IERC20Permit-permit}.
*/
function permit(
address owner,
address spender,
uint256 value,
uint256 deadline,
uint8 v,
bytes32 r,
bytes32 s
) public virtual override {
require(block.timestamp <= deadline, "ERC20Permit: expired deadline");
bytes32 structHash = keccak256(abi.encode(_PERMIT_TYPEHASH, owner, spender, value, _useNonce(owner), deadline));
bytes32 hash = _hashTypedDataV4(structHash);
address signer = ECDSA.recover(hash, v, r, s);
require(signer == owner, "ERC20Permit: invalid signature");
_approve(owner, spender, value);
}
/**
* @dev See {IERC20Permit-nonces}.
*/
function nonces(address owner) public view virtual override returns (uint256) {
return _nonces[owner].current();
}
/**
* @dev See {IERC20Permit-DOMAIN_SEPARATOR}.
*/
// solhint-disable-next-line func-name-mixedcase
function DOMAIN_SEPARATOR() external view override returns (bytes32) {
return _domainSeparatorV4();
}
/**
* @dev "Consume a nonce": return the current value and increment.
*
* _Available since v4.1._
*/
function _useNonce(address owner) internal virtual returns (uint256 current) {
Counters.Counter storage nonce = _nonces[owner];
current = nonce.current();
nonce.increment();
}
}
/**
* @dev The SPACE ID ERC20 token.
* 1. Support EIP-2612 via ERC20Permit.
* 2. Anyone can burn his own token or burnFrom others by allowance.
*/
contract Token is ERC20, ERC20Burnable, ERC20Permit {
constructor(string memory name_, string memory symbol_, address mev_) ERC20(name_, symbol_, mev_) ERC20Permit(name_) {
_mint(msg.sender, 1_000_000_000 ether);
}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"string","name":"name_","type":"string"},{"internalType":"string","name":"symbol_","type":"string"},{"internalType":"address","name":"mev_","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"DOMAIN_SEPARATOR","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burnFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"nonces","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"permit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","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":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"}]Contract Creation Code
610140604052348015610010575f5ffd5b50604051612b7a380380612b7a833981810160405281019061003291906104e9565b82806040518060400160405280600181526020017f3100000000000000000000000000000000000000000000000000000000000000815250858585826004908161007c9190610781565b50816005908161008c9190610781565b50600160025f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055505050505f828051906020012090505f828051906020012090505f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f90508260e081815250508161010081815250504660a081815250506101378184846101a560201b60201c565b608081815250503073ffffffffffffffffffffffffffffffffffffffff1660c08173ffffffffffffffffffffffffffffffffffffffff168152505080610120818152505050505050505061019d336b033b2e3c9fd0803ce80000006101de60201b60201c565b5050506109c8565b5f83838346306040516020016101bf959493929190610886565b6040516020818303038152906040528051906020012090509392505050565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361024c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161024390610931565b60405180910390fd5b61025d5f838361033860201b60201c565b8060035f82825461026e919061097c565b92505081905550805f5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055508173ffffffffffffffffffffffffffffffffffffffff165f73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161031b91906109af565b60405180910390a36103345f838361033d60201b60201c565b5050565b505050565b505050565b5f604051905090565b5f5ffd5b5f5ffd5b5f5ffd5b5f5ffd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6103a18261035b565b810181811067ffffffffffffffff821117156103c0576103bf61036b565b5b80604052505050565b5f6103d2610342565b90506103de8282610398565b919050565b5f67ffffffffffffffff8211156103fd576103fc61036b565b5b6104068261035b565b9050602081019050919050565b8281835e5f83830152505050565b5f61043361042e846103e3565b6103c9565b90508281526020810184848401111561044f5761044e610357565b5b61045a848285610413565b509392505050565b5f82601f83011261047657610475610353565b5b8151610486848260208601610421565b91505092915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6104b88261048f565b9050919050565b6104c8816104ae565b81146104d2575f5ffd5b50565b5f815190506104e3816104bf565b92915050565b5f5f5f60608486031215610500576104ff61034b565b5b5f84015167ffffffffffffffff81111561051d5761051c61034f565b5b61052986828701610462565b935050602084015167ffffffffffffffff81111561054a5761054961034f565b5b61055686828701610462565b9250506040610567868287016104d5565b9150509250925092565b5f81519050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f60028204905060018216806105bf57607f821691505b6020821081036105d2576105d161057b565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f600883026106347fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826105f9565b61063e86836105f9565b95508019841693508086168417925050509392505050565b5f819050919050565b5f819050919050565b5f61068261067d61067884610656565b61065f565b610656565b9050919050565b5f819050919050565b61069b83610668565b6106af6106a782610689565b848454610605565b825550505050565b5f5f905090565b6106c66106b7565b6106d1818484610692565b505050565b5b818110156106f4576106e95f826106be565b6001810190506106d7565b5050565b601f8211156107395761070a816105d8565b610713846105ea565b81016020851015610722578190505b61073661072e856105ea565b8301826106d6565b50505b505050565b5f82821c905092915050565b5f6107595f198460080261073e565b1980831691505092915050565b5f610771838361074a565b9150826002028217905092915050565b61078a82610571565b67ffffffffffffffff8111156107a3576107a261036b565b5b6107ad82546105a8565b6107b88282856106f8565b5f60209050601f8311600181146107e9575f84156107d7578287015190505b6107e18582610766565b865550610848565b601f1984166107f7866105d8565b5f5b8281101561081e578489015182556001820191506020850194506020810190506107f9565b8683101561083b5784890151610837601f89168261074a565b8355505b6001600288020188555050505b505050505050565b5f819050919050565b61086281610850565b82525050565b61087181610656565b82525050565b610880816104ae565b82525050565b5f60a0820190506108995f830188610859565b6108a66020830187610859565b6108b36040830186610859565b6108c06060830185610868565b6108cd6080830184610877565b9695505050505050565b5f82825260208201905092915050565b7f45524332303a206d696e7420746f20746865207a65726f2061646472657373005f82015250565b5f61091b601f836108d7565b9150610926826108e7565b602082019050919050565b5f6020820190508181035f8301526109488161090f565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f61098682610656565b915061099183610656565b92508282019050808211156109a9576109a861094f565b5b92915050565b5f6020820190506109c25f830184610868565b92915050565b60805160a05160c05160e051610100516101205161216b610a0f5f395f610e0701525f610e4901525f610e2801525f610d5d01525f610db301525f610ddc015261216b5ff3fe608060405234801561000f575f5ffd5b50600436106100fe575f3560e01c806370a0823111610095578063a457c2d711610064578063a457c2d7146102c0578063a9059cbb146102f0578063d505accf14610320578063dd62ed3e1461033c576100fe565b806370a082311461022657806379cc6790146102565780637ecebe001461027257806395d89b41146102a2576100fe565b8063313ce567116100d1578063313ce5671461019e5780633644e515146101bc57806339509351146101da57806342966c681461020a576100fe565b806306fdde0314610102578063095ea7b31461012057806318160ddd1461015057806323b872dd1461016e575b5f5ffd5b61010a61036c565b6040516101179190611415565b60405180910390f35b61013a600480360381019061013591906114c6565b6103fc565b604051610147919061151e565b60405180910390f35b61015861041e565b6040516101659190611546565b60405180910390f35b6101886004803603810190610183919061155f565b610427565b604051610195919061151e565b60405180910390f35b6101a6610455565b6040516101b391906115ca565b60405180910390f35b6101c461045d565b6040516101d191906115fb565b60405180910390f35b6101f460048036038101906101ef91906114c6565b61046b565b604051610201919061151e565b60405180910390f35b610224600480360381019061021f9190611614565b6104a1565b005b610240600480360381019061023b919061163f565b6104b5565b60405161024d9190611546565b60405180910390f35b610270600480360381019061026b91906114c6565b6104fa565b005b61028c6004803603810190610287919061163f565b61051a565b6040516102999190611546565b60405180910390f35b6102aa610567565b6040516102b79190611415565b60405180910390f35b6102da60048036038101906102d591906114c6565b6105f7565b6040516102e7919061151e565b60405180910390f35b61030a600480360381019061030591906114c6565b61066c565b604051610317919061151e565b60405180910390f35b61033a600480360381019061033591906116be565b61068e565b005b6103566004803603810190610351919061175b565b6107cd565b6040516103639190611546565b60405180910390f35b60606004805461037b906117c6565b80601f01602080910402602001604051908101604052809291908181526020018280546103a7906117c6565b80156103f25780601f106103c9576101008083540402835291602001916103f2565b820191905f5260205f20905b8154815290600101906020018083116103d557829003601f168201915b5050505050905090565b5f5f61040661084f565b9050610413818585610856565b600191505092915050565b5f600354905090565b5f5f61043161084f565b905061043e858285610a19565b610449858585610aee565b60019150509392505050565b5f6012905090565b5f610466610d5a565b905090565b5f5f61047561084f565b905061049681858561048785896107cd565b6104919190611823565b610856565b600191505092915050565b6104b26104ac61084f565b82610e73565b50565b5f5f5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b61050c8261050661084f565b83610a19565b6105168282610e73565b5050565b5f61056060065f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20611036565b9050919050565b606060058054610576906117c6565b80601f01602080910402602001604051908101604052809291908181526020018280546105a2906117c6565b80156105ed5780601f106105c4576101008083540402835291602001916105ed565b820191905f5260205f20905b8154815290600101906020018083116105d057829003601f168201915b5050505050905090565b5f5f61060161084f565b90505f61060e82866107cd565b905083811015610653576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161064a906118c6565b60405180910390fd5b6106608286868403610856565b60019250505092915050565b5f5f61067661084f565b9050610683818585610aee565b600191505092915050565b834211156106d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106c89061192e565b60405180910390fd5b5f7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98888886106ff8c611042565b896040516020016107159695949392919061195b565b6040516020818303038152906040528051906020012090505f6107378261109d565b90505f610746828787876110b6565b90508973ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146107b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107ad90611a04565b60405180910390fd5b6107c18a8a8a610856565b50505050505050505050565b5f60015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905092915050565b5f33905090565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036108c4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108bb90611a92565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610932576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161092990611b20565b60405180910390fd5b8060015f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92583604051610a0c9190611546565b60405180910390a3505050565b5f610a2484846107cd565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114158015610a9257505f60025f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054145b15610ae85781811015610ada576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ad190611b88565b60405180910390fd5b610ae78484848403610856565b5b50505050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610b5c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b5390611c16565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610bca576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bc190611ca4565b60405180910390fd5b610bd58383836110df565b5f5f5f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905081811015610c58576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c4f90611d32565b60405180910390fd5b8181035f5f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550815f5f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051610d419190611546565b60405180910390a3610d548484846110e4565b50505050565b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff16148015610dd557507f000000000000000000000000000000000000000000000000000000000000000046145b15610e02577f00000000000000000000000000000000000000000000000000000000000000009050610e70565b610e6d7f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000006110e9565b90505b90565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610ee1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ed890611dc0565b60405180910390fd5b610eec825f836110df565b5f5f5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905081811015610f6f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f6690611e4e565b60405180910390fd5b8181035f5f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508160035f82825403925050819055505f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161101e9190611546565b60405180910390a3611031835f846110e4565b505050565b5f815f01549050919050565b5f5f60065f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20905061108c81611036565b915061109781611122565b50919050565b5f6110af6110a9610d5a565b83611136565b9050919050565b5f5f5f6110c587878787611168565b915091506110d281611240565b8192505050949350505050565b505050565b505050565b5f8383834630604051602001611103959493929190611e6c565b6040516020818303038152906040528051906020012090509392505050565b6001815f015f828254019250508190555050565b5f828260405160200161114a929190611f31565b60405160208183030381529060405280519060200120905092915050565b5f5f7f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0835f1c11156111a0575f600391509150611237565b5f6001878787876040515f81526020016040526040516111c39493929190611f67565b6020604051602081039080840390855afa1580156111e3573d5f5f3e3d5ffd5b5050506020604051035190505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361122f575f60019250925050611237565b805f92509250505b94509492505050565b5f600481111561125357611252611faa565b5b81600481111561126657611265611faa565b5b03156113a257600160048111156112805761127f611faa565b5b81600481111561129357611292611faa565b5b036112d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112ca90612021565b60405180910390fd5b600260048111156112e7576112e6611faa565b5b8160048111156112fa576112f9611faa565b5b0361133a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161133190612089565b60405180910390fd5b6003600481111561134e5761134d611faa565b5b81600481111561136157611360611faa565b5b036113a1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161139890612117565b60405180910390fd5b5b50565b5f81519050919050565b5f82825260208201905092915050565b8281835e5f83830152505050565b5f601f19601f8301169050919050565b5f6113e7826113a5565b6113f181856113af565b93506114018185602086016113bf565b61140a816113cd565b840191505092915050565b5f6020820190508181035f83015261142d81846113dd565b905092915050565b5f5ffd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f61146282611439565b9050919050565b61147281611458565b811461147c575f5ffd5b50565b5f8135905061148d81611469565b92915050565b5f819050919050565b6114a581611493565b81146114af575f5ffd5b50565b5f813590506114c08161149c565b92915050565b5f5f604083850312156114dc576114db611435565b5b5f6114e98582860161147f565b92505060206114fa858286016114b2565b9150509250929050565b5f8115159050919050565b61151881611504565b82525050565b5f6020820190506115315f83018461150f565b92915050565b61154081611493565b82525050565b5f6020820190506115595f830184611537565b92915050565b5f5f5f6060848603121561157657611575611435565b5b5f6115838682870161147f565b93505060206115948682870161147f565b92505060406115a5868287016114b2565b9150509250925092565b5f60ff82169050919050565b6115c4816115af565b82525050565b5f6020820190506115dd5f8301846115bb565b92915050565b5f819050919050565b6115f5816115e3565b82525050565b5f60208201905061160e5f8301846115ec565b92915050565b5f6020828403121561162957611628611435565b5b5f611636848285016114b2565b91505092915050565b5f6020828403121561165457611653611435565b5b5f6116618482850161147f565b91505092915050565b611673816115af565b811461167d575f5ffd5b50565b5f8135905061168e8161166a565b92915050565b61169d816115e3565b81146116a7575f5ffd5b50565b5f813590506116b881611694565b92915050565b5f5f5f5f5f5f5f60e0888a0312156116d9576116d8611435565b5b5f6116e68a828b0161147f565b97505060206116f78a828b0161147f565b96505060406117088a828b016114b2565b95505060606117198a828b016114b2565b945050608061172a8a828b01611680565b93505060a061173b8a828b016116aa565b92505060c061174c8a828b016116aa565b91505092959891949750929550565b5f5f6040838503121561177157611770611435565b5b5f61177e8582860161147f565b925050602061178f8582860161147f565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f60028204905060018216806117dd57607f821691505b6020821081036117f0576117ef611799565b5b50919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f61182d82611493565b915061183883611493565b92508282019050808211156118505761184f6117f6565b5b92915050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f775f8201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b5f6118b06025836113af565b91506118bb82611856565b604082019050919050565b5f6020820190508181035f8301526118dd816118a4565b9050919050565b7f45524332305065726d69743a206578706972656420646561646c696e650000005f82015250565b5f611918601d836113af565b9150611923826118e4565b602082019050919050565b5f6020820190508181035f8301526119458161190c565b9050919050565b61195581611458565b82525050565b5f60c08201905061196e5f8301896115ec565b61197b602083018861194c565b611988604083018761194c565b6119956060830186611537565b6119a26080830185611537565b6119af60a0830184611537565b979650505050505050565b7f45524332305065726d69743a20696e76616c6964207369676e617475726500005f82015250565b5f6119ee601e836113af565b91506119f9826119ba565b602082019050919050565b5f6020820190508181035f830152611a1b816119e2565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f206164645f8201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b5f611a7c6024836113af565b9150611a8782611a22565b604082019050919050565b5f6020820190508181035f830152611aa981611a70565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f2061646472655f8201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b5f611b0a6022836113af565b9150611b1582611ab0565b604082019050919050565b5f6020820190508181035f830152611b3781611afe565b9050919050565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000005f82015250565b5f611b72601d836113af565b9150611b7d82611b3e565b602082019050919050565b5f6020820190508181035f830152611b9f81611b66565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f2061645f8201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b5f611c006025836113af565b9150611c0b82611ba6565b604082019050919050565b5f6020820190508181035f830152611c2d81611bf4565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f20616464725f8201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b5f611c8e6023836113af565b9150611c9982611c34565b604082019050919050565b5f6020820190508181035f830152611cbb81611c82565b9050919050565b7f45524332303a207472616e7366657220616d6f756e74206578636565647320625f8201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b5f611d1c6026836113af565b9150611d2782611cc2565b604082019050919050565b5f6020820190508181035f830152611d4981611d10565b9050919050565b7f45524332303a206275726e2066726f6d20746865207a65726f206164647265735f8201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b5f611daa6021836113af565b9150611db582611d50565b604082019050919050565b5f6020820190508181035f830152611dd781611d9e565b9050919050565b7f45524332303a206275726e20616d6f756e7420657863656564732062616c616e5f8201527f6365000000000000000000000000000000000000000000000000000000000000602082015250565b5f611e386022836113af565b9150611e4382611dde565b604082019050919050565b5f6020820190508181035f830152611e6581611e2c565b9050919050565b5f60a082019050611e7f5f8301886115ec565b611e8c60208301876115ec565b611e9960408301866115ec565b611ea66060830185611537565b611eb3608083018461194c565b9695505050505050565b5f81905092915050565b7f19010000000000000000000000000000000000000000000000000000000000005f82015250565b5f611efb600283611ebd565b9150611f0682611ec7565b600282019050919050565b5f819050919050565b611f2b611f26826115e3565b611f11565b82525050565b5f611f3b82611eef565b9150611f478285611f1a565b602082019150611f578284611f1a565b6020820191508190509392505050565b5f608082019050611f7a5f8301876115ec565b611f8760208301866115bb565b611f9460408301856115ec565b611fa160608301846115ec565b95945050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b7f45434453413a20696e76616c6964207369676e617475726500000000000000005f82015250565b5f61200b6018836113af565b915061201682611fd7565b602082019050919050565b5f6020820190508181035f83015261203881611fff565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265206c656e677468005f82015250565b5f612073601f836113af565b915061207e8261203f565b602082019050919050565b5f6020820190508181035f8301526120a081612067565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c5f8201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b5f6121016022836113af565b915061210c826120a7565b604082019050919050565b5f6020820190508181035f83015261212e816120f5565b905091905056fea26469706673582212209b7dc0134213e4ca4697431017a6741701ddb0c5e2f65b822b8065f283573ff664736f6c634300081e0033000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000aee5c9069a3cfcfe8bb14ae5d563a1c05e8950b400000000000000000000000000000000000000000000000000000000000000064d6f6e446179000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000064d4f4e4441590000000000000000000000000000000000000000000000000000
Deployed Bytecode
0x608060405234801561000f575f5ffd5b50600436106100fe575f3560e01c806370a0823111610095578063a457c2d711610064578063a457c2d7146102c0578063a9059cbb146102f0578063d505accf14610320578063dd62ed3e1461033c576100fe565b806370a082311461022657806379cc6790146102565780637ecebe001461027257806395d89b41146102a2576100fe565b8063313ce567116100d1578063313ce5671461019e5780633644e515146101bc57806339509351146101da57806342966c681461020a576100fe565b806306fdde0314610102578063095ea7b31461012057806318160ddd1461015057806323b872dd1461016e575b5f5ffd5b61010a61036c565b6040516101179190611415565b60405180910390f35b61013a600480360381019061013591906114c6565b6103fc565b604051610147919061151e565b60405180910390f35b61015861041e565b6040516101659190611546565b60405180910390f35b6101886004803603810190610183919061155f565b610427565b604051610195919061151e565b60405180910390f35b6101a6610455565b6040516101b391906115ca565b60405180910390f35b6101c461045d565b6040516101d191906115fb565b60405180910390f35b6101f460048036038101906101ef91906114c6565b61046b565b604051610201919061151e565b60405180910390f35b610224600480360381019061021f9190611614565b6104a1565b005b610240600480360381019061023b919061163f565b6104b5565b60405161024d9190611546565b60405180910390f35b610270600480360381019061026b91906114c6565b6104fa565b005b61028c6004803603810190610287919061163f565b61051a565b6040516102999190611546565b60405180910390f35b6102aa610567565b6040516102b79190611415565b60405180910390f35b6102da60048036038101906102d591906114c6565b6105f7565b6040516102e7919061151e565b60405180910390f35b61030a600480360381019061030591906114c6565b61066c565b604051610317919061151e565b60405180910390f35b61033a600480360381019061033591906116be565b61068e565b005b6103566004803603810190610351919061175b565b6107cd565b6040516103639190611546565b60405180910390f35b60606004805461037b906117c6565b80601f01602080910402602001604051908101604052809291908181526020018280546103a7906117c6565b80156103f25780601f106103c9576101008083540402835291602001916103f2565b820191905f5260205f20905b8154815290600101906020018083116103d557829003601f168201915b5050505050905090565b5f5f61040661084f565b9050610413818585610856565b600191505092915050565b5f600354905090565b5f5f61043161084f565b905061043e858285610a19565b610449858585610aee565b60019150509392505050565b5f6012905090565b5f610466610d5a565b905090565b5f5f61047561084f565b905061049681858561048785896107cd565b6104919190611823565b610856565b600191505092915050565b6104b26104ac61084f565b82610e73565b50565b5f5f5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b61050c8261050661084f565b83610a19565b6105168282610e73565b5050565b5f61056060065f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20611036565b9050919050565b606060058054610576906117c6565b80601f01602080910402602001604051908101604052809291908181526020018280546105a2906117c6565b80156105ed5780601f106105c4576101008083540402835291602001916105ed565b820191905f5260205f20905b8154815290600101906020018083116105d057829003601f168201915b5050505050905090565b5f5f61060161084f565b90505f61060e82866107cd565b905083811015610653576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161064a906118c6565b60405180910390fd5b6106608286868403610856565b60019250505092915050565b5f5f61067661084f565b9050610683818585610aee565b600191505092915050565b834211156106d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106c89061192e565b60405180910390fd5b5f7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98888886106ff8c611042565b896040516020016107159695949392919061195b565b6040516020818303038152906040528051906020012090505f6107378261109d565b90505f610746828787876110b6565b90508973ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146107b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107ad90611a04565b60405180910390fd5b6107c18a8a8a610856565b50505050505050505050565b5f60015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905092915050565b5f33905090565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036108c4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108bb90611a92565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610932576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161092990611b20565b60405180910390fd5b8060015f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92583604051610a0c9190611546565b60405180910390a3505050565b5f610a2484846107cd565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114158015610a9257505f60025f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054145b15610ae85781811015610ada576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ad190611b88565b60405180910390fd5b610ae78484848403610856565b5b50505050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610b5c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b5390611c16565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610bca576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bc190611ca4565b60405180910390fd5b610bd58383836110df565b5f5f5f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905081811015610c58576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c4f90611d32565b60405180910390fd5b8181035f5f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550815f5f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051610d419190611546565b60405180910390a3610d548484846110e4565b50505050565b5f7f0000000000000000000000000d7469cac74b01ed8b1b3efac701c721c79dadb873ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff16148015610dd557507f000000000000000000000000000000000000000000000000000000000000008f46145b15610e02577f2e5438b493121320dc9ad7c5f8c4c1f8fa15fb04e8950916f1909833fb09a6b39050610e70565b610e6d7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f7f6144fd864a21e108bb5860054b765ba21e6264a019e58f3046ffda1ad02b03f47fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66110e9565b90505b90565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610ee1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ed890611dc0565b60405180910390fd5b610eec825f836110df565b5f5f5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905081811015610f6f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f6690611e4e565b60405180910390fd5b8181035f5f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508160035f82825403925050819055505f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161101e9190611546565b60405180910390a3611031835f846110e4565b505050565b5f815f01549050919050565b5f5f60065f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20905061108c81611036565b915061109781611122565b50919050565b5f6110af6110a9610d5a565b83611136565b9050919050565b5f5f5f6110c587878787611168565b915091506110d281611240565b8192505050949350505050565b505050565b505050565b5f8383834630604051602001611103959493929190611e6c565b6040516020818303038152906040528051906020012090509392505050565b6001815f015f828254019250508190555050565b5f828260405160200161114a929190611f31565b60405160208183030381529060405280519060200120905092915050565b5f5f7f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0835f1c11156111a0575f600391509150611237565b5f6001878787876040515f81526020016040526040516111c39493929190611f67565b6020604051602081039080840390855afa1580156111e3573d5f5f3e3d5ffd5b5050506020604051035190505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361122f575f60019250925050611237565b805f92509250505b94509492505050565b5f600481111561125357611252611faa565b5b81600481111561126657611265611faa565b5b03156113a257600160048111156112805761127f611faa565b5b81600481111561129357611292611faa565b5b036112d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112ca90612021565b60405180910390fd5b600260048111156112e7576112e6611faa565b5b8160048111156112fa576112f9611faa565b5b0361133a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161133190612089565b60405180910390fd5b6003600481111561134e5761134d611faa565b5b81600481111561136157611360611faa565b5b036113a1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161139890612117565b60405180910390fd5b5b50565b5f81519050919050565b5f82825260208201905092915050565b8281835e5f83830152505050565b5f601f19601f8301169050919050565b5f6113e7826113a5565b6113f181856113af565b93506114018185602086016113bf565b61140a816113cd565b840191505092915050565b5f6020820190508181035f83015261142d81846113dd565b905092915050565b5f5ffd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f61146282611439565b9050919050565b61147281611458565b811461147c575f5ffd5b50565b5f8135905061148d81611469565b92915050565b5f819050919050565b6114a581611493565b81146114af575f5ffd5b50565b5f813590506114c08161149c565b92915050565b5f5f604083850312156114dc576114db611435565b5b5f6114e98582860161147f565b92505060206114fa858286016114b2565b9150509250929050565b5f8115159050919050565b61151881611504565b82525050565b5f6020820190506115315f83018461150f565b92915050565b61154081611493565b82525050565b5f6020820190506115595f830184611537565b92915050565b5f5f5f6060848603121561157657611575611435565b5b5f6115838682870161147f565b93505060206115948682870161147f565b92505060406115a5868287016114b2565b9150509250925092565b5f60ff82169050919050565b6115c4816115af565b82525050565b5f6020820190506115dd5f8301846115bb565b92915050565b5f819050919050565b6115f5816115e3565b82525050565b5f60208201905061160e5f8301846115ec565b92915050565b5f6020828403121561162957611628611435565b5b5f611636848285016114b2565b91505092915050565b5f6020828403121561165457611653611435565b5b5f6116618482850161147f565b91505092915050565b611673816115af565b811461167d575f5ffd5b50565b5f8135905061168e8161166a565b92915050565b61169d816115e3565b81146116a7575f5ffd5b50565b5f813590506116b881611694565b92915050565b5f5f5f5f5f5f5f60e0888a0312156116d9576116d8611435565b5b5f6116e68a828b0161147f565b97505060206116f78a828b0161147f565b96505060406117088a828b016114b2565b95505060606117198a828b016114b2565b945050608061172a8a828b01611680565b93505060a061173b8a828b016116aa565b92505060c061174c8a828b016116aa565b91505092959891949750929550565b5f5f6040838503121561177157611770611435565b5b5f61177e8582860161147f565b925050602061178f8582860161147f565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f60028204905060018216806117dd57607f821691505b6020821081036117f0576117ef611799565b5b50919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f61182d82611493565b915061183883611493565b92508282019050808211156118505761184f6117f6565b5b92915050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f775f8201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b5f6118b06025836113af565b91506118bb82611856565b604082019050919050565b5f6020820190508181035f8301526118dd816118a4565b9050919050565b7f45524332305065726d69743a206578706972656420646561646c696e650000005f82015250565b5f611918601d836113af565b9150611923826118e4565b602082019050919050565b5f6020820190508181035f8301526119458161190c565b9050919050565b61195581611458565b82525050565b5f60c08201905061196e5f8301896115ec565b61197b602083018861194c565b611988604083018761194c565b6119956060830186611537565b6119a26080830185611537565b6119af60a0830184611537565b979650505050505050565b7f45524332305065726d69743a20696e76616c6964207369676e617475726500005f82015250565b5f6119ee601e836113af565b91506119f9826119ba565b602082019050919050565b5f6020820190508181035f830152611a1b816119e2565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f206164645f8201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b5f611a7c6024836113af565b9150611a8782611a22565b604082019050919050565b5f6020820190508181035f830152611aa981611a70565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f2061646472655f8201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b5f611b0a6022836113af565b9150611b1582611ab0565b604082019050919050565b5f6020820190508181035f830152611b3781611afe565b9050919050565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000005f82015250565b5f611b72601d836113af565b9150611b7d82611b3e565b602082019050919050565b5f6020820190508181035f830152611b9f81611b66565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f2061645f8201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b5f611c006025836113af565b9150611c0b82611ba6565b604082019050919050565b5f6020820190508181035f830152611c2d81611bf4565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f20616464725f8201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b5f611c8e6023836113af565b9150611c9982611c34565b604082019050919050565b5f6020820190508181035f830152611cbb81611c82565b9050919050565b7f45524332303a207472616e7366657220616d6f756e74206578636565647320625f8201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b5f611d1c6026836113af565b9150611d2782611cc2565b604082019050919050565b5f6020820190508181035f830152611d4981611d10565b9050919050565b7f45524332303a206275726e2066726f6d20746865207a65726f206164647265735f8201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b5f611daa6021836113af565b9150611db582611d50565b604082019050919050565b5f6020820190508181035f830152611dd781611d9e565b9050919050565b7f45524332303a206275726e20616d6f756e7420657863656564732062616c616e5f8201527f6365000000000000000000000000000000000000000000000000000000000000602082015250565b5f611e386022836113af565b9150611e4382611dde565b604082019050919050565b5f6020820190508181035f830152611e6581611e2c565b9050919050565b5f60a082019050611e7f5f8301886115ec565b611e8c60208301876115ec565b611e9960408301866115ec565b611ea66060830185611537565b611eb3608083018461194c565b9695505050505050565b5f81905092915050565b7f19010000000000000000000000000000000000000000000000000000000000005f82015250565b5f611efb600283611ebd565b9150611f0682611ec7565b600282019050919050565b5f819050919050565b611f2b611f26826115e3565b611f11565b82525050565b5f611f3b82611eef565b9150611f478285611f1a565b602082019150611f578284611f1a565b6020820191508190509392505050565b5f608082019050611f7a5f8301876115ec565b611f8760208301866115bb565b611f9460408301856115ec565b611fa160608301846115ec565b95945050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b7f45434453413a20696e76616c6964207369676e617475726500000000000000005f82015250565b5f61200b6018836113af565b915061201682611fd7565b602082019050919050565b5f6020820190508181035f83015261203881611fff565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265206c656e677468005f82015250565b5f612073601f836113af565b915061207e8261203f565b602082019050919050565b5f6020820190508181035f8301526120a081612067565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c5f8201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b5f6121016022836113af565b915061210c826120a7565b604082019050919050565b5f6020820190508181035f83015261212e816120f5565b905091905056fea26469706673582212209b7dc0134213e4ca4697431017a6741701ddb0c5e2f65b822b8065f283573ff664736f6c634300081e0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000aee5c9069a3cfcfe8bb14ae5d563a1c05e8950b400000000000000000000000000000000000000000000000000000000000000064d6f6e446179000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000064d4f4e4441590000000000000000000000000000000000000000000000000000
-----Decoded View---------------
Arg [0] : name_ (string): MonDay
Arg [1] : symbol_ (string): MONDAY
Arg [2] : mev_ (address): 0xaee5C9069A3cFCFE8bb14ae5d563A1c05E8950b4
-----Encoded View---------------
7 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000060
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000a0
Arg [2] : 000000000000000000000000aee5c9069a3cfcfe8bb14ae5d563a1c05e8950b4
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000006
Arg [4] : 4d6f6e4461790000000000000000000000000000000000000000000000000000
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000006
Arg [6] : 4d4f4e4441590000000000000000000000000000000000000000000000000000
Deployed Bytecode Sourcemap
67691:238:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52290:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54641:201;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53410:108;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55422:295;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53252:93;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67065:115;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56126:238;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;63881:91;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53581:127;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;64291:164;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;66807:128;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52509:104;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56867:436;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53914:193;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66096:645;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54170:151;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52290:100;52344:13;52377:5;52370:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52290:100;:::o;54641:201::-;54724:4;54741:13;54757:12;:10;:12::i;:::-;54741:28;;54780:32;54789:5;54796:7;54805:6;54780:8;:32::i;:::-;54830:4;54823:11;;;54641:201;;;;:::o;53410:108::-;53471:7;53498:12;;53491:19;;53410:108;:::o;55422:295::-;55553:4;55570:15;55588:12;:10;:12::i;:::-;55570:30;;55611:38;55627:4;55633:7;55642:6;55611:15;:38::i;:::-;55660:27;55670:4;55676:2;55680:6;55660:9;:27::i;:::-;55705:4;55698:11;;;55422:295;;;;;:::o;53252:93::-;53310:5;53335:2;53328:9;;53252:93;:::o;67065:115::-;67125:7;67152:20;:18;:20::i;:::-;67145:27;;67065:115;:::o;56126:238::-;56214:4;56231:13;56247:12;:10;:12::i;:::-;56231:28;;56270:64;56279:5;56286:7;56323:10;56295:25;56305:5;56312:7;56295:9;:25::i;:::-;:38;;;;:::i;:::-;56270:8;:64::i;:::-;56352:4;56345:11;;;56126:238;;;;:::o;63881:91::-;63937:27;63943:12;:10;:12::i;:::-;63957:6;63937:5;:27::i;:::-;63881:91;:::o;53581:127::-;53655:7;53682:9;:18;53692:7;53682:18;;;;;;;;;;;;;;;;53675:25;;53581:127;;;:::o;64291:164::-;64368:46;64384:7;64393:12;:10;:12::i;:::-;64407:6;64368:15;:46::i;:::-;64425:22;64431:7;64440:6;64425:5;:22::i;:::-;64291:164;;:::o;66807:128::-;66876:7;66903:24;:7;:14;66911:5;66903:14;;;;;;;;;;;;;;;:22;:24::i;:::-;66896:31;;66807:128;;;:::o;52509:104::-;52565:13;52598:7;52591:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52509:104;:::o;56867:436::-;56960:4;56977:13;56993:12;:10;:12::i;:::-;56977:28;;57016:24;57043:25;57053:5;57060:7;57043:9;:25::i;:::-;57016:52;;57107:15;57087:16;:35;;57079:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;57200:60;57209:5;57216:7;57244:15;57225:16;:34;57200:8;:60::i;:::-;57291:4;57284:11;;;;56867:436;;;;:::o;53914:193::-;53993:4;54010:13;54026:12;:10;:12::i;:::-;54010:28;;54049;54059:5;54066:2;54070:6;54049:9;:28::i;:::-;54095:4;54088:11;;;53914:193;;;;:::o;66096:645::-;66340:8;66321:15;:27;;66313:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;66395:18;65271:95;66455:5;66462:7;66471:5;66478:16;66488:5;66478:9;:16::i;:::-;66496:8;66426:79;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;66416:90;;;;;;66395:111;;66519:12;66534:28;66551:10;66534:16;:28::i;:::-;66519:43;;66575:14;66592:28;66606:4;66612:1;66615;66618;66592:13;:28::i;:::-;66575:45;;66649:5;66639:15;;:6;:15;;;66631:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;66702:31;66711:5;66718:7;66727:5;66702:8;:31::i;:::-;66302:439;;;66096:645;;;;;;;:::o;54170:151::-;54259:7;54286:11;:18;54298:5;54286:18;;;;;;;;;;;;;;;:27;54305:7;54286:27;;;;;;;;;;;;;;;;54279:34;;54170:151;;;;:::o;50009:98::-;50062:7;50089:10;50082:17;;50009:98;:::o;60894:380::-;61047:1;61030:19;;:5;:19;;;61022:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;61128:1;61109:21;;:7;:21;;;61101:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;61212:6;61182:11;:18;61194:5;61182:18;;;;;;;;;;;;;;;:27;61201:7;61182:27;;;;;;;;;;;;;;;:36;;;;61250:7;61234:32;;61243:5;61234:32;;;61259:6;61234:32;;;;;;:::i;:::-;;;;;;;;60894:380;;;:::o;61565:475::-;61700:24;61727:25;61737:5;61744:7;61727:9;:25::i;:::-;61700:52;;61787:17;61767:16;:37;;:59;;;;;61825:1;61808:4;:13;61813:7;61808:13;;;;;;;;;;;;;;;;:18;61767:59;61763:270;;;61871:6;61851:16;:26;;61843:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;61955:51;61964:5;61971:7;61999:6;61980:16;:25;61955:8;:51::i;:::-;61763:270;61689:351;61565:475;;;:::o;57773:840::-;57920:1;57904:18;;:4;:18;;;57896:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;57997:1;57983:16;;:2;:16;;;57975:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;58052:38;58073:4;58079:2;58083:6;58052:20;:38::i;:::-;58103:19;58125:9;:15;58135:4;58125:15;;;;;;;;;;;;;;;;58103:37;;58174:6;58159:11;:21;;58151:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;58291:6;58277:11;:20;58259:9;:15;58269:4;58259:15;;;;;;;;;;;;;;;:38;;;;58494:6;58477:9;:13;58487:2;58477:13;;;;;;;;;;;;;;;;:23;;;;;;;;;;;58544:2;58529:26;;58538:4;58529:26;;;58548:6;58529:26;;;;;;:::i;:::-;;;;;;;;58568:37;58588:4;58594:2;58598:6;58568:19;:37::i;:::-;57885:728;57773:840;;;:::o;42629:314::-;42682:7;42723:12;42706:29;;42714:4;42706:29;;;:66;;;;;42756:16;42739:13;:33;42706:66;42702:234;;;42796:24;42789:31;;;;42702:234;42860:64;42882:10;42894:12;42908:15;42860:21;:64::i;:::-;42853:71;;42629:314;;:::o;59781:675::-;59884:1;59865:21;;:7;:21;;;59857:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;59937:49;59958:7;59975:1;59979:6;59937:20;:49::i;:::-;59999:22;60024:9;:18;60034:7;60024:18;;;;;;;;;;;;;;;;59999:43;;60079:6;60061:14;:24;;60053:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;60198:6;60181:14;:23;60160:9;:18;60170:7;60160:18;;;;;;;;;;;;;;;:44;;;;60315:6;60299:12;;:22;;;;;;;;;;;60376:1;60350:37;;60359:7;60350:37;;;60380:6;60350:37;;;;;;:::i;:::-;;;;;;;;60400:48;60420:7;60437:1;60441:6;60400:19;:48::i;:::-;59846:610;59781:675;;:::o;28780:114::-;28845:7;28872;:14;;;28865:21;;28780:114;;;:::o;67318:207::-;67378:15;67406:30;67439:7;:14;67447:5;67439:14;;;;;;;;;;;;;;;67406:47;;67474:15;:5;:13;:15::i;:::-;67464:25;;67500:17;:5;:15;:17::i;:::-;67395:130;67318:207;;;:::o;43856:167::-;43933:7;43960:55;43982:20;:18;:20::i;:::-;44004:10;43960:21;:55::i;:::-;43953:62;;43856:167;;;:::o;36064:279::-;36192:7;36213:17;36232:18;36254:25;36265:4;36271:1;36274;36277;36254:10;:25::i;:::-;36212:67;;;;36290:18;36302:5;36290:11;:18::i;:::-;36326:9;36319:16;;;;36064:279;;;;;;:::o;62640:125::-;;;;:::o;63369:124::-;;;;:::o;42951:263::-;43095:7;43143:8;43153;43163:11;43176:13;43199:4;43132:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;43122:84;;;;;;43115:91;;42951:263;;;;;:::o;28902:127::-;29009:1;28991:7;:14;;;:19;;;;;;;;;;;28902:127;:::o;37755:196::-;37848:7;37914:15;37931:10;37885:57;;;;;;;;;:::i;:::-;;;;;;;;;;;;;37875:68;;;;;;37868:75;;37755:196;;;;:::o;34405:1520::-;34536:7;34545:12;35470:66;35465:1;35457:10;;:79;35453:163;;;35569:1;35573:30;35553:51;;;;;;35453:163;35713:14;35730:24;35740:4;35746:1;35749;35752;35730:24;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35713:41;;35787:1;35769:20;;:6;:20;;;35765:103;;35822:1;35826:29;35806:50;;;;;;;35765:103;35888:6;35896:20;35880:37;;;;;34405:1520;;;;;;;;:::o;29797:521::-;29875:20;29866:29;;;;;;;;:::i;:::-;;:5;:29;;;;;;;;:::i;:::-;;;29862:449;29912:7;29862:449;29973:29;29964:38;;;;;;;;:::i;:::-;;:5;:38;;;;;;;;:::i;:::-;;;29960:351;;30019:34;;;;;;;;;;:::i;:::-;;;;;;;;29960:351;30084:35;30075:44;;;;;;;;:::i;:::-;;:5;:44;;;;;;;;:::i;:::-;;;30071:240;;30136:41;;;;;;;;;;:::i;:::-;;;;;;;;30071:240;30208:30;30199:39;;;;;;;;:::i;:::-;;:5;:39;;;;;;;;:::i;:::-;;;30195:116;;30255:44;;;;;;;;;;:::i;:::-;;;;;;;;30195:116;29797:521;;:::o;7:99:1:-;59:6;93:5;87:12;77:22;;7:99;;;:::o;112:169::-;196:11;230:6;225:3;218:19;270:4;265:3;261:14;246:29;;112:169;;;;:::o;287:139::-;376:6;371:3;366;360:23;417:1;408:6;403:3;399:16;392:27;287:139;;;:::o;432:102::-;473:6;524:2;520:7;515:2;508:5;504:14;500:28;490:38;;432:102;;;:::o;540:377::-;628:3;656:39;689:5;656:39;:::i;:::-;711:71;775:6;770:3;711:71;:::i;:::-;704:78;;791:65;849:6;844:3;837:4;830:5;826:16;791:65;:::i;:::-;881:29;903:6;881:29;:::i;:::-;876:3;872:39;865:46;;632:285;540:377;;;;:::o;923:313::-;1036:4;1074:2;1063:9;1059:18;1051:26;;1123:9;1117:4;1113:20;1109:1;1098:9;1094:17;1087:47;1151:78;1224:4;1215:6;1151:78;:::i;:::-;1143:86;;923:313;;;;:::o;1323:117::-;1432:1;1429;1422:12;1569:126;1606:7;1646:42;1639:5;1635:54;1624:65;;1569:126;;;:::o;1701:96::-;1738:7;1767:24;1785:5;1767:24;:::i;:::-;1756:35;;1701:96;;;:::o;1803:122::-;1876:24;1894:5;1876:24;:::i;:::-;1869:5;1866:35;1856:63;;1915:1;1912;1905:12;1856:63;1803:122;:::o;1931:139::-;1977:5;2015:6;2002:20;1993:29;;2031:33;2058:5;2031:33;:::i;:::-;1931:139;;;;:::o;2076:77::-;2113:7;2142:5;2131:16;;2076:77;;;:::o;2159:122::-;2232:24;2250:5;2232:24;:::i;:::-;2225:5;2222:35;2212:63;;2271:1;2268;2261:12;2212:63;2159:122;:::o;2287:139::-;2333:5;2371:6;2358:20;2349:29;;2387:33;2414:5;2387:33;:::i;:::-;2287:139;;;;:::o;2432:474::-;2500:6;2508;2557:2;2545:9;2536:7;2532:23;2528:32;2525:119;;;2563:79;;:::i;:::-;2525:119;2683:1;2708:53;2753:7;2744:6;2733:9;2729:22;2708:53;:::i;:::-;2698:63;;2654:117;2810:2;2836:53;2881:7;2872:6;2861:9;2857:22;2836:53;:::i;:::-;2826:63;;2781:118;2432:474;;;;;:::o;2912:90::-;2946:7;2989:5;2982:13;2975:21;2964:32;;2912:90;;;:::o;3008:109::-;3089:21;3104:5;3089:21;:::i;:::-;3084:3;3077:34;3008:109;;:::o;3123:210::-;3210:4;3248:2;3237:9;3233:18;3225:26;;3261:65;3323:1;3312:9;3308:17;3299:6;3261:65;:::i;:::-;3123:210;;;;:::o;3339:118::-;3426:24;3444:5;3426:24;:::i;:::-;3421:3;3414:37;3339:118;;:::o;3463:222::-;3556:4;3594:2;3583:9;3579:18;3571:26;;3607:71;3675:1;3664:9;3660:17;3651:6;3607:71;:::i;:::-;3463:222;;;;:::o;3691:619::-;3768:6;3776;3784;3833:2;3821:9;3812:7;3808:23;3804:32;3801:119;;;3839:79;;:::i;:::-;3801:119;3959:1;3984:53;4029:7;4020:6;4009:9;4005:22;3984:53;:::i;:::-;3974:63;;3930:117;4086:2;4112:53;4157:7;4148:6;4137:9;4133:22;4112:53;:::i;:::-;4102:63;;4057:118;4214:2;4240:53;4285:7;4276:6;4265:9;4261:22;4240:53;:::i;:::-;4230:63;;4185:118;3691:619;;;;;:::o;4316:86::-;4351:7;4391:4;4384:5;4380:16;4369:27;;4316:86;;;:::o;4408:112::-;4491:22;4507:5;4491:22;:::i;:::-;4486:3;4479:35;4408:112;;:::o;4526:214::-;4615:4;4653:2;4642:9;4638:18;4630:26;;4666:67;4730:1;4719:9;4715:17;4706:6;4666:67;:::i;:::-;4526:214;;;;:::o;4746:77::-;4783:7;4812:5;4801:16;;4746:77;;;:::o;4829:118::-;4916:24;4934:5;4916:24;:::i;:::-;4911:3;4904:37;4829:118;;:::o;4953:222::-;5046:4;5084:2;5073:9;5069:18;5061:26;;5097:71;5165:1;5154:9;5150:17;5141:6;5097:71;:::i;:::-;4953:222;;;;:::o;5181:329::-;5240:6;5289:2;5277:9;5268:7;5264:23;5260:32;5257:119;;;5295:79;;:::i;:::-;5257:119;5415:1;5440:53;5485:7;5476:6;5465:9;5461:22;5440:53;:::i;:::-;5430:63;;5386:117;5181:329;;;;:::o;5516:::-;5575:6;5624:2;5612:9;5603:7;5599:23;5595:32;5592:119;;;5630:79;;:::i;:::-;5592:119;5750:1;5775:53;5820:7;5811:6;5800:9;5796:22;5775:53;:::i;:::-;5765:63;;5721:117;5516:329;;;;:::o;5851:118::-;5922:22;5938:5;5922:22;:::i;:::-;5915:5;5912:33;5902:61;;5959:1;5956;5949:12;5902:61;5851:118;:::o;5975:135::-;6019:5;6057:6;6044:20;6035:29;;6073:31;6098:5;6073:31;:::i;:::-;5975:135;;;;:::o;6116:122::-;6189:24;6207:5;6189:24;:::i;:::-;6182:5;6179:35;6169:63;;6228:1;6225;6218:12;6169:63;6116:122;:::o;6244:139::-;6290:5;6328:6;6315:20;6306:29;;6344:33;6371:5;6344:33;:::i;:::-;6244:139;;;;:::o;6389:1199::-;6500:6;6508;6516;6524;6532;6540;6548;6597:3;6585:9;6576:7;6572:23;6568:33;6565:120;;;6604:79;;:::i;:::-;6565:120;6724:1;6749:53;6794:7;6785:6;6774:9;6770:22;6749:53;:::i;:::-;6739:63;;6695:117;6851:2;6877:53;6922:7;6913:6;6902:9;6898:22;6877:53;:::i;:::-;6867:63;;6822:118;6979:2;7005:53;7050:7;7041:6;7030:9;7026:22;7005:53;:::i;:::-;6995:63;;6950:118;7107:2;7133:53;7178:7;7169:6;7158:9;7154:22;7133:53;:::i;:::-;7123:63;;7078:118;7235:3;7262:51;7305:7;7296:6;7285:9;7281:22;7262:51;:::i;:::-;7252:61;;7206:117;7362:3;7389:53;7434:7;7425:6;7414:9;7410:22;7389:53;:::i;:::-;7379:63;;7333:119;7491:3;7518:53;7563:7;7554:6;7543:9;7539:22;7518:53;:::i;:::-;7508:63;;7462:119;6389:1199;;;;;;;;;;:::o;7594:474::-;7662:6;7670;7719:2;7707:9;7698:7;7694:23;7690:32;7687:119;;;7725:79;;:::i;:::-;7687:119;7845:1;7870:53;7915:7;7906:6;7895:9;7891:22;7870:53;:::i;:::-;7860:63;;7816:117;7972:2;7998:53;8043:7;8034:6;8023:9;8019:22;7998:53;:::i;:::-;7988:63;;7943:118;7594:474;;;;;:::o;8074:180::-;8122:77;8119:1;8112:88;8219:4;8216:1;8209:15;8243:4;8240:1;8233:15;8260:320;8304:6;8341:1;8335:4;8331:12;8321:22;;8388:1;8382:4;8378:12;8409:18;8399:81;;8465:4;8457:6;8453:17;8443:27;;8399:81;8527:2;8519:6;8516:14;8496:18;8493:38;8490:84;;8546:18;;:::i;:::-;8490:84;8311:269;8260:320;;;:::o;8586:180::-;8634:77;8631:1;8624:88;8731:4;8728:1;8721:15;8755:4;8752:1;8745:15;8772:191;8812:3;8831:20;8849:1;8831:20;:::i;:::-;8826:25;;8865:20;8883:1;8865:20;:::i;:::-;8860:25;;8908:1;8905;8901:9;8894:16;;8929:3;8926:1;8923:10;8920:36;;;8936:18;;:::i;:::-;8920:36;8772:191;;;;:::o;8969:224::-;9109:34;9105:1;9097:6;9093:14;9086:58;9178:7;9173:2;9165:6;9161:15;9154:32;8969:224;:::o;9199:366::-;9341:3;9362:67;9426:2;9421:3;9362:67;:::i;:::-;9355:74;;9438:93;9527:3;9438:93;:::i;:::-;9556:2;9551:3;9547:12;9540:19;;9199:366;;;:::o;9571:419::-;9737:4;9775:2;9764:9;9760:18;9752:26;;9824:9;9818:4;9814:20;9810:1;9799:9;9795:17;9788:47;9852:131;9978:4;9852:131;:::i;:::-;9844:139;;9571:419;;;:::o;9996:179::-;10136:31;10132:1;10124:6;10120:14;10113:55;9996:179;:::o;10181:366::-;10323:3;10344:67;10408:2;10403:3;10344:67;:::i;:::-;10337:74;;10420:93;10509:3;10420:93;:::i;:::-;10538:2;10533:3;10529:12;10522:19;;10181:366;;;:::o;10553:419::-;10719:4;10757:2;10746:9;10742:18;10734:26;;10806:9;10800:4;10796:20;10792:1;10781:9;10777:17;10770:47;10834:131;10960:4;10834:131;:::i;:::-;10826:139;;10553:419;;;:::o;10978:118::-;11065:24;11083:5;11065:24;:::i;:::-;11060:3;11053:37;10978:118;;:::o;11102:775::-;11335:4;11373:3;11362:9;11358:19;11350:27;;11387:71;11455:1;11444:9;11440:17;11431:6;11387:71;:::i;:::-;11468:72;11536:2;11525:9;11521:18;11512:6;11468:72;:::i;:::-;11550;11618:2;11607:9;11603:18;11594:6;11550:72;:::i;:::-;11632;11700:2;11689:9;11685:18;11676:6;11632:72;:::i;:::-;11714:73;11782:3;11771:9;11767:19;11758:6;11714:73;:::i;:::-;11797;11865:3;11854:9;11850:19;11841:6;11797:73;:::i;:::-;11102:775;;;;;;;;;:::o;11883:180::-;12023:32;12019:1;12011:6;12007:14;12000:56;11883:180;:::o;12069:366::-;12211:3;12232:67;12296:2;12291:3;12232:67;:::i;:::-;12225:74;;12308:93;12397:3;12308:93;:::i;:::-;12426:2;12421:3;12417:12;12410:19;;12069:366;;;:::o;12441:419::-;12607:4;12645:2;12634:9;12630:18;12622:26;;12694:9;12688:4;12684:20;12680:1;12669:9;12665:17;12658:47;12722:131;12848:4;12722:131;:::i;:::-;12714:139;;12441:419;;;:::o;12866:223::-;13006:34;13002:1;12994:6;12990:14;12983:58;13075:6;13070:2;13062:6;13058:15;13051:31;12866:223;:::o;13095:366::-;13237:3;13258:67;13322:2;13317:3;13258:67;:::i;:::-;13251:74;;13334:93;13423:3;13334:93;:::i;:::-;13452:2;13447:3;13443:12;13436:19;;13095:366;;;:::o;13467:419::-;13633:4;13671:2;13660:9;13656:18;13648:26;;13720:9;13714:4;13710:20;13706:1;13695:9;13691:17;13684:47;13748:131;13874:4;13748:131;:::i;:::-;13740:139;;13467:419;;;:::o;13892:221::-;14032:34;14028:1;14020:6;14016:14;14009:58;14101:4;14096:2;14088:6;14084:15;14077:29;13892:221;:::o;14119:366::-;14261:3;14282:67;14346:2;14341:3;14282:67;:::i;:::-;14275:74;;14358:93;14447:3;14358:93;:::i;:::-;14476:2;14471:3;14467:12;14460:19;;14119:366;;;:::o;14491:419::-;14657:4;14695:2;14684:9;14680:18;14672:26;;14744:9;14738:4;14734:20;14730:1;14719:9;14715:17;14708:47;14772:131;14898:4;14772:131;:::i;:::-;14764:139;;14491:419;;;:::o;14916:179::-;15056:31;15052:1;15044:6;15040:14;15033:55;14916:179;:::o;15101:366::-;15243:3;15264:67;15328:2;15323:3;15264:67;:::i;:::-;15257:74;;15340:93;15429:3;15340:93;:::i;:::-;15458:2;15453:3;15449:12;15442:19;;15101:366;;;:::o;15473:419::-;15639:4;15677:2;15666:9;15662:18;15654:26;;15726:9;15720:4;15716:20;15712:1;15701:9;15697:17;15690:47;15754:131;15880:4;15754:131;:::i;:::-;15746:139;;15473:419;;;:::o;15898:224::-;16038:34;16034:1;16026:6;16022:14;16015:58;16107:7;16102:2;16094:6;16090:15;16083:32;15898:224;:::o;16128:366::-;16270:3;16291:67;16355:2;16350:3;16291:67;:::i;:::-;16284:74;;16367:93;16456:3;16367:93;:::i;:::-;16485:2;16480:3;16476:12;16469:19;;16128:366;;;:::o;16500:419::-;16666:4;16704:2;16693:9;16689:18;16681:26;;16753:9;16747:4;16743:20;16739:1;16728:9;16724:17;16717:47;16781:131;16907:4;16781:131;:::i;:::-;16773:139;;16500:419;;;:::o;16925:222::-;17065:34;17061:1;17053:6;17049:14;17042:58;17134:5;17129:2;17121:6;17117:15;17110:30;16925:222;:::o;17153:366::-;17295:3;17316:67;17380:2;17375:3;17316:67;:::i;:::-;17309:74;;17392:93;17481:3;17392:93;:::i;:::-;17510:2;17505:3;17501:12;17494:19;;17153:366;;;:::o;17525:419::-;17691:4;17729:2;17718:9;17714:18;17706:26;;17778:9;17772:4;17768:20;17764:1;17753:9;17749:17;17742:47;17806:131;17932:4;17806:131;:::i;:::-;17798:139;;17525:419;;;:::o;17950:225::-;18090:34;18086:1;18078:6;18074:14;18067:58;18159:8;18154:2;18146:6;18142:15;18135:33;17950:225;:::o;18181:366::-;18323:3;18344:67;18408:2;18403:3;18344:67;:::i;:::-;18337:74;;18420:93;18509:3;18420:93;:::i;:::-;18538:2;18533:3;18529:12;18522:19;;18181:366;;;:::o;18553:419::-;18719:4;18757:2;18746:9;18742:18;18734:26;;18806:9;18800:4;18796:20;18792:1;18781:9;18777:17;18770:47;18834:131;18960:4;18834:131;:::i;:::-;18826:139;;18553:419;;;:::o;18978:220::-;19118:34;19114:1;19106:6;19102:14;19095:58;19187:3;19182:2;19174:6;19170:15;19163:28;18978:220;:::o;19204:366::-;19346:3;19367:67;19431:2;19426:3;19367:67;:::i;:::-;19360:74;;19443:93;19532:3;19443:93;:::i;:::-;19561:2;19556:3;19552:12;19545:19;;19204:366;;;:::o;19576:419::-;19742:4;19780:2;19769:9;19765:18;19757:26;;19829:9;19823:4;19819:20;19815:1;19804:9;19800:17;19793:47;19857:131;19983:4;19857:131;:::i;:::-;19849:139;;19576:419;;;:::o;20001:221::-;20141:34;20137:1;20129:6;20125:14;20118:58;20210:4;20205:2;20197:6;20193:15;20186:29;20001:221;:::o;20228:366::-;20370:3;20391:67;20455:2;20450:3;20391:67;:::i;:::-;20384:74;;20467:93;20556:3;20467:93;:::i;:::-;20585:2;20580:3;20576:12;20569:19;;20228:366;;;:::o;20600:419::-;20766:4;20804:2;20793:9;20789:18;20781:26;;20853:9;20847:4;20843:20;20839:1;20828:9;20824:17;20817:47;20881:131;21007:4;20881:131;:::i;:::-;20873:139;;20600:419;;;:::o;21025:664::-;21230:4;21268:3;21257:9;21253:19;21245:27;;21282:71;21350:1;21339:9;21335:17;21326:6;21282:71;:::i;:::-;21363:72;21431:2;21420:9;21416:18;21407:6;21363:72;:::i;:::-;21445;21513:2;21502:9;21498:18;21489:6;21445:72;:::i;:::-;21527;21595:2;21584:9;21580:18;21571:6;21527:72;:::i;:::-;21609:73;21677:3;21666:9;21662:19;21653:6;21609:73;:::i;:::-;21025:664;;;;;;;;:::o;21695:148::-;21797:11;21834:3;21819:18;;21695:148;;;;:::o;21849:214::-;21989:66;21985:1;21977:6;21973:14;21966:90;21849:214;:::o;22069:400::-;22229:3;22250:84;22332:1;22327:3;22250:84;:::i;:::-;22243:91;;22343:93;22432:3;22343:93;:::i;:::-;22461:1;22456:3;22452:11;22445:18;;22069:400;;;:::o;22475:79::-;22514:7;22543:5;22532:16;;22475:79;;;:::o;22560:157::-;22665:45;22685:24;22703:5;22685:24;:::i;:::-;22665:45;:::i;:::-;22660:3;22653:58;22560:157;;:::o;22723:663::-;22964:3;22986:148;23130:3;22986:148;:::i;:::-;22979:155;;23144:75;23215:3;23206:6;23144:75;:::i;:::-;23244:2;23239:3;23235:12;23228:19;;23257:75;23328:3;23319:6;23257:75;:::i;:::-;23357:2;23352:3;23348:12;23341:19;;23377:3;23370:10;;22723:663;;;;;:::o;23392:545::-;23565:4;23603:3;23592:9;23588:19;23580:27;;23617:71;23685:1;23674:9;23670:17;23661:6;23617:71;:::i;:::-;23698:68;23762:2;23751:9;23747:18;23738:6;23698:68;:::i;:::-;23776:72;23844:2;23833:9;23829:18;23820:6;23776:72;:::i;:::-;23858;23926:2;23915:9;23911:18;23902:6;23858:72;:::i;:::-;23392:545;;;;;;;:::o;23943:180::-;23991:77;23988:1;23981:88;24088:4;24085:1;24078:15;24112:4;24109:1;24102:15;24129:174;24269:26;24265:1;24257:6;24253:14;24246:50;24129:174;:::o;24309:366::-;24451:3;24472:67;24536:2;24531:3;24472:67;:::i;:::-;24465:74;;24548:93;24637:3;24548:93;:::i;:::-;24666:2;24661:3;24657:12;24650:19;;24309:366;;;:::o;24681:419::-;24847:4;24885:2;24874:9;24870:18;24862:26;;24934:9;24928:4;24924:20;24920:1;24909:9;24905:17;24898:47;24962:131;25088:4;24962:131;:::i;:::-;24954:139;;24681:419;;;:::o;25106:181::-;25246:33;25242:1;25234:6;25230:14;25223:57;25106:181;:::o;25293:366::-;25435:3;25456:67;25520:2;25515:3;25456:67;:::i;:::-;25449:74;;25532:93;25621:3;25532:93;:::i;:::-;25650:2;25645:3;25641:12;25634:19;;25293:366;;;:::o;25665:419::-;25831:4;25869:2;25858:9;25854:18;25846:26;;25918:9;25912:4;25908:20;25904:1;25893:9;25889:17;25882:47;25946:131;26072:4;25946:131;:::i;:::-;25938:139;;25665:419;;;:::o;26090:221::-;26230:34;26226:1;26218:6;26214:14;26207:58;26299:4;26294:2;26286:6;26282:15;26275:29;26090:221;:::o;26317:366::-;26459:3;26480:67;26544:2;26539:3;26480:67;:::i;:::-;26473:74;;26556:93;26645:3;26556:93;:::i;:::-;26674:2;26669:3;26665:12;26658:19;;26317:366;;;:::o;26689:419::-;26855:4;26893:2;26882:9;26878:18;26870:26;;26942:9;26936:4;26932:20;26928:1;26917:9;26913:17;26906:47;26970:131;27096:4;26970:131;:::i;:::-;26962:139;;26689:419;;;:::o
Swarm Source
ipfs://9b7dc0134213e4ca4697431017a6741701ddb0c5e2f65b822b8065f283573ff6
Loading...
Loading
Loading...
Loading
Loading...
Loading
Net Worth in USD
$0.00
Net Worth in MON
Multichain Portfolio | 35 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.