【问题标题】:Uniswap pair = address(uint(keccak256(abi.encodePacked() ErrorUniswap 对 = address(uint(keccak256(abi.encodePacked() 错误
【发布时间】:2022-11-12 12:49:27
【问题描述】:

我不明白为什么当我尝试编译我的合约以交换不同 dex 上的代币时会出现此错误。

这里的代码:

//SPDX-License-Identifier: MIT

import "./Interfaces/IUniswapV2Router02.sol";
import "./Interfaces/IUniswapV2Factory.sol";
//import "./Interfaces/IUniswapV2Pair.sol";
import "./Interfaces/IERC20.sol";
import "./Interfaces/UniswapV2Library.sol";
//import "./Interfaces/IUniswapV2Callee.sol";


pragma solidity >0.5.0 < 0.9.0;

contract SwappingDex{

    address public constant uniswapRouter = 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D;
    address public constant uniswapFactory = 0x5C69bEe701ef814a2B6a3EDD4B1652CB9cc5aA6f;
    address public constant sushiSwapRouter = 0xd9e1cE17f2641f24aE83637ab66a2cca9C378B9F;
    address public constant sushiSwapFactory = 0xC0AEe478e3658e2610c5F7A4A2E1777cE9e4f2Ac;
    address public constant WETH = 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2;


    function swappingIn2DEX(address tokenIn, address tokenOut, uint amount, address to)external payable{

        address pairOnUniswap;
        address pairOnSushi;
        pairOnUniswap = IUniswapV2Factory(uniswapFactory).getPair(tokenIn, tokenOut);
        pairOnSushi = IUniswapV2Factory(sushiSwapFactory).getPair(tokenIn, tokenOut);

        require(
            pairOnSushi != 0x0000000000000000000000000000000000000000 &&
            pairOnUniswap != 0x0000000000000000000000000000000000000000,
            "No Pair"
        );

        address[] memory path;
        path = new address[](2);
        path[0] = tokenIn;
        path[1] = tokenOut;

        uint[]memory amountOutUniswap = IUniswapV2Router02(uniswapRouter).getAmountsOut(amount, path);


        IERC20(tokenIn).transferFrom(msg.sender, address(this), amount);
        IERC20(tokenIn).approve(uniswapRouter, amount);

        IUniswapV2Router02(uniswapRouter).swapETHForExactTokens{value: msg.value}(
            amountOutUniswap[1],
            path,
            to,
            block.timestamp
        );
}

安全帽.config.js


require("@nomiclabs/hardhat-waffle");
require("@nomiclabs/hardhat-ethers");
require("dotenv").config();


module.exports = {
  solidity: "0.8.4",

  networks: {
    hardhat: {
      forking:{
        url: "*******",
      },
    },
  }
};

一旦我去编译,通过 npx hardhat 编译,我得到这个错误:

类型错误:不允许从“uint256”到“地址”的显式类型转换。 --> 合同/接口/UniswapV2Library.sol:20:16: | 20 |对=地址(uint(keccak256(abi.encodePacked( | ^(相关源代码部分从这里开始并跨越多行)。

我正在寻找一些关于它的原因,我看到一些关于在 ^0.8.0 版本之后地址转换的内容。 我已经用相同的步骤在 uniswap 上做了项目,但这是我第一次遇到这个错误。 有人可以解释我为什么吗? 非常感谢!

【问题讨论】:

    标签: blockchain ethereum solidity hardhat uniswap


    【解决方案1】:

    这是UniswapV2Library.sol github repo。代码抱怨这个

    function pairFor(address factory, address tokenA, address tokenB) internal pure returns (address pair) {
            (address token0, address token1) = sortTokens(tokenA, tokenB);
            pair = address(uint(keccak256(abi.encodePacked(
                    hex'ff',
                    factory,
                    keccak256(abi.encodePacked(token0, token1)),
                    hex'96e8ac4277198ff8b6f785478aa9a39f403cb768dd02cbee326c3e7da348845f' // init code hash
                ))));
        }
    

    您需要应用 UNiswap repo 的设置。该仓库正在使用ethereum-waffle.readthedocs,如果您检查项目根目录中的.waffle.json 配置,您会看到以下设置:

    {
      "compilerVersion": "./node_modules/solc",
      "outputType": "all",
      "compilerOptions": {
        "outputSelection": {
          "*": {
            "*": [
              "evm.bytecode.object",
              "evm.deployedBytecode.object",
              "abi",
              "evm.bytecode.sourceMap",
              "evm.deployedBytecode.sourceMap",
              "metadata"
            ],
            "": ["ast"]
          }
        },
        "evmVersion": "istanbul",
        "optimizer": {
          "enabled": true,
          "runs": 999999
        }
      }
    }
    

    UniswapV3 也有类似的问题,我问了a question here and then answered。我使用安全帽,并应用了 UniswapV3 存储库中的这些设置。

    const DEFAULT_COMPILER_SETTINGS = {
      version: '0.7.6',
      settings: {
        evmVersion: 'istanbul',
        optimizer: {
          enabled: true,
          runs: 1_000_000,
        },
        metadata: {
          bytecodeHash: 'none',
        },
      },
    }
    

    我认为主要原因是使用evmVersion: 'istanbul',

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-09-22
      • 1970-01-01
      • 2022-10-06
      • 2021-05-08
      • 2023-03-13
      • 1970-01-01
      • 2021-07-28
      • 1970-01-01
      相关资源
      最近更新 更多