ETH Price: $2,844.86 (-3.19%)
 

Overview

Max Total Supply

2,239,987,087.403524258294294679 TOWER

Holders

71,739 (0.00%)

Market

Price

$0.0004 @ 0.000000 ETH (-1.83%)

Onchain Market Cap

-

Circulating Supply Market Cap

$2,702,500.00

Other Info

Token Contract (WITH 18 Decimals)

Filtered by Token Holder
20102.base.eth
Balance
257.852048277669636624 TOWER

Value
$0.11 ( ~3.86661916044792E-05 ETH) [0.0000%]
0xcf7927b2a95f729eeee54f1ae2c43cf51aac67b3
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

TOWER Token is an ERC-20 utility token of the TOWER Project initiated by Animoca Brands.

Contract Source Code Verified (Exact Match)

Contract Name:
OPMintableERC20

Compiler Version
v0.8.15+commit.e14f2714

Optimization Enabled:
Yes with 2000 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at basescan.org on 2023-08-26
*/

// Sources flattened with hardhat v2.17.1 https://hardhat.org

// SPDX-License-Identifier: MIT

// File @openzeppelin/contracts/utils/introspection/[email protected]

// Original license: SPDX_License_Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)

pragma solidity ^0.8.0;

/**
 * @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);
}


// File @eth-optimism/contracts-bedrock/contracts/universal/[email protected]

// Original license: SPDX_License_Identifier: MIT
pragma solidity ^0.8.0;

/**
 * @title IOptimismMintableERC20
 * @notice This interface is available on the OptimismMintableERC20 contract. We declare it as a
 *         separate interface so that it can be used in custom implementations of
 *         OptimismMintableERC20.
 */
interface IOptimismMintableERC20 is IERC165 {
    function remoteToken() external view returns (address);

    function bridge() external returns (address);

    function mint(address _to, uint256 _amount) external;

    function burn(address _from, uint256 _amount) external;
}

/**
 * @custom:legacy
 * @title ILegacyMintableERC20
 * @notice This interface was available on the legacy L2StandardERC20 contract. It remains available
 *         on the OptimismMintableERC20 contract for backwards compatibility.
 */
interface ILegacyMintableERC20 is IERC165 {
    function l1Token() external view returns (address);

    function mint(address _to, uint256 _amount) external;

    function burn(address _from, uint256 _amount) external;
}


// File @openzeppelin/contracts/utils/math/[email protected]

// Original license: SPDX_License_Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (utils/math/Math.sol)

pragma solidity ^0.8.0;

/**
 * @dev Standard math utilities missing in the Solidity language.
 */
