Skip to main content

Signing and Executing Transactions

useSignAndExecuteTransaction

The main hook for executing transactions:
import { useSignAndExecuteTransaction } from "@mysten/dapp-kit";
import { Transaction } from "@mysten/sui/transactions";

function TransferSUI() {
  const { mutate: signAndExecute } = useSignAndExecuteTransaction();

  const handleTransfer = () => {
    const tx = new Transaction();

    // Split 1 SUI from gas coin
    const [coin] = tx.splitCoins(tx.gas, [1_000_000_000]); // 1 SUI = 1B MIST

    // Transfer to recipient
    tx.transferObjects([coin], "0xRecipientAddress...");

    signAndExecute(
      { transaction: tx },
      {
        onSuccess: (result) => console.log("Success!", result.digest),
        onError: (error) => console.error("Failed:", error),
      }
    );
  };

  return <button onClick={handleTransfer}>Transfer 1 SUI</button>;
}

Transfer Objects

function TransferObject({ objectId, recipient }: { objectId: string; recipient: string }) {
  const { mutate: signAndExecute } = useSignAndExecuteTransaction();

  const handleTransfer = () => {
    const tx = new Transaction();
    tx.transferObjects([tx.object(objectId)], recipient);
    signAndExecute({ transaction: tx });
  };

  return <button onClick={handleTransfer}>Transfer Object</button>;
}

Call Move Functions

function MintNFT({ name, description, imageUrl }: { name: string; description: string; imageUrl: string }) {
  const { mutate: signAndExecute, isPending } = useSignAndExecuteTransaction();

  const handleMint = () => {
    const tx = new Transaction();

    tx.moveCall({
      target: "0xYourPackage::nft::mint",
      arguments: [
        tx.pure.string(name),
        tx.pure.string(description),
        tx.pure.string(imageUrl),
      ],
    });

    signAndExecute(
      { transaction: tx },
      {
        onSuccess: ({ digest }) => alert("NFT minted! TX: " + digest),
        onError: (error) => alert("Failed: " + error.message),
      }
    );
  };

  return (
    <button onClick={handleMint} disabled={isPending}>
      {isPending ? "Minting..." : "Mint NFT"}
    </button>
  );
}

Next Steps

Build Escrow dApp

Build a complete escrow dApp