订阅 ERC20 转账活动

Posted

技术标签:

【中文标题】订阅 ERC20 转账活动【英文标题】:Subscribe for ERC20 transfer events 【发布时间】:2020-09-23 20:04:31 【问题描述】:

我一直在尝试观察主网上发生的特定合约的交易,特别是 Tether (USDT)。我能够下载合同并使用 Web3 (Java) 编译可靠代码。但是我无法订阅传输事件。它只是超时..有什么我想念的吗?我正在使用下面的代码,但遇到了超时。

我看不出这不起作用的原因,我通过 Infura 连接到 wss://mainnet.infura.io/ws/v3/

  TetherToken tetherToken = TetherToken.load(
     "0xdac17f958d2ee523a2206206994597c13d831ec7",
     session.getWeb3(),
     session.getCredentials(),
     session.getGasProvider());

  String symbol = tetherToken.symbol().send();
  String name = tetherToken.name().send();
  BigInteger decimal = tetherToken.decimals().send();

  System.out.println("symbol: " + symbol); // success = USDT
  System.out.println("name: " + name); // success = Tether USD
  System.out.println("decimal: " + decimal.intValueExact()); // success = 6

  // java.io.IOException: Request with id 5 timed out
  tetherToken.transferEventFlowable(DefaultBlockParameterName.EARLIEST, DefaultBlockParameterName.LATEST)
     .subscribe(event -> 
           try 
              System.err.printf("hash=%s from=%s to=%s amount=%s%n",
                 event.log.getTransactionHash(),
                 event.from,
                 event.to,
                 event.value);
           catch(Throwable e) 
              e.printStackTrace();
           
        );

任何帮助将不胜感激。

【问题讨论】:

【参考方案1】:

原来 Web3j 框架隐藏了 Infura 响应的问题。如果 eth 日志过滤器的结果 > 10000 个结果,则 Infura 会响应:


  "jsonrpc": "2.0",
  "id": 1,
  "error": 
    "code": -32005,
    "message": "query returned more than 10000 results"
  

【讨论】:

您的问题和回答让我走上了正轨。我想知道为什么我的连接超时,原来是这样。如果您想首先监听流经的事件,那么使用 DefaultBlockParameterName.EARLIEST 并不是一个好主意。非常感谢。如果我可能会问,您在哪里找到有关如何将下载的 JSON 编译成 ABI 的信息?

以上是关于订阅 ERC20 转账活动的主要内容,如果未能解决你的问题,请参考以下文章

【ETH钱包开发04】web3j转账ERC-20 Token

ERC20转账压缩

ERC 20 优缺点,以及 eth 3 种转账方式

第73篇 ERC20一对多转账交易实现源码

第77篇 ERC20-USDT智能合约

USDT-TRC20转账最低限制