library Math {
    enum Rounding {
        Down, // Toward negative infinity
        Up, // Toward infinity
        Zero // Toward zero
    }

    /**
     * @dev Returns the largest of two numbers.
     */
    function max(uint256 a, uint256 b) internal pure returns (uint256) {
        return a > b ? a : b;
    }

    /**
     * @dev Returns the smallest of two numbers.
     */
    function min(uint256 a, uint256 b) internal pure returns (uint256) {
        return a < b ? a : b;
    }

    /**
     * @dev Returns the average of two numbers. The result is rounded towards
     * zero.
     */
    function average(uint256 a, uint256 b) internal pure returns (uint256) {
        // (a + b) / 2 can overflow.
        return (a & b) + (a ^ b) / 2;
    }

    /**
     * @dev Returns the ceiling of the division of two numbers.
     *
     * This differs from standard division with `/` in that it rounds up instead
     * of rounding down.
     */
    function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {
        // (a + b - 1) / b can overflow on addition, so we distribute.
        return a == 0 ? 0 : (a - 1) / b + 1;
    }

    /**
     * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0
     * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv)
     * with further edits by Uniswap Labs also under MIT license.
     */
    function mulDiv(uint256 x, uint256 y, uint256 denominator) internal pure returns (uint256 result) {
        unchecked {
            // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use
            // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256
            // variables such that product = prod1 * 2^256 + prod0.
            uint256 prod0; // Least significant 256 bits of the product
            uint256 prod1; // Most significant 256 bits of the product
            assembly {
                let mm := mulmod(x, y, not(0))
                prod0 := mul(x, y)
                prod1 := sub(sub(mm, prod0), lt(mm, prod0))
            }

            // Handle non-overflow cases, 256 by 256 division.
            if (prod1 == 0) {
                // Solidity will revert if denominator == 0, unlike the div opcode on its own.
                // The surrounding unchecked block does not change this fact.
                // See https://docs.soliditylang.org/en/latest/control-structures.html#checked-or-unchecked-arithmetic.
                return prod0 / denominator;
            }

            // Make sure the result is less than 2^256. Also prevents denominator == 0.
            require(denominator > prod1, "Math: mulDiv overflow");

            ///////////////////////////////////////////////
            // 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 256, following the selected rounding direction, of a positive value.
     * Returns 0 if given 0.
     */
    function log256(uint256 value, Rounding rounding) internal pure returns (uint256) {
        unchecked {
            uint256 result = log256(value);
            return result + (rounding == Rounding.Up && 1 << (result << 3) < value ? 1 : 0);
        }
    }
}


// File @openzeppelin/contracts/utils/math/[email protected]

// Original license: SPDX_License_Identifier: MIT
// OpenZeppelin Contracts (last updated v4.8.0) (utils/math/SignedMath.sol)

pragma solidity ^0.8.0;

/**
 * @dev Standard signed math utilities missing in the Solidity language.
 */
library SignedMath {
    /**
     * @dev Returns the largest of two signed numbers.
     */
    function max(int256 a, int256 b) internal pure returns (int256) {
        return a > b ? a : b;
    }

    /**
     * @dev Returns the smallest of two signed numbers.
     */
    function min(int256 a, int256 b) internal pure returns (int256) {
        return a < b ? a : b;
    }

    /**
     * @dev Returns the average of two signed numbers without overflow.
     * The result is rounded towards zero.
     */
    function average(int256 a, int256 b) internal pure returns (int256) {
        // Formula from the book "Hacker's Delight"
        int256 x = (a & b) + ((a ^ b) >> 1);
        return x + (int256(uint256(x) >> 255) & (a ^ b));
    }

    /**
     * @dev Returns the absolute unsigned value of a signed value.
     */
    function abs(int256 n) internal pure returns (uint256) {
        unchecked {
            // must be unchecked in order to support `n = type(int256).min`
            return uint256(n >= 0 ? n : -n);
        }
    }
}


// File @openzeppelin/contracts/utils/[email protected]

// Original license: SPDX_License_Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (utils/Strings.sol)

pragma solidity ^0.8.0;


/**
 * @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 `int256` to its ASCII `string` decimal representation.
     */
    function toString(int256 value) internal pure returns (string memory) {
        return string(abi.encodePacked(value < 0 ? "-" : "", toString(SignedMath.abs(value))));
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
     */
    function toHexString(uint256 value) internal pure returns (string memory) {
        unchecked {
            return toHexString(value, Math.log256(value) + 1);
        }
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.
     */
    function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {
        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);
    }

    /**
     * @dev Returns true if the two strings are equal.
     */
    function equal(string memory a, string memory b) internal pure returns (bool) {
        return keccak256(bytes(a)) == keccak256(bytes(b));
    }
}


// File @eth-optimism/contracts-bedrock/contracts/universal/[email protected]

// Original license: SPDX_License_Identifier: MIT
pragma solidity ^0.8.0;

/**
 * @title Semver
 * @notice Semver is a simple contract for managing contract versions.
 */
contract Semver {
    /**
     * @notice Contract version number (major).
     */
    uint256 private immutable MAJOR_VERSION;

    /**
     * @notice Contract version number (minor).
     */
    uint256 private immutable MINOR_VERSION;

    /**
     * @notice Contract version number (patch).
     */
    uint256 private immutable PATCH_VERSION;

    /**
     * @param _major Version number (major).
     * @param _minor Version number (minor).
     * @param _patch Version number (patch).
     */
    constructor(
        uint256 _major,
        uint256 _minor,
        uint256 _patch
    ) {
        MAJOR_VERSION = _major;
        MINOR_VERSION = _minor;
        PATCH_VERSION = _patch;
    }

    /**
     * @notice Returns the full semver contract version.
     *
     * @return Semver contract version as a string.
     */
    function version() public view returns (string memory) {
        return
            string(
                abi.encodePacked(
                    Strings.toString(MAJOR_VERSION),
                    ".",
                    Strings.toString(MINOR_VERSION),
                    ".",
                    Strings.toString(PATCH_VERSION)
                )
            );
    }
}


// File @openzeppelin/contracts/token/ERC20/[email protected]

// Original license: SPDX_License_Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/IERC20.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(address indexed owner, address indexed spender, uint256 value);

    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns the amount of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @dev Moves `amount` tokens from the caller's account to `to`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address to, uint256 amount) external returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender) external view returns (uint256);

    /**
     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 amount) external returns (bool);

    /**
     * @dev Moves `amount` tokens from `from` to `to` using the
     * allowance mechanism. `amount` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(address from, address to, uint256 amount) external returns (bool);
}


// File @openzeppelin/contracts/token/ERC20/extensions/[email protected]

// Original license: SPDX_License_Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol)

pragma solidity ^0.8.0;

/**
 * @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);
}


// File @openzeppelin/contracts/utils/[email protected]

// Original license: SPDX_License_Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)

pragma solidity ^0.8.0;

/**
 * @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;
    }
}


// File @openzeppelin/contracts/token/ERC20/[email protected]

// Original license: SPDX_License_Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/ERC20.sol)

pragma solidity ^0.8.0;



/**
 * @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].
 *
 * The default value of {decimals} is 18. To change this, you should override
 * this function so it returns a different value.
 *
 * 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;

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;

    /**
     * @dev Sets the values for {name} and {symbol}.
     *
     * All two of these values are immutable: they can only be set once during
     * construction.
     */
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

    /**
     * @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 default value returned by this function, unless
     * it's 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) {
            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 {}
}


// File @eth-optimism/contracts-bedrock/contracts/universal/[email protected]

// Original license: SPDX_License_Identifier: MIT
pragma solidity 0.8.15;




/**
 * @title OptimismMintableERC20
 * @notice OptimismMintableERC20 is a standard extension of the base ERC20 token contract designed
 *         to allow the StandardBridge contracts to mint and burn tokens. This makes it possible to
 *         use an OptimismMintablERC20 as the L2 representation of an L1 token, or vice-versa.
 *         Designed to be backwards compatible with the older StandardL2ERC20 token which was only
 *         meant for use on L2.
 */
contract OptimismMintableERC20 is IOptimismMintableERC20, ILegacyMintableERC20, ERC20, Semver {
    /**
     * @notice Address of the corresponding version of this token on the remote chain.
     */
    address public immutable REMOTE_TOKEN;

    /**
     * @notice Address of the StandardBridge on this network.
     */
    address public immutable BRIDGE;

    /**
     * @notice Emitted whenever tokens are minted for an account.
     *
     * @param account Address of the account tokens are being minted for.
     * @param amount  Amount of tokens minted.
     */
    event Mint(address indexed account, uint256 amount);

    /**
     * @notice Emitted whenever tokens are burned from an account.
     *
     * @param account Address of the account tokens are being burned from.
     * @param amount  Amount of tokens burned.
     */
    event Burn(address indexed account, uint256 amount);

    /**
     * @notice A modifier that only allows the bridge to call
     */
    modifier onlyBridge() {
        require(msg.sender == BRIDGE, "OptimismMintableERC20: only bridge can mint and burn");
        _;
    }

    /**
     * @custom:semver 1.0.0
     *
     * @param _bridge      Address of the L2 standard bridge.
     * @param _remoteToken Address of the corresponding L1 token.
     * @param _name        ERC20 name.
     * @param _symbol      ERC20 symbol.
     */
    constructor(
        address _bridge,
        address _remoteToken,
        string memory _name,
        string memory _symbol
    ) ERC20(_name, _symbol) Semver(1, 0, 0) {
        REMOTE_TOKEN = _remoteToken;
        BRIDGE = _bridge;
    }

    /**
     * @notice Allows the StandardBridge on this network to mint tokens.
     *
     * @param _to     Address to mint tokens to.
     * @param _amount Amount of tokens to mint.
     */
    function mint(address _to, uint256 _amount)
        external
        virtual
        override(IOptimismMintableERC20, ILegacyMintableERC20)
        onlyBridge
    {
        _mint(_to, _amount);
        emit Mint(_to, _amount);
    }

    /**
     * @notice Allows the StandardBridge on this network to burn tokens.
     *
     * @param _from   Address to burn tokens from.
     * @param _amount Amount of tokens to burn.
     */
    function burn(address _from, uint256 _amount)
        external
        virtual
        override(IOptimismMintableERC20, ILegacyMintableERC20)
        onlyBridge
    {
        _burn(_from, _amount);
        emit Burn(_from, _amount);
    }

    /**
     * @notice ERC165 interface check function.
     *
     * @param _interfaceId Interface ID to check.
     *
     * @return Whether or not the interface is supported by this contract.
     */
    function supportsInterface(bytes4 _interfaceId) external pure returns (bool) {
        bytes4 iface1 = type(IERC165).interfaceId;
        // Interface corresponding to the legacy L2StandardERC20.
        bytes4 iface2 = type(ILegacyMintableERC20).interfaceId;
        // Interface corresponding to the updated OptimismMintableERC20 (this contract).
        bytes4 iface3 = type(IOptimismMintableERC20).interfaceId;
        return _interfaceId == iface1 || _interfaceId == iface2 || _interfaceId == iface3;
    }

    /**
     * @custom:legacy
     * @notice Legacy getter for the remote token. Use REMOTE_TOKEN going forward.
     */
    function l1Token() public view returns (address) {
        return REMOTE_TOKEN;
    }

    /**
     * @custom:legacy
     * @notice Legacy getter for the bridge. Use BRIDGE going forward.
     */
    function l2Bridge() public view returns (address) {
        return BRIDGE;
    }

    /**
     * @custom:legacy
     * @notice Legacy getter for REMOTE_TOKEN.
     */
    function remoteToken() public view returns (address) {
        return REMOTE_TOKEN;
    }

    /**
     * @custom:legacy
     * @notice Legacy getter for BRIDGE.
     */
    function bridge() public view returns (address) {
        return BRIDGE;
    }
}


// File contracts/OptimismMintableERC20/OPMintableERC20.sol

// Original license: SPDX_License_Identifier: MIT
pragma solidity 0.8.15;

// Uncomment this line to use console.log
// import "hardhat/console.sol";

contract OPMintableERC20 is OptimismMintableERC20 {
    constructor(
        address _bridge,
        address _remoteToken,
        string memory _name,
        string memory _symbol
    ) OptimismMintableERC20(_bridge, _remoteToken, _name, _symbol) {
        require(_bridge != address(0), "Invalid Bridge Address");
        require(_remoteToken != address(0), "Invalid Remote Token Address");
    }
}

Contract Security Audit

Contract ABI

API
[{"inputs":[{"internalType":"address","name":"_bridge","type":"address"},{"internalType":"address","name":"_remoteToken","type":"address"},{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"}],"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":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Burn","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Mint","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":"BRIDGE","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"REMOTE_TOKEN","outputs":[{"internalType":"address","name":"","type":"address"}],"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":[],"name":"bridge","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"burn","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":"l1Token","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"l2Bridge","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"remoteToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"_interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","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"},{"inputs":[],"name":"version","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"}]

6101206040523480156200001257600080fd5b506040516200176638038062001766833981016040819052620000359162000223565b838383836001600080848460036200004e838262000342565b5060046200005d828262000342565b50505060809290925260a05260c05250506001600160a01b0390811660e052908116610100528416620000d75760405162461bcd60e51b815260206004820152601660248201527f496e76616c69642042726964676520416464726573730000000000000000000060448201526064015b60405180910390fd5b6001600160a01b0383166200012f5760405162461bcd60e51b815260206004820152601c60248201527f496e76616c69642052656d6f746520546f6b656e2041646472657373000000006044820152606401620000ce565b505050506200040e565b80516001600160a01b03811681146200015157600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b600082601f8301126200017e57600080fd5b81516001600160401b03808211156200019b576200019b62000156565b604051601f8301601f19908116603f01168101908282118183101715620001c657620001c662000156565b81604052838152602092508683858801011115620001e357600080fd5b600091505b83821015620002075785820183015181830184015290820190620001e8565b83821115620002195760008385830101525b9695505050505050565b600080600080608085870312156200023a57600080fd5b620002458562000139565b9350620002556020860162000139565b60408601519093506001600160401b03808211156200027357600080fd5b62000281888389016200016c565b935060608701519150808211156200029857600080fd5b50620002a7878288016200016c565b91505092959194509250565b600181811c90821680620002c857607f821691505b602082108103620002e957634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200033d57600081815260208120601f850160051c81016020861015620003185750805b601f850160051c820191505b81811015620003395782815560010162000324565b5050505b505050565b81516001600160401b038111156200035e576200035e62000156565b62000376816200036f8454620002b3565b84620002ef565b602080601f831160018114620003ae5760008415620003955750858301515b600019600386901b1c1916600185901b17855562000339565b600085815260208120601f198616915b82811015620003df57888601518255948401946001909101908401620003be565b5085821015620003fe5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60805160a05160c05160e051610100516112f76200046f600039600081816102db015281816103630152818161058e01526107340152600081816101a90152610301015260006106d0015260006106a70152600061067e01526112f76000f3fe608060405234801561001057600080fd5b50600436106101775760003560e01c806370a08231116100d8578063ae1f6aaf1161008c578063dd62ed3e11610066578063dd62ed3e14610325578063e78cea92146102d9578063ee9a31a21461035e57600080fd5b8063ae1f6aaf146102d9578063c01e1bd6146102ff578063d6c0b2c4146102ff57600080fd5b80639dc29fac116100bd5780639dc29fac146102a0578063a457c2d7146102b3578063a9059cbb146102c657600080fd5b806370a082311461026f57806395d89b411461029857600080fd5b806323b872dd1161012f5780633950935111610114578063395093511461023f57806340c10f191461025257806354fd4d501461026757600080fd5b806323b872dd1461021d578063313ce5671461023057600080fd5b806306fdde031161016057806306fdde03146101e3578063095ea7b3146101f857806318160ddd1461020b57600080fd5b806301ffc9a71461017c578063033964be146101a4575b600080fd5b61018f61018a36600461103f565b610385565b60405190151581526020015b60405180910390f35b6101cb7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200161019b565b6101eb610476565b60405161019b91906110b4565b61018f610206366004611121565b610508565b6002545b60405190815260200161019b565b61018f61022b36600461114b565b610520565b6040516012815260200161019b565b61018f61024d366004611121565b610544565b610265610260366004611121565b610583565b005b6101eb610677565b61020f61027d366004611187565b6001600160a01b031660009081526020819052604090205490565b6101eb61071a565b6102656102ae366004611121565b610729565b61018f6102c1366004611121565b61080c565b61018f6102d4366004611121565b6108b6565b7f00000000000000000000000000000000000000000000000000000000000000006101cb565b7f00000000000000000000000000000000000000000000000000000000000000006101cb565b61020f6103333660046111a2565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b6101cb7f000000000000000000000000000000000000000000000000000000000000000081565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007f1d1d8b63000000000000000000000000000000000000000000000000000000007fec4fc8e3000000000000000000000000000000000000000000000000000000007fffffffff00000000000000000000000000000000000000000000000000000000851683148061043e57507fffffffff00000000000000000000000000000000000000000000000000000000858116908316145b8061046d57507fffffffff00000000000000000000000000000000000000000000000000000000858116908216145b95945050505050565b606060038054610485906111d5565b80601f01602080910402602001604051908101604052809291908181526020018280546104b1906111d5565b80156104fe5780601f106104d3576101008083540402835291602001916104fe565b820191906000526020600020905b8154815290600101906020018083116104e157829003601f168201915b5050505050905090565b6000336105168185856108c4565b5060019392505050565b60003361052e858285610a1d565b610539858585610aaf565b506001949350505050565b3360008181526001602090815260408083206001600160a01b0387168452909152812054909190610516908290869061057e90879061120f565b6108c4565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146106265760405162461bcd60e51b815260206004820152603460248201527f4f7074696d69736d4d696e7461626c6545524332303a206f6e6c79206272696460448201527f67652063616e206d696e7420616e64206275726e00000000000000000000000060648201526084015b60405180910390fd5b6106308282610c9c565b816001600160a01b03167f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d41213968858260405161066b91815260200190565b60405180910390a25050565b60606106a27f0000000000000000000000000000000000000000000000000000000000000000610d5b565b6106cb7f0000000000000000000000000000000000000000000000000000000000000000610d5b565b6106f47f0000000000000000000000000000000000000000000000000000000000000000610d5b565b60405160200161070693929190611235565b604051602081830303815290604052905090565b606060048054610485906111d5565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146107c75760405162461bcd60e51b815260206004820152603460248201527f4f7074696d69736d4d696e7461626c6545524332303a206f6e6c79206272696460448201527f67652063616e206d696e7420616e64206275726e000000000000000000000000606482015260840161061d565b6107d18282610dfb565b816001600160a01b03167fcc16f5dbb4873280815c1ee09dbd06736cffcc184412cf7a71a0fdb75d397ca58260405161066b91815260200190565b3360008181526001602090815260408083206001600160a01b0387168452909152812054909190838110156108a95760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f000000000000000000000000000000000000000000000000000000606482015260840161061d565b61053982868684036108c4565b600033610516818585610aaf565b6001600160a01b03831661093f5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f7265737300000000000000000000000000000000000000000000000000000000606482015260840161061d565b6001600160a01b0382166109bb5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f7373000000000000000000000000000000000000000000000000000000000000606482015260840161061d565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b6001600160a01b038381166000908152600160209081526040808320938616835292905220546000198114610aa95781811015610a9c5760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000604482015260640161061d565b610aa984848484036108c4565b50505050565b6001600160a01b038316610b2b5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f6472657373000000000000000000000000000000000000000000000000000000606482015260840161061d565b6001600160a01b038216610ba75760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f6573730000000000000000000000000000000000000000000000000000000000606482015260840161061d565b6001600160a01b03831660009081526020819052604090205481811015610c365760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e63650000000000000000000000000000000000000000000000000000606482015260840161061d565b6001600160a01b03848116600081815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3610aa9565b6001600160a01b038216610cf25760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015260640161061d565b8060026000828254610d04919061120f565b90915550506001600160a01b038216600081815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b60606000610d6883610f5c565b600101905060008167ffffffffffffffff811115610d8857610d886112ab565b6040519080825280601f01601f191660200182016040528015610db2576020820181803683370190505b5090508181016020015b600019017f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a8504945084610dbc57509392505050565b6001600160a01b038216610e775760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f7300000000000000000000000000000000000000000000000000000000000000606482015260840161061d565b6001600160a01b03821660009081526020819052604090205481811015610f065760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f6365000000000000000000000000000000000000000000000000000000000000606482015260840161061d565b6001600160a01b0383166000818152602081815260408083208686039055600280548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9101610a10565b6000807a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008310610fa5577a184f03e93ff9f4daa797ed6e38ed64bf6a1f010000000000000000830492506040015b6d04ee2d6d415b85acef81000000008310610fd1576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc100008310610fef57662386f26fc10000830492506010015b6305f5e1008310611007576305f5e100830492506008015b612710831061101b57612710830492506004015b6064831061102d576064830492506002015b600a8310611039576001015b92915050565b60006020828403121561105157600080fd5b81357fffffffff000000000000000000000000000000000000000000000000000000008116811461108157600080fd5b9392505050565b60005b838110156110a357818101518382015260200161108b565b83811115610aa95750506000910152565b60208152600082518060208401526110d3816040850160208701611088565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169190910160400192915050565b80356001600160a01b038116811461111c57600080fd5b919050565b6000806040838503121561113457600080fd5b61113d83611105565b946020939093013593505050565b60008060006060848603121561116057600080fd5b61116984611105565b925061117760208501611105565b9150604084013590509250925092565b60006020828403121561119957600080fd5b61108182611105565b600080604083850312156111b557600080fd5b6111be83611105565b91506111cc60208401611105565b90509250929050565b600181811c908216806111e957607f821691505b60208210810361120957634e487b7160e01b600052602260045260246000fd5b50919050565b6000821982111561123057634e487b7160e01b600052601160045260246000fd5b500190565b60008451611247818460208901611088565b80830190507f2e000000000000000000000000000000000000000000000000000000000000008082528551611283816001850160208a01611088565b6001920191820152835161129e816002840160208801611088565b0160020195945050505050565b634e487b7160e01b600052604160045260246000fdfea2646970667358221220ecaaa08d809de625e5fe1c31055c1eeef314214d38b6ae9ef8dea596e2716bf864736f6c634300080f003300000000000000000000000042000000000000000000000000000000000000100000000000000000000000001c9922314ed1415c95b9fd453c3818fd41867d0b000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000005544f5745520000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005544f574552000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101775760003560e01c806370a08231116100d8578063ae1f6aaf1161008c578063dd62ed3e11610066578063dd62ed3e14610325578063e78cea92146102d9578063ee9a31a21461035e57600080fd5b8063ae1f6aaf146102d9578063c01e1bd6146102ff578063d6c0b2c4146102ff57600080fd5b80639dc29fac116100bd5780639dc29fac146102a0578063a457c2d7146102b3578063a9059cbb146102c657600080fd5b806370a082311461026f57806395d89b411461029857600080fd5b806323b872dd1161012f5780633950935111610114578063395093511461023f57806340c10f191461025257806354fd4d501461026757600080fd5b806323b872dd1461021d578063313ce5671461023057600080fd5b806306fdde031161016057806306fdde03146101e3578063095ea7b3146101f857806318160ddd1461020b57600080fd5b806301ffc9a71461017c578063033964be146101a4575b600080fd5b61018f61018a36600461103f565b610385565b60405190151581526020015b60405180910390f35b6101cb7f0000000000000000000000001c9922314ed1415c95b9fd453c3818fd41867d0b81565b6040516001600160a01b03909116815260200161019b565b6101eb610476565b60405161019b91906110b4565b61018f610206366004611121565b610508565b6002545b60405190815260200161019b565b61018f61022b36600461114b565b610520565b6040516012815260200161019b565b61018f61024d366004611121565b610544565b610265610260366004611121565b610583565b005b6101eb610677565b61020f61027d366004611187565b6001600160a01b031660009081526020819052604090205490565b6101eb61071a565b6102656102ae366004611121565b610729565b61018f6102c1366004611121565b61080c565b61018f6102d4366004611121565b6108b6565b7f00000000000000000000000042000000000000000000000000000000000000106101cb565b7f0000000000000000000000001c9922314ed1415c95b9fd453c3818fd41867d0b6101cb565b61020f6103333660046111a2565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b6101cb7f000000000000000000000000420000000000000000000000000000000000001081565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007f1d1d8b63000000000000000000000000000000000000000000000000000000007fec4fc8e3000000000000000000000000000000000000000000000000000000007fffffffff00000000000000000000000000000000000000000000000000000000851683148061043e57507fffffffff00000000000000000000000000000000000000000000000000000000858116908316145b8061046d57507fffffffff00000000000000000000000000000000000000000000000000000000858116908216145b95945050505050565b606060038054610485906111d5565b80601f01602080910402602001604051908101604052809291908181526020018280546104b1906111d5565b80156104fe5780601f106104d3576101008083540402835291602001916104fe565b820191906000526020600020905b8154815290600101906020018083116104e157829003601f168201915b5050505050905090565b6000336105168185856108c4565b5060019392505050565b60003361052e858285610a1d565b610539858585610aaf565b506001949350505050565b3360008181526001602090815260408083206001600160a01b0387168452909152812054909190610516908290869061057e90879061120f565b6108c4565b336001600160a01b037f000000000000000000000000420000000000000000000000000000000000001016146106265760405162461bcd60e51b815260206004820152603460248201527f4f7074696d69736d4d696e7461626c6545524332303a206f6e6c79206272696460448201527f67652063616e206d696e7420616e64206275726e00000000000000000000000060648201526084015b60405180910390fd5b6106308282610c9c565b816001600160a01b03167f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d41213968858260405161066b91815260200190565b60405180910390a25050565b60606106a27f0000000000000000000000000000000000000000000000000000000000000001610d5b565b6106cb7f0000000000000000000000000000000000000000000000000000000000000000610d5b565b6106f47f0000000000000000000000000000000000000000000000000000000000000000610d5b565b60405160200161070693929190611235565b604051602081830303815290604052905090565b606060048054610485906111d5565b336001600160a01b037f000000000000000000000000420000000000000000000000000000000000001016146107c75760405162461bcd60e51b815260206004820152603460248201527f4f7074696d69736d4d696e7461626c6545524332303a206f6e6c79206272696460448201527f67652063616e206d696e7420616e64206275726e000000000000000000000000606482015260840161061d565b6107d18282610dfb565b816001600160a01b03167fcc16f5dbb4873280815c1ee09dbd06736cffcc184412cf7a71a0fdb75d397ca58260405161066b91815260200190565b3360008181526001602090815260408083206001600160a01b0387168452909152812054909190838110156108a95760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f000000000000000000000000000000000000000000000000000000606482015260840161061d565b61053982868684036108c4565b600033610516818585610aaf565b6001600160a01b03831661093f5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f7265737300000000000000000000000000000000000000000000000000000000606482015260840161061d565b6001600160a01b0382166109bb5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f7373000000000000000000000000000000000000000000000000000000000000606482015260840161061d565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b6001600160a01b038381166000908152600160209081526040808320938616835292905220546000198114610aa95781811015610a9c5760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000604482015260640161061d565b610aa984848484036108c4565b50505050565b6001600160a01b038316610b2b5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f6472657373000000000000000000000000000000000000000000000000000000606482015260840161061d565b6001600160a01b038216610ba75760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f6573730000000000000000000000000000000000000000000000000000000000606482015260840161061d565b6001600160a01b03831660009081526020819052604090205481811015610c365760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e63650000000000000000000000000000000000000000000000000000606482015260840161061d565b6001600160a01b03848116600081815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3610aa9565b6001600160a01b038216610cf25760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015260640161061d565b8060026000828254610d04919061120f565b90915550506001600160a01b038216600081815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b60606000610d6883610f5c565b600101905060008167ffffffffffffffff811115610d8857610d886112ab565b6040519080825280601f01601f191660200182016040528015610db2576020820181803683370190505b5090508181016020015b600019017f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a8504945084610dbc57509392505050565b6001600160a01b038216610e775760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f7300000000000000000000000000000000000000000000000000000000000000606482015260840161061d565b6001600160a01b03821660009081526020819052604090205481811015610f065760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f6365000000000000000000000000000000000000000000000000000000000000606482015260840161061d565b6001600160a01b0383166000818152602081815260408083208686039055600280548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9101610a10565b6000807a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008310610fa5577a184f03e93ff9f4daa797ed6e38ed64bf6a1f010000000000000000830492506040015b6d04ee2d6d415b85acef81000000008310610fd1576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc100008310610fef57662386f26fc10000830492506010015b6305f5e1008310611007576305f5e100830492506008015b612710831061101b57612710830492506004015b6064831061102d576064830492506002015b600a8310611039576001015b92915050565b60006020828403121561105157600080fd5b81357fffffffff000000000000000000000000000000000000000000000000000000008116811461108157600080fd5b9392505050565b60005b838110156110a357818101518382015260200161108b565b83811115610aa95750506000910152565b60208152600082518060208401526110d3816040850160208701611088565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169190910160400192915050565b80356001600160a01b038116811461111c57600080fd5b919050565b6000806040838503121561113457600080fd5b61113d83611105565b946020939093013593505050565b60008060006060848603121561116057600080fd5b61116984611105565b925061117760208501611105565b9150604084013590509250925092565b60006020828403121561119957600080fd5b61108182611105565b600080604083850312156111b557600080fd5b6111be83611105565b91506111cc60208401611105565b90509250929050565b600181811c908216806111e957607f821691505b60208210810361120957634e487b7160e01b600052602260045260246000fd5b50919050565b6000821982111561123057634e487b7160e01b600052601160045260246000fd5b500190565b60008451611247818460208901611088565b80830190507f2e000000000000000000000000000000000000000000000000000000000000008082528551611283816001850160208a01611088565b6001920191820152835161129e816002840160208801611088565b0160020195945050505050565b634e487b7160e01b600052604160045260246000fdfea2646970667358221220ecaaa08d809de625e5fe1c31055c1eeef314214d38b6ae9ef8dea596e2716bf864736f6c634300080f0033

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

00000000000000000000000042000000000000000000000000000000000000100000000000000000000000001c9922314ed1415c95b9fd453c3818fd41867d0b000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000005544f5745520000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005544f574552000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : _bridge (address): 0x4200000000000000000000000000000000000010
Arg [1] : _remoteToken (address): 0x1C9922314ED1415c95b9FD453c3818fd41867d0B
Arg [2] : _name (string): TOWER
Arg [3] : _symbol (string): TOWER

-----Encoded View---------------
8 Constructor Arguments found :
Arg [0] : 0000000000000000000000004200000000000000000000000000000000000010
Arg [1] : 0000000000000000000000001c9922314ed1415c95b9fd453c3818fd41867d0b
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000080
Arg [3] : 00000000000000000000000000000000000000000000000000000000000000c0
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000005
Arg [5] : 544f574552000000000000000000000000000000000000000000000000000000
Arg [6] : 0000000000000000000000000000000000000000000000000000000000000005
Arg [7] : 544f574552000000000000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

44100:412:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42571:518;;;;;;:::i;:::-;;:::i;:::-;;;516:14:1;;509:22;491:41;;479:2;464:18;42571:518:0;;;;;;;;39987:37;;;;;;;;-1:-1:-1;;;;;707:55:1;;;689:74;;677:2;662:18;39987:37:0;543:226:1;28131:100:0;;;:::i;:::-;;;;;;;:::i;30491:201::-;;;;;;:::i;:::-;;:::i;29260:108::-;29348:12;;29260:108;;;2090:25:1;;;2078:2;2063:18;29260:108:0;1944:177:1;31272:261:0;;;;;;:::i;:::-;;:::i;29102:93::-;;;29185:2;2601:36:1;;2589:2;2574:18;29102:93:0;2459:184:1;31942:238:0;;;;;;:::i;:::-;;:::i;41658:240::-;;;;;;:::i;:::-;;:::i;:::-;;20896:383;;;:::i;29431:127::-;;;;;;:::i;:::-;-1:-1:-1;;;;;29532:18:0;29505:7;29532:18;;;;;;;;;;;;29431:127;28350:104;;;:::i;42107:246::-;;;;;;:::i;:::-;;:::i;32683:436::-;;;;;;:::i;:::-;;:::i;29764:193::-;;;;;;:::i;:::-;;:::i;43430:82::-;43498:6;43430:82;;43222:87;43289:12;43222:87;;30020:151;;;;;;:::i;:::-;-1:-1:-1;;;;;30136:18:0;;;30109:7;30136:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;30020:151;40114:31;;;;;42571:518;42642:4;42675:25;42794:38;42949:40;43007:22;;;;;;:48;;-1:-1:-1;43033:22:0;;;;;;;;43007:48;:74;;;-1:-1:-1;43059:22:0;;;;;;;;43007:74;43000:81;42571:518;-1:-1:-1;;;;;42571:518:0:o;28131:100::-;28185:13;28218:5;28211:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28131:100;:::o;30491:201::-;30574:4;25794:10;30630:32;25794:10;30646:7;30655:6;30630:8;:32::i;:::-;-1:-1:-1;30680:4:0;;30491:201;-1:-1:-1;;;30491:201:0:o;31272:261::-;31369:4;25794:10;31427:38;31443:4;25794:10;31458:6;31427:15;:38::i;:::-;31476:27;31486:4;31492:2;31496:6;31476:9;:27::i;:::-;-1:-1:-1;31521:4:0;;31272:261;-1:-1:-1;;;;31272:261:0:o;31942:238::-;25794:10;32030:4;30136:18;;;:11;:18;;;;;;;;-1:-1:-1;;;;;30136:27:0;;;;;;;;;;32030:4;;25794:10;32086:64;;25794:10;;30136:27;;32111:38;;32139:10;;32111:38;:::i;:::-;32086:8;:64::i;41658:240::-;40830:10;-1:-1:-1;;;;;40844:6:0;40830:20;;40822:85;;;;-1:-1:-1;;;40822:85:0;;4035:2:1;40822:85:0;;;4017:21:1;4074:2;4054:18;;;4047:30;4113:34;4093:18;;;4086:62;4184:22;4164:18;;;4157:50;4224:19;;40822:85:0;;;;;;;;;41837:19:::1;41843:3;41848:7;41837:5;:19::i;:::-;41877:3;-1:-1:-1::0;;;;;41872:18:0::1;;41882:7;41872:18;;;;2090:25:1::0;;2078:2;2063:18;;1944:177;41872:18:0::1;;;;;;;;41658:240:::0;;:::o;20896:383::-;20936:13;21046:31;21063:13;21046:16;:31::i;:::-;21126;21143:13;21126:16;:31::i;:::-;21206;21223:13;21206:16;:31::i;:::-;21007:249;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;20962:309;;20896:383;:::o;28350:104::-;28406:13;28439:7;28432:14;;;;;:::i;42107:246::-;40830:10;-1:-1:-1;;;;;40844:6:0;40830:20;;40822:85;;;;-1:-1:-1;;;40822:85:0;;4035:2:1;40822:85:0;;;4017:21:1;4074:2;4054:18;;;4047:30;4113:34;4093:18;;;4086:62;4184:22;4164:18;;;4157:50;4224:19;;40822:85:0;3833:416:1;40822:85:0;42288:21:::1;42294:5;42301:7;42288:5;:21::i;:::-;42330:5;-1:-1:-1::0;;;;;42325:20:0::1;;42337:7;42325:20;;;;2090:25:1::0;;2078:2;2063:18;;1944:177;32683:436:0;25794:10;32776:4;30136:18;;;:11;:18;;;;;;;;-1:-1:-1;;;;;30136:27:0;;;;;;;;;;32776:4;;25794:10;32923:15;32903:16;:35;;32895:85;;;;-1:-1:-1;;;32895:85:0;;5421:2:1;32895:85:0;;;5403:21:1;5460:2;5440:18;;;5433:30;5499:34;5479:18;;;5472:62;5570:7;5550:18;;;5543:35;5595:19;;32895:85:0;5219:401:1;32895:85:0;33016:60;33025:5;33032:7;33060:15;33041:16;:34;33016:8;:60::i;29764:193::-;29843:4;25794:10;29899:28;25794:10;29916:2;29920:6;29899:9;:28::i;36676:346::-;-1:-1:-1;;;;;36778:19:0;;36770:68;;;;-1:-1:-1;;;36770:68:0;;5827:2:1;36770:68:0;;;5809:21:1;5866:2;5846:18;;;5839:30;5905:34;5885:18;;;5878:62;5976:6;5956:18;;;5949:34;6000:19;;36770:68:0;5625:400:1;36770:68:0;-1:-1:-1;;;;;36857:21:0;;36849:68;;;;-1:-1:-1;;;36849:68:0;;6232:2:1;36849:68:0;;;6214:21:1;6271:2;6251:18;;;6244:30;6310:34;6290:18;;;6283:62;6381:4;6361:18;;;6354:32;6403:19;;36849:68:0;6030:398:1;36849:68:0;-1:-1:-1;;;;;36930:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;36982:32;;2090:25:1;;;36982:32:0;;2063:18:1;36982:32:0;;;;;;;;36676:346;;;:::o;37313:419::-;-1:-1:-1;;;;;30136:18:0;;;37414:24;30136:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;-1:-1:-1;;37481:37:0;;37477:248;;37563:6;37543:16;:26;;37535:68;;;;-1:-1:-1;;;37535:68:0;;6635:2:1;37535:68:0;;;6617:21:1;6674:2;6654:18;;;6647:30;6713:31;6693:18;;;6686:59;6762:18;;37535:68:0;6433:353:1;37535:68:0;37647:51;37656:5;37663:7;37691:6;37672:16;:25;37647:8;:51::i;:::-;37403:329;37313:419;;;:::o;33589:806::-;-1:-1:-1;;;;;33686:18:0;;33678:68;;;;-1:-1:-1;;;33678:68:0;;6993:2:1;33678:68:0;;;6975:21:1;7032:2;7012:18;;;7005:30;7071:34;7051:18;;;7044:62;7142:7;7122:18;;;7115:35;7167:19;;33678:68:0;6791:401:1;33678:68:0;-1:-1:-1;;;;;33765:16:0;;33757:64;;;;-1:-1:-1;;;33757:64:0;;7399:2:1;33757:64:0;;;7381:21:1;7438:2;7418:18;;;7411:30;7477:34;7457:18;;;7450:62;7548:5;7528:18;;;7521:33;7571:19;;33757:64:0;7197:399:1;33757:64:0;-1:-1:-1;;;;;33907:15:0;;33885:19;33907:15;;;;;;;;;;;33941:21;;;;33933:72;;;;-1:-1:-1;;;33933:72:0;;7803:2:1;33933:72:0;;;7785:21:1;7842:2;7822:18;;;7815:30;7881:34;7861:18;;;7854:62;7952:8;7932:18;;;7925:36;7978:19;;33933:72:0;7601:402:1;33933:72:0;-1:-1:-1;;;;;34041:15:0;;;:9;:15;;;;;;;;;;;34059:20;;;34041:38;;34259:13;;;;;;;;;;:23;;;;;;34311:26;;2090:25:1;;;34259:13:0;;34311:26;;2063:18:1;34311:26:0;;;;;;;34350:37;35563:675;34682:548;-1:-1:-1;;;;;34766:21:0;;34758:65;;;;-1:-1:-1;;;34758:65:0;;8210:2:1;34758:65:0;;;8192:21:1;8249:2;8229:18;;;8222:30;8288:33;8268:18;;;8261:61;8339:18;;34758:65:0;8008:355:1;34758:65:0;34914:6;34898:12;;:22;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;;;35069:18:0;;:9;:18;;;;;;;;;;;:28;;;;;;35124:37;2090:25:1;;;35124:37:0;;2063:18:1;35124:37:0;;;;;;;34682:548;;:::o;17362:716::-;17418:13;17469:14;17486:17;17497:5;17486:10;:17::i;:::-;17506:1;17486:21;17469:38;;17522:20;17556:6;17545:18;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;17545:18:0;-1:-1:-1;17522:41:0;-1:-1:-1;17687:28:0;;;17703:2;17687:28;17744:288;-1:-1:-1;;17776:5:0;17918:8;17913:2;17902:14;;17897:30;17776:5;17884:44;17974:2;17965:11;;;-1:-1:-1;17995:21:0;17744:288;17995:21;-1:-1:-1;18053:6:0;17362:716;-1:-1:-1;;;17362:716:0:o;35563:675::-;-1:-1:-1;;;;;35647:21:0;;35639:67;;;;-1:-1:-1;;;35639:67:0;;8948:2:1;35639:67:0;;;8930:21:1;8987:2;8967:18;;;8960:30;9026:34;9006:18;;;8999:62;9097:3;9077:18;;;9070:31;9118:19;;35639:67:0;8746:397:1;35639:67:0;-1:-1:-1;;;;;35806:18:0;;35781:22;35806:18;;;;;;;;;;;35843:24;;;;35835:71;;;;-1:-1:-1;;;35835:71:0;;9350:2:1;35835:71:0;;;9332:21:1;9389:2;9369:18;;;9362:30;9428:34;9408:18;;;9401:62;9499:4;9479:18;;;9472:32;9521:19;;35835:71:0;9148:398:1;35835:71:0;-1:-1:-1;;;;;35942:18:0;;:9;:18;;;;;;;;;;;35963:23;;;35942:44;;36081:12;:22;;;;;;;36132:37;2090:25:1;;;35942:9:0;;:18;36132:37;;2063:18:1;36132:37:0;1944:177:1;12745:948:0;12798:7;;12885:8;12876:17;;12872:106;;12923:8;12914:17;;;-1:-1:-1;12960:2:0;12950:12;12872:106;13005:8;12996:5;:17;12992:106;;13043:8;13034:17;;;-1:-1:-1;13080:2:0;13070:12;12992:106;13125:8;13116:5;:17;13112:106;;13163:8;13154:17;;;-1:-1:-1;13200:2:0;13190:12;13112:106;13245:7;13236:5;:16;13232:103;;13282:7;13273:16;;;-1:-1:-1;13318:1:0;13308:11;13232:103;13362:7;13353:5;:16;13349:103;;13399:7;13390:16;;;-1:-1:-1;13435:1:0;13425:11;13349:103;13479:7;13470:5;:16;13466:103;;13516:7;13507:16;;;-1:-1:-1;13552:1:0;13542:11;13466:103;13596:7;13587:5;:16;13583:68;;13634:1;13624:11;13583:68;13679:6;12745:948;-1:-1:-1;;12745:948:0:o;14:332:1:-;72:6;125:2;113:9;104:7;100:23;96:32;93:52;;;141:1;138;131:12;93:52;180:9;167:23;230:66;223:5;219:78;212:5;209:89;199:117;;312:1;309;302:12;199:117;335:5;14:332;-1:-1:-1;;;14:332:1:o;774:258::-;846:1;856:113;870:6;867:1;864:13;856:113;;;946:11;;;940:18;927:11;;;920:39;892:2;885:10;856:113;;;987:6;984:1;981:13;978:48;;;-1:-1:-1;;1022:1:1;1004:16;;997:27;774:258::o;1037:442::-;1186:2;1175:9;1168:21;1149:4;1218:6;1212:13;1261:6;1256:2;1245:9;1241:18;1234:34;1277:66;1336:6;1331:2;1320:9;1316:18;1311:2;1303:6;1299:15;1277:66;:::i;:::-;1395:2;1383:15;1400:66;1379:88;1364:104;;;;1470:2;1360:113;;1037:442;-1:-1:-1;;1037:442:1:o;1484:196::-;1552:20;;-1:-1:-1;;;;;1601:54:1;;1591:65;;1581:93;;1670:1;1667;1660:12;1581:93;1484:196;;;:::o;1685:254::-;1753:6;1761;1814:2;1802:9;1793:7;1789:23;1785:32;1782:52;;;1830:1;1827;1820:12;1782:52;1853:29;1872:9;1853:29;:::i;:::-;1843:39;1929:2;1914:18;;;;1901:32;;-1:-1:-1;;;1685:254:1:o;2126:328::-;2203:6;2211;2219;2272:2;2260:9;2251:7;2247:23;2243:32;2240:52;;;2288:1;2285;2278:12;2240:52;2311:29;2330:9;2311:29;:::i;:::-;2301:39;;2359:38;2393:2;2382:9;2378:18;2359:38;:::i;:::-;2349:48;;2444:2;2433:9;2429:18;2416:32;2406:42;;2126:328;;;;;:::o;2648:186::-;2707:6;2760:2;2748:9;2739:7;2735:23;2731:32;2728:52;;;2776:1;2773;2766:12;2728:52;2799:29;2818:9;2799:29;:::i;2839:260::-;2907:6;2915;2968:2;2956:9;2947:7;2943:23;2939:32;2936:52;;;2984:1;2981;2974:12;2936:52;3007:29;3026:9;3007:29;:::i;:::-;2997:39;;3055:38;3089:2;3078:9;3074:18;3055:38;:::i;:::-;3045:48;;2839:260;;;;;:::o;3104:437::-;3183:1;3179:12;;;;3226;;;3247:61;;3301:4;3293:6;3289:17;3279:27;;3247:61;3354:2;3346:6;3343:14;3323:18;3320:38;3317:218;;-1:-1:-1;;;3388:1:1;3381:88;3492:4;3489:1;3482:15;3520:4;3517:1;3510:15;3317:218;;3104:437;;;:::o;3546:282::-;3586:3;3617:1;3613:6;3610:1;3607:13;3604:193;;;-1:-1:-1;;;3650:1:1;3643:88;3754:4;3751:1;3744:15;3782:4;3779:1;3772:15;3604:193;-1:-1:-1;3813:9:1;;3546:282::o;4254:960::-;4683:3;4721:6;4715:13;4737:53;4783:6;4778:3;4771:4;4763:6;4759:17;4737:53;:::i;:::-;4821:6;4816:3;4812:16;4799:29;;4847:3;4873:2;4866:5;4859:17;4907:6;4901:13;4923:65;4979:8;4975:1;4968:5;4964:13;4957:4;4949:6;4945:17;4923:65;:::i;:::-;5051:1;5007:20;;5043:10;;;5036:22;5083:13;;5105:62;5083:13;5154:1;5146:10;;5139:4;5127:17;;5105:62;:::i;:::-;5187:17;5206:1;5183:25;;4254:960;-1:-1:-1;;;;;4254:960:1:o;8368:184::-;-1:-1:-1;;;8417:1:1;8410:88;8517:4;8514:1;8507:15;8541:4;8538:1;8531:15

Swarm Source

ipfs://ecaaa08d809de625e5fe1c31055c1eeef314214d38b6ae9ef8dea596e2716bf8
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.