智能挖矿V1

智能挖矿V1:一种随存随取的灵活挖矿模式

背景

挖矿服务是SUN.io平台数字金融衍生品之一,为加密数字资产持有用户提供稳定、安全、可靠的理财产品申购和赎回服务。智能挖矿V1又名活期挖矿,是SUN.io挖矿服务重要组成部分。其原理是根据存款用户质押金额在整个矿池的质押金额占比分配奖励,且用户可以随时赎回相关资产。

原理简介

SUN.io挖矿奖励代币分成在一定时间窗口以均匀通货膨胀速度发行,如下图所示。

矿池在不同时间节点上发生质押总资金的变化都会引起个人奖励的变化。个人奖励公式:

f(ti,tn)=i=1n(titi1)rtUiSi1f(t_i,t_n)=\sum_{i=1}^{n}(t_i-t_{i-1})r_t * \frac {U_i}{S_i}(1)

其中 rtr_t表示奖励代币的膨胀系数, tit_i表示第i次变化, SiS_i表示ti1t_{i-1}tit_i阶段时刻质押总金额,UiU_i表示用户在ti1t_{i-1}tit_i阶段时刻的质押金额。

根据以上公式,矿池一旦发生质押金额的变化都会影响其他用户的分成,为了避免checkpoint全量用户数据造成的燃料费开销过大,将上述公式进行变换如下:

f(ti,tn)=i=1mUij=startiendi(titi1)rtSi2f(t_i,t_n)= \sum_{i=1}^{m}U_i \sum_{j=start_i}^{end_i}\frac{(t_i-t_{i-1})r_t}{S_i}(2)

startistart_iendiend_i时间范围内用户存款如未发生变化,当矿池质押总金额发生变化之后,只需checkpoint如下求和公式:

j=startiendi(titi1)rtSi3\sum_{j=start_i}^{end_i} \frac{(t_i-t_{i-1})r_t}{S_i}(3)

对应合约代码

modifier updateReward(address account) {
    rewardPerTokenStored = rewardPerToken();
    lastUpdateTime = lastTimeRewardApplicable();
    if (canNext && block.timestamp > periodFinish && DURATION_NEXT > 0) {
        rewardRate = rewardNext.div(DURATION_NEXT);
        uint256 nextRound = (block.timestamp - periodFinish) / DURATION_NEXT + 1;
        periodFinish = periodFinish.add(nextRound * DURATION_NEXT);
        rewardPerTokenStored = rewardPerToken();
        lastUpdateTime = lastTimeRewardApplicable();
        rewardNow = rewardNext;
        DURATION = DURATION_NEXT;
        emit RewardAdded(nextRound * rewardNext);
    }
    if (account != address(0)) {
        userInfo[account].rewards = earned(account);
        userInfo[account].rewardPerTokenPaid = rewardPerTokenStored;
    }
    _;
}

矿池

2pool farm

主网合约地址:TFpg63byqDwniXnyxVYpSzBfWGBwZExM9J

USDD-USDT V2 farm

主网合约地址:TCkNadwxyik1D66qCGmavuneowDRXPgdkL

与合约交互

我们利用TronWeb与合约交互, 初始化TronWeb实例后, 就能很方便的与线上合约交互。

初始化TronWeb实例
const TronWeb = require('tronweb')
const privateKey = process.env.PRIVATE_KEY
const apiKey = process.env.API_KEY

var tronWeb = new TronWeb({
	fullHost: "https://api.trongrid.io",
	headers: { "TRON-PRO-API-KEY": apiKey },
	privateKey: privateKey,
      })
     

获取矿池信息

查看定活期矿池地址

  • 函数名称:reward_contract()

>>> let contract = await tronWeb.getContract('TFpg63byqDwniXnyxVYpSzBfWGBwZExM9J')
>>> await contract.methods.reward_contract().call()
TWHM9Lkf78pHy68yhxdP8SUaRpn1hgaCpS

查看活期奖励

  • 函数名称:earned(address)

  • 参数:用户地址

>>> let contract = await tronWeb.getContract('TUgVp8FzZcFLHwruuncXaQo2js5Ym2GqSj')
>>> await contract.methods.earned('TF5MekHgFz6neU7zTpX4h2tha5miPDUj3z').call()
1000000000000000000

执行交易

存款

  • 函数名称:deposit(uint256)

  • 参数:存款金额

>>> let contract = await tronWeb.getContract('TFpg63byqDwniXnyxVYpSzBfWGBwZExM9J')
>>> await contract.methods.deposit(1000000000000000000).send()

取款

  • 函数名称:withdraw(uint256)

  • 参数:取款金额

>>> let contract = await tronWeb.getContract('TFpg63byqDwniXnyxVYpSzBfWGBwZExM9J')
>>> await contract.methods.withdraw(1000000000000000000).send()

Last updated