SUN.io 中文文档
SUN.ioSunPump
  • SUN.io 简介
    • 入门指南(TRON)
      • 创建钱包
      • TRON 网络代币标准
      • 连接钱包
    • 风险
    • 白皮书
    • 服务条款
    • 隐私协议
    • 最新公告
  • 开始使用
    • 兑换
      • 代币兑换
        • 如何给token授权?
        • 如何兑换token?
        • 如何查看我最近的交易记录?
        • 如何查看交易对价格走势?
      • 稳定币兑换
        • 稳定币池介绍
        • 如何进行稳定币交易?
        • 如何提供稳定币池的流动性?
        • 如何提取稳定币池流动性?
        • 如何查看自己提供的流动性?
      • 智能路由
      • 交易手续费
        • 收取手续费奖励
      • 流动性资金池
        • 如何创建交易对
        • 如何增加流动性?
        • 如何删除流动性?
        • 增加/删除资金池的token比例是如何计算的?
        • 如何录入一个新的token?
        • 创建资金池初始价格是多少?
      • 代币列表
    • 矿池
      • SUN.io 平台挖矿细则
      • 如何参与LP挖矿?
      • 如何获取LP挖矿收益?
      • 如何退出LP挖矿?
      • 如何计算LP矿池加速倍数?
      • 如何锁定SUN?
      • 如何投票?
      • 如何重置投票?
      • 智能矿池
        • 如何参与 LP 矿池的定期质押?
        • 如何在 LP 矿池中追加定期质押?
        • 如何中途延长 LP 矿池定期质押锁定期?
        • 如何提前解锁 LP 矿池中定期质押的资产?
        • 如何领取 LP 矿池的定期质押奖励?
      • Farm
      • 历史矿池
    • SunPump
      • 🌞 怎么运行的?
      • 🚀 如何启动?
      • 💡代币详情
      • 👤 个人主页
      • 🏦 服务费
      • SunPump DLive Streaming 功能使用教程
    • SunPump Referral
      • 参与方式
      • 活动规则
      • FAQ
    • PSM
      • 如何使用 PSM 在 USDD 和其他稳定币之间进行 1:1 兑换?
    • 代币经济
      • SUN 代币经济模型
        • SUN 回购及销毁
      • veSUN
      • 空投
  • 治理
    • SUN DAO 治理
    • 参与治理
      • 提案
        • SUN DAO 论坛
        • 获得选票
        • 发起提案
        • 进行投票
        • SUN DAO 提案查看
      • DAO 权益
        • 矿池权重
        • veSUN
  • 开发者
    • 兑换
      • 稳定币兑换简介
      • SunSwap兑换简介
      • SunSwap v3兑换简介
      • 智能路由
    • 挖矿
      • 智能挖矿V1
      • 智能挖矿V2
      • 治理挖矿
    • Sunpump
      • Sunpump Contracts
    • Github
    • 相关合约及ABIs
  • FAQ
    • 如何在手机 TronLink APP中使用SUN.io?
    • 价格是由什么决定的?
    • 兑换支持哪些Token?
    • 为什么我的兑换会失败?
    • 关于 SUN.io 平台能量补贴的详细说明
Powered by GitBook
On this page
  • 背景
  • 原理简介
  • 奖励分成
  • 定期赎回时间限制
  • 矿池
  • 与合约交互
  • 获取矿池信息
  • 执行交易
  1. 开发者
  2. 挖矿

智能挖矿V2

智能挖矿V2:一种定期存取的高收益挖矿模式

Previous智能挖矿V1Next治理挖矿

Last updated 5 months ago

背景

挖矿服务是SUN.io平台数字金融衍生品之一,为加密数字资产持有用户提供稳定、安全、可靠的理财产品申购和赎回服务。智能挖矿V2又名定期挖矿,是SUN.io挖矿服务重要组成部分。其原理是根据存款用户质押金额和定期时长转换为虚拟质押金额,所有用户虚拟质押金额的总量作为虚拟总质押,根据用户的虚拟质押在虚拟总质押的占比分配奖励,且用户需在规定时间赎回相关资产。

原理简介

奖励分成

质押数量为amount的token,锁定时间为 DurationlockDuration_{lock}Durationlock​满足Durationmin<=Durationlock<=DurationmaxDuration_{min}<=Duration_{lock}<=Duration_{max}Durationmin​<=Durationlock​<=Durationmax​。其中DurationmaxDuration_{ma x}Durationmax​max为1080天,DurationminDuration_{min}Durationmin​为30天,最大加速倍率weightmaxweight_{max}weightmax​为1400%(放大e12e^{12}e12倍),获得的veToken计算公式:

weight=Durationlock∗weightamx∗e12Durationmax(1)weight=\frac{Duration_{lock}*weight_{amx}*e^{12}}{Duration_{max}}(1)weight=Durationmax​Durationlock​∗weightamx​∗e12​(1)
balanceveToken=amount+amount∗weight∗e−12(2)balance_{veToken}=amount+amount*weight*e^{-12}(2)balanceveToken​=amount+amount∗weight∗e−12(2)

