Solidity
如何從工廠實例化合約,並在同一個呼叫中向其發送 msg.value?
我想做什麼:呼叫另一個合約的建構子,實例化該合約,然後在同一個函式中將 Ether 發送給它。
發生了什麼:創建了另一個合約的實例,並轉移了乙太幣,但新創建的合約上的任何功能都不起作用。
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);