Der Token-Verkaufsvertrag gibt jedes Mal eine Ausnahme zurück. Getestet auf Ropsten und dort funktioniert es einwandfrei

Das Folgende ist der Code für das Token:

  pragma solidity ^0.4.16;

   interface tokenRecipient { function receiveApproval(address _from, uint256 
   _value, address _token, bytes _extraData) external; }

   contract CCTCOIN {

string public name;
string public symbol;
uint8 public decimals = 8;
uint256 public totalSupply;

mapping (address => uint256) public balanceOf;
mapping (address => mapping (address => uint256)) public allowance;


event Transfer(address indexed from, address indexed to, uint256 value);


event Burn(address indexed from, uint256 value);

constructor(

) public {
    totalSupply = 21000000 * 10 ** uint256(decimals);  
    balanceOf[msg.sender] = totalSupply;               
    name = "CCTCOIN";                                  
    symbol = "CCTC";                               
}


function _transfer(address _from, address _to, uint _value) internal {

    require(_to != 0x0);
    require(balanceOf[_from] >= _value);
    require(balanceOf[_to] + _value >= balanceOf[_to]);
    uint previousBalances = balanceOf[_from] + balanceOf[_to];
    balanceOf[_from] -= _value;
    balanceOf[_to] += _value;
    emit Transfer(_from, _to, _value);
    assert(balanceOf[_from] + balanceOf[_to] == previousBalances);
}


function transfer(address _to, uint256 _value) public {
    _transfer(msg.sender, _to, _value);
}


function transferFrom(address _from, address _to, uint256 _value) public returns (bool success) {
    require(_value <= allowance[_from][msg.sender]);  
    allowance[_from][msg.sender] -= _value;
    _transfer(_from, _to, _value);
    return true;
}


function approve(address _spender, uint256 _value) public
    returns (bool success) {
    allowance[msg.sender][_spender] = _value;
    return true;
}


function approveAndCall(address _spender, uint256 _value, bytes _extraData)
    public
    returns (bool success) {
    tokenRecipient spender = tokenRecipient(_spender);
    if (approve(_spender, _value)) {
        spender.receiveApproval(msg.sender, _value, this, _extraData);
        return true;
    }
}

function burn(uint256 _value) public returns (bool success) {
    require(balanceOf[msg.sender] >= _value);   
    balanceOf[msg.sender] -= _value;          
    totalSupply -= _value;                      
    emit Burn(msg.sender, _value);
    return true;
}


function burnFrom(address _from, uint256 _value) public returns (bool success) {
    require(balanceOf[_from] >= _value);                
    require(_value <= allowance[_from][msg.sender]);    
    balanceOf[_from] -= _value;                         
    allowance[_from][msg.sender] -= _value;             
    totalSupply -= _value;                              
    emit Burn(_from, _value);
    return true;
}
}

Dies ist der Code für den Token-Verteilungsvertrag, die Rate ist festgelegt und wenn dies in ropsten ausgeführt wird, läuft es mit jeder Token-Adresse einwandfrei, aber im Hauptnetz löst es immer eine Ausnahme aus:

pragma solidity ^0.4.0;


// ----------------------------------------------------------------------------
// Safe maths
// ----------------------------------------------------------------------------
contract SafeMath {
    function safeAdd(uint a, uint b) internal pure returns (uint c) {
        c = a + b;
        require(c >= a);
    }
    function safeSub(uint a, uint b) internal pure returns (uint c) {
        require(b <= a);
        c = a - b;
    }
    function safeMul(uint a, uint b) internal pure returns (uint c) {
        c = a * b;
        require(a == 0 || c / a == b);
    }
    function safeDiv(uint a, uint b) internal pure returns (uint c) {
        require(b > 0);
        c = a / b;
    }
}


interface token {
    function transfer(address to, uint tokens) external;
    function balanceOf(address tokenOwner) external returns(uint balance);
}





// ----------------------------------------------------------------------------
// Owned contract
// ----------------------------------------------------------------------------
contract Owned {
    address public owner;
    address public newOwner;

    event OwnershipTransferred(address indexed _from, address indexed _to);

    constructor() public {
        owner = msg.sender;
    }

    modifier onlyOwner {
        require(msg.sender == owner);
        _;
    }

    function transferOwnership(address _newOwner) public onlyOwner {
        newOwner = _newOwner;
        emit OwnershipTransferred(owner, _newOwner);
    }

}

contract CCTCSALE is  Owned, SafeMath {


    token public reward;
    uint public Ownerbalance;

    mapping(address => uint) balances;



    constructor() public {
        address CCTCTokenAddress = 0x5f9f9c3148ca875fc28b4075cc3195f7e040a1a4;

        reward = token(CCTCTokenAddress);

    }
    function getbalance() public returns(uint) {
        uint test = reward.balanceOf(this);
        return (test);
    }

    function () public payable {

        uint tokens;
        tokens = msg.value * 500;
        balances[msg.sender] = safeAdd(balances[msg.sender], tokens);
        reward.transfer(msg.sender, tokens);
    }

    function safeWithdrawal() public onlyOwner {
            uint amount = this.balance;
            owner.transfer(amount);
    }


    function withdrawTokens() public onlyOwner{
        Ownerbalance = reward.balanceOf(this);
        reward.transfer(owner, Ownerbalance);

    }

}
Welche Operation versuchen Sie im Vertrag auszuführen? Welchen Fehler erhalten Sie? Haben Sie Transaktionshash?
Dies ist die Transaktion des vorherigen Vertrags. Dieser Vertrag löst auch dieselbe Ausnahme aus
Ich versuche, Ether an den Vertrag zu senden, um Token zu erhalten

Antworten (1)

Ich denke, das Problem liegt in Ihrer Fallback-Funktion

function () payable public {

    amount = msg.value;
    uint256 tobesent = amount/price;
    tokenReward.transfer(msg.sender, tobesent*10e17);

}

In Ihrer Transaktion senden Sie 0,00028 Ether und in dem von Ihnen festgelegten Konstruktor price = 0.00028 etherenden Sie mit tobesent = 1.

Jetzt möchten Sie senden tobesent*10e17 = 1e18, aber Ihr Token hat 8 Dezimalstellen. Ich denke, Sie möchten stattdessen senden tobesent*1e8.

Es funktionierte. "1e8" überträgt jedoch 10 Token, also muss ich "1e7" machen.