web3j的基础用法-6合约的监听器事件Event和过滤器EthFilter,以及NullPointed,调用失败导致的bug解决

简单的监听一下某个合约的Transfer事件

本篇以Uniswap为例(https://uniswap.org/)

在这里插入图片描述

合约地址 :0x1f9840a85d5af5bf1d1762f925bdaddc4201f984 (Uni)

监听合约Tranfer事件

  1. 调用代码
   private void run1() throws Exception {
        log.info("hello eth,hello web3j");

        Web3j web3j = Web3jInfo.connect();
//        BigInteger total = TokenClient.getTokenTotalSupply(web3j, "0xff9c1b15b16263c61d017ee9f65c50e4ae0113d7");
//        System.out.println("loot(0xff9c1b15b16263c61d017ee9f65c50e4ae0113d7) total:" + total);

        TransMonitor.getInstance().setWeb3j(web3j);
        TransMonitor.getInstance().subscribeContract("0x1f9840a85d5af5bf1d1762f925bdaddc4201f984", new Action1<Log>() {
            @Override
            public void call(Log log) {
                System.out.println("transBlockNo:" + log.getBlockNumber());
                System.out.println("transHash:" + log.getTransactionHash());
                List<String> topics = log.getTopics();
                for (String topic : topics) {
                    System.out.println("transTopic:" + topic);
                }
            }
        });
    }
  1. 核心代码实现在这里
  /**
     * 监听合约的交易事件
     **/
    public Subscription subscribeContract(String contractAddress, final Action1<? super Log> onNext) {
        if (this.web3j == null) return null;

        // 要监听的合约事件 交易
        EthFilter filter = new EthFilter(
                DefaultBlockParameter.valueOf(BigInteger.valueOf(13763721L)),
                DefaultBlockParameterName.LATEST,
                contractAddress);
        Event event = new Event("Transfer",
                Arrays.<TypeReference<?>>asList(
                        new TypeReference<Address>(true) {
                        },
                        new TypeReference<Address>(true) {
                        },

                        new TypeReference<Uint256>(false) {
                        }));

        filter.addSingleTopic(EventEncoder.encode(event));
        return web3j.ethLogObservable(filter).subscribe(onNext);
    }

    public void unsubscribeContract(Subscription subscription) {
        if (this.web3j == null) return;
        subscription.unsubscribe();
    }

之前实验全量区块,导致请求多次失败,是由于个人RPC节点的请求和数据有限,为了测试出结果,从13763721L block到当前,结果毫秒级返回成功。
在这里插入图片描述

  1. Transfer包含的3个参数
    在这里插入图片描述

  2. 所以由此扩展,所有合约的Event 都可以按照此方法进行构造和监听。

项目github地址

https://github.com/jambestwick/we3jdemo文章来源地址https://uudwc.com/A/gk53w

原文地址:https://blog.csdn.net/weixin_41602901/article/details/121794643

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请联系站长进行投诉反馈,一经查实,立即删除!

上一篇 2023年06月27日 19:10
正交相机和透视相机的区别
下一篇 2023年06月27日 19:10