认购
当前 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 SUIconst [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。该事件没有钱包字段,应从交易发送者读取钱包地址。