本文作者:yohansun
[1]
对于合约上的发币,在币安出品bsc链后,大大简化了发币的过程,但是我们如何新上的币都有哪些呢,以及如何进行监控及筛选好的币种,我们今天来讲下:
主要思路是按照以太坊[2]的合约事件监控,通过这个方式我们可以启动一个监控js来实现时间代币上新事件,对于合约时间监控web3.js[3]的官方文档是这么说的:
调用:
myContract.events.MyEvent([options][, callback])
参数:
options – Object: 可选,用于部署的选项,包含以下字段:
filter – Object : 可选,按索引参数过滤事件。例如 {filter: {myNumber: [12,13]}} 表示 “myNumber” 为12或13的所有事件
fromBlock – Number: 可选,仅监听该选项指定编号的块中发生的事件
topics – Array : 可选,用来手动为事件过滤器设定主题。如果设置过filter属性和事件签名,那么(topic[0])将不会自动设置
callback – Function: 可选,该回调函数触发时,其第二给参数为事件对象,第一个参数为错误对象
监控区块链[4]的方式
链接监控的几种方式:
- 使用websocket ws方式链接节点,进行订阅
- 使用etherscan-apis ,进行api请求
- rpc调用方式订阅
本文今天讲的是rpc[5]调用方式订阅
rpc 获取为:
const provider = new ethers.providers.JsonRpcProvider(‘https://bsc-dataseed1.binance.org’)
要创建对应的filter事件:
const filter = { address: contractAddress,//替换成实际的合约地址 topics: [ ethers.utils.id(‘Transfer(address,address,uint256)’) ] }
然后要通过provider.on方法进行持续的监听,当有事件发生就会自动调用该方法;
provider.on(filter, async event => { jy = await analyseTransferEvent(event) }
所有的代码为:
//监控交易的合约 const { ethers } = require(‘ethers’) const moment = require(‘moment’); const Web3 = require(‘web3’); const pancakeAddress = “0x10ED43C718714eb63d5aA57B78B54704E256024E” //pancakeswap let pancakeSwapAbi = [{abi数据要通过https://bscscan.com/address/0x947950bcc74888a40ffa2593c5798f11fc9124c4#contracts合约地址来查看对应的abi}]; const provider = new ethers.providers.JsonRpcProvider(‘https://bsc-dataseed1.binance.org’) //订阅了最新区块的Transfer事件,及交易对信息 const filter = { address: contractAddress, topics: [ ethers.utils.id(‘Transfer(address,address,uint256)’) ] } provider.on(filter, async event => { jy = await analyseTransferEvent(event) }) async function analyseTransferEvent(event) { // 获取 transaction 详情 const res = await provider.getTransaction(event.transactionHash); if (res.to.toString() !== pancakeAddress) { return; } // 解析 input 数据 pancakeInterface = new ethers.utils.Interface(pancakeSwapAbi); const input = pancakeInterface.parseTransaction({ data: res.data, value: res.value }); contractAbi = [{要监控的合约abi,获取方式上面有说吗}] contractInterface = new ethers.utils.Interface(contractAbi); const parsedEvent = contractInterface.parseLog(event); const address = res.from; // 买 /卖 const action = address === parsedEvent.args.from ? ‘SELL’ : ‘BUY’; // 将数据存到数据库 }
参考资料
[1]yohansun: https://learnblockchain.cn/people/6402
[2]以太坊: https://learnblockchain.cn/article/1201
[3]web3.js: https://learnblockchain.cn/docs/web3.js
[4]区块链: https://learnblockchain.cn/2019/10/30/whatblockchain
[5]rpc: https://learnblockchain.cn/2019/08/07/490e3f16edd6