MNT Price: $0.71 (+2.41%)

Contract

0xdEAddEaDdeadDEadDEADDEAddEADDEAddead1111
 
Transaction Hash
Method
Block
From
To
Approve786313552025-04-23 7:23:421 min ago1745393022IN
Mantle: WETH Token
0 MNT0.002395360.02
Approve786313162025-04-23 7:22:243 mins ago1745392944IN
Mantle: WETH Token
0 MNT0.001902650.03
Approve786313112025-04-23 7:22:143 mins ago1745392934IN
Mantle: WETH Token
0 MNT0.001905930.03
Approve786313062025-04-23 7:22:043 mins ago1745392924IN
Mantle: WETH Token
0 MNT0.001895320.03
Approve786312962025-04-23 7:21:443 mins ago1745392904IN
Mantle: WETH Token
0 MNT0.001893570.03
Transfer786312542025-04-23 7:20:205 mins ago1745392820IN
Mantle: WETH Token
0 MNT0.003511010.04
Approve786312422025-04-23 7:19:565 mins ago1745392796IN
Mantle: WETH Token
0 MNT0.003536850.03
Approve786310602025-04-23 7:13:5211 mins ago1745392432IN
Mantle: WETH Token
0 MNT0.002703510.0225
Transfer786310352025-04-23 7:13:0212 mins ago1745392382IN
Mantle: WETH Token
0 MNT0.003520290.04
Transfer786310072025-04-23 7:12:0613 mins ago1745392326IN
Mantle: WETH Token
0 MNT0.003527670.04
Transfer786310072025-04-23 7:12:0613 mins ago1745392326IN
Mantle: WETH Token
0 MNT0.003526070.04
Transfer786309762025-04-23 7:11:0414 mins ago1745392264IN
Mantle: WETH Token
0 MNT0.003520390.04
Transfer786309462025-04-23 7:10:0415 mins ago1745392204IN
Mantle: WETH Token
0 MNT0.003522530.04
Transfer786309462025-04-23 7:10:0415 mins ago1745392204IN
Mantle: WETH Token
0 MNT0.003520930.04
Transfer786309462025-04-23 7:10:0415 mins ago1745392204IN
Mantle: WETH Token
0 MNT0.003520930.04
Transfer786309462025-04-23 7:10:0415 mins ago1745392204IN
Mantle: WETH Token
0 MNT0.003522530.04
Transfer786309032025-04-23 7:08:3816 mins ago1745392118IN
Mantle: WETH Token
0 MNT0.003527270.04
Transfer786308882025-04-23 7:08:0817 mins ago1745392088IN
Mantle: WETH Token
0 MNT0.003535570.04
Transfer786308852025-04-23 7:08:0217 mins ago1745392082IN
Mantle: WETH Token
0 MNT0.003535470.04
Approve786307752025-04-23 7:04:2221 mins ago1745391862IN
Mantle: WETH Token
0 MNT0.003577940.03
Approve786307552025-04-23 7:03:4221 mins ago1745391822IN
Mantle: WETH Token
0 MNT0.002422010.02
Approve786307042025-04-23 7:02:0023 mins ago1745391720IN
Mantle: WETH Token
0 MNT0.002418450.02
Approve786306302025-04-23 6:59:3225 mins ago1745391572IN
Mantle: WETH Token
0 MNT0.002428230.02
Approve786306212025-04-23 6:59:1426 mins ago1745391554IN
Mantle: WETH Token
0 MNT0.002427680.02
Approve786305912025-04-23 6:58:1427 mins ago1745391494IN
Mantle: WETH Token
0 MNT0.00156630.02
View all transactions

Latest 3 internal transactions

Advanced mode:
Parent Transaction Hash Block From To
760879542025-02-23 10:23:4058 days ago1740306220
Mantle: WETH Token
44.80950019 MNT
700968152024-10-07 17:59:02197 days ago1728323942
Mantle: WETH Token
3.57484284 MNT
637854062024-05-14 15:38:44343 days ago1715701124
Mantle: WETH Token
1 MNT

Loading...
Loading

Contract Source Code Verified (Genesis Bytecode Match Only)

Contract Name:
BVM_ETH

Compiler Version
v0.8.15+commit.e14f2714

Optimization Enabled:
Yes with 10000 runs

Other Settings:
london EvmVersion, MIT license
File 1 of 11 : BVM_ETH.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.9;

/* Library Imports */
import { Predeploys } from "../libraries/Predeploys.sol";

/* Contract Imports */
import { OptimismMintableERC20 } from "../universal/OptimismMintableERC20.sol";

/**
 * @title BVM_ETH
 * @dev The ETH predeploy provides an ERC20 interface for ETH deposited to Layer 2. Note that
 * unlike on Layer 1, Layer 2 accounts do not have a balance field.
 */
