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

调用TronWeb.estimateEnergy报错Cannot set properties of null如何解决?

问题描述

我有一个基于NestJS+TypeScript的应用,正在对接TronWeb并尝试计算预估Gas(能耗),使用的代码如下:

const estimatedEnergy = await tronWeb.transactionBuilder.estimateEnergy(
    USDTContractAddress,
    'balanceOf(address)',
    null,
    abi,
    address,
);

执行该函数时返回如下错误:

[Nest] 26120  - 26/03/2024, 4:23:09 pm   ERROR [ExceptionsHandler] Cannot set properties of null (setting 'estimateEnergy')
TypeError: Cannot set properties of null (setting 'estimateEnergy')
    at e.value (C:\app\node_modules\tronweb\dist\webpack:\tronweb\src\lib\transactionBuilder.js:1277:19)
    at Object.getEstimateGasFee (C:\app\src\tronweb\index.ts:108:62)
    at estimateGasFee (C:\app\src\controller.ts:48:41)
    at C:\app\node_modules\@nestjs\core\router\router-execution-context.js:38:29
    at processTicksAndRejections (node:internal/process/task_queues:95:5)
    at C:\app\node_modules\@nestjs\core\router\router-execution-context.js:46:28
    at C:\app\node_modules\@nestjs\core\router\router-proxy.js:9:17

已确认使用的依赖版本为最新版,请问该如何解决这个问题?

解决方案

这个错误核心是tronWeb.transactionBuilder实例未正确初始化,导致调用方法时触发null对象赋值操作,可按以下步骤修复:

  • 验证TronWeb实例初始化完整性
    确保已正确配置节点信息且实例化无错误,初始化示例:

    import TronWeb from 'tronweb';
    
    const tronWeb = new TronWeb({
      fullHost: 'https://api.trongrid.io', // 替换为可用的TRON节点
      privateKey: '你的私钥(按需配置)',
    });
    
    // 主动验证连接状态
    async function checkTronConnection() {
      const connected = await tronWeb.isConnected();
      if (!connected) throw new Error('TronWeb节点连接失败');
    }
    
  • 修正estimateEnergy调用方式
    直接通过合约实例调用方法并估算能耗,比直接用transactionBuilder更可靠,示例:

    // 先初始化合约实例
    const usdtContract = await tronWeb.contract(abi, USDTContractAddress);
    // 调用方法并估算能耗
    const estimatedEnergy = await usdtContract.balanceOf(address).estimateEnergy();
    

    若坚持使用transactionBuilder.estimateEnergy,需严格匹配参数顺序:合约地址、方法选择器、配置项、方法参数、调用者地址,你的代码中abi参数位置错误,该方法无需传入abi,需提前通过合约实例或其他方式关联。

  • 确保NestJS中实例异步初始化完成
    在NestJS服务中使用OnModuleInit钩子完成TronWeb初始化,避免未就绪就调用方法:

    import { Injectable, OnModuleInit } from '@nestjs/common';
    import TronWeb from 'tronweb';
    
    @Injectable()
    export class TronService implements OnModuleInit {
      private tronWebInstance: TronWeb;
    
      async onModuleInit() {
        this.tronWebInstance = new TronWeb({
          fullHost: 'https://api.trongrid.io',
        });
        // 等待连接验证完成
        await this.tronWebInstance.isConnected();
      }
    
      async getEstimatedEnergy(address: string) {
        const contract = await this.tronWebInstance.contract(abi, USDTContractAddress);
        return contract.balanceOf(address).estimateEnergy();
      }
    }
    
  • 排查版本兼容性
    若最新版存在bug,可尝试切换到稳定版本,比如:

    npm install tronweb@^4.0.0
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 09:32:49