ETH Price: $3,501.56 (+2.82%)

Token

BitBTC (BitBTC)

Overview

Max Total Supply

368,677.2602 BitBTC

Holders

206

Total Transfers

-

Market

Price

$0.00 @ 0.000000 ETH

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

To solve the problems of the high price of BTC and slow transfer speed, We propose a solution to split BTC into BitBTC on the Ethereum through smart contracts, that is,1BTC = 1 million BitBTC. Has faster transfer speed, lower transfer fees, more suitable for micropayment.

Contract Source Code Verified (Exact Match)

Contract Name:
BitBTCOptimism

Compiler Version
v0.8.4+commit.c7e474f2

Optimization Enabled:
Yes with 200 runs

Other Settings:
istanbul EvmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at optimistic.etherscan.io on 2021-11-26
*/

pragma solidity ^0.8.0;

// SPDX-License-Identifier: MIT



/**
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }
}



/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @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 `recipient`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address recipient, 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 `sender` to `recipient` 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 sender,
        address recipient,
        uint256 amount
    ) external returns (bool);

    /**
     * @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 Interface for the optional metadata functions from the ERC20 standard.
 *
 * _Available since v4.1._
 */
interface IERC20Metadata is IERC20 {
    /**
     * @dev Returns the name of the token.
     */
    function name() external view returns (string memory);

    /**
     * @dev Returns the symbol of the token.
     */
    function symbol() external view returns (string memory);

    /**
     * @dev Returns the decimals places of the token.
     */
    function decimals() external view returns (uint8);
}

