Wie kann ich einen Vertrag von einer Factory instanziieren und im selben Aufruf msg.value an sie senden?

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 undefinedwenn 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).balanceals 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!

Antworten (1)

Ich bin mir nicht sicher, warum das nicht funktioniert, aber als Problemumgehung können Sie einfach den SmartGiftKonstruktor von zahlbar machen und Folgendes tun:

address newGift = (new SmartGift).value(address(this).balance)(_recipient,
    msg.sender, _expiry, _donorMsg);
Können Sie mich auf eine Dokumentation zu dieser Syntax address.value()(args) verweisen? Vielen Dank.