ЧТО Я ХОЧУ СДЕЛАТЬ: вызвать функцию-конструктор другого контракта, создать экземпляр этого контракта и впоследствии отправить ему эфир в той же функции.
ЧТО ПРОИСХОДИТ: создается экземпляр другого контракта, и эфир передается, но ни одна из функций вновь созданного контракта не работает. Я получаю 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() в отдельную функцию, которую я должен вызывать отдельно. Это мой запасной план, но я хочу, чтобы покупатель щелкнул один раз, а не дважды!
Я не уверен, почему это не работает, но в качестве обходного пути вы можете просто сделать SmartGift
конструктор оплачиваемым и сделать это:
address newGift = (new SmartGift).value(address(this).balance)(_recipient,
msg.sender, _expiry, _donorMsg);
бетонная стена
пользователь19510