SushiSwap质押挖矿里的3个时期

Posted sanqima

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SushiSwap质押挖矿里的3个时期相关的知识,希望对你有一定的参考价值。

1 质押挖矿的3个时期

    SushiSwap支持质押挖矿,它有3个时期:激励期、普通期、交叉期。激励期的奖励倍数为10,普通期的奖励倍数为1,交叉期的奖励倍数不固定。
    这3个时期是通过区块高度来进行区分的,不同时期的倍乘系数multiplier也不相同。
    在 MasterChef.sol合约里,通过getMultiplier()函数来计算倍乘系数multiplier,其计算方式如下:

    function getMultiplier(uint256 _from, uint256 _to)
        public
        view
        returns (uint256)
    {
        if (_to <= bonusEndBlock) {
            return _to.sub(_from).mul(BONUS_MULTIPLIER);
        } else if (_from >= bonusEndBlock) {
            return _to.sub(_from);
        } else {
            return
                bonusEndBlock.sub(_from).mul(BONUS_MULTIPLIER).add(
                    _to.sub(bonusEndBlock)
                );
        }
    }

    写成公式如下:
m u l t i p l i e r ( m , n ) = { ( n − m ) ∗ B o n u s , n > m > e ,     激励期 n − m , e > n > m ,    普 通 期 ( e − m ) ∗ B o n u s + n − e , n > e > m ,    交 叉 期 multiplier(m,n)= \\begin{cases} (n-m)*Bonus, & \\text{n > m > e , \\;激励期} \\\\ n-m , & e > n> m , \\;普通期\\\\ (e - m)*Bonus+n-e, & n > e > m , \\;交叉期 \\end{cases} multiplier(m,n)=(nm)Bonus,nm,(em)Bonus+ne,n > m > e , 激励期e>n>m,n>e>m,

    倍乘系数 multiplier 与起点区块高度、终点区块高度、奖励截止高度、固定奖励系数这4个参数有关。
    在cn.etherscan.com里查询 MasterChef的部署参数可知,如图(1)所示:

图(1) MasterChef合约的部署参数

变量含义默认参数
m质押时(deposit)的区块高度未知数m
n提取时(withdraw)的区块高度未知数n
s奖励起点区块高度1075000
e奖励截止区块高度1085000
Bonus固定奖励系数100枚Sushi

    由图(1)可知,MasterChef在以太坊上的质押挖矿,用区块高度分为3个时期:

  • 激励期:质押和提取,都在1075万~1085万区块高度内,即 m 、 n ∈ [ 1075 w , 1085 w ] m、n \\in [1075w, 1085w] mn[1075w,1085w],区块奖励 = 固定奖励x10 = 100x10 = 1000枚Sushi,固定。
  • 普通期:质押和提取,都在1085万区块高度之上,即 m 、 n ∈ ( 1085 w , + ∞ ) m、n \\in (1085w,+\\infty) mn(1085w,+), 区块奖励 = 固定奖励 = 100枚Sushi,固定。
  • 交叉期:质押在[1075万, 1085万]区块高度内,提取在1085万区块高度之后,即 m ∈ [ 1075 w , 1085 w ] , n ∈ ( 1085 w , + ∞ ) m \\in [1075w, 1085w] , n \\in (1085w,+\\infty) m[1075w,1085w],n(1085w,+)
    ,区块奖励 = 100或1000枚Sushi,不固定。

    需要说明的是,这里的区块奖励,指的是每挖出一个区块,奖励的Sushi代币个数。

2 质押与提取

2.1 质押deposit

    MasterChef.sol的deposit()函数,用于将lpToken发送到MasterChef合约地址,同时将用户的待入账奖励币SuShi发送到用户地址,并发送质押事件给其他程序。

    function deposit(uint256 _pid, uint256 _amount) public {
        PoolInfo storage pool = poolInfo[_pid];
        UserInfo storage user = userInfo[_pid][msg.sender];
        console.log("pid= %s, msg.sender= %s",_pid, msg.sender);
        updatePool(_pid);
        if (user.amount > 0) {
            uint256 pending =
                user.amount.mul(pool.accSushiPerShare).div(1e12).sub(
                    user.rewardDebt
                );
            safeSushiTransfer(msg.sender, pending); //将待入账的奖励币发给用户
        }
        pool.lpToken.safeTransferFrom(   //将lpToken存到MasterChef合约里
            address(msg.sender),
            address(this),
            _amount
        );
        user.amount = user.amount.add(_amount);    //更新质押个数(余额)
        user.rewardDebt = user.amount.mul(pool.accSushiPerShare).div(1e12); //更新账务值
        emit Deposit(msg.sender, _pid, _amount);
    }

2.2 提取withdraw

    MasterChef.sol的withdraw()函数,用于提取本金lpToken与奖励币Sushi到用户地址,同时更新用户的账户余额amount与账务值rewardDebt,并发送提取事件给其他程序。

    function withdraw(uint256 _pid, uint256 _amount) public {
        PoolInfo storage pool = poolInfo[_pid];
        UserInfo storage user = userInfo[_pid][msg.sender];
        require(user.amount >= _amount, "withdraw: not good");
        updatePool(_pid);
        uint256 pending =
            user.amount.mul(pool.accSushiPerShare).div(1e12).sub(
                user.rewardDebt
            );
        safeSushiTransfer(msg.sender, pending);  //将待入账的sushi奖励币发给用户
        user.amount = user.amount.sub(_amount);  //更新lpToken个数(余额)
        user.rewardDebt = user.amount.mul(pool.accSushiPerShare).div(1e12); //更新账务值
        pool.lpToken.safeTransfer(address(msg.sender), _amount); //将lpToken返还给用户
        emit Withdraw(msg.sender, _pid, _amount);
    }

以上是关于SushiSwap质押挖矿里的3个时期的主要内容,如果未能解决你的问题,请参考以下文章

挖矿里的矿池是什么意思?

检查ApeSwap工程

'关于挖矿RNA质押21个节点质押那个节点收益更多?'.html(false)

SushiSwap流动性挖矿白皮书平台app下载

质押挖矿?看看CRUST的回报率!

swarm挖矿要不要质押币?要准备什么