WAS ICH TUN MÖCHTE: Die Konstruktorfunktion eines anderen Vertrags aufrufen, diesen Vertrag instanziieren und anschließend Ether in derselben Funktion an ihn senden.
WAS PASSIERT: Eine Instanz des anderen Vertrags wird erstellt und Ether wird übertragen, aber keine der Funktionen des neu erstellten Vertrags funktioniert. Ich bekomme, call to SmartGift.{function name} errored: Cannot read property 'length' of undefined
wenn ich versuche, etwas über den neuen Vertrag zu tun.
PROBLEMFUNKTION:
function createSmartGift(address _recipient, uint32 _expiry, string _donorMsg) public payable returns(address){
address newGift;
newGift = new SmartGift(_recipient, msg.sender, _expiry, _donorMsg);
giftExists[newGift] = true;
uint id = gifts.push(Gift(newGift, _donorMsg,false, _expiry));
giftToOwner[id-1] = _recipient;
recipientGiftCount[_recipient]++;
donorGiftCount[msg.sender]++;
newGift.transfer(address(this).balance); // I WANT TO THIS, BUT GET ERROR
return newGift;
}
ANDERE ANMERKUNGEN: Ich habe sowohl address(this).balance
als auch versucht msg.value
. Und der Zielvertrag hat eine kostenpflichtige Fallback-Funktion.
Auch funktioniert alles gut, wenn ich die newGift.transfer() in eine separate Funktion trenne, die ich separat aufrufen muss. Das ist mein Backup-Plan, aber ich möchte, dass der Kunde nur einmal klickt, nicht zweimal!
Ich bin mir nicht sicher, warum das nicht funktioniert, aber als Problemumgehung können Sie einfach den SmartGift
Konstruktor von zahlbar machen und Folgendes tun:
address newGift = (new SmartGift).value(address(this).balance)(_recipient,
msg.sender, _expiry, _donorMsg);
Betonmauer
Benutzer19510