ETH Price: $3,270.77 (+0.74%)

Contract

0xfFb94c81D9A283aB4373ab4Ba3534DC4FB8d1295
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Token Holdings

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Migrate BIT188046632023-12-17 8:49:11391 days ago1702802951IN
0xfFb94c81...4FB8d1295
0 ETH0.0007905732.92842773
Migrate BIT188046612023-12-17 8:48:47391 days ago1702802927IN
0xfFb94c81...4FB8d1295
0 ETH0.000748831.18867285
Migrate BIT186537482023-11-26 5:25:35412 days ago1700976335IN
0xfFb94c81...4FB8d1295
0 ETH0.0004543618.91551844
Migrate BIT180522852023-09-03 0:06:47496 days ago1693699607IN
0xfFb94c81...4FB8d1295
0 ETH0.000214838.94820323
Migrate BIT179522212023-08-19 23:53:59510 days ago1692489239IN
0xfFb94c81...4FB8d1295
0 ETH0.0002535210.56490479
Migrate BIT179450612023-08-18 23:50:35511 days ago1692402635IN
0xfFb94c81...4FB8d1295
0 ETH0.0003362914
Migrate All BIT179425962023-08-18 15:34:47512 days ago1692372887IN
0xfFb94c81...4FB8d1295
0 ETH0.0009518240.55167816
Migrate All BIT179425942023-08-18 15:34:23512 days ago1692372863IN
0xfFb94c81...4FB8d1295
0 ETH0.0009894642.15493413
Migrate All BIT179425932023-08-18 15:34:11512 days ago1692372851IN
0xfFb94c81...4FB8d1295
0 ETH0.0009084238.70252259
Migrate BIT179291992023-08-16 18:33:11513 days ago1692210791IN
0xfFb94c81...4FB8d1295
0 ETH0.002996833.39841332
Migrate BIT179290722023-08-16 18:07:23513 days ago1692209243IN
0xfFb94c81...4FB8d1295
0 ETH0.0033350931.23299109
Migrate BIT179282282023-08-16 15:17:11514 days ago1692199031IN
0xfFb94c81...4FB8d1295
0 ETH0.004332132.39075272
Migrate BIT179274842023-08-16 12:46:47514 days ago1692190007IN
0xfFb94c81...4FB8d1295
0 ETH0.0025342726.06819401
Migrate BIT179272072023-08-16 11:51:23514 days ago1692186683IN
0xfFb94c81...4FB8d1295
0 ETH0.0023261819.94444316
Migrate BIT179269092023-08-16 10:51:35514 days ago1692183095IN
0xfFb94c81...4FB8d1295
0 ETH0.0019407919.96848061
Migrate BIT179267202023-08-16 10:13:35514 days ago1692180815IN
0xfFb94c81...4FB8d1295
0 ETH0.0016697219.66029997
Migrate BIT179267182023-08-16 10:13:11514 days ago1692180791IN
0xfFb94c81...4FB8d1295
0 ETH0.0018813219.35660268
Migrate BIT179266162023-08-16 9:52:23514 days ago1692179543IN
0xfFb94c81...4FB8d1295
0 ETH0.0025314518.27015709
Migrate BIT179265572023-08-16 9:40:35514 days ago1692178835IN
0xfFb94c81...4FB8d1295
0 ETH0.0025663319.18830069
Migrate BIT179264932023-08-16 9:27:47514 days ago1692178067IN
0xfFb94c81...4FB8d1295
0 ETH0.0029962618.91044919
Migrate BIT179263072023-08-16 8:50:11514 days ago1692175811IN
0xfFb94c81...4FB8d1295
0 ETH0.0024314218.18117536
Migrate BIT179261982023-08-16 8:28:11514 days ago1692174491IN
0xfFb94c81...4FB8d1295
0 ETH0.0017476116.36631314
Migrate BIT179256442023-08-16 6:36:11514 days ago1692167771IN
0xfFb94c81...4FB8d1295
0 ETH0.0023710117.72946423
Migrate BIT179255752023-08-16 6:22:23514 days ago1692166943IN
0xfFb94c81...4FB8d1295
0 ETH0.0025788819.28382824
Migrate BIT179254972023-08-16 6:06:47514 days ago1692166007IN
0xfFb94c81...4FB8d1295
0 ETH0.0024287820.8199236
View all transactions

View more zero value Internal Transactions in Advanced View mode

Advanced mode:
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
MantleTokenMigrator

Compiler Version
v0.8.15+commit.e14f2714

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion
File 1 of 3 : MantleTokenMigrator.sol
// SPDX-License-Identifier: MIT
pragma solidity 0.8.15;

import {ERC20} from "solmate/src/tokens/ERC20.sol";
import {SafeTransferLib} from "solmate/src/utils/SafeTransferLib.sol";

