You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用HDWalletProviderFactory获取Provider遇TypeError错误求助

解决HDWalletProvider初始化时的"Expected input type is Uint8Array (got object)"错误

问题复现

开发前端应用并使用Jest测试时,调用HDWalletProviderFactory.getProvider(Chain.ethereum())获取Provider,抛出以下错误:

TypeError: Expected input type is Uint8Array (got object)

错误栈信息:

18 |         }
> 19 |         return new HDWalletProvider({
     |                ^
  20 |             mnemonic: {
  21 |                 phrase: Env.get('OPERATION_MNEMONIC')
  22 |             },

  at toBytes (node_modules/@noble/hashes/utils.js:89:15)
  at pbkdf2Init (node_modules/@noble/hashes/pbkdf2.js:17:45)
  at pbkdf2 (node_modules/@noble/hashes/pbkdf2.js:42:44)
  at mnemonicToSeedSync (node_modules/@scure/bip39/index.js:140:32)
  at HDWalletProvider.checkBIP39Mnemonic (node_modules/@truffle/hdwallet-provider/src/index.ts:329:25)
  at new HDWalletProvider (node_modules/@truffle/hdwallet-provider/src/index.ts:109:12)
  at Function.getProvider (tests/data/reusable_classes/hd_wallet_provider_factory.ts:20:23)
  at AuthorizationInitializer.getProvider (tests/data/reusable_classes/authorization_token.ts:22:47)
  at new AuthorizationInitializer (tests/data/reusable_classes/authorization_token.ts:15:16)

对应的HDWalletProviderFactory代码:

export default class HDWalletProviderFactory {

    public static getProvider(chain:Chain): HDWalletProvider {

        return new HDWalletProvider({
            mnemonic: {
                phrase: Env.get('OPERATION_MNEMONIC')
            },
            providerOrUrl: Env.get('ETHEREUM_HDWALLET_PROVIDER_URL')
        })
    }
}

错误根源分析

从错误栈可追踪到:@scure/bip39的mnemonicToSeedSync方法在转换助记词为字节流时失败,预期输入是Uint8Array,但实际传入了对象。本质问题是Env.get('OPERATION_MNEMONIC')返回的不是字符串类型的助记词,而是一个异常对象。

可能的触发原因:

  • 环境变量OPERATION_MNEMONIC未正确加载,Env.get返回默认空对象或错误格式值
  • Env工具类的get方法在获取不到值时,未返回字符串而是返回对象(如包含错误信息的对象)
  • 环境变量值被意外序列化为JSON对象,而非原始字符串格式的助记词

解决方案

  1. 验证环境变量返回值
    在创建HDWalletProvider前,先打印Env.get('OPERATION_MNEMONIC')的类型和值,确认是否为字符串:
public static getProvider(chain:Chain): HDWalletProvider {
    const mnemonicPhrase = Env.get('OPERATION_MNEMONIC');
    console.log(typeof mnemonicPhrase, mnemonicPhrase); // 检查类型与实际值
    return new HDWalletProvider({
        mnemonic: {
            phrase: mnemonicPhrase
        },
        providerOrUrl: Env.get('ETHEREUM_HDWALLET_PROVIDER_URL')
    })
}

如果输出类型为object而非string,说明Env.get的返回值不符合预期。

  1. 修复环境变量加载逻辑
  • 确保测试环境中正确设置OPERATION_MNEMONIC,值为纯字符串格式的助记词
  • 检查Env工具类实现,确保获取不到环境变量时返回空字符串或抛出错误,而非返回对象
  • 若通过JSON文件加载环境变量,确认助记词未被误写为对象格式(正确格式应为"OPERATION_MNEMONIC": "xxx xxx xxx...",而非嵌套对象)
  1. 临时强制类型转换(仅作为应急方案)
    若确认环境变量值正确但Env.get返回包装对象,可强制转换为字符串:
phrase: String(Env.get('OPERATION_MNEMONIC')).trim()

注意:此方案仅为临时 workaround,优先修复Env工具类的返回值类型问题。

  1. 检查Jest环境变量配置
    确保Jest测试中环境变量被正确注入:比如在jest.config.js中通过setupFiles加载环境变量,或使用dotenv包确保测试时能读取到.env文件中的值。

内容的提问来源于stack exchange,提问作者newbie

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 13:35:19