簡體   English   中英

如何從 React 前端向智能合約發送可變數量的以太幣?

[英]How to send variable amount of ether to smart contract from React front end?

我正在嘗試從我的 React 前端向我的智能合約發送可變數量的以太幣。 在混音中,只需選擇數量並使用 function 發送,我就可以毫無問題地做到這一點

在我的前端,這是 function,其中 values.amount 是 100wei

const sendEth = async(e) => {
  e.preventDefault()
  try {
    const { ethereum } = window;

    if (ethereum) {
      const provider = new ethers.providers.Web3Provider(ethereum);
      const signer = provider.getSigner();
      const connectedContract = new ethers.Contract(CONTRACT_ADDRESS, escrowAbi.abi, signer);
      let nftTxn = await connectedContract.depositEth(values.amount);
        
      console.log("Mining...please wait.", nftTxn)
      await nftTxn.wait();
      
      console.log(`Mined, see transaction: https://rinkeby.etherscan.io/tx/${nftTxn.hash}`);
      // console.log(connectedContract)

    } else {
      console.log("Ethereum object doesn't exist!");
    }
  } catch (error) {
    console.log(error)
  }

}

在我的智能合約中,這是我的 depositEth function - 但是 msg.value 是我想傳遞的參數,但我不能將它作為參數傳遞給這個 function?

僅供參考,在我的應用程序中,一旦您向合同支付 ETH,它就會發布 NFT。

 function depositEth() public payable hasToken(address(this), nftAddress)  {
        require(msg.value == amountOwed, 'You ow more money');
        buyerAddress = payable(msg.sender);

        if(walletHoldsToken(address(this),nftAddress)) {
         ERC721(nftAddress).safeTransferFrom(address(this), buyerAddress, tokenID);
        }
    }

所以我要問的是如何將 x 數量的 eth 發送到具有在前端定義的該值的合同?

在您的智能合約中定義一個 function 以返回所欠金額:

function getOwedAmount() public view returns (uint256) {
    // i  am assuming " amountOwed" is state variable, uint256
    return amountOwed;
  }

創建合約后。

const connectedContract = new ethers.Contract(CONTRACT_ADDRESS, escrowAbi.abi, signer)

獲取擁有的數量

let owedAmount = await contract.getOwedAmount();
owedAmount=owedAmount.toString()
let transaction=await connectedContract.depositEth({value:owedAmount})
await transaction.wait();

由於depositEth是可支付的,我們可以將最后一個參數作為 object 傳遞,指定我們發送了多少,solidity 會自動將該金額分配給msg.value

你的 depositEth depositEth() function 需要 0 個參數,所以 JS 片段也需要傳遞 0 個參數。

ethers中有覆蓋object ,總是在常規 function 參數之后傳遞(在您的情況下,在第一個位置,因為有 0 個參數),允許修改調用 function 的事務的某些字段,包括它的value

let nftTxn = await connectedContract.depositEth({
    value: values.amount
});

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM