预售资金先进托管再退款:ERC-5507 可退款代币的 deadline 机制 图 1
预售资金先进托管再退款:ERC-5507 可退款代币的 deadline 机制 · 图 1

预售资金先进托管再退款:ERC-5507 可退款代币的 deadline 机制

“预售资金托管,活动不达预期可退”——这类承诺过去只能靠项目方记名单、手工打款兑现,退没退、何时退,链上看不出来。ERC-5507 可退款代币(Refundable Tokens)把这条承诺搬进合约:在 ERC-20、ERC-721、ERC-1155 之上加一组退款接口。标准状态为 Final,创建于 2022 年 8 月 19 日,声明依赖 ERC-20、ERC-165、ERC-721、ERC-1155,所有实现必须使用 ERC-165 声明接口。

托管到期的模型

标准开篇就把模型说清:资金先以托管形式持有,到预定时间点之前用户都可以对自己买到的代币请求退款;预定时间一过,资金变为可申领。换句话说,5507 的世界观是“先押钱、看结果、到期再结算”,最贴合的原始场景就是首轮代币发售(文档标题页写的正是 initial token offerings 的退款能力),也适合带退款条款的 NFT 预售。

接口层面每个代币标准都给了同一套四件套。以最常被引用的 ERC-721 扩展为例:refund(tokenId) 由持币人调用,合约核对你确实持有这枚 NFT,把它收回,把当初那笔 ETH 退回给你,发出 Refund 事件;refundFrom(from, tokenId) 允许服务方凭 allowance 机制代用户执行退款,RefundFrom 事件把发起者一并记录;refundOf(tokenId) 查询这枚币对应多少可退金额(以 wei 计);refundDeadlineOf(tokenId) 返回“从哪个区块开始不可退”——注意返回类型是区块高度而不是时间戳,这是读这套接口时最容易踩错的单位。ERC-20 与 ERC-1155 变体把参数从 tokenId 换成数量或 id,refundOf() 不带参数返回账户级可退总额,逻辑同构。

对用户的意义在于“可验证的承诺”:退款规则写在合约里,退款记录是链上事件,你不用相信客服截图,打开事件列表一笔一笔都能核对。对项目的意义则是流程减负——退款窗口内谁退了、退了多少钱自动对账,不需要人工台账。

预售资金先进托管再退款:ERC-5507 可退款代币的 deadline 机制 图 2
预售资金先进托管再退款:ERC-5507 可退款代币的 deadline 机制 · 图 2

怎么读一个用 5507 的项目

正确顺序是:找到官方公布的合约地址,在区块浏览器读公开函数。先调 refundOf 看自己名下可退余额是否如实;再调 refundDeadlineOf,把返回的区块高度换算成当前区块与预估出块间隔,得到人类可读的截止线。两条都要做,因为可退金额与截止线分别回答“能退多少”和“还剩多久”。若返回的可退金额为零或调用报错,先区分两种情形:是你没持有对应代币,还是 deadline 已过、资金已转为项目方可申领——事件的发出记录能帮你还原是哪一步发生了什么。

安全考量:标准自己点名的重入问题

文档在 refundrefundFrom 的实现提示里反复出现同一句提醒:先检查用户是否持有代币,并注意重入向量。退款的本质是“先收回资产、再送出 ETH”,如果合约先把 ETH 转给一个会执行代码的地址(比如合约钱包),对方可能在回弹逻辑里再次进入退款流程。规范层靠 ERC-165 声明与事件留痕,工程层靠检查顺序与互斥锁。对用户而言可操作的推论有两条:其一,退款不需要用户签任何交易,5507 的退款只是你调用一个合约函数——凡是要求“先签一个授权交易才能退款”的页面都不属于这套机制,按钓鱼处理;其二,能点进官方合约再操作,任何镜像前端显示的余额与 deadline 都不如链上直查可信。

两种常见误读

第一,5507 的退款上限就是当初锁进托管的金额,refundOf 返回多少即最多退多少,它不是价格保险,代币市价涨跌与退款额无关。第二,退款动作与代币收回发生在同一个函数调用里,不存在“先退钱、币晚点收回”的中间状态,Refund 事件产生即两件事同时完成,对账以事件为唯一凭据。ERC-20 变体的 refundOf()refundDeadlineOf() 不带参数,回答账户级额度与截止,适合按数量分批购买的场景;ERC-721 与 ERC-1155 变体则按 tokenID 或 id 逐项查询,粒度更细。 最后提醒:本文讲合约接口,不构成投资建议;退款条款以具体合约代码为准,参与预售前请核对合约地址、金额单位与截止区块的项目官方说明。