Defi代幣質押持幣生息系統技術開發/原始碼/質押挖礦dapp/NFT

飛機號JT9119發表於2023-05-05

在DeFi領域,持幣生息是一種常見的收益方式。


在智慧合約設計中,我們需要實現以下功能: 使用者將代幣質押到合約中,獲得相應的收益; 使用者可以隨時撤回質押的代幣,並領取已經獲得的收益; 合約管理員可以設定收益比例,並提供相應的代幣作為獎勵。


以下是一個簡單的Solidity程式碼實現:

solidityCopy code// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol";
contract TokenStaking {
    using SafeERC20 for IERC20;
    IERC20 public token;
    IERC20 public rewardToken;
    uint256 public rewardRate;
    uint256 public lastUpdateTime;
    uint256 public rewardPerTokenStored;
    mapping(address => uint256) public userRewardPerTokenPaid;
    mapping(address => uint256) public rewards;
    mapping(address => uint256) public stakingBalance;
    uint256 public totalStaked;
    event Staked(address indexed user, uint256 amount);
    event Withdrawn(address indexed user, uint256 amount);
    event RewardPaid(address indexed user, uint256 reward);
    constructor(IERC20 _token, IERC20 _rewardToken, uint256 _rewardRate) {
        token = _token;
        rewardToken = _rewardToken;
        rewardRate = _rewardRate;
        lastUpdateTime = block.timestamp;
    }
    function rewardPerToken() public view returns (uint256) {
        if (totalStaked == 0) {
            return rewardPerTokenStored;
        }
        return
            rewardPerTokenStored +
            ((block.timestamp - lastUpdateTime) * rewardRate * 1e18) /
            totalStaked;
    }
    function earned(address account) public view returns (uint256) {
        return
            (stakingBalance[account] * (rewardPerToken() - userRewardPerTokenPaid[account])) /
            1e18 +
            rewards[account];
    }
    function stake(uint256 amount) public {
        require(amount > 0, "Amount must be greater than 0");
        updateReward(msg.sender);
        token.safeTransferFrom(msg.sender, address(this), amount);
        stakingBalance[msg.sender] += amount;
        totalStaked += amount;
        emit Staked(msg.sender, amount);
    }
    function withdraw(uint256 amount) public {
        require(amount > 0, "Amount must be greater than 0");
        updateReward(msg.sender);
        token.safeTransfer(msg.sender, amount);
        stakingBalance[msg.sender] -= amount;
        totalStaked -= amount;
        emit


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

相關文章