0

在我的合同中,我尝试使用 Uniswap 的swapExactETHForTokens()功能将 Eth 换成 Dai:

pragma solidity ^0.6.6;

interface IUniswap {
  function swapExactETHForTokens(
    uint amountOutMin,
    address[] calldata path,
    address to,
    uint deadline)
  external
  payable
  returns (uint[] memory amounts);
  function WETH() external pure returns (address);
}

contract MyContract {
  IUniswap uniswap;

  constructor(address _uniswap) public {
    uniswap = IUniswap(_uniswap);
  }

  function swapExactETHForTokens(uint amountOutMin, address token) external {
    address[] memory path = new address[](2);
    path[0] = uniswap.WETH();
    path[1] = token;
    uniswap.swapExactETHForTokens{value: msg.value}(
      amountOutMin, 
      path,
      msg.sender, 
      now
    );
  }
}

但是在这条线上swapExactETHForTokens()

uniswap.swapExactETHForTokens{value: msg.value}(

Remix IDE 显示以下错误:

contracts/MyContract.sol:26:42: TypeError: "msg.value" and "callvalue()" can only be used in payable public functions. Make the function "payable" or use an internal function to avoid this error.
    uniswap.swapExactETHForTokens{value: msg.value}(
                                         ^-------^

我很困惑,因为在顶部我已经swapExactETHForTokens()在 IUniswap 界面中声明了应付账款。

此错误的搜索结果显示为空白,所以我认为在这里询问会很好。我怎样才能解决这个问题?

4

1 回答 1

2

我意识到我的错误:我需要将payable关键字添加到我自己的实现中swapExactETHForTokens(),如下所示:

  function swapExactETHForTokens(uint amountOutMin, address token) external payable { // payable keyword here
    address[] memory path = new address[](2);
    path[0] = uniswap.WETH();
    path[1] = token;
    uniswap.swapExactETHForTokens{value: msg.value}(
      amountOutMin, 
      path,
      msg.sender, 
      now
    );
  }
于 2022-02-05T19:11:22.707 回答