ETH Price: $3,266.96 (+0.62%)

Contract

0xbD2fBaf2dc95bD78Cf1cD3c5235B33D1165E6797
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
0xc1ffd3952e63549280f3d28e2b9912a03debbdfd9ebfeb7096a1c01decfe4628 Deposit(pending)2025-01-05 1:22:456 days ago1736040165IN
0xbD2fBaf2...1165E6797
0 ETH(Pending)(Pending)
Withdraw215839942025-01-09 2:39:112 days ago1736390351IN
0xbD2fBaf2...1165E6797
0 ETH0.000428126
Deposit215722932025-01-07 11:28:114 days ago1736249291IN
0xbD2fBaf2...1165E6797
0 ETH0.00062588.4
Withdraw215654032025-01-06 12:24:475 days ago1736166287IN
0xbD2fBaf2...1165E6797
0 ETH0.001054359.97989483
Deposit215629032025-01-06 4:00:235 days ago1736136023IN
0xbD2fBaf2...1165E6797
0 ETH0.000597696.63915861
Withdraw215622932025-01-06 1:57:475 days ago1736128667IN
0xbD2fBaf2...1165E6797
0 ETH0.000307766.3565395
Withdraw215622902025-01-06 1:57:115 days ago1736128631IN
0xbD2fBaf2...1165E6797
0 ETH0.000668476.32811917
Withdraw215608712025-01-05 21:09:475 days ago1736111387IN
0xbD2fBaf2...1165E6797
0 ETH0.0010085910.9544196
Withdraw215530342025-01-04 18:53:596 days ago1736016839IN
0xbD2fBaf2...1165E6797
0 ETH0.000699437.9
Withdraw215529512025-01-04 18:37:236 days ago1736015843IN
0xbD2fBaf2...1165E6797
0 ETH0.000826179.33276023
Withdraw215470812025-01-03 22:56:477 days ago1735945007IN
0xbD2fBaf2...1165E6797
0 ETH0.0008869510.44334961
Withdraw215465222025-01-03 21:04:237 days ago1735938263IN
0xbD2fBaf2...1165E6797
0 ETH0.0012637114.28671194
Deposit215439192025-01-03 12:20:478 days ago1735906847IN
0xbD2fBaf2...1165E6797
0 ETH0.000815328.18681092
Withdraw215419402025-01-03 5:43:358 days ago1735883015IN
0xbD2fBaf2...1165E6797
0 ETH0.000419314.93719969
Withdraw215350962025-01-02 6:48:599 days ago1735800539IN
0xbD2fBaf2...1165E6797
0 ETH0.0011805713.90055553
Withdraw215273592025-01-01 4:54:4710 days ago1735707287IN
0xbD2fBaf2...1165E6797
0 ETH0.000238822.7
Withdraw215266832025-01-01 2:38:5910 days ago1735699139IN
0xbD2fBaf2...1165E6797
0 ETH0.000192342.67384214
Withdraw215266812025-01-01 2:38:3510 days ago1735699115IN
0xbD2fBaf2...1165E6797
0 ETH0.000223722.63420309
Deposit215218412024-12-31 10:24:2311 days ago1735640663IN
0xbD2fBaf2...1165E6797
0 ETH0.0019881120.9
Withdraw215105202024-12-29 20:28:4712 days ago1735504127IN
0xbD2fBaf2...1165E6797
0 ETH0.000368644.34060851
Deposit215096162024-12-29 17:27:2312 days ago1735493243IN
0xbD2fBaf2...1165E6797
0 ETH0.000653346.9
Withdraw215095242024-12-29 17:08:5912 days ago1735492139IN
0xbD2fBaf2...1165E6797
0 ETH0.000729056.9
Deposit215085072024-12-29 13:44:3513 days ago1735479875IN
0xbD2fBaf2...1165E6797
0 ETH0.000422215.66637419
Deposit215065852024-12-29 7:18:4713 days ago1735456727IN
0xbD2fBaf2...1165E6797
0 ETH0.000273543.19290876
Withdraw215039702024-12-28 22:32:5913 days ago1735425179IN
0xbD2fBaf2...1165E6797
0 ETH0.000496685.6107063
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:
mSpellStaking

Compiler Version
v0.8.10+commit.fc410830

Optimization Enabled:
Yes with 690 runs

Other Settings:
default evmVersion
File 1 of 4 : mSpell.sol
// SPDX-License-Identifier: MIT
// Inspired by Stable Joe Staking which in turn is derived from the SushiSwap MasterChef contract

pragma solidity 0.8.10;
import "@rari-capital/solmate/src/utils/SafeTransferLib.sol";
import "../libraries/BoringOwnable.sol";

/**
 * @title Magic Spell Staking
 * @author 0xMerlin
 */
