Solidity

為什麼 web3.js 事務失敗但直接在 Etherscan 上工作?

  • December 7, 2021

參考契約可在 - https://rinkeby.etherscan.io/address/0x0e04ca9e56af778424b94eb904da9d97a63582f8找到

我正在嘗試呼叫使用者發送一些 eth 的 payUser 函式,並根據使用者轉移一些代幣的 eth 數量。

用javascript編寫的程式碼是

var current_user_account = ""
var abi_token_contract = ""
var token_contract = ""
const address_token_contract = "0x0E04Ca9E56AF778424B94EB904Da9D97A63582F8"

const web = new Web3("https://rinkeby.infura.io/v3/XXXXXXXXXXXXXXXXX")

$.ajax({
   url: "https://api-rinkeby.etherscan.io/api?module=contract&action=getabi&address=0x0E04Ca9E56AF778424B94EB904Da9D97A63582F8&apikey=XXXXXXXXXXXXXXXXX",
   dataType: "json",
   success: function (data) {
       abi_token_contract = JSON.parse(data.result)
       token_contract = new web.eth.Contract(abi_token_contract, address_token_contract)
   }
});

window.addEventListener('load', async () => {

   if (window.ethereum) {
       try {
           const accounts = await window.ethereum.request({ method: 'eth_requestAccounts' });
           current_user_account = accounts[0]
       } catch (error) {
           if (error.code === 4001) {
               // User rejected request
           }

           setError(error);
       }
       window.ethereum.on('accountsChanged', (accounts) => {
           current_user_account = accounts[0]
       });

   } else {
       window.alert(
           "Non-Ethereum browser detected. You should consider trying MetaMask!"
       );
   }
})


async function send(transaction, value = 0) {
   const params = [{
       from: current_user_account,
       to: transaction._parent._address,
       data: transaction.encodeABI(),
       gas: '0x186a0',
       gasPrice: null,
       value: web.utils.toHex(value)
   },]

   window.ethereum.request({
       method: 'eth_sendTransaction',
       params,
   })
}

function getTokens() {
   token_count_rs = parseFloat($("#token_num").val().trim()) * 10
   $.ajax({
       url: "https://min-api.cryptocompare.com/data/pricemultifull?fsyms=INR&tsyms=ETH",
       dataType: "json",
       success: function (data) {
           amount_tobe_payed = (data.RAW.INR.ETH.OPEN24HOUR * token_count_rs).toFixed(18);
           send(token_contract.methods.payUser(address_token_contract, current_user_account), web.utils.toWei(amount_tobe_payed, "ether"))
       }
   });
}

我不明白為什麼交易在 javascript 上失敗並在 etherscan“Write”部分工作

我認為問題是gasPrice: null

傳遞一個 gasPrice 之類的東西 gasPrice: web3.utils.toHex(10e9), // 10 Gwei

給定智能合約的所有失敗交易都是由於天然氣不足問題。

你可以使用https://ethtx.info/工具來解碼你在 Rinkeby、goerli、mainnet 上的交易。

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