繁体   English   中英

Uniswap 方法 getAmountsOut() 在使用 Hardhat mai.net fork 时返回错误值

[英]Uniswap method getAmountsOut() returns wrong value when using Hardhat mainnet fork

在我的安全帽测试中,我使用 Uniswap 的getAmountsOut获取以美元为单位的 ETH 价格(使用 DAI)。 它目前以正确的 ETH 价格返回 2766 美元。 这是我成功获取价格的测试:

require('dotenv').config()
const { ethers } = require("hardhat");

const UNISWAPV2_ROUTER02_ADDRESS = "0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D";
const UNISWAPV2_ROUTER02_ABI = [{ "inputs": [{ "internalType": "uint256", "name": "amountIn", "type": "uint256" }, { "internalType": "address[]", "name": "path", "type": "address[]" }], "name": "getAmountsOut", "outputs": [{ "internalType": "uint256[]", "name": "amounts", "type": "uint256[]" }], "stateMutability": "view", "type": "function" }]

const DAI_ADDRESS = "0x6b175474e89094c44da98b954eedeac495271d0f";
const WETH_ADDRESS = "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2";

describe("eth-price-test", function () {
    it("Test fetch Eth price", async function () {
        const provider = new ethers.providers.WebSocketProvider(process.env.INFURA_WEB_SOCKET)
        const wallet = new ethers.Wallet(process.env.ETH_PRIVATE_KEY, provider)
        const signer = wallet.provider.getSigner(wallet.address)
        let uniswap = new ethers.Contract(
            UNISWAPV2_ROUTER02_ADDRESS,
            UNISWAPV2_ROUTER02_ABI,
            signer,
        );

        const amountEth = await uniswap.getAmountsOut(
            1,
            [WETH_ADDRESS, DAI_ADDRESS]
        )

        console.log(`1 Eth = ${amountEth[1].toString()} USD`)
    });
});

但是,当我使用连接到 Hardhat 的 mai.net 分支的签名器时,返回的价格是 3993 美元,要高得多。 我得到这样的签名者:

signer = ethers.provider.getSigner(process.env.ETH_PUBLIC_KEY)
let uniswap = new ethers.Contract(
  UNISWAPV2_ROUTER02_ADDRESS,
  UNISWAPV2_ROUTER02_ABI,
  signer,
);

这是我的 hardhat.config.js 的相关部分以供参考:

module.exports = {
  solidity: "0.5.0",
  networks: {
    hardhat: {
      forking: {
        url: process.env.ALCHEMY_URL
      }
    }
  }
};

知道为什么会有巨大的价格差异吗? 即使我将 mai.net 叉子挂到不同的区块,它总是返回 3993 美元......

提前致谢!

我找到了修复方法! 通过在部署 Uniswap 合约时使用ethers.provider而不是signergetAmountsOut()将使用挂钩块正确获取 Eth 的价格。

let uniswap = new ethers.Contract(
  UNISWAPV2_ROUTER02_ADDRESS,
  UNISWAPV2_ROUTER02_ABI,
  ethers.provider // using provider instead of signer here
);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM