Solidity

使用 ethers.js 呼叫狀態更改函式不通過(沒有錯誤消息,不請求批准)

  • August 22, 2022

ethers.js我有一個合約函式,由於某種原因我無法從前端呼叫。我什至無法調試此呼叫,因為它不會產生任何錯誤。我試圖通過更改 gas 價格或傳遞參數來中斷通話,然後我得到了錯誤。當我沒有收到錯誤時,metamask不會彈出要求確認,因為我 100% 確定此交易有 gas 價格。

這是我呼叫函式的方式:

   const provider = new ethers.providers.JsonRpcProvider("https://rpc-...", 80001); ///rpc url
   const signer = new ethers.Wallet("0x....", provider); ///private key
   const administrativeSidechainContract = new ethers.Contract(ContractAddress, abi, signer)


   async function updateUI() {
       //const gasPrice = await provider.getGasPrice() //gets the gas price but doesnt fire transaction
       const addingAllWinnings = await administrativeSidechainContract.addAllPotentialWinnings(
           props.eventNumber,
           props.winningsList,
           props.loopedOverChainsList,
           props.winnersList
           , { gasPrice: ethers.utils.parseUnits('100', 'gwei'), gasLimit: ethers.utils.parseUnits('10000000', 'wei') })
   }
   updateUI()

我已經用hardhat+編寫了所有單元測試,ethers.js它們都通過了。

這是合約功能:

   function addAllPotentialWinnings(
       uint256 _eventNumber,
       uint256[][] memory _potentialWinnings,
       uint256[] memory _chainsList,
       address[] memory _winnersList
   ) public onlyOwner {
       winnersList[_eventNumber] = _winnersList;
       updateChains(_eventNumber, _chainsList);
       for (uint i = 0; i < _winnersList.length; i++) {
           updatePotentialWinnings(
               _eventNumber,
               _winnersList[i],
               _potentialWinnings[i]);}}

請注意,由於類似的原因,我無法呼叫所有其他正在改變狀態的函式。但是,所有view功能都可以正常工作。

關於呼叫狀態更改函式,我缺少什麼ethers.js

如果你想使用元遮罩,你不需要用私鑰創建錢包。Metamask 將自行簽署 tx(帶有彈出確認)。此外,在簽名之前,metamask 將使用 nonce、gasprice 和 gasLimit 填充您的 tx(稍後您可以在 metamask 中更正這些值)。

嘗試這個:

const provider = new ethers.providers.JsonRpcProvider("https://rpc-...", 80001); ///rpc url
   const signer = provider.getSigner(0)
   const administrativeSidechainContract = new ethers.Contract(ContractAddress, abi, signer)


       async function updateUI() {
               const addingAllWinnings = await administrativeSidechainContract.addAllPotentialWinnings(
                   props.eventNumber,
                   props.winningsList,
                   props.loopedOverChainsList,
                   props.winnersList
   )}

有兩個問題:我如何獲得簽名者以及如何檢測 rpc 提供者。我改變了這兩件事 - (1) 我使用錢包和私鑰獲取簽名者,(2) 不是為 rpc 提供者提供連結,而是使用 web3 自動檢測到它。

   const provider = new ethers.providers.Web3Provider(web3.currentProvider);
   const wallet = new ethers.Wallet(privateKey, provider);
   const signer = wallet.provider.getSigner(wallet.address);

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