Skip to main content

数量都是原始 bigint

SDK 接收和返回的所有数量都是代币最小单位的 bigint,与链上存储的值完全一致: 精度可以从代币列表获取((await powfi.token.getTokenById(id)).decimals),也可以从池状态获取(state.token0Info.decimals)。 用 NumericUtils 进行换算:
@alephium/web3 也导出了 convertAmountWithDecimals 和 prettifyTokenAmount,用途相同。
不要用 JavaScript 的 number 表示数量。18 位精度的数量几乎立刻就会超过 Number.MAX_SAFE_INTEGER,而且 SDK 的类型要求使用 bigint。

基点

滑点以基点(bps)表示,类型为 bigint,其中 BPS = 10_000n: 有效值需满足 0n <= slippage < 10_000n,否则会抛出错误。

CPMM:滑点作用于数量

CPMM 报价把滑点应用在你没有固定的那个数量上:
computeSwapAmount 会填充 minimalTokenOutAmount(精确输入)或 maximalTokenInAmount(精确输出),另一个字段为 undefined。
minimalAmount 的计算是除以 (1 + s),而不是乘以 (1 − s)。对于 0.5% 的滑点,结果是 99.5025% 而不是 99.5%:略微更严格,并且让 minimalAmount 和 maximalAmount 互为精确的逆运算。
向已有的池添加流动性时,两个期望数量都会应用 minimalAmount。向空池进行首次存入时不应用滑点,因为首次存入者决定价格。

CLMM:滑点作用于价格

CLMM 操作把滑点转换为一个平方根价格限制。如果池价格会越过这个限制,兑换会停止(添加流动性则会回滚):
所以 CLMM 兑换中 1% 的滑点意味着”池价格最多可以变动 1%“。对于在狭窄区间内的大额交易,这仍可能导致输出数量相差很大。请始终用你自己的最小值检查模拟得到的输出。

价格影响

CpmmSwapQuote.priceImpact 是一个百分比数字(例如 0.42 表示 0.42%),根据交易前后的储备量计算。cpmm.swap 会拒绝 priceImpact >= 5(MAX_PRICE_IMPACT)的交易。

手续费

截止时间

CPMM 的写入方法接受 ttlMinutes(默认 60)。SDK 会把它转换为毫秒时间戳(Date.now() + ttl),超过该时间后路由合约会拒绝交易。

ALPH 押金与粉尘

在 Alephium 上,携带代币的输出必须持有最少数量的 ALPH(DUST_AMOUNT),新合约需要 MINIMAL_CONTRACT_DEPOSIT。SDK 会自动附加相应数量的 ALPH。例如,CPMM 兑换会在输入之外额外附加 2–3 倍的 DUST_AMOUNT,创建 CPMM 池会附加 1 ALPH 作为合约押金。请在发送方余额中为此以及 gas 预留一些 ALPH。