Как я могу создать экземпляр контракта из фабрики и в том же вызове отправить ему msg.value?

ЧТО Я ХОЧУ СДЕЛАТЬ: вызвать функцию-конструктор другого контракта, создать экземпляр этого контракта и впоследствии отправить ему эфир в той же функции.
ЧТО ПРОИСХОДИТ: создается экземпляр другого контракта, и эфир передается, но ни одна из функций вновь созданного контракта не работает. Я получаю call to SmartGift.{function name} errored: Cannot read property 'length' of undefined, когда пытаюсь что-то сделать по новому контракту.
ЗАДАЧА ФУНКЦИЯ:

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

ДРУГИЕ ПРИМЕЧАНИЯ: я пробовал и то, address(this).balanceи другое msg.value. И у целевого контракта есть оплачиваемая резервная функция.
Кроме того, все работает нормально, если я выделю newGift.transfer() в отдельную функцию, которую я должен вызывать отдельно. Это мой запасной план, но я хочу, чтобы покупатель щелкнул один раз, а не дважды!

Ответы (1)

Я не уверен, почему это не работает, но в качестве обходного пути вы можете просто сделать SmartGiftконструктор оплачиваемым и сделать это:

address newGift = (new SmartGift).value(address(this).balance)(_recipient,
    msg.sender, _expiry, _donorMsg);
Можете ли вы указать мне какую-либо документацию по этому синтаксису address.value()(args)? Спасибо.