Skip to main content
We’ve introduced UI Logs for Gelato Bundler endpoints!
  • You can now track all your requests directly in the dashboard, and easily debug failed requests using built-in Tenderly simulations.
  • Additionally, you can get info such as response time, request body, response body, and more.

Debugging Failed Requests Using UI Logs

You can use the UI logs to debug failed requests directly from the Gelato app. These logs are available in the Paymaster & Bundler section of the dashboard. Paymaster & Bundler Logs

Steps to Debug

  1. Go to the logs section and locate your failed relay request.
  2. On the right side of the log entry, click the Debug button.
  3. A new option, View Debug, will appear. Click it.
  4. This will open a Tenderly simulation, which you can use to analyze and debug the failed request.

Using Status Endpoint

If you call the relayer_sendTransaction or relayer_sendTransactionSync API endpoints, the returned id can also be used to track the status of the transaction through Gelato’s infrastructure like this:
curl --request POST \
  --url https://api.gelato.cloud/rpc \
  --header 'Content-Type: application/json' \
  --header 'X-API-Key: YOUR_API_KEY' \
  --data '{
  "id": 1,
  "jsonrpc": "2.0",
  "method": "relayer_getStatus",
  "params": {
    "id": "0x0e670ec64341771606e55d6b4ca35a1a6b75ee3d5145a99d05921026d1527331",
    "logs": false
  }
}'

Response

{
  "jsonrpc": "2.0",
  "id": 1,
  "result": {
    "id": "0x0e670ec64341771606e55d6b4ca35a1a6b75ee3d5145a99d05921026d1527331",
    "status": 200,
    "message": "Transaction included",
    "receipt": {
      "transactionHash": "0x...",
      "blockNumber": 12345678,
      "gasUsed": "21000"
    }
  }
}

Status Codes

The relayer_getStatus endpoint returns numeric status codes:
CodeStatusDescription
100PendingTransaction is queued and waiting to be processed
110SubmittedTransaction has been submitted to the network
200IncludedTransaction was successfully included in a block
400RejectedTransaction was rejected (invalid parameters, insufficient funds, etc.)
500RevertedTransaction was included but execution reverted

Using Status Codes in Code

When using the SDK, you can import StatusCode for type-safe comparisons:
import { StatusCode } from '@gelatocloud/gasless';

const result = await relayer.sendTransactionSync({ ... });

if (result.status === StatusCode.Included) {
  console.log(`Success! Hash: ${result.receipt.transactionHash}`);
} else if (result.status === StatusCode.Reverted) {
  console.log(`Transaction reverted: ${result.message}`);
} else if (result.status === StatusCode.Rejected) {
  console.log(`Transaction rejected: ${result.message}`);
}
When using the API directly, check against the numeric values:
const data = await response.json();
const status = data.result.status;

// Terminal states
if (status === 200) {
  console.log('Transaction included');
} else if (status === 400) {
  console.log('Transaction rejected');
} else if (status === 500) {
  console.log('Transaction reverted');
}
// Non-terminal states (keep polling)
else if (status === 100 || status === 110) {
  console.log('Transaction pending...');
}