/**
 * @dev 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:
     *
     * - `recipient` cannot be the zero address.
     * - the caller must have a balance of at least `amount`.
     */
    function transfer(address recipient, uint256 amount) public virtual override returns (bool) {
        _transfer(_msgSender(), recipient, 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}.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function approve(address spender, uint256 amount) public virtual override returns (bool) {
        _approve(_msgSender(), 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}.
     *
     * Requirements:
     *
     * - `sender` and `recipient` cannot be the zero address.
     * - `sender` must have a balance of at least `amount`.
     * - the caller must have allowance for ``sender``'s tokens of at least
     * `amount`.
     */
    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) public virtual override returns (bool) {
        _transfer(sender, recipient, amount);

        uint256 currentAllowance = _allowances[sender][_msgSender()];
        require(currentAllowance >= amount, "ERC20: transfer amount exceeds allowance");
        unchecked {
            _approve(sender, _msgSender(), currentAllowance - 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) {
        _approve(_msgSender(), spender, _allowances[_msgSender()][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) {
        uint256 currentAllowance = _allowances[_msgSender()][spender];
        require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero");
        unchecked {
            _approve(_msgSender(), spender, currentAllowance - subtractedValue);
        }

        return true;
    }

    /**
     * @dev Moves `amount` of tokens from `sender` to `recipient`.
     *
     * 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:
     *
     * - `sender` cannot be the zero address.
     * - `recipient` cannot be the zero address.
     * - `sender` must have a balance of at least `amount`.
     */
    function _transfer(
        address sender,
        address recipient,
        uint256 amount
    ) internal virtual {
        require(sender != address(0), "ERC20: transfer from the zero address");
        require(recipient != address(0), "ERC20: transfer to the zero address");

        _beforeTokenTransfer(sender, recipient, amount);

        uint256 senderBalance = _balances[sender];
        require(senderBalance >= amount, "ERC20: transfer amount exceeds balance");
        unchecked {
            _balances[sender] = senderBalance - amount;
        }
        _balances[recipient] += amount;

        emit Transfer(sender, recipient, amount);

        _afterTokenTransfer(sender, recipient, 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 Hook that is called before any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * will be transferred to `to`.
     * - when `from` is zero, `amount` tokens will be minted for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens will be burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {}

    /**
     * @dev Hook that is called after any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * has been transferred to `to`.
     * - when `from` is zero, `amount` tokens have been minted for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens have been burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _afterTokenTransfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {}
}





/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

        uint256 size;
        assembly {
            size := extcodesize(account)
        }
        return size > 0;
    }

    /**
     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to
     * `recipient`, forwarding all available gas and reverting on errors.
     *
     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
     * of certain opcodes, possibly making contracts go over the 2300 gas limit
     * imposed by `transfer`, making them unable to receive funds via
     * `transfer`. {sendValue} removes this limitation.
     *
     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
     *
     * IMPORTANT: because control is transferred to `recipient`, care must be
     * taken to not create reentrancy vulnerabilities. Consider using
     * {ReentrancyGuard} or the
     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
     */
    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");

        (bool success, ) = recipient.call{value: amount}("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }

    /**
     * @dev Performs a Solidity function call using a low level `call`. A
     * plain `call` is an unsafe replacement for a function call: use this
     * function instead.
     *
     * If `target` reverts with a revert reason, it is bubbled up by this
     * function (like regular Solidity function calls).
     *
     * Returns the raw returned data. To convert to the expected return value,
     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
     *
     * Requirements:
     *
     * - `target` must be a contract.
     * - calling `target` with `data` must not revert.
     *
     * _Available since v3.1._
     */
    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionCall(target, data, "Address: low-level call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
     * `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but also transferring `value` wei to `target`.
     *
     * Requirements:
     *
     * - the calling contract must have an ETH balance of at least `value`.
     * - the called Solidity function must be `payable`.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
    }

    /**
     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
     * with `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(address(this).balance >= value, "Address: insufficient balance for call");
        require(isContract(target), "Address: call to non-contract");

        (bool success, bytes memory returndata) = target.call{value: value}(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
        return functionStaticCall(target, data, "Address: low-level static call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        require(isContract(target), "Address: static call to non-contract");

        (bool success, bytes memory returndata) = target.staticcall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionDelegateCall(target, data, "Address: low-level delegate call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(isContract(target), "Address: delegate call to non-contract");

        (bool success, bytes memory returndata) = target.delegatecall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason using the provided one.
     *
     * _Available since v4.3._
     */
    function verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

/**
 * @title SafeERC20
 * @dev Wrappers around ERC20 operations that throw on failure (when the token
 * contract returns false). Tokens that return no value (and instead revert or
 * throw on failure) are also supported, non-reverting calls are assumed to be
 * successful.
 * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,
 * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.
 */
library SafeERC20 {
    using Address for address;

    function safeTransfer(
        IERC20 token,
        address to,
        uint256 value
    ) internal {
        _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));
    }

    function safeTransferFrom(
        IERC20 token,
        address from,
        address to,
        uint256 value
    ) internal {
        _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));
    }

    /**
     * @dev Deprecated. This function has issues similar to the ones found in
     * {IERC20-approve}, and its usage is discouraged.
     *
     * Whenever possible, use {safeIncreaseAllowance} and
     * {safeDecreaseAllowance} instead.
     */
    function safeApprove(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        // safeApprove should only be called when setting an initial allowance,
        // or when resetting it to zero. To increase and decrease it, use
        // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'
        require(
            (value == 0) || (token.allowance(address(this), spender) == 0),
            "SafeERC20: approve from non-zero to non-zero allowance"
        );
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));
    }

    function safeIncreaseAllowance(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        uint256 newAllowance = token.allowance(address(this), spender) + value;
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
    }

    function safeDecreaseAllowance(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        unchecked {
            uint256 oldAllowance = token.allowance(address(this), spender);
            require(oldAllowance >= value, "SafeERC20: decreased allowance below zero");
            uint256 newAllowance = oldAllowance - value;
            _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
        }
    }

    /**
     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement
     * on the return value: the return value is optional (but if data is returned, it must not be false).
     * @param token The token targeted by the call.
     * @param data The call data (encoded using abi.encode or one of its variants).
     */
    function _callOptionalReturn(IERC20 token, bytes memory data) private {
        // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since
        // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that
        // the target address contains contract code and also asserts for success in the low-level call.

        bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed");
        if (returndata.length > 0) {
            // Return data is optional
            require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed");
        }
    }
}



interface ISwap {
    event Deposit(address indexed token, address account, uint256 amount);
    event Withdraw(address indexed token, address account, uint256 amount);

    function deposit(address token, uint256 amount) external;
    function withdraw(address token, uint256 amount) external;
}




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

interface IL2StandardERC20 is IERC20, IERC165 {
    function l1Token() external returns (address);
    function mint(address _to, uint256 _amount) external;
    function burn(address _from, uint256 _amount) external;

    event Mint(address indexed _account, uint256 _amount);
    event Burn(address indexed _account, uint256 _amount);
}

contract BitBTCOptimism is Context, ERC20, ISwap, IL2StandardERC20 {
  using SafeERC20 for IERC20;

  enum FeeType {
    Deposit,
    Withdraw
  }

  struct LegalToken {
    address token;
    uint256 ratio;
  }

  uint256 private constant FEE = 5;
  uint256 private constant BASE_RATIO = 1e4;

  bool private _depositFeeOn;
  address private _fund;
  address private _governance;

  LegalToken[] private _legalTokens;
  mapping(address => uint256) private _legalTokenIndexes;

  address private _l2Bridge;
  address private _l1Token;

  event SatoshiNakamotoNFT(string message);
  event ChangeFund(address fund, address governance);
  event ChangeGovernance(address oldGovernance, address newGovernance);
  event DepositFeeOn(address governance);
  event AddLegalToken(address token, uint256 ratio, address governance);

  modifier onlyBridge() {
    require(_msgSender() == _l2Bridge, "BitBTC: only bridge");
    _;
  }

  modifier onlyGovernance() {
    require(_msgSender() == _governance, "BitBTC: not governance");
    _;
  }

  modifier onlyLegalToken(address token) {
    require(_isLegalToken(token), "BitBTC: not legal token");
    _;
  }

  constructor(address l2Bridge_, address l1Token_) ERC20("BitBTC", "BitBTC") {
    _l2Bridge = l2Bridge_;
    _l1Token = l1Token_;

    _governance = _msgSender();

    emit SatoshiNakamotoNFT("Thank you for creating BTC for all mankind, Satoshi Nakamoto.");
  }

  function l1Token() external override view returns (address) {
    return _l1Token;
  }

  function l2Bridge() external view returns (address) {
    return _l2Bridge;
  }

  function fee() external pure returns (uint256) {
    return FEE;
  }

  function depositFeeOn() external view returns (bool) {
    return _depositFeeOn;
  }

  function fund() external view returns (address) {
    return _fund;
  }

  function governance() external view returns (address) {
    return _governance;
  }

  function setFund(address fund_) external onlyGovernance {
    require(fund_ != address(0), "BitBTC: invalid fund");

    _fund = fund_;
    emit ChangeFund(_fund, _msgSender());
  }

  function setDepositFeeOn() external onlyGovernance {
    require(!_depositFeeOn, "BitBTC: deposit fee already on");

    _depositFeeOn = true;

    emit DepositFeeOn(_msgSender());
  }

  function setGovernance(address governance_) external onlyGovernance {
    address old = _governance;
    _governance = governance_;

    emit ChangeGovernance(old, _governance);
  }

  function deposit(address token, uint256 value) external override onlyLegalToken(token) {
    address sender = _msgSender();
    uint256 fee_ = _calcFee(value, FeeType.Deposit);

    address self = address(this);
    uint256 oldBalance = IERC20(token).balanceOf(self);
    IERC20(token).safeTransferFrom(sender, self, value - fee_);
    uint256 actualValue = IERC20(token).balanceOf(self) - oldBalance;

    if(fee_ > 0) {
      IERC20(token).safeTransferFrom(sender, _fund, fee_);
    }

    _mint(sender, actualValue * _getRatio(token));

    emit Deposit(token, sender, value);
  }

  function withdraw(address token, uint256 value) external override onlyLegalToken(token) {
    address sender = _msgSender();
    uint256 fee_ = _calcFee(value, FeeType.Withdraw);
    uint256 actualValue = value - fee_;

    IERC20(token).safeTransfer(sender, actualValue);
    IERC20(token).safeTransfer(_fund, fee_);

    _burn(sender, value * _getRatio(token));

    emit Withdraw(token, sender, value);
  }

  function addLegalToken(address token) external onlyGovernance {
    require(token != address(0), "BitBTC: token invalid");
    require(!_isLegalToken(token), "BitBTC: already exist");

    uint8 decimals = IERC20Metadata(token).decimals();
    require(decimals > 0, "BitBTC: decimals invalid");

    uint256 ratio = _calcRatio(decimals);

    _legalTokens.push(LegalToken(token, ratio));
    _legalTokenIndexes[token] = _legalTokens.length;

    emit AddLegalToken(token, ratio, _msgSender());
  }

  function mint(address to, uint256 amount) external override onlyBridge {
    _mint(to, amount);

    emit Mint(to, amount);
  }

  function burn(address from, uint256 amount) external override onlyBridge {
    _burn(from, amount);

    emit Burn(from, amount);
  }

  function supportsInterface(bytes4 interfaceId) external override pure returns (bool) {
    bytes4 firstSupportedInterface = bytes4(keccak256("supportsInterface(bytes4)"));

    bytes4 secondSupportedInterface = IL2StandardERC20.l1Token.selector
      ^ IL2StandardERC20.mint.selector
      ^ IL2StandardERC20.burn.selector;

    return interfaceId == firstSupportedInterface || interfaceId == secondSupportedInterface;
  }

  function isLegalToken(address token) external view returns (bool) {
    return _isLegalToken(token);
  }

  function legalTokens() external view returns (LegalToken[] memory) {
    return _legalTokens;
  }

  function _calcFee(uint256 value, FeeType feeType) internal view returns (uint256) {
    return (feeType == FeeType.Deposit && !_depositFeeOn) ? 0 : value * FEE / BASE_RATIO;
  }

  function _calcRatio(uint8 decimals_) internal view returns (uint256) {
    return 10 ** (decimals() + 6 - decimals_);
  }

  function _isLegalToken(address token) internal view returns (bool) {
    return _legalTokenIndexes[token] > 0;
  }

  function _getRatio(address token) internal view returns (uint256) {
    return _legalTokens[_legalTokenIndexes[token] - 1].ratio;
  }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"l2Bridge_","type":"address"},{"internalType":"address","name":"l1Token_","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"ratio","type":"uint256"},{"indexed":false,"internalType":"address","name":"governance","type":"address"}],"name":"AddLegalToken","type":"event"},{"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":false,"internalType":"address","name":"fund","type":"address"},{"indexed":false,"internalType":"address","name":"governance","type":"address"}],"name":"ChangeFund","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"oldGovernance","type":"address"},{"indexed":false,"internalType":"address","name":"newGovernance","type":"address"}],"name":"ChangeGovernance","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"governance","type":"address"}],"name":"DepositFeeOn","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":false,"internalType":"string","name":"message","type":"string"}],"name":"SatoshiNakamotoNFT","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"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Withdraw","type":"event"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"addLegalToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"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":"token","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"depositFeeOn","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"fee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"fund","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"governance","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","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":[{"internalType":"address","name":"token","type":"address"}],"name":"isLegalToken","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","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":[],"name":"legalTokens","outputs":[{"components":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"ratio","type":"uint256"}],"internalType":"struct BitBTCOptimism.LegalToken[]","name":"","type":"tuple[]"}],"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":"setDepositFeeOn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"fund_","type":"address"}],"name":"setFund","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"governance_","type":"address"}],"name":"setGovernance","outputs":[],"stateMutability":"nonpayable","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":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040523480156200001157600080fd5b50604051620020af380380620020af833981016040819052620000349162000242565b60408051808201825260068082526542697442544360d01b60208084018281528551808701909652928552840152815191929162000075916003916200017f565b5080516200008b9060049060208401906200017f565b5050600980546001600160a01b038086166001600160a01b031992831617909255600a80549285169290911691909117905550620000c63390565b600680546001600160a01b03929092166001600160a01b03199092169190911790556040517f9ab4821fb9be75a29c908b302633b0cdae9950dfbc28c2a7a0453dec317abfe5906200016f906020808252603d908201527f5468616e6b20796f7520666f72206372656174696e672042544320666f72206160408201527f6c6c206d616e6b696e642c205361746f736869204e616b616d6f746f2e000000606082015260800190565b60405180910390a15050620002b6565b8280546200018d9062000279565b90600052602060002090601f016020900481019282620001b15760008555620001fc565b82601f10620001cc57805160ff1916838001178555620001fc565b82800160010185558215620001fc579182015b82811115620001fc578251825591602001919060010190620001df565b506200020a9291506200020e565b5090565b5b808211156200020a57600081556001016200020f565b80516001600160a01b03811681146200023d57600080fd5b919050565b6000806040838503121562000255578182fd5b620002608362000225565b9150620002706020840162000225565b90509250929050565b600181811c908216806200028e57607f821691505b60208210811415620002b057634e487b7160e01b600052602260045260246000fd5b50919050565b611de980620002c66000396000f3fe608060405234801561001057600080fd5b50600436106101c45760003560e01c8063908c0e15116100f9578063ae1f6aaf11610097578063dd62ed3e11610071578063dd62ed3e146103bb578063ddca3f43146103f4578063f3fef3a3146103fb578063fa65da551461040e57600080fd5b8063ae1f6aaf14610383578063b60d428814610394578063c01e1bd6146103aa57600080fd5b8063a457c2d7116100d3578063a457c2d714610335578063a9059cbb14610348578063ab033ea91461035b578063aba56f7f1461036e57600080fd5b8063908c0e151461030f57806395d89b411461031a5780639dc29fac1461032257600080fd5b8063313ce5671161016657806340c10f191161014057806340c10f191461029b57806347e7ef24146102ae5780635aa6e675146102c157806370a08231146102e657600080fd5b8063313ce5671461026657806335c1ef5214610275578063395093511461028857600080fd5b80630e21750f116101a25780630e21750f1461021957806318160ddd1461022e5780631da06f4d1461024057806323b872dd1461025357600080fd5b806301ffc9a7146101c957806306fdde03146101f1578063095ea7b314610206575b600080fd5b6101dc6101d7366004611a5a565b610416565b60405190151581526020015b60405180910390f35b6101f9610474565b6040516101e89190611b2f565b6101dc610214366004611a11565b610506565b61022c61022736600461198a565b61051d565b005b6002545b6040519081526020016101e8565b61022c61024e36600461198a565b610618565b6101dc6102613660046119d6565b6108b9565b604051601281526020016101e8565b6101dc61028336600461198a565b610965565b6101dc610296366004611a11565b610985565b61022c6102a9366004611a11565b6109c1565b61022c6102bc366004611a11565b610a6b565b6006546001600160a01b03165b6040516001600160a01b0390911681526020016101e8565b6102326102f436600461198a565b6001600160a01b031660009081526020819052604090205490565b60055460ff166101dc565b6101f9610ca0565b61022c610330366004611a11565b610caf565b6101dc610343366004611a11565b610d4d565b6101dc610356366004611a11565b610de6565b61022c61036936600461198a565b610df3565b610376610e87565b6040516101e89190611ad7565b6009546001600160a01b03166102ce565b60055461010090046001600160a01b03166102ce565b600a546001600160a01b03166102ce565b6102326103c93660046119a4565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b6005610232565b61022c610409366004611a11565b610efc565b61022c61101f565b60007f01ffc9a7a5cef8baa21ed3c5c0d7e23accb804b619e9333b597f47a0d84076e2631d1d8b6360e01b6001600160e01b031984166301ffc9a760e01b148061046c57506001600160e01b0319848116908216145b949350505050565b60606003805461048390611d62565b80601f01602080910402602001604051908101604052809291908181526020018280546104af90611d62565b80156104fc5780601f106104d1576101008083540402835291602001916104fc565b820191906000526020600020905b8154815290600101906020018083116104df57829003601f168201915b5050505050905090565b60006105133384846110f7565b5060015b92915050565b6006546001600160a01b0316336001600160a01b0316146105595760405162461bcd60e51b815260040161055090611b62565b60405180910390fd5b6001600160a01b0381166105a65760405162461bcd60e51b8152602060048201526014602482015273109a5d109510ce881a5b9d985b1a5908199d5b9960621b6044820152606401610550565b60058054610100600160a81b0319166101006001600160a01b03848116820292909217928390557f21649757800a534d13bc2b3bcceaf45854bc4d9e3b3e07e2434211320bc0309a92041633604080516001600160a01b0393841681529290911660208301520160405180910390a150565b6006546001600160a01b0316336001600160a01b03161461064b5760405162461bcd60e51b815260040161055090611b62565b6001600160a01b0381166106995760405162461bcd60e51b8152602060048201526015602482015274109a5d109510ce881d1bdad95b881a5b9d985b1a59605a1b6044820152606401610550565b6001600160a01b038116600090815260086020526040902054156106f75760405162461bcd60e51b8152602060048201526015602482015274109a5d109510ce88185b1c9958591e48195e1a5cdd605a1b6044820152606401610550565b6000816001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b15801561073257600080fd5b505afa158015610746573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061076a9190611a9a565b905060008160ff16116107bf5760405162461bcd60e51b815260206004820152601860248201527f4269744254433a20646563696d616c7320696e76616c696400000000000000006044820152606401610550565b60006107ca8261121c565b6040805180820182526001600160a01b03868116808352602080840186815260078054600181018255600082815296517fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c688600290920291820180546001600160a01b031916919097161790955590517fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c68990940193909355915481845260088352928490209290925582519182528101839052338183015290519192507f2ee967151d49b0382c869f2cf02524e4d14a6730fe4309b751c249f6f554d414916060918190039190910190a1505050565b60006108c6848484611240565b6001600160a01b03841660009081526001602090815260408083203384529091529020548281101561094b5760405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e74206578636565647320616044820152676c6c6f77616e636560c01b6064820152608401610550565b61095885338584036110f7565b60019150505b9392505050565b6001600160a01b0381166000908152600860205260408120541515610517565b3360008181526001602090815260408083206001600160a01b038716845290915281205490916105139185906109bc908690611b92565b6110f7565b6009546001600160a01b0316336001600160a01b031614610a1a5760405162461bcd60e51b81526020600482015260136024820152724269744254433a206f6e6c792062726964676560681b6044820152606401610550565b610a248282611410565b816001600160a01b03167f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d412139688582604051610a5f91815260200190565b60405180910390a25050565b81610a8d816001600160a01b0316600090815260086020526040902054151590565b610ad35760405162461bcd60e51b81526020600482015260176024820152762134ba212a219d103737ba103632b3b0b6103a37b5b2b760491b6044820152606401610550565b336000610ae084826114ef565b6040516370a0823160e01b815230600482018190529192506000906001600160a01b038816906370a082319060240160206040518083038186803b158015610b2757600080fd5b505afa158015610b3b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b5f9190611a82565b9050610b828483610b70868a611cfc565b6001600160a01b038b1692919061154c565b6040516370a0823160e01b81526001600160a01b03838116600483015260009183918a16906370a082319060240160206040518083038186803b158015610bc857600080fd5b505afa158015610bdc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c009190611a82565b610c0a9190611cfc565b90508315610c3457600554610c34906001600160a01b038a8116918891610100909104168761154c565b610c5085610c418a6115b7565b610c4b9084611cdd565b611410565b604080516001600160a01b038781168252602082018a90528a16917f5548c837ab068cf56a2c2479df0882a4922fd203edb7517321831d95078c5f62910160405180910390a25050505050505050565b60606004805461048390611d62565b6009546001600160a01b0316336001600160a01b031614610d085760405162461bcd60e51b81526020600482015260136024820152724269744254433a206f6e6c792062726964676560681b6044820152606401610550565b610d128282611616565b816001600160a01b03167fcc16f5dbb4873280815c1ee09dbd06736cffcc184412cf7a71a0fdb75d397ca582604051610a5f91815260200190565b3360009081526001602090815260408083206001600160a01b038616845290915281205482811015610dcf5760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610550565b610ddc33858584036110f7565b5060019392505050565b6000610513338484611240565b6006546001600160a01b0316336001600160a01b031614610e265760405162461bcd60e51b815260040161055090611b62565b600680546001600160a01b038381166001600160a01b031983168117909355604080519190921680825260208201939093527f95b941bbbf1347e24e6cbb14f7553d49f9244dc4dee558b79dcb1fd8b0434fb5910160405180910390a15050565b60606007805480602002602001604051908101604052809291908181526020016000905b82821015610ef3576000848152602090819020604080518082019091526002850290910180546001600160a01b03168252600190810154828401529083529092019101610eab565b50505050905090565b81610f1e816001600160a01b0316600090815260086020526040902054151590565b610f645760405162461bcd60e51b81526020600482015260176024820152762134ba212a219d103737ba103632b3b0b6103a37b5b2b760491b6044820152606401610550565b336000610f728460016114ef565b90506000610f808286611cfc565b9050610f966001600160a01b0387168483611761565b600554610fb5906001600160a01b038881169161010090041684611761565b610fd183610fc2886115b7565b610fcc9088611cdd565b611616565b604080516001600160a01b038581168252602082018890528816917f9b1bfa7fa9ee420a16e124f794c35ac9f90472acc99140eb2f6447c714cad8eb910160405180910390a2505050505050565b6006546001600160a01b0316336001600160a01b0316146110525760405162461bcd60e51b815260040161055090611b62565b60055460ff16156110a55760405162461bcd60e51b815260206004820152601e60248201527f4269744254433a206465706f7369742066656520616c7265616479206f6e00006044820152606401610550565b6005805460ff191660011790557f80dc799625f4bf5c6d0465b40848e20a3a3ab90adb5d92688793306cd41dde876110da3390565b6040516001600160a01b03909116815260200160405180910390a1565b6001600160a01b0383166111595760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610550565b6001600160a01b0382166111ba5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610550565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b60008161122b60126006611baa565b6112359190611d13565b61051790600a611c32565b6001600160a01b0383166112a45760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610550565b6001600160a01b0382166113065760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610550565b6001600160a01b0383166000908152602081905260409020548181101561137e5760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610550565b6001600160a01b038085166000908152602081905260408082208585039055918516815290812080548492906113b5908490611b92565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161140191815260200190565b60405180910390a35b50505050565b6001600160a01b0382166114665760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610550565b80600260008282546114789190611b92565b90915550506001600160a01b038216600090815260208190526040812080548392906114a5908490611b92565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b60008082600181111561151257634e487b7160e01b600052602160045260246000fd5b148015611522575060055460ff16155b61154357612710611534600585611cdd565b61153e9190611bcf565b61095e565b60009392505050565b6040516001600160a01b038085166024830152831660448201526064810182905261140a9085906323b872dd60e01b906084015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152611791565b6001600160a01b0381166000908152600860205260408120546007906115df90600190611cfc565b815481106115fd57634e487b7160e01b600052603260045260246000fd5b9060005260206000209060020201600101549050919050565b6001600160a01b0382166116765760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b6064820152608401610550565b6001600160a01b038216600090815260208190526040902054818110156116ea5760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b6064820152608401610550565b6001600160a01b0383166000908152602081905260408120838303905560028054849290611719908490611cfc565b90915550506040518281526000906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200161120f565b505050565b6040516001600160a01b03831660248201526044810182905261175c90849063a9059cbb60e01b90606401611580565b60006117e6826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166118639092919063ffffffff16565b80519091501561175c57808060200190518101906118049190611a3a565b61175c5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610550565b606061046c848460008585843b6118bc5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610550565b600080866001600160a01b031685876040516118d89190611abb565b60006040518083038185875af1925050503d8060008114611915576040519150601f19603f3d011682016040523d82523d6000602084013e61191a565b606091505b509150915061192a828286611935565b979650505050505050565b6060831561194457508161095e565b8251156119545782518084602001fd5b8160405162461bcd60e51b81526004016105509190611b2f565b80356001600160a01b038116811461198557600080fd5b919050565b60006020828403121561199b578081fd5b61095e8261196e565b600080604083850312156119b6578081fd5b6119bf8361196e565b91506119cd6020840161196e565b90509250929050565b6000806000606084860312156119ea578081fd5b6119f38461196e565b9250611a016020850161196e565b9150604084013590509250925092565b60008060408385031215611a23578182fd5b611a2c8361196e565b946020939093013593505050565b600060208284031215611a4b578081fd5b8151801515811461095e578182fd5b600060208284031215611a6b578081fd5b81356001600160e01b03198116811461095e578182fd5b600060208284031215611a93578081fd5b5051919050565b600060208284031215611aab578081fd5b815160ff8116811461095e578182fd5b60008251611acd818460208701611d36565b9190910192915050565b602080825282518282018190526000919060409081850190868401855b82811015611b2257815180516001600160a01b03168552860151868501529284019290850190600101611af4565b5091979650505050505050565b6020815260008251806020840152611b4e816040850160208701611d36565b601f01601f19169190910160400192915050565b6020808252601690820152754269744254433a206e6f7420676f7665726e616e636560501b604082015260600190565b60008219821115611ba557611ba5611d9d565b500190565b600060ff821660ff84168060ff03821115611bc757611bc7611d9d565b019392505050565b600082611bea57634e487b7160e01b81526012600452602481fd5b500490565b600181815b80851115611c2a578160001904821115611c1057611c10611d9d565b80851615611c1d57918102915b93841c9390800290611bf4565b509250929050565b600061095e60ff841683600082611c4b57506001610517565b81611c5857506000610517565b8160018114611c6e5760028114611c7857611c94565b6001915050610517565b60ff841115611c8957611c89611d9d565b50506001821b610517565b5060208310610133831016604e8410600b8410161715611cb7575081810a610517565b611cc18383611bef565b8060001904821115611cd557611cd5611d9d565b029392505050565b6000816000190483118215151615611cf757611cf7611d9d565b500290565b600082821015611d0e57611d0e611d9d565b500390565b600060ff821660ff841680821015611d2d57611d2d611d9d565b90039392505050565b60005b83811015611d51578181015183820152602001611d39565b8381111561140a5750506000910152565b600181811c90821680611d7657607f821691505b60208210811415611d9757634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fdfea264697066735822122049367d6c181853a8427cfe45c5aaf9d52f9b0dea29feb121518f4ac7cd9cea1f64736f6c63430008040033000000000000000000000000158f513096923ff2d3aab2bcf4478536de6725e20000000000000000000000003c513db8bdc3806e4489d62c3d549a5aaf6a4e97

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101c45760003560e01c8063908c0e15116100f9578063ae1f6aaf11610097578063dd62ed3e11610071578063dd62ed3e146103bb578063ddca3f43146103f4578063f3fef3a3146103fb578063fa65da551461040e57600080fd5b8063ae1f6aaf14610383578063b60d428814610394578063c01e1bd6146103aa57600080fd5b8063a457c2d7116100d3578063a457c2d714610335578063a9059cbb14610348578063ab033ea91461035b578063aba56f7f1461036e57600080fd5b8063908c0e151461030f57806395d89b411461031a5780639dc29fac1461032257600080fd5b8063313ce5671161016657806340c10f191161014057806340c10f191461029b57806347e7ef24146102ae5780635aa6e675146102c157806370a08231146102e657600080fd5b8063313ce5671461026657806335c1ef5214610275578063395093511461028857600080fd5b80630e21750f116101a25780630e21750f1461021957806318160ddd1461022e5780631da06f4d1461024057806323b872dd1461025357600080fd5b806301ffc9a7146101c957806306fdde03146101f1578063095ea7b314610206575b600080fd5b6101dc6101d7366004611a5a565b610416565b60405190151581526020015b60405180910390f35b6101f9610474565b6040516101e89190611b2f565b6101dc610214366004611a11565b610506565b61022c61022736600461198a565b61051d565b005b6002545b6040519081526020016101e8565b61022c61024e36600461198a565b610618565b6101dc6102613660046119d6565b6108b9565b604051601281526020016101e8565b6101dc61028336600461198a565b610965565b6101dc610296366004611a11565b610985565b61022c6102a9366004611a11565b6109c1565b61022c6102bc366004611a11565b610a6b565b6006546001600160a01b03165b6040516001600160a01b0390911681526020016101e8565b6102326102f436600461198a565b6001600160a01b031660009081526020819052604090205490565b60055460ff166101dc565b6101f9610ca0565b61022c610330366004611a11565b610caf565b6101dc610343366004611a11565b610d4d565b6101dc610356366004611a11565b610de6565b61022c61036936600461198a565b610df3565b610376610e87565b6040516101e89190611ad7565b6009546001600160a01b03166102ce565b60055461010090046001600160a01b03166102ce565b600a546001600160a01b03166102ce565b6102326103c93660046119a4565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b6005610232565b61022c610409366004611a11565b610efc565b61022c61101f565b60007f01ffc9a7a5cef8baa21ed3c5c0d7e23accb804b619e9333b597f47a0d84076e2631d1d8b6360e01b6001600160e01b031984166301ffc9a760e01b148061046c57506001600160e01b0319848116908216145b949350505050565b60606003805461048390611d62565b80601f01602080910402602001604051908101604052809291908181526020018280546104af90611d62565b80156104fc5780601f106104d1576101008083540402835291602001916104fc565b820191906000526020600020905b8154815290600101906020018083116104df57829003601f168201915b5050505050905090565b60006105133384846110f7565b5060015b92915050565b6006546001600160a01b0316336001600160a01b0316146105595760405162461bcd60e51b815260040161055090611b62565b60405180910390fd5b6001600160a01b0381166105a65760405162461bcd60e51b8152602060048201526014602482015273109a5d109510ce881a5b9d985b1a5908199d5b9960621b6044820152606401610550565b60058054610100600160a81b0319166101006001600160a01b03848116820292909217928390557f21649757800a534d13bc2b3bcceaf45854bc4d9e3b3e07e2434211320bc0309a92041633604080516001600160a01b0393841681529290911660208301520160405180910390a150565b6006546001600160a01b0316336001600160a01b03161461064b5760405162461bcd60e51b815260040161055090611b62565b6001600160a01b0381166106995760405162461bcd60e51b8152602060048201526015602482015274109a5d109510ce881d1bdad95b881a5b9d985b1a59605a1b6044820152606401610550565b6001600160a01b038116600090815260086020526040902054156106f75760405162461bcd60e51b8152602060048201526015602482015274109a5d109510ce88185b1c9958591e48195e1a5cdd605a1b6044820152606401610550565b6000816001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b15801561073257600080fd5b505afa158015610746573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061076a9190611a9a565b905060008160ff16116107bf5760405162461bcd60e51b815260206004820152601860248201527f4269744254433a20646563696d616c7320696e76616c696400000000000000006044820152606401610550565b60006107ca8261121c565b6040805180820182526001600160a01b03868116808352602080840186815260078054600181018255600082815296517fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c688600290920291820180546001600160a01b031916919097161790955590517fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c68990940193909355915481845260088352928490209290925582519182528101839052338183015290519192507f2ee967151d49b0382c869f2cf02524e4d14a6730fe4309b751c249f6f554d414916060918190039190910190a1505050565b60006108c6848484611240565b6001600160a01b03841660009081526001602090815260408083203384529091529020548281101561094b5760405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e74206578636565647320616044820152676c6c6f77616e636560c01b6064820152608401610550565b61095885338584036110f7565b60019150505b9392505050565b6001600160a01b0381166000908152600860205260408120541515610517565b3360008181526001602090815260408083206001600160a01b038716845290915281205490916105139185906109bc908690611b92565b6110f7565b6009546001600160a01b0316336001600160a01b031614610a1a5760405162461bcd60e51b81526020600482015260136024820152724269744254433a206f6e6c792062726964676560681b6044820152606401610550565b610a248282611410565b816001600160a01b03167f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d412139688582604051610a5f91815260200190565b60405180910390a25050565b81610a8d816001600160a01b0316600090815260086020526040902054151590565b610ad35760405162461bcd60e51b81526020600482015260176024820152762134ba212a219d103737ba103632b3b0b6103a37b5b2b760491b6044820152606401610550565b336000610ae084826114ef565b6040516370a0823160e01b815230600482018190529192506000906001600160a01b038816906370a082319060240160206040518083038186803b158015610b2757600080fd5b505afa158015610b3b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b5f9190611a82565b9050610b828483610b70868a611cfc565b6001600160a01b038b1692919061154c565b6040516370a0823160e01b81526001600160a01b03838116600483015260009183918a16906370a082319060240160206040518083038186803b158015610bc857600080fd5b505afa158015610bdc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c009190611a82565b610c0a9190611cfc565b90508315610c3457600554610c34906001600160a01b038a8116918891610100909104168761154c565b610c5085610c418a6115b7565b610c4b9084611cdd565b611410565b604080516001600160a01b038781168252602082018a90528a16917f5548c837ab068cf56a2c2479df0882a4922fd203edb7517321831d95078c5f62910160405180910390a25050505050505050565b60606004805461048390611d62565b6009546001600160a01b0316336001600160a01b031614610d085760405162461bcd60e51b81526020600482015260136024820152724269744254433a206f6e6c792062726964676560681b6044820152606401610550565b610d128282611616565b816001600160a01b03167fcc16f5dbb4873280815c1ee09dbd06736cffcc184412cf7a71a0fdb75d397ca582604051610a5f91815260200190565b3360009081526001602090815260408083206001600160a01b038616845290915281205482811015610dcf5760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610550565b610ddc33858584036110f7565b5060019392505050565b6000610513338484611240565b6006546001600160a01b0316336001600160a01b031614610e265760405162461bcd60e51b815260040161055090611b62565b600680546001600160a01b038381166001600160a01b031983168117909355604080519190921680825260208201939093527f95b941bbbf1347e24e6cbb14f7553d49f9244dc4dee558b79dcb1fd8b0434fb5910160405180910390a15050565b60606007805480602002602001604051908101604052809291908181526020016000905b82821015610ef3576000848152602090819020604080518082019091526002850290910180546001600160a01b03168252600190810154828401529083529092019101610eab565b50505050905090565b81610f1e816001600160a01b0316600090815260086020526040902054151590565b610f645760405162461bcd60e51b81526020600482015260176024820152762134ba212a219d103737ba103632b3b0b6103a37b5b2b760491b6044820152606401610550565b336000610f728460016114ef565b90506000610f808286611cfc565b9050610f966001600160a01b0387168483611761565b600554610fb5906001600160a01b038881169161010090041684611761565b610fd183610fc2886115b7565b610fcc9088611cdd565b611616565b604080516001600160a01b038581168252602082018890528816917f9b1bfa7fa9ee420a16e124f794c35ac9f90472acc99140eb2f6447c714cad8eb910160405180910390a2505050505050565b6006546001600160a01b0316336001600160a01b0316146110525760405162461bcd60e51b815260040161055090611b62565b60055460ff16156110a55760405162461bcd60e51b815260206004820152601e60248201527f4269744254433a206465706f7369742066656520616c7265616479206f6e00006044820152606401610550565b6005805460ff191660011790557f80dc799625f4bf5c6d0465b40848e20a3a3ab90adb5d92688793306cd41dde876110da3390565b6040516001600160a01b03909116815260200160405180910390a1565b6001600160a01b0383166111595760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610550565b6001600160a01b0382166111ba5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610550565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b60008161122b60126006611baa565b6112359190611d13565b61051790600a611c32565b6001600160a01b0383166112a45760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610550565b6001600160a01b0382166113065760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610550565b6001600160a01b0383166000908152602081905260409020548181101561137e5760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610550565b6001600160a01b038085166000908152602081905260408082208585039055918516815290812080548492906113b5908490611b92565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161140191815260200190565b60405180910390a35b50505050565b6001600160a01b0382166114665760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610550565b80600260008282546114789190611b92565b90915550506001600160a01b038216600090815260208190526040812080548392906114a5908490611b92565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b60008082600181111561151257634e487b7160e01b600052602160045260246000fd5b148015611522575060055460ff16155b61154357612710611534600585611cdd565b61153e9190611bcf565b61095e565b60009392505050565b6040516001600160a01b038085166024830152831660448201526064810182905261140a9085906323b872dd60e01b906084015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152611791565b6001600160a01b0381166000908152600860205260408120546007906115df90600190611cfc565b815481106115fd57634e487b7160e01b600052603260045260246000fd5b9060005260206000209060020201600101549050919050565b6001600160a01b0382166116765760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b6064820152608401610550565b6001600160a01b038216600090815260208190526040902054818110156116ea5760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b6064820152608401610550565b6001600160a01b0383166000908152602081905260408120838303905560028054849290611719908490611cfc565b90915550506040518281526000906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200161120f565b505050565b6040516001600160a01b03831660248201526044810182905261175c90849063a9059cbb60e01b90606401611580565b60006117e6826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166118639092919063ffffffff16565b80519091501561175c57808060200190518101906118049190611a3a565b61175c5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610550565b606061046c848460008585843b6118bc5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610550565b600080866001600160a01b031685876040516118d89190611abb565b60006040518083038185875af1925050503d8060008114611915576040519150601f19603f3d011682016040523d82523d6000602084013e61191a565b606091505b509150915061192a828286611935565b979650505050505050565b6060831561194457508161095e565b8251156119545782518084602001fd5b8160405162461bcd60e51b81526004016105509190611b2f565b80356001600160a01b038116811461198557600080fd5b919050565b60006020828403121561199b578081fd5b61095e8261196e565b600080604083850312156119b6578081fd5b6119bf8361196e565b91506119cd6020840161196e565b90509250929050565b6000806000606084860312156119ea578081fd5b6119f38461196e565b9250611a016020850161196e565b9150604084013590509250925092565b60008060408385031215611a23578182fd5b611a2c8361196e565b946020939093013593505050565b600060208284031215611a4b578081fd5b8151801515811461095e578182fd5b600060208284031215611a6b578081fd5b81356001600160e01b03198116811461095e578182fd5b600060208284031215611a93578081fd5b5051919050565b600060208284031215611aab578081fd5b815160ff8116811461095e578182fd5b60008251611acd818460208701611d36565b9190910192915050565b602080825282518282018190526000919060409081850190868401855b82811015611b2257815180516001600160a01b03168552860151868501529284019290850190600101611af4565b5091979650505050505050565b6020815260008251806020840152611b4e816040850160208701611d36565b601f01601f19169190910160400192915050565b6020808252601690820152754269744254433a206e6f7420676f7665726e616e636560501b604082015260600190565b60008219821115611ba557611ba5611d9d565b500190565b600060ff821660ff84168060ff03821115611bc757611bc7611d9d565b019392505050565b600082611bea57634e487b7160e01b81526012600452602481fd5b500490565b600181815b80851115611c2a578160001904821115611c1057611c10611d9d565b80851615611c1d57918102915b93841c9390800290611bf4565b509250929050565b600061095e60ff841683600082611c4b57506001610517565b81611c5857506000610517565b8160018114611c6e5760028114611c7857611c94565b6001915050610517565b60ff841115611c8957611c89611d9d565b50506001821b610517565b5060208310610133831016604e8410600b8410161715611cb7575081810a610517565b611cc18383611bef565b8060001904821115611cd557611cd5611d9d565b029392505050565b6000816000190483118215151615611cf757611cf7611d9d565b500290565b600082821015611d0e57611d0e611d9d565b500390565b600060ff821660ff841680821015611d2d57611d2d611d9d565b90039392505050565b60005b83811015611d51578181015183820152602001611d39565b8381111561140a5750506000910152565b600181811c90821680611d7657607f821691505b60208210811415611d9757634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fdfea264697066735822122049367d6c181853a8427cfe45c5aaf9d52f9b0dea29feb121518f4ac7cd9cea1f64736f6c63430008040033

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

000000000000000000000000158f513096923ff2d3aab2bcf4478536de6725e20000000000000000000000003c513db8bdc3806e4489d62c3d549a5aaf6a4e97

-----Decoded View---------------
Arg [0] : l2Bridge_ (address): 0x158F513096923fF2d3aab2BcF4478536de6725e2
Arg [1] : l1Token_ (address): 0x3C513dB8Bdc3806e4489d62C3d549A5Aaf6A4e97

-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 000000000000000000000000158f513096923ff2d3aab2bcf4478536de6725e2
Arg [1] : 0000000000000000000000003c513db8bdc3806e4489d62c3d549a5aaf6a4e97


Deployed Bytecode Sourcemap

29320:5625:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33718:430;;;;;;:::i;:::-;;:::i;:::-;;;5218:14:1;;5211:22;5193:41;;5181:2;5166:18;33718:430:0;;;;;;;;6103:100;;;:::i;:::-;;;;;;;:::i;8270:169::-;;;;;;:::i;:::-;;:::i;31311:186::-;;;;;;:::i;:::-;;:::i;:::-;;7223:108;7311:12;;7223:108;;;13772:25:1;;;13760:2;13745:18;7223:108:0;13727:76:1;32922:510:0;;;;;;:::i;:::-;;:::i;8921:492::-;;;;;;:::i;:::-;;:::i;7065:93::-;;;7148:2;13950:36:1;;13938:2;13923:18;7065:93:0;13905:87:1;34154:106:0;;;;;;:::i;:::-;;:::i;9822:215::-;;;;;;:::i;:::-;;:::i;33438:131::-;;;;;;:::i;:::-;;:::i;31891:599::-;;;;;;:::i;:::-;;:::i;31220:85::-;31288:11;;-1:-1:-1;;;;;31288:11:0;31220:85;;;-1:-1:-1;;;;;2833:32:1;;;2815:51;;2803:2;2788:18;31220:85:0;2770:102:1;7394:127:0;;;;;;:::i;:::-;-1:-1:-1;;;;;7495:18:0;7468:7;7495:18;;;;;;;;;;;;7394:127;31049:86;31116:13;;;;31049:86;;6322:104;;;:::i;33575:137::-;;;;;;:::i;:::-;;:::i;10540:413::-;;;;;;:::i;:::-;;:::i;7734:175::-;;;;;;:::i;:::-;;:::i;31699:186::-;;;;;;:::i;:::-;;:::i;34266:99::-;;;:::i;:::-;;;;;;;:::i;30886:81::-;30952:9;;-1:-1:-1;;;;;30952:9:0;30886:81;;31141:73;31203:5;;;;;-1:-1:-1;;;;;31203:5:0;31141:73;;30792:88;30866:8;;-1:-1:-1;;;;;30866:8:0;30792:88;;7972:151;;;;;;:::i;:::-;-1:-1:-1;;;;;8088:18:0;;;8061:7;8088:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;7972:151;30973:70;29579:1;30973:70;;32496:420;;;;;;:::i;:::-;;:::i;31503:190::-;;;:::i;33718:430::-;33797:4;33850:38;-1:-1:-1;;;;;;;;;34061:38:0;;-1:-1:-1;;;34061:38:0;;:81;;-1:-1:-1;;;;;;;34103:39:0;;;;;;;34061:81;34054:88;33718:430;-1:-1:-1;;;;33718:430:0:o;6103:100::-;6157:13;6190:5;6183:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6103:100;:::o;8270:169::-;8353:4;8370:39;686:10;8393:7;8402:6;8370:8;:39::i;:::-;-1:-1:-1;8427:4:0;8270:169;;;;;:::o;31311:186::-;30339:11;;-1:-1:-1;;;;;30339:11:0;686:10;-1:-1:-1;;;;;30323:27:0;;30315:62;;;;-1:-1:-1;;;30315:62:0;;;;;;;:::i;:::-;;;;;;;;;-1:-1:-1;;;;;31382:19:0;::::1;31374:52;;;::::0;-1:-1:-1;;;31374:52:0;;11950:2:1;31374:52:0::1;::::0;::::1;11932:21:1::0;11989:2;11969:18;;;11962:30;-1:-1:-1;;;12008:18:1;;;12001:50;12068:18;;31374:52:0::1;11922:170:1::0;31374:52:0::1;31435:5;:13:::0;;-1:-1:-1;;;;;;31435:13:0::1;;-1:-1:-1::0;;;;;31435:13:0;;::::1;::::0;::::1;::::0;;;::::1;::::0;;;;31460:31:::1;::::0;31471:5:::1;;686:10:::0;31460:31:::1;::::0;;-1:-1:-1;;;;;3107:15:1;;;3089:34;;3159:15;;;;3154:2;3139:18;;3132:43;3024:18;31460:31:0::1;;;;;;;31311:186:::0;:::o;32922:510::-;30339:11;;-1:-1:-1;;;;;30339:11:0;686:10;-1:-1:-1;;;;;30323:27:0;;30315:62;;;;-1:-1:-1;;;30315:62:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;32999:19:0;::::1;32991:53;;;::::0;-1:-1:-1;;;32991:53:0;;7452:2:1;32991:53:0::1;::::0;::::1;7434:21:1::0;7491:2;7471:18;;;7464:30;-1:-1:-1;;;7510:18:1;;;7503:51;7571:18;;32991:53:0::1;7424:171:1::0;32991:53:0::1;-1:-1:-1::0;;;;;34766:25:0;;34746:4;34766:25;;;:18;:25;;;;;;:29;33051:55:::1;;;::::0;-1:-1:-1;;;33051:55:0;;8209:2:1;33051:55:0::1;::::0;::::1;8191:21:1::0;8248:2;8228:18;;;8221:30;-1:-1:-1;;;8267:18:1;;;8260:51;8328:18;;33051:55:0::1;8181:171:1::0;33051:55:0::1;33115:14;33147:5;-1:-1:-1::0;;;;;33132:30:0::1;;:32;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;33115:49;;33190:1;33179:8;:12;;;33171:49;;;::::0;-1:-1:-1;;;33171:49:0;;8918:2:1;33171:49:0::1;::::0;::::1;8900:21:1::0;8957:2;8937:18;;;8930:30;8996:26;8976:18;;;8969:54;9040:18;;33171:49:0::1;8890:174:1::0;33171:49:0::1;33229:13;33245:20;33256:8;33245:10;:20::i;:::-;33292:24;::::0;;;;::::1;::::0;;-1:-1:-1;;;;;33292:24:0;;::::1;::::0;;;::::1;::::0;;::::1;::::0;;;33274:12:::1;:43:::0;;::::1;::::0;::::1;::::0;;-1:-1:-1;33274:43:0;;;;;;::::1;::::0;;::::1;::::0;;::::1;::::0;;-1:-1:-1;;;;;;33274:43:0::1;::::0;;;::::1;;::::0;;;;;;;;;;;;;33352:19;;33324:25;;;:18:::1;:25:::0;;;;;;:47;;;;33385:41;;4085:34:1;;;4135:18;;4128:34;;;686:10:0;4178:18:1;;;4171:43;33385:41:0;;33292:24;;-1:-1:-1;33385:41:0::1;::::0;4035:2:1;33385:41:0;;;;;;;;;::::1;30384:1;;32922:510:::0;:::o;8921:492::-;9061:4;9078:36;9088:6;9096:9;9107:6;9078:9;:36::i;:::-;-1:-1:-1;;;;;9154:19:0;;9127:24;9154:19;;;:11;:19;;;;;;;;686:10;9154:33;;;;;;;;9206:26;;;;9198:79;;;;-1:-1:-1;;;9198:79:0;;9271:2:1;9198:79:0;;;9253:21:1;9310:2;9290:18;;;9283:30;9349:34;9329:18;;;9322:62;-1:-1:-1;;;9400:18:1;;;9393:38;9448:19;;9198:79:0;9243:230:1;9198:79:0;9313:57;9322:6;686:10;9363:6;9344:16;:25;9313:8;:57::i;:::-;9401:4;9394:11;;;8921:492;;;;;;:::o;34154:106::-;-1:-1:-1;;;;;34766:25:0;;34214:4;34766:25;;;:18;:25;;;;;;:29;;34234:20;34685:116;9822:215;686:10;9910:4;9959:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;9959:34:0;;;;;;;;;;9910:4;;9927:80;;9950:7;;9959:47;;9996:10;;9959:47;:::i;:::-;9927:8;:80::i;33438:131::-;30229:9;;-1:-1:-1;;;;;30229:9:0;686:10;-1:-1:-1;;;;;30213:25:0;;30205:57;;;;-1:-1:-1;;;30205:57:0;;10031:2:1;30205:57:0;;;10013:21:1;10070:2;10050:18;;;10043:30;-1:-1:-1;;;10089:18:1;;;10082:49;10148:18;;30205:57:0;10003:169:1;30205:57:0;33516:17:::1;33522:2;33526:6;33516:5;:17::i;:::-;33552:2;-1:-1:-1::0;;;;;33547:16:0::1;;33556:6;33547:16;;;;13772:25:1::0;;13760:2;13745:18;;13727:76;33547:16:0::1;;;;;;;;33438:131:::0;;:::o;31891:599::-;31971:5;30451:20;30465:5;-1:-1:-1;;;;;34766:25:0;34746:4;34766:25;;;:18;:25;;;;;;:29;;;34685:116;30451:20;30443:56;;;;-1:-1:-1;;;30443:56:0;;13476:2:1;30443:56:0;;;13458:21:1;13515:2;13495:18;;;13488:30;-1:-1:-1;;;13534:18:1;;;13527:53;13597:18;;30443:56:0;13448:173:1;30443:56:0;686:10;31985:14:::1;32036:32;32045:5:::0;31985:14;32036:8:::1;:32::i;:::-;32133:29;::::0;-1:-1:-1;;;32133:29:0;;32100:4:::1;32133:29;::::0;::::1;2815:51:1::0;;;32021:47:0;;-1:-1:-1;32077:12:0::1;::::0;-1:-1:-1;;;;;32133:23:0;::::1;::::0;::::1;::::0;2788:18:1;;32133:29:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;32112:50:::0;-1:-1:-1;32169:58:0::1;32200:6:::0;32208:4;32214:12:::1;32222:4:::0;32214:5;:12:::1;:::i;:::-;-1:-1:-1::0;;;;;32169:30:0;::::1;::::0;:58;;:30:::1;:58::i;:::-;32256:29;::::0;-1:-1:-1;;;32256:29:0;;-1:-1:-1;;;;;2833:32:1;;;32256:29:0::1;::::0;::::1;2815:51:1::0;32234:19:0::1;::::0;32288:10;;32256:23;::::1;::::0;::::1;::::0;2788:18:1;;32256:29:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:42;;;;:::i;:::-;32234:64:::0;-1:-1:-1;32310:8:0;;32307:81:::1;;32368:5;::::0;32329:51:::1;::::0;-1:-1:-1;;;;;32329:30:0;;::::1;::::0;32360:6;;32368:5:::1;::::0;;::::1;;32375:4:::0;32329:30:::1;:51::i;:::-;32396:45;32402:6;32424:16;32434:5;32424:9;:16::i;:::-;32410:30;::::0;:11;:30:::1;:::i;:::-;32396:5;:45::i;:::-;32455:29;::::0;;-1:-1:-1;;;;;3758:32:1;;;3740:51;;3822:2;3807:18;;3800:34;;;32455:29:0;::::1;::::0;::::1;::::0;3713:18:1;32455:29:0::1;;;;;;;30506:1;;;;;31891:599:::0;;;:::o;6322:104::-;6378:13;6411:7;6404:14;;;;;:::i;33575:137::-;30229:9;;-1:-1:-1;;;;;30229:9:0;686:10;-1:-1:-1;;;;;30213:25:0;;30205:57;;;;-1:-1:-1;;;30205:57:0;;10031:2:1;30205:57:0;;;10013:21:1;10070:2;10050:18;;;10043:30;-1:-1:-1;;;10089:18:1;;;10082:49;10148:18;;30205:57:0;10003:169:1;30205:57:0;33655:19:::1;33661:4;33667:6;33655:5;:19::i;:::-;33693:4;-1:-1:-1::0;;;;;33688:18:0::1;;33699:6;33688:18;;;;13772:25:1::0;;13760:2;13745:18;;13727:76;10540:413:0;686:10;10633:4;10677:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;10677:34:0;;;;;;;;;;10730:35;;;;10722:85;;;;-1:-1:-1;;;10722:85:0;;12710:2:1;10722:85:0;;;12692:21:1;12749:2;12729:18;;;12722:30;12788:34;12768:18;;;12761:62;-1:-1:-1;;;12839:18:1;;;12832:35;12884:19;;10722:85:0;12682:227:1;10722:85:0;10843:67;686:10;10866:7;10894:15;10875:16;:34;10843:8;:67::i;:::-;-1:-1:-1;10941:4:0;;10540:413;-1:-1:-1;;;10540:413:0:o;7734:175::-;7820:4;7837:42;686:10;7861:9;7872:6;7837:9;:42::i;31699:186::-;30339:11;;-1:-1:-1;;;;;30339:11:0;686:10;-1:-1:-1;;;;;30323:27:0;;30315:62;;;;-1:-1:-1;;;30315:62:0;;;;;;;:::i;:::-;31788:11:::1;::::0;;-1:-1:-1;;;;;31806:25:0;;::::1;-1:-1:-1::0;;;;;;31806:25:0;::::1;::::0;::::1;::::0;;;31845:34:::1;::::0;;31788:11;;;::::1;3089:34:1::0;;;3154:2;3139:18;;3132:43;;;;31845:34:0::1;::::0;3024:18:1;31845:34:0::1;;;;;;;30384:1;31699:186:::0;:::o;34266:99::-;34312:19;34347:12;34340:19;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;34340:19:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34266:99;:::o;32496:420::-;32577:5;30451:20;30465:5;-1:-1:-1;;;;;34766:25:0;34746:4;34766:25;;;:18;:25;;;;;;:29;;;34685:116;30451:20;30443:56;;;;-1:-1:-1;;;30443:56:0;;13476:2:1;30443:56:0;;;13458:21:1;13515:2;13495:18;;;13488:30;-1:-1:-1;;;13534:18:1;;;13527:53;13597:18;;30443:56:0;13448:173:1;30443:56:0;686:10;32591:14:::1;32642:33;32651:5:::0;32658:16:::1;32642:8;:33::i;:::-;32627:48:::0;-1:-1:-1;32682:19:0::1;32704:12;32627:48:::0;32704:5;:12:::1;:::i;:::-;32682:34:::0;-1:-1:-1;32725:47:0::1;-1:-1:-1::0;;;;;32725:26:0;::::1;32752:6:::0;32682:34;32725:26:::1;:47::i;:::-;32806:5;::::0;32779:39:::1;::::0;-1:-1:-1;;;;;32779:26:0;;::::1;::::0;32806:5:::1;::::0;::::1;;32813:4:::0;32779:26:::1;:39::i;:::-;32827;32833:6;32849:16;32859:5;32849:9;:16::i;:::-;32841:24;::::0;:5;:24:::1;:::i;:::-;32827:5;:39::i;:::-;32880:30;::::0;;-1:-1:-1;;;;;3758:32:1;;;3740:51;;3822:2;3807:18;;3800:34;;;32880:30:0;::::1;::::0;::::1;::::0;3713:18:1;32880:30:0::1;;;;;;;30506:1;;;32496:420:::0;;;:::o;31503:190::-;30339:11;;-1:-1:-1;;;;;30339:11:0;686:10;-1:-1:-1;;;;;30323:27:0;;30315:62;;;;-1:-1:-1;;;30315:62:0;;;;;;;:::i;:::-;31570:13:::1;::::0;::::1;;31569:14;31561:57;;;::::0;-1:-1:-1;;;31561:57:0;;8559:2:1;31561:57:0::1;::::0;::::1;8541:21:1::0;8598:2;8578:18;;;8571:30;8637:32;8617:18;;;8610:60;8687:18;;31561:57:0::1;8531:180:1::0;31561:57:0::1;31627:13;:20:::0;;-1:-1:-1;;31627:20:0::1;31643:4;31627:20;::::0;;31661:26:::1;31674:12;686:10:::0;;606:98;31674:12:::1;31661:26;::::0;-1:-1:-1;;;;;2833:32:1;;;2815:51;;2803:2;2788:18;31661:26:0::1;;;;;;;31503:190::o:0;14224:380::-;-1:-1:-1;;;;;14360:19:0;;14352:68;;;;-1:-1:-1;;;14352:68:0;;11187:2:1;14352:68:0;;;11169:21:1;11226:2;11206:18;;;11199:30;11265:34;11245:18;;;11238:62;-1:-1:-1;;;11316:18:1;;;11309:34;11360:19;;14352:68:0;11159:226:1;14352:68:0;-1:-1:-1;;;;;14439:21:0;;14431:68;;;;-1:-1:-1;;;14431:68:0;;6642:2:1;14431:68:0;;;6624:21:1;6681:2;6661:18;;;6654:30;6720:34;6700:18;;;6693:62;-1:-1:-1;;;6771:18:1;;;6764:32;6813:19;;14431:68:0;6614:224:1;14431:68:0;-1:-1:-1;;;;;14512:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;14564:32;;13772:25:1;;;14564:32:0;;13745:18:1;14564:32:0;;;;;;;;14224:380;;;:::o;34556:123::-;34616:7;34663:9;34646:14;7148:2;34659:1;34646:14;:::i;:::-;:26;;;;:::i;:::-;34639:34;;:2;:34;:::i;11443:733::-;-1:-1:-1;;;;;11583:20:0;;11575:70;;;;-1:-1:-1;;;11575:70:0;;10781:2:1;11575:70:0;;;10763:21:1;10820:2;10800:18;;;10793:30;10859:34;10839:18;;;10832:62;-1:-1:-1;;;10910:18:1;;;10903:35;10955:19;;11575:70:0;10753:227:1;11575:70:0;-1:-1:-1;;;;;11664:23:0;;11656:71;;;;-1:-1:-1;;;11656:71:0;;5835:2:1;11656:71:0;;;5817:21:1;5874:2;5854:18;;;5847:30;5913:34;5893:18;;;5886:62;-1:-1:-1;;;5964:18:1;;;5957:33;6007:19;;11656:71:0;5807:225:1;11656:71:0;-1:-1:-1;;;;;11824:17:0;;11800:21;11824:17;;;;;;;;;;;11860:23;;;;11852:74;;;;-1:-1:-1;;;11852:74:0;;7045:2:1;11852:74:0;;;7027:21:1;7084:2;7064:18;;;7057:30;7123:34;7103:18;;;7096:62;-1:-1:-1;;;7174:18:1;;;7167:36;7220:19;;11852:74:0;7017:228:1;11852:74:0;-1:-1:-1;;;;;11962:17:0;;;:9;:17;;;;;;;;;;;11982:22;;;11962:42;;12026:20;;;;;;;;:30;;11998:6;;11962:9;12026:30;;11998:6;;12026:30;:::i;:::-;;;;;;;;12091:9;-1:-1:-1;;;;;12074:35:0;12083:6;-1:-1:-1;;;;;12074:35:0;;12102:6;12074:35;;;;13772:25:1;;13760:2;13745:18;;13727:76;12074:35:0;;;;;;;;12122:46;11443:733;;;;:::o;12463:399::-;-1:-1:-1;;;;;12547:21:0;;12539:65;;;;-1:-1:-1;;;12539:65:0;;13116:2:1;12539:65:0;;;13098:21:1;13155:2;13135:18;;;13128:30;13194:33;13174:18;;;13167:61;13245:18;;12539:65:0;13088:181:1;12539:65:0;12695:6;12679:12;;:22;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;;;12712:18:0;;:9;:18;;;;;;;;;;:28;;12734:6;;12712:9;:28;;12734:6;;12712:28;:::i;:::-;;;;-1:-1:-1;;12756:37:0;;13772:25:1;;;-1:-1:-1;;;;;12756:37:0;;;12773:1;;12756:37;;13760:2:1;13745:18;12756:37:0;;;;;;;12463:399;;:::o;34371:179::-;34444:7;;34468;:26;;;;;;-1:-1:-1;;;34468:26:0;;;;;;;;;;:44;;;;-1:-1:-1;34499:13:0;;;;34498:14;34468:44;34467:77;;29623:3;34520:11;29579:1;34520:5;:11;:::i;:::-;:24;;;;:::i;:::-;34467:77;;;34516:1;34460:84;34371:179;-1:-1:-1;;;34371:179:0:o;24829:248::-;25000:68;;-1:-1:-1;;;;;3444:15:1;;;25000:68:0;;;3426:34:1;3496:15;;3476:18;;;3469:43;3528:18;;;3521:34;;;24973:96:0;;24993:5;;-1:-1:-1;;;25023:27:0;3361:18:1;;25000:68:0;;;;-1:-1:-1;;25000:68:0;;;;;;;;;;;;;;-1:-1:-1;;;;;25000:68:0;-1:-1:-1;;;;;;25000:68:0;;;;;;;;;;24973:19;:96::i;34807:135::-;-1:-1:-1;;;;;34900:25:0;;34864:7;34900:25;;;:18;:25;;;;;;34887:12;;34900:29;;34928:1;;34900:29;:::i;:::-;34887:43;;;;;;-1:-1:-1;;;34887:43:0;;;;;;;;;;;;;;;;;;;:49;;;34880:56;;34807:135;;;:::o;13195:591::-;-1:-1:-1;;;;;13279:21:0;;13271:67;;;;-1:-1:-1;;;13271:67:0;;10379:2:1;13271:67:0;;;10361:21:1;10418:2;10398:18;;;10391:30;10457:34;10437:18;;;10430:62;-1:-1:-1;;;10508:18:1;;;10501:31;10549:19;;13271:67:0;10351:223:1;13271:67:0;-1:-1:-1;;;;;13438:18:0;;13413:22;13438:18;;;;;;;;;;;13475:24;;;;13467:71;;;;-1:-1:-1;;;13467:71:0;;6239:2:1;13467:71:0;;;6221:21:1;6278:2;6258:18;;;6251:30;6317:34;6297:18;;;6290:62;-1:-1:-1;;;6368:18:1;;;6361:32;6410:19;;13467:71:0;6211:224:1;13467:71:0;-1:-1:-1;;;;;13574:18:0;;:9;:18;;;;;;;;;;13595:23;;;13574:44;;13640:12;:22;;13612:6;;13574:9;13640:22;;13612:6;;13640:22;:::i;:::-;;;;-1:-1:-1;;13680:37:0;;13772:25:1;;;13706:1:0;;-1:-1:-1;;;;;13680:37:0;;;;;13760:2:1;13745:18;13680:37:0;13727:76:1;13730:48:0;13195:591;;;:::o;24610:211::-;24754:58;;-1:-1:-1;;;;;3758:32:1;;24754:58:0;;;3740:51:1;3807:18;;;3800:34;;;24727:86:0;;24747:5;;-1:-1:-1;;;24777:23:0;3713:18:1;;24754:58:0;3695:145:1;27183:716:0;27607:23;27633:69;27661:4;27633:69;;;;;;;;;;;;;;;;;27641:5;-1:-1:-1;;;;;27633:27:0;;;:69;;;;;:::i;:::-;27717:17;;27607:95;;-1:-1:-1;27717:21:0;27713:179;;27814:10;27803:30;;;;;;;;;;;;:::i;:::-;27795:85;;;;-1:-1:-1;;;27795:85:0;;12299:2:1;27795:85:0;;;12281:21:1;12338:2;12318:18;;;12311:30;12377:34;12357:18;;;12350:62;-1:-1:-1;;;12428:18:1;;;12421:40;12478:19;;27795:85:0;12271:232:1;19559:229:0;19696:12;19728:52;19750:6;19758:4;19764:1;19767:12;19696;17076:20;;20966:60;;;;-1:-1:-1;;;20966:60:0;;11592:2:1;20966:60:0;;;11574:21:1;11631:2;11611:18;;;11604:30;11670:31;11650:18;;;11643:59;11719:18;;20966:60:0;11564:179:1;20966:60:0;21040:12;21054:23;21081:6;-1:-1:-1;;;;;21081:11:0;21100:5;21107:4;21081:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21039:73;;;;21130:51;21147:7;21156:10;21168:12;21130:16;:51::i;:::-;21123:58;20679:510;-1:-1:-1;;;;;;;20679:510:0:o;23365:712::-;23515:12;23544:7;23540:530;;;-1:-1:-1;23575:10:0;23568:17;;23540:530;23689:17;;:21;23685:374;;23887:10;23881:17;23948:15;23935:10;23931:2;23927:19;23920:44;23835:148;24030:12;24023:20;;-1:-1:-1;;;24023:20:0;;;;;;;;:::i;14:173:1:-;82:20;;-1:-1:-1;;;;;131:31:1;;121:42;;111:2;;177:1;174;167:12;111:2;63:124;;;:::o;192:196::-;251:6;304:2;292:9;283:7;279:23;275:32;272:2;;;325:6;317;310:22;272:2;353:29;372:9;353:29;:::i;393:270::-;461:6;469;522:2;510:9;501:7;497:23;493:32;490:2;;;543:6;535;528:22;490:2;571:29;590:9;571:29;:::i;:::-;561:39;;619:38;653:2;642:9;638:18;619:38;:::i;:::-;609:48;;480:183;;;;;:::o;668:338::-;745:6;753;761;814:2;802:9;793:7;789:23;785:32;782:2;;;835:6;827;820:22;782:2;863:29;882:9;863:29;:::i;:::-;853:39;;911:38;945:2;934:9;930:18;911:38;:::i;:::-;901:48;;996:2;985:9;981:18;968:32;958:42;;772:234;;;;;:::o;1011:264::-;1079:6;1087;1140:2;1128:9;1119:7;1115:23;1111:32;1108:2;;;1161:6;1153;1146:22;1108:2;1189:29;1208:9;1189:29;:::i;:::-;1179:39;1265:2;1250:18;;;;1237:32;;-1:-1:-1;;;1098:177:1:o;1280:297::-;1347:6;1400:2;1388:9;1379:7;1375:23;1371:32;1368:2;;;1421:6;1413;1406:22;1368:2;1458:9;1452:16;1511:5;1504:13;1497:21;1490:5;1487:32;1477:2;;1538:6;1530;1523:22;1582:306;1640:6;1693:2;1681:9;1672:7;1668:23;1664:32;1661:2;;;1714:6;1706;1699:22;1661:2;1745:23;;-1:-1:-1;;;;;;1797:32:1;;1787:43;;1777:2;;1849:6;1841;1834:22;1893:194;1963:6;2016:2;2004:9;1995:7;1991:23;1987:32;1984:2;;;2037:6;2029;2022:22;1984:2;-1:-1:-1;2065:16:1;;1974:113;-1:-1:-1;1974:113:1:o;2092:293::-;2160:6;2213:2;2201:9;2192:7;2188:23;2184:32;2181:2;;;2234:6;2226;2219:22;2181:2;2271:9;2265:16;2321:4;2314:5;2310:16;2303:5;2300:27;2290:2;;2346:6;2338;2331:22;2390:274;2519:3;2557:6;2551:13;2573:53;2619:6;2614:3;2607:4;2599:6;2595:17;2573:53;:::i;:::-;2642:16;;;;;2527:137;-1:-1:-1;;2527:137:1:o;4225:823::-;4452:2;4504:21;;;4574:13;;4477:18;;;4596:22;;;4423:4;;4452:2;4637;;4655:18;;;;4696:15;;;4423:4;4742:280;4756:6;4753:1;4750:13;4742:280;;;4815:13;;4857:9;;-1:-1:-1;;;;;4853:35:1;4841:48;;4929:11;;4923:18;4909:12;;;4902:40;4962:12;;;;4997:15;;;;4885:1;4771:9;4742:280;;;-1:-1:-1;5039:3:1;;4432:616;-1:-1:-1;;;;;;;4432:616:1:o;5245:383::-;5394:2;5383:9;5376:21;5357:4;5426:6;5420:13;5469:6;5464:2;5453:9;5449:18;5442:34;5485:66;5544:6;5539:2;5528:9;5524:18;5519:2;5511:6;5507:15;5485:66;:::i;:::-;5612:2;5591:15;-1:-1:-1;;5587:29:1;5572:45;;;;5619:2;5568:54;;5366:262;-1:-1:-1;;5366:262:1:o;9478:346::-;9680:2;9662:21;;;9719:2;9699:18;;;9692:30;-1:-1:-1;;;9753:2:1;9738:18;;9731:52;9815:2;9800:18;;9652:172::o;13997:128::-;14037:3;14068:1;14064:6;14061:1;14058:13;14055:2;;;14074:18;;:::i;:::-;-1:-1:-1;14110:9:1;;14045:80::o;14130:204::-;14168:3;14204:4;14201:1;14197:12;14236:4;14233:1;14229:12;14271:3;14265:4;14261:14;14256:3;14253:23;14250:2;;;14279:18;;:::i;:::-;14315:13;;14176:158;-1:-1:-1;;;14176:158:1:o;14339:217::-;14379:1;14405;14395:2;;-1:-1:-1;;;14430:31:1;;14484:4;14481:1;14474:15;14512:4;14437:1;14502:15;14395:2;-1:-1:-1;14541:9:1;;14385:171::o;14561:422::-;14650:1;14693:5;14650:1;14707:270;14728:7;14718:8;14715:21;14707:270;;;14787:4;14783:1;14779:6;14775:17;14769:4;14766:27;14763:2;;;14796:18;;:::i;:::-;14846:7;14836:8;14832:22;14829:2;;;14866:16;;;;14829:2;14945:22;;;;14905:15;;;;14707:270;;;14711:3;14625:358;;;;;:::o;14988:140::-;15046:5;15075:47;15116:4;15106:8;15102:19;15096:4;15182:5;15212:8;15202:2;;-1:-1:-1;15253:1:1;15267:5;;15202:2;15301:4;15291:2;;-1:-1:-1;15338:1:1;15352:5;;15291:2;15383:4;15401:1;15396:59;;;;15469:1;15464:130;;;;15376:218;;15396:59;15426:1;15417:10;;15440:5;;;15464:130;15501:3;15491:8;15488:17;15485:2;;;15508:18;;:::i;:::-;-1:-1:-1;;15564:1:1;15550:16;;15579:5;;15376:218;;15678:2;15668:8;15665:16;15659:3;15653:4;15650:13;15646:36;15640:2;15630:8;15627:16;15622:2;15616:4;15613:12;15609:35;15606:77;15603:2;;;-1:-1:-1;15715:19:1;;;15747:5;;15603:2;15794:34;15819:8;15813:4;15794:34;:::i;:::-;15864:6;15860:1;15856:6;15852:19;15843:7;15840:32;15837:2;;;15875:18;;:::i;:::-;15913:20;;15192:747;-1:-1:-1;;;15192:747:1:o;15944:168::-;15984:7;16050:1;16046;16042:6;16038:14;16035:1;16032:21;16027:1;16020:9;16013:17;16009:45;16006:2;;;16057:18;;:::i;:::-;-1:-1:-1;16097:9:1;;15996:116::o;16117:125::-;16157:4;16185:1;16182;16179:8;16176:2;;;16190:18;;:::i;:::-;-1:-1:-1;16227:9:1;;16166:76::o;16247:195::-;16285:4;16322;16319:1;16315:12;16354:4;16351:1;16347:12;16379:3;16374;16371:12;16368:2;;;16386:18;;:::i;:::-;16423:13;;;16294:148;-1:-1:-1;;;16294:148:1:o;16447:258::-;16519:1;16529:113;16543:6;16540:1;16537:13;16529:113;;;16619:11;;;16613:18;16600:11;;;16593:39;16565:2;16558:10;16529:113;;;16660:6;16657:1;16654:13;16651:2;;;-1:-1:-1;;16695:1:1;16677:16;;16670:27;16500:205::o;16710:380::-;16789:1;16785:12;;;;16832;;;16853:2;;16907:4;16899:6;16895:17;16885:27;;16853:2;16960;16952:6;16949:14;16929:18;16926:38;16923:2;;;17006:10;17001:3;16997:20;16994:1;16987:31;17041:4;17038:1;17031:15;17069:4;17066:1;17059:15;16923:2;;16765:325;;;:::o;17095:127::-;17156:10;17151:3;17147:20;17144:1;17137:31;17187:4;17184:1;17177:15;17211:4;17208:1;17201:15

Swarm Source

ipfs://49367d6c181853a8427cfe45c5aaf9d52f9b0dea29feb121518f4ac7cd9cea1f
[ Download: CSV Export  ]
[ Download: CSV Export  ]

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