Skip to main content
Send transactions and wait for the final result in a single call. Sync methods are ideal for fast chains where you want immediate confirmation feedback.

Getting Started

1

Import Dependencies

import { createGelatoEvmRelayerClient, sponsored, StatusCode } from '@gelatocloud/gasless';
2

Create Relayer Client

To create an API Key, visit the Gelato App and navigate to Relayer > API Keys.
const relayer = createGelatoEvmRelayerClient({
  apiKey: process.env.GELATO_API_KEY,
  testnet: true // Use false for mainnet
});
3

Send Sync Transaction

Submit a transaction and wait for the final result:
const status = await relayer.sendTransactionSync({
  chainId: 84532,
  to: '0xContractAddress',
  data: '0xCalldata',
  payment: sponsored(),
  timeout: 30000  // Required: max wait time in ms
});

if (status.status === StatusCode.Included) {
  console.log('TX hash:', status.receipt.transactionHash);
} else {
  console.log('Failed:', status.message);
}

Parameters

ParameterTypeRequiredDescription
chainIdnumberYesTarget chain ID
toAddressYesTarget contract address
dataHexYesTransaction calldata
paymentPaymentYessponsored(), token(addr), or native()
timeoutnumberYesMax wait time in milliseconds
authorizationListAuthorization[]NoEIP-7702 authorizations
contextunknownNoOptional context (e.g., from fee quote)

Return Type: TerminalStatus

The sync method returns a TerminalStatus object:
type TerminalStatus = {
  status: StatusCode.Included | StatusCode.Rejected | StatusCode.Reverted;
  receipt?: {
    transactionHash: Hex;
    blockNumber: bigint;
    // ... other receipt fields
  };
  message?: string;  // Error message if rejected/reverted
  data?: unknown;    // Additional error data
};
Status codes:
CodeValueDescription
Included200Transaction successfully included on-chain
Rejected400Transaction rejected by relayer
Reverted500Transaction reverted on-chain

Async vs Sync Comparison

// Returns immediately with task ID
const taskId = await relayer.sendTransaction({
  chainId: 84532,
  to: '0xContract',
  data: '0xCalldata',
  payment: sponsored()
});

// Poll for status separately
const status = await relayer.waitForStatus({ id: taskId });

Additional Resources