[英]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
而不是signer
, getAmountsOut()
将使用挂钩块正确获取 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.