Exchanges
使用 Web3 獲取任意 Token 的 Uniswap 匯率
我需要使用 Web3 獲取 Uniswap 上每個代幣的匯率,例如 Uniswap 本身,然後它們會顯示在app.uniswap.org上的 Web 界面上,如下所示:
因此,當我輸入交換我想要提供的代幣數量(本例中為 1 ETH)時,它會顯示我將收到的估計代幣數量(本例中為 1691.53 DAI)
我試過的
我想直接從區塊鏈獲取資訊,不想使用 API,因為我需要盡可能保持最新的價格,所以我想在 Uniswap 的一個智能合約中搜尋一個函式,但只找到了一個函式呼叫 quote() 但我對此無能為力。
-> 如果有人可以幫助我,請為我提供一些程式碼範例,說明如何做到這一點。
另外我需要知道我是否了解 Uniswap 的概念……為了能夠將一個代幣換成另一個代幣,我想要交換的這對確切的一對必須已經有一個池,對嗎?
您首先需要您想要訪問其價格的貨幣對的合約地址。
有兩種方法可以做到這一點:
- 分別找到兩個token的地址,並將它們輸入到
UniswapV2Factory
合約中,得到pair的合約地址;或者…- 轉到 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)。