风险提示:央行等十部委发布《关于进一步防范和处置虚拟货币交易炒作风险的通知》, 请读者提高风险意识。

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

在 Uniswap V2 中,用户一般是通过 Router 合约与 Pair 合约以及 Factory 合约进行交互。

EoceneResearch
EoceneResearch
热度 ...

原文作者:EoceneResearch

原文来源:Odaily

概述

去中心化金融(英语:Decentralized finance,俗称DeFi)是一种创建于区块链上的金融,它不依赖券商、交易所或银行等金融机构提供金融工具,而是利用区块链上的智能合约进行金融活动。在 DeFi 中存在了大量的套利机会,包括但不限于清算、差价套利。本文将分析部分去中心化交易所(DEX)以及聚合器(Aggregator)在合约代码上可能存在的套利机会。

分析

Uniswap

Uniswap 是一个采用了自动做市商(AMM)模型的去中心化的加密货币交易平台,目前有两个流行的版本,分别是 Uniswap V2 和 Uniswap V3,我们将分别分析其中可能存在的套利机会。

Uniswap V2 Router

在 Uniswap V2 中,用户一般是通过 Router 合约与 Pair 合约以及 Factory 合约进行交互。通常来说 Router 只是会在交易中中转代币,而不会存储代币,但由于种种原因,如空投、转账失误导致 Router 合约中存储了某些代币。那么如何将这些代币提取出来呢?

通过分析 Uniswap V2 Router02 合约的代码,发现存在removeLiquidityETHSupportingFeeOnTransferTokens函数:

Uniswap

该函数用于移除其中一个代币为 WETH 的流动性,其内部调用removeLiquidity函数时传入的 to 的地址为address(this),也就是会将两种代币先转移到 Router 合约中,然后 Router 合约再将两种代币转移到指定的地址。这里虽然转移的 WETH 的数量是removeLiquidity返回的,无法修改,但是转移的另一种 Token 的数量是balanceOf(address(this)),即 Router 合约中的该代币的余额。

因此根据上述分析,我们能得到一个套利的流程:

监控到 Router02 合约存在 ERC20 代币;

  • 监控到 Router02 合约存在 ERC20 代币;
  • 调用addLiquidityETH添加该 ERC20 代币和 WETH 的流动性;
  • 调用removeLiquidityETHSupportingFeeOnTransferTokens移除流动性。

局限性:

  • 如果该代币之前没有和 WETH 组流动性,当第一次添加流动性时会损失一小部分流动性(MINIMUM_LIQUIDITY);
  • 暂时未发现提取 Router02 合约中的 WETH 和 ETH 的方法。

Uniswap V2 Pair

Uniswap V2 Pair 合约,即所谓的流动性池,存储着提供流动性的2种代币,因为 Pair 合约中使用的是 reserve 来记录余额而不是balanceOf(address(this)),因此有人直接误转流动性代币到合约中时会出现 balance 和 reserve 出现差值,而 Pair 合约中存在平衡函数skim,我们可以调用该函数将这差值数量的代币给提取出来:

Uniswap

可以看到该函数会将流动性池中两种流动性代币的 balance 和 reserve 差值数量的代币转移到 to 地址。

流动性池中除了这两种代币外,也会因为误转、空投等原因存在其他的 ERC20 代币,如何提取这一部分的代币呢?

对 Pair 合约的代码分析后发现无法提取这一部分代币,只有一种情况例外:当流动性池中存在该池的 LP 代币时。

出现这种情况我们可以调用 Pair 合约的burn函数,移除流动性,取出相应的两种流动性代币:

Uniswap

Uniswap V3 SwapRouter

Uniswap V3 的 SwapRouter 合约中也会存在和 Uniswap V2 Router 一样的情况,存在 ERC20 代币和 ETH,但是幸运的是 SwapRouter 合约提供了几个函数可以方便提取其中的代币。

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

Uniswap

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

Uniswap

也能够直接调用unwrapWETH9函数将 WETH 还原成 ETH 并提取出来:

Uniswap

以上是对 Uniswap V3 SwapRouter 合约的套利分析。

在对 UniswapV3Pool 合约的代码进行分析后,发现没有办法提取其合约中的其他代币,也不存在如 Uniswap V2 Pair 合约中 balance 和 reserve 有差值的情况。

SushiSwap

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