contract mSpellStaking is BoringOwnable {
    using SafeTransferLib for ERC20;

    /// @notice Info of each user
    struct UserInfo {
        uint128 amount;

        uint128 rewardDebt;
        uint128 lastAdded;
        /**
         * @notice We do some fancy math here. Basically, any point in time, the amount of JOEs
         * entitled to a user but is pending to be distributed is:
         *
         *   pending reward = (user.amount * accRewardPerShare) - user.rewardDebt[token]
         *
         * Whenever a user deposits or withdraws SPELL. Here's what happens:
         *   1. accRewardPerShare (and `lastRewardBalance`) gets updated
         *   2. User receives the pending reward sent to his/her address
         *   3. User's `amount` gets updated
         *   4. User's `rewardDebt[token]` gets updated
         */
    }

    ERC20 public immutable spell;
    /// @notice Array of tokens that users can claim
    ERC20 public immutable mim;
    /// @notice Last reward balance of `token`
    uint256 public lastRewardBalance;

    /// @notice amount of time that the position is locked for.
    uint256 private constant LOCK_TIME = 24 hours;
    bool public toggleLockup;

    /// @notice Accumulated `token` rewards per share, scaled to `ACC_REWARD_PER_SHARE_PRECISION`
    uint256 public accRewardPerShare;
    /// @notice The precision of `accRewardPerShare`
    uint256 public constant ACC_REWARD_PER_SHARE_PRECISION = 1e24;

    /// @dev Info of each user that stakes SPELL
    mapping(address => UserInfo) public userInfo;

    /// @notice Emitted when a user deposits SPELL
    event Deposit(address indexed user, uint256 amount);

    /// @notice Emitted when a user withdraws SPELL
    event Withdraw(address indexed user, uint256 amount);

    /// @notice Emitted when a user claims reward
    event ClaimReward(address indexed user, uint256 amount);

    /// @notice Emitted when a user emergency withdraws its SPELL
    event EmergencyWithdraw(address indexed user, uint256 amount);

    /**
     * @notice Initialize a new mSpellStaking contract
     * @dev This contract needs to receive an ERC20 `_rewardToken` in order to distribute them
     * (with MoneyMaker in our case)
     * @param _mim The address of the MIM token
     * @param _spell The address of the SPELL token
     */
    constructor(
        ERC20 _mim,
        ERC20 _spell
    ) {
        require(address(_mim) != address(0), "mSpellStaking: reward token can't be address(0)");
        require(address(_spell) != address(0), "mSpellStaking: spell can't be address(0)");

        spell = _spell;
        toggleLockup = true;

        mim = _mim;
    }

    /**
     * @notice Deposit SPELL for reward token allocation
     * @param _amount The amount of SPELL to deposit
     */
    function deposit(uint256 _amount) external {
        UserInfo storage user = userInfo[msg.sender];

        uint256 _previousAmount = user.amount;
        uint256 _newAmount = user.amount + _amount;
        user.amount = uint128(_newAmount);
        user.lastAdded = uint128(block.timestamp);

        updateReward();

        uint256 _previousRewardDebt = user.rewardDebt;
        user.rewardDebt = uint128(_newAmount * accRewardPerShare / ACC_REWARD_PER_SHARE_PRECISION);

        if (_previousAmount != 0) {
            uint256 _pending = _previousAmount * accRewardPerShare / ACC_REWARD_PER_SHARE_PRECISION - _previousRewardDebt;
            if (_pending != 0) {
                safeTokenTransfer(mim, msg.sender, _pending);
                emit ClaimReward(msg.sender, _pending);
            }
        }

        spell.safeTransferFrom(msg.sender, address(this), _amount);
        emit Deposit(msg.sender, _amount);
    }

    /**
     * @notice View function to see pending reward token on frontend
     * @param _user The address of the user
     * @return `_user`'s pending reward token
     */
    function pendingReward(address _user) external view returns (uint256) {
        UserInfo storage user = userInfo[_user];
        uint256 _totalSpell = spell.balanceOf(address(this));
        uint256 _accRewardTokenPerShare = accRewardPerShare;

        uint256 _rewardBalance = mim.balanceOf(address(this));

        if (_rewardBalance != lastRewardBalance && _totalSpell != 0) {
            uint256 _accruedReward = _rewardBalance - lastRewardBalance;
            _accRewardTokenPerShare = _accRewardTokenPerShare + _accruedReward * ACC_REWARD_PER_SHARE_PRECISION / _totalSpell;
        }
        return user.amount * _accRewardTokenPerShare / ACC_REWARD_PER_SHARE_PRECISION - user.rewardDebt;
    }

    /**
     * @notice Withdraw SPELL and harvest the rewards
     * @param _amount The amount of SPELL to withdraw
     */
    function withdraw(uint256 _amount) external {
        UserInfo storage user = userInfo[msg.sender];

        require(!toggleLockup || user.lastAdded + LOCK_TIME < block.timestamp, "mSpell: Wait for LockUp");

        uint256 _previousAmount = user.amount;
        uint256 _newAmount = user.amount - _amount;
        user.amount = uint128(_newAmount);

        updateReward();

        uint256 _pending = _previousAmount * accRewardPerShare / ACC_REWARD_PER_SHARE_PRECISION - user.rewardDebt;
        user.rewardDebt = uint128(_newAmount * accRewardPerShare / ACC_REWARD_PER_SHARE_PRECISION);

        if (_pending != 0) {
            safeTokenTransfer(mim, msg.sender, _pending);
            emit ClaimReward(msg.sender, _pending);
        }

        spell.safeTransfer(msg.sender, _amount);
        emit Withdraw(msg.sender, _amount);
    }

    /**
     * @notice Withdraw without caring about rewards. EMERGENCY ONLY
     */
    function emergencyWithdraw() external {
        UserInfo storage user = userInfo[msg.sender];

        require(!toggleLockup || user.lastAdded + LOCK_TIME < block.timestamp, "mSpell: Wait for LockUp");

        uint256 _amount = user.amount;

        user.amount = 0;
        user.rewardDebt = 0;

        spell.safeTransfer(msg.sender, _amount);
        emit EmergencyWithdraw(msg.sender, _amount);
    }

    /**
     * @notice Update reward variables
     * @dev Needs to be called before any deposit or withdrawal
     */
    function updateReward() public {
        uint256 _rewardBalance = mim.balanceOf(address(this));
        uint256 _totalSpell = spell.balanceOf(address(this));

        // Did mSpellStaking receive any token
        if (_rewardBalance == lastRewardBalance || _totalSpell == 0) {
            return;
        }

        uint256 _accruedReward = _rewardBalance - lastRewardBalance;

        accRewardPerShare = accRewardPerShare + _accruedReward * ACC_REWARD_PER_SHARE_PRECISION / _totalSpell;
        lastRewardBalance = _rewardBalance;
    }

    /**
     * @notice Safe token transfer function, just in case if rounding error
     * causes pool to not have enough reward tokens
     * @param _token The address of then token to transfer
     * @param _to The address that will receive `_amount` `rewardToken`
     * @param _amount The amount to send to `_to`
     */
    function safeTokenTransfer(
        ERC20 _token,
        address _to,
        uint256 _amount
    ) internal {
        uint256 _rewardBalance = _token.balanceOf(address(this));

        if (_amount > _rewardBalance) {
            lastRewardBalance = lastRewardBalance - _rewardBalance;
            _token.safeTransfer(_to, _rewardBalance);
        } else {
            lastRewardBalance = lastRewardBalance - _amount;
            _token.safeTransfer(_to, _amount);
        }
    }

    /**
     * @notice Allows to enable and disable the lockup
     * @param status The new lockup status
     */

     function toggleLockUp(bool status) external onlyOwner {
        toggleLockup = status;
     }
}

