NFT鏈遊智慧合約流動性挖礦系統APP開發原始碼解析

JT1769119發表於2023-03-17

NFT鏈遊智慧合約如何實現在程式碼當中展示,NFT鏈遊的玩法與邏輯個方面的細節落實到位。


以下是一個NFT鏈遊智慧合約流動性挖礦的程式設計程式碼示例,用Solidity語言編寫。

scssCopy codepragma solidity ^0.8.0;
interface IERC20 {
    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);
    function balanceOf(address account) external view returns (uint256);
    function approve(address spender, uint256 amount) external returns (bool);
    function transfer(address recipient, uint256 amount) external returns (bool);
}
interface INFT {
    function transferFrom(address from, address to, uint256 tokenId) external;
    function balanceOf(address owner) external view returns (uint256);
    function approve(address to, uint256 tokenId) external;
}
contract NFTLPStaking {
    struct UserInfo {
        uint256 amount;    
        uint256 rewardDebt;
    }
    struct PoolInfo {
        IERC20 lpToken;           
        INFT nftToken;             
        uint256 nftId;             
        uint256 nftRate;           
        uint256 lastRewardBlock;  
        uint256 accRewardPerShare; 
    }
    PoolInfo[] public poolInfo;
    mapping (uint256 => mapping (address => UserInfo)) public userInfo;
    IERC20 public rewardToken;
    uint256 public rewardPerBlock;    constructor(
        IERC20 _rewardToken,
        uint256 _rewardPerBlock
    ) public {
        rewardToken = _rewardToken;
        rewardPerBlock = _rewardPerBlock;
    }
    function addPool(
        IERC20 _lpToken,
        INFT _nftToken,
        uint256 _nftId,
        uint256 _nftRate,
        bool _withUpdate
    ) public {
        if (_withUpdate) {            massUpdatePools();
        }
        poolInfo.push(PoolInfo({
            lpToken: _lpToken,
            nftToken: _nftToken,
            nftId: _nftId,
            nftRate: _nftRate,
            lastRewardBlock: block.number,
            accRewardPerShare: 0
        }));
    }
    function updatePool(uint256 _pid) public {
        PoolInfo storage pool = poolInfo[_pid];
        if (block.number <= pool.lastRewardBlock) {
            return;
        }
        uint256 lpSupply = pool.lpToken.balanceOf(address(this));
        if (lpSupply == 0) {
            pool.lastRewardBlock = block.number;
            return;
        }
        uint256 blocks = block.number - pool.lastRewardBlock;
        uint256 reward = blocks * rewardPerBlock;
        pool.accRewardPerShare += reward * 1e12 / lpSupply;
        pool.lastRewardBlock = block.number;
    }
    function massUpdatePools() public {
        uint256 length = poolInfo.length;
        for (uint256 pid = 0; pid < length; ++pid) {            updatePool(pid);
        }
    }
    function deposit(uint256 _pid, uint256 _amount) public {
        PoolInfo storage pool = poolInfo[_pid];
        UserInfo storage user = userInfo[_pid][msg.sender];        updatePool(_pid);
        if (user.amount > 0) {
            uint256 pending = user.amount * pool.accRewardPerShare / 1e12 - user.rewardDebt;
            rewardToken.transfer(msg.sender, pending);
        }
        if (_amount > 0) {
            pool.lpToken.transferFrom(msg.sender, address(this), _amount);
            user.amount += _amount;
            pool.nftToken.transferFrom(msg.sender, address(this), pool.nftId);


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69982110/viewspace-2940209/,如需轉載,請註明出處,否則將追究法律責任。

相關文章