本文作者: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]的方式
链接监控的几种方式:
- 使用websocket ws方式链接节点,进行订阅
- 使用etherscan-apis ,进行api请求
- 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