安卓开发中如何使用Web3j Java获取ERC20代币的TotalSupply?
获取ERC20代币总供应量的解决方案
核心实现步骤
ERC20标准合约的totalSupply()是公开只读方法,只要合约实例加载正确就能调用,以下是具体落地步骤:
1. 定义ERC20合约接口
Web3j需要对应合约的Java接口,你可以直接手动定义包含核心方法的接口,不用复杂生成:
import org.web3j.abi.datatypes.generated.Uint256; import org.web3j.protocol.core.RemoteCall; public interface ERC20 { // 对应ERC20的totalSupply()方法 RemoteCall<Uint256> totalSupply(); // 如果需要处理小数格式,建议同时定义decimals方法 RemoteCall<Uint256> decimals(); }
2. 正确加载合约实例
之前load方法失败大概率是参数配置问题,只读方法不需要有效签名凭证,正确写法如下:
// 你已通过Infura初始化的Web3j实例 Web3j web3j = Web3j.build(new HttpService("你的Infura节点URL")); // 目标代币的合约地址(确认是对应网络的正确地址) String tokenContractAddr = "0x..."; // 加载合约,只读方法可传空Credentials或无效密钥,无需签名 ERC20 tokenContract = ERC20.load( tokenContractAddr, web3j, Credentials.create(""), // 只读方法无需有效凭证 new DefaultGasProvider() );
3. 调用方法并处理结果
Android中务必用异步线程调用,避免阻塞主线程:
new Thread(() -> { try { // 获取总供应量原始值(Uint256类型) Uint256 supplyUint = tokenContract.totalSupply().send(); BigInteger rawSupply = supplyUint.getValue(); // 如果需要转换为带小数的可读格式,先获取代币小数位数 Uint256 decimalsUint = tokenContract.decimals().send(); int decimals = decimalsUint.getValue().intValue(); // 转换为用户友好的格式 BigDecimal displaySupply = new BigDecimal(rawSupply) .divide(new BigDecimal(Math.pow(10, decimals))) .toPlainString(); // 更新UI需切回主线程 runOnUiThread(() -> { // 将displaySupply显示到TextView等组件 // textView.setText("总供应量:" + displaySupply); }); } catch (Exception e) { e.printStackTrace(); // 处理异常:合约地址错误、网络故障、节点不匹配等 } }).start();
常见问题排查
- 确认合约地址与Infura节点网络匹配(比如主网代币不能用测试网节点)
- 检查AndroidManifest.xml是否添加了网络权限:
<uses-permission android:name="android.permission.INTERNET"/> - 确保接口方法名与ERC20标准完全一致(大小写、参数都不能错)
内容的提问来源于stack exchange,提问作者Sparky
相关产品推荐
相关产品推荐

