Overview
ETH Balance
0 ETH
Eth Value
$0.00Token Holdings
More Info
Private Name Tags
Latest 25 from a total of 3,379 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Deposit | 21242680 | 31 hrs ago | IN | 0 ETH | 0.001046 | ||||
Withdraw | 21236420 | 2 days ago | IN | 0 ETH | 0.00283947 | ||||
Deposit | 21235184 | 2 days ago | IN | 0 ETH | 0.00091674 | ||||
Deposit | 21229180 | 3 days ago | IN | 0 ETH | 0.00126849 | ||||
Withdraw | 21218991 | 4 days ago | IN | 0 ETH | 0.00104227 | ||||
Deposit | 21214534 | 5 days ago | IN | 0 ETH | 0.00124032 | ||||
Withdraw | 21213129 | 5 days ago | IN | 0 ETH | 0.00125566 | ||||
Withdraw | 21212312 | 5 days ago | IN | 0 ETH | 0.00089817 | ||||
Withdraw | 21202855 | 6 days ago | IN | 0 ETH | 0.00098895 | ||||
Withdraw | 21202032 | 6 days ago | IN | 0 ETH | 0.00106854 | ||||
Withdraw | 21178642 | 10 days ago | IN | 0 ETH | 0.00238983 | ||||
Withdraw | 21178638 | 10 days ago | IN | 0 ETH | 0.00333393 | ||||
Withdraw | 21155718 | 13 days ago | IN | 0 ETH | 0.00076332 | ||||
Withdraw | 21142848 | 15 days ago | IN | 0 ETH | 0.00173753 | ||||
Deposit | 21125030 | 17 days ago | IN | 0 ETH | 0.00068011 | ||||
Deposit | 21115176 | 19 days ago | IN | 0 ETH | 0.00073818 | ||||
Withdraw | 21109517 | 19 days ago | IN | 0 ETH | 0.00029983 | ||||
Withdraw | 21093241 | 22 days ago | IN | 0 ETH | 0.00130075 | ||||
Deposit | 21087501 | 22 days ago | IN | 0 ETH | 0.00153175 | ||||
Withdraw | 21080832 | 23 days ago | IN | 0 ETH | 0.00073987 | ||||
Withdraw | 21059393 | 26 days ago | IN | 0 ETH | 0.0005275 | ||||
Withdraw | 21053372 | 27 days ago | IN | 0 ETH | 0.00039842 | ||||
Withdraw | 21046603 | 28 days ago | IN | 0 ETH | 0.00038017 | ||||
Withdraw | 21036232 | 30 days ago | IN | 0 ETH | 0.00104331 | ||||
Withdraw | 21032815 | 30 days ago | IN | 0 ETH | 0.00072489 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
mSpellStaking
Compiler Version
v0.8.10+commit.fc410830
Optimization Enabled:
Yes with 690 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// 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; } }
// 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 } } } }
// 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"); _; } }
// 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); } }
{ "optimizer": { "enabled": true, "runs": 690 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "metadata": { "useLiteralContent": true }, "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"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"}]
Contract Creation Code
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
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.