Solidity

發送帶有乙太合約對象的參數

  • June 21, 2022

我現在正在嘗試在瀏覽器中與我測試過的(在 Remix 中)和工作合約進行互動,但無法理解如何使用支付功能發送額外的參數。

我需要userTeamChosen使用一個appendUserBet()函式傳遞一個參數,該函式我都通過 html 表單設置了值,但得到了這個錯誤錯誤:無法估計氣體;交易可能會失敗或可能需要手動限制氣體並且不知道我是否正確發送了參數。

索引.html:

<body>
 <label for="fund">ETH Amount</label>
 <input id="ethAmount" placeholder="0.1" />
 <input id="betTeam" placeholder="Team name" />
 <button type="button" id="appendBetButton"> appendBetButton </button>
</body>

<script src="./index.js" type="module"></script>

智能合約功能:

   function appendUserBet(string memory userTeamChosen) public payable {
       uint256 minimumFee = 1 * 10**17 wei;
       userList.push(payable(msg.sender));
       require(msg.value >= minimumFee);
       fee = msg.value;
       userStructs[msg.sender].betAmount += msg.value;
       userStructs[msg.sender].teamChosen = userTeamChosen;
   }

這就是我在 index.js 中與之互動的地方:

async function appendUserBet() {
   const ethAmount = document.getElementById("ethAmount").value
   console.log(`Funding with ${ethAmount}...`)
   if (typeof window.ethereum !== "undefined") {
       const provider = new ethers.providers.Web3Provider(window.ethereum)
       const signer = provider.getSigner()
       const contract = new ethers.Contract(contractAddress, abi, signer)
       try {
           const transactionResponse = await contract.appendUserBet({
               value: ethers.utils.parseEther(ethAmount), userTeamChosen: "sab", gasLimit: 50000
           })
           await listenForTransactionMine(transactionResponse, provider)
       } catch (error) {
           console.log(error)
       }
   } else {
       appendBetButton.innerHTML = "Please install MetaMask"
   }
}

有人可以讓我知道如何將所需的字元串參數添加到帶有乙太的js介面中的應付函式嗎?

非常感謝您提前抽出時間!

我認為您以錯誤的方式將參數傳遞給智能合約。

文件聲明您必須在傳遞覆蓋之前傳遞參數https://docs.ethers.io/v5/api/contract/contract/#contract-functionsSend

所以根據這個呼叫應該是這樣的:

await contract.appendUserBet(
  "sab",
  {
     value: ethers.utils.parseEther(ethAmount), gasLimit: 50000
  }
)

如果這可以解決您的問題,您可能可以省略gasLimit覆蓋。

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