Erc-20
ERC20 代幣轉移失敗
我正在努力轉移我自己的 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)
並且花費者必須是您的合約地址