Warum sendet mein ERC20 die doppelte Menge?

Geben Sie hier die Bildbeschreibung einGeben Sie hier die Bildbeschreibung einGeben Sie hier die Bildbeschreibung ein

Kann jemand die obigen Bilder erklären?

Ich habe 98.200 Token gesendet. Es war erfolgreich. Aber meine Menge und die Menge der Empfänger werden verdoppelt.

Bitte helfen!!!??!!

Für diejenigen, die versuchen, mitzumachen, hier ist ein Link zum Token-Vertrag: etherscan.io/address/0x944fb74240b9ebd8dd48fb119b66a5d4994c2852 .
Ich nehme an, Sie haben den Vertrag eingesetzt. Bedeutet das, dass Sie den Quellcode dafür haben? Wenn ja, teilen Sie es bitte. Der Quellcode wurde nicht auf Etherscan veröffentlicht, was eine Untersuchung ziemlich schwierig macht.
Ich habe es veröffentlicht - warte nur darauf, dass Etherscan es genehmigt. Ich werde es unter unserer Site-Adresse posten: ameritoken.com/erc20-ameritoken-code
Ich habe versucht, es hier zu posten, war aber zu lang. Danke Jungs für jede Hilfe. Anscheinend hat biysync.io das gleiche Problem. Sie haben auch keine Antwort.

Antworten (1)

Vom Quellcode aus wird jede Übertragung effektiv zweimal durchgeführt. transferaktualisiert die Salden und ruft dann _transferauf, was es erneut tut:

function _transfer(address _from, address _to, uint _value) internal {
    require(_to != 0x0); // Prevent transfer to 0x0 address. Use burn() instead
    require(balanceOf[_from] >= _value); // Check if the sender has enough
    require(balanceOf[_to] + _value > balanceOf[_to]); // Check for overflows
    uint previousBalances = balanceOf[_from] + balanceOf[_to]; // Save this for an assertion in the future
    balanceOf[_from] -= _value; // Subtract from the sender
    balanceOf[_to] += _value; // Add the same to the recipient
    Transfer(_from, _to, _value);
    assert(balanceOf[_from] + balanceOf[_to] == previousBalances); // Asserts are used to use static analysis to find bugs in your code. They should never fail
}

function transfer(address _to, uint256 _value) public returns (bool) {
    if (balanceOf[msg.sender] >= _value) {
        balanceOf[msg.sender] -= _value;
        balanceOf[_to] += _value;
        _transfer(msg.sender, _to, _value);
        return true;
    }
    return false;
}

Es scheint, als wäre die einfachste Lösung zu ändern transfer:

function transfer(address _to, uint256 _value) public returns (bool) {
    if (balanceOf[msg.sender] >= _value) {
        _transfer(msg.sender, _to, _value);
        return true;
    }
    return false;
}
Weißt du, wie dumm ich mich gerade fühle? Vielen Dank dafür!
Gibt es eine Möglichkeit, einen Vertrag zu aktualisieren, nachdem er bereitgestellt wurde? Vielleicht eine neue Frage, aber ich muss fragen ..
Nein, der Vertragscode kann nach der Bereitstellung nicht geändert werden.