簡體   English   中英

將 ERC20 代幣從一個地址發送到另一個地址的智能合約

[英]Smart contract to send ERC20 token from one address to another

我正在嘗試實現一個 Solidity 智能合約,它將部署的令牌從地址 A 發送到地址 B。

地址 A - 應該是調用合約 function “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 用我的令牌打開一個簡單的轉賬 window。

為了從您的合約中使用transferFrom() ,代幣持有者需要直接從他們的地址approve()支出者(您的合約)。 不是通過你的合同。


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

此代碼段批准TokenTransfer ( address(this) ) 使用TokenTransfer的 ( approve() function 調用程序) 令牌,因為 function 是從TokenTransfer的地址有效調用的。

這就是require()條件失敗的原因。 代幣持有者 ( msg.sender ) 尚未批准您的合約 ( address(this) ) 來使用他們的代幣。 如果您將條件替換為_token.allowance(address(this), address(this)) ,那么它將通過(參見上一段)。

調用該方法的質押者需要自己調用approve 這是因為approve允許從msg.sender到另一個地址的令牌,如下所示:

approve(address spender, uint256 amount)

與您的代碼一樣,approval 調用中的msg.senderTokenTransfer合約本身,它調用_tokenallowance方法。

這意味着,由於在approve調用期間他們不是msg.sender ,所以TokenTransfer合約不是為TokenTransfer合約提供津貼,而是為自己提供津貼。

除此之外,我通常還建議使用increaseAllowancedecreaseAllowance來為地址提供津貼。 有關更多信息,請參閱 https : //docs.openzeppelin.com/contracts/4.x/api/token/erc20 上的IERC20 approve問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM