通过代码识别DeFi中的套利机会_理财保险_转赚网

通过代码识别DeFi中的套利机会

转赚网 0 0

概述

分散金融(英文:DeFi)是在区块链上创造的一种金融,不依赖于经纪人、交易所或银行等金融机构提供金融工具。相反,在区块链金融活动中使用智能合约。DeFi中存在大量的套利机会,包括但不限于平仓和利差套利。。本文将分析一些分散交易所(DEX)和集合交易所在合约代码上可能存在的套利机会。

分析Uniswap

Uniswap是一个分散式加密货币交易平台,采用自动做市商(AMM)模式。目前有两个流行的版本,即UniswapV2和UniswapV3。,我们将分析可能的套利机会。

UniswapV2路由器

在UniswapV2中。用户一般通过路由器契约与Pair契约和Factory契约进行交互。一般来说,路由器在交易中只会传递令牌,而不会存储令牌,但是由于各种原因。例如,由于空投和传输错误,一些令牌存储在路由器合同中。那么如何提取这些令牌呢?通过分析uniWAPV2路由器02合同的代码,,发现存在removeLiquidityETHSupportingFeeOnTransferTokens函数:

该函数用于移除流动性,其中一个token为WETH,内部调用removeLiquidity函数时传入的to的地址为address(this)。,即先将这两个令牌传递给路由器契约,然后路由器契约再将这两个令牌传递给指定地址。虽然removeLiquidity返回了此处的已调拨wet数,但是不能修改。,但是转移的另一个令牌的数量是balanceOf(address(this)),也就是路由器契约中令牌的余额。

因此,根据上面的分析,我们可以得到一个套利过程:

路由器02合同中监控ERC20令牌;

路由器02合同中监控ERC20令牌;

调用addLiquidityETH添加ERC20令牌和weh的流动性;

调用removeliquidityethsupportingeentransfertokens以移除流动性。

限制:

如果代币之前没有与wet组流动,第一次补充流动性时,会损失一小部分流动性(minimum_liquidity);

没有从路由器02契约中提取WETH和ETH的方法。

unisWAPv2pair

unisWAPv2pair合约,即所谓的流动性池,存储两种代币提供流动性。因为reserve在Paircontract中用来记录余额而不是balanceOf(address(this))。因此,当有人直接将液体代币错转到合约中时,会出现余额和保留的差异,而Pair合约中有一个余额函数skim,所以我们可以调用该函数提取有此差异的代币:

可以看出,该功能会将流动性池中两种流动性代币的余额和备付金差额的代币转移到to地址。

除了流动性池中的这两个令牌之外,也会有其他ERC20代币由于失误,空投等。如何提取这部分令牌?

在分析了结对契约的代码后,发现这部分令牌无法提取。只有一个例外:当流动性池中有LP代币时。

在这种情况下,我们可以调用Pair契约的burn函数来去除流动性,取出两个对应的流动性令牌:

UniswapV3switchingrouter

ThesamesituationwillalsoexistintheSwapRoutercontractofUniswapv3asthatofUniswapV2router.有ERC20令牌和ETH,但幸运的是,SwapRouter契约提供了几个可以轻松提取令牌的函数。

要提取ERC20代币,我们可以使用sweepToken函数:

提取ETH我们可以使用refundETH函数:

也可以直接调用unwrapWETH9函数将WETH恢复到ETH并提取:

以上是UniswapV3SwapRouter合约的套利分析。

分析了UniswapV3池契约的代码后,发现没有办法从其契约中提取其他令牌。在UniswapV2对合约中,余额和储备之间没有区别。

SushiSwap

sushiswap最初是Uniswap的一个分叉项目,后来发展成为一个独立的生态系统,提供许多不同的金融服务和产品。

因为SushiSwap与UniswapV2相同。因此,上述UniswapV2的套利手段同样适用于SushiSwap。

SushiXSwap

SushiXSwap是SushiSwap推出的基于LayerZero的全链交易协议。,支持的网络包括最优性、Arbitrum、Fantom、BNB链、多边形和雪崩。用户可以在支持的网络和资产之间进行跨链交易。

如何从SushiXSwap合约中撤销令牌?

Sushixswap中的主要功能是通过cook函数实现的,该函数提供了一系列的操作。支持的操作列表如下:

有一个ACTION_DST_retract_TOKEN,它的代码实现如下:

首先对传入cook函数的数据进行解码,然后判断金额是否等于0。如果等于0,将金额设置为ERC20代币或合约的ETH的余额。。最后,调用_transferTokens将令牌转移到指定的地址:

因此,我们只需要构造传入cook函数的动作和数据,即设置动作为ACTION_DST_retract_TOKEN。,在数据中构造令牌、接收地址和要传送的数量,然后在SushiXSwap契约中传送令牌。寿司便当盒

