Contract-Development

ERC223 令牌在使用 transfer() 函式中的數據欄位時不傳輸

  • February 5, 2019

輸出顯示的是內部交易或只是合約互動,而不是顯示代幣。將代幣轉移到任何其他 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,您必須自己檢查契約狀態以確認預期效果。

希望能幫助到你。

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