Hedera Token Service(HTS)中Fungible Token元数据设置后memo为空问题
问题成因与解决方案
核心原因
Hedera Token Service的setMetadata方法仅接受Uint8Array类型的参数,你直接传入JavaScript对象会被SDK静默忽略,导致代币元数据未被正确设置。另外你提到的“memo字段为空”是因为混淆了metadata与memo两个独立字段——你的代码中并未调用setMemo()方法设置memo,自然该字段为空;而你实际要设置的metadata字段也因参数类型错误未生效。
修复步骤
- 将元数据对象序列化为JSON字符串,再编码为Uint8Array后传入
setMetadata。 - 若确实需要设置memo字段,需额外调用
setMemo()方法。
修改后的代码示例
// 定义元数据对象 const metadataObj = { "name": "My token name", "image": "http://path-to-my-image" }; async function createFungibleToken() { let tokenCreateTx = await new TokenCreateTransaction() .setTokenName("Test") .setTokenSymbol("TEST") // 关键修复:将对象转为字节数组传入 .setMetadata(new TextEncoder().encode(JSON.stringify(metadataObj))) // 若需要设置memo,添加此行 .setMemo("自定义的memo内容") .setTokenType(TokenType.FungibleCommon) .setDecimals(2) .setInitialSupply(10000) .freezeWith(client); let tokenCreateSign = await tokenCreateTx.sign(privKey); let tokenCreateSubmit = await tokenCreateSign.execute(client); let tokenCreateRx = await tokenCreateSubmit.getReceipt(client); let tokenId = tokenCreateRx.tokenId; console.log(`Created token with ID: ${tokenId}`); }
补充说明
- 代币元数据本身没有强制结构要求,你可以用JSON、CBOR等任意格式序列化数据,只要最终转为Uint8Array即可。
- SDK对
setMetadata的参数类型不做校验,错误类型会直接静默丢弃,这是你看不到报错的原因。
内容的提问来源于stack exchange,提问作者bguiz
相关产品推荐
相关产品推荐

