Получить цену пары из 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, getTokenPriceit возвращает мне следующее сообщение об ошибке:

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-адреса. Спасибо за помощь!


person Viktor.w    schedule 06.05.2021    source источник
comment
@PetrHejda Я сейчас на ремиксе, подключен к Goerli. Я попробую развернуть в сети Goerli и попробовать оттуда.   -  person Viktor.w    schedule 06.05.2021
comment
Извините, я удалил свой комментарий, потому что сначала я подумал, что неправильно понял ваш вопрос. Я предположил, что вы находитесь в локальной сети, и впоследствии удалил отзыв. Но и на Goerli это не сработает - прочтите ответ, пара Uniswap также не существует по тому же адресу на Goerli.   -  person Petr Hejda    schedule 06.05.2021


Ответы (1)


Когда вы развертываете контракт в Remix, он развертывается в локальной сети. (По умолчанию. Вы можете изменить его и развернуть в основной сети, например, если вы внедрите производственный поставщик Infura.)

Контракт пары Uniswap 0x0d4a11... не существует в локальной сети.


Самое простое решение - развернуть ваш контракт в основной сети (где существует парный контракт 0x0d4a11... Uniswap).

Или вы можете найти другую пару Uniswap в общедоступной тестовой сети (широко известные - Rinkeby, Ropsten, Goerli и Kovan) и развернуть свой контракт в той же тестовой сети. Не забудьте изменить адрес тестовой сети для пары uniswap, которую вы передаете своей getTokenPrice() функции.

Или вы можете развернуть контракт пары Uniswap и все его зависимости и изменить адреса зависимостей (что представляет собой большую работу - я предполагаю, что он зависит от контракта маршрутизатора Uniswap, фактических контрактов токенов пары, возможно, они зависят от по другому контракту, ...) в вашу локальную сеть. Отсюда то же самое - разверните свой контракт в локальной сети и вызовите getTokenPrice() с правильным парным адресом.

person Petr Hejda    schedule 06.05.2021