Erc-20

ERC20 代幣轉移失敗

  • October 27, 2021

我正在努力轉移我自己的 ERC20 代幣。

我得到以下程式碼:

contract AccountingToken is ERC20, ERC20Detailed {
constructor () public ERC20Detailed("AccountingToken", "MAC", 18) {
       _mint(msg.sender, 10000 * (10 ** uint256(decimals())));
   }
}

contract Accounting{
AccountingToken instance=AccountingToken(0x000...);

function get_balance()public view returns(uint){
       uint balance;
       balance=instance.balanceOf(msg.sender);
       return balance;
   }
function transfer_to_contract(uint tokens)public{
       address receiver=0x..receiver_address;
       instance.transfer(receiver,tokens);
}
}

執行 get_balance() 函式會給我正確的金額。

但是執行 transfer() 函式總是以 JSON-RPC 錯誤結束。

我究竟做錯了什麼?

謝謝!

發現問題… 嘗試從沒有獲得令牌數量的合約中匯款。所以這是一個粗心的錯誤……

您的功能的工作方式:

function transfer_to_contract(uint tokens)public{
       address receiver=0x..receiver_address;
       instance.transfer(receiver,tokens);
}

是不是在後台instance.transfer呼叫另一個函式:

_transfer(msg.sender, recipient, amount);

而且由於您transfer從契約中呼叫了 msg.sender 不是被address呼叫transfer_to_contract的,而是您的契約的地址。所以基本上你正在嘗試將一些代幣從你的合約發送到你的地址。這就是它失敗的方式。

為了做你想做的事,你必須使用函式transferFrom(address sender, address recipient, uint256 amount)而不是transfer(address recipient, uint256 amount).

然後它看起來像這樣:

function transfer_to_contract(uint tokens)public{
       address receiver=0x..receiver_address;
       instance.transferFrom(msg.sender, receiver, tokens);
}

注意:為了通過發送者首先必須批准他要發送的代幣數量,approve(address spender, uint256 amount)並且花費者必須是您的合約地址

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