Exchanges

使用 Web3 獲取任意 Token 的 Uniswap 匯率

  • August 2, 2021

我需要使用 Web3 獲取 Uniswap 上每個代幣的匯率,例如 Uniswap 本身,然後它們會顯示在app.uniswap.org上的 Web 界面上,如下所示:

在此處輸入圖像描述

因此,當我輸入交換我想要提供的代幣數量(本例中為 1 ETH)時,它會顯示我將收到的估計代幣數量(本例中為 1691.53 DAI)

我試過的

我想直接從區塊鏈獲取資訊,不想使用 API,因為我需要盡可能保持最新的價格,所以我想在 Uniswap 的一個智能合約中搜尋一個函式,但只找到了一個函式呼叫 quote() 但我對此無能為力。

-> 如果有人可以幫助我,請為我提供一些程式碼範例,說明如何做到這一點。

另外我需要知道我是否了解 Uniswap 的概念……為了能夠將一個代幣換成另一個代幣,我想要交換的這對確切的一對必須已經有一個池,對嗎?

您首先需要您想要訪問其價格的貨幣對的合約地址。

有兩種方法可以做到這一點:

  1. 分別找到兩個token的地址,並將它們輸入到UniswapV2Factory合約中,得到pair的合約地址;或者…
  2. 轉到 Uniswap,將兩個代幣輸入到通常的界面,然後訪問“查看對分析”頁面,頁面底部將是他們的合約地址和指向 Etherscan 的連結。

一旦您知道該貨幣對的合約地址,您就可以直接通過 Web3 訪問價格。在該貨幣對的合約內 - 類型UniswapV2Pair- 有以下變數:

...
address public factory;
address public token0;
address public token1;

uint112 private reserve0;           // uses single storage slot, accessible via getReserves
uint112 private reserve1;           // uses single storage slot, accessible via getReserves
uint32  private blockTimestampLast; // uses single storage slot, accessible via getReserves

uint public price0CumulativeLast;
uint public price1CumulativeLast;
...

最後兩個代表代幣價格(有點……見下文)。它們是公開的,因此 getter 函式將自動可用。

然而……這並不是故事的結局。

合約中的價格是累計價格,而不是最後的現貨價格。這意味著您必須做一些數學運算才能使這些值有用。

Uniswap Oracles 頁面詳細介紹瞭如何計算適合您需求的時間加權平均價格(TWAP)。

引用自:https://ethereum.stackexchange.com/questions/94384