微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用智能合约功能从 Uniswap 获取对价格

如何解决使用智能合约功能从 Uniswap 获取对价格

我对 solidity 比较陌生,我试图通过以下合同获取一对价格:

contract Uniswap {


    constructor () public payable {
    }
   
    function getBalance() public view returns (uint) {
        return address(this).balance;    
    }
   
   
   // calculate price based on pair reserves
   function getTokenPrice(address pairAddress,uint amount) public payable 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
   }
   
}

但是当我尝试在 Remix 上运行时,getTokenPrice它会返回以下错误消息:

The transaction has been reverted to the initial state. Note: The called function should be payable if you send value and the value you send should be less than your current balance. Debug the transaction to get more information.

知道为什么吗?我正在尝试获取 ETH/USDT 的价格,因此使用此网站 (https://v2.info.uniswap.org/pair/0x0d4a11d5eeaac28ec3f61d100daf4d40471f1852) 并在 URL 末尾使用配对地址。感谢您的帮助!

解决方法

当您在 Remix 中部署合约时,它会部署到本地网络。 (默认情况下。例如,如果您注入生产 Infura 提供程序,您也可以更改它并部署到主网。)

Uniswap 配对合约 0x0d4a11... 在本地网络上不存在。


最简单的解决方案是在主网上部署您的合约(其中存在 0x0d4a11... Uniswap 对合约)。

或者您可以在公共测试网上找到另一个 Uniswap 对(众所周知的有 Rinkeby、Ropsten、Goerli 和 Kovan),并将您的合约部署在同一个测试网上。不要忘记更改传递给 getTokenPrice() 函数的 uniswap 对的测试网地址。

或者您可以部署 Uniswap 对合约及其所有依赖项并更改依赖项地址(这是很多工作 - 我的猜测是它依赖于 Uniswap 路由器合约,该对的实际令牌合约,也许它们依赖于其他一些合同,...)到您的本地网络。从这里开始是相同的 - 将您的合约部署到本地网络,并使用正确的配对地址调用 getTokenPrice()

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。