简介

背景

挖矿服务是SUN.io平台数字金融衍生品之一,为加密数字资产持有用户提供稳定、安全、可靠的理财产品申购和赎回服务。治理挖矿是SUN.io挖矿服务重要组成部分。如下图所示,用户奖励分成与用户持有的veSun Token,池子投票权重紧密相关,且用户可以随时赎回相关资产。

原理简介

用户在治理矿池质押后,会生成相应的虚拟质押金额:

Suser=min(Luser,Luser0.4+Ltotal(veSunuserveSuntotal)0.6)1S_{user}=min(L_{user},L_{user}*0.4+L_{total}*(\frac{veSun_{user}}{veSun_{total}})*0.6)(1)

其中LuserL_{user}表示用户真实质押金额,LtotalL_{total}表示矿池总质押,veSunuserveSun_{user}表示用户持有的vesun币的数量,veSuntotalveSun_{total}表示SUN.io平台一共发行的veSun的数量。如公式(1)所示,用户持有的veSun足够多,用户的虚拟质押为LuserL_{user},用户持有的veSun为0,用户的虚拟质押为Luser0.4L_{user}*0.4,即持有veSun最大可放大2.5倍的分成收益。

V=WgaugeWtypeWtotalrt2V=\frac{W_{gauge}*W_{type}}{W_{total}}*r_t(2)

其中WgaugeW_{gauge}表示本周池子权重,WtypeW_{type}表示池子类型权重,WtotalW_{total}表示本周池子总权重,rtr_t表示奖励代币的膨胀系数。根据智能挖矿V1的奖励分成公式(2),用户的奖励公式如下:

f(ti,tn)=i=1mSuserj=startiendi(titi1)VTi3f(t_i,t_n)= \sum_{i=1}^{m}S_{user} \sum_{j=start_i}^{end_i}\frac{(t_i-t_{i-1})V}{T_i}(3)

其中 VV表示奖励代币最终的膨胀系数, tit_i表示第i次变化, TiT_i表示ti1t_{i-1}tit_i阶段时刻虚拟质押总额,SuserS_{user}表示用户在ti1t_{i-1}tit_i阶段时刻的虚拟质押金额。

对应合约代码

def _checkpoint(addr: address):
    Controller(_controller).checkpoint_gauge(convert(self.controller_key, bytes32))
    _working_balance: uint256 = self.working_balances[addr]
    _working_supply: uint256 = self.working_supply

    if block.timestamp > _period_time:
        prev_week_time: uint256 = _period_time
        week_time: uint256 = min((_period_time + WEEK) / WEEK * WEEK, block.timestamp)

        for i in range(500):
            dt: uint256 = week_time - prev_week_time
            w: uint256 = Controller(_controller).gauge_relative_weight(convert(self.controller_key, bytes32), prev_week_time / WEEK * WEEK)

            if _working_supply > 0:
                if prev_future_epoch >= prev_week_time and prev_future_epoch < week_time:
                    _integrate_inv_supply += rate * w * (prev_future_epoch - prev_week_time) / _working_supply
                    rate = new_rate
                    _integrate_inv_supply += rate * w * (week_time - prev_future_epoch) / _working_supply
                else:
                    _integrate_inv_supply += rate * w * dt / _working_supply
            if week_time == block.timestamp:
                break
            prev_week_time = week_time
            week_time = min(week_time + WEEK, block.timestamp)

    _period += 1
    self.period = _period
    self.period_timestamp[_period] = block.timestamp
    self.integrate_inv_supply[_period] = _integrate_inv_supply
    
    self.integrate_fraction[addr] += _working_balance * (_integrate_inv_supply - self.integrate_inv_supply_of[addr]) / 10 ** 18
    self.integrate_inv_supply_of[addr] = _integrate_inv_supply
    self.integrate_checkpoint_of[addr] = block.timestamp

Last updated