资金流
这一页讲钱怎么走:用户付的钱落在哪里、怎么集中、怎么到你的账上、手续费在哪一步扣。
与之相对的信息流讲的是订单状态怎么流转。两页可以对照看: 资金流由你主动驱动,信息流由 HashNut 驱动。
本页出现的名词都在名词解释里有定义。
一句话概括
资金全程只在三类地方停留 —— 收款地址(几十到几百个)→ 分账合约(每条链 1 个)→ 提现地址(1 个),而且从不经过 HashNut 的账户。
注意这是一个多对一再对一的结构:收款地址是一批(数量由你自己决定,建议 50 起), 它们全部归集到同一个分账合约,再从分账合约提现到同一个提现地址。
三步中,第 1 步由用户触发,第 2、3 步都由商户自己发起。HashNut 在整条资金链路上没有任何 一步能单方面转走商户的钱。
三个"钱袋子"
| 收款地址 | 分账合约 | 提现地址 | |
|---|---|---|---|
| 是什么 | 普通链上地址(EOA) | 智能合约 | 商户自己的钱包地址 |
| 谁能动这笔钱 | 商户 + HashNut 各持一半私钥分片,需双方共同签名 | 只能按合约代码执行,无人能任意转出 | 商户完全控制 |
| 资金停留时长 | 从用户付款到你发起归集 | 从归集到你发起提现 | 最终归属,不再流动 |
| 数量 | 几十到几百个 | 每条链一个 | 每条链一个 |
| 谁来管理 | HashNut 自动分配给订单 | 商户部署 | 商户在开户时指定 |
第 1 段:用户 → 收款地址
创建订单时,HashNut 从收款地址池里取一个空闲地址绑定到该订单,并把地址返回给你。 用户把 token 转到这个地址,这一段就完成了。
几个要点:
- 一个订单一个地址,多个订单并行占用多个地址。 这是为什么你需要一批收款地址而不是一个 —— 地址池里有多少空闲地址,就能同时挂多少笔待付款订单。池子空了就创建不出新订单, 所以建议低频大额场景准备 50 个,高频场景 200 个。
- 资金到账即属于商户。 收款地址的私钥是 2-of-2 MPC 分片,一半在你本机的
keys.db里, 一半在 HashNut。任何一方单独都签不出转账交易 —— HashNut 拿不走,你也不能绕过合约直接转走。 - 地址是复用的。 订单结束(成功 / 过期 / 取消)后,地址释放回池给后续订单用。 但释放地址不等于转移资金 —— 钱还留在链上那个地址里,直到你归集。
- 每个地址上会同时躺着多笔钱。 一个收款地址服务过很多订单,归集前它的余额是这些订单的累计。 这是正常状态,不需要按订单逐笔归集。
- 所以归集时你面对的是一批地址。 资金分散在几十到几百个地址上是常态,归集正是为了把它们 收拢到一处 —— 这也是下一段要分批处理的原因。
TIP
用户付款后你不需要立刻归集。资金在收款地址上是安全的,可以按天或按周批量归集以节省 gas。
第 2 段:收款地址 → 分账合约(归集)
在 MPC Client 的分账合约页点击「归集」,把散落在各收款地址上的资金集中到分账合约。
关键机制:靠 approve,不靠私钥
归集不是由收款地址发起转账,而是分账合约凭事先获得的授权额度(approve)把钱拉过来。
这带来两个结果:
- 归集交易的签名者是商户钱包,不需要 MPC 协作、不需要 HashNut 在线配合。 即使你的
keys.db丢了,只要还有商户钱包私钥,已授权的资金依然能正常归集和提现。 - 反过来,没有授权的 token 归集不了。授权是按 (收款地址, token) 计的, 收一种新 token 前要先用 MPC Client 的「批量补授权」给存量地址补上。
操作特征
| 项 | 说明 |
|---|---|
| 发起方 | 商户,在 MPC Client 手动触发 |
| 签名 | 商户钱包私钥直签 |
| 覆盖范围 | 一次调用可覆盖多个收款地址 × 多种 token |
| 分批 | 按收款地址分批,默认每批 50 个 |
| 空批跳过 | 归集前会先模拟,余额为 0 的批次自动跳过,不白花 gas |
| 是否分账 | 不分账,只是把钱集中起来 |
具体操作步骤见归集资金。
第 3 段:分账合约 → 提现地址(提现)
在 MPC Client 点击「提现」,把属于自己的那部分转到提现地址。分账在这一步才真正发生。
分账怎么算
分账合约按分账比例(share,总和固定为 10000)记账。某个分账人当前可提取的金额是:
可提金额 = 累计总入账 × 该分账人 share ÷ 10000 − 该分账人已提取金额注意是累计口径,不是按单笔订单结算。你随时提现都不会算错账,多次提现也不会重复领取。
按默认 0.8% 费率:
| 分账人 | share | 累计入账 10000 USDT 时可提 |
|---|---|---|
| 商户 | 9920 | 9920 USDT |
| 平台(HashNut) | 80 | 80 USDT |
商户调用提现只能提走自己那一份,平台的部分由平台自己提取 —— 合约层面就是这样约束的, 不依赖任何人的自觉。
钱到哪个地址
到部署分账合约时登记的提现地址,也就是一键开户界面里填的那个。
WARNING
到账地址由合约里登记的提现地址决定,不是发起提现交易的钱包地址。 换一个钱包发起提现,钱还是进原来那个提现地址。
具体操作步骤见提现资金。
手续费(gas)的流向
上面三段讲的是 token 的流向。链上交易还要花原生币(ETH / BNB / MATIC / TRX)作为 gas, 这部分是另一条独立的资金流,全部由商户的钱包承担,HashNut 不代付。
| 花在哪 | 为什么需要 |
|---|---|
| 转给收款地址 | 收款地址要自己发起授权交易,得有 gas |
| 转给 Manager | Manager 要发起「把收款地址注册进合约」的交易 |
| 商户钱包直接支付 | 部署合约、激活、归集、提现这些由商户签名的交易 |
转给收款地址和 Manager 的原生币用不完,可以随时通过 MPC Client 的「回收手续费」(sweep) 转回商户钱包。批量创建地址的流程末尾会自动做一次回收。
TIP
接入前请确认商户钱包里有足够的原生币。要接 ETH 和 TRON 两条链,就得同时准备 ETH 和 TRX。 每一步操作前 MPC Client 都会先做费用评估并弹出确认框,不会静默花钱。
特殊情况下资金去哪了
| 情况 | 资金流向 |
|---|---|
| 短款(用户少付) | 已付的部分照样躺在收款地址上,可以正常归集。订单停在 PAID,生成补款单等用户补齐 |
| 长款(用户多付) | 多付的部分一起归集进分账合约,并按 share 参与分账。HashNut 不会自动退差额,需自行与用户结算 |
| 订单过期后用户才付款 | 钱仍然到了那个收款地址,不会丢,仍然可以归集。但地址已被释放,这笔转账不一定能匹配回那笔已过期的订单,需要人工核对 |
| 用户转了没授权的 token | 钱在收款地址上,但分账合约拉不动它。用「批量补授权」给该地址补上这个 token 的授权后即可归集 |
| 用户转错链 | HashNut 无法处理。收款地址在不同 EVM 链上虽然是同一个字符串,但订单和授权都是按链隔离的 |
keys.db 丢失 | 已授权资金的归集和提现不受影响(只需商户钱包私钥)。受影响的是新增收款地址、补授权、回收手续费 —— 这些需要 MPC 分片 |
与信息流的关系
两条流是解耦的,只在两个点上相交:
| 交点 | 说明 |
|---|---|
| 收款地址激活 | 地址完成授权并注册进合约后才进入地址池,订单才能用它收款 —— 资金流的准备工作是信息流的前提 |
| 订单状态决定地址释放 | 订单进入终态后地址释放回池,但资金不动 —— 信息流控制地址的分配,不控制资金 |
换句话说:信息流决定"这笔钱算哪个订单的",资金流决定"这笔钱现在在哪、下一步去哪"。 订单状态到了 SUCCESS 不代表钱已经进你的提现地址 —— 那还需要你主动归集和提现。