跳转到内容

认购

当前 ABI:版本化源码 c96cd0d。示例使用已激活的 PACKAGE_VERSION 对象;历史非版本化地址需要不同 ABI。详见版本管理及部署参考。

认购始终记在交易发送者名下。中继者无法替他人认购,但 gas 赞助可用,因为用户仍是交易发送者。

每次认购均返回一个 Coin<Quote>:硬顶未接受的部分,或金额为零的代币。它没有 drop 能力,必须转回发送者。

预售情况 调用
公开规则,任意阶段 commit_open(presale, package_version, coin, clock)
白名单,任意阶段 commit_allowlisted(presale, package_version, coin, index, wallet_cap, proof, clock)
原本无参与资格的钱包,在向所有人开放的无单钱包上限阶段 commit_uncapped(presale, package_version, coin, clock)

白名单预售在无单钱包上限阶段仍检查证明,只是不再应用认购上限。

import { Transaction } from "@mysten/sui/transactions";
const tx = new Transaction();
const [payment] = tx.splitCoins(tx.gas, [amount]); // amount in atomic units of SUI
const [unused] = tx.moveCall({
target: `${PKG}::blast_presale::commit_open`,
typeArguments: [MEME, SUI],
arguments: [tx.object(PRESALE), tx.object(PACKAGE_VERSION), payment, tx.object.clock()],
});
tx.transferObjects([unused], sender);

当支付代币为 SUI 且用户自行支付 gas 时,可以从 tx.gas 拆分支付代币。使用 gas 赞助或其他支付代币时,应从用户拥有的代币对象中拆分。

index 和 wallet_cap 来自该钱包的白名单叶节点,proof 是兄弟节点摘要。详见白名单证明。

import { bcs } from "@mysten/sui/bcs";
const [unused] = tx.moveCall({
target: `${PKG}::blast_presale::commit_allowlisted`,
typeArguments: [MEME, SUI],
arguments: [
tx.object(PRESALE),
tx.object(PACKAGE_VERSION),
payment,
tx.pure.u64(index),
tx.pure.u64(walletCap),
tx.pure(bcs.vector(bcs.vector(bcs.u8())).serialize(proof.map((p) => Array.from(p)))),
tx.object.clock(),
],
});
tx.transferObjects([unused], sender);
  • 窗口范围为 start_ms ≤ now < end_ms。开始前以 EPresaleNotStarted 中止,到达或超过结束时间以 EPresaleEnded 中止。
  • 钱包首次认购占用一个参与名额,后续可追加任意正数金额。
  • 最低认购额针对本次认购后的钱包累计金额,因此首次认购必须达到该金额。恰好补足募资硬顶的认购可低于最低额。
  • 无单钱包上限阶段开始前,钱包累计金额必须不超过其上限(EWalletCapExceeded)。
  • 白名单钱包后续认购必须提交与首次相同的上限。
  • 硬顶生效后(now ≥ start_ms + starts_after_ms),每次认购仅接受募资尚缺的金额并退还剩余部分。募满后以 EPresaleFilled 中止。硬顶生效前,以及不设硬顶时,认购总额可超过目标。
  • 硬顶不会取消单钱包上限,只有无单钱包上限阶段会取消。
  • 结算后,包括提前结束后,预售不再处于 Open,认购会以 EInvalidLifecycle 中止。

每次接受认购均发出 Committed。该事件没有钱包字段,应从交易发送者读取钱包地址。