MultiSwap:如何用Solidity在多个DEX中套利

在一次交易中,在不同的去中心化交易所进行多次兑换.

如果你想获得最大的套利,可以需要在一次交易里在DEX(去中心化交易所)之间兑换代币。或者你想定期进行的某些兑换中节省Gas。或者你有在多个DEX之间进行定制的兑换场景,当然,也许你也可以仅仅是学习。

无论你是什么原因,我们试着做一个MultiSwap,MultiSwap 将结合多个交易所到一个合约中的进行交易。它看起来像这样:

  1. 在Bancor上用ETH购买BNT
  2. 在SushiSwap上卖出BNT换取INJ
  3. 在Uniswap 3上卖出INJ换取DAI

那么,我们如何才能实现这一目标?

套利备忘录

先手动操作

首先,我们想手动尝试所有的交易。由于是测试阶段,我们将在一个测试网上进行,这个测试网需要满足我们想要使用的每个协议部署了合约。在我们的案例中,这刚好是在Ropsten网络。

  • 如果你想交易的代币在测试网上不存在,可以通过Remix自己部署一个。
  • 如果DEX上的代币流动池在测试网上还不存在,那就自己创建一下。

1.Banchor:ETH -> BNT

因此,首先去Banchor,将你在Ropsten网络上的资金从ETH兑换到BNT。

Banchor App

进行兑换后,可以点击查看以太坊交易:

Banchor Etherscan

你会很容易在Etherscan交易中找到函数名称和传递的参数,记录下来,还有文档也是有帮助。

2. SushiSwap兑换: BNT -> INJ

然后去SushiSwap,将代币从BNT换成INJ:

SushiSwap

再次记下Etherscan 交易中的函数名称和参数。SushiSwap是基于Uniswap 2的,可以在之前的博文这里中找到更详细的解释,说明它是如何工作的。

3. Uniswap 兑换:INJ -> DAI

最后到Uniswap,将你的代币从INJ换成DAI:

Uniswap

再次记下Etherscan 交易中的函数名称和参数。你还可以在以前的博文这里中找到更详细的解释,说明Uniswap v3是如何工作的。

使用Solidity完成交易

乐趣开始的备忘录

有了前面的信息,建立交易逻辑就很简单了。首先在Bancor上交易,用收到的资金在SushiSwap上交易,然后再次用收到的资金在Uniswap上交易。

1.在Bancor上交易


IBancorNetwork private constant bancorNetwork = IBancorNetwork(0xb3fa5DcF7506D146485856439eb5e401E0796B5D);
address private constant BANCOR_ETH_ADDRESS = 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE;
address private constant BANCOR_ETHBNT_POOL = 0x1aCE5DD13Ba14CA42695A905526f2ec366720b13;
address private constant BNT = 0xF35cCfbcE1228014F66809EDaFCDB836BFE388f5;

function _tradeOnBancor(uint256 amountIn, uint256 amountOutMin) private {
  bancorNetwork.convertByPath{value: msg.value}(_getPathForBancor(), amountIn, amountOutMin, address(0), address(0), 0);
}

function _getPathForBancor() private pure returns (address[] memory) {
    address[] memory path = new address[](3);
    path[0] = BANCOR_ETH_ADDRESS;...

剩余50%的内容订阅专栏后可查看

点赞 14
收藏 29
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

3 条评论

请先 登录 后评论
翻译小组
翻译小组
0x9e64...7c84
大家看到好的文章可以在 GitHub 提 Issue: https://github.com/lbc-team/Pioneer/issues 欢迎关注我的 Twitter: https://twitter.com/UpchainDAO