Ich habe einen Smart Contract für Crowdsale bereitgestellt, der eine Funktion von ReceiveETH() hat:
function receiveETH(address beneficiary) internal {
uint coinToSend = bonus(msg.value.mul(COIN_PER_ETHER).div(1 ether)); // Compute the number to send
Backer backer = backers[beneficiary];
coin.transfer(beneficiary, coinToSend); // Transfer right now
backer.coinSent = backer.coinSent.add(coinToSend);
backer.weiReceived = backer.weiReceived.add(msg.value); // Update the total wei collected during the crowdfunding for this backer
etherReceived = etherReceived.add(msg.value); // Update the total wei collected during the crowdfunding
coinSentToEther = coinSentToEther.add(coinToSend);
// Send events
LogCoinsEmited(msg.sender ,coinToSend);
LogReceivedETH(beneficiary, etherReceived);
}
Diesen Vertrag habe ich auf Testnet bereitgestellt, aber er konnte keinen Ether empfangen. Zum Beispiel verwende ich einige Testkonten, um Ether an diese bereitgestellte Smart-Contract-Adresse zu senden, jedes Mal, wenn Erfolg bei Etherscan angezeigt wird und die Tx-Kosten abgezogen werden, während der Ether nicht erfolgreich übertragen wird und der Smart-Contract-Etherbetrag 0 bleibt. Link
Ich frage mich, was hier falsch ist? Hat der Crowdsale-Vertrag eine Funktion, die jedes Mal ausgelöst wird, wenn eine neue Überweisung eingeht?
PS habe gerade bemerkt, dass ich die Fallback-Funktion definiert habe:
function() stopInEmergency respectTimeFrame payable {
receiveETH(msg.sender);
}
Es sieht für mich perfekt aus, aber mein Vertrag empfängt immer noch keinen Ether, wenn ich versuche, ihn zu senden. Was ist hier noch falsch?
Das internal
Schlüsselwort bedeutet, dass Ihre Funktion nur aus dem Vertrag oder daraus abgeleiteten Verträgen aufgerufen werden kann. Sie können es nicht öffentlich nennen.
Wenn Sie möchten, dass diese Funktion von außerhalb des Vertrages aufrufbar ist, sollten Sie internal
auf umstellen public
.
Sie müssen hinzufügen, payable
ob mit diesem Funktionsaufruf Ethereum gesendet werden soll.
internal
Um dies zu beheben, sollten Sie zu ändern public payable
, was diese Funktion öffentlich aufrufbar machen und es auch ermöglichen sollte, Ethereum zusammen mit der Transaktion zu senden.
Hat der Crowdsale-Vertrag eine Funktion, die jedes Mal ausgelöst wird, wenn eine neue Überweisung eingeht?
Für die Übertragung von Ethereum, ja. Das wäre die Fallback-Funktion . Allerdings ist nur 2300 Gas verfügbar. Derzeit gibt es keine Funktion, die beim Transfer für ERC20-Token aufgerufen wird.
Gas Used
ist das so viel wie das Gas Limit
. Dies deutet darauf hin, dass etwas einen Fehler verursacht oder wirft, denn wenn ein Fehler auftritt, wird sofort das gesamte Gas verbraucht. Stellen Sie sicher, dass nichts einen Fehler verursacht und dass Ihr Gaslimit hoch genug ist.Ich habe das Problem selbst herausgefunden, weil ich meinen Token-Vertragsbesitz nicht auf meinen Crowdsale-Vertrag übertragen habe.
kuppel etwas