Transactions

為什麼我不能將 ERC20 代幣從我的錢包存入我部署的合約?

  • March 10, 2022

大家好,我最近開始涉足 Solidity 開發,但在 ERC20 代幣互動方面遇到了麻煩。

我想要完成的是將 ERC20 代幣發送到我創建的智能合約。

pragma solidity ^0.5.0;

contract ERC20 {
   function totalSupply() public view returns (uint supply);
   function balanceOf(address _owner) public view returns (uint balance);
   function transfer(address _to, uint _value) public returns (bool success);
   function transferFrom(address _from, address _to, uint _value) public returns (bool success);
   function approve(address _spender, uint _value) public returns (bool success);
   function allowance(address _owner, address _spender) public view returns (uint remaining);
   function decimals() public view returns(uint digits);
   event Approval(address indexed _owner, address indexed _spender, uint _value);
}

contract MySmartContract {
   function approveDeposit(address tokenAddress) public {
       ERC20 token = ERC20(tokenAddress);
       token.approve(address(this), token.balanceOf(msg.sender));
   }

   function depositToken(address tokenAddress) public {
       ERC20 token = ERC20(tokenAddress);
       uint tokenAmount = token.balanceOf(msg.sender);
       token.transferFrom(msg.sender, address(this), tokenAmount);
   }
}

我的錢包裡有 BAT 代幣。使用 BAT 代幣地址呼叫approveDeposit 函式後,我嘗試呼叫depositToken 但它返回錯誤。

我究竟做錯了什麼?

為了在從合約中的函式執行時成功完成:

token.transferFrom(msg.sender, address(this), tokenAmount);

您需要approve(yourContractAddress, tokenAmount)使用該msg.sender帳戶執行。


但是,當您從合約中的函式執行此操作時:

token.approve(address(this), token.balanceOf(msg.sender));

您正在approve使用您的合約賬戶執行,這意味著您允許其他賬戶從您的合約中轉移代幣。此外,通過this作為第一個參數傳遞,該其他帳戶就是您自己的合約。換句話說,您正在批准您的合約從自己轉移代幣,這當然是沒有用的。

引用自:https://ethereum.stackexchange.com/questions/82817