/// @title Mantle Token Migrator
/// @author 0xMantle
/// @notice Token migration contract for the BIT to MNT token migration
contract MantleTokenMigrator {
    using SafeTransferLib for ERC20;

    /* ========== STATE VARIABLES ========== */

    /// @dev The address of the BIT token contract
    address public immutable BIT_TOKEN_ADDRESS;

    /// @dev The address of the MNT token contract
    address public immutable MNT_TOKEN_ADDRESS;

    /// @dev The address of the treasury contract that receives defunded tokens
    address public treasury;

    /// @dev The address of the owner of the contract
    /// @notice The owner of the contract is initially the deployer of the contract but will be transferred
    ///         to a multisig wallet immediately after deployment
    address public owner;

    /// @dev Boolean indicating if this contract is halted
    bool public halted;

    /* ========== EVENTS ========== */

    // TokenSwap Events

    /// @dev Emitted when a user swaps BIT for MNT
    /// @param to The address of the user that swapped BIT for MNT
    /// @param amountSwapped The amount of BIT swapped and MNT received
    event TokensMigrated(address indexed to, uint256 amountSwapped);

    // Contract State Events

    /// @dev Emitted when the owner of the contract is changed
    /// @param previousOwner The address of the previous owner of this contract
    /// @param newOwner The address of the new owner of this contract
    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

    /// @dev Emitted when the contract is halted
    /// @param halter The address of the caller that halted this contract
    event ContractHalted(address indexed halter);

    /// @dev Emitted when the contract is unhalted
    /// @param halter The address of the caller that unhalted this contract
    event ContractUnhalted(address indexed halter);

    /// @dev Emitted when the treasury address is changed
    /// @param previousTreasury The address of the previous treasury
    /// @param newTreasury The address of the new treasury
    event TreasuryChanged(address indexed previousTreasury, address indexed newTreasury);

    // Admin Events

    /// @dev Emitted when non BIT/MNT tokens are swept from the contract by the owner to the recipient address
    /// @param token The address of the token contract that was swept
    /// @param recipient The address of the recipient of the swept tokens
    /// @param amount The amount of tokens swept
    event TokensSwept(address indexed token, address indexed recipient, uint256 amount);

    /// @dev Emitted when BIT/MNT tokens are defunded from the contract by the owner to the treasury
    /// @param defunder The address of the defunder
    /// @param token The address of the token contract that was defunded
    /// @param amount The amount of tokens defunded
    event ContractDefunded(address indexed defunder, address indexed token, uint256 amount);

    /* ========== ERRORS ========== */

    /// @notice Thrown when the caller is not the owner and the function being called uses the {onlyOwner} modifier
    /// @param caller The address of the caller
    error MantleTokenMigrator_OnlyOwner(address caller);

    /// @notice Thrown when the contract is halted and the function being called uses the {onlyWhenNotHalted} modifier
    error MantleTokenMigrator_OnlyWhenNotHalted();

    /// @notice Thrown when the input passed into the {_migrateTokens} function is zero
    error MantleTokenMigrator_ZeroSwap();

    /// @notice Thrown when at least one of the inputs passed into the constructor is a zero value
    error MantleTokenMigrator_ImproperlyInitialized();

    /// @notice Thrown when the {_tokenAddress} passed into the {sweepTokens} function is the BIT or MNT token address
    /// @param token The address of the token contract
    error MantleTokenMigrator_SweepNotAllowed(address token);

    /// @notice Thrown when the {_tokenAddress} passed into the {defundContract} function is NOT the BIT or MNT token address
    /// @param token The address of the token contract
    error MantleTokenMigrator_InvalidFundingToken(address token);

    /// @notice Thrown when the treasury is the zero address
    error MantleTokenMigrator_InvalidTreasury(address treasury);

    /* ========== MODIFIERS ========== */

    /// @notice Modifier that checks that the caller is the owner of the contract
    /// @dev Throws {MantleTokenMigrator_OnlyOwner} if the caller is not the owner
    modifier onlyOwner() {
        if (msg.sender != owner) revert MantleTokenMigrator_OnlyOwner(msg.sender);
        _;
    }

    /// @notice Modifier that checks that the contract is not halted
    /// @dev Throws {MantleTokenMigrator_OnlyWhenNotHalted} if the contract is halted
    modifier onlyWhenNotHalted() {
        if (halted) revert MantleTokenMigrator_OnlyWhenNotHalted();
        _;
    }

    /// @notice Initializes the MantleTokenMigrator contract, setting the initial deployer as the contract owner
    /// @dev _bitTokenAddress, _mntTokenAddress, _tokenConversionNumerator, and _tokenConversionDenominator are immutable: they can only be set once during construction
    /// @dev the contract is initialized in a halted state
    /// @dev Requirements:
    ///     - all parameters must be non-zero
    ///     - _bitTokenAddress and _mntTokenAddress are assumed to have the same number of decimals
    /// @param _bitTokenAddress The address of the BIT token contract
    /// @param _mntTokenAddress The address of the MNT token contract
    /// @param _treasury The address of the treasury contract that receives defunded tokens
    constructor(address _bitTokenAddress, address _mntTokenAddress, address _treasury) {
        if (_bitTokenAddress == address(0) || _mntTokenAddress == address(0) || _treasury == address(0)) {
            revert MantleTokenMigrator_ImproperlyInitialized();
        }

        owner = msg.sender;
        halted = true;

        BIT_TOKEN_ADDRESS = _bitTokenAddress;
        MNT_TOKEN_ADDRESS = _mntTokenAddress;

        treasury = _treasury;
    }

    /* ========== TOKEN SWAPPING ========== */

    /// @notice Swaps all of the caller's BIT tokens for MNT tokens
    /// @dev emits a {TokensMigrated} event
    /// @dev Requirements:
    ///     - The caller must have approved this contract to spend their BIT tokens
    ///     - The caller must have a non-zero balance of BIT tokens
    ///     - The contract must not be halted
    function migrateAllBIT() external onlyWhenNotHalted {
        uint256 amount = ERC20(BIT_TOKEN_ADDRESS).balanceOf(msg.sender);
        _migrateTokens(amount);
    }

    /// @notice Swaps a specified amount of the caller's BIT tokens for MNT tokens
    /// @dev emits a {TokensMigrated} event
    /// @dev Requirements:
    ///     - The caller must have approved this contract to spend at least {_amount} of their BIT tokens
    ///     - The caller must have a balance of at least {_amount} of BIT tokens
    ///     - The contract must not be halted
    ///     - {_amount} must be non-zero
    /// @param _amount The amount of BIT tokens to swap
    function migrateBIT(uint256 _amount) external onlyWhenNotHalted {
        _migrateTokens(_amount);
    }

    /// @notice Internal function that swaps a specified amount of the caller's BIT tokens for MNT tokens
    /// @dev emits a {TokensMigrated} event
    /// @dev Requirements:
    ///     - The caller must have approved this contract to spend at least {_amount} of their BIT tokens
    ///     - The caller must have a balance of at least {_amount} of BIT tokens
    ///     - {_amount} must be non-zero
    /// @param _amount The amount of BIT tokens to swap
    function _migrateTokens(uint256 _amount) internal {
        if (_amount == 0) revert MantleTokenMigrator_ZeroSwap();

        // transfer user's BIT tokens to this contract
        ERC20(BIT_TOKEN_ADDRESS).safeTransferFrom(msg.sender, address(this), _amount);

        // transfer MNT tokens to user, if there are insufficient tokens, in the contract this will revert
        ERC20(MNT_TOKEN_ADDRESS).safeTransfer(msg.sender, _amount);

        emit TokensMigrated(msg.sender, _amount);
    }

    /* ========== ADMIN UTILS ========== */

    // Ownership Functions

    /// @notice Transfers ownership of the contract to a new address
    /// @dev emits an {OwnershipTransferred} event
    /// @dev Requirements:
    ///     - The caller must be the contract owner
    function transferOwnership(address _newOwner) public onlyOwner {
        owner = _newOwner;

        emit OwnershipTransferred(msg.sender, _newOwner);
    }

    // Contract State Functions

    /// @notice Halts the contract, preventing token migrations
    /// @dev emits a {ContractHalted} event
    /// @dev Requirements:
    ///     - The caller must be the contract owner
    function haltContract() public onlyOwner {
        halted = true;

        emit ContractHalted(msg.sender);
    }

    /// @notice Unhalts the contract, allowing token migrations
    /// @dev emits a {ContractUnhalted} event
    /// @dev Requirements:
    ///     - The caller must be the contract owner
    function unhaltContract() public onlyOwner {
        halted = false;

        emit ContractUnhalted(msg.sender);
    }

    /// @notice Sets the treasury address
    /// @dev emits a {TreasuryChanged} event
    /// @dev Requirements:
    ///     - The caller must be the contract owner
    function setTreasury(address _treasury) public onlyOwner {
        if (_treasury == address(0)) {
            revert MantleTokenMigrator_InvalidTreasury(_treasury);
        }

        emit TreasuryChanged(treasury, _treasury);

        treasury = _treasury;
    }

    // Token Management Functions

    /// @notice Defunds the contract by transferring a specified amount of BIT or MNT tokens to the treasury address
    /// @dev emits a {ContractDefunded} event
    /// @dev Requirements:
    ///     - The caller must be the contract owner
    ///     - {_tokenAddress} must be either the BIT or the MNT token address
    ///     - The contract must have a balance of at least {_amount} of {_tokenAddress} tokens
    /// @param _tokenAddress The address of the token to defund
    /// @param _amount The amount of tokens to defund
    function defundContract(address _tokenAddress, uint256 _amount) public onlyOwner {
        if (_tokenAddress != BIT_TOKEN_ADDRESS && _tokenAddress != MNT_TOKEN_ADDRESS) {
            revert MantleTokenMigrator_InvalidFundingToken(_tokenAddress);
        }

        // we can only defund BIT or MNT into the predefined treasury address
        ERC20(_tokenAddress).safeTransfer(treasury, _amount);

        emit ContractDefunded(treasury, _tokenAddress, _amount);
    }

    /// @notice Sweeps a specified amount of tokens to an arbitrary address
    /// @dev emits a {TokensSwept} event
    /// @dev Requirements:
    ///     - The caller must be the contract owner
    ///     - {_tokenAddress} must not the BIT or the MNT token address
    ///     - The contract must have a balance of at least {_amount} of {_tokenAddress} tokens
    /// @param _tokenAddress The address of the token to sweep
    /// @param _recipient The address to sweep the tokens to
    /// @param _amount The amount of tokens to sweep
    function sweepTokens(address _tokenAddress, address _recipient, uint256 _amount) public onlyOwner {
        // we can only sweep tokens that are not BIT or MNT to an arbitrary addres
        if ((_tokenAddress == BIT_TOKEN_ADDRESS) || (_tokenAddress == MNT_TOKEN_ADDRESS)) {
            revert MantleTokenMigrator_SweepNotAllowed(_tokenAddress);
        }
        ERC20(_tokenAddress).safeTransfer(_recipient, _amount);

        emit TokensSwept(_tokenAddress, _recipient, _amount);
    }
}

File 2 of 3 : SafeTransferLib.sol
// SPDX-License-Identifier: AGPL-3.0-only
pragma solidity >=0.8.0;

import {ERC20} from "../tokens/ERC20.sol";

/// @notice Safe ETH and ERC20 transfer library that gracefully handles missing return values.
/// @author Solmate (https://github.com/transmissions11/solmate/blob/main/src/utils/SafeTransferLib.sol)
/// @dev Use with caution! Some functions in this library knowingly create dirty bits at the destination of the free memory pointer.
/// @dev Note that none of the functions in this library check that a token has code at all! That responsibility is delegated to the caller.
library SafeTransferLib {
    /*//////////////////////////////////////////////////////////////
                             ETH OPERATIONS
    //////////////////////////////////////////////////////////////*/

    function safeTransferETH(address to, uint256 amount) internal {
        bool success;

        /// @solidity memory-safe-assembly
        assembly {
            // Transfer the ETH and store if it succeeded or not.
            success := call(gas(), to, amount, 0, 0, 0, 0)
        }

        require(success, "ETH_TRANSFER_FAILED");
    }

    /*//////////////////////////////////////////////////////////////
                            ERC20 OPERATIONS
    //////////////////////////////////////////////////////////////*/

    function safeTransferFrom(
        ERC20 token,
        address from,
        address to,
        uint256 amount
    ) internal {
        bool success;

        /// @solidity memory-safe-assembly
        assembly {
            // Get a pointer to some free memory.
            let freeMemoryPointer := mload(0x40)

            // Write the abi-encoded calldata into memory, beginning with the function selector.
            mstore(freeMemoryPointer, 0x23b872dd00000000000000000000000000000000000000000000000000000000)
            mstore(add(freeMemoryPointer, 4), from) // Append the "from" argument.
            mstore(add(freeMemoryPointer, 36), to) // Append the "to" argument.
            mstore(add(freeMemoryPointer, 68), amount) // Append the "amount" argument.

            success := and(
                // Set success to whether the call reverted, if not we check it either
                // returned exactly 1 (can't just be non-zero data), or had no return data.
                or(and(eq(mload(0), 1), gt(returndatasize(), 31)), iszero(returndatasize())),
                // We use 100 because the length of our calldata totals up like so: 4 + 32 * 3.
                // We use 0 and 32 to copy up to 32 bytes of return data into the scratch space.
                // Counterintuitively, this call must be positioned second to the or() call in the
                // surrounding and() call or else returndatasize() will be zero during the computation.
                call(gas(), token, 0, freeMemoryPointer, 100, 0, 32)
            )
        }

        require(success, "TRANSFER_FROM_FAILED");
    }

    function safeTransfer(
        ERC20 token,
        address to,
        uint256 amount
    ) internal {
        bool success;

        /// @solidity memory-safe-assembly
        assembly {
            // Get a pointer to some free memory.
            let freeMemoryPointer := mload(0x40)

            // Write the abi-encoded calldata into memory, beginning with the function selector.
            mstore(freeMemoryPointer, 0xa9059cbb00000000000000000000000000000000000000000000000000000000)
            mstore(add(freeMemoryPointer, 4), to) // Append the "to" argument.
            mstore(add(freeMemoryPointer, 36), amount) // Append the "amount" argument.

            success := and(
                // Set success to whether the call reverted, if not we check it either
                // returned exactly 1 (can't just be non-zero data), or had no return data.
                or(and(eq(mload(0), 1), gt(returndatasize(), 31)), iszero(returndatasize())),
                // We use 68 because the length of our calldata totals up like so: 4 + 32 * 2.
                // We use 0 and 32 to copy up to 32 bytes of return data into the scratch space.
                // Counterintuitively, this call must be positioned second to the or() call in the
                // surrounding and() call or else returndatasize() will be zero during the computation.
                call(gas(), token, 0, freeMemoryPointer, 68, 0, 32)
            )
        }

        require(success, "TRANSFER_FAILED");
    }

    function safeApprove(
        ERC20 token,
        address to,
        uint256 amount
    ) internal {
        bool success;

        /// @solidity memory-safe-assembly
        assembly {
            // Get a pointer to some free memory.
            let freeMemoryPointer := mload(0x40)

            // Write the abi-encoded calldata into memory, beginning with the function selector.
            mstore(freeMemoryPointer, 0x095ea7b300000000000000000000000000000000000000000000000000000000)
            mstore(add(freeMemoryPointer, 4), to) // Append the "to" argument.
            mstore(add(freeMemoryPointer, 36), amount) // Append the "amount" argument.

            success := and(
                // Set success to whether the call reverted, if not we check it either
                // returned exactly 1 (can't just be non-zero data), or had no return data.
                or(and(eq(mload(0), 1), gt(returndatasize(), 31)), iszero(returndatasize())),
                // We use 68 because the length of our calldata totals up like so: 4 + 32 * 2.
                // We use 0 and 32 to copy up to 32 bytes of return data into the scratch space.
                // Counterintuitively, this call must be positioned second to the or() call in the
                // surrounding and() call or else returndatasize() will be zero during the computation.
                call(gas(), token, 0, freeMemoryPointer, 68, 0, 32)
            )
        }

        require(success, "APPROVE_FAILED");
    }
}

