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

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

> * 译文出自:[登链翻译计划](https://github.com/lbc-team/Pioneer) > * 译者:[翻译小组](https://learnblockchain.cn/people/412) > * 校对:[Tiny 熊](https://learnblockchain.cn/people/15) > * 本文永久链接:[learnblockchain.cn/article…](https://learnblockchain.cn/article/2941) 如果你想获得最大的套利,可以需要在一次交易里在DEX(去中心化交易所)之间兑换代币。或者你想定期进行的某些兑换中节省Gas。或者你有在多个DEX之间进行定制的兑换场景,当然,也许你也可以仅仅是学习。 无论你是什么原因,我们试着做一个MultiSwap,MultiSwap 将结合多个交易所到一个合约中的进行交易。它看起来像这样: 1. 在Bancor上用ETH购买[BNT](https://etherscan.io/token/0x1f573d6fb3f13d689ff844b4ce37794d79a7ff1c)。 2. 在SushiSwap上卖出BNT换取[INJ](https://etherscan.io/token/0xe28b3b32b6c345a34ff64674606124dd5aceca30)。 3. 在Uniswap 3上卖出INJ换取[DAI](https://etherscan.io/token/0x6b175474e89094c44da98b954eedeac495271d0f)。 那么,我们如何才能实现这一目标? ![套利备忘录](https://img.learnblockchain.cn/pics/20210902082314.jpeg) ## 先手动操作 首先,我们想手动尝试所有的交易。由于是测试阶段,我们将在一个测试网上进行,这个测试网需要满足我们想要使用的每个协议部署了合约。在我们的案例中,这刚好是在Ropsten网络。 - 如果你想交易的代币在测试网上不存在,可以通过Remix自己部署一个。 - 如果DEX上的代币流动池在测试网上还不存在,那就自己创建一下。 ### 1.Banchor:ETH -> BNT 因此,首先去[Banchor](https://app.bancor.network/eth/swap?from=0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE&to=0xF35cCfbcE1228014F66809EDaFCDB836BFE388f5),将你在Ropsten网络上的资金从ETH兑换到BNT。 ![Banchor App](https://img.learnblockchain.cn/pics/20210902082322.png) 进行兑换后,可以点击查看以太坊交易: ![Banchor Etherscan](https://img.learnblockchain.cn/pics/20210902082316.png) 你会很容易在[Etherscan交易](https://ropsten.etherscan.io/tx/0x21b95960b1a7c832c91e705390420edf3faa35b18469a8bc517056d88af9634e)中找到函数名称和传递的参数,记录下来,还有[文档](https://docs.bancor.network/developer-quick-start/trading-with-bancor#trading-from-your-smart-contract)也是有帮助。 ### 2. SushiSwap兑换: BNT -> INJ 然后去[SushiSwap](https://app.sushi.com/swap?inputCurrency=0x9108Ab1bb7D054a3C1Cd62329668536f925397e5&outputCurrency=0xF35cCfbcE1228014F66809EDaFCDB836BFE388f5),将代币从BNT换成INJ: ![SushiSwap](https://img.learnblockchain.cn/pics/20210902082352.png) 再次记下[Etherscan 交易](https://ropsten.etherscan.io/tx/0x727301c32fcdbb29e14203610b26c7ab7f44f5d940057c2c39ecc0ae9e919c0f)中的函数名称和参数。SushiSwap是基于Uniswap 2的,可以在之前的博文[这里](https://learnblockchain.cn/article/2580)中找到更详细的解释,说明它是如何工作的。 ### 3. Uniswap 兑换:INJ -> DAI 最后到[Uniswap](https://app.uniswap.org/#/swap),将你的代币从INJ换成DAI: ![Uniswap](https://img.learnblockchain.cn/pics/20210902082536.png) 再次记下[Etherscan](https://ropsten.etherscan.io/tx/0xc23e6efa4c95747cb1421b582b1d29ce1ae1a529f84c28a94f74536997358262)[ 交易](https://ropsten.etherscan.io/tx/0x727301c32fcdbb29e14203610b26c7ab7f44f5d940057c2c39ecc0ae9e919c0f)中的函数名称和参数。你还可以在以前的博文[这里](https://learnblockchain.cn/article/2580)中找到更详细的解释,说明Uniswap v3是如何工作的。 ## 使用Solidity完成交易 ![乐趣开始的备忘录](https://img.learnblockchain.cn/pics/20210902085531.jpg) 有了前面的信息,建立交易逻辑就很简单了。首先在Bancor上交易,用收到的资金在SushiSwap上交易,然后再次用收到的资金在Uniswap上交易。 ### 1.在Bancor上交易 ```javascript 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;...

  • 译文出自:登链翻译计划
  • 译者:翻译小组
  • 校对:Tiny 熊
  • 本文永久链接:learnblockchain.cn/article…

如果你想获得最大的套利,可以需要在一次交易里在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。

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

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

2. SushiSwap兑换: BNT -> INJ

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

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

3. Uniswap 兑换:INJ -> DAI

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

再次记下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%的内容购买后可查看

  • 单篇购买 5学分
  • 发表于 2021-09-03 18:19
  • 阅读 ( 2144 )
  • 学分 ( 65 )
  • 分类:DeFi

评论