Solidity

將乙太直接從元遮罩發送到備份函式

  • October 17, 2020

我想從metamask (不使用 web3)向智能合約發送一定數量的乙太幣,並希望它根據該數量執行一些特定的任務。例如,如果我發送0.9乙太幣,我希望它在回退函式中將名為planid的變數設置為1101。以下程式碼來自我的契約:

function() external payable {
   
   if (msg.sender == bank_owner) {
       emit AdminDeposit(msg.value, bank_owner);
       //invest(msg.value, msg.sender, plan_id, _referrer);
   } else {
       address _referrer = bytesToAddress(msg.data);
       _init(msg.sender, msg.value, _referrer);
   }
}

function _init(address payable _investor, uint256 _investValue, address _referrer) private {
   bool doInvest = true;
   if (_investValue == PLAN_PRICE[0]) {
       planid = 1101;
   }
   else if (_investValue == PLAN_PRICE[1]) {
       planid = 1102;
   }
   else if (_investValue == PLAN_PRICE[2]) {
       planid = 1103;
   }
   else if (_investValue == PLAN_PRICE[3]) {
       planid = 1104;
   } 
   else{
       doInvest = false;
       emit TestEvent(planid);
   }

   if (doInvest == true){
       invest(_investValue, _investor, planid, _referrer);
   }else
   {
       revert("Incorrect value sent!");
   }
}

在上面的程式碼中,如果有人(除了已經在建構子中定義的銀行所有者)將0.9乙太幣從元遮罩發送到合約(直接), _init ()函式將被呼叫。我希望第二個 if 語句的else部分不會執行。但是,它執行並且事務失敗。

當我用其他東西替換*revert()時,一切正常。*我想知道你是否能幫我處理這個案子。謝謝。

交易失敗,因為您在 Metamask 中分配的氣體限制低於要求。當我們比較時,_init()消耗的氣體超過revert()。因此,您需要在照片中顯示的部分盡可能多地設置 transcartion 的氣體限制:

在此處輸入圖像描述

祝你好運。

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