Zwei externe Funktionsaufrufe, die in unserem Smart Contract nicht in Kombination funktionieren

Also ich habe folgende Funktionen

kaufenTokens

function buyTokens(address beneficiary) public payable {
    require(beneficiary != address(0));
    require(validPurchase());

    uint256 weiAmount = msg.value;

    uint256 tokens = weiAmount.mul(getRate());

    weiRaised = weiRaised.add(weiAmount);

    token.issue(address(vault), tokens);
    vault.deposit.value(msg.value)(beneficiary, tokens);

    emit TokenPurchase(msg.sender, beneficiary, weiAmount, tokens);

    forwardFunds();
}

forwardFunds

function forwardFunds() internal {
    wallet.transfer(msg.value);
}

Kaution (in einem anderen Smart Contract)

function deposit(address supporter, uint256 tokensAmount) onlyOwner public payable{

    depositedETH[supporter] = depositedETH[supporter].add(msg.value);
    depositedToken[supporter] = depositedToken[supporter].add(tokensAmount);

    emit Deposit(supporter, msg.value, tokensAmount);
}

BuyTokens funktionieren also nicht, es sei denn, ich kommentiere ENTWEDER den Einzahlungsaufruf oder den ForwardFunds-Aufruf. Nachdem ich etwas gelesen hatte, dachte ich, dass es etwas mit Benzin zu tun hatte?

Wenn ich die Deposit-Funktion aufrufe, indem ich den Wert als Parameter übergebe, anstatt ihn über das msg-Objekt in der anderen Funktion zu erhalten (ohne die .value() -Methode zu verwenden), funktioniert es einwandfrei.

vault.deposit(beneficiary, tokens, msg.value)

Gibt es ein Problem bei der Verwendung eines .value()-Aufrufs und der Weiterleitung an eine interne Funktion, die .transfer() verwendet?

Danke!

Hallo! Sie sagten > " buyTokensgeht nicht", aber auf welche Weise? Teilen Sie bitte mit, welche Nachricht Sie darüber informiert, dass ein Problem vorliegt. Wie ein Anruf mit Argumenten und was man dann sieht.

Antworten (1)

Dies leitet den an den Tresorvertrag gesendeten Ether weiter

vault.deposit.value(msg.value)(beneficiary, tokens);

Und dies leitet den an den Wallet-Vertrag gesendeten Ether weiter

wallet.transfer(msg.value);

Offensichtlich können Sie nicht denselben Ether an zwei verschiedene Kontrakte weiterleiten.

Ich denke, Sie haben auf das Problem hingewiesen, dass versucht wird, einen Betrag zweimal zu senden. Also, aus Neugier, wenn der Vertrag, der die buyTokens-Funktion enthält, selbst einen Haufen Ether darin gespeichert hätte, wäre er dann in der Lage, ihn auszuführen? Beispiel: Wenn jemand die buyTokens-Funktion auslöst, löst sie die Einzahlungsfunktion aus und sendet einen Wert (unter Verwendung des im Vertrag gespeicherten Ethers), UND DANN führt sie DIE Übertragungsfunktion aus und sendet den gleichen Betrag (von sich selbst) an die Brieftasche. Vorausgesetzt, der Vertrag hätte genug Ether, würde er funktionieren? Dies nur als Gedankenexperiment. Das will ich natürlich nicht
Ja, wenn der Vertrag über genügend Guthaben verfügt, wird die zweite Überweisung erfolgreich sein.