在我的合同中,我试图使用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}(混合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接口中是可支付的。
这个错误的搜索结果是空白的,所以我想在这里问是好的。我怎么才能解决这个问题?
发布于 2022-02-05 19:11:22
我意识到了自己的错误:我需要将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
);
}https://stackoverflow.com/questions/71001299
复制相似问题