Как мне установить ручной лимит газа в web3? Чтобы заставить смарт-контракт выполняться?

#javascript #solidity #web3

#javascript #надежность #web3

Вопрос:

У меня возникла проблема с выполнением моего смарт-контракта. Из кода ошибки я понял, что это, должно быть, проблема с ограничением газа, хотя я не знаю, где я бы разместил код, чтобы он выполнялся правильно. Есть предложения?

Солидный код:

 pragma solidity ^0.8.0;


    import 'hardhat/console.sol';
    
    contract WavePort { 

    //TrackWaves
    uint totalWaves; //State Variable, Permanetly Stored In Contract Storage

    constructor() {
        console.log("Yo, I am I contract");
        }


    //Function Increments Waves On The Blockchain/ Immutable Never Decreasing 
    function wave() public { 
        totalWaves  = 1;
        console.log("%s has waved!", msg.sender);
    }

    //Function Returns Us the The Total Waves To Be Viewed
    function getTotalWaves()public view returns(uint256) { 
        console.log("We have %d total waves", totalWaves);
        return totalWaves;
    }
                    
}
 

Код JavaScript:

 const  App = () => {

  const [currentAccount, setCurrentAccount] = useState("")
  const contractAddress = "contractAddress"
  const contractABI = abi.abi

const checkIfWalletConnected = async () => { 
  let web3
  try { 
    const {ethereum} = window; 

    if(!ethereum) { 
      window.alert("Make sure you have metamask !");
      return;
    }else {
      web3 = new Web3(window.ethereum)
      console.log("We have the ethereum object", ethereum)}

    const accounts = await ethereum.request({method: 'eth_accounts'})
      if(accounts.length !== 0) { 
        const account = accounts[0]
      
        console.log("Found an Authorized account:", account, );
        setCurrentAccount(account)

      } else { 
        window.alert("NO authorized account found")
      }


      const EthBalance = await web3.eth.getBalance(accounts[0])
      console.log(EthBalance)



    
  }catch(err) {console.log(err)}
  
}


 const connectWallet = async () => { 
    try { 
      const {ethereum} = window; 

      if(!ethereum) {alert("Get Metamask extenstion")
    return 
  } else { 

  const accounts = await ethereum.request({method: 'eth_accounts'})
  console.log("Connected", accounts[0])
  window.alert("Wallet is Connected")
  setCurrentAccount(accounts[0])
  const ethBlance = await Web3.eth.getBalance(currentAccount)
  console.log(ethBlance)
  }
    }catch(err) {
      console.log(err)
    }
  }


  const wave = async () => { 
    try { 
    const {ethereum} = window;

    if(ethereum) { 
      const provider = new ethers.providers.Web3Provider(ethereum);
      const signer = provider.getSigner(); 
      const wavePortalContract = new ethers.Contract(contractAddress, contractABI, signer);

      let count = await wavePortalContract.getTotalWaves( ); 
      

      const waveTxn = await wavePortalContract.wave({gas:10000000 }, {gasPrice:80000000000});
      console.log("Mining....", waveTxn.hash)


      await waveTxn.wait( );
      console.log("Mined-- ", waveTxn.hash)

      count = await await wavePortalContract.getTotalWaves( );
      console.log("Retrieved total wave count.. ", count.toNumber())




    }else { 
      console.log("Eth Object doesn't exist!")
    }
    } catch(err) {console.log(`${err} hello world`) }
}




  useEffect(() => {
    checkIfWalletConnected();
  }, [])
 

Код ошибки, который я получаю:

Ошибка: не удается оценить газ; транзакция может завершиться неудачно или может потребоваться ограничение газа вручную (error={«code»:-32000,»message»:»выполнение отменено»}, method=»call», transaction={«from»:»0xD49a9a33F180D1e35A30F0ae2Dbfe5716a740Ebc»,»to»:»0x5FbDB2315678afecb367f032d93F642f64180aa3″,»data»:»0x9a2cdc08″,»accessList»:null}, code=НЕПРЕДСКАЗУЕМЫЙ_GAS_LIMIT, version=providers /5.5.1)

Комментарии:

1. попробуйте поместить gas и gas price в один и тот же объект

Ответ №1:

При вызове метода Abi контракта вы можете передать объект дополнительных параметров, связанных с gas, во втором аргументе (или в первом, если у вас нет никаких аргументов в вашем методе).

Итак, вызов wave функции должен выглядеть следующим образом:

const waveTxn = await wavePortalContract.wave({gasLimit:30000});

Проверьте все дополнительные параметры в приведенной ниже документации.

https://docs.ethers.io/v5/api/contract/contract/#contract-functionsSend

Комментарии:

1. Он по-прежнему возвращает мне ту же ошибку.

2. Вы решили одну из моих самых больших проблем. Спасибо вам 🙂

3. Это должно быть проверено как правильный ответ.