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

使用Java Web3J获取ERC1155钱包余额的实现方法问询

ERC1155余额查询实现方案(Web3j环境)

你当前的代码存在3个核心错误,且调用逻辑选择有误,按以下方式修正即可正常查询:

现有代码问题说明

  • 方法名拼写错误:ERC1155标准的余额查询方法为balanceOf,你编写的balancedOf多了冗余字符d,合约无法匹配到对应方法会直接调用失败。
  • 返回值类型定义错误:balanceOf方法的返回值是uint256类型的余额数值,不是你定义的Bool类型,类型不匹配会导致返回结果解码失败。
  • 调用逻辑选择错误:余额查询是链上只读操作,不需要构造签名交易、不需要调用ethSendRawTransaction(该方法仅用于发送需要上链、消耗Gas的写入类交易),直接通过eth_call接口即可完成查询,无Gas消耗。

正确实现代码

1. 构造正确的合约调用方法

首先修正方法名、入参、返回值类型,完成调用数据编码:

import org.web3j.abi.FunctionEncoder;
import org.web3j.abi.TypeReference;
import org.web3j.abi.datatypes.Address;
import org.web3j.abi.datatypes.Function;
import org.web3j.abi.datatypes.generated.Uint256;
import java.math.BigInteger;
import java.util.Arrays;
import java.util.List;

// 构造balanceOf调用方法
Function balanceOfFunction = new Function(
        "balanceOf",
        Arrays.asList(
                new Address(ethAddress), // 待查询的钱包地址
                new Uint256(tokenId) // 待查询的ERC1155代币ID
        ),
        Arrays.asList(new TypeReference<Uint256>() {})
);
String encodedCallData = FunctionEncoder.encode(balanceOfFunction);

2. 发起eth_call只读请求

构造调用参数,直接连接节点发起请求,不需要签名:

import org.web3j.protocol.core.DefaultBlockParameterName;
import org.web3j.protocol.core.methods.request.Transaction;
import org.web3j.protocol.Web3j;

// 构造eth_call交易对象,from地址可填零地址
Transaction callTx = Transaction.createEthCallTransaction(
        "0x0000000000000000000000000000000000000000",
        erc1155ContractAddress, // ERC1155合约的部署地址
        encodedCallData
);
// 发起请求,读取最新区块状态下的余额
String callResult = web3j.ethCall(callTx, DefaultBlockParameterName.LATEST)
        .send()
        .getValue();

3. 解码返回结果获取余额

import org.web3j.abi.FunctionReturnDecoder;
import org.web3j.abi.datatypes.Type;

List<Type> decodedResult = FunctionReturnDecoder.decode(callResult, balanceOfFunction.getOutputParameters());
Uint256 balanceValue = (Uint256) decodedResult.get(0);
// 转换为BigInteger类型即可直接使用
BigInteger erc1155Balance = balanceValue.getValue();

补充提示:如果需要批量查询一个地址下的多个ERC1155代币余额,可以调用ERC1155标准的balanceOfBatch方法,传入地址数组、代币ID数组,即可一次性拿到多资产余额,减少RPC请求次数,实现逻辑和上述流程一致,仅需调整入参和返回值的类型定义即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 05:09:18