File 2 of 4 : 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 Modified from Gnosis (https://github.com/gnosis/gp-v2-contracts/blob/main/src/contracts/libraries/GPv2SafeERC20.sol)
/// @dev Use with caution! Some functions in this library knowingly create dirty bits at the destination of the free memory pointer.
library SafeTransferLib {
    /*///////////////////////////////////////////////////////////////
                            ETH OPERATIONS
    //////////////////////////////////////////////////////////////*/

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

        assembly {
            // Transfer the ETH and store if it succeeded or not.
            callStatus := call(gas(), to, amount, 0, 0, 0, 0)
        }

        require(callStatus, "ETH_TRANSFER_FAILED");
    }

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

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

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

            // Write the abi-encoded calldata to memory piece by piece:
            mstore(freeMemoryPointer, 0x23b872dd00000000000000000000000000000000000000000000000000000000) // Begin with the function selector.
            mstore(add(freeMemoryPointer, 4), and(from, 0xffffffffffffffffffffffffffffffffffffffff)) // Mask and append the "from" argument.
            mstore(add(freeMemoryPointer, 36), and(to, 0xffffffffffffffffffffffffffffffffffffffff)) // Mask and append the "to" argument.
            mstore(add(freeMemoryPointer, 68), amount) // Finally append the "amount" argument. No mask as it's a full 32 byte value.

            // Call the token and store if it succeeded or not.
            // We use 100 because the calldata length is 4 + 32 * 3.
            callStatus := call(gas(), token, 0, freeMemoryPointer, 100, 0, 0)
        }

        require(didLastOptionalReturnCallSucceed(callStatus), "TRANSFER_FROM_FAILED");
    }

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

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

            // Write the abi-encoded calldata to memory piece by piece:
            mstore(freeMemoryPointer, 0xa9059cbb00000000000000000000000000000000000000000000000000000000) // Begin with the function selector.
            mstore(add(freeMemoryPointer, 4), and(to, 0xffffffffffffffffffffffffffffffffffffffff)) // Mask and append the "to" argument.
            mstore(add(freeMemoryPointer, 36), amount) // Finally append the "amount" argument. No mask as it's a full 32 byte value.

            // Call the token and store if it succeeded or not.
            // We use 68 because the calldata length is 4 + 32 * 2.
            callStatus := call(gas(), token, 0, freeMemoryPointer, 68, 0, 0)
        }

        require(didLastOptionalReturnCallSucceed(callStatus), "TRANSFER_FAILED");
    }

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

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

            // Write the abi-encoded calldata to memory piece by piece:
            mstore(freeMemoryPointer, 0x095ea7b300000000000000000000000000000000000000000000000000000000) // Begin with the function selector.
            mstore(add(freeMemoryPointer, 4), and(to, 0xffffffffffffffffffffffffffffffffffffffff)) // Mask and append the "to" argument.
            mstore(add(freeMemoryPointer, 36), amount) // Finally append the "amount" argument. No mask as it's a full 32 byte value.

            // Call the token and store if it succeeded or not.
            // We use 68 because the calldata length is 4 + 32 * 2.
            callStatus := call(gas(), token, 0, freeMemoryPointer, 68, 0, 0)
        }

        require(didLastOptionalReturnCallSucceed(callStatus), "APPROVE_FAILED");
    }

    /*///////////////////////////////////////////////////////////////
                         INTERNAL HELPER LOGIC
    //////////////////////////////////////////////////////////////*/

    function didLastOptionalReturnCallSucceed(bool callStatus) private pure returns (bool success) {
        assembly {
            // Get how many bytes the call returned.
            let returnDataSize := returndatasize()

            // If the call reverted:
            if iszero(callStatus) {
                // Copy the revert message into memory.
                returndatacopy(0, 0, returnDataSize)

                // Revert with the same message.
                revert(0, returnDataSize)
            }

            switch returnDataSize
            case 32 {
                // Copy the return data into memory.
                returndatacopy(0, 0, returnDataSize)

                // Set success to whether it returned true.
                success := iszero(iszero(mload(0)))
            }
            case 0 {
                // There was no return data.
                success := 1
            }
            default {
                // It returned some malformed input.
                success := 0
            }
        }
    }
}

