我有这个合约,并试图调用claimFreeToken函数。合约已经没有足够的令牌,但函数没有返回错误,也没有收到令牌。我在哪里忽略了它?
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import "@openzeppelin/contracts/token/ERC20/ERC20.sol";
contract TestToken is ERC20 {
constructor(uint256 initialSupply) ERC20("Test Token", "TET") {
_mint(msg.sender, initialSupply * (10**decimals()));
}
function claimFreeToken() public payable {
transfer(msg.sender, 1000 * (10**decimals()));
}
}
您的实现使令牌在申请时从您的钱包转移到您的钱包,而不是从合同中转移。
ERC20中的transfer
函数将从msg.sender
发送到指定的地址。因此,在这种情况下,您将从msg.sender
转移到msg.sender
。
正确的实现应该是这样的,
function claimFreeToken() public payable {
_transfer(address(this), msg.sender, 1000 * (10**decimals()));
}
阅读更多:https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC20/ERC20.sol#L113