Skip to main content
为钱包精选。 自动回收未使用的余额。典型的钱包清理模式。

场景

一位用户想将 USDC 余额的 80% 交换为 USDT,但有意保留剩下的 20% 不动。用 compose 术语来说,这就是一个 core.split,其中两个输出句柄只有一个被绑定到下游节点 —— 另一个则被悬空。悬空的资源在执行结束时会留在每签名者的代理合约上;sweepTo 告诉后端将它们转回给发送方(或任何指定地址),这样就不会有任何东西被搁置。 本配方是 dust 回收的典型形态 —— 任何一种输入的一部分被有意不使用、且不能留在代理上的模式。

本配方演示了什么

  • bps: 8000(80/20)的 core.split,且两个输出句柄只有一个被绑定到下游。
  • 隐式 dust 跟踪 —— 未绑定的句柄(b)从未成为另一个 op 的输入;编译器将其余额视为一个终端残余资源。
  • sweepTo: builder.context.sender 在交易结束时将所有残余余额返还给发送方,包括那有意未使用的 20%。
  • 一个极简的双节点 flow:一次拆分,一次交换。

完整示例

改编自 composer-sdk-examples 仓库中的 dustSweep.ts

需要留意什么

  • Inputs。 一个资源输入(amountIn: USDC)。
  • Nodes。 两个:先 core.splitlifi.swap。只有 split.a 被引用 —— split.b 从未被消费。
  • 悬空句柄。 解构 const { a } = builder.core.split(...) 会在 TypeScript 一侧悄悄丢弃 b;在线上,split 仍然声明两个输出,且编译器知道 b 未被使用。
  • 终端资源。 两个:被交换出的 USDT(有意的输出)以及来自 split.b 的未使用 USDC(dust)。两者都被 sweepTo 扫走给发送方。
  • sweepTo 形态。 当你传入 builder.context.sender 时,request.run.sweepTo === { $ref: 'context.sender' }。你也可以传入一个字面地址字符串,就像 swap-to-recipient 配方那样。
  • producedResources[<name>].simulated?.amountOut ComposeCompileResult 上的 producedResources 会同时列出 USDT(来自交换)和残余 USDC 的金额。