React SDK Hooks
Many of these hooks are built using @tanstack/react-query, which provides powerful caching, revalidation, and background refetching features. As a result, you'll see return types like UseQueryResult and UseMutationResult throughout this section. Other types—such as Account, Block, and CurrentUser—are from the Flow Client Library (FCL) TypeDefs. Refer to their respective documentation for full type definitions and usage patterns.
Cadence Hooks
useFlowCurrentUser
Open in Playground →
_10import { useFlowCurrentUser } from "@onflow/react-sdk"
Parameters
flowClient?: FlowClient- OptionalFlowClientinstance
Returns:
user: CurrentUser– The current user object from FCLauthenticate: () => Promise<CurrentUser>– Triggers wallet authenticationunauthenticate: () => void– Logs the user out
_16function AuthComponent() {_16 const { user, authenticate, unauthenticate } = useFlowCurrentUser()_16_16 return (_16 <div>_16 {user?.loggedIn ? (_16 <>_16 <p>Logged in as {user?.addr}</p>_16 <button onClick={unauthenticate}>Logout</button>_16 </>_16 ) : (_16 <button onClick={authenticate}>Login</button>_16 )}_16 </div>_16 )_16}
useFlowAccount
Open in Playground →
_10import { useFlowAccount } from "@onflow/react-sdk"
Parameters:
address?: string– Flow address (with or without0xprefix)query?: UseQueryOptions<Account | null, Error>– Optional TanStackQuery optionsflowClient?: FlowClient- OptionalFlowClientinstance
Returns: UseQueryResult<Account | null, Error>
_19function AccountDetails() {_19 const { data: account, isLoading, error, refetch } = useFlowAccount({_19 address: "0x1cf0e2f2f715450",_19 query: { staleTime: 5000 },_19 })_19_19 if (isLoading) return <p>Loading account...</p>_19 if (error) return <p>Error fetching account: {error.message}</p>_19 if (!account) return <p>No account data</p>_19_19 return (_19 <div>_19 <h2>Account: {account.address}</h2>_19 <p>Balance: {account.balance}</p>_19 <pre>{account.code}</pre>_19 <button onClick={refetch}>Refetch</button>_19 </div>_19 )_19}
useFlowBlock
Open in Playground →
_10import { useFlowBlock } from "@onflow/react-sdk"
Parameters:
sealed?: boolean– Iftrue, fetch latest sealed blockid?: string– Block by IDheight?: number– Block by heightquery?: UseQueryOptions<Block | null, Error>– Optional TanStackQuery optionsflowClient?: FlowClient- OptionalFlowClientinstance
Only one of sealed, id, or height should be provided.
Returns: UseQueryResult<Block | null, Error>
_14function LatestBlock() {_14 const { data: block, isLoading, error } = useFlowBlock({ query: { staleTime: 10000 } })_14_14 if (isLoading) return <p>Loading...</p>_14 if (error) return <p>Error: {error.message}</p>_14 if (!block) return <p>No block data.</p>_14_14 return (_14 <div>_14 <h2>Block {block.height}</h2>_14 <p>ID: {block.id}</p>_14 </div>_14 )_14}
useFlowChainId
Open in Playground →
_10import { useFlowChainId } from "@onflow/react-sdk"
This hook retrieves the Flow chain ID, which is useful for identifying the current network.
Parameters:
query?: Omit<UseQueryOptions<string | null>, "queryKey" | "queryFn">– Optional TanStack Query options likestaleTime,enabled, etc.flowClient?: FlowClient- OptionalFlowClientinstance
Returns: UseQueryResult<string | null, Error>
Valid chain IDs include: testnet (Flow Testnet), mainnet (Flow Mainnet), and emulator (Flow Emulator). The flow- prefix will be stripped from the chain ID returned by the access node (e.g. flow-testnet will return testnet).
_10function ChainIdExample() {_10 const { data: chainId, isLoading, error } = useFlowChainId({_10 query: { staleTime: 10000 },_10 })_10_10 if (isLoading) return <p>Loading chain ID...</p>_10 if (error) return <p>Error fetching chain ID: {error.message}</p>_10_10 return <div>Current Flow Chain ID: {chainId}</div>_10}
useFlowClient
Open in Playground →
This hook returns the FlowClient for the current <FlowProvider /> context.
Parameters:
flowClient?: FlowClient- OptionalFlowClientinstance to override the result
useFlowConfig
Open in Playground →
_10import { useFlowConfig } from "@onflow/react-sdk"
Returns: FlowConfig
_10function MyComponent() {_10 const config = useFlowConfig()_10_10 return (_10 <div>_10 <p>Current network: {config.flowNetwork}</p>_10 <p>Current access node: {config.accessNodeUrl}</p>_10 </div>_10 )_10}
useFlowEvents
Open in Playground →
_10import { useFlowEvents } from "@onflow/react-sdk"
Parameters:
startBlockId?: string– Optional ID of the block to start listening fromstartHeight?: number– Optional block height to start listening fromeventTypes?: string[]– Array of event type strings (e.g.,A.0xDeaDBeef.Contract.EventName)addresses?: string[]– Filter by Flow addressescontracts?: string[]– Filter by contract identifiersopts?: { heartbeatInterval?: number }– Options for subscription heartbeatonEvent: (event: Event) => void– Callback for each event receivedonError?: (error: Error) => void– Optional error handlerflowClient?: FlowClient- OptionalFlowClientinstance
Example:
_10function EventListener() {_10 useFlowEvents({_10 eventTypes: ["A.0xDeaDBeef.SomeContract.SomeEvent"],_10 onEvent: (event) => console.log("New event:", event),_10 onError: (error) => console.error("Error:", error),_10 })_10_10 return <div>Listening for events...</div>_10}
useFlowQuery
Open in Playground →
_10import { useFlowQuery } from "@onflow/react-sdk"
Parameters:
cadence: string– Cadence script to runargs?: (arg, t) => unknown[]– Function returning FCL argumentsquery?: UseQueryOptions<unknown, Error>– Optional TanStackQuery optionsflowClient?: FlowClient- OptionalFlowClientinstance
Returns: UseQueryResult<unknown, Error>
_22function QueryExample() {_22 const { data, isLoading, error, refetch } = useFlowQuery({_22 cadence: `_22 access(all)_22 fun main(a: Int, b: Int): Int {_22 return a + b_22 }_22 `,_22 args: (arg, t) => [arg(1, t.Int), arg(2, t.Int)],_22 query: { staleTime: 10000 },_22 })_22_22 if (isLoading) return <p>Loading query...</p>_22 if (error) return <p>Error: {error.message}</p>_22_22 return (_22 <div>_22 <p>Result: {data}</p>_22 <button onClick={refetch}>Refetch</button>_22 </div>_22 )_22}
useFlowQueryRaw
Open in Playground →
_10import { useFlowQueryRaw } from "@onflow/react-sdk"
This hook is identical to useFlowQuery but returns the raw, non-decoded response data from the Flow blockchain. This is useful when you need access to the original response structure or want to handle decoding manually.
Parameters:
cadence: string– Cadence script to runargs?: (arg, t) => unknown[]– Function returning FCL argumentsquery?: UseQueryOptions<unknown, Error>– Optional TanStackQuery optionsflowClient?: FlowClient- OptionalFlowClientinstance
Returns: UseQueryResult<unknown, Error>
The returned data will be in its raw, non-decoded format as received from the Flow access node.
_22function QueryRawExample() {_22 const { data: rawData, isLoading, error, refetch } = useFlowQueryRaw({_22 cadence: `_22 access(all)_22 fun main(a: Int, b: Int): Int {_22 return a + b_22 }_22 `,_22 args: (arg, t) => [arg(1, t.Int), arg(2, t.Int)],_22 query: { staleTime: 10000 },_22 })_22_22 if (isLoading) return <p>Loading query...</p>_22 if (error) return <p>Error: {error.message}</p>_22_22 return (_22 <div>_22 <p>Raw Result: {JSON.stringify(rawData, null, 2)}</p>_22 <button onClick={refetch}>Refetch</button>_22 </div>_22 )_22}
useFlowMutate
Open in Playground →
_10import { useFlowMutate } from "@onflow/react-sdk"
Parameters:
mutation?: UseMutationOptions<string, Error, FCLMutateParams>– Optional TanStackQuery mutation optionsflowClient?: FlowClient- OptionalFlowClientinstance
Returns: UseMutationResult<string, Error, FCLMutateParams>
_33function CreatePage() {_33 const { mutate, isPending, error, data: txId } = useFlowMutate({_33 mutation: {_33 onSuccess: (txId) => console.log("TX ID:", txId),_33 },_33 })_33_33 const sendTransaction = () => {_33 mutate({_33 cadence: `transaction() {_33 prepare(acct: &Account) {_33 log(acct.address)_33 }_33 }`,_33 args: (arg, t) => [],_33 proposer: fcl.currentUser,_33 payer: fcl.currentUser,_33 authorizations: [],_33 limit: 100,_33 })_33 }_33_33 return (_33 <div>_33 <button onClick={sendTransaction} disabled={isPending}>_33 Send Transaction_33 </button>_33 {isPending && <p>Sending transaction...</p>}_33 {error && <p>Error: {error.message}</p>}_33 {txId && <p>Transaction ID: {txId}</p>}_33 </div>_33 )_33}
useFlowRevertibleRandom
Open in Playground →
_10import { useFlowRevertibleRandom } from "@onflow/react-sdk"
Parameters:
min?: string– Minimum random value (inclusive), as a UInt256 decimal string. Defaults to"0".max: string– Maximum random value (inclusive), as a UInt256 decimal string. Required.count?: number– Number of random values to fetch (must be at least 1). Defaults to1.query?: Omit<UseQueryOptions<any, Error>, "queryKey" | "queryFn">– Optional TanStack Query settings likestaleTime,enabled,retry, etc.flowClient?: FlowClient- OptionalFlowClientinstance
Returns: UseQueryResult<RevertibleRandomResult[], Error>
Each RevertibleRandomResult includes:
blockHeight: string— The block height from which the random value was generated.value: string— The random UInt256 value, returned as a decimal string.
_26function RandomValues() {_26 const { data: randoms, isLoading, error, refetch } = useFlowRevertibleRandom({_26 min: "0",_26 max: "1000000000000000000000000", // Example large max_26 count: 3,_26 query: { staleTime: 10000 },_26 })_26_26 if (isLoading) return <p>Loading random numbers...</p>_26 if (error) return <p>Error fetching random numbers: {error.message}</p>_26 if (!randoms) return <p>No random values generated.</p>_26_26 return (_26 <div>_26 <h2>Generated Random Numbers</h2>_26 <ul>_26 {randoms.map((rand, idx) => (_26 <li key={idx}>_26 Block {rand.blockHeight}: {rand.value}_26 </li>_26 ))}_26 </ul>_26 <button onClick={refetch}>Regenerate</button>_26 </div>_26 )_26}
Notes:
- Randomness is generated using the onchain
revertibleRandomfunction on Flow, producing pseudorandom values tied to block and script execution. - Values are deterministic: The values returned for identical calls within the same block will be identical.
- If
countis larger than one, the returned values are distinct. - This hook is designed for simple use cases that don't require unpredictability, such as randomized UIs. Since the hook uses script executions on existing blocks, the random source is already public and the randoms are predictable.
- For more advanced use cases that do require onchain randomness logic via transactions, Flow provides built-in support using Cadence's
revertibleRandomand commit-reveal scheme.
useFlowTransaction
Open in Playground →
_10import { useFlowTransaction } from "@onflow/react-sdk"
Fetches a Flow transaction by ID and returns the decoded transaction object.
Parameters:
txId?: string– The Flow transaction ID to fetch.query?: Omit<UseQueryOptions<Transaction | null, Error>, "queryKey" | "queryFn">– Optional TanStack Query options likestaleTime,enabled, etc.flowClient?: FlowClient- OptionalFlowClientinstance
Returns: UseQueryResult<Transaction | null, Error>
_19function TransactionDetails({ txId }: { txId: string }) {_19 const { data: transaction, isLoading, error, refetch } = useFlowTransaction({_19 txId,_19 query: { staleTime: 10000 },_19 })_19_19 if (isLoading) return <p>Loading transaction...</p>_19 if (error) return <p>Error fetching transaction: {error.message}</p>_19 if (!transaction) return <p>No transaction data.</p>_19_19 return (_19 <div>_19 <h2>Transaction ID: {transaction.id}</h2>_19 <p>Gas Limit: {transaction.gasLimit}</p>_19 <pre>Arguments: {JSON.stringify(transaction.arguments, null, 2)}</pre>_19 <button onClick={refetch}>Refetch</button>_19 </div>_19 )_19}
useFlowTransactionStatus
Open in Playground →
_10import { useFlowTransactionStatus } from "@onflow/react-sdk"
Parameters:
id: string– Transaction ID to subscribe toflowClient?: FlowClient- OptionalFlowClientinstance
Returns:
transactionStatus: TransactionStatus | nullerror: Error | null
_10function TransactionStatusComponent() {_10 const txId = "your-transaction-id-here"_10 const { transactionStatus, error } = useFlowTransactionStatus({ id: txId })_10_10 if (error) return <div>Error: {error.message}</div>;_10_10 return <div>Status: {transactionStatus?.statusString}</div>;_10}
useDarkMode
Open in Playground →
_10import { useDarkMode } from "@onflow/react-sdk"
This hook provides access to the current dark mode state from the FlowProvider. It's useful for conditionally rendering content or applying custom styling based on the current theme.
Returns:
isDark: boolean– Whether dark mode is currently enabled
_10function ThemeAwareComponent() {_10 const { isDark } = useDarkMode()_10_10 return (_10 <div className={isDark ? "bg-gray-900 text-white" : "bg-white text-black"}>_10 <h2>Current Theme: {isDark ? "Dark" : "Light"}</h2>_10 <p>This component adapts to the current theme!</p>_10 </div>_10 )_10}
useFlowNftMetadata
Open in Playground →
_10import { useFlowNftMetadata } from "@onflow/react-sdk"
This hook fetches NFT metadata including display information, traits, rarity, and collection details.
Parameters:
accountAddress?: string– Flow address of the account holding the NFTtokenId?: string | number– The NFT token IDpublicPathIdentifier?: string– Public path identifier for the collectionquery?: UseQueryOptions<unknown, Error>– Optional TanStack Query optionsflowClient?: FlowClient- OptionalFlowClientinstance
Returns: UseQueryResult<NftViewResult | null, Error>
Where NftViewResult is defined as:
_12interface NftViewResult {_12 name: string_12 description: string_12 thumbnailUrl: string_12 externalUrl?: string_12 collectionName?: string_12 collectionExternalUrl?: string_12 tokenID: string_12 traits?: Record<string, string>_12 rarity?: string_12 serialNumber?: string_12}
_32function NftMetadataExample() {_32 const { data: nft, isLoading, error } = useFlowNftMetadata({_32 accountAddress: "0x1cf0e2f2f715450",_32 tokenId: "123",_32 publicPathIdentifier: "exampleNFTCollection",_32 query: { staleTime: 60000 },_32 })_32_32 if (isLoading) return <p>Loading NFT metadata...</p>_32 if (error) return <p>Error: {error.message}</p>_32 if (!nft) return <p>NFT not found</p>_32_32 return (_32 <div>_32 <h2>{nft.name}</h2>_32 <img src={nft.thumbnailUrl} alt={nft.name} />_32 <p>{nft.description}</p>_32 {nft.collectionName && <p>Collection: {nft.collectionName}</p>}_32 {nft.rarity && <p>Rarity: {nft.rarity}</p>}_32 {nft.traits && (_32 <div>_32 <h3>Traits:</h3>_32 <ul>_32 {Object.entries(nft.traits).map(([key, value]) => (_32 <li key={key}>{key}: {value}</li>_32 ))}_32 </ul>_32 </div>_32 )}_32 </div>_32 )_32}
useFlowAuthz
_10import { useFlowAuthz } from "@onflow/react-sdk"
A React hook that returns an authorization function for Flow transactions. If no custom authorization is provided, it returns the current user's wallet authorization.
Parameters:
authz?: AuthorizationFunction– Optional custom authorization functionflowClient?: FlowClient- OptionalFlowClientinstance
Where AuthorizationFunction is defined as:
_10type AuthorizationFunction = (_10 account: Partial<InteractionAccount>_10) => Partial<InteractionAccount> | Promise<Partial<InteractionAccount>>
Returns: AuthorizationFunction
The authorization function is compatible with Flow transactions' authorizations parameter.
_21// Example 1: Using current user authorization_21function CurrentUserAuthExample() {_21 const authorization = useFlowAuthz()_21_21 const sendTransaction = async () => {_21 const txId = await fcl.mutate({_21 cadence: `_21 transaction {_21 prepare(signer: auth(Storage) &Account) {_21 log(signer.address)_21 }_21 }_21 `,_21 authorizations: [authorization],_21 limit: 100,_21 })_21 console.log("Transaction ID:", txId)_21 }_21_21 return <button onClick={sendTransaction}>Send Transaction</button>_21}
_30// Example 2: Using custom authorization function_30function CustomAuthExample() {_30 const customAuthz = (account) => ({_30 ...account,_30 addr: "0xCUSTOMOADDRESS",_30 keyId: 0,_30 signingFunction: async (signable) => ({_30 signature: "0x...",_30 }),_30 })_30_30 const authorization = useFlowAuthz({ authz: customAuthz })_30_30 const sendTransaction = async () => {_30 const txId = await fcl.mutate({_30 cadence: `_30 transaction {_30 prepare(signer: auth(Storage) &Account) {_30 log(signer.address)_30 }_30 }_30 `,_30 authorizations: [authorization],_30 limit: 100,_30 })_30 console.log("Transaction ID:", txId)_30 }_30_30 return <button onClick={sendTransaction}>Send Custom Auth Transaction</button>_30}
useFlowScheduledTransaction
Open in Playground →
_10import { useFlowScheduledTransaction } from "@onflow/react-sdk"
Fetches a scheduled transaction by ID.
Parameters:
txId?: string– Scheduled transaction IDincludeHandlerData?: boolean– Include handler data (default: false)query?: UseQueryOptions<ScheduledTransaction | null, Error>– Optional TanStack Query optionsflowClient?: FlowClient- OptionalFlowClientinstance
Returns: UseQueryResult<ScheduledTransaction | null, Error>
Where ScheduledTransaction is defined as:
_15interface ScheduledTransaction {_15 id: string_15 priority: ScheduledTransactionPriority // 0 = Low, 1 = Medium, 2 = High_15 executionEffort: bigint_15 status: ScheduledTransactionStatus // 0 = Pending, 1 = Processing, 2 = Completed, 3 = Failed, 4 = Cancelled_15 fees: {_15 value: bigint_15 formatted: string_15 }_15 scheduledTimestamp: number_15 handlerTypeIdentifier: string_15 handlerAddress: string_15 handlerUUID?: string // Only included if includeHandlerData is true_15 handlerResolvedViews?: {[viewType: string]: any} // Only included if includeHandlerData is true_15}
_20function ScheduledTransactionDetails({ txId }: { txId: string }) {_20 const { data: transaction, isLoading, error } = useFlowScheduledTransaction({_20 txId,_20 query: { staleTime: 10000 },_20 })_20_20 if (isLoading) return <p>Loading scheduled transaction...</p>_20 if (error) return <p>Error: {error.message}</p>_20 if (!transaction) return <p>Transaction not found</p>_20_20 return (_20 <div>_20 <h2>Scheduled Transaction #{transaction.id}</h2>_20 <p>Status: {transaction.status}</p>_20 <p>Priority: {transaction.priority}</p>_20 <p>Fees: {transaction.fees.formatted} FLOW</p>_20 <p>Handler: {transaction.handlerTypeIdentifier}</p>_20 </div>_20 )_20}
useFlowScheduledTransactionList
Open in Playground →
_10import { useFlowScheduledTransactionList } from "@onflow/react-sdk"
Lists all scheduled transactions for an account.
Parameters:
account?: string– Flow address to queryincludeHandlerData?: boolean– Include handler data (default: false)query?: UseQueryOptions<ScheduledTransaction[], Error>– Optional TanStack Query optionsflowClient?: FlowClient- OptionalFlowClientinstance
Returns: UseQueryResult<ScheduledTransaction[], Error>
_24function ScheduledTransactionsList({ account }: { account: string }) {_24 const { data: transactions, isLoading, error, refetch } = useFlowScheduledTransactionList({_24 account,_24 query: { staleTime: 10000 },_24 })_24_24 if (isLoading) return <p>Loading scheduled transactions...</p>_24 if (error) return <p>Error: {error.message}</p>_24 if (!transactions || transactions.length === 0) return <p>No scheduled transactions</p>_24_24 return (_24 <div>_24 <h2>Scheduled Transactions for {account}</h2>_24 <button onClick={() => refetch()}>Refresh</button>_24 <ul>_24 {transactions.map((tx) => (_24 <li key={tx.id}>_24 Transaction #{tx.id} - Status: {tx.status} - Fees: {tx.fees.formatted} FLOW_24 </li>_24 ))}_24 </ul>_24 </div>_24 )_24}
useFlowScheduledTransactionCancel
Open in Playground →
_10import { useFlowScheduledTransactionCancel } from "@onflow/react-sdk"
Cancels a scheduled transaction and refunds fees.
Parameters:
mutation?: UseMutationOptions<string, Error, string>– Optional TanStack Query mutation optionsflowClient?: FlowClient- OptionalFlowClientinstance
Returns: UseFlowScheduledTransactionCancelResult
Where UseFlowScheduledTransactionCancelResult is defined as:
_10interface UseFlowScheduledTransactionCancelResult extends Omit<_10 UseMutationResult<string, Error>,_10 "mutate" | "mutateAsync"_10> {_10 cancelTransaction: (txId: string) => void_10 cancelTransactionAsync: (txId: string) => Promise<string>_10}
_27function CancelScheduledTransaction() {_27 const { cancelTransactionAsync, isPending, error, data: txId } = useFlowScheduledTransactionCancel({_27 mutation: {_27 onSuccess: (txId) => console.log("Cancel transaction ID:", txId),_27 },_27 })_27_27 const handleCancel = async (scheduledTxId: string) => {_27 try {_27 const resultTxId = await cancelTransactionAsync(scheduledTxId)_27 console.log("Successfully canceled scheduled transaction:", resultTxId)_27 } catch (error) {_27 console.error("Failed to cancel:", error)_27 }_27 }_27_27 return (_27 <div>_27 <button onClick={() => handleCancel("42")} disabled={isPending}>_27 Cancel Scheduled Transaction #42_27 </button>_27 {isPending && <p>Canceling transaction...</p>}_27 {error && <p>Error: {error.message}</p>}_27 {txId && <p>Cancel Transaction ID: {txId}</p>}_27 </div>_27 )_27}
useFlowScheduledTransactionSetup
Open in Playground →
_10import { useFlowScheduledTransactionSetup } from "@onflow/react-sdk"
Sets up the Transaction Scheduler Manager resource.
Parameters:
mutation?: UseMutationOptions<string, Error, void>– Optional TanStack Query mutation optionsflowClient?: FlowClient- OptionalFlowClientinstance
Returns: UseFlowScheduledTransactionSetupResult
Where UseFlowScheduledTransactionSetupResult is defined as:
_10interface UseFlowScheduledTransactionSetupResult extends Omit<_10 UseMutationResult<string, Error>,_10 "mutate" | "mutateAsync"_10> {_10 setup: () => void_10 setupAsync: () => Promise<string>_10}
_27function SchedulerSetup() {_27 const { setupAsync, isPending, error, data: txId } = useFlowScheduledTransactionSetup({_27 mutation: {_27 onSuccess: (txId) => console.log("Setup transaction ID:", txId),_27 },_27 })_27_27 const handleSetup = async () => {_27 try {_27 const resultTxId = await setupAsync()_27 console.log("Scheduler setup successful:", resultTxId)_27 } catch (error) {_27 console.error("Setup failed:", error)_27 }_27 }_27_27 return (_27 <div>_27 <button onClick={handleSetup} disabled={isPending}>_27 Setup Transaction Scheduler_27 </button>_27 {isPending && <p>Setting up scheduler...</p>}_27 {error && <p>Error: {error.message}</p>}_27 {txId && <p>Setup Transaction ID: {txId}</p>}_27 </div>_27 )_27}
Cross-VM Hooks
useCrossVmBatchTransaction
Open in Playground →
_10import { useCrossVmBatchTransaction } from "@onflow/react-sdk"
This hook allows you to execute multiple EVM transactions in a single atomic Cadence transaction. It is useful for batch processing EVM calls while ensuring they are executed together, either all succeeding or allowing for some to fail without affecting the others.
Parameters:
mutation?: UseMutationOptions<string, Error, UseCrossVmBatchTransactionMutateArgs>– Optional TanStackQuery mutation optionsflowClient?: FlowClient- OptionalFlowClientinstance
Returns: UseCrossVmBatchTransactionResult
Where UseCrossVmBatchTransactionResult is defined as:
_10interface UseCrossVmBatchTransactionResult extends Omit<_10 UseMutationResult<string, Error, UseCrossVmBatchTransactionMutateArgs>,_10 "mutate" | "mutateAsync"_10> {_10 mutate: (calls: UseCrossVmBatchTransactionMutateArgs) => void_10 mutateAsync: (calls: UseCrossVmBatchTransactionMutateArgs) => Promise<string>_10}
Where UseCrossVmBatchTransactionMutateArgs is defined as:
_10interface UseCrossVmBatchTransactionMutateArgs {_10 calls: EvmBatchCall[]_10 mustPass?: boolean_10}
Where EvmBatchCall is defined as:
_14interface EvmBatchCall {_14 // The target EVM contract address (as a string)_14 address: string_14 // The contract ABI fragment_14 abi: Abi_14 // The name of the function to call_14 functionName: string_14 // The function arguments_14 args?: readonly unknown[]_14 // The gas limit for the call_14 gasLimit?: bigint_14 // The value to send with the call_14 value?: bigint_14}
_35function CrossVmBatchTransactionExample() {_35 const { sendBatchTransaction, isPending, error, data: txId } = useCrossVmBatchTransaction({_35 mutation: {_35 onSuccess: (txId) => console.log("TX ID:", txId),_35 },_35 })_35_35 const sendTransaction = () => {_35 const calls = [_35 {_35 address: "0x1234567890abcdef",_35 abi: {_35 // ABI definition for the contract_35 },_35 functionName: "transfer",_35 args: ["0xabcdef1234567890", 100n], // Example arguments_35 gasLimit: 21000n, // Example gas limit_35 },_35 // Add more calls as needed_35 ]_35_35 sendBatchTransaction({calls})_35 }_35_35 return (_35 <div>_35 <button onClick={sendTransaction} disabled={isPending}>_35 Send Cross-VM Transaction_35 </button>_35 {isPending && <p>Sending transaction...</p>}_35 {error && <p>Error: {error.message}</p>}_35 {txId && <p>Transaction ID: {txId}</p>}_35 </div>_35 )_35}
useCrossVmTokenBalance
Open in Playground →
_10import { useCrossVmTokenBalance } from "@onflow/react-sdk"
Fetch the balance of a token balance for a given user across both Cadence and EVM environments.
Parameters:
owner: string– Cadence address of the account whose token balances you want.vaultIdentifier?: string– Optional Cadence resource identifier (e.g. "0x1cf0e2f2f715450.FlowToken.Vault") for onchain balanceerc20AddressHexArg?: string– Optional bridged ERC-20 contract address (hex) for EVM/COA balancequery?: Omit<UseQueryOptions<unknown, Error>, "queryKey" | "queryFn">– Optional TanStack Query config (e.g. staleTime, enabled)flowClient?: FlowClient- OptionalFlowClientinstance
Note: You must pass
owner, and one ofvaultIdentifierorerc20AddressHexArg.
Returns: UseQueryResult<UseCrossVmTokenBalanceData | null, Error>
Where UseCrossVmTokenBalanceData is defined as:
_10interface UseCrossVmTokenBalanceData {_10 cadence: TokenBalance // Token balance of Cadence vault_10 evm: TokenBalance // Token balance of EVM (COA stored in /storage/coa)_10 combined: TokenBalance // Combined balance of both Cadence and EVM_10}
Where TokenBalance is defined as:
_10interface TokenBalance {_10 value: bigint // Balance value in smallest unit_10 formatted: string // Formatted balance string (e.g. "123.45")_10 precision: number // Number of decimal places for the token_10}
_20function UseCrossVmTokenBalanceExample() {_20 const { data, isLoading, error, refetch } = useCrossVmTokenBalance({_20 owner: '0x1e4aa0b87d10b141',_20 vaultIdentifier: 'A.1654653399040a61.FlowToken.Vault',_20 query: { staleTime: 10000 },_20 });_20_20 if (isLoading) return <p>Loading token balance...</p>;_20 if (error) return <p>Error fetching token balance: {error.message}</p>;_20_20 return (_20 <div>_20 <h2>Token Balances</h2>_20 <p>Cadence Balance: {data.cadence.formatted} (Value: {data.cadence.value})</p>_20 <p>EVM Balance: {data.evm.formatted} (Value: {data.evm.value})</p>_20 <p>Combined Balance: {data.combined.formatted} (Value: {data.combined.value})</p>_20 <button onClick={refetch}>Refetch</button>_20 </div>_20 )_20}
useCrossVmTransactionStatus
Open in Playground →
_10import { useCrossVmTransactionStatus } from "@onflow/react-sdk"
Subscribes to status updates for a given Cross-VM Flow transaction ID that executes EVM calls. This hook monitors the transaction status and extracts EVM call results if available.
Parameters:
id?: string– Optional Flow transaction ID to monitorflowClient?: FlowClient- OptionalFlowClientinstance
Returns: UseCrossVmTransactionStatusResult
Where UseCrossVmTransactionStatusResult is defined as:
_10interface UseCrossVmTransactionStatusResult {_10 transactionStatus: TransactionStatus | null // Latest transaction status, or null before any update_10 evmResults?: CallOutcome[] // EVM transaction results, if available_10 error: Error | null // Any error encountered during status updates_10}
Where CallOutcome is defined as:
_10interface CallOutcome {_10 status: "passed" | "failed" | "skipped" // Status of the EVM call_10 hash?: string // EVM transaction hash if available_10 errorMessage?: string // Error message if the call failed_10}
_26function CrossVmTransactionStatusComponent() {_26 const txId = "your-cross-vm-transaction-id-here"_26 const { transactionStatus, evmResults, error } = useCrossVmTransactionStatus({ id: txId })_26_26 if (error) return <div>Error: {error.message}</div>_26_26 return (_26 <div>_26 <div>Flow Status: {transactionStatus?.statusString}</div>_26 {evmResults && evmResults.length > 0 && (_26 <div>_26 <h3>EVM Call Results:</h3>_26 <ul>_26 {evmResults.map((result, idx) => (_26 <li key={idx}>_26 Status: {result.status}_26 {result.hash && <span> | Hash: {result.hash}</span>}_26 {result.errorMessage && <span> | Error: {result.errorMessage}</span>}_26 </li>_26 ))}_26 </ul>_26 </div>_26 )}_26 </div>_26 )_26}
useCrossVmBridgeNftFromEvm
Open in Playground →
_10import { useCrossVmBridgeNftFromEvm } from "@onflow/react-sdk"
This hook bridges NFTs from Flow EVM to Cadence. It withdraws an NFT from the signer's COA (Cadence Owned Account) in EVM and deposits it into their Cadence collection.
Parameters:
mutation?: UseMutationOptions<string, Error, UseCrossVmBridgeNftFromEvmTxMutateArgs>– Optional TanStackQuery mutation optionsflowClient?: FlowClient- OptionalFlowClientinstance
Returns: UseCrossVmBridgeNftFromEvmTxResult
Where UseCrossVmBridgeNftFromEvmTxResult is defined as:
_10interface UseCrossVmBridgeNftFromEvmTxResult extends Omit<_10 UseMutationResult<string, Error>,_10 "mutate" | "mutateAsync"_10> {_10 crossVmBridgeNftFromEvm: (args: UseCrossVmBridgeNftFromEvmTxMutateArgs) => void_10 crossVmBridgeNftFromEvmAsync: (args: UseCrossVmBridgeNftFromEvmTxMutateArgs) => Promise<string>_10}
Where UseCrossVmBridgeNftFromEvmTxMutateArgs is defined as:
_10interface UseCrossVmBridgeNftFromEvmTxMutateArgs {_10 nftIdentifier: string // Cadence type identifier (e.g., "A.0x123.MyNFT.NFT")_10 nftId: string // EVM NFT ID as string representation of UInt256_10}
_25function BridgeNftFromEvmExample() {_25 const { crossVmBridgeNftFromEvm, isPending, error, data: txId } = useCrossVmBridgeNftFromEvm({_25 mutation: {_25 onSuccess: (txId) => console.log("Transaction ID:", txId),_25 },_25 })_25_25 const handleBridge = () => {_25 crossVmBridgeNftFromEvm({_25 nftIdentifier: "A.0x1cf0e2f2f715450.ExampleNFT.NFT",_25 nftId: "123",_25 })_25 }_25_25 return (_25 <div>_25 <button onClick={handleBridge} disabled={isPending}>_25 Bridge NFT from EVM_25 </button>_25 {isPending && <p>Bridging NFT...</p>}_25 {error && <p>Error: {error.message}</p>}_25 {txId && <p>Transaction ID: {txId}</p>}_25 </div>_25 )_25}
useCrossVmBridgeNftToEvm
Open in Playground →
_10import { useCrossVmBridgeNftToEvm } from "@onflow/react-sdk"
This hook bridges NFTs from Cadence to Flow EVM and executes arbitrary EVM transactions atomically. It withdraws NFTs from the signer's Cadence collection and deposits them into their COA in EVM, then executes the provided EVM calls.
Parameters:
mutation?: UseMutationOptions<string, Error, UseCrossVmBridgeNftToEvmTxMutateArgs>– Optional TanStackQuery mutation optionsflowClient?: FlowClient- OptionalFlowClientinstance
Returns: UseCrossVmBridgeNftToEvmTxResult
Where UseCrossVmBridgeNftToEvmTxResult is defined as:
_10interface UseCrossVmBridgeNftToEvmTxResult extends Omit<_10 UseMutationResult<string, Error>,_10 "mutate" | "mutateAsync"_10> {_10 crossVmBridgeNftToEvm: (args: UseCrossVmBridgeNftToEvmTxMutateArgs) => void_10 crossVmBridgeNftToEvmAsync: (args: UseCrossVmBridgeNftToEvmTxMutateArgs) => Promise<string>_10}
Where UseCrossVmBridgeNftToEvmTxMutateArgs is defined as:
_10interface UseCrossVmBridgeNftToEvmTxMutateArgs {_10 nftIdentifier: string // Cadence NFT type identifier_10 nftIds: string[] // Array of NFT IDs to bridge_10 calls: EvmBatchCall[] // Array of EVM calls to execute after bridging_10}
_34function BridgeNftToEvmExample() {_34 const { crossVmBridgeNftToEvm, isPending, error, data: txId } = useCrossVmBridgeNftToEvm({_34 mutation: {_34 onSuccess: (txId) => console.log("Transaction ID:", txId),_34 },_34 })_34_34 const handleBridge = () => {_34 crossVmBridgeNftToEvm({_34 nftIdentifier: "A.0x1cf0e2f2f715450.ExampleNFT.NFT",_34 nftIds: ["1", "2", "3"],_34 calls: [_34 {_34 address: "0x1234567890abcdef1234567890abcdef12345678",_34 abi: myContractAbi,_34 functionName: "transferNFT",_34 args: ["0xRecipient", 1n],_34 gasLimit: 100000n,_34 },_34 ],_34 })_34 }_34_34 return (_34 <div>_34 <button onClick={handleBridge} disabled={isPending}>_34 Bridge NFTs to EVM_34 </button>_34 {isPending && <p>Bridging NFTs...</p>}_34 {error && <p>Error: {error.message}</p>}_34 {txId && <p>Transaction ID: {txId}</p>}_34 </div>_34 )_34}
useCrossVmBridgeTokenFromEvm
Open in Playground →
_10import { useCrossVmBridgeTokenFromEvm } from "@onflow/react-sdk"
This hook bridges fungible tokens from Flow EVM to Cadence. It withdraws tokens from the signer's COA in EVM and deposits them into their Cadence vault.
Parameters:
mutation?: UseMutationOptions<string, Error, UseCrossVmBridgeTokenFromEvmMutateArgs>– Optional TanStackQuery mutation optionsflowClient?: FlowClient- OptionalFlowClientinstance
Returns: UseCrossVmBridgeTokenFromEvmResult
Where UseCrossVmBridgeTokenFromEvmResult is defined as:
_10interface UseCrossVmBridgeTokenFromEvmResult extends Omit<_10 UseMutationResult<string, Error>,_10 "mutate" | "mutateAsync"_10> {_10 crossVmBridgeTokenFromEvm: (args: UseCrossVmBridgeTokenFromEvmMutateArgs) => void_10 crossVmBridgeTokenFromEvmAsync: (args: UseCrossVmBridgeTokenFromEvmMutateArgs) => Promise<string>_10}
Where UseCrossVmBridgeTokenFromEvmMutateArgs is defined as:
_10interface UseCrossVmBridgeTokenFromEvmMutateArgs {_10 vaultIdentifier: string // Cadence vault type identifier (e.g., "A.0x123.FlowToken.Vault")_10 amount: string // Amount as UInt256 string representation_10}
_25function BridgeTokenFromEvmExample() {_25 const { crossVmBridgeTokenFromEvm, isPending, error, data: txId } = useCrossVmBridgeTokenFromEvm({_25 mutation: {_25 onSuccess: (txId) => console.log("Transaction ID:", txId),_25 },_25 })_25_25 const handleBridge = () => {_25 crossVmBridgeTokenFromEvm({_25 vaultIdentifier: "A.0x1654653399040a61.FlowToken.Vault",_25 amount: "1000000000", // Amount in smallest unit_25 })_25 }_25_25 return (_25 <div>_25 <button onClick={handleBridge} disabled={isPending}>_25 Bridge Tokens from EVM_25 </button>_25 {isPending && <p>Bridging tokens...</p>}_25 {error && <p>Error: {error.message}</p>}_25 {txId && <p>Transaction ID: {txId}</p>}_25 </div>_25 )_25}
useCrossVmBridgeTokenToEvm
Open in Playground →
_10import { useCrossVmBridgeTokenToEvm } from "@onflow/react-sdk"
This hook bridges fungible tokens from Cadence to Flow EVM and executes arbitrary EVM transactions atomically. It withdraws tokens from the signer's Cadence vault and deposits them into their COA in EVM, then executes the provided EVM calls.
Parameters:
mutation?: UseMutationOptions<string, Error, UseCrossVmBridgeTokenToEvmMutateArgs>– Optional TanStackQuery mutation optionsflowClient?: FlowClient- OptionalFlowClientinstance
Returns: UseCrossVmBridgeTokenToEvmResult
Where UseCrossVmBridgeTokenToEvmResult is defined as:
_10interface UseCrossVmBridgeTokenToEvmResult extends Omit<_10 UseMutationResult<string, Error>,_10 "mutate" | "mutateAsync"_10> {_10 crossVmBridgeTokenToEvm: (args: UseCrossVmBridgeTokenToEvmMutateArgs) => void_10 crossVmBridgeTokenToEvmAsync: (args: UseCrossVmBridgeTokenToEvmMutateArgs) => Promise<string>_10}
Where UseCrossVmBridgeTokenToEvmMutateArgs is defined as:
_10interface UseCrossVmBridgeTokenToEvmMutateArgs {_10 vaultIdentifier: string // Cadence vault type identifier_10 amount: string // Amount as decimal string (e.g., "1.5")_10 calls: EvmBatchCall[] // Array of EVM calls to execute after bridging_10}
_34function BridgeTokenToEvmExample() {_34 const { crossVmBridgeTokenToEvm, isPending, error, data: txId } = useCrossVmBridgeTokenToEvm({_34 mutation: {_34 onSuccess: (txId) => console.log("Transaction ID:", txId),_34 },_34 })_34_34 const handleBridge = () => {_34 crossVmBridgeTokenToEvm({_34 vaultIdentifier: "A.0x1654653399040a61.FlowToken.Vault",_34 amount: "10.5",_34 calls: [_34 {_34 address: "0x1234567890abcdef1234567890abcdef12345678",_34 abi: erc20Abi,_34 functionName: "transfer",_34 args: ["0xRecipient", 1000000n],_34 gasLimit: 100000n,_34 },_34 ],_34 })_34 }_34_34 return (_34 <div>_34 <button onClick={handleBridge} disabled={isPending}>_34 Bridge Tokens to EVM_34 </button>_34 {isPending && <p>Bridging tokens...</p>}_34 {error && <p>Error: {error.message}</p>}_34 {txId && <p>Transaction ID: {txId}</p>}_34 </div>_34 )_34}