其中balanceveTokenbalance_{veToken}balanceveToken​为用户的虚拟质押金额。根据智能挖矿V1的奖励分成公式(2),用户的奖励公式如下:

f(ti,tn)=∑i=1mbalanceveToken∑j=startiendi(ti−ti−1)rtTi(3)f(t_i,t_n)= \sum_{i=1}^{m}balance_{veToken} \sum_{j=start_i}^{end_i}\frac{(t_i-t_{i-1})r_t}{T_i}(3)f(ti​,tn​)=i=1∑m​balanceveToken​j=starti​∑endi​​Ti​(ti​−ti−1​)rt​​(3)

对应合约代码

function calculateBoostedBalance(uint256 amount, uint256 lockDuration) public view returns (uint256) {
    if (lockDuration == 0) {
        return amount;
    }
    uint256 boostWeight = lockDuration.mul(BOOST_WEIGHT).div(DURATION_FACTOR);
    return amount.add(amount.mul(boostWeight).div(PRECISION_FACTOR));
}

定期赎回时间限制

对应合约代码

function overdueDuration(address account) public view returns (bool, uint256, uint256){
    uint256 duration = userInfo[account].lockDuration;
    if (duration == 0) {
        return (true, 0, 0);
    }
    uint256 totalTime = block.timestamp.sub(userInfo[account].lockStartTime);
    uint256 round = totalTime.div(duration);
    uint256 overdue = totalTime.mod(duration);
    if (round < 1 || overdue > maintenanceDuration || block.timestamp < userInfo[account].lastActionTime) {
        return (false, 0, 0);
    }

    uint256 rewardsDuration = block.timestamp.sub(userInfo[account].lastActionTime);
    return (true, rewardsDuration, overdue);
}

矿池

USDD_USDT LOCK V2 farm

主网合约地址:TY1mxnpL18oDP8hsSrrxNZgUMj71pcyFS8

2pool LOCK farm

主网合约地址:TJmn1bjmNfE2F1sw2x6P224i8sFQj5mnbg

与合约交互

我们利用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,
      })
     

获取矿池信息

查看定活期矿池地址

  • 函数名称:sub_pool()

>>> let contract = await tronWeb.getContract('TJmn1bjmNfE2F1sw2x6P224i8sFQj5mnbg')
>>> await contract.methods.sub_pool().call()
TUgVp8FzZcFLHwruuncXaQo2js5Ym2GqSj

查看定期奖励

  • 函数名称:earned(address)

  • 参数:用户地址

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

执行交易

存款

  • 函数名称:deposit(uint256)

  • 参数:存款金额

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

取款

  • 函数名称:withdraw(uint256)

  • 参数:取款金额

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

其中 rtr_trt​表示奖励代币的膨胀系数, tit_iti​表示第i次变化, TiT_iTi​表示ti−1t_{i-1}ti−1​到tit_iti​阶段时刻虚拟质押总额,balanceveTokenbalance_{veToken}balanceveToken​表示用户在ti−1t_{i-1}ti−1​到tit_iti​阶段时刻的虚拟质押金额。

锁定时间为DurationlockDuration_{lock}Durationlock​,复投犹豫期DurationmaintenanceDuration_{maintenance}Durationmaintenance​,定期质押时间tstaket_{stake}tstake​,当前时间tnowt_{no w}tnow​,同时满足一下条件可以赎回:

tnow−tstake>=Durationlock(4)t_{now}-t_{stake}>=Duration_{lock}(4)tnow​−tstake​>=Durationlock​(4)
(tnow−tstake)modDurationlock<=Durationmaintenance(5)(t_{now}-t_{stake}) mod Duration_{lock} <= Duration_{maintenance}(5)(tnow​−tstake​)modDurationlock​<=Durationmaintenance​(5)

总奖励rewards,已结算分成rewardsprevrewards_{prev}rewardsprev​,结算时间tlastActiont_{lastAction}tlastAction​未结算定投时间DurationrewardDuration_{reward}Durationreward​,其中超过且不满一个定投周期的时间DurationoverdueDuration_{overdue}Durationoverdue​,提取分成奖励公式:

Durationreward=tnow−tlastAction(6)Duration_{reward}=t_{now}-t_{lastAction}(6)Durationreward​=tnow​−tlastAction​(6)
Durationoverdue=DurationrewardmodDurationlock(7)Duration_{overdue}=Duration_{reward} mod Duration_{lock}(7)Durationoverdue​=Durationreward​modDurationlock​(7)
rewardsoverdue=DurationoverdueDurationreward∗(rewards−rewardsprev)(8)rewards_{overdue}=\frac{Duration_{overdue}}{Duration_{reward}}*(rewards-rewards_{prev})(8)rewardsoverdue​=Durationreward​Durationoverdue​​∗(rewards−rewardsprev​)(8)
rewards=rewards−rewardsoverdue(9)rewards=rewards-rewards_{overdue}(9)rewards=rewards−rewardsoverdue​(9)