Forkchoice Ethereum Mainnet

Address Contract Verified

Address 0xc4354d345459a8e6F80ACd1FB202062EE4878C78
Balance 0 ETH
Nonce 1
Code Size 3981 bytes
Indexed Transactions 0 (1 on-chain, 1.2% indexed)
External Etherscan · Sourcify

Contract Bytecode

3981 bytes
0x60806040526004361015610011575f80fd5b5f3560e01c806326fae0d314610134578063310e5cf51461012f578063441a3e701461012a57806349e0a4aa146101255780635312ea8e146101205780635eb8e4521461011b5780638456cb59146101165780638da5cb5b146101115780639a72e4ab1461010c578063a694fc3a14610107578063a9fb763c14610102578063b24cf5d7146100fd578063bedb86fb146100f8578063d73caf4c146100f3578063e4979395146100ee578063ee97f7f3146100e9578063f2fde38b146100e45763f7c618c1146100df575f80fd5b610ab3565b6109ce565b6109a6565b61097e565b610961565b61091c565b610848565b6106be565b61051b565b6104c1565b61049a565b610478565b6103d2565b610368565b6102e1565b61021e565b6101a1565b61014e565b6001600160a01b0381160361014a57565b5f80fd5b3461014a57602036600319011261014a5760043561016b81610139565b61017f60018060a01b035f54163314610af7565b600180546001600160a01b0319166001600160a01b0392909216919091179055005b3461014a575f602036600319011261014a576004356101ca60018060a01b035f54163314610af7565b6001546001600160a01b031690813b1561014a575f9160248392604051948593849263310e5cf560e01b845260048401525af180156102195761020b575080f35b61021791505f90610b56565b005b610b7d565b3461014a57604036600319011261014a576004356024359061024a60018060a01b035f54163314610af7565b6001546001600160a01b0316803b1561014a57604051630441a3e760e41b81526004810183905260248101849052905f908290604490829084905af18015610219576102c7575b5060405191825233917f56be67a54226e3a39c5d1a710d2afc912ca5df1d89054cfeb3e65b47509ee9099080602081015b0390a3005b806102d55f6102db93610b56565b8061046e565b5f610291565b3461014a57602036600319011261014a57600154604051631526fe2760e01b81526004803590820152906001600160a01b031660c082602481845afa801561021957610217925f91610334575b50610d5f565b610356915060c03d60c011610361575b61034e8183610b56565b810190610b88565b50505050505f61032e565b503d610344565b3461014a575f602036600319011261014a5760043561039160018060a01b035f54163314610af7565b6001546001600160a01b031690813b1561014a575f91602483926040519485938492632989754760e11b845260048401525af180156102195761020b575080f35b3461014a57604036600319011261014a576004356024356103f281610139565b61040660018060a01b035f54163314610af7565b600154604051631526fe2760e01b8152600481019390935260c090839060249082906001600160a01b03165afa801561021957610217925f9161044a575b50610e63565b610463915060c03d60c0116103615761034e8183610b56565b50505050505f610444565b5f91031261014a57565b3461014a575f36600319011261014a57602060ff600454166040519015158152f35b3461014a575f36600319011261014a575f546040516001600160a01b039091168152602090f35b3461014a57602036600319011261014a576102176004356104e181610139565b6104f560018060a01b035f54163314610af7565b7f000000000000000000000000044ca854fa227e27e07652b7f6a6b578703f3945610e63565b3461014a57602036600319011261014a5760043561054461053e60045460ff1690565b15610bbf565b600154610561906001600160a01b03165b6001600160a01b031690565b604051631526fe2760e01b815260048101839052919060c083602481845afa8015610219575f935f91610693575b5061059b901515610bf3565b6040516370a0823160e01b815230600482015292602090849060249082906001600160a01b03165afa928315610219575f93610662575b506105de831515610c3d565b803b1561014a57604051631c57762b60e31b81526004810183905260248101849052905f908290604490829084905af180156102195761064e575b5060405191825233917f1b52f0db6b5f755caa8f232eebe353a340637e6c55969d84b3ee0cee945aa4339080602081016102c2565b806102d55f61065c93610b56565b5f610619565b61068591935060203d60201161068c575b61067d8183610b56565b810190610c2e565b915f6105d2565b503d610673565b61059b94506106b1915060c03d60c0116103615761034e8183610b56565b505050509390939061058f565b3461014a57602036600319011261014a57600254600435906106ea906001600160a01b03161515610c7e565b610704620151806106fd60035442610cca565b1015610ceb565b600154610719906001600160a01b0316610555565b803b1561014a5760405163d332a78160e01b815260048101839052905f908290602490829084905af1801561021957610834575b506040516370a0823160e01b81523060048201526020816024816001600160a01b037f000000000000000000000000044ca854fa227e27e07652b7f6a6b578703f3945165afa908115610219575f91610815575b506107ad811515610d1f565b6002546107c490610555906001600160a01b031681565b803b1561014a57604051631e2720ff60e01b815260048101839052905f908290602490829084905af1801561021957610801575b61021742600355565b806102d55f61080f93610b56565b806107f8565b61082e915060203d60201161068c5761067d8183610b56565b816107a1565b806102d55f61084293610b56565b8061074d565b3461014a57602036600319011261014a5760043561086581610139565b61087960018060a01b035f54163314610af7565b6001600160a01b031680156108cd57600280546001600160a01b03191682179055610217906001600160a01b03167f000000000000000000000000044ca854fa227e27e07652b7f6a6b578703f3945610d5f565b60405162461bcd60e51b815260206004820152601860248201527f496e76616c6964207769746864726177206164647265737300000000000000006044820152606490fd5b8015150361014a57565b3461014a57602036600319011261014a5760043561093981610912565b61094d60018060a01b035f54163314610af7565b60ff80196004541691151516176004555f80f35b3461014a575f36600319011261014a576020600354604051908152f35b3461014a575f36600319011261014a576002546040516001600160a01b039091168152602090f35b3461014a575f36600319011261014a576001546040516001600160a01b039091168152602090f35b3461014a57602036600319011261014a576004356109eb81610139565b5f5490610a026001600160a01b0383163314610af7565b6001600160a01b0381168015610a6357610217926001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e05f80a360018060a01b03166bffffffffffffffffffffffff60a01b5f5416175f55565b60405162461bcd60e51b815260206004820152602260248201527f4f776e61626c653a206e6577206f776e6572206973207a65726f206164647265604482015261737360f01b6064820152608490fd5b3461014a575f36600319011261014a576040517f000000000000000000000000044ca854fa227e27e07652b7f6a6b578703f39456001600160a01b03168152602090f35b15610afe57565b606460405162461bcd60e51b815260206004820152602060248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152fd5b634e487b7160e01b5f52604160045260245ffd5b90601f8019910116810190811067ffffffffffffffff821117610b7857604052565b610b42565b6040513d5f823e3d90fd5b91908260c091031261014a578151610b9f81610139565b9160208101519160408201519160608101519160a0608083015192015190565b15610bc657565b60405162461bcd60e51b8152602060048201526005602482015264706175736560d81b6044820152606490fd5b15610bfa57565b60405162461bcd60e51b815260206004820152600c60248201526b1a5b9d985b1a59081c1bdbdb60a21b6044820152606490fd5b9081602091031261014a575190565b15610c4457565b60405162461bcd60e51b81526020600482015260126024820152716e6f20746f6b656e7320746f207374616b6560701b6044820152606490fd5b15610c8557565b60405162461bcd60e51b815260206004820152601a60248201527f496e76616c696420526577617264506f6f6c20616464726573730000000000006044820152606490fd5b91908203918211610cd757565b634e487b7160e01b5f52601160045260245ffd5b15610cf257565b60405162461bcd60e51b8152602060048201526005602482015264312064617960d81b6044820152606490fd5b15610d2657565b60405162461bcd60e51b81526020600482015260116024820152704e6f207265776172642062616c616e636560781b6044820152606490fd5b60405163095ea7b360e01b60208201526001600160a01b0390921660248301525f196044808401919091528252610de09190610d9c606483610b56565b7f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65646020604051610dcd604082610b56565b81815201526001600160a01b0316610ebb565b805180610deb575050565b816020918101031261014a5760200151610e0481610912565b15610e0b57565b60405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608490fd5b60405163095ea7b360e01b60208201526001600160a01b0390921660248301525f6044808401919091528252610de09190610d9c606483610b56565b67ffffffffffffffff8111610b7857601f01601f191660200190565b803b15610f1257815f92918360208194519301915af1903d15610f0a573d91610ee383610e9f565b92610ef16040519485610b56565b83523d5f602085013e5b610f085750602081519101fd5b565b606091610efb565b60405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606490fdfea264697066735822122019bb4bf1f59de1da41c70d4e7d12c0079477c256e64ff41cf8c342f861c051eb64736f6c634300081e0033

