Solidity Uniswap:获取代币价格

时间:2021-05-06 09:46:50

标签: solidity

我想在 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); ^-----------------^

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

1 个答案:

答案 0 :(得分:0)

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

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

但是当外部契约(比如你的)使用接口调用函数时,它需要完全遵循它。


所以你可以简单地替换

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

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