#contract #astro #pool #epoch #emissions #voting #vote

astroport-emissions-controller

Astroport vxASTRO 排放投票合约

2个版本 (1个稳定版)

1.0.0 2024年8月23日
1.0.0-rc.12024年6月20日

#5 in #astro

Download history 98/week @ 2024-06-14 48/week @ 2024-06-21 3/week @ 2024-06-28 2/week @ 2024-07-05

每月118次下载

GPL-3.0-only

145KB
3K SLoC

排放控制器(中心)

排放控制器允许vxASTRO持有者对ASTRO排放进行投票。该中心合约负责收集来自所有前哨站的vxASTRO质押者的投票,并在每个时代计算最终的ASTRO排放。时代持续2周,总是在UTC周一00:00开始。每个时代ASTRO的总排放量基于过去两个时代的总ASTRO收集量到ASTRO质押合约的指数移动平均(EMA)(即ASTRO回购)。

emissions_controller_general

池白名单

排放控制器只接受白名单池的投票。白名单是无需许可的,但需要支付费用。任何人都可以将池加入白名单,只要它尊重已注册的前哨站。如果池位于中心合约上,还会检查该LP代币是否与工厂中的池对应。

投票

用户需要拥有vxASTRO才能投票。他们可以在每10天一次的情况下一次性为最多五个白名单池投票。投票后,他们不能更改投票,直到冷却期结束。可执行消息接受一个包含LP代币和投票权重的元组的数组。投票权重是介于0和1之间的数字。总投票权重不能超过1。如果用户在下一个时代中没有投票,他们的贡献将保持不变。

vxASTRO变更

如果用户锁定或解锁vxASTRO,更改将在排放控制器中体现。合约根据其之前的权重分布更新其投票权。例如,具有100个投票权的用户投了以下票:[(pool1, 0.5), (pool2, 0.5)]。他们的初始贡献将是池1 50个和池2 50个。如果他们再锁定100个vxASTRO,他们的新投票权将是200,对池1和池2的贡献各100个。如果用户请求解锁vxASTRO,他们的贡献将从两个池中移除。

ASTRO动态排放曲线

总ASTRO排放量是基于总收集到的ASTRO到ASTRO质押合约(xASTRO)的两个时期EMA计算的。两个时期EMA的计算公式如下

(V_n-1 * 2/ 3 + EMA_n-1 * 1/ 3)

其中V_n是第n个时期的收集到的ASTRO,n是当前时期(一个起始时期)。
动态排放公式为

next emissions = MAX(MIN(max_astro, V_n-1 * emissions_multiple), MIN(max_astro, two-epochs EMA))

排放量上限为max_astro,这是合约状态的一部分。emissions_multiple常量控制ASTRO的通胀率。max_astro预计在每个epoch在vxASTRO启动时设置为1.4M ASTRO,而emissions_multiple预计为0.8。以后可以通过治理改变max_astroemissions_multiple

由于此公式是递归的,合约在实例化之前需要从上一个epoch获得准确的EMA和收集到的ASTRO值。

排放分配

我们将ASTRO排放分配的过程称为tuning。调整端点是无需许可的,并有两周的冷却期。在调整合约查询在epoch的起始时刻(从2024年5月20日星期一00:00:00 UTC开始,星期一00:00:00 UTC)捕捉每个池的快照投票。然后它过滤掉不属于任何前哨站的池,按投票排序,并选择前X个池,其中X = 'config.pools_per_outpost' * 前哨站数量。在此端点执行时,将计算新的动态ASTRO排放。然后合约根据上一步中选择的池的总投票权份额分配ASTRO。根据前哨站是Hub还是远程Astroport部署,合约将ASTRO连同可执行消息分别发送到Astroport Incentives合约或远程排放控制器的IBC钩子。我们预计在vxASTRO启动时将config.pools_per_outpost近似为5,然而,它以后可以通过治理改变。

请注意,接收前哨站必须实现IBC钩子才能一次性完成整个过程。在撰写本文时,Astroport有一个前哨站(Sei链)不支持此功能,并需要Builder多重签名手动干预。

在下图中,展示了几个场景。黑色箭头表示Hub上的流量,绿色箭头表示成功将IBC转移到远程前哨站(可能包含过滤后的无效LP代币),红色箭头表示尝试将IBC转移到远程前哨站失败,随后进行无许可的retry_failed_outposts调用。

tuning

IBC失败

感谢中子集成应用支持,它允许处理 ICS20 数据包的超时和失败。调整后,合约处理 IBC 回调,并根据结果标记前哨站为完成或失败。如果任何前哨站失败,任何人都可以调用 retry_failed_outposts 端点来重试失败的前哨站。注意,如果这些前哨站在该时代内没有被重试,它们的状态将在下一个时代清除。

维护白名单存在

由于安全原因,我们引入了特殊的参数 config.whitelist_threshold,其预期值为 0.01(所有选票的 1%)。在调整期间,合约在每个时代都会移除所有总选票少于 config.whitelist_threshold 的池子。这些池子需要再次白名单,并且它们的投票过程将从零开始。为被移除的池子投票的用户需要重新投票或通过特殊的 refresh_user_votes 端点重新申请他们的选票,无需冷却时间。

ASTRO 池

每个前哨站可能有一个或没有需要通过平摊排放激励的 ASTRO 池。这些池子不能被投票,并且它们从动态排放曲线上接收排放。

排放控制器余额

Astroport 治理必须维护合约的 ASTRO 和 NTRN 余额。ASTRO 用于排放分配,NTRN 用于 IBC 费用。预计治理将在下一年提前用 ASTRO 补充合约。在撰写本文时,中子需要每 IBC 转账 0.2 NTRN,其中 0.2 的 0.1 发送回合约。因此,通常预计每个时代合约都有 0.2 * 前哨站数量 * NTRN 余额。

治理投票

vxASTRO 存储者拥有与其存入的 xASTRO 数量相等的投票权。当有人向 Assembly 合约提交新的治理提案时,排放控制器负责在所有前哨站上注册它。一旦注册,vxASTRO 前哨站存储者可以对它进行投票。排放控制器接收 IBC 消息并在 Assembly 合约中应用投票。

依赖项

~17MB
~358K SLoC