contract BVM_ETH is OptimismMintableERC20 {
    /***************
     * Constructor *
     ***************/

    constructor()
    OptimismMintableERC20(Predeploys.L2_STANDARD_BRIDGE, address(0), "Ether", "WETH")
    {}

    /**
     * @notice Allows the StandardBridge on this network to mint tokens.
     *
     * @param _to   Address of the receiver.
     * @param _amount Amount of tokens to mint.
     */
    function mint(address _to, uint256 _amount)
        public
        virtual
        override
    {
        revert("BVM_ETH: mint is disabled by normal contract calling. BVM_ETH mint can only be triggered in deposit transaction execution, similar to MNT mint on L2.");
    }

    /**
     * @notice A modifier that only allows the L2_TO_L1_MESSAGE_PASSER to call
     */
    modifier onlyL2Passer() {
        require(msg.sender == Predeploys.L2_TO_L1_MESSAGE_PASSER, "OptimismMintableERC20: only L2MessagePasser can burn");
        _;
    }

    /**
    * @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
        onlyL2Passer
    {
        _burn(_from, _amount);
        emit Burn(_from, _amount);
    }
}

File 2 of 11 : Predeploys.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

/**
 * @title Predeploys
 * @notice Contains constant addresses for contracts that are pre-deployed to the L2 system.
 */
library Predeploys {


    /**
    * @notice Address of the BVM_ETH predeploy.
     */
    address internal constant BVM_ETH = 0xdEAddEaDdeadDEadDEADDEAddEADDEAddead1111;

    /**
     * @notice Address of the L2ToL1MessagePasser predeploy.
     */
    address internal constant L2_TO_L1_MESSAGE_PASSER = 0x4200000000000000000000000000000000000016;

    /**
     * @notice Address of the L2CrossDomainMessenger predeploy.
     */
    address internal constant L2_CROSS_DOMAIN_MESSENGER =
        0x4200000000000000000000000000000000000007;

    /**
     * @notice Address of the L2StandardBridge predeploy.
     */
    address internal constant L2_STANDARD_BRIDGE = 0x4200000000000000000000000000000000000010;

    /**
     * @notice Address of the L2ERC721Bridge predeploy.
     */
    address internal constant L2_ERC721_BRIDGE = 0x4200000000000000000000000000000000000014;

    /**
     * @notice Address of the SequencerFeeWallet predeploy.
     */
    address internal constant SEQUENCER_FEE_WALLET = 0x4200000000000000000000000000000000000011;

    /**
     * @notice Address of the OptimismMintableERC20Factory predeploy.
     */
    address internal constant OPTIMISM_MINTABLE_ERC20_FACTORY =
        0x4200000000000000000000000000000000000012;

    /**
     * @notice Address of the OptimismMintableERC721Factory predeploy.
     */
    address internal constant OPTIMISM_MINTABLE_ERC721_FACTORY =
        0x4200000000000000000000000000000000000017;

    /**
     * @notice Address of the L1Block predeploy.
     */
    address internal constant L1_BLOCK_ATTRIBUTES = 0x4200000000000000000000000000000000000015;

    /**
     * @notice Address of the GasPriceOracle predeploy. Includes fee information
     *         and helpers for computing the L1 portion of the transaction fee.
     */
    address internal constant GAS_PRICE_ORACLE = 0x420000000000000000000000000000000000000F;

    /**
     * @custom:legacy
     * @notice Address of the L1MessageSender predeploy. Deprecated. Use L2CrossDomainMessenger
     *         or access tx.origin (or msg.sender) in a L1 to L2 transaction instead.
     */
    address internal constant L1_MESSAGE_SENDER = 0x4200000000000000000000000000000000000001;

    /**
     * @custom:legacy
     * @notice Address of the DeployerWhitelist predeploy. No longer active.
     */
    address internal constant DEPLOYER_WHITELIST = 0x4200000000000000000000000000000000000002;

    /**
     * @custom:legacy
     * @notice Address of the LegacyERC20MNT predeploy. Deprecated. Balances are migrated to the
     *         state trie as of the Bedrock upgrade. Contract has been locked and write functions
     *         can no longer be accessed.
     */
    address internal constant LEGACY_ERC20_MNT = 0xDeadDeAddeAddEAddeadDEaDDEAdDeaDDeAD0000;

    /**
     * @custom:legacy
     * @notice Address of the L1BlockNumber predeploy. Deprecated. Use the L1Block predeploy
     *         instead, which exposes more information about the L1 state.
     */
    address internal constant L1_BLOCK_NUMBER = 0x4200000000000000000000000000000000000013;

    /**
     * @custom:legacy
     * @notice Address of the LegacyMessagePasser predeploy. Deprecate. Use the updated
     *         L2ToL1MessagePasser contract instead.
     */
    address internal constant LEGACY_MESSAGE_PASSER = 0x4200000000000000000000000000000000000000;

    /**
     * @notice Address of the ProxyAdmin predeploy.
     */
    address internal constant PROXY_ADMIN = 0x4200000000000000000000000000000000000018;

    /**
     * @notice Address of the BaseFeeVault predeploy.
     */
    address internal constant BASE_FEE_VAULT = 0x4200000000000000000000000000000000000019;

    /**
     * @notice Address of the L1FeeVault predeploy.
     */
    address internal constant L1_FEE_VAULT = 0x420000000000000000000000000000000000001A;

    /**
     * @notice Address of the GovernanceToken predeploy.
     */
    address internal constant GOVERNANCE_TOKEN = 0x4200000000000000000000000000000000000042;
}

File 3 of 11 : OptimismMintableERC20.sol
// SPDX-License-Identifier: MIT
pragma solidity 0.8.15;

import { ERC20 } from "@openzeppelin/contracts/token/ERC20/ERC20.sol";
import { IERC165 } from "@openzeppelin/contracts/utils/introspection/IERC165.sol";
import { ILegacyMintableERC20, IOptimismMintableERC20 } from "./IOptimismMintableERC20.sol";
import { Semver } from "../universal/Semver.sol";

/**
 * @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 4 of 11 : ERC20.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (token/ERC20/ERC20.sol)

pragma solidity ^0.8.0;

import "./IERC20.sol";
import "./extensions/IERC20Metadata.sol";
import "../../utils/Context.sol";

/**
 * @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.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How
 * to implement supply mechanisms].
 *
 * We have followed general OpenZeppelin Contracts guidelines: functions revert
 * instead returning `false` on failure. This behavior is nonetheless
 * conventional and does not conflict with the expectations of ERC20
 * applications.
 *
 * Additionally, an {Approval} event is emitted on calls to {transferFrom}.
 * This allows applications to reconstruct the allowance for all accounts just
 * by listening to said events. Other implementations of the EIP may not emit
 * these events, as it isn't required by the specification.
 *
 * Finally, the non-standard {decreaseAllowance} and {increaseAllowance}
 * functions have been added to mitigate the well-known issues around setting
 * allowances. See {IERC20-approve}.
 */
contract ERC20 is Context, IERC20, IERC20Metadata {
    mapping(address => uint256) private _balances;

    mapping(address => mapping(address => uint256)) private _allowances;

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;

    /**
     * @dev Sets the values for {name} and {symbol}.
     *
     * The default value of {decimals} is 18. To select a different value for
     * {decimals} you should overload it.
     *
     * All two of these values are immutable: they can only be set once during
     * construction.
     */
    constructor(string memory name_, string memory symbol_) {
        _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 value {ERC20} uses, unless this function is
     * overridden;
     *
     * NOTE: This information is only used for _display_ purposes: it in
     * no way affects any of the arithmetic of the contract, including
     * {IERC20-balanceOf} and {IERC20-transfer}.
     */
    function decimals() public view virtual override returns (uint8) {
        return 18;
    }

    /**
     * @dev See {IERC20-totalSupply}.
     */
    function totalSupply() public view virtual override returns (uint256) {
        return _totalSupply;
    }

    /**
     * @dev See {IERC20-balanceOf}.
     */
    function balanceOf(address account) public view virtual override returns (uint256) {
        return _balances[account];
    }

    /**
     * @dev See {IERC20-transfer}.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - the caller must have a balance of at least `amount`.
     */
    function transfer(address to, uint256 amount) public virtual override returns (bool) {
        address owner = _msgSender();
        _transfer(owner, to, amount);
        return true;
    }

    /**
     * @dev See {IERC20-allowance}.
     */
    function allowance(address owner, address spender) public view virtual override returns (uint256) {
        return _allowances[owner][spender];
    }

    /**
     * @dev See {IERC20-approve}.
     *
     * NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on
     * `transferFrom`. This is semantically equivalent to an infinite approval.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function approve(address spender, uint256 amount) public virtual override returns (bool) {
        address owner = _msgSender();
        _approve(owner, spender, amount);
        return true;
    }

    /**
     * @dev See {IERC20-transferFrom}.
     *
     * Emits an {Approval} event indicating the updated allowance. This is not
     * required by the EIP. See the note at the beginning of {ERC20}.
     *
     * NOTE: Does not update the allowance if the current allowance
     * is the maximum `uint256`.
     *
     * Requirements:
     *
     * - `from` and `to` cannot be the zero address.
     * - `from` must have a balance of at least `amount`.
     * - the caller must have allowance for ``from``'s tokens of at least
     * `amount`.
     */
    function transferFrom(
        address from,
        address to,
        uint256 amount
    ) public virtual override returns (bool) {
        address spender = _msgSender();
        _spendAllowance(from, spender, amount);
        _transfer(from, to, amount);
        return true;
    }

    /**
     * @dev Atomically increases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {
        address owner = _msgSender();
        _approve(owner, spender, allowance(owner, spender) + addedValue);
        return true;
    }

    /**
     * @dev Atomically decreases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     * - `spender` must have allowance for the caller of at least
     * `subtractedValue`.
     */
    function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {
        address owner = _msgSender();
        uint256 currentAllowance = allowance(owner, spender);
        require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero");
        unchecked {
            _approve(owner, spender, currentAllowance - subtractedValue);
        }

        return true;
    }

    /**
     * @dev Moves `amount` of tokens from `from` to `to`.
     *
     * This internal function is equivalent to {transfer}, and can be used to
     * e.g. implement automatic token fees, slashing mechanisms, etc.
     *
     * Emits a {Transfer} event.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `from` must have a balance of at least `amount`.
     */
    function _transfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {
        require(from != address(0), "ERC20: transfer from the zero address");
        require(to != address(0), "ERC20: transfer to the zero address");

        _beforeTokenTransfer(from, to, amount);

        uint256 fromBalance = _balances[from];
        require(fromBalance >= amount, "ERC20: transfer amount exceeds balance");
        unchecked {
            _balances[from] = fromBalance - amount;
        }
        _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;
        _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;
        }
        _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 5 of 11 : IERC165.sol
// 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 6 of 11 : IOptimismMintableERC20.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

import { IERC165 } from "@openzeppelin/contracts/utils/introspection/IERC165.sol";

/**
 * @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 7 of 11 : Semver.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

import { Strings } from "@openzeppelin/contracts/utils/Strings.sol";

/**
 * @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 8 of 11 : IERC20.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol)

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

File 9 of 11 : IERC20Metadata.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol)

pragma solidity ^0.8.0;

import "../IERC20.sol";

/**
 * @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 10 of 11 : Context.sol
// 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 11 of 11 : Strings.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (utils/Strings.sol)

pragma solidity ^0.8.0;

/**
 * @dev String operations.
 */
library Strings {
    bytes16 private constant _HEX_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) {
        // Inspired by OraclizeAPI's implementation - MIT licence
        // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol

        if (value == 0) {
            return "0";
        }
        uint256 temp = value;
        uint256 digits;
        while (temp != 0) {
            digits++;
            temp /= 10;
        }
        bytes memory buffer = new bytes(digits);
        while (value != 0) {
            digits -= 1;
            buffer[digits] = bytes1(uint8(48 + uint256(value % 10)));
            value /= 10;
        }
        return string(buffer);
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
     */
    function toHexString(uint256 value) internal pure returns (string memory) {
        if (value == 0) {
            return "0x00";
        }
        uint256 temp = value;
        uint256 length = 0;
        while (temp != 0) {
            length++;
            temp >>= 8;
        }
        return toHexString(value, length);
    }

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

Settings
{
  "remappings": [
    "@openzeppelin/contracts-upgradeable/=node_modules/@openzeppelin/contracts-upgradeable/",
    "@openzeppelin/contracts/=node_modules/@openzeppelin/contracts/",
    "@rari-capital/solmate/=node_modules/@rari-capital/solmate/",
    "@cwia/=node_modules/clones-with-immutable-args/src/",
    "forge-std/=node_modules/forge-std/src/",
    "ds-test/=node_modules/ds-test/src/",
    "clones-with-immutable-args/=node_modules/clones-with-immutable-args/"
  ],
  "optimizer": {
    "enabled": true,
    "runs": 10000
  },
  "metadata": {
    "useLiteralContent": false,
    "bytecodeHash": "none"
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "abi"
      ]
    }
  },
  "evmVersion": "london",
  "libraries": {}
}

Contract Security Audit

Contract ABI

API
[{"inputs":[],"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"}]

608060405234801561001057600080fd5b50600436106101775760003560e01c806370a08231116100d8578063ae1f6aaf1161008c578063dd62ed3e11610066578063dd62ed3e1461033f578063e78cea92146102f3578063ee9a31a21461038557600080fd5b8063ae1f6aaf146102f3578063c01e1bd614610319578063d6c0b2c41461031957600080fd5b80639dc29fac116100bd5780639dc29fac146102ba578063a457c2d7146102cd578063a9059cbb146102e057600080fd5b806370a082311461027c57806395d89b41146102b257600080fd5b806323b872dd1161012f5780633950935111610114578063395093511461024c57806340c10f191461025f57806354fd4d501461027457600080fd5b806323b872dd1461022a578063313ce5671461023d57600080fd5b806306fdde031161016057806306fdde03146101f0578063095ea7b31461020557806318160ddd1461021857600080fd5b806301ffc9a71461017c578063033964be146101a4575b600080fd5b61018f61018a3660046111a8565b6103ac565b60405190151581526020015b60405180910390f35b6101cb7f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161019b565b6101f861049d565b60405161019b919061121d565b61018f610213366004611297565b61052f565b6002545b60405190815260200161019b565b61018f6102383660046112c1565b610547565b6040516012815260200161019b565b61018f61025a366004611297565b61056b565b61027261026d366004611297565b6105b7565b005b6101f86106b6565b61021c61028a3660046112fd565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205490565b6101f8610759565b6102726102c8366004611297565b610768565b61018f6102db366004611297565b610869565b61018f6102ee366004611297565b61093a565b7f00000000000000000000000042000000000000000000000000000000000000106101cb565b7f00000000000000000000000000000000000000000000000000000000000000006101cb565b61021c61034d366004611318565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260016020908152604080832093909416825291909152205490565b6101cb7f000000000000000000000000420000000000000000000000000000000000001081565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007f1d1d8b63000000000000000000000000000000000000000000000000000000007fec4fc8e3000000000000000000000000000000000000000000000000000000007fffffffff00000000000000000000000000000000000000000000000000000000851683148061046557507fffffffff00000000000000000000000000000000000000000000000000000000858116908316145b8061049457507fffffffff00000000000000000000000000000000000000000000000000000000858116908216145b95945050505050565b6060600380546104ac9061134b565b80601f01602080910402602001604051908101604052809291908181526020018280546104d89061134b565b80156105255780601f106104fa57610100808354040283529160200191610525565b820191906000526020600020905b81548152906001019060200180831161050857829003601f168201915b5050505050905090565b60003361053d818585610948565b5060019392505050565b600033610555858285610afc565b610560858585610bd3565b506001949350505050565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8716845290915281205490919061053d90829086906105b29087906113cd565b610948565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152609560248201527f42564d5f4554483a206d696e742069732064697361626c6564206279206e6f7260448201527f6d616c20636f6e74726163742063616c6c696e672e2042564d5f455448206d6960648201527f6e742063616e206f6e6c792062652074726967676572656420696e206465706f60848201527f736974207472616e73616374696f6e20657865637574696f6e2c2073696d696c60a48201527f617220746f204d4e54206d696e74206f6e204c322e000000000000000000000060c482015260e4015b60405180910390fd5b60606106e17f0000000000000000000000000000000000000000000000000000000000000001610e86565b61070a7f0000000000000000000000000000000000000000000000000000000000000000610e86565b6107337f0000000000000000000000000000000000000000000000000000000000000000610e86565b604051602001610745939291906113e5565b604051602081830303815290604052905090565b6060600480546104ac9061134b565b337342000000000000000000000000000000000000161461080b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603460248201527f4f7074696d69736d4d696e7461626c6545524332303a206f6e6c79204c324d6560448201527f73736167655061737365722063616e206275726e00000000000000000000000060648201526084016106ad565b6108158282610fc3565b8173ffffffffffffffffffffffffffffffffffffffff167fcc16f5dbb4873280815c1ee09dbd06736cffcc184412cf7a71a0fdb75d397ca58260405161085d91815260200190565b60405180910390a25050565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091528120549091908381101561092d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f00000000000000000000000000000000000000000000000000000060648201526084016106ad565b6105608286868403610948565b60003361053d818585610bd3565b73ffffffffffffffffffffffffffffffffffffffff83166109ea576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f726573730000000000000000000000000000000000000000000000000000000060648201526084016106ad565b73ffffffffffffffffffffffffffffffffffffffff8216610a8d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f737300000000000000000000000000000000000000000000000000000000000060648201526084016106ad565b73ffffffffffffffffffffffffffffffffffffffff83811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff8381166000908152600160209081526040808320938616835292905220547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114610bcd5781811015610bc0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e636500000060448201526064016106ad565b610bcd8484848403610948565b50505050565b73ffffffffffffffffffffffffffffffffffffffff8316610c76576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f647265737300000000000000000000000000000000000000000000000000000060648201526084016106ad565b73ffffffffffffffffffffffffffffffffffffffff8216610d19576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f657373000000000000000000000000000000000000000000000000000000000060648201526084016106ad565b73ffffffffffffffffffffffffffffffffffffffff831660009081526020819052604090205481811015610dcf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e6365000000000000000000000000000000000000000000000000000060648201526084016106ad565b73ffffffffffffffffffffffffffffffffffffffff808516600090815260208190526040808220858503905591851681529081208054849290610e139084906113cd565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051610e7991815260200190565b60405180910390a3610bcd565b606081600003610ec957505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b8115610ef35780610edd8161145b565b9150610eec9050600a836114c2565b9150610ecd565b60008167ffffffffffffffff811115610f0e57610f0e6114d6565b6040519080825280601f01601f191660200182016040528015610f38576020820181803683370190505b5090505b8415610fbb57610f4d600183611505565b9150610f5a600a8661151c565b610f659060306113cd565b60f81b818381518110610f7a57610f7a611530565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350610fb4600a866114c2565b9450610f3c565b949350505050565b73ffffffffffffffffffffffffffffffffffffffff8216611066576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f730000000000000000000000000000000000000000000000000000000000000060648201526084016106ad565b73ffffffffffffffffffffffffffffffffffffffff82166000908152602081905260409020548181101561111c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f636500000000000000000000000000000000000000000000000000000000000060648201526084016106ad565b73ffffffffffffffffffffffffffffffffffffffff83166000908152602081905260408120838303905560028054849290611158908490611505565b909155505060405182815260009073ffffffffffffffffffffffffffffffffffffffff8516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90602001610aef565b6000602082840312156111ba57600080fd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146111ea57600080fd5b9392505050565b60005b8381101561120c5781810151838201526020016111f4565b83811115610bcd5750506000910152565b602081526000825180602084015261123c8160408501602087016111f1565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169190910160400192915050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461129257600080fd5b919050565b600080604083850312156112aa57600080fd5b6112b38361126e565b946020939093013593505050565b6000806000606084860312156112d657600080fd5b6112df8461126e565b92506112ed6020850161126e565b9150604084013590509250925092565b60006020828403121561130f57600080fd5b6111ea8261126e565b6000806040838503121561132b57600080fd5b6113348361126e565b91506113426020840161126e565b90509250929050565b600181811c9082168061135f57607f821691505b602082108103611398577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600082198211156113e0576113e061139e565b500190565b600084516113f78184602089016111f1565b80830190507f2e000000000000000000000000000000000000000000000000000000000000008082528551611433816001850160208a016111f1565b6001920191820152835161144e8160028401602088016111f1565b0160020195945050505050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361148c5761148c61139e565b5060010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000826114d1576114d1611493565b500490565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000828210156115175761151761139e565b500390565b60008261152b5761152b611493565b500690565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fdfea164736f6c634300080f000a

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101775760003560e01c806370a08231116100d8578063ae1f6aaf1161008c578063dd62ed3e11610066578063dd62ed3e1461033f578063e78cea92146102f3578063ee9a31a21461038557600080fd5b8063ae1f6aaf146102f3578063c01e1bd614610319578063d6c0b2c41461031957600080fd5b80639dc29fac116100bd5780639dc29fac146102ba578063a457c2d7146102cd578063a9059cbb146102e057600080fd5b806370a082311461027c57806395d89b41146102b257600080fd5b806323b872dd1161012f5780633950935111610114578063395093511461024c57806340c10f191461025f57806354fd4d501461027457600080fd5b806323b872dd1461022a578063313ce5671461023d57600080fd5b806306fdde031161016057806306fdde03146101f0578063095ea7b31461020557806318160ddd1461021857600080fd5b806301ffc9a71461017c578063033964be146101a4575b600080fd5b61018f61018a3660046111a8565b6103ac565b60405190151581526020015b60405180910390f35b6101cb7f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161019b565b6101f861049d565b60405161019b919061121d565b61018f610213366004611297565b61052f565b6002545b60405190815260200161019b565b61018f6102383660046112c1565b610547565b6040516012815260200161019b565b61018f61025a366004611297565b61056b565b61027261026d366004611297565b6105b7565b005b6101f86106b6565b61021c61028a3660046112fd565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205490565b6101f8610759565b6102726102c8366004611297565b610768565b61018f6102db366004611297565b610869565b61018f6102ee366004611297565b61093a565b7f00000000000000000000000042000000000000000000000000000000000000106101cb565b7f00000000000000000000000000000000000000000000000000000000000000006101cb565b61021c61034d366004611318565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260016020908152604080832093909416825291909152205490565b6101cb7f000000000000000000000000420000000000000000000000000000000000001081565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007f1d1d8b63000000000000000000000000000000000000000000000000000000007fec4fc8e3000000000000000000000000000000000000000000000000000000007fffffffff00000000000000000000000000000000000000000000000000000000851683148061046557507fffffffff00000000000000000000000000000000000000000000000000000000858116908316145b8061049457507fffffffff00000000000000000000000000000000000000000000000000000000858116908216145b95945050505050565b6060600380546104ac9061134b565b80601f01602080910402602001604051908101604052809291908181526020018280546104d89061134b565b80156105255780601f106104fa57610100808354040283529160200191610525565b820191906000526020600020905b81548152906001019060200180831161050857829003601f168201915b5050505050905090565b60003361053d818585610948565b5060019392505050565b600033610555858285610afc565b610560858585610bd3565b506001949350505050565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8716845290915281205490919061053d90829086906105b29087906113cd565b610948565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152609560248201527f42564d5f4554483a206d696e742069732064697361626c6564206279206e6f7260448201527f6d616c20636f6e74726163742063616c6c696e672e2042564d5f455448206d6960648201527f6e742063616e206f6e6c792062652074726967676572656420696e206465706f60848201527f736974207472616e73616374696f6e20657865637574696f6e2c2073696d696c60a48201527f617220746f204d4e54206d696e74206f6e204c322e000000000000000000000060c482015260e4015b60405180910390fd5b60606106e17f0000000000000000000000000000000000000000000000000000000000000001610e86565b61070a7f0000000000000000000000000000000000000000000000000000000000000000610e86565b6107337f0000000000000000000000000000000000000000000000000000000000000000610e86565b604051602001610745939291906113e5565b604051602081830303815290604052905090565b6060600480546104ac9061134b565b337342000000000000000000000000000000000000161461080b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603460248201527f4f7074696d69736d4d696e7461626c6545524332303a206f6e6c79204c324d6560448201527f73736167655061737365722063616e206275726e00000000000000000000000060648201526084016106ad565b6108158282610fc3565b8173ffffffffffffffffffffffffffffffffffffffff167fcc16f5dbb4873280815c1ee09dbd06736cffcc184412cf7a71a0fdb75d397ca58260405161085d91815260200190565b60405180910390a25050565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091528120549091908381101561092d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f00000000000000000000000000000000000000000000000000000060648201526084016106ad565b6105608286868403610948565b60003361053d818585610bd3565b73ffffffffffffffffffffffffffffffffffffffff83166109ea576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f726573730000000000000000000000000000000000000000000000000000000060648201526084016106ad565b73ffffffffffffffffffffffffffffffffffffffff8216610a8d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f737300000000000000000000000000000000000000000000000000000000000060648201526084016106ad565b73ffffffffffffffffffffffffffffffffffffffff83811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff8381166000908152600160209081526040808320938616835292905220547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114610bcd5781811015610bc0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e636500000060448201526064016106ad565b610bcd8484848403610948565b50505050565b73ffffffffffffffffffffffffffffffffffffffff8316610c76576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f647265737300000000000000000000000000000000000000000000000000000060648201526084016106ad565b73ffffffffffffffffffffffffffffffffffffffff8216610d19576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f657373000000000000000000000000000000000000000000000000000000000060648201526084016106ad565b73ffffffffffffffffffffffffffffffffffffffff831660009081526020819052604090205481811015610dcf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e6365000000000000000000000000000000000000000000000000000060648201526084016106ad565b73ffffffffffffffffffffffffffffffffffffffff808516600090815260208190526040808220858503905591851681529081208054849290610e139084906113cd565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051610e7991815260200190565b60405180910390a3610bcd565b606081600003610ec957505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b8115610ef35780610edd8161145b565b9150610eec9050600a836114c2565b9150610ecd565b60008167ffffffffffffffff811115610f0e57610f0e6114d6565b6040519080825280601f01601f191660200182016040528015610f38576020820181803683370190505b5090505b8415610fbb57610f4d600183611505565b9150610f5a600a8661151c565b610f659060306113cd565b60f81b818381518110610f7a57610f7a611530565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350610fb4600a866114c2565b9450610f3c565b949350505050565b73ffffffffffffffffffffffffffffffffffffffff8216611066576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f730000000000000000000000000000000000000000000000000000000000000060648201526084016106ad565b73ffffffffffffffffffffffffffffffffffffffff82166000908152602081905260409020548181101561111c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f636500000000000000000000000000000000000000000000000000000000000060648201526084016106ad565b73ffffffffffffffffffffffffffffffffffffffff83166000908152602081905260408120838303905560028054849290611158908490611505565b909155505060405182815260009073ffffffffffffffffffffffffffffffffffffffff8516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90602001610aef565b6000602082840312156111ba57600080fd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146111ea57600080fd5b9392505050565b60005b8381101561120c5781810151838201526020016111f4565b83811115610bcd5750506000910152565b602081526000825180602084015261123c8160408501602087016111f1565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169190910160400192915050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461129257600080fd5b919050565b600080604083850312156112aa57600080fd5b6112b38361126e565b946020939093013593505050565b6000806000606084860312156112d657600080fd5b6112df8461126e565b92506112ed6020850161126e565b9150604084013590509250925092565b60006020828403121561130f57600080fd5b6111ea8261126e565b6000806040838503121561132b57600080fd5b6113348361126e565b91506113426020840161126e565b90509250929050565b600181811c9082168061135f57607f821691505b602082108103611398577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600082198211156113e0576113e061139e565b500190565b600084516113f78184602089016111f1565b80830190507f2e000000000000000000000000000000000000000000000000000000000000008082528551611433816001850160208a016111f1565b6001920191820152835161144e8160028401602088016111f1565b0160020195945050505050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361148c5761148c61139e565b5060010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000826114d1576114d1611493565b500490565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000828210156115175761151761139e565b500390565b60008261152b5761152b611493565b500690565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fdfea164736f6c634300080f000a

Deployed Bytecode Sourcemap

430:1348:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3519:511:3;;;;;;:::i;:::-;;:::i;:::-;;;516:14:11;;509:22;491:41;;479:2;464:18;3519:511:3;;;;;;;;1023:37;;;;;;;;719:42:11;707:55;;;689:74;;677:2;662:18;1023:37:3;543:226:11;2156:98:5;;;:::i;:::-;;;;;;;:::i;4433:197::-;;;;;;:::i;:::-;;:::i;3244:106::-;3331:12;;3244:106;;;2090:25:11;;;2078:2;2063:18;3244:106:5;1944:177:11;5192:286:5;;;;;;:::i;:::-;;:::i;3093:91::-;;;3175:2;2601:36:11;;2589:2;2574:18;3093:91:5;2459:184:11;5873:234:5;;;;;;:::i;:::-;;:::i;844:272:0:-;;;;;;:::i;:::-;;:::i;:::-;;1057:372:4;;;:::i;3408:125:5:-;;;;;;:::i;:::-;3508:18;;3482:7;3508:18;;;;;;;;;;;;3408:125;2367:102;;;:::i;1582:194:0:-;;;;;;:::i;:::-;;:::i;6594:427:5:-;;;;;;:::i;:::-;;:::i;3729:189::-;;;;;;:::i;:::-;;:::i;4357:80:3:-;4424:6;4357:80;;4157:85;4223:12;4157:85;;3976:149:5;;;;;;:::i;:::-;4091:18;;;;4065:7;4091:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;3976:149;1145:31:3;;;;;3519:511;3590:4;3622:25;3739:38;3892:40;3949:22;;;;;;:48;;-1:-1:-1;3975:22:3;;;;;;;;3949:48;:74;;;-1:-1:-1;4001:22:3;;;;;;;;3949:74;3942:81;3519:511;-1:-1:-1;;;;;3519:511:3:o;2156:98:5:-;2210:13;2242:5;2235:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2156:98;:::o;4433:197::-;4516:4;719:10:8;4570:32:5;719:10:8;4586:7:5;4595:6;4570:8;:32::i;:::-;-1:-1:-1;4619:4:5;;4433:197;-1:-1:-1;;;4433:197:5:o;5192:286::-;5319:4;719:10:8;5375:38:5;5391:4;719:10:8;5406:6:5;5375:15;:38::i;:::-;5423:27;5433:4;5439:2;5443:6;5423:9;:27::i;:::-;-1:-1:-1;5467:4:5;;5192:286;-1:-1:-1;;;;5192:286:5:o;5873:234::-;719:10:8;5961:4:5;4091:18;;;:11;:18;;;;;;;;;:27;;;;;;;;;;5961:4;;719:10:8;6015:64:5;;719:10:8;;4091:27:5;;6040:38;;6068:10;;6040:38;:::i;:::-;6015:8;:64::i;844:272:0:-;950:159;;;;;4070:2:11;950:159:0;;;4052:21:11;4109:3;4089:18;;;4082:31;4149:34;4129:18;;;4122:62;4220:34;4200:18;;;4193:62;4292:34;4271:19;;;4264:63;4364:34;4343:19;;;4336:63;4436:23;4415:19;;;4408:52;4477:19;;950:159:0;;;;;;;;1057:372:4;1097:13;1203:31;1220:13;1203:16;:31::i;:::-;1281;1298:13;1281:16;:31::i;:::-;1359;1376:13;1359:16;:31::i;:::-;1165:243;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;1122:300;;1057:372;:::o;2367:102:5:-;2423:13;2455:7;2448:14;;;;;:::i;1582:194:0:-;1259:10;484:42:1;1259:48:0;1251:113;;;;;;;5674:2:11;1251:113:0;;;5656:21:11;5713:2;5693:18;;;5686:30;5752:34;5732:18;;;5725:62;5823:22;5803:18;;;5796:50;5863:19;;1251:113:0;5472:416:11;1251:113:0;1713:21:::1;1719:5;1726:7;1713:5;:21::i;:::-;1754:5;1749:20;;;1761:7;1749:20;;;;2090:25:11::0;;2078:2;2063:18;;1944:177;1749:20:0::1;;;;;;;;1582:194:::0;;:::o;6594:427:5:-;719:10:8;6687:4:5;4091:18;;;:11;:18;;;;;;;;;:27;;;;;;;;;;6687:4;;719:10:8;6831:15:5;6811:16;:35;;6803:85;;;;;;;6095:2:11;6803:85:5;;;6077:21:11;6134:2;6114:18;;;6107:30;6173:34;6153:18;;;6146:62;6244:7;6224:18;;;6217:35;6269:19;;6803:85:5;5893:401:11;6803:85:5;6922:60;6931:5;6938:7;6966:15;6947:16;:34;6922:8;:60::i;3729:189::-;3808:4;719:10:8;3862:28:5;719:10:8;3879:2:5;3883:6;3862:9;:28::i;10110:370::-;10241:19;;;10233:68;;;;;;;6501:2:11;10233:68:5;;;6483:21:11;6540:2;6520:18;;;6513:30;6579:34;6559:18;;;6552:62;6650:6;6630:18;;;6623:34;6674:19;;10233:68:5;6299:400:11;10233:68:5;10319:21;;;10311:68;;;;;;;6906:2:11;10311:68:5;;;6888:21:11;6945:2;6925:18;;;6918:30;6984:34;6964:18;;;6957:62;7055:4;7035:18;;;7028:32;7077:19;;10311:68:5;6704:398:11;10311:68:5;10390:18;;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;10441:32;;2090:25:11;;;10441:32:5;;2063:18:11;10441:32:5;;;;;;;;10110:370;;;:::o;10761:441::-;4091:18;;;;10891:24;4091:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;10977:17;10957:37;;10953:243;;11038:6;11018:16;:26;;11010:68;;;;;;;7309:2:11;11010:68:5;;;7291:21:11;7348:2;7328:18;;;7321:30;7387:31;7367:18;;;7360:59;7436:18;;11010:68:5;7107:353:11;11010:68:5;11120:51;11129:5;11136:7;11164:6;11145:16;:25;11120:8;:51::i;:::-;10881:321;10761:441;;;:::o;7475:651::-;7601:18;;;7593:68;;;;;;;7667:2:11;7593:68:5;;;7649:21:11;7706:2;7686:18;;;7679:30;7745:34;7725:18;;;7718:62;7816:7;7796:18;;;7789:35;7841:19;;7593:68:5;7465:401:11;7593:68:5;7679:16;;;7671:64;;;;;;;8073:2:11;7671:64:5;;;8055:21:11;8112:2;8092:18;;;8085:30;8151:34;8131:18;;;8124:62;8222:5;8202:18;;;8195:33;8245:19;;7671:64:5;7871:399:11;7671:64:5;7817:15;;;7795:19;7817:15;;;;;;;;;;;7850:21;;;;7842:72;;;;;;;8477:2:11;7842:72:5;;;8459:21:11;8516:2;8496:18;;;8489:30;8555:34;8535:18;;;8528:62;8626:8;8606:18;;;8599:36;8652:19;;7842:72:5;8275:402:11;7842:72:5;7948:15;;;;:9;:15;;;;;;;;;;;7966:20;;;7948:38;;8006:13;;;;;;;;:23;;7980:6;;7948:9;8006:23;;7980:6;;8006:23;:::i;:::-;;;;;;;;8060:2;8045:26;;8054:4;8045:26;;;8064:6;8045:26;;;;2090:25:11;;2078:2;2063:18;;1944:177;8045:26:5;;;;;;;;8082:37;9111:576;392:703:9;448:13;665:5;674:1;665:10;661:51;;-1:-1:-1;;691:10:9;;;;;;;;;;;;;;;;;;392:703::o;661:51::-;736:5;721:12;775:75;782:9;;775:75;;807:8;;;;:::i;:::-;;-1:-1:-1;829:10:9;;-1:-1:-1;837:2:9;829:10;;:::i;:::-;;;775:75;;;859:19;891:6;881:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;881:17:9;;859:39;;908:150;915:10;;908:150;;941:11;951:1;941:11;;:::i;:::-;;-1:-1:-1;1009:10:9;1017:2;1009:5;:10;:::i;:::-;996:24;;:2;:24;:::i;:::-;983:39;;966:6;973;966:14;;;;;;;;:::i;:::-;;;;:56;;;;;;;;;;-1:-1:-1;1036:11:9;1045:2;1036:11;;:::i;:::-;;;908:150;;;1081:6;392:703;-1:-1:-1;;;;392:703:9:o;9111:576:5:-;9194:21;;;9186:67;;;;;;;10023:2:11;9186:67:5;;;10005:21:11;10062:2;10042:18;;;10035:30;10101:34;10081:18;;;10074:62;10172:3;10152:18;;;10145:31;10193:19;;9186:67:5;9821:397:11;9186:67:5;9349:18;;;9324:22;9349:18;;;;;;;;;;;9385:24;;;;9377:71;;;;;;;10425:2:11;9377:71:5;;;10407:21:11;10464:2;10444:18;;;10437:30;10503:34;10483:18;;;10476:62;10574:4;10554:18;;;10547:32;10596:19;;9377:71:5;10223:398:11;9377:71:5;9482:18;;;:9;:18;;;;;;;;;;9503:23;;;9482:44;;9546:12;:22;;9520:6;;9482:9;9546:22;;9520:6;;9546:22;:::i;:::-;;;;-1:-1:-1;;9584:37:5;;2090:25:11;;;9610:1:5;;9584:37;;;;;;2078:2:11;2063:18;9584:37:5;1944:177:11;14:332;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:11: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:11;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:11:o;1484:196::-;1552:20;;1612:42;1601:54;;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:11: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;;3391:77;3388:1;3381:88;3492:4;3489:1;3482:15;3520:4;3517:1;3510:15;3317:218;;3104:437;;;:::o;3546:184::-;3598:77;3595:1;3588:88;3695:4;3692:1;3685:15;3719:4;3716:1;3709:15;3735:128;3775:3;3806:1;3802:6;3799:1;3796:13;3793:39;;;3812:18;;:::i;:::-;-1:-1:-1;3848:9:11;;3735:128::o;4507:960::-;4936:3;4974:6;4968:13;4990:53;5036:6;5031:3;5024:4;5016:6;5012:17;4990:53;:::i;:::-;5074:6;5069:3;5065:16;5052:29;;5100:3;5126:2;5119:5;5112:17;5160:6;5154:13;5176:65;5232:8;5228:1;5221:5;5217:13;5210:4;5202:6;5198:17;5176:65;:::i;:::-;5304:1;5260:20;;5296:10;;;5289:22;5336:13;;5358:62;5336:13;5407:1;5399:10;;5392:4;5380:17;;5358:62;:::i;:::-;5440:17;5459:1;5436:25;;4507:960;-1:-1:-1;;;;;4507:960:11:o;8682:195::-;8721:3;8752:66;8745:5;8742:77;8739:103;;8822:18;;:::i;:::-;-1:-1:-1;8869:1:11;8858:13;;8682:195::o;8882:184::-;8934:77;8931:1;8924:88;9031:4;9028:1;9021:15;9055:4;9052:1;9045:15;9071:120;9111:1;9137;9127:35;;9142:18;;:::i;:::-;-1:-1:-1;9176:9:11;;9071:120::o;9196:184::-;9248:77;9245:1;9238:88;9345:4;9342:1;9335:15;9369:4;9366:1;9359:15;9385:125;9425:4;9453:1;9450;9447:8;9444:34;;;9458:18;;:::i;:::-;-1:-1:-1;9495:9:11;;9385:125::o;9515:112::-;9547:1;9573;9563:35;;9578:18;;:::i;:::-;-1:-1:-1;9612:9:11;;9515:112::o;9632:184::-;9684:77;9681:1;9674:88;9781:4;9778:1;9771:15;9805:4;9802:1;9795:15

Swarm Source

none

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
[ Download: CSV Export  ]
[ 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.