在Infura上建立闪电贷套利机器人 #2

在上一篇文章中我们介绍了我们机器人背后的三个主要概念:套利、基于合约的交易和乐观转账。

在这篇文章中,我们将介绍如何构建一个程序,以观察并执行有利可图的套利交易。

这是我们做的整体流程:

1.程序( Bot )正在观察Uniswap和Sushiswap上ETH-Dai配对的价格。

2.当它发现一个有利可图的套利机会时,它就会向我们部署的合约发送一笔交易。

3.在这笔交易中,合约将:

a) 使用闪电兑,乐观地从价格较低的资产池中借入资产。

b) 立即在较高的资产池出售资产。

c) 偿还闪电兑,将差额收入囊中。

让我们一起来实现这些吧!

我们的程序是在Node.js中使用ethers.js库编写的,并与Infura节点相连,套利智能合约是用Solidity 编写。

Infura

我们的后端部分是用Node写的,将使用Infura节点来观察Uniswap和Sushiswap合约上ETH和Dai的价格。 这里会依靠Infura节点来获取主网每个新区块产生的价格。 如果你没有免费的Infura账户,你可以在 这里 注册。

.env 配置

*这是超级重要的!*我们还需要存储我们的私钥来签署主网交易。 我们把所有的敏感信息都放在.env文件中( 查看在repo中的例子 )。 我们还输入了套利合约的地址和Infura主网节点的密钥。

PRIVATE_KEY=
FLASH_LOANER=
INFURA_KEY=

确保 PRIVATE_KEY 与部署 FLASH_LOANER 合约的相同。 另外,与 PRIVATE_KEY 相关联的以太坊账户需要有足够的资金来支付Gas费用,Gas费用可能很高。

如果你不确定我们为什么要这样做, 请阅读这篇优秀的文章,解释如何避免将你的私钥上传到Github 。正如文章所解释的,我们需要将敏感信息放在这个.env文件中,然后我们将其添加到 .gitignore文件中 , 像这样:

.env
yarn.lock
package-lock.json
node_modules

这样,当我们把信息推送到Github时,这个文件就不会被提交。 这是超级,超级重要的!

Ethers.js

我们使用Ethers.js是因为它兼容 Typescript ,Typescript是项目的原始语言。 这对于Ethereum开发者来说是一个老问题了,但是关于ethers.js和web3,js的更多区别, 请看这篇文章

合约实例

接下来,我们在第11行和第12行实例化 Uniswap和Sushiswap合约

// uni/sushiswap ABIs
const UniswapV2Pair = require('./abis/IUniswapV2Pair.json');
const UniswapV2Factory = require('./abis/...