因为 SushiSwap 和 Uniswap V2 一样,因此上述的针对 Uniswap V2 的套利手段对与 SushiSwap 也同样适用。

SushiXSwap

SushiXSwap 是 SushiSwap 推出的基于 LayerZero 的全链交易协议,支持的网络包括Optimism、Arbitrum、Fantom、BNBChain、Polygon和Avalanche。用户可以在支持的网络以及资产之间进行跨链交易。

如何提取 SushiXSwap 合约中的代币呢?

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

Uniswap

其中有一个操作ACTION_DST_WITHDRAW_TOKEN,其代码实现如下:

Uniswap

首先将传入cook函数的 data 进行解码,然后判断 amount 是否等于0,等于0则将 amount 的值设为该合约的 ERC20 代币的余额或者 ETH 的余额。最后调用_transferTokens将代币转移到指定的地址:

Uniswap

因此我们只需要构造传入cook函数的 actions 和 datas,即将 actions 设置为ACTION_DST_WITHDRAW_TOKEN,在 data 中构造想要转移的代币、接收地址、数量,即可转移出 SushiXSwap 合约中的代币。

关于【通过代码识别DeFi中的套利机会】的延伸阅读

  • Uniswap 投票延迟,代币持有者沦为二等公民了吗?

    Uniswap基金会推迟了决定是否升级协议的投票,以奖励UNI代币持有者。这是因为一位利益相关者提出了新问题,需要更多审查。这不是第一次推迟投票,也不是代币持有者与其他利益相关者冲突的唯一一次。Uniswap V3的推出引发了关于费用转换的讨论,但最终无果而终。这反映了DeFi协议中代币持有者并非最终决定权的教训。

  • IOSG:从用户视角重新定义Web3项目和Token-market-fit

    创业团队应更关注用户需求,而不是假设。设计UI/UX时应简洁直观,移动端体验需要优化。在加密领域,吸引长期用户比短期增长更困难。空投已成为获客捷径,但需要思考其目的性和管理预期。Token的价值反映了市场对项目的共识,可以通过预期收益和叙事来吸引投机者。用户体验也很重要,注意力是稀缺资源,Crypto项目难度比以前更大,但用户需求仍是最重要的。建议Crypto创业者从用户需求出发思考。

Sushi BentoBox

Sushi BentoBox 是 SushiSwap 生态系统中的一个组件。BentoBox 是一个高度灵活的去中心化金融(DeFi)利率优化产品。简单来说,它是一个允许用户存储、借用和赚取利息的智能合约平台。BentoBox 的主要目的是优化用户在 DeFi 领域中的收益。

以太坊上的 BentoBox 合约中存储了大量了代币,那么该合约是否存在套利的空间呢?

在 BentoBox 合约中用户可以通过deposit函数进行存款操作,函数的实现如下:

Uniswap

可以看到用户传入指定的代币地址,扣款地址,接收地址,数量,股份数量,函数首先做了一系列校验,然后将 amount 或者 share 进行转换,关键点在 195 - 198 行,这里做了一个校验 :amount <= _tokenBalanceOf(token).sub(total.elastic)。

在 BentoBox 合约中某种代币的余额使用的是total.elastic来记录,类似 Uniswap Pair 合约中的 reserve,某些情况下会和_tokenBalanceOf(token)产生差值, 我们可以利用deposit函数这里的特性,将差值部分真实转换成自己在 BentoBox 合约中的余额。

因此我们传入参数时将 token 设置为存在差值的代币地址,将 amount 的值设置为差值,然后将 from 设置为 BentoBox 合约的地址,将 to 设置为自己的地址,在 207行时由于地址为 BentoBox 合约地址,因此不会进行转账,只是平衡了total.elastic和_tokenBalanceOf(token)的值,将其转换为 to 地址在合约内的余额。

DODO

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

DODO 有一系列合约,其中用户会通过 DODOV2Proxy02 合约进行代币的兑换。和 Uniswap Router 合约类似,该合约也会因为各种原因存在一些代币,我们应当如何提取这些代币?

DODOV2Proxy02

在 DODOV2Proxy02 合约中存在externalSwap函数,用来调用 DODO 聚合的外部平台进行兑换,如0x,1inch,代码实现如下:

Uniswap

1719-1721行在对传入的参数做校验,然后1724行校验 fromToken 是否为 ETH,不是的话则会将调用者的代币转移到合约中,然后进行授权,在分析了 DODOAPPROVE合约的代码后发现只需要将 fromTokenAmount 设置为0即可绕过:

Uniswap

然后会对调用的外部合约做校验,是白名单内的才能够调用,这里的swapTarget,calldataConcat都是由用户可控的,因此可以将swapTarget设置为 0x 或者 1inch 的合约地址,然后calldataConcat设置为其合约的 view 函数的编码,从而让返回的值为 true,也能通过后面的 require 校验:

Uniswap

接下来会将合约中的 toToken,全部转移给调用者,这里的 toToken 可以是 ERC20 代币,也可以是 ETH,发送完后会进行最小的预期数量校验,我们将minReturnAmount的值设置为非常小的值即可通过。最后两个函数调用无关紧要。

Uniswap

通过以上的步骤我们就能够提取出 DODOV2Proxy02 合约中的 ERC20 代币以及 ETH。

1inch

1inch是一个去中心化交易所(DEX)聚合器,它从多个 DEX 中汇集流动性,以便为用户提供最佳的代币兑换价格。通过整合来自不同来源的流动性,1inch帮助用户优化交易并在各个平台之间找到最优惠的价格。1inch的智能合约自动在各个去中心化交易所之间进行交易,使用户能够轻松地在不同交易所之间获取最佳价格和最低滑点。此外,1inch还提供了其他功能,如流动性挖矿和治理代币。

1inch 的主要合约是 AggregationRouter,现在使用较多的是 V4 和 V5 版本,这两个合约也会因为各种原因存在一些代币,我们可以通过构造的传入函数中的参数,提取合约中的代币。

AggregationRouterV5

AggregationRouterV5 合约存在swap函数,其实现如下:

Uniswap

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

Uniswap

然后执行函数_execute, 这里会进行 call 调用,并会校验执行状态,由于 executor 由用户传入,因此这里我们可以使用0地址进行绕过:

Uniswap

然后获取合约中 dstToken 的余额。1007-1018行我们可以构造 desc 中 flags 以及 minReturnAmount 进行绕过:

Uniswap

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

Uniswap

通过以上的步骤,我们能构造传入swap函数的参数从而将 AggregationRouterV5 合约中的代币提走。

AggregationRouterV4

AggregationRouterV4 与 AggregationRouterV5 差别不大,AggregationRouterV4 中也存在swap函数,实现如下:

Uniswap

可以发现跟 AggregationRouterV5 的swap函数的实现是一样的,只是 AggregationRouterV5 对 call 进行了优化,因此使用和 AggregationRouterV5 一样的方法即可提取出存在 AggregationRouterV4 合约中的代币。

总结

本文简单介绍了部分去中心化交易所以及聚合器,并探讨了其中可能存在的套利,从合约代码层面分析了套利的原理,但在实际中能否成功还和诸多因素相关,如 GAS,节点速度等。


免责声明:本文仅代表作者个人观点,不代表链观CHAINLOOK立场,不承担法律责任。文章及观点也不构成投资意见。请用户理性看待市场风险,以及遵守所在国家和地区的相关法律法规。
图文来源:EoceneResearch,如有侵权请联系删除。转载或引用请注明文章出处!

标签:

分享至
https://www.chainlook.cn/toutiao/1691124961.html

下一篇:

剖析PEPE背后的鲸鱼们,上线几分钟内买入10%代币

资金来自Fixed Float交易所的一组七个钱包共购买了17.7兆的PEPE,成本约为0.34ETH ,现在有550万美元的未实现利润。

免责声明:
链观CHAINLOOK作为区块链技术应用与Web3行业研究的智库媒体,旨在为中国区块链专家、学者们提供最新的行业资讯信息与数据样本,用于区块链技术研究与创新。本站所发布的文章仅代表作者的个人观点,不代表链观CHAINLOOK官方立场,本站所发布的区块链行业研究报告与数据分析成果是通过人工智能算法对数据内容进行分析与归纳生成,不代表任何投资暗示与建议,链观CHAINLOOK不承担法律责任。

风险提示:
虚拟货币不具有法定货币等同的法律地位,参与虚拟货币投资交易存在法律风险,链观CHAINLOOK坚决反对各类代币炒作,请读者提高风险意识,理性看待区块链技术应用及市场风险。

© 链观CHAINLOOK All Rights Reserved. 京ICP备18054193号-5