Verified Source Code Full Match

Compiler: v0.8.30+commit.73712a01 EVM: prague Optimization: Yes (200 runs)
MasterChef.fund.sol 217 lines
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

/**
 * @title MasterChefFund
 * @notice 辅助 MasterChef 的资金管理合约。
 * - 任何人都可以触发质押,将本合约持有的指定池子的所有 LP 代币质押到 MasterChef。
 */
interface IERC20 {
    function totalSupply() external view returns (uint256);
    function balanceOf(address account) external view returns (uint256);
    function transfer(address recipient, uint256 amount) external returns (bool);
    function allowance(address owner, address spender) external view returns (uint256);
    function approve(address spender, uint256 amount) external returns (bool);
    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);
    function decimals() external view returns (uint8);
}

library Address {
    function isContract(address account) internal view returns (bool) {
        return account.code.length > 0;
    }

    function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {
        require(isContract(target), "Address: call to non-contract");
        (bool success, bytes memory returndata) = target.call(data);
        if (success) return returndata;
        assembly {
            revert(add(returndata, 32), mload(returndata))
        }
        revert(errorMessage);
    }
}

library SafeERC20 {
    using Address for address;

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

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

    function safeApprove(IERC20 token, address spender, uint256 value) internal {
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));
    }

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

abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }
}

