優(yōu)雅簡潔!在FMZ上用200行代碼接入了Uniswap V3(上篇)
近些年隨著Defi概念的流行,在去中心化金融(DeFi)領(lǐng)域,Uniswap V3是最受關(guān)注的話題之一。作為領(lǐng)先的去中心化交換協(xié)議,Uniswap V3提供了更高效,更安全,更優(yōu)秀的用戶體驗。現(xiàn)在,只需要200行代碼,交易員和開發(fā)人員就可以在FMZ平臺上輕松訪問Uniswap V3。
FMZ是一個量化交易平臺,支持數(shù)量交易策略的開發(fā)、回測和實盤部署。其易于使用的界面和強大的功能不難理解為為什么FMZ正在成為DeFi交易員和開發(fā)人員的首選。
將Uniswap V3整合到FMZ的過程簡單易懂,只需要200行代碼即可完成。這意味著,即使您是代碼新手,也可以在FMZ上輕松連接Uniswap V3并立即開始交易。
FMZ已經(jīng)封裝了一系列的web3基礎(chǔ)功能,除了Uniswap之外也可以用很少的代碼封裝其它的DEX交易所。接下來就讓我?guī)阋黄鹆慊A(chǔ)開始學習defi應(yīng)用中的概念與技術(shù),鑒于篇幅原因,以下描述盡量采用最簡單易懂的方式,可能不是十分嚴謹,但是便于理解。
FMZ平臺公開的「Uniswap V3 交易類庫」,可以在FMZ的策略廣場搜索到這個開源模板。
代碼如下:
以太坊網(wǎng)絡(luò)
以太坊網(wǎng)絡(luò)可以理解為一個軟件基礎(chǔ)設(shè)施,在這個網(wǎng)絡(luò)上可以部署運行各種智能合約,智能合約有各種各樣的功能、應(yīng)用場景。運行以太坊客戶端的設(shè)備就構(gòu)成了以太坊網(wǎng)絡(luò)中的節(jié)點。
Uniswap V3中的一些概念
不熟悉Uniswap V3
協(xié)議的同學,這里需要先簡單了解幾個概念。Uniswap V3
也是在以太坊上部署運行的智能合約。
1、路由(Route):路由也是一個智能合約,用于管理token
兌換。
2、池(Pool):池也是一個智能合約,用于存儲兩種以太坊代幣,并在這兩種代幣之間進行交換。
3、工廠合約(Factory):工廠合約是用來創(chuàng)建池的智能合約。
4、ABI:(應(yīng)用程序二進制接口)是一種規(guī)范,用于描述智能合約如何與外部世界互相通信。它指定了智能合約的函數(shù)名稱,參數(shù)類型和返回值類型,以及如何編碼和解碼數(shù)據(jù),并確定了智能合約的外部接口??梢岳斫鉃橐{(diào)用某個接口,就必須按照接口約定的標準調(diào)用,而ABI中記錄的就是約定的一系列標準。
一旦智能合約在以太坊上部署,就有一個地址。
剖析Uniswap V3 交易類庫的代碼
Uniswap V3 交易類庫代碼主要分為4個部分,我們來逐一講解。
Part 1:與Uniswap V3交互時用到的常量
通過上面的基礎(chǔ)概念預熱,這里就很容易理解啦。
ABI_Route
這個常量儲存的字符串就是路由智能合約的ABI。ABI_Pool
儲存池合約的ABI。ABI_Factory
工廠合約的ABI。
由于這些字符串很長,所以只是節(jié)選。這些內(nèi)容就給程序提供了調(diào)用智能合約方法的標準(例如這個智能合約接口的參數(shù)有什么,幾個參數(shù),都是什么類型,返回數(shù)據(jù)是什么類型等)。
剛才我們也提過,一旦智能合約部署在以太坊,就有一個地址。
ContractV3Factory
:記錄了工廠合約的地址。ContractV3SwapRouterV2
:Uniswap V3的router V2地址,注意Uniswap有V1、V2,Uniswap V3 的router也有V1、V2之分,不同的合約地址是不一樣的。
Part2:工具函數(shù)
1、computePoolPrice
函數(shù)用來計算池中token的價格。
假如交易對是ETH_USDT
,那么token0
是ETH
,token1
是USDT
。decimals0
就是token0
的精度數(shù)據(jù),decimals1
就是token1
的精度數(shù)據(jù)。sqrtPriceX96
就是價格相關(guān)數(shù)據(jù)(并不是直接的價格數(shù)值),該數(shù)據(jù)可以從池合約的slot0
方法獲取。
sqrtPriceX96 : The current price of the pool as a sqrt(token1/token0) Q64.96 value
Q64.96 是一種數(shù)據(jù)處理儲存標準。
decimals0
,decimals1
,?sqrtPriceX96
這三個數(shù)據(jù)作為參數(shù)傳入computePoolPrice
函數(shù)即可計算出交易對ETH_USDT
的價格。該函數(shù)最后return
語句中的算法就是把sqrtPriceX96
還原成token1/token0
的過程。例如此時池里token0(ETH)個數(shù)是1個,token1(USDT)個數(shù)是1100個。那么1100/1=1100
,當前交易對ETH_USDT
池中的價格就是1100。
2、toAmount
函數(shù)用來把鏈上數(shù)值數(shù)據(jù)轉(zhuǎn)換成可讀數(shù)據(jù)。
簡單說,例如一個ETH代幣在鏈上表示數(shù)量時是1e18,即10的18次方,因為ETH的精度數(shù)據(jù)是18。并非所有代幣精度都是18,USDT的精度就和ETH的精度不一樣。toAmount
函數(shù)就是將1e18轉(zhuǎn)換成1。
3、toInnerAmount
函數(shù)則和toAmount
相反,是將可讀數(shù)據(jù)轉(zhuǎn)換成鏈上使用的數(shù)值。
本期文章先介紹到這里,我們下期再見。