ERC20 索赔令牌转移功能不起作用



我有这个合约,并试图调用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