File 3 of 4 : BoringOwnable.sol
// SPDX-License-Identifier: MIT
pragma solidity >=0.6.12;

// Audit on 5-Jan-2021 by Keno and BoringCrypto
// Source: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/access/Ownable.sol + Claimable.sol
// Edited by BoringCrypto

contract BoringOwnableData {
    address public owner;
    address public pendingOwner;
}

contract BoringOwnable is BoringOwnableData {
    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

    /// @notice `owner` defaults to msg.sender on construction.
    constructor() {
        owner = msg.sender;
        emit OwnershipTransferred(address(0), msg.sender);
    }

    /// @notice Transfers ownership to `newOwner`. Either directly or claimable by the new pending owner.
    /// Can only be invoked by the current `owner`.
    /// @param newOwner Address of the new owner.
    /// @param direct True if `newOwner` should be set immediately. False if `newOwner` needs to use `claimOwnership`.
    /// @param renounce Allows the `newOwner` to be `address(0)` if `direct` and `renounce` is True. Has no effect otherwise.
    function transferOwnership(
        address newOwner,
        bool direct,
        bool renounce
    ) public onlyOwner {
        if (direct) {
            // Checks
            require(newOwner != address(0) || renounce, "Ownable: zero address");

            // Effects
            emit OwnershipTransferred(owner, newOwner);
            owner = newOwner;
            pendingOwner = address(0);
        } else {
            // Effects
            pendingOwner = newOwner;
        }
    }

    /// @notice Needs to be called by `pendingOwner` to claim ownership.
    function claimOwnership() public {
        address _pendingOwner = pendingOwner;

        // Checks
        require(msg.sender == _pendingOwner, "Ownable: caller != pending owner");

        // Effects
        emit OwnershipTransferred(owner, _pendingOwner);
        owner = _pendingOwner;
        pendingOwner = address(0);
    }

    /// @notice Only allows the `owner` to execute the function.
    modifier onlyOwner() {
        require(msg.sender == owner, "Ownable: caller is not the owner");
        _;
    }
}

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

