Icon HelpCircleForumIcon Link

⌘K

Icon HelpCircleForumIcon Link
Optimized React Example

Icon LinkOptimized React Example

This example implements the strategies outlined in Optimizing Frontend Apps and demonstrates how to improve the perceived speed of transactions in a React application.

import { Provider, Wallet, ScriptTransactionRequest } from "fuels";
import { useEffect, useState } from "react";
 
import { TestContract } from "./typegend";
import contractIds from "./typegend/contract-ids.json";
 
function App() {
  const [request, setRequest] = useState<ScriptTransactionRequest | null>(null);
 
  // Initialize the provider and wallet
  const NETWORK_URL = "https://mainnet.fuel.network/v1/graphql";
  const provider = new Provider(NETWORK_URL);
  const wallet = Wallet.fromAddress("0x...", provider);
 
  /**
   * Here we'll prepare our transaction upfront on page load, so that
   * by the time the user interacts with your app (i.e. clicking a btn),
   * the transaction is ready to be submitted
   */
  useEffect(() => {
    const onPageLoad = async () => {
      // 1. Connect to the contract
      const contractInstance = new TestContract(
        contractIds.testContract,
        wallet,
      );
 
      // 2. Invoke the contract function whilst estimating and funding the
      // call, which gives us the transaction request
      const preparedRequest = await contractInstance.functions
        .increment_counter(1)
        .fundWithRequiredCoins();
 
      setRequest(preparedRequest);
    };
 
    onPageLoad();
  }, []);
 
  /**
   * By the time user user clicks the submit button, we only need to
   * submit the transaction to the network
   */
  const handleSubmit = async () => {
    if (!request) return;
 
    // 1. Submit the transaction to the network
    const response = await wallet.sendTransaction(request);
 
    // 2. Wait for the transaction to settle and get the result
    const result = await response.waitForResult();
 
    console.log("result", result);
  };
 
  return (
    <div>
      <button onClick={handleSubmit}>Submit</button>
    </div>
  );
}
 
export default App;