费用与奖励
当前 ABI:版本化源码 c96cd0d。示例使用已激活的 PACKAGE_VERSION 对象;历史非版本化地址需要不同 ABI。详见版本管理及部署参考。
费用政策
跳转到“费用政策”目标费用政策为 200 / 100 / 1,500 / 1,500 基点。15% 的 LP 手续费分成需要更新链上政策;本文档并不表示该更新已执行:
| 字段 | 基点 | 适用基数 |
|---|---|---|
raise_bps |
200(2%) | 以 Quote 计的成功募资目标,不含超额认购退款 |
token_bps |
100(1%) | 已铸造 Meme 总供应量 |
lp_fee_meme_bps |
1,500(15%) | 已收取的 Meme LP 手续费 |
lp_fee_quote_bps |
1,500(15%) | 已收取的 Quote LP 手续费 |
部署记录仅记录发布时的历史费率。这些是可变政策,不是硬编码默认值:包初始化时费率为零。新预售读取 FeePolicy.fees,现有预售读取 Presale.protocol_fees,金库当前 LP 费率读取 Vault.protocol_fees。详见读取状态。
要将目标费率应用于新预售,Blast 的 FeeAdmin 需调用 fee_policy::set_fees 并传入上述四项费率。现有预售保留其快照:在 start_ms 前可调用 blast_presale::set_protocol_fees 更新;已迁移金库则需调用 presale_vault::set_protocol_lp_fees,将两种资产的费率均设为 1,500 基点。执行后应重新读取各受影响对象以核实。
部署记录属于上述历史包,不能用来确认上方目标费率、当前版本化源码的默认值或其他部署的配置。本页下方调用示例采用版本化 ABI,不能直接对 10 月 11 日包提交。
创建、认购、领取和退款没有额外预售合约收费。Sui gas 和交易平台费用另计。Blast 应用若启用从兑换输出扣除的费用,该费用在本 FeePolicy 外配置,并单独展示在报价中,不改变这四项费率。
收取 LP 手续费
跳转到“收取 LP 手续费”任何人均可收取金库手续费。每次收取支付 Blast 份额(指定合作伙伴的金库会暂存该份额),并支付各手续费接收方。持币奖励份额中,Quote 留在金库供奖励轮次使用;Meme 支付给由治理控制的 FeePolicy.destination,并由 HolderMemePaid 记录。
- Cetus:
cetus::collect_fees<Meme, Quote, CoinA, CoinB>(vault, package_version, fee_policy, cetus_config, burn_manager, pool)。pool为该金库的Pool<CoinA, CoinB>,代币顺序与迁移时相同。 - Bluefin:
bluefin::collect_fees<Meme, Quote>(vault, package_version, fee_policy, bluefin_config, pool, clock)。pool为该金库的Pool<Meme, Quote>。
const tx = new Transaction();tx.moveCall({ target: `${PKG}::bluefin::collect_fees`, typeArguments: [MEME, QUOTE], arguments: [tx.object(VAULT), tx.object(PACKAGE_VERSION), tx.object(FEE_POLICY), tx.object(BLUEFIN_CONFIG), tx.object(POOL), tx.object.clock()],});使用其他池会以 EPositionPoolMismatch 中止。收取零金额合法,不发出事件。两个适配器都不收取交易平台激励奖励。
指定合作伙伴的金库,每次收取后应调用 presale_vault::pay_protocol_lp_fees_with_partner(vault, package_version, fee_policy, partner, clock)。没有待付余额也允许调用,因此可始终紧接收取操作执行。
不经过预售而锁定仓位
跳转到“不经过预售而锁定仓位”自行向 Cetus 或 Bluefin 添加流动性的团队,可将该仓位存入 Vault,当前代码没有取出仓位的路径。之后金库按与迁移预售相同的方式分配 LP 手续费:先扣 Blast 的 LP 份额,再按团队方案分给手续费接收方和持币奖励。任何人都可锁定自己的仓位。
- 使用交易平台自身的调用创建池、开仓并注入资金。
- 与预售一样,构造
fee_split(fee_recipients, holder_rewards_bps)。 - 锁定仓位:
- Cetus:
cetus::new_vault<Meme, Quote, CoinA, CoinB>(position, package_version, fee_split, partner_id, creation_policy, fee_policy, pool, burn_manager, clock)。pool是持有仓位的Pool<CoinA, CoinB>,Meme 和 Quote 按池中顺序排列。仓位经 Cetus LP 销毁机制销毁,金库保留手续费领取凭证。 - Bluefin:
bluefin::new_vault<Meme, Quote>(position, package_version, fee_split, partner_id, creation_policy, fee_policy, pool, clock)。pool是持有仓位的Pool<Meme, Quote>,不支持第一币种不是 Meme 的池。金库持有仓位。
- Cetus:
CreationPolicy必须允许支付代币和交易平台,与预售的检查相同。- 金库保存
FeePolicy当前 LP 费率的快照;与其他金库一样,Blast 的FeeAdmin之后可修改这些费率。 presale_id和presale_cap_id均为零 ID,因此没有迁移剩余代币,也无法通过PresaleCap领取。VaultCreated的presale_id为零。partner_id是Option<ID>。若指定合作伙伴,必须是CreationPolicy当前接受的伙伴;Blast LP 费用随后会暂存,等待pay_protocol_lp_fees_with_partner,与指定伙伴的预售金库相同。- 其他池的仓位以
EPositionPoolMismatch中止;无流动性的仓位以presale_vault::EZeroLiquidity中止。 - 收费使用相同的
collect_fees调用。发布持币奖励轮次仍需 Blast 的RewardsAdmin见证。
版本化部署允许兼容性升级,因此未来行为还取决于升级权限;不能仅凭当前无提取路径承诺永久不变。详见版本与激活。
迁移剩余代币
跳转到“迁移剩余代币”注入预售池时,可能有少量预售代币或支付代币无法注入池仓位。PresaleCap 持有人可用 presale_vault::claim_migration_residuals(vault, package_version, presale_cap) 领取一次,返回 (Coin<Meme>, Coin<Quote>)。必须在同一笔交易中转出两者。两者均为空时,以 ENoMigrationResiduals 中止。
持币奖励轮次
跳转到“持币奖励轮次”LP 手续费中的持币奖励 Quote 份额累积在金库。Blast 的 RewardsAdmin 使用可用持币奖励余额发布轮次。每轮将持币奖励预算与可选的 gas 补偿 Quote 预留资金分开保管。
- 发布:
holder_rewards::publish_round(vault, package_version, witness, fee_policy, expected_treasury, number, start_checkpoint, end_checkpoint, root, manifest_digest, leaf_count, meme_amount, quote_amount, gas_reserve_amount, claim_deadline_ms, clock)。witness为AdminWitness<RewardsAdmin>。轮次编号必须等于vault.next_round,从零开始。检查点区间必须非空,起点不得早于上一轮终点;跳过的区间不需要空轮次。根和清单摘要各为 32 字节,叶节点数为 1 至 65,536,奖励预算必须为正数。奖励资金加预留资金不得超过金库可用余额。 - 费用收款地址检查: 发布时
expected_treasury必须仍等于FeePolicy.destination,否则以ETreasuryChanged中止。核实后的地址保存在轮次中。gas 预留金额为零表示不启用补偿,无需结算。 - 领取:
holder_rewards::claim(round, package_version, index, beneficiary, meme_amount, quote_amount, proof)。任何人可代为提交,款项付给beneficiary,每个索引只支付一次。 - 结算 gas 预留资金:
holder_rewards::settle_gas_reserve(round, package_version, witness, vault, reimbursement_amount),由RewardsAdmin执行一次。将reimbursement_amount(不超过预留金额)支付给轮次保存的财库地址,未使用 Quote 退回金库。持币奖励领取不能动用此资金。实际 gas 成本由链下确定,合约约束补偿不得超过预留金额。 - 关闭:
holder_rewards::close_round(round, package_version, vault, clock)。now ≥ claim_deadline_ms后任何人可调用,将未领取奖励及尚未结算的 gas 预留资金退回正确的金库,并删除轮次。关闭之前仍可领取;仅超过截止时间不会自动关闭。
叶节点摘要如下,节点哈希及证明规则与白名单相同:
blake2b256( 0x00 || "blast-presale-holder-rewards-v1" || bcs(vault_id: ID) // 32 bytes || bcs(round_number: u64) || bcs(index: u64) || bcs(beneficiary: address) || bcs(meme_amount: u64) || bcs(quote_amount: u64) )金额计算
跳转到“金额计算”所有金额使用原子单位,所有费率使用以 10,000 为分母的基点。
最大余数法
跳转到“最大余数法”供应量、募资及每次 LP 手续费分配使用同一方法:每份先得 floor(X × share ÷ 10,000),剩余单位依次分给余数最大的份额,每份一个;余数相同时,排在前面的份额优先。每个单位恰好分配一次。
- 供应量顺序:买家、池、Blast 代币费用,然后代币接收方。
- 募资顺序:募资接收方、Blast 募资费用,然后获得剩余份额的池。
成交比例与领取
跳转到“成交比例与领取”设 T 为认购总额,R 为募资目标,A 为买家代币总额,c 为某钱包的认购金额:
- 代币:
floor(A × c ÷ T) - 超额认购退款:
floor((T − R) × c ÷ T) - 最后领取的钱包获得两种代币的全部剩余余额,避免取整余量滞留。
- 预售价格:
R ÷ A,单位为每原子单位预售代币对应的 Quote 原子单位数。池开盘价格:池 Quote ÷ 池代币。 - 若硬顶生效前未超额认购,则
T等于R,退款均为零。若此前已超额认购,硬顶不再接受新增资金,已有超额部分按上述方式比例分配。
当领取顺序尚未确定时,预览显示向下取整的基础金额,并说明最后领取的钱包会获得剩余取整单位。只有根据当前状态确认其为最后一位时,才显示金库内的实际剩余金额;最终金额以执行时的状态为准。
Blast 费用
跳转到“Blast 费用”每场预售在创建时保存 FeePolicy 费率快照。后续 set_fees 不影响现有预售。
- 募资费用和代币费用:创建时分配,迁移时支付,超额认购退款不收费。
- LP 费用:每次收取时,按金库当前费率,Blast 从每种代币中取得
ceil(gross × rate ÷ 10,000)。迁移后FeeAdmin可修改金库费率。 - 每次付款均使用付款时的
FeePolicy.destination。 start_ms前,Blast 可替换单场预售费率。募资费率变化会增减池的 Quote,代币费率变化会增减买家分配;接收方金额不变。
合作伙伴
跳转到“合作伙伴”合作伙伴从 Blast 募资费用和 LP 费用中获得 floor(fee × share_bps ÷ 10,000),不参与代币费用分成。使用付款时的伙伴分成比例,最高 8,000 基点。
LP 手续费分配
跳转到“LP 手续费分配”扣除 Blast 部分后,每种代币按手续费接收方顺序、再持币奖励份额进行分配。余数相同时,接收方优先于持币奖励,较早的接收方优先于较晚的接收方。接收方以代币对象收款,金额为零时不发送。持币奖励 Quote 留在金库供轮次使用,Meme 付给由治理控制的费用收款地址。分配比例本身不变。