$BACK
收益与领取
没有质押这一步。每一枚代币在铸造的那一刻就处于质押状态,从下一次分配起赚取 USDC,并按时间表销毁;已赚到的收益仍可领取。
铸造即质押
一笔亏损为你铸造 BACK 时,Tokenomics 合约把代币直接交给 Staking 合约,由它记在你的名下。从那一刻起,你的代币参与每一次分配。没有质押交易,没有解除质押,没有冷却期,没有锁定期,也没有任何办法转移代币:代币合约的 transfer、transferFrom 和 approve 一律回滚。钱包或区块浏览器显示的余额,就是 Staking 合约为你实时计算的存续代币数量。
销毁时间表
代币以每日批次在 00:00 UTC 销毁。在 t 时刻铸造的代币,在 t + 倒计时 之后第一个到来的 UTC 零点销毁,倒计时为 7 天;所有者可以通过时间锁在 1 天–30 天 范围内设置它,改动只适用于之后铸造的代币。一个账户在同一个销毁日的所有铸造构成一个批次,应用会按日期显示你的各个批次。
举例:一笔亏损在 1月5日周一 15:30 UTC 结算。倒计时在 1月12日周一 15:30 UTC 结束,因此代币在此后的第一个零点、也就是 1月13日周二 00:00 UTC 销毁。零点前一刻结算的亏损,其代币存续时间只比倒计时略长;零点后一刻结算的,则几乎多出一整天。
倒计时在 LP 填满之前不运行,由此引出两条规则:
- 记账资金池首次达到 $500,000 之前,什么都不销毁:在此之前铸造的代币尚未排期。首次把记账资金池推到上限的那次结算,会一次性启动所有倒计时:每一枚尚未排期的代币都获得该次结算按倒计时算出的销毁日,之后的铸造则从各自的结算时刻起算。即使 LP 之后跌回上限以下,也不会重新开始。
- 没有什么会自行运行。销毁是合约在下一次触及账户或执行分配时套用的日期运算:你的余额和供应量按当前时刻计算,排除已过销毁日的批次,不论是否已有交易把这次销毁记录下来。
领取
收益通过一个全局累加器累计到你的代币上,并在账户每次结算时(铸造或领取时)计入你的名下;读取时按同样的方式计算,但不写入。你可以随时领取:领取会把你的 USDC 收益从质押合约在 Exchange 上的余额转到你的余额,之后你可以用它交易或提现。领取会先结算账户,因此包含每个批次直到销毁为止赚到的收益。
两种领取方式:
- 在应用中,用钱包签名:签好的
Claim消息发给中继,由中继以claimBySig提交。会话密钥不能签署它。 - 从你的钱包,自己调用质押合约的
claim():需要少量 HYPE 作为 gas,不论我们的服务是否在线都可以使用。
想在不发交易的情况下查看未领取的收益,可读取质押合约的 pendingReward(address);它只包含已经分配的收益。你最后一枚代币销毁之后,已赚到的收益仍可领取,没有期限。
收益如何到达
收益分两步到达质押者:
- Exchange 收集每笔手续费中质押者的份额。只有质押合约可以调用它的
pushStakerFees,把这部分份额连同 LP 超过 $500,000 的价值一起转入质押合约的余额。 - 然后一次分配把质押合约新收到的金额,按那一刻存续的代币分摊。分配只能由分配维护程序调用
distribute,或由经中继提交的已签名Distribute请求触发;它总是先推送手续费。
我们的维护程序每 30 秒 执行一次分配,前提是至少有 $100 在等待,所以没有人需要操心。当存续代币总量不足 1 BACK 时,新的收益会等到有足够的质押量再分摊。收益不是按时间线性释放的:每次分配由那一刻存续的代币按比例分享,因此一个批次会参与直到它销毁的那个零点为止的每一次分配。
数学
合约只维护一个数字:自开始以来每枚质押代币累计的收益,按 10^36 缩放;每次分配把新的 USDC 除以存续的质押量后加到它上面。每个账户记录自己的质押量、已计入的收益,以及上次结算时的累加器值。
销毁让质押量按时间表减少,所以累加器带有一个时钟。每次分配先遍历自上次分配以来的各天:对每一个有代币排期销毁的日子,它记录下那个零点时的累加器值(此后没有任何变化,因为累加器只在分配时变动),并把该批次从质押量中扣除。账户结算时再遍历自己自上次结算以来的各天:每一个已销毁的批次,从账户上次的累加器值赚到其销毁日记录的值为止;其余质押量则赚到当前值。
第 d 天销毁的批次的收益 = amount · (accAtDayStart[d] − accThen) / P
存续质押量的收益 = stake · (acc − accThen) / P
每一项都向下取整,每次分配的步长也向下取整,因此计入的总额永远不会超过已分配的金额。按日遍历的长度以所有者可设置的最长倒计时为界,所以结算的 gas 不取决于账户离开了多久。