卖家撤拍后最贵那笔出价少了回去的钱:从 X2Y2 审计报告读懂撤拍退款 图 1
卖家撤拍后最贵那笔出价少了回去的钱:从 X2Y2 审计报告读懂撤拍退款 · 图 1

参与链上 NFT 拍卖时,多数人只盯着两件事:出价高不高、截止时间到没到。有一份公开的合约审计报告提醒我们还有第三件事——如果你出的价被后来的竞价顶掉,或者卖家中途把拍品撤了,你的钱按什么路径退回来,退的过程会不会被卡住。这份报告是安全公司 SECBIT 在 2022 年 2 月对 X2Y2 协议出具的,审计对象包括核心合约与拍卖逻辑,报告本身至今挂在 X2Y2 的官方文档站上。

报告里与”撤拍退款”直接相关的条目说的是这样一件事:拍卖开始后,合约允许卖家在截止日之前撤回拍品,此时合约会把出价资金退回。问题出在退款的分配逻辑上——按合约当时的实现,最后一位出价者的资金里,有一部分会被当作激励补偿给之前被顶掉的出价者。也就是说,正常拍卖流程里”后来者替前人解套”的机制,在卖家撤拍这个分支上直接作用在了最后出价人头上:撤拍一次,这位出价人拿回的比自己出的少。审计建议团队重新核对这部分资金流,团队随后确认并修订了相关逻辑。

同一段拍卖代码还有另一个被点名的坑:当上一位出价者的地址是一个合约钱包,而这个合约故意写了个无限消耗 gas 的回调函数时,合约在向它退款的瞬间,整笔交易会因为 gas 被烧光而失败——新一轮出价永远无法完成。这是典型的”主动转账退款”设计被恶意收款方拖死(拒绝服务)的形态。后来的通用解法大家都熟悉了:钱不主动推,改成收款方自己来取,谁想要自己的退款谁付取款的 gas,恶意地址只能卡住自己。

这两个条目放到今天依然有教科书价值,因为它们揭示的不是某个平台的独有问题,而是”拍卖状态机”这个抽象机器共同的薄弱点:状态转换的分支越多,每个分支的资金流就越要单独验证。参与任何链上拍卖前,可以把问题换成三个可查的版本:第一,这份合约的审计报告有没有公开?在哪?审的是不是当前部署的版本?第二,报告里和 auction、refund、withdraw 相关的条目,团队标记为”已修复”的是哪些版本?你正在交互的合约地址是修复后的吗?第三,出价前假设最坏情形——卖家撤拍、被人顶价、自己是最后一口——三种情形的退款条款分别从哪条函数走,有没有像”给历史出价人发激励”这类会让实际回款低于面值的隐藏条款。

还有一个安全习惯可以直接从第二个条目抄过来:用合约钱包或者交易所子账户参与交互式拍卖前,先确认该地址能不能正常”被动收款”。不能接收原生币回调的地址,在某些老式退款设计里就是地雷。普通外部账户没这个问题,但脚本代投、多签钱包、智能账户都得单独确认。

审计报告不是护身符——X2Y2 的合约经过审计,该出的事故后来照样出;但报告是一份免费的、具体到函数的风险地图。参与拍卖前花十分钟读一眼”退款”章节,收益通常比多盯三天地板价大得多。

再把这份审计条目变成参与任何链上拍卖前的固定动作。第一,确认出价资金的退回形态:正规拍卖合约退回的是原生资产,遇到退款要走一笔对你合约的调用的设计,把它当红旗。第二,确认撤拍规则写在哪:有的平台把最高价之外全额秒退、最高价随下架返还直接写进帮助中心,这种公开条款比客服话术可靠,读到就截图存档,找不到条款的平台默认按最坏情形预算风险。第三,理解竞价排队:拍卖合约里并列出价可以堆在同一价位、下架时按先进先出返还,这意味着我出过价不等于我的钱安全躺着,退出拍卖的正确动作是核对自己的退款交易,而不是以为撤回出价会自动发生。第四,用小额拍品试水:第一次参与某个拍卖合约,先走完一次出价、被超、退款全流程,确认退款路径、到账节奏和 gas 消耗都符合预期,再参与高价场次。审计报告的价值不在于让你害怕拍卖,而在于把退款从一个想当然的词变成一条可以验证的链上路径。

本文为机制说明,不构成任何投资建议。审计报告针对特定历史版本,历史版本与当前部署可能不同,交互前请以合约地址与官方公告为准。