/// @notice Modern and gas efficient ERC20 + EIP-2612 implementation.
/// @author Modified from Uniswap (https://github.com/Uniswap/uniswap-v2-core/blob/master/contracts/UniswapV2ERC20.sol)
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
    //////////////////////////////////////////////////////////////*/

    bytes32 public constant PERMIT_TYPEHASH =
        keccak256("Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)");

    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) {
        if (allowance[from][msg.sender] != type(uint256).max) {
            allowance[from][msg.sender] -= 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 {
            bytes32 digest = keccak256(
                abi.encodePacked(
                    "\x19\x01",
                    DOMAIN_SEPARATOR(),
                    keccak256(abi.encode(PERMIT_TYPEHASH, owner, spender, value, nonces[owner]++, deadline))
                )
            );

            address recoveredAddress = ecrecover(digest, v, r, s);
            require(recoveredAddress != address(0) && recoveredAddress == owner, "INVALID_PERMIT_SIGNATURE");

            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(bytes("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": true,
    "runs": 690
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  },
  "metadata": {
    "useLiteralContent": true
  },
  "libraries": {}
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"contract ERC20","name":"_mim","type":"address"},{"internalType":"contract ERC20","name":"_spell","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"ClaimReward","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"EmergencyWithdraw","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":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Withdraw","type":"event"},{"inputs":[],"name":"ACC_REWARD_PER_SHARE_PRECISION","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"accRewardPerShare","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claimOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"emergencyWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"lastRewardBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mim","outputs":[{"internalType":"contract ERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pendingOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"pendingReward","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"spell","outputs":[{"internalType":"contract ERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"status","type":"bool"}],"name":"toggleLockUp","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"toggleLockup","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"},{"internalType":"bool","name":"direct","type":"bool"},{"internalType":"bool","name":"renounce","type":"bool"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"updateReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"userInfo","outputs":[{"internalType":"uint128","name":"amount","type":"uint128"},{"internalType":"uint128","name":"rewardDebt","type":"uint128"},{"internalType":"uint128","name":"lastAdded","type":"uint128"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60c060405234801561001057600080fd5b50604051620013a3380380620013a38339810160408190526100319161018a565b600080546001600160a01b0319163390811782556040519091907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a36001600160a01b0382166100e35760405162461bcd60e51b815260206004820152602f60248201527f6d5370656c6c5374616b696e673a2072657761726420746f6b656e2063616e2760448201526e74206265206164647265737328302960881b60648201526084015b60405180910390fd5b6001600160a01b03811661014a5760405162461bcd60e51b815260206004820152602860248201527f6d5370656c6c5374616b696e673a207370656c6c2063616e2774206265206164604482015267647265737328302960c01b60648201526084016100da565b6001600160a01b039081166080526003805460ff191660011790551660a0526101bd565b80516001600160a01b038116811461018557600080fd5b919050565b6000806040838503121561019d57600080fd5b6101a68361016e565b91506101b46020840161016e565b90509250929050565b60805160a0516111816200022260003960008181610245015281816106090152818161089b01528181610a7c0152610c9e01526000818161029a015281816106720152818161090601528181610a0401528181610b120152610c1201526111816000f3fe608060405234801561001057600080fd5b506004361061011b5760003560e01c8063939d6237116100b2578063e30c397811610081578063f36c0a7211610066578063f36c0a72146102bc578063f40f0f52146102c4578063fa4caa74146102d757600080fd5b8063e30c397814610282578063ea762b791461029557600080fd5b8063939d6237146102375780639f67679e14610240578063b6b55f2514610267578063db2e21bc1461027a57600080fd5b80633c97d5ae116100ee5780633c97d5ae146101c85780634e71e0c8146101e757806366309ce5146101ef5780638da5cb5b1461020c57600080fd5b8063078dfbe7146101205780630cd1c084146101355780631959a002146101485780632e1a7d4d146101b5575b600080fd5b61013361012e366004611013565b6102e0565b005b610133610143366004611056565b610446565b610186610156366004611078565b600560205260009081526040902080546001909101546001600160801b0380831692600160801b90048116911683565b604080516001600160801b03948516815292841660208401529216918101919091526060015b60405180910390f35b6101336101c3366004611093565b6104b3565b6101d969d3c21bcecceda100000081565b6040519081526020016101ac565b6101336106d6565b6003546101fc9060ff1681565b60405190151581526020016101ac565b60005461021f906001600160a01b031681565b6040516001600160a01b0390911681526020016101ac565b6101d960045481565b61021f7f000000000000000000000000000000000000000000000000000000000000000081565b610133610275366004611093565b6107a0565b610133610960565b60015461021f906001600160a01b031681565b61021f7f000000000000000000000000000000000000000000000000000000000000000081565b610133610a64565b6101d96102d2366004611078565b610bde565b6101d960025481565b6000546001600160a01b0316331461033f5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b8115610417576001600160a01b0383161515806103595750805b6103a55760405162461bcd60e51b815260206004820152601560248201527f4f776e61626c653a207a65726f206164647265737300000000000000000000006044820152606401610336565b600080546040516001600160a01b03808716939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b03851673ffffffffffffffffffffffffffffffffffffffff1991821617909155600180549091169055505050565b600180546001600160a01b03851673ffffffffffffffffffffffffffffffffffffffff19909116179055505050565b6000546001600160a01b031633146104a05760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610336565b6003805460ff1916911515919091179055565b33600090815260056020526040902060035460ff1615806104ef5750600181015442906104ed9062015180906001600160801b03166110c2565b105b61053b5760405162461bcd60e51b815260206004820152601760248201527f6d5370656c6c3a205761697420666f72204c6f636b55700000000000000000006044820152606401610336565b80546001600160801b0316600061055284836110da565b83546fffffffffffffffffffffffffffffffff19166001600160801b038216178455905061057e610a64565b8254600454600091600160801b90046001600160801b03169069d3c21bcecceda1000000906105ad90866110f1565b6105b79190611110565b6105c191906110da565b905069d3c21bcecceda1000000600454836105dc91906110f1565b6105e69190611110565b84546001600160801b03918216600160801b02911617845580156106655761062f7f00000000000000000000000000000000000000000000000000000000000000003383610db2565b60405181815233907fba8de60c3403ec381d1d484652ea1980e3c3e56359195c92525bff4ce47ad98e9060200160405180910390a25b6106996001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000163387610e7c565b60405185815233907f884edad9ce6fa2440d8a54cc123490eb96d2768479d49ff9c7366125a9424364906020015b60405180910390a25050505050565b6001546001600160a01b03163381146107315760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c657220213d2070656e64696e67206f776e65726044820152606401610336565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0390921673ffffffffffffffffffffffffffffffffffffffff19928316179055600180549091169055565b336000908152600560205260408120805490916001600160801b03909116906107c984836110c2565b83546001600160801b038083166fffffffffffffffffffffffffffffffff1992831617865560018601805442909216919092161790559050610809610a64565b8254600454600160801b9091046001600160801b03169069d3c21bcecceda10000009061083690846110f1565b6108409190611110565b84546001600160801b03918216600160801b02911617845582156108f95760008169d3c21bcecceda10000006004548661087a91906110f1565b6108849190611110565b61088e91906110da565b905080156108f7576108c17f00000000000000000000000000000000000000000000000000000000000000003383610db2565b60405181815233907fba8de60c3403ec381d1d484652ea1980e3c3e56359195c92525bff4ce47ad98e9060200160405180910390a25b505b61092e6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016333088610f03565b60405185815233907fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c906020016106c7565b33600090815260056020526040902060035460ff16158061099c57506001810154429061099a9062015180906001600160801b03166110c2565b105b6109e85760405162461bcd60e51b815260206004820152601760248201527f6d5370656c6c3a205761697420666f72204c6f636b55700000000000000000006044820152606401610336565b8054600082556001600160801b0316610a2b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000163383610e7c565b60405181815233907f5fafa99d0643513820be26656b45130b01e1c03062e1266bf36f88cbd3bd96959060200160405180910390a25050565b6040516370a0823160e01b81523060048201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a0823190602401602060405180830381865afa158015610acb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610aef9190611132565b6040516370a0823160e01b81523060048201529091506000906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa158015610b59573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b7d9190611132565b9050600254821480610b8d575080155b15610b96575050565b600060025483610ba691906110da565b905081610bbd69d3c21bcecceda1000000836110f1565b610bc79190611110565b600454610bd491906110c2565b6004555050600255565b6001600160a01b0381811660009081526005602052604080822090516370a0823160e01b81523060048201529192909183917f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa158015610c59573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c7d9190611132565b600480546040516370a0823160e01b815230928101929092529192506000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a0823190602401602060405180830381865afa158015610ced573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d119190611132565b90506002548114158015610d2457508215155b15610d6857600060025482610d3991906110da565b905083610d5069d3c21bcecceda1000000836110f1565b610d5a9190611110565b610d6490846110c2565b9250505b83546001600160801b03600160801b820481169169d3c21bcecceda100000091610d94918691166110f1565b610d9e9190611110565b610da891906110da565b9695505050505050565b6040516370a0823160e01b81523060048201526000906001600160a01b038516906370a0823190602401602060405180830381865afa158015610df9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e1d9190611132565b905080821115610e515780600254610e3591906110da565b600255610e4c6001600160a01b0385168483610e7c565b610e76565b81600254610e5f91906110da565b600255610e766001600160a01b0385168484610e7c565b50505050565b600060405163a9059cbb60e01b81526001600160a01b03841660048201528260248201526000806044836000895af1915050610eb781610fa0565b610e765760405162461bcd60e51b815260206004820152600f60248201527f5452414e534645525f4641494c454400000000000000000000000000000000006044820152606401610336565b60006040516323b872dd60e01b81526001600160a01b03851660048201526001600160a01b038416602482015282604482015260008060648360008a5af1915050610f4d81610fa0565b610f995760405162461bcd60e51b815260206004820152601460248201527f5452414e534645525f46524f4d5f4641494c45440000000000000000000000006044820152606401610336565b5050505050565b60003d82610fb257806000803e806000fd5b8060208114610fca578015610fdb5760009250610fe0565b816000803e60005115159250610fe0565b600192505b5050919050565b80356001600160a01b0381168114610ffe57600080fd5b919050565b80358015158114610ffe57600080fd5b60008060006060848603121561102857600080fd5b61103184610fe7565b925061103f60208501611003565b915061104d60408501611003565b90509250925092565b60006020828403121561106857600080fd5b61107182611003565b9392505050565b60006020828403121561108a57600080fd5b61107182610fe7565b6000602082840312156110a557600080fd5b5035919050565b634e487b7160e01b600052601160045260246000fd5b600082198211156110d5576110d56110ac565b500190565b6000828210156110ec576110ec6110ac565b500390565b600081600019048311821515161561110b5761110b6110ac565b500290565b60008261112d57634e487b7160e01b600052601260045260246000fd5b500490565b60006020828403121561114457600080fd5b505191905056fea2646970667358221220ae1d4d0c25e1f396da5c1086199369a6eb7f8b6f60e9869299e97b603fc65fcd64736f6c634300080a003300000000000000000000000099d8a9c45b2eca8864373a26d1459e3dff1e17f3000000000000000000000000090185f2135308bad17527004364ebcc2d37e5f6

Deployed Bytecode

0x608060405234801561001057600080fd5b506004361061011b5760003560e01c8063939d6237116100b2578063e30c397811610081578063f36c0a7211610066578063f36c0a72146102bc578063f40f0f52146102c4578063fa4caa74146102d757600080fd5b8063e30c397814610282578063ea762b791461029557600080fd5b8063939d6237146102375780639f67679e14610240578063b6b55f2514610267578063db2e21bc1461027a57600080fd5b80633c97d5ae116100ee5780633c97d5ae146101c85780634e71e0c8146101e757806366309ce5146101ef5780638da5cb5b1461020c57600080fd5b8063078dfbe7146101205780630cd1c084146101355780631959a002146101485780632e1a7d4d146101b5575b600080fd5b61013361012e366004611013565b6102e0565b005b610133610143366004611056565b610446565b610186610156366004611078565b600560205260009081526040902080546001909101546001600160801b0380831692600160801b90048116911683565b604080516001600160801b03948516815292841660208401529216918101919091526060015b60405180910390f35b6101336101c3366004611093565b6104b3565b6101d969d3c21bcecceda100000081565b6040519081526020016101ac565b6101336106d6565b6003546101fc9060ff1681565b60405190151581526020016101ac565b60005461021f906001600160a01b031681565b6040516001600160a01b0390911681526020016101ac565b6101d960045481565b61021f7f00000000000000000000000099d8a9c45b2eca8864373a26d1459e3dff1e17f381565b610133610275366004611093565b6107a0565b610133610960565b60015461021f906001600160a01b031681565b61021f7f000000000000000000000000090185f2135308bad17527004364ebcc2d37e5f681565b610133610a64565b6101d96102d2366004611078565b610bde565b6101d960025481565b6000546001600160a01b0316331461033f5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b8115610417576001600160a01b0383161515806103595750805b6103a55760405162461bcd60e51b815260206004820152601560248201527f4f776e61626c653a207a65726f206164647265737300000000000000000000006044820152606401610336565b600080546040516001600160a01b03808716939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b03851673ffffffffffffffffffffffffffffffffffffffff1991821617909155600180549091169055505050565b600180546001600160a01b03851673ffffffffffffffffffffffffffffffffffffffff19909116179055505050565b6000546001600160a01b031633146104a05760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610336565b6003805460ff1916911515919091179055565b33600090815260056020526040902060035460ff1615806104ef5750600181015442906104ed9062015180906001600160801b03166110c2565b105b61053b5760405162461bcd60e51b815260206004820152601760248201527f6d5370656c6c3a205761697420666f72204c6f636b55700000000000000000006044820152606401610336565b80546001600160801b0316600061055284836110da565b83546fffffffffffffffffffffffffffffffff19166001600160801b038216178455905061057e610a64565b8254600454600091600160801b90046001600160801b03169069d3c21bcecceda1000000906105ad90866110f1565b6105b79190611110565b6105c191906110da565b905069d3c21bcecceda1000000600454836105dc91906110f1565b6105e69190611110565b84546001600160801b03918216600160801b02911617845580156106655761062f7f00000000000000000000000099d8a9c45b2eca8864373a26d1459e3dff1e17f33383610db2565b60405181815233907fba8de60c3403ec381d1d484652ea1980e3c3e56359195c92525bff4ce47ad98e9060200160405180910390a25b6106996001600160a01b037f000000000000000000000000090185f2135308bad17527004364ebcc2d37e5f6163387610e7c565b60405185815233907f884edad9ce6fa2440d8a54cc123490eb96d2768479d49ff9c7366125a9424364906020015b60405180910390a25050505050565b6001546001600160a01b03163381146107315760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c657220213d2070656e64696e67206f776e65726044820152606401610336565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0390921673ffffffffffffffffffffffffffffffffffffffff19928316179055600180549091169055565b336000908152600560205260408120805490916001600160801b03909116906107c984836110c2565b83546001600160801b038083166fffffffffffffffffffffffffffffffff1992831617865560018601805442909216919092161790559050610809610a64565b8254600454600160801b9091046001600160801b03169069d3c21bcecceda10000009061083690846110f1565b6108409190611110565b84546001600160801b03918216600160801b02911617845582156108f95760008169d3c21bcecceda10000006004548661087a91906110f1565b6108849190611110565b61088e91906110da565b905080156108f7576108c17f00000000000000000000000099d8a9c45b2eca8864373a26d1459e3dff1e17f33383610db2565b60405181815233907fba8de60c3403ec381d1d484652ea1980e3c3e56359195c92525bff4ce47ad98e9060200160405180910390a25b505b61092e6001600160a01b037f000000000000000000000000090185f2135308bad17527004364ebcc2d37e5f616333088610f03565b60405185815233907fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c906020016106c7565b33600090815260056020526040902060035460ff16158061099c57506001810154429061099a9062015180906001600160801b03166110c2565b105b6109e85760405162461bcd60e51b815260206004820152601760248201527f6d5370656c6c3a205761697420666f72204c6f636b55700000000000000000006044820152606401610336565b8054600082556001600160801b0316610a2b6001600160a01b037f000000000000000000000000090185f2135308bad17527004364ebcc2d37e5f6163383610e7c565b60405181815233907f5fafa99d0643513820be26656b45130b01e1c03062e1266bf36f88cbd3bd96959060200160405180910390a25050565b6040516370a0823160e01b81523060048201526000907f00000000000000000000000099d8a9c45b2eca8864373a26d1459e3dff1e17f36001600160a01b0316906370a0823190602401602060405180830381865afa158015610acb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610aef9190611132565b6040516370a0823160e01b81523060048201529091506000906001600160a01b037f000000000000000000000000090185f2135308bad17527004364ebcc2d37e5f616906370a0823190602401602060405180830381865afa158015610b59573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b7d9190611132565b9050600254821480610b8d575080155b15610b96575050565b600060025483610ba691906110da565b905081610bbd69d3c21bcecceda1000000836110f1565b610bc79190611110565b600454610bd491906110c2565b6004555050600255565b6001600160a01b0381811660009081526005602052604080822090516370a0823160e01b81523060048201529192909183917f000000000000000000000000090185f2135308bad17527004364ebcc2d37e5f616906370a0823190602401602060405180830381865afa158015610c59573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c7d9190611132565b600480546040516370a0823160e01b815230928101929092529192506000907f00000000000000000000000099d8a9c45b2eca8864373a26d1459e3dff1e17f36001600160a01b0316906370a0823190602401602060405180830381865afa158015610ced573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d119190611132565b90506002548114158015610d2457508215155b15610d6857600060025482610d3991906110da565b905083610d5069d3c21bcecceda1000000836110f1565b610d5a9190611110565b610d6490846110c2565b9250505b83546001600160801b03600160801b820481169169d3c21bcecceda100000091610d94918691166110f1565b610d9e9190611110565b610da891906110da565b9695505050505050565b6040516370a0823160e01b81523060048201526000906001600160a01b038516906370a0823190602401602060405180830381865afa158015610df9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e1d9190611132565b905080821115610e515780600254610e3591906110da565b600255610e4c6001600160a01b0385168483610e7c565b610e76565b81600254610e5f91906110da565b600255610e766001600160a01b0385168484610e7c565b50505050565b600060405163a9059cbb60e01b81526001600160a01b03841660048201528260248201526000806044836000895af1915050610eb781610fa0565b610e765760405162461bcd60e51b815260206004820152600f60248201527f5452414e534645525f4641494c454400000000000000000000000000000000006044820152606401610336565b60006040516323b872dd60e01b81526001600160a01b03851660048201526001600160a01b038416602482015282604482015260008060648360008a5af1915050610f4d81610fa0565b610f995760405162461bcd60e51b815260206004820152601460248201527f5452414e534645525f46524f4d5f4641494c45440000000000000000000000006044820152606401610336565b5050505050565b60003d82610fb257806000803e806000fd5b8060208114610fca578015610fdb5760009250610fe0565b816000803e60005115159250610fe0565b600192505b5050919050565b80356001600160a01b0381168114610ffe57600080fd5b919050565b80358015158114610ffe57600080fd5b60008060006060848603121561102857600080fd5b61103184610fe7565b925061103f60208501611003565b915061104d60408501611003565b90509250925092565b60006020828403121561106857600080fd5b61107182611003565b9392505050565b60006020828403121561108a57600080fd5b61107182610fe7565b6000602082840312156110a557600080fd5b5035919050565b634e487b7160e01b600052601160045260246000fd5b600082198211156110d5576110d56110ac565b500190565b6000828210156110ec576110ec6110ac565b500390565b600081600019048311821515161561110b5761110b6110ac565b500290565b60008261112d57634e487b7160e01b600052601260045260246000fd5b500490565b60006020828403121561114457600080fd5b505191905056fea2646970667358221220ae1d4d0c25e1f396da5c1086199369a6eb7f8b6f60e9869299e97b603fc65fcd64736f6c634300080a0033

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

00000000000000000000000099d8a9c45b2eca8864373a26d1459e3dff1e17f3000000000000000000000000090185f2135308bad17527004364ebcc2d37e5f6

-----Decoded View---------------
Arg [0] : _mim (address): 0x99D8a9C45b2ecA8864373A26D1459e3Dff1e17F3
Arg [1] : _spell (address): 0x090185f2135308BaD17527004364eBcC2D37e5F6

-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 00000000000000000000000099d8a9c45b2eca8864373a26d1459e3dff1e17f3
Arg [1] : 000000000000000000000000090185f2135308bad17527004364ebcc2d37e5f6


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.