币安链监控合约交易

2022-02-18 17:37:51 浏览数 (1)

本文作者:yohansun[1]

对于合约上的发币,在币安出品bsc链后,大大简化了发币的过程,但是我们如何新上的币都有哪些呢,以及如何进行监控及筛选好的币种,我们今天来讲下:

主要思路是按照以太坊[2]的合约事件监控,通过这个方式我们可以启动一个监控js来实现时间代币上新事件,对于合约时间监控web3.js[3]的官方文档是这么说的:

调用:

代码语言:javascript复制
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]的方式

链接监控的几种方式:

  1. 使用websocket ws方式链接节点,进行订阅
  2. 使用etherscan-apis ,进行api请求
  3. rpc调用方式订阅

本文今天讲的是rpc[5]调用方式订阅

rpc 获取为:

const provider = new ethers.providers.JsonRpcProvider('https://bsc-dataseed1.binance.org')

要创建对应的filter事件:

代码语言:javascript复制
const filter = {
address: contractAddress,//替换成实际的合约地址
topics: [
  ethers.utils.id('Transfer(address,address,uint256)')
]

}

然后要通过provider.on方法进行持续的监听,当有事件发生就会自动调用该方法;

代码语言:javascript复制
provider.on(filter, async event => {
    jy = await analyseTransferEvent(event)
}

所有的代码为:

代码语言:javascript复制
//监控交易的合约

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

0 人点赞