簡體   English   中英

ERC 223令牌標准不起作用

[英]ERC 223 Token Standard is not Working

我正在嘗試使用ERC223標准創建一個新令牌。 創建了令牌,但是當我嘗試將令牌轉移到其他錢包時,創建了交易哈希,交易失敗。 代幣將從我的錢包中扣除,而不添加到目標錢包中。

這是我的交易哈希: https : //ropsten.etherscan.io/tx/0x04dbea66944a5fdaca45a56be68f98c475aff17ff4de74cb068e3277b38dc5c8][1]

這是我的令牌智能合約代碼:

pragma solidity ^0.4.9;

contract ContractReceiver {

struct TKN {

    address sender;
    uint value;
    bytes data;
    bytes4 sig;
}


function tokenFallback(address _from, uint _value, bytes _data) public pure {

  TKN memory tkn;

  tkn.sender = _from;

  tkn.value = _value;

  tkn.data = _data;

  uint32 u = uint32(_data[3]) + (uint32(_data[2]) << 8) + (uint32(_data[1]) << 16) + (uint32(_data[0]) << 24);

  tkn.sig = bytes4(u);

}

}

contract ERC223 {

uint public totalSupply;

function balanceOf(address who) public view returns (uint);

function name() public view returns (string _name);

function symbol() public view returns (string _symbol);

function decimals() public view returns (uint8 _decimals);

function totalSupply() public view returns (uint256 _supply);

function transfer(address to, uint value) public returns (bool ok);

function transfer(address to, uint value, bytes data) public returns (bool ok);

function transfer(address to, uint value, bytes data, string custom_fallback) public returns (bool ok);


event Transfer(address indexed from, address indexed to, uint value, bytes indexed data);

}

contract SafeMath {

uint256 constant public MAX_UINT256 =
0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF;

function safeAdd(uint256 x, uint256 y) pure internal returns (uint256 z) {

    if (x > MAX_UINT256 - y) revert();

    return x + y;

}

function safeSub(uint256 x, uint256 y) pure internal returns (uint256 z) {

    if (x < y) revert();

    return x - y;

}

function safeMul(uint256 x, uint256 y) pure internal returns (uint256 z) {

    if (y == 0) return 0;

    if (x > MAX_UINT256 / y) revert();

    return x * y;

}

}

contract ERC223Token is ERC223, SafeMath {

mapping(address => uint) balances;

string public name;

string public symbol ;

uint8 public decimals;

uint public totalSupply;

function ERC223Token(){

balances[msg.sender] = 10000;

totalSupply = 10000;

name = "My Token";

symbol = "TKN";

}

function name() public view returns (string _name) {

return name;

}

function symbol() public view returns (string _symbol) {

return symbol;

}

function decimals() public view returns (uint8 _decimals) {

return decimals;

}

function totalSupply() public view returns (uint256 _totalSupply) {

return totalSupply;

}

function transfer(address _to, uint _value, bytes _data, string _custom_fallback) public returns (bool success) {

if(isContract(_to)) {

if (balanceOf(msg.sender) < _value) revert();

balances[msg.sender] = safeSub(balanceOf(msg.sender), _value);

balances[_to] = safeAdd(balanceOf(_to), _value);

assert(_to.call.value(0)(bytes4(keccak256(_custom_fallback)), msg.sender, _value, _data));

Transfer(msg.sender, _to, _value, _data);

return true;

}else {

return transferToAddress(_to, _value, _data);

}

}

function transfer(address _to, uint _value, bytes _data) public returns (bool success) {

if(isContract(_to)) {

return transferToContract(_to, _value, _data);

}else {

return transferToAddress(_to, _value, _data);

}

}

function transfer(address _to, uint _value) public returns (bool success) {

bytes memory empty;

if(isContract(_to)) {

    return transferToContract(_to, _value, empty);

}else {

    return transferToAddress(_to, _value, empty);

}

}

function isContract(address _addr) private view returns (bool is_contract) {

uint length;

assembly {

//retrieve the size of the code on target address, this needs assembly

length := extcodesize(_addr)

}

return (length>0);

}

function transferToAddress(address _to, uint _value, bytes _data) private returns (bool success) {

if (balanceOf(msg.sender) < _value) revert();

balances[msg.sender] = safeSub(balanceOf(msg.sender), _value);

balances[_to] = safeAdd(balanceOf(_to), _value);

Transfer(msg.sender, _to, _value, _data);

return true;

}

function transferToContract(address _to, uint _value, bytes _data) private returns (bool success) {

if (balanceOf(msg.sender) < _value) revert();

balances[msg.sender] = safeSub(balanceOf(msg.sender), _value);

balances[_to] = safeAdd(balanceOf(_to), _value);

ContractReceiver receiver = ContractReceiver(_to);

receiver.tokenFallback(msg.sender, _value, _data);

Transfer(msg.sender, _to, _value, _data);

return true;

}

function balanceOf(address _owner) public view returns (uint balance) {

return balances[_owner];

}

}

將0xc0ee0b8a放在_data參數中。

啟用ERC223transfer的_data參數(字節指針地址)的隱式聲明為

bytes public funcSig = hex"c0ee0b8a";

將此變量放入所有ERC223transfer函數,tokenFallback()將使用其函數簽名(0xc0ee0b8a)對其進行驗證。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM