你要解决的问题
想了解某个 NFT 系列的版税到底声明了多少、付给谁?如果合约实现了 ERC-2981,链上就有唯一权威答案:royaltyInfo() 函数。本文给出免写代码的查询方法。
这个接口长什么样
ERC-2981 定义了一个查询函数:
function royaltyInfo(uint256 tokenId, uint256 salePrice)
external view
returns (address receiver, uint256 royaltyAmount);
给它一个代币编号和一个假设的售价,它返回两样东西:版税收款地址 receiver,以及该售价下应付的版税金额 royaltyAmount。金额用与售价相同的货币单位计算(售价用 ETH 回答就用 ETH)。OpenZeppelin 的常见实现把比例以基点(万分比)存储,例如 500 即 5%。
关键前提,标准原文写得很直白:版税支付是自愿的(voluntary),这个接口只负责“声明应付多少”,不强制任何市场付款。
三种查询步骤
方法一:区块浏览器(最常用)
- 打开 Etherscan 等浏览器,搜索该 NFT 的合约地址;
- 进入 Contract Read as Proxy(读取)标签,连接或不连接钱包均可;
- 找到
royaltyInfo,tokenId填你想查的编号,salePrice填一个 Wei 单位的测试值(如查 1 ETH 售价下的版税就填 1000000000000000000); - 点击 Query:返回的 receiver 就是版税地址,royaltyAmount 换算回 ETH 就是版税金额。
方法二:市场合约页
在 OpenSea 等市场的 Collection 页面点开合约地址,同样能进入上述读取界面,适合从藏品页顺藤摸瓜。
方法三:编程调用
用任何合约交互库调用 royaltyInfo(tokenId, 1e18),把返回值当百分比读。适合批量核验一个系列是否所有代币用同一收款地址。
查不到怎么办
- 调用报错或返回全零:合约大概率没实现 ERC-2981,版税只能依据市场政策(见平台规则区别)。
- 用
supportsInterface(0x2a55205a)可快速探测是否声明支持该接口。 - 部分系列用链下注册表或自己的合约逻辑计算版税,链上查询结果以合约实现为准。
看懂结果的三条纪律
- 声明比例高,不代表你在任何平台卖出都会被收取;声明为 0,也不代表创作者不希望你付款——标准依赖市场自觉。
- 版税地址指向匿名合约时,先查该合约是否项目方公开认领。
- 不同
salePrice可能对应不同比例(标准允许阶梯设计),多测几个价位更稳妥。
读结果时的两个单位陷阱
第一,单位换算。salePrice 与 royaltyAmount 都以 Wei 计,1 ETH 等于 10 的 18 次方 Wei;返回 250000000000000000 对应 0.25 ETH,即 2.5% 版税。第二,基点陷阱。OpenZeppelin 实现用万分比存比例,看到 330 别读成 33%,它是 3.3%;不同实现的分母可能不是 10000,所以最稳妥的读法仍然是固定填 1 ETH 的 Wei 值、直接读返回的 ETH 数,把换算问题绕开。若某合约对 1 ETH 售价返回了明显异常的值(比如整笔售价都给了收款人),应立即核查合约实现——标准允许最高 100% 的设置,这类设置在任何真实交易场景里都值得警惕。
常见问题
问:salePrice 为什么要填测试值?
royaltyInfo 是纯查询函数,输入“如果以这个价格成交”的假设售价,返回该场景下的应付版税。填 1 ETH 对应的 Wei 值,返回结果就近似等于“版税百分比”,这是最直观的读法。
问:返回的 receiver 是交易所地址怎么办? 说明版税路径经过一个中转合约(常见于需要拆分的版税方案)。可以尝试在浏览器查看该合约是否公开验证、项目方是否认领;无法核实的,应当作“版税去向不明”处理。
问:为什么同一个代币不同 tokenId 返回不同比例? 标准允许按代币分别设置版税,也允许阶梯设计。个别项目借此做“早期藏家免版税”之类的安排,属于正常用法,但意味着版税核验不能抽查一件代表全部。
风险提示
本文不构成投资建议。版税规则可能变化,交易前以链上与平台最新规则为准。核验时间:2026 年 7 月。
发表评论
还没有评论,来说两句吧。
评论区为展示样式,提交不会被处理。