环球讯息:优雅简洁!在FMZ上用200行代码接入了Uniswap V3(上篇)

2023-01-31 11:55:10 来源: 哔哩哔哩

近些年随着Defi概念的流行,在去中心化金融(DeFi)领域,Uniswap V3是最受关注的话题之一。作为领先的去中心化交换协议,Uniswap V3提供了更高效,更安全,更优秀的用户体验。现在,只需要200行代码,交易员和开发人员就可以在FMZ平台上轻松访问Uniswap V3。


(资料图片仅供参考)

FMZ是一个量化交易平台,支持数量交易策略的开发、回测和实盘部署。其易于使用的界面和强大的功能不难理解为为什么FMZ正在成为DeFi交易员和开发人员的首选。

将Uniswap V3整合到FMZ的过程简单易懂,只需要200行代码即可完成。这意味着,即使您是代码新手,也可以在FMZ上轻松连接Uniswap V3并立即开始交易。

FMZ已经封装了一系列的web3基础功能,除了Uniswap之外也可以用很少的代码封装其它的DEX交易所。接下来就让我带你一起零基础开始学习defi应用中的概念与技术,鉴于篇幅原因,以下描述尽量采用最简单易懂的方式,可能不是十分严谨,但是便于理解。

FMZ平台公开的「Uniswap V3 交易类库」,可以在FMZ的策略广场搜索到这个开源模板。

代码如下:

以太坊网络

以太坊网络可以理解为一个软件基础设施,在这个网络上可以部署运行各种智能合约,智能合约有各种各样的功能、应用场景。运行以太坊客户端的设备就构成了以太坊网络中的节点。

Uniswap V3中的一些概念

不熟悉Uniswap V3协议的同学,这里需要先简单了解几个概念。Uniswap V3也是在以太坊上部署运行的智能合约。

1、路由(Route):路由也是一个智能合约,用于管理token兑换。2、池(Pool):池也是一个智能合约,用于存储两种以太坊代币,并在这两种代币之间进行交换。3、工厂合约(Factory):工厂合约是用来创建池的智能合约。4、ABI:(应用程序二进制接口)是一种规范,用于描述智能合约如何与外部世界互相通信。它指定了智能合约的函数名称,参数类型和返回值类型,以及如何编码和解码数据,并确定了智能合约的外部接口。可以理解为要调用某个接口,就必须按照接口约定的标准调用,而ABI中记录的就是约定的一系列标准。

一旦智能合约在以太坊上部署,就有一个地址。

剖析Uniswap V3 交易类库的代码

Uniswap V3 交易类库代码主要分为4个部分,我们来逐一讲解。

Part 1:与Uniswap V3交互时用到的常量

通过上面的基础概念预热,这里就很容易理解啦。

ABI_Route这个常量储存的字符串就是路由智能合约的ABI。ABI_Pool储存池合约的ABI。ABI_Factory工厂合约的ABI。

由于这些字符串很长,所以只是节选。这些内容就给程序提供了调用智能合约方法的标准(例如这个智能合约接口的参数有什么,几个参数,都是什么类型,返回数据是什么类型等)。

刚才我们也提过,一旦智能合约部署在以太坊,就有一个地址。

ContractV3Factory:记录了工厂合约的地址。ContractV3SwapRouterV2:Uniswap V3的router V2地址,注意Uniswap有V1、V2,Uniswap V3 的router也有V1、V2之分,不同的合约地址是不一样的。

Part2:工具函数

1、computePoolPrice函数用来计算池中token的价格。

假如交易对是ETH_USDT,那么token0ETHtoken1USDTdecimals0就是token0的精度数据,decimals1就是token1的精度数据。sqrtPriceX96就是价格相关数据(并不是直接的价格数值),该数据可以从池合约的slot0方法获取。

sqrtPriceX96 : The current price of the pool as a sqrt(token1/token0) Q64.96 valueQ64.96 是一种数据处理储存标准。

decimals0decimals1, sqrtPriceX96这三个数据作为参数传入computePoolPrice函数即可计算出交易对ETH_USDT的价格。该函数最后return语句中的算法就是把sqrtPriceX96还原成token1/token0的过程。例如此时池里token0(ETH)个数是1个,token1(USDT)个数是1100个。那么1100/1=1100,当前交易对ETH_USDT池中的价格就是1100。

2、toAmount函数用来把链上数值数据转换成可读数据。

简单说,例如一个ETH代币在链上表示数量时是1e18,即10的18次方,因为ETH的精度数据是18。并非所有代币精度都是18,USDT的精度就和ETH的精度不一样。toAmount函数就是将1e18转换成1。

3、toInnerAmount函数则和toAmount相反,是将可读数据转换成链上使用的数值。

本期文章先介绍到这里,我们下期再见。

标签: 开发人员 以及如何

[责任编辑:]

最近更新