【问题标题】:Smart contract to send ERC20 token from one address to another将 ERC20 代币从一个地址发送到另一个地址的智能合约
【发布时间】:2021-12-29 06:52:49
【问题描述】:

我正在尝试实现一个 Solidity 智能合约,它将部署的代币从地址 A 发送到地址 B。

地址 A - 应该是调用合约函数“stake”的当前用户。 地址 B - 应该是来自外部的自定义钱包地址。

import "https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC20/IERC20.sol";

contract TokenTransfer {
    IERC20 _token;

    constructor(address token) public {
        _token = IERC20(token);
    }

    function stake(address to, uint amount) public {
        _token.approve(address(this), amount);
        require(_token.allowance(msg.sender, address(this)) >= amount, "Token allowance too low");
        bool sent = _token.transferFrom(msg.sender, to, amount);
        require(sent, "Token transfer failed");
    }
}

当前实施返回限额错误: “代币额度太低”

我正在使用 MetaMask(注入 web3)运行它。我希望 MetaMask 用我的令牌打开一个简单的传输窗口。

【问题讨论】:

    标签: blockchain solidity erc20


    【解决方案1】:

    为了从你的合约中使用transferFrom(),代币持有者需要直接从他们的地址approve()消费者(你的合约)。不是通过你的合同。


    _token.approve(address(this), amount);
    

    这个 sn-p 批准 TokenTransfer (address(this)) 使用 TokenTransfer 的(approve() 函数调用者)令牌,因为该函数是从 TokenTransfer 的地址有效调用的。

    这就是require() 条件失败的原因。代币持有者 (msg.sender) 尚未批准您的合约 (address(this)) 来使用他们的代币。如果您将条件替换为_token.allowance(address(this), address(this)),那么它将通过(参见上一段)。

    【讨论】:

      【解决方案2】:

      调用该方法的质押者需要自己调用approve。这是因为approve 允许将令牌从msg.sender 转移到另一个地址,如下所示:

      approve(address spender, uint256 amount)
      

      approve 调用中的msg.sender 和您的代码一样,是TokenTransfer 合约本身,它调用_tokenallowance 方法。

      这意味着,在approve 调用期间,TokenTransfer 合约不是为TokenTransfer 合约提供津贴,而不是TokenTransfer 合约为自己提供津贴。

      除此之外,我通常还建议使用increaseAllowancedecreaseAllowance 来为地址提供津贴。有关详细信息,请参阅IERC20approve 问题https://docs.openzeppelin.com/contracts/4.x/api/token/erc20

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-09-23
        • 2021-04-26
        • 1970-01-01
        • 2020-07-24
        • 2021-09-17
        • 2018-09-24
        • 2018-09-16
        • 1970-01-01
        相关资源
        最近更新 更多