contract Ownable is Context {
    address private _owner;
    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

    constructor() {
        _owner = _msgSender();
        emit OwnershipTransferred(address(0), _owner);
    }

    function owner() public view returns (address) {
        return _owner;
    }

    modifier onlyOwner() {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

    function transferOwnership(address newOwner) external onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is zero address");
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
    }
}

interface IMasterChef {
    function powerPerPrice() external view returns (uint256);
    function token() external view returns (IERC20);
    function takerWithdraw(uint256 pid) external;
    function poolInfo(
        uint256 pid
    )
        external
        view
        returns (
            IERC20 lpToken,
            uint256 decimals,
            uint256 totalPower,
            uint256 allocPoint,
            uint256 lastRewardTime,
            uint256 accSushiPerShare
        );


    function deposit(uint256 pid, uint256 amount) external;
    function withdraw(uint256 pid, uint256 powerAmount) external;
    function emergencyWithdraw(uint256 pid) external;
    function joinNode(uint256 _nodeId) external;
    

}

interface iRewardPoolManager {
    function depositReward(uint256 amount) external;
}
contract MasterChefFund is Ownable {
    using SafeERC20 for IERC20;

    IMasterChef public  master = IMasterChef(0xE85a0d630Ce1c69aA9c37802A7DD87045e636d70);
    IERC20 public immutable rewardToken;
    address public RewardPoolManagerAddress = 0x2F47Fad6F16aD87bc5Bd9f837C98e1d6D169A8d4;
    uint256 public LastRewardTime;


    event OperatorUpdated(address indexed operator, bool allowed);
    event Staked(uint256 indexed pid, uint256 amount, address indexed caller);
    event UnStaked(uint256 indexed pid, uint256 amount, address indexed caller);
    event Refunded(
        uint256 indexed pid,
        address indexed user,
        uint256 refundAmount,
        uint256 rewardReturned
    );

    bool public pause  = true;

    constructor() {
        rewardToken = master.token();
        rewardToken.safeApprove(RewardPoolManagerAddress, type(uint256).max);
    }


    function setRewardPoolAddress(address _RewardPoolAddress) external onlyOwner {
        require(_RewardPoolAddress != address(0), "Invalid withdraw address");
        RewardPoolManagerAddress = _RewardPoolAddress;
        rewardToken.safeApprove(RewardPoolManagerAddress, type(uint256).max);
    }

    function setMaster(address _master) external onlyOwner {
        master = IMasterChef(_master);
    }

    function setPause(bool _pause) external onlyOwner {
        pause = _pause;
    }

    function rewardUnsafeApprove(address addr) external  onlyOwner
    {
        rewardToken.safeApprove(addr, 0);
    }

    function LpUnsafeApprove(uint256 pid,address addr) external  onlyOwner
    {
        (IERC20 lpToken, , , , ,  ) = master.poolInfo(pid);
        lpToken.safeApprove(addr, 0);
    }

    function safeApprove(uint256 pid) external 
    {
        (IERC20 lpToken, , , , ,  ) = master.poolInfo(pid);
        lpToken.safeApprove(address(master), type(uint256).max);
    }

    // 质押:将本合约持有的该池子所有 LP 代币质押到 MasterChef
    function stake(uint256 pid) external {
        // 暂停的时候不能存入,万一需要迁移质押合约
        require(pause == false,"pause");
        (IERC20 lpToken, uint256 decimals, , , ,  ) = master.poolInfo(pid);
        require(decimals > 0, "invalid pool");

        uint256 balance = lpToken.balanceOf(address(this));
        require(balance > 0, "no tokens to stake");

        master.deposit(pid, balance);

        emit Staked(pid, balance, msg.sender);
    }

    function joinNode(uint256 _nodeId) external onlyOwner {
        master.joinNode(_nodeId);
    }

    function withdraw(uint256 pid,uint256 amount) external onlyOwner {
        master.withdraw(pid, amount);

        emit UnStaked(pid, amount, msg.sender);
    }

    function emergencyWithdraw(uint256 pid) external onlyOwner {
        master.emergencyWithdraw(pid);

    }

    // 领取奖励并存入奖励池合约
    function reward(uint256 pid) external {
        require(RewardPoolManagerAddress != address(0), "Invalid RewardPool address");
        require(block.timestamp - LastRewardTime >= 86400,"1 day");
        master.takerWithdraw(pid);
        uint256 bal = rewardToken.balanceOf(address(this));
        require(bal > 0, "No reward balance");
        iRewardPoolManager(RewardPoolManagerAddress).depositReward(bal);
        LastRewardTime = block.timestamp;
    }
}

Read Contract

LastRewardTime 0xd73caf4c → uint256
RewardPoolManagerAddress 0xe4979395 → address
master 0xee97f7f3 → address
owner 0x8da5cb5b → address
pause 0x8456cb59 → bool
rewardToken 0xf7c618c1 → address

Write Contract 12 functions

These functions modify contract state and require a wallet transaction to execute.

LpUnsafeApprove 0x5eb8e452
uint256 pid
address addr
emergencyWithdraw 0x5312ea8e
uint256 pid
joinNode 0x310e5cf5
uint256 _nodeId
reward 0xa9fb763c
uint256 pid
rewardUnsafeApprove 0x9a72e4ab
address addr
safeApprove 0x49e0a4aa
uint256 pid
setMaster 0x26fae0d3
address _master
setPause 0xbedb86fb
bool _pause
setRewardPoolAddress 0xb24cf5d7
address _RewardPoolAddress
stake 0xa694fc3a
uint256 pid
transferOwnership 0xf2fde38b
address newOwner
withdraw 0x441a3e70
uint256 pid
uint256 amount

Recent Transactions

This address has 1 on-chain transactions, but only 1.2% of the chain is indexed. Transactions will appear as indexing progresses. View on Etherscan →