背景
挖矿服务是SUN.io平台数字金融衍生品之一,为加密数字资产持有用户提供稳定、安全、可靠的理财产品申购和赎回服务。智能挖矿V1又名活期挖矿,是SUN.io挖矿服务重要组成部分。其原理是根据存款用户质押金额在整个矿池的质押金额占比分配奖励,且用户可以随时赎回相关资产。
原理简介
SUN.io挖矿奖励代币分成在一定时间窗口以均匀通货膨胀速度发行,如下图所示。
矿池在不同时间节点上发生质押总资金的变化都会引起个人奖励的变化。个人奖励公式:
f(ti,tn)=i=1∑n(ti−ti−1)rt∗SiUi(1) 其中 rt表示奖励代币的膨胀系数, ti表示第i次变化, Si表示ti−1到ti阶段时刻质押总金额,Ui表示用户在ti−1到ti阶段时刻的质押金额。
根据以上公式,矿池一旦发生质押金额的变化都会影响其他用户的分成,为了避免checkpoint全量用户数据造成的燃料费开销过大,将上述公式进行变换如下:
f(ti,tn)=i=1∑mUij=starti∑endiSi(ti−ti−1)rt(2) 在 starti和 endi时间范围内用户存款如未发生变化,当矿池质押总金额发生变化之后,只需checkpoint如下求和公式:
j=starti∑endiSi(ti−ti−1)rt(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实例后, 就能很方便的与线上合约交互。
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,
})
获取矿池信息
查看定活期矿池地址
>>> let contract = await tronWeb.getContract('TFpg63byqDwniXnyxVYpSzBfWGBwZExM9J')
>>> await contract.methods.reward_contract().call()
TWHM9Lkf78pHy68yhxdP8SUaRpn1hgaCpS
查看活期奖励
>>> let contract = await tronWeb.getContract('TUgVp8FzZcFLHwruuncXaQo2js5Ym2GqSj')
>>> await contract.methods.earned('TF5MekHgFz6neU7zTpX4h2tha5miPDUj3z').call()
执行交易
存款
>>> let contract = await tronWeb.getContract('TFpg63byqDwniXnyxVYpSzBfWGBwZExM9J')
>>> await contract.methods.deposit(1000000000000000000).send()
取款
>>> let contract = await tronWeb.getContract('TFpg63byqDwniXnyxVYpSzBfWGBwZExM9J')
>>> await contract.methods.withdraw(1000000000000000000).send()