寿司便当盒是SushiSwap生态系统的一个组成部分。BentoBox是一款高度灵活的分散金融(DeFi)利率优化产品。简单地说,这是一个智能合约平台,允许用户存储、借贷和赚取利息。BentoBox的主要目的是优化用户在DeFi领域的收益。

以太坊上的BentoBox契约中存放了大量代币。这份合同有套利的空间吗?

在BentoBox合约中,用户可以通过存款功能进行存款,具体实现如下:

可以看到用户传入的指定令牌地址、扣款地址、收货地址、数量、股数。该函数首先进行一系列检查,然后转换金额或份额。关键点在第195-198行。这里有一张支票:amount

bentobox合约中一个代币的余额由total.elastic记录,类似于UniswapPair合约中的reserve。在某些情况下,与_tokenBalanceOf(token)会有区别。我们可以在这里使用存款函数的特性,将差额真正转换成我们自己在BentoBox契约中的余额。

所以我们在传入参数的时候,把token设置为有差异的token地址,把amount的值设置为差异,然后把from设置为BentoBox契约的地址,把to设置为自己的地址。第207行,因为地址是BentoBox契约地址,所以不会进行任何转移,但是total.elastic和_tokenBalanceOf(token)的值是平衡的。将其转换为合同中地址的余额。

dodo

dodo是一个去中心化的交易平台,使用独创的活跃做市商(PMM)算法,为Web3资产提供高效的链上流动性。。DODO不仅自己提供流动性,还聚合其他交易所的流动性。

DODO有一系列合约,其中用户将通过DODOV2代理02合约交换令牌。。类似于Uniswap路由器合同,这个合同也有一些令牌因为各种原因。我们应该如何提取这些代币?多多V2代理02

DODOV2代理02合约中有一个externalSwap函数,用于调用DODO聚合的外部平台进行交换,比如0x,1inch。代码实现如下:

[XY002][XY001]第1719-1721行检查传入参数,然后第1724行检查fromToken是否为ETH,否则调用方';的令牌将被转移到合同中,然后进行授权。对DODOAPPROVE契约的代码进行分析后发现,只有将fromTokenAmount设置为0才可以绕过:

然后,要调用的外部契约会被勾选,只有在白名单中才能调用。在这里,swapTarget和calldataConcat都是用户可以控制的。因此,可以将swapTarget设置为协定地址0x或1inch,然后将calldataConcat设置为其协定的视图函数的编码,这样返回值为true。,也可以通过requirecheck:

接下来,合同中的所有TOTOTOKEN都会被传递给调用方,其中TOTOTOTOKEN可以是ERC20token或者ETH,发送后会检查最小预期数量。我们可以通过将minReturnAmount的值设置为一个非常小的值来传递。最后两个函数调用是不相关的。

通过以上步骤,我们可以从多多V2Proxy02合约中提取ERC20代币和ETH。

1英寸

1inch是一个分散交易所(DEX)聚合器,它从多个DEX收集流动性,为用户提供代币的最佳交易价格。通过整合不同来源的流动性1inch帮助用户优化交易,在平台间寻找最优价格。1英寸';的智能合约在分散的交易所之间自动交易,用户可以轻松获得不同交易所之间的最佳价格和最低滑点。此外1inch还提供其他功能,如流动性挖掘和令牌管理。

1inch的主合约是AggregationRouter,现在广泛使用的是V4和V5版本。这两个契约也会因为各种原因有一些代币。我们可以通过构造的传入函数中的参数提取契约中的令牌。聚合路由器5

聚合routerv5契约中有一个swap函数,其实现如下:

校验了desc中的minReturnAmount后,从desc中获取srcToken和dstToken接下来的986-997行可以通过在desc结构中构造flags和srcToken来绕过:

然后执行function_execute,其中将进行一个调用,并检查执行状态。由于执行人是用户传入的,所以我们可以用地址0来绕过这里:

然后得到合约中dstToken的余额。在第1007-1018行,我们可以在desc构造flags和minReturnAmount来绕过:

最后,合约中的所有dstToken余额将被转移到dstReceiver地址,该地址也由用户控制:

通过上面的步骤,我们可以构造传递给swap函数的参数,以便提取AggregationRouterV5契约中的令牌。聚合路由器4

Thereislittledifferencebetweenaggregationrouter4andaggregationRouterV5,andthereisalsoanexchangefunctioninaggregationrouter4,whichisimplementedasfollows:

.

可以发现,swap函数的实现与aggregationrourev5相同,只是aggregationrourev5对call进行了优化。因此,AggregationRouterV4的契约中存储的令牌可以通过与AggregationRouterV5相同的方法提取。

摘要

简要介绍了一些去中心化的交易所和聚合器,并对其中可能存在的套利进行了探讨,从合约代码的层面分析了套利的原理,但在实践中能否成功还与很多因素有关,比如GAS、节点速度等等。

相关内容

标签: 契约中提取 合约中 路由器契约

通过代码识别DeFi中的套利机会文档下载: PDF DOC TXT