File 3 of 3 : ERC20.sol
// SPDX-License-Identifier: AGPL-3.0-only
pragma solidity >=0.8.0;

/// @notice Modern and gas efficient ERC20 + EIP-2612 implementation.
/// @author Solmate (https://github.com/transmissions11/solmate/blob/main/src/tokens/ERC20.sol)
/// @author Modified from Uniswap (https://github.com/Uniswap/uniswap-v2-core/blob/master/contracts/UniswapV2ERC20.sol)
/// @dev Do not manually set balances without updating totalSupply, as the sum of all user balances must not exceed it.
abstract contract ERC20 {
    /*//////////////////////////////////////////////////////////////
                                 EVENTS
    //////////////////////////////////////////////////////////////*/

    event Transfer(address indexed from, address indexed to, uint256 amount);

    event Approval(address indexed owner, address indexed spender, uint256 amount);

    /*//////////////////////////////////////////////////////////////
                            METADATA STORAGE
    //////////////////////////////////////////////////////////////*/

    string public name;

    string public symbol;

    uint8 public immutable decimals;

    /*//////////////////////////////////////////////////////////////
                              ERC20 STORAGE
    //////////////////////////////////////////////////////////////*/

    uint256 public totalSupply;

    mapping(address => uint256) public balanceOf;

    mapping(address => mapping(address => uint256)) public allowance;

    /*//////////////////////////////////////////////////////////////
                            EIP-2612 STORAGE
    //////////////////////////////////////////////////////////////*/

    uint256 internal immutable INITIAL_CHAIN_ID;

    bytes32 internal immutable INITIAL_DOMAIN_SEPARATOR;

    mapping(address => uint256) public nonces;

    /*//////////////////////////////////////////////////////////////
                               CONSTRUCTOR
    //////////////////////////////////////////////////////////////*/

    constructor(
        string memory _name,
        string memory _symbol,
        uint8 _decimals
    ) {
        name = _name;
        symbol = _symbol;
        decimals = _decimals;

        INITIAL_CHAIN_ID = block.chainid;
        INITIAL_DOMAIN_SEPARATOR = computeDomainSeparator();
    }

    /*//////////////////////////////////////////////////////////////
                               ERC20 LOGIC
    //////////////////////////////////////////////////////////////*/

    function approve(address spender, uint256 amount) public virtual returns (bool) {
        allowance[msg.sender][spender] = amount;

        emit Approval(msg.sender, spender, amount);

        return true;
    }

    function transfer(address to, uint256 amount) public virtual returns (bool) {
        balanceOf[msg.sender] -= amount;

        // Cannot overflow because the sum of all user
        // balances can't exceed the max uint256 value.
        unchecked {
            balanceOf[to] += amount;
        }

        emit Transfer(msg.sender, to, amount);

        return true;
    }

    function transferFrom(
        address from,
        address to,
        uint256 amount
    ) public virtual returns (bool) {
        uint256 allowed = allowance[from][msg.sender]; // Saves gas for limited approvals.

        if (allowed != type(uint256).max) allowance[from][msg.sender] = allowed - amount;

        balanceOf[from] -= amount;

        // Cannot overflow because the sum of all user
        // balances can't exceed the max uint256 value.
        unchecked {
            balanceOf[to] += amount;
        }

        emit Transfer(from, to, amount);

        return true;
    }

    /*//////////////////////////////////////////////////////////////
                             EIP-2612 LOGIC
    //////////////////////////////////////////////////////////////*/

    function permit(
        address owner,
        address spender,
        uint256 value,
        uint256 deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) public virtual {
        require(deadline >= block.timestamp, "PERMIT_DEADLINE_EXPIRED");

        // Unchecked because the only math done is incrementing
        // the owner's nonce which cannot realistically overflow.
        unchecked {
            address recoveredAddress = ecrecover(
                keccak256(
                    abi.encodePacked(
                        "\x19\x01",
                        DOMAIN_SEPARATOR(),
                        keccak256(
                            abi.encode(
                                keccak256(
                                    "Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)"
                                ),
                                owner,
                                spender,
                                value,
                                nonces[owner]++,
                                deadline
                            )
                        )
                    )
                ),
                v,
                r,
                s
            );

            require(recoveredAddress != address(0) && recoveredAddress == owner, "INVALID_SIGNER");

            allowance[recoveredAddress][spender] = value;
        }

        emit Approval(owner, spender, value);
    }

    function DOMAIN_SEPARATOR() public view virtual returns (bytes32) {
        return block.chainid == INITIAL_CHAIN_ID ? INITIAL_DOMAIN_SEPARATOR : computeDomainSeparator();
    }

    function computeDomainSeparator() internal view virtual returns (bytes32) {
        return
            keccak256(
                abi.encode(
                    keccak256("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"),
                    keccak256(bytes(name)),
                    keccak256("1"),
                    block.chainid,
                    address(this)
                )
            );
    }

    /*//////////////////////////////////////////////////////////////
                        INTERNAL MINT/BURN LOGIC
    //////////////////////////////////////////////////////////////*/

    function _mint(address to, uint256 amount) internal virtual {
        totalSupply += amount;

        // Cannot overflow because the sum of all user
        // balances can't exceed the max uint256 value.
        unchecked {
            balanceOf[to] += amount;
        }

        emit Transfer(address(0), to, amount);
    }

    function _burn(address from, uint256 amount) internal virtual {
        balanceOf[from] -= amount;

        // Cannot underflow because a user's balance
        // will never be larger than the total supply.
        unchecked {
            totalSupply -= amount;
        }

        emit Transfer(from, address(0), amount);
    }
}

Settings
{
  "optimizer": {
    "enabled": false,
    "runs": 200
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_bitTokenAddress","type":"address"},{"internalType":"address","name":"_mntTokenAddress","type":"address"},{"internalType":"address","name":"_treasury","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"MantleTokenMigrator_ImproperlyInitialized","type":"error"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"MantleTokenMigrator_InvalidFundingToken","type":"error"},{"inputs":[{"internalType":"address","name":"treasury","type":"address"}],"name":"MantleTokenMigrator_InvalidTreasury","type":"error"},{"inputs":[{"internalType":"address","name":"caller","type":"address"}],"name":"MantleTokenMigrator_OnlyOwner","type":"error"},{"inputs":[],"name":"MantleTokenMigrator_OnlyWhenNotHalted","type":"error"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"MantleTokenMigrator_SweepNotAllowed","type":"error"},{"inputs":[],"name":"MantleTokenMigrator_ZeroSwap","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"defunder","type":"address"},{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"ContractDefunded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"halter","type":"address"}],"name":"ContractHalted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"halter","type":"address"}],"name":"ContractUnhalted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amountSwapped","type":"uint256"}],"name":"TokensMigrated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":true,"internalType":"address","name":"recipient","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"TokensSwept","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousTreasury","type":"address"},{"indexed":true,"internalType":"address","name":"newTreasury","type":"address"}],"name":"TreasuryChanged","type":"event"},{"inputs":[],"name":"BIT_TOKEN_ADDRESS","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MNT_TOKEN_ADDRESS","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenAddress","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"defundContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"haltContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"halted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"migrateAllBIT","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"migrateBIT","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_treasury","type":"address"}],"name":"setTreasury","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenAddress","type":"address"},{"internalType":"address","name":"_recipient","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"sweepTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"treasury","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"unhaltContract","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60c06040523480156200001157600080fd5b506040516200163138038062001631833981810160405281019062000037919062000285565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614806200009f5750600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b80620000d75750600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b156200010f576040517fabf2a69500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b33600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060018060146101000a81548160ff0219169083151502179055508273ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff16815250508173ffffffffffffffffffffffffffffffffffffffff1660a08173ffffffffffffffffffffffffffffffffffffffff1681525050806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550505050620002e1565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006200024d8262000220565b9050919050565b6200025f8162000240565b81146200026b57600080fd5b50565b6000815190506200027f8162000254565b92915050565b600080600060608486031215620002a157620002a06200021b565b5b6000620002b1868287016200026e565b9350506020620002c4868287016200026e565b9250506040620002d7868287016200026e565b9150509250925092565b60805160a0516112f9620003386000396000818161034f0152818161045a015281816107810152610e5401526000818161021601528181610405015281816105f00152818161072a0152610e0801526112f96000f3fe608060405234801561001057600080fd5b50600436106100cf5760003560e01c80638e65b3831161008c578063b9b8af0b11610066578063b9b8af0b146101a2578063f0f44260146101c0578063f2fde38b146101dc578063f5720c4a146101f8576100cf565b80638e65b383146101725780639843d1c01461017c578063a0c0a98114610198576100cf565b806320928eda146100d45780636041bbe1146100f257806361d027b3146100fc5780636f5949aa1461011a5780638b6ca32c146101385780638da5cb5b14610154575b600080fd5b6100dc610214565b6040516100e99190610fc9565b60405180910390f35b6100fa610238565b005b610104610329565b6040516101119190610fc9565b60405180910390f35b61012261034d565b60405161012f9190610fc9565b60405180910390f35b610152600480360381019061014d919061104b565b610371565b005b61015c61057f565b6040516101699190610fc9565b60405180910390f35b61017a6105a5565b005b6101966004803603810190610191919061109e565b610696565b005b6101a06108e6565b005b6101aa6109d8565b6040516101b791906110f9565b60405180910390f35b6101da60048036038101906101d59190611114565b6109eb565b005b6101f660048036038101906101f19190611114565b610bab565b005b610212600480360381019061020d9190611141565b610cdb565b005b7f000000000000000000000000000000000000000000000000000000000000000081565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146102ca57336040517f7a9022e10000000000000000000000000000000000000000000000000000000081526004016102c19190610fc9565b60405180910390fd5b60018060146101000a81548160ff0219169083151502179055503373ffffffffffffffffffffffffffffffffffffffff167f6e1f55f40740bb867f895786e5eb43b6cf4252b6d799b4fe46c98f8e55b0d2e260405160405180910390a2565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b7f000000000000000000000000000000000000000000000000000000000000000081565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461040357336040517f7a9022e10000000000000000000000000000000000000000000000000000000081526004016103fa9190610fc9565b60405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614806104a857507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16145b156104ea57826040517fbcdd3a2e0000000000000000000000000000000000000000000000000000000081526004016104e19190610fc9565b60405180910390fd5b61051582828573ffffffffffffffffffffffffffffffffffffffff16610d2e9092919063ffffffff16565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fd092d7fceb5ea5a962639fcc27a7bb315e7637e699e3b108cd570c38c758430083604051610572919061117d565b60405180910390a3505050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600160149054906101000a900460ff16156105ec576040517f16ffb99d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b81526004016106479190610fc9565b602060405180830381865afa158015610664573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061068891906111ad565b905061069381610dc6565b50565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461072857336040517f7a9022e100000000000000000000000000000000000000000000000000000000815260040161071f9190610fc9565b60405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141580156107d057507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b1561081257816040517fa37879940000000000000000000000000000000000000000000000000000000081526004016108099190610fc9565b60405180910390fd5b61085d60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff16828473ffffffffffffffffffffffffffffffffffffffff16610d2e9092919063ffffffff16565b8173ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f2f631ed25e9466ee2a68047d23fdf75c6f52356252725d1286150e8842597d7d836040516108da919061117d565b60405180910390a35050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461097857336040517f7a9022e100000000000000000000000000000000000000000000000000000000815260040161096f9190610fc9565b60405180910390fd5b6000600160146101000a81548160ff0219169083151502179055503373ffffffffffffffffffffffffffffffffffffffff167fe6a38c17b992afcaee76437ed3019e174719c8e7b94d53c8b2a2851323d3955660405160405180910390a2565b600160149054906101000a900460ff1681565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610a7d57336040517f7a9022e1000000000000000000000000000000000000000000000000000000008152600401610a749190610fc9565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610aee57806040517f5b24187d000000000000000000000000000000000000000000000000000000008152600401610ae59190610fc9565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8c3aa5f43a388513435861bf27dfad7829cd248696fed367c62d441f6295449660405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610c3d57336040517f7a9022e1000000000000000000000000000000000000000000000000000000008152600401610c349190610fc9565b60405180910390fd5b80600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a350565b600160149054906101000a900460ff1615610d22576040517f16ffb99d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610d2b81610dc6565b50565b60006040517fa9059cbb000000000000000000000000000000000000000000000000000000008152836004820152826024820152602060006044836000895af13d15601f3d1160016000511416171691505080610dc0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610db790611237565b60405180910390fd5b50505050565b60008103610e00576040517f9df281a500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610e4d3330837f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16610ee9909392919063ffffffff16565b610e9833827f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16610d2e9092919063ffffffff16565b3373ffffffffffffffffffffffffffffffffffffffff167f2558d4091fc8e966ac64668ecbe596974579c9f0e5b2e11d94d1469934ab5fd882604051610ede919061117d565b60405180910390a250565b60006040517f23b872dd0000000000000000000000000000000000000000000000000000000081528460048201528360248201528260448201526020600060648360008a5af13d15601f3d1160016000511416171691505080610f81576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f78906112a3565b60405180910390fd5b5050505050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000610fb382610f88565b9050919050565b610fc381610fa8565b82525050565b6000602082019050610fde6000830184610fba565b92915050565b600080fd5b610ff281610fa8565b8114610ffd57600080fd5b50565b60008135905061100f81610fe9565b92915050565b6000819050919050565b61102881611015565b811461103357600080fd5b50565b6000813590506110458161101f565b92915050565b60008060006060848603121561106457611063610fe4565b5b600061107286828701611000565b935050602061108386828701611000565b925050604061109486828701611036565b9150509250925092565b600080604083850312156110b5576110b4610fe4565b5b60006110c385828601611000565b92505060206110d485828601611036565b9150509250929050565b60008115159050919050565b6110f3816110de565b82525050565b600060208201905061110e60008301846110ea565b92915050565b60006020828403121561112a57611129610fe4565b5b600061113884828501611000565b91505092915050565b60006020828403121561115757611156610fe4565b5b600061116584828501611036565b91505092915050565b61117781611015565b82525050565b6000602082019050611192600083018461116e565b92915050565b6000815190506111a78161101f565b92915050565b6000602082840312156111c3576111c2610fe4565b5b60006111d184828501611198565b91505092915050565b600082825260208201905092915050565b7f5452414e534645525f4641494c45440000000000000000000000000000000000600082015250565b6000611221600f836111da565b915061122c826111eb565b602082019050919050565b6000602082019050818103600083015261125081611214565b9050919050565b7f5452414e534645525f46524f4d5f4641494c4544000000000000000000000000600082015250565b600061128d6014836111da565b915061129882611257565b602082019050919050565b600060208201905081810360008301526112bc81611280565b905091905056fea2646970667358221220e35ba4378473e13fd707925dda4195414cdc3434eb387e56e946c254ea966fec64736f6c634300080f00330000000000000000000000001a4b46696b2bb4794eb3d4c26f1c55f9170fa4c50000000000000000000000003c3a81e81dc49a522a592e7622a7e711c06bf3540000000000000000000000009deaa906829d8cf05ff1f24663ad553cb90bf241

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106100cf5760003560e01c80638e65b3831161008c578063b9b8af0b11610066578063b9b8af0b146101a2578063f0f44260146101c0578063f2fde38b146101dc578063f5720c4a146101f8576100cf565b80638e65b383146101725780639843d1c01461017c578063a0c0a98114610198576100cf565b806320928eda146100d45780636041bbe1146100f257806361d027b3146100fc5780636f5949aa1461011a5780638b6ca32c146101385780638da5cb5b14610154575b600080fd5b6100dc610214565b6040516100e99190610fc9565b60405180910390f35b6100fa610238565b005b610104610329565b6040516101119190610fc9565b60405180910390f35b61012261034d565b60405161012f9190610fc9565b60405180910390f35b610152600480360381019061014d919061104b565b610371565b005b61015c61057f565b6040516101699190610fc9565b60405180910390f35b61017a6105a5565b005b6101966004803603810190610191919061109e565b610696565b005b6101a06108e6565b005b6101aa6109d8565b6040516101b791906110f9565b60405180910390f35b6101da60048036038101906101d59190611114565b6109eb565b005b6101f660048036038101906101f19190611114565b610bab565b005b610212600480360381019061020d9190611141565b610cdb565b005b7f0000000000000000000000001a4b46696b2bb4794eb3d4c26f1c55f9170fa4c581565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146102ca57336040517f7a9022e10000000000000000000000000000000000000000000000000000000081526004016102c19190610fc9565b60405180910390fd5b60018060146101000a81548160ff0219169083151502179055503373ffffffffffffffffffffffffffffffffffffffff167f6e1f55f40740bb867f895786e5eb43b6cf4252b6d799b4fe46c98f8e55b0d2e260405160405180910390a2565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b7f0000000000000000000000003c3a81e81dc49a522a592e7622a7e711c06bf35481565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461040357336040517f7a9022e10000000000000000000000000000000000000000000000000000000081526004016103fa9190610fc9565b60405180910390fd5b7f0000000000000000000000001a4b46696b2bb4794eb3d4c26f1c55f9170fa4c573ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614806104a857507f0000000000000000000000003c3a81e81dc49a522a592e7622a7e711c06bf35473ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16145b156104ea57826040517fbcdd3a2e0000000000000000000000000000000000000000000000000000000081526004016104e19190610fc9565b60405180910390fd5b61051582828573ffffffffffffffffffffffffffffffffffffffff16610d2e9092919063ffffffff16565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fd092d7fceb5ea5a962639fcc27a7bb315e7637e699e3b108cd570c38c758430083604051610572919061117d565b60405180910390a3505050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600160149054906101000a900460ff16156105ec576040517f16ffb99d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60007f0000000000000000000000001a4b46696b2bb4794eb3d4c26f1c55f9170fa4c573ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b81526004016106479190610fc9565b602060405180830381865afa158015610664573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061068891906111ad565b905061069381610dc6565b50565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461072857336040517f7a9022e100000000000000000000000000000000000000000000000000000000815260040161071f9190610fc9565b60405180910390fd5b7f0000000000000000000000001a4b46696b2bb4794eb3d4c26f1c55f9170fa4c573ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141580156107d057507f0000000000000000000000003c3a81e81dc49a522a592e7622a7e711c06bf35473ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b1561081257816040517fa37879940000000000000000000000000000000000000000000000000000000081526004016108099190610fc9565b60405180910390fd5b61085d60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff16828473ffffffffffffffffffffffffffffffffffffffff16610d2e9092919063ffffffff16565b8173ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f2f631ed25e9466ee2a68047d23fdf75c6f52356252725d1286150e8842597d7d836040516108da919061117d565b60405180910390a35050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461097857336040517f7a9022e100000000000000000000000000000000000000000000000000000000815260040161096f9190610fc9565b60405180910390fd5b6000600160146101000a81548160ff0219169083151502179055503373ffffffffffffffffffffffffffffffffffffffff167fe6a38c17b992afcaee76437ed3019e174719c8e7b94d53c8b2a2851323d3955660405160405180910390a2565b600160149054906101000a900460ff1681565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610a7d57336040517f7a9022e1000000000000000000000000000000000000000000000000000000008152600401610a749190610fc9565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610aee57806040517f5b24187d000000000000000000000000000000000000000000000000000000008152600401610ae59190610fc9565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8c3aa5f43a388513435861bf27dfad7829cd248696fed367c62d441f6295449660405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610c3d57336040517f7a9022e1000000000000000000000000000000000000000000000000000000008152600401610c349190610fc9565b60405180910390fd5b80600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a350565b600160149054906101000a900460ff1615610d22576040517f16ffb99d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610d2b81610dc6565b50565b60006040517fa9059cbb000000000000000000000000000000000000000000000000000000008152836004820152826024820152602060006044836000895af13d15601f3d1160016000511416171691505080610dc0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610db790611237565b60405180910390fd5b50505050565b60008103610e00576040517f9df281a500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610e4d3330837f0000000000000000000000001a4b46696b2bb4794eb3d4c26f1c55f9170fa4c573ffffffffffffffffffffffffffffffffffffffff16610ee9909392919063ffffffff16565b610e9833827f0000000000000000000000003c3a81e81dc49a522a592e7622a7e711c06bf35473ffffffffffffffffffffffffffffffffffffffff16610d2e9092919063ffffffff16565b3373ffffffffffffffffffffffffffffffffffffffff167f2558d4091fc8e966ac64668ecbe596974579c9f0e5b2e11d94d1469934ab5fd882604051610ede919061117d565b60405180910390a250565b60006040517f23b872dd0000000000000000000000000000000000000000000000000000000081528460048201528360248201528260448201526020600060648360008a5af13d15601f3d1160016000511416171691505080610f81576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f78906112a3565b60405180910390fd5b5050505050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000610fb382610f88565b9050919050565b610fc381610fa8565b82525050565b6000602082019050610fde6000830184610fba565b92915050565b600080fd5b610ff281610fa8565b8114610ffd57600080fd5b50565b60008135905061100f81610fe9565b92915050565b6000819050919050565b61102881611015565b811461103357600080fd5b50565b6000813590506110458161101f565b92915050565b60008060006060848603121561106457611063610fe4565b5b600061107286828701611000565b935050602061108386828701611000565b925050604061109486828701611036565b9150509250925092565b600080604083850312156110b5576110b4610fe4565b5b60006110c385828601611000565b92505060206110d485828601611036565b9150509250929050565b60008115159050919050565b6110f3816110de565b82525050565b600060208201905061110e60008301846110ea565b92915050565b60006020828403121561112a57611129610fe4565b5b600061113884828501611000565b91505092915050565b60006020828403121561115757611156610fe4565b5b600061116584828501611036565b91505092915050565b61117781611015565b82525050565b6000602082019050611192600083018461116e565b92915050565b6000815190506111a78161101f565b92915050565b6000602082840312156111c3576111c2610fe4565b5b60006111d184828501611198565b91505092915050565b600082825260208201905092915050565b7f5452414e534645525f4641494c45440000000000000000000000000000000000600082015250565b6000611221600f836111da565b915061122c826111eb565b602082019050919050565b6000602082019050818103600083015261125081611214565b9050919050565b7f5452414e534645525f46524f4d5f4641494c4544000000000000000000000000600082015250565b600061128d6014836111da565b915061129882611257565b602082019050919050565b600060208201905081810360008301526112bc81611280565b905091905056fea2646970667358221220e35ba4378473e13fd707925dda4195414cdc3434eb387e56e946c254ea966fec64736f6c634300080f0033

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

0000000000000000000000001a4b46696b2bb4794eb3d4c26f1c55f9170fa4c50000000000000000000000003c3a81e81dc49a522a592e7622a7e711c06bf3540000000000000000000000009deaa906829d8cf05ff1f24663ad553cb90bf241

-----Decoded View---------------
Arg [0] : _bitTokenAddress (address): 0x1A4b46696b2bB4794Eb3D4c26f1c55F9170fa4C5
Arg [1] : _mntTokenAddress (address): 0x3c3a81e81dc49A522A592e7622A7E711c06bf354
Arg [2] : _treasury (address): 0x9deAA906829D8cf05ff1f24663aD553cb90bF241

-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 0000000000000000000000001a4b46696b2bb4794eb3d4c26f1c55f9170fa4c5
Arg [1] : 0000000000000000000000003c3a81e81dc49a522a592e7622a7e711c06bf354
Arg [2] : 0000000000000000000000009deaa906829d8cf05ff1f24663ad553cb90bf241


Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

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

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading
[ Download: CSV Export  ]

A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.