如何使用TypeScript实现元数据Uses标签并解决NFT铸造报错
问题根因
Uses doesn’t have schema schema.uses.uses报错由TS端传参结构错误触发:传入createMetadata指令的uses字段多嵌套了一层对象,Borsh序列化时会按照传入的嵌套结构去找不存在的schema.uses.uses序列化规则,直接抛出异常,和链上逻辑无关。
正确配置步骤(TS)
- 排查现有传参,删除多余的
uses嵌套层级。绝大多数触发该报错的写法都是错误嵌套了结构,参考如下错误示例:
// 错误写法:多嵌套一层uses,直接触发目标报错 const wrongUsesConfig = { uses: { useMethod: "burning", remaining: 10, total: 10 } }
- 导入官方SDK的类型和枚举,避免硬传字符串、数值导致的不匹配,平铺配置uses字段,参考正确示例:
import { CreateMetadataAccountArgsV3, UseMethod } from "@metaplex-foundation/mpl-token-metadata"; const nftMetadataArgs: CreateMetadataAccountArgsV3 = { data: { name: "NFT名称", symbol: "NFT符号", uri: "元数据JSON存储地址", sellerFeeBasisPoints: 500, // 对应5%版税 creators: [/* 你的创作者地址配置数组 */], collection: null, // uses字段直接平铺在data下,不要额外嵌套 uses: { useMethod: UseMethod.Burn, // 对应burn销毁模式,不要传字符串"burning" remaining: 5n, // u64类型必须传bigint,传普通number会序列化失败 total: 5n, // 规则要求total值必须大于等于remaining值 } }, isMutable: true, collectionDetails: null }
- 版本适配注意:如果使用v2.x+版本基于Umi的mpl-token-metadata,枚举导入路径不变,字段结构同样要求平铺,禁止额外嵌套;如果是v1.2及以下旧版本SDK,手动构造指令时要确认序列化schema引用的是
MetadataSchema.DataV2.uses,不要自定义层级。
其他避坑点
remaining和total字段是链上定义的u64类型,必须传bigint值,传普通数字即使不抛schema错误,链上反序列化也会失败- 不要给
useMethod传自定义字符串,SDK内部枚举值UseMethod.Burn对应数值0、UseMethod.Multiple对应1、UseMethod.Single对应2,直接导入枚举传参是最稳妥的方式 - 如果手动实现序列化逻辑,注意Uses结构体的序列化顺序固定为:1字节useMethod枚举值 → 8字节remaining(小端u64) → 8字节total(小端u64),顺序错乱也会触发schema匹配错误
内容的提问来源于stack exchange,提问作者Nayib
相关产品推荐
相关产品推荐

