Multichain Info
Latest 25 from a total of 148,818 transactions
| Transaction Hash |
|
Block
|
From
|
To
|
|||||
|---|---|---|---|---|---|---|---|---|---|
| Approve | 41873873 | 5 hrs ago | IN | 0 ETH | 0.00000017 | ||||
| Approve | 41872265 | 6 hrs ago | IN | 0 ETH | 0.00000011 | ||||
| Transfer | 41871279 | 6 hrs ago | IN | 0 ETH | 0.00000067 | ||||
| Approve | 41868817 | 8 hrs ago | IN | 0 ETH | 0.00000014 | ||||
| Approve | 41859758 | 13 hrs ago | IN | 0 ETH | 0.00000018 | ||||
| Approve | 41856875 | 14 hrs ago | IN | 0 ETH | 0.00000023 | ||||
| Transfer | 41845977 | 20 hrs ago | IN | 0 ETH | 0.00000818 | ||||
| Transfer | 41845775 | 21 hrs ago | IN | 0 ETH | 0.00000971 | ||||
| Transfer | 41845769 | 21 hrs ago | IN | 0 ETH | 0.00001117 | ||||
| Approve | 41839533 | 24 hrs ago | IN | 0 ETH | 0.00000056 | ||||
| Approve | 41834113 | 27 hrs ago | IN | 0 ETH | 0.0000002 | ||||
| Approve | 41833918 | 27 hrs ago | IN | 0 ETH | 0.0000002 | ||||
| Transfer | 41829970 | 29 hrs ago | IN | 0 ETH | 0.00000085 | ||||
| Approve | 41828263 | 30 hrs ago | IN | 0 ETH | 0.00000036 | ||||
| Approve | 41823084 | 33 hrs ago | IN | 0 ETH | 0.00000018 | ||||
| Transfer | 41822928 | 33 hrs ago | IN | 0 ETH | 0.00000018 | ||||
| Approve | 41816557 | 37 hrs ago | IN | 0 ETH | 0.0000002 | ||||
| Transfer | 41813244 | 39 hrs ago | IN | 0 ETH | 0.0000003 | ||||
| Approve | 41807191 | 42 hrs ago | IN | 0 ETH | 0.00000045 | ||||
| Transfer | 41806778 | 42 hrs ago | IN | 0 ETH | 0.00000096 | ||||
| Transfer | 41806464 | 42 hrs ago | IN | 0 ETH | 0.0000008 | ||||
| Transfer | 41806345 | 42 hrs ago | IN | 0 ETH | 0.00000124 | ||||
| Transfer | 41806120 | 43 hrs ago | IN | 0 ETH | 0.00000142 | ||||
| Transfer | 41805727 | 43 hrs ago | IN | 0 ETH | 0.00000081 | ||||
| Transfer | 41805658 | 43 hrs ago | IN | 0 ETH | 0.00000147 |
Cross-Chain Transactions
Loading...
Loading
Contract Name:
OPMintableERC20
Compiler Version
v0.8.15+commit.e14f2714
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
- No Contract Security Audit Submitted- Submit Audit Here
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"}]Contract Creation Code
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
OVERVIEW
TOWER Token is an ERC-20 utility token of the TOWER Project initiated by Animoca Brands.Loading...
Loading
Loading...
Loading
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.