Solidity

如何從工廠實例化合約,並在同一個呼叫中向其發送 msg.value?

  • March 29, 2018

我想做什麼:呼叫另一個合約的建構子,實例化該合約,然後在同一個函式中將 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).balancemsg.value。並且目標合約具有應付回退功能。

此外,如果我將 newGift.transfer() 分離到必須單獨呼叫的單獨函式中,一切正常。這是我的備用計劃,但我希望客戶只點擊一次,而不是兩次!

我不確定為什麼這不起作用,但作為一種解決方法,您可以讓SmartGift’ 建構子付款並執行以下操作:

address newGift = (new SmartGift).value(address(this).balance)(_recipient,
   msg.sender, _expiry, _donorMsg);

引用自:https://ethereum.stackexchange.com/questions/44246