智能钱包批量交易失败时,前面成功的部分不会回滚。准确地说,如果是普通智能钱包的批量交易,要么全部成功、要么全部失败,不存在"前面成功后面失败"这种部分成功的情况,因为底层机制确保了这一条,但如果你用的是某些自定义钱包或特定协议接口,情况又不一样了。
情况 A:标准 ERC-4337 智能钱包批量交易
这是目前主流智能钱包(如通过 Alchemy 等工具创建的 AA 钱包)的默认行为。钱包调用 executeBatch() 函数把多个操作打包成一笔交易上链。
机制:
executeBatch()被设计成原子性操作。链上执行时,只要其中任何一个子操作失败(revert),整笔批量交易就会在那一环整体回滚,所有操作都不会生效。完成标准:区块浏览器里这笔交易状态为"成功",代表所有操作全部成功;状态为"失败",代表一笔都没成。
情况 B:使用了自定义 flowControl 的 EIP-5792 批量交易
一些钱包和 DApp 开始采用更新的 EIP-5792 标准,它允许前端指定失败后怎么办——是整体回滚、停下来,还是忽略失败的继续执行。
怎么做:发起交易时,DApp 通过
wallet_sendCalls接口给每个子操作打上标签。如果是onFailure: "continue",代表这个子操作失败后不触发回滚,继续执行后面的操作。完成标准:这种模式下,就可能出现"第 1 笔成功、第 2 笔失败、第 3 笔成功"的情况。你需要看钱包的签名确认界面,它会明确提示你这次批量交易是"松散原子性",失败后不回滚。
高危风险:部分钱包或链在实现上为了保证性能,会在模拟验证阶段做"乐观估算",误以为资金池余额足够覆盖所有操作。执行到中间某一步才发现钱不够,导致后续操作失败,但前面已执行的已经上链无法撤销。如果你在签名确认界面看到"允许部分成功"或类似提示,务必逐条核对金额,因为后面失败的部分不会撤销前面的转账。
情况 C:普通 EOA 钱包手动批量发送
如果你是用 MetaMask 这类 EOA 钱包,一笔一笔地连续发交易,那完全是另一回事。
机制:每笔交易有独立的 nonce,彼此毫无关联。如果第 3 笔失败了,前面的 2 笔早已在链上确认,没有任何回滚机制。
完成标准:这就是最常见的"转出去 2 笔,第 3 笔卡住"的情况。去区块浏览器看 nonce 顺序,失败的交易 nonce 之后,如果 nonce 没被消耗,后面的交易都会被堵住。
操作完成后
校验方式:去 Etherscan 或对应链的浏览器查那笔"批量交易"的哈希。如果这笔交易本身的状态是
Success,那里面所有的子操作都成了;如果是Fail,那所有子操作都回滚了,相当于没发生过。下一步动作:如果遇到情况 B 的"部分成功",立即去钱包的历史记录里核对每一笔子操作的 Hash 和金额。找到失败的子操作,单独再发一笔补齐,不要用批量功能重试整个列表,避免重复执行前面已成功的部分。



