ERC223 令牌在使用 transfer() 函式中的數據欄位時不傳輸
輸出顯示的是內部交易或只是合約互動,而不是顯示代幣。將代幣轉移到任何其他 ERC223 接收者合約需要進行哪些更改?
function transfer(address _to, uint256 _value)public returns (bool success){ if(isContract(_to)){ return transferToContract(_to, _value, "0x0"); } else{ return transferToAddress(_to,_value, "0x0"); } } function transfer(address _to, uint256 _value, bytes memory _data)public returns(bool success){ if(isContract(_to)){ return transferToContract(_to, _value, "0x0"); } else{ return transferToAddress(_to, _value, "0x0"); } } function isContract(address _addr) public view returns (bool is_contract) { uint length; assembly { length := extcodesize(_addr) } return (length>0); } function transferToAddress(address _to, uint256 _value, bytes memory _data) public returns(bool success){ require(balanceOf(msg.sender) > _value ); balances[msg.sender] = balances[msg.sender].sub(_value); balances[_to] = balances[_to].add(_value); emit Transfer(msg.sender, _to, _value, _data); return true; } function transferToContract(address _to, uint256 _value, bytes memory _data) public returns(bool success){ require(balanceOf(msg.sender) > _value ); balances[msg.sender] = balances[msg.sender].sub(_value); balances[_to] = balances[_to].add(_value); ERC223ReceivingContract erc223Object = ERC223ReceivingContract(_to); erc223Object.tokenFallback(msg.sender, _value, _data); emit Transfer(msg.sender, _to, _value, _data); return true; }
接收方契約可靠性文件有問題嗎?這是我的 Receiver Contract 文件的程式碼。
contract ContractReceiver { address public sender; uint256 public value; bytes public data; function tokenFallback(address _to, uint256 _value, bytes memory _data) public { sender = _to; value = _value; data = _data; } }
這不是 ERC223 合約。
ERC223 是一個介面定義,因此根據定義,您必須使用介面中定義的函式簽名才能成為 ERC223。
看看這裡:https ://github.com/Dexaran/ERC223-token-standard/blob/master/token/ERC223/ERC223_interface.sol
參考界面設計:
contract ERC223Interface { uint public totalSupply; function balanceOf(address who) constant returns (uint); function transfer(address to, uint value); function transfer(address to, uint value, bytes data); event Transfer(address indexed from, address indexed to, uint value, bytes data); }
而不是
transferToAddress
並且transferToContract
只有transfer
兩個函式簽名。執行時,EVM 將根據輸入的數量選擇適當的函式,如果確實存在bytes data
.在實現第二個版本方面,期望(實際上是必需的)呼叫接收合約的
tokenFallback
函式。這是用於接收方的接收後處理(響應接收到的令牌的操作)。你transferToContract
似乎會這樣做。我不確定你的意思是:
輸出顯示的是內部交易或只是合約互動,而不是顯示代幣
預期的行為是交易收據。結果應該是轉移到接收者的令牌加上接收者
tokenFallback
函式中發生的任何事情。除了交易收據,不要期望節點有任何進一步的輸出。此類交易在這方面並不特殊。您在探索鏈條時看到的內容會因您使用的工具而異。有些,如 Etherscan,將列舉內部事務。那就是解釋。您很可能看不到代幣轉移,因為您使用的區塊瀏覽器不了解您的合約的非標準函式簽名。您需要使用符合標準的函式簽名來解決這個問題。
例如,您會看到從代幣合約到接收合約
tokenFallback
功能的內部交易,但不一定有任何進一步的細節。您應該能夠看到接收合約的餘額增加和發送者的餘額減少,
balanceOf(<address>)
並且如果接收合約的tokenFallback
函式發出事件(可能應該),那麼也是如此。由於接收契約的功能可以/應該做什麼沒有標准或限制
tokenFallback
,您必須自己檢查契約狀態以確認預期效果。希望能幫助到你。