¿Cómo puedo instanciar un contrato de una fábrica y, en la misma llamada, enviarle msg.value?

LO QUE QUIERO HACER: llamar a la función constructora de otro contrato, crear una instancia de ese contrato y, posteriormente, enviarle Ether en la misma función.
QUÉ SUCEDE: se crea una instancia del otro contrato y se transfiere Ether, pero ninguna de las funciones en el contrato recién creado funciona. Me sale call to SmartGift.{function name} errored: Cannot read property 'length' of undefinedcuando trato de hacer algo en el nuevo contrato.
PROBLEMA FUNCIÓN:

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;
    }

OTRAS NOTAS: He probado tanto address(this).balancecomo msg.value. Y el contrato de destino tiene una función de reserva pagadera.
Además, todo funciona bien si separo el newGift.transfer() en una función separada que tengo que llamar por separado. Ese es mi plan de respaldo, pero quiero que el cliente solo haga clic una vez, ¡no dos veces!

Respuestas (1)

No estoy seguro de por qué eso no funciona, pero como solución alternativa, puede hacer que SmartGiftel constructor sea pagadero y hacer esto:

address newGift = (new SmartGift).value(address(this).balance)(_recipient,
    msg.sender, _expiry, _donorMsg);
¿Puede señalarme alguna documentación sobre esta sintaxis address.value () (args)? Gracias.