Solidity Uniswap:获取代币价格

Solidity Uniswap: get token price

我正在尝试获取 UniswapV2 上一对的价格: 这是我的代码:

pragma solidity ^0.5.1;

import '@uniswap/v2-core/contracts/interfaces/IUniswapV2Pair.sol';
import './IERC20.sol';


contract Uniswap {

   // calculate price based on pair reserves
   function getTokenPrice(address pairAddress, uint amount) public view returns(uint)
   {
    IUniswapV2Pair pair = IUniswapV2Pair(pairAddress);
    IERC20 token1 = IERC20(pair.token1);
    (uint Res0, uint Res1,) = pair.getReserves();

    // decimals
    uint res0 = Res0*(10**token1.decimals());
    return((amount*res0)/Res1); // return amount of token0 needed to buy token1
   }
    
}

我手动导入了openzeppelin IERC20接口,编译器版本为0.5.1,因为uniswap v2外围目前的版本是0.5.1

但是 IERC20 token1 = IERC20(pair.token1); 行出现以下错误:

Explicit type conversion not allowed from "function () view external returns (address)" to "contract IERC20". IERC20 token1 = IERC20(pair.token1); ^-----------------^

知道如何解决这个问题吗?谢谢!

IUniswapV2Pair 接口 defines 一个 token1() 函数 - 不是 token1 属性.

他们的 contract 然后使用了这样一个事实,即 属性 的签名与函数的签名相同,因此它不需要实现函数(只要它有 public 属性 同名)。

但是当外部合约(比如你的)使用接口调用函数时,需要严格按照它来执行。


所以你可以简单地替换

IERC20 token1 = IERC20(pair.token1); // original code

IERC20 token1 = IERC20(pair.token1()); // function `token1()`