Solidity
使用 ethers.js 呼叫狀態更改函式不通過(沒有錯誤消息,不請求批准)
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);