1

我正在尝试使用 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];

}

}
4

1 回答 1

0

将 0xc0ee0b8a 放入 _data 参数中。

启用 ERC223transfer 的这个 _data 参数(字节指针地址)的隐式声明是

bytes public funcSig = hex"c0ee0b8a";

将此变量放入您的所有 ERC223 传输函数中,tokenFallback() 将使用其函数签名(0xc0ee0b8a)对其进行验证。

于 2018-07-04T09:02:21.270 回答