出价时圈定属性条件:Immutable 订单簿 trait bids 的匹配规则与索引依赖 图 1
出价时圈定属性条件:Immutable 订单簿 trait bids 的匹配规则与索引依赖 · 图 1

给整个 NFT 合集挂一个买单,来者不拒地扫货,是集合出价;只想买背景是蓝色或红色那些件,就是按属性出价。Immutable 官方文档对后者的定位很准确:trait bid 是集合出价的更严格形态——卖方填充时仍然可以自选具体代币,但那枚代币的索引属性必须全部满足买方的筛选条件。

规则分两层,先看经济结构。文档写明 trait bid 用 ERC-20 代币出价,购买目标是 ERC-721 或 ERC-1155 合集内的一枚或多枚 NFT;在 API 响应里,这类订单以 TRAIT_BID 类型与挂单、普通出价、集合出价并列返回,应用或 webhook 要按订单类型字段分流。也就是说它是一等公民的订单类型,不是挂在集合出价上的滤镜。

第二层是匹配语义,三条规则决定了什么代币能成交。第一,你给出的每一条属性类型都必须被匹配——筛选里同时列了背景和眼睛两个维度,代币就两个维度都要过,不存在满足一半就成交。第二,同一维度内是白名单逻辑:属性值等于你列举的任何一个值即通过。第三,匹配的宽容度有明确定义——值比较不区分大小写,数值型属性会被转成字符串等价形式再比。别小看第三条:不同项目把同一属性写成 Blue、blue 或 3 和 03 的情况常见,这套转换规则决定了你的筛选在不同合集上是否如预期生效。

官方文档花了一段强调的依赖值得单列:填充校验依赖索引器。当卖方用某枚代币填你的单时,Immutable 要拿这枚 NFT 的属性对照你的筛选,而属性来自平台的索引服务;文档的警告写得很具体——如果元数据缺失或过期,即使代币在链上真实存在,成交也可能失败。这把一个隐性条件摆上台面:按属性出价的可靠度上限,是平台元数据索引的完整度。对刚上链、元数据还没进索引的合约,trait bid 挂上也接不到货。

技术流程方面官方给了路线图:与其他订单簿流程相同,prepare 构建 orderComponents、orderHash 与 actions,跑完必要的批准交易,对 SIGNABLE 动作里的 EIP-712 订单签名,最后 create 提交。订单生命周期由平台订单簿管理,与链上挂单的交互逻辑相同。

给准备用属性出价的人一条检查顺序。第一步别信前端的筛选界面,把条件翻译成属性类型名与值清单逐字核对,尤其确认项目元数据里属性的键名大小写;第二步先看目标合集的元数据在索引器里的覆盖状态,新盘与刚改过元数据的合集优先怀疑;第三步控制单量——每个维度都收紧的筛选可能长期零成交,价格上有竞争力的宽条件比苛刻条件更容易被卖方填。本文只讨论机制,不涉及任何出价时机的判断,不构成任何投资建议。

和相邻机制对照能再清一层。Seaport 系的集合出价在成交时同样要校验代币归属合集,但不理解属性语义;trait bid 的增量正是把校验从归属判断升级到属性匹配,而属性数据在以太坊公共标准里本不存在统一上链格式,只能靠索引器从各项目自定义元数据里解析。这解释了官方为什么把索引依赖写得那么重:匹配语义有多精确,取决于解析链条有多干净。设计自己出价策略时按同一条因果链自检——筛选越细,对元数据质量的要求越陡。

还有一条市场结构层面的观察:属性出价天然比集合出价慢。卖方视角填 trait bid 要翻库存找符合筛选的代币,符合优先成交的心理让宽条件订单先被消化,苛刻条件往往挂到过期。这不是缺陷而是定价信息——长期无人填的 trait bid 实际上在为冷属性定价,挂单方等于给出一个带条件的远期报价。把它理解为流动性工具而非成交保证,才符合它的设计本意;条件本身没有好坏,只有是否匹配当前库存分布。

出价时圈定属性条件:Immutable 订单簿 trait bids 的匹配规则与索引依赖 图 2
出价时圈定属性条件:Immutable 订单簿 trait bids 的匹配规则与索引依赖 · 图 2