Skip to content

Commit 7192271

Browse files
authored
feat: add new gelato_getStatus endpoint (#9)
* feat: add Gelato status handling to EVM relayer - Introduced `getGelatoStatus` and `waitForGelatoStatus` actions for querying and waiting on Gelato transaction statuses. - Updated `GelatoEvmRelayerClient` to include new methods for Gelato status retrieval. - Added schemas for Gelato status and terminal status using Zod for validation. * feat: add gelato_getStatus endpoint - Introduced a new endpoint for retrieving Gelato transaction statuses. - Updated the changeset to reflect the patch for "@gelatocloud/gasless".
1 parent 0e11b9b commit 7192271

5 files changed

Lines changed: 143 additions & 0 deletions

File tree

.changeset/sixty-hats-boil.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"@gelatocloud/gasless": patch
3+
---
4+
5+
added new gelato_getStatus endpoint
Lines changed: 99 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,99 @@
1+
import type { Transport } from 'viem';
2+
import { z } from 'zod';
3+
import { evmAddressSchema, hexData32Schema, hexDataSchema } from '../../../types/index.js';
4+
5+
export enum GelatoStatusCode {
6+
Pending = 100,
7+
Submitted = 110,
8+
Included = 200,
9+
Finalized = 210,
10+
Rejected = 400,
11+
Reverted = 500
12+
}
13+
14+
const logSchema = z.object({
15+
address: evmAddressSchema,
16+
data: hexDataSchema,
17+
topics: z.array(hexData32Schema)
18+
});
19+
20+
const receiptSchema = z.object({
21+
blockHash: hexData32Schema,
22+
blockNumber: z.coerce.bigint(),
23+
gasUsed: z.coerce.bigint(),
24+
logs: z.array(logSchema).optional(),
25+
transactionHash: hexData32Schema
26+
});
27+
28+
const baseStatusSchema = z.object({
29+
chainId: z.coerce.number(),
30+
createdAt: z.number()
31+
});
32+
33+
const pendingStatusSchema = baseStatusSchema.extend({
34+
status: z.literal(GelatoStatusCode.Pending)
35+
});
36+
37+
const submittedStatusSchema = baseStatusSchema.extend({
38+
hash: hexData32Schema,
39+
status: z.literal(GelatoStatusCode.Submitted)
40+
});
41+
42+
const includedStatusSchema = baseStatusSchema.extend({
43+
receipt: receiptSchema,
44+
status: z.literal(GelatoStatusCode.Included)
45+
});
46+
47+
const finalizedStatusSchema = baseStatusSchema.extend({
48+
receipt: receiptSchema,
49+
status: z.literal(GelatoStatusCode.Finalized)
50+
});
51+
52+
const rejectedStatusSchema = baseStatusSchema.extend({
53+
data: z.unknown().optional(),
54+
message: z.string(),
55+
status: z.literal(GelatoStatusCode.Rejected)
56+
});
57+
58+
const revertedStatusSchema = baseStatusSchema.extend({
59+
data: z.string(),
60+
message: z.string().optional(),
61+
status: z.literal(GelatoStatusCode.Reverted)
62+
});
63+
64+
export const gelatoTerminalStatusSchema = z.discriminatedUnion('status', [
65+
finalizedStatusSchema,
66+
rejectedStatusSchema,
67+
revertedStatusSchema
68+
]);
69+
70+
export const gelatoStatusSchema = z.discriminatedUnion('status', [
71+
pendingStatusSchema,
72+
submittedStatusSchema,
73+
includedStatusSchema,
74+
finalizedStatusSchema,
75+
rejectedStatusSchema,
76+
revertedStatusSchema
77+
]);
78+
79+
export type GelatoTerminalStatus = z.infer<typeof gelatoTerminalStatusSchema>;
80+
81+
export type GelatoStatus = z.infer<typeof gelatoStatusSchema>;
82+
83+
export type GetGelatoStatusParameters = {
84+
id: string;
85+
};
86+
87+
export const getGelatoStatus = async (
88+
client: ReturnType<Transport>,
89+
parameters: GetGelatoStatusParameters
90+
): Promise<GelatoStatus> => {
91+
const { id } = parameters;
92+
93+
const result = await client.request({
94+
method: 'gelato_getStatus',
95+
params: { id }
96+
});
97+
98+
return gelatoStatusSchema.parse(result);
99+
};

src/relayer/evm/actions/index.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
export * from './getCapabilities.js';
22
export * from './getFeeData.js';
33
export * from './getFeeQuote.js';
4+
export * from './getGelatoStatus.js';
45
export * from './getStatus.js';
56
export * from './sendTransaction.js';
67
export * from './sendTransactionSync.js';
8+
export * from './waitForGelatoStatus.js';
79
export * from './waitForStatus.js';
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
import type { Transport } from 'viem';
2+
import {
3+
GelatoStatusCode,
4+
type GelatoTerminalStatus,
5+
type GetGelatoStatusParameters,
6+
getGelatoStatus
7+
} from './getGelatoStatus.js';
8+
9+
// TODO: use websockets
10+
// TODO: make polling interval configurable
11+
export const waitForGelatoStatus = async (
12+
client: ReturnType<Transport>,
13+
parameters: GetGelatoStatusParameters
14+
): Promise<GelatoTerminalStatus> => {
15+
while (true) {
16+
const status = await getGelatoStatus(client, parameters);
17+
18+
if (
19+
status.status !== GelatoStatusCode.Pending &&
20+
status.status !== GelatoStatusCode.Submitted &&
21+
status.status !== GelatoStatusCode.Included
22+
) {
23+
return status;
24+
}
25+
26+
await new Promise((r) => setTimeout(r, 100));
27+
}
28+
};

src/relayer/evm/index.ts

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,19 +4,24 @@ import {
44
type Capabilities,
55
type FeeData,
66
type FeeQuote,
7+
type GelatoStatus,
8+
type GelatoTerminalStatus,
79
type GetFeeDataParameters,
810
type GetFeeQuoteParameters,
11+
type GetGelatoStatusParameters,
912
type GetStatusParameters,
1013
getCapabilities,
1114
getFeeData,
1215
getFeeQuote,
16+
getGelatoStatus,
1317
getStatus,
1418
type SendTransactionParameters,
1519
type SendTransactionSyncParameters,
1620
type Status,
1721
sendTransaction,
1822
sendTransactionSync,
1923
type TerminalStatus,
24+
waitForGelatoStatus,
2025
waitForStatus
2126
} from './actions/index.js';
2227

@@ -26,7 +31,9 @@ export type GelatoEvmRelayerClient = {
2631
getCapabilities: () => Promise<Capabilities>;
2732
getFeeData: (parameters: GetFeeDataParameters) => Promise<FeeData>;
2833
getFeeQuote: (parameters: GetFeeQuoteParameters) => Promise<FeeQuote>;
34+
getGelatoStatus: (parameters: GetGelatoStatusParameters) => Promise<GelatoStatus>;
2935
getStatus: (parameters: GetStatusParameters) => Promise<Status>;
36+
waitForGelatoStatus: (parameters: GetGelatoStatusParameters) => Promise<GelatoTerminalStatus>;
3037
waitForStatus: (parameters: GetStatusParameters) => Promise<TerminalStatus>;
3138
sendTransaction: (parameters: SendTransactionParameters) => Promise<Hex>;
3239
sendTransactionSync: (parameters: SendTransactionSyncParameters) => Promise<TerminalStatus>;
@@ -60,9 +67,11 @@ export const createGelatoEvmRelayerClient = (
6067
getCapabilities: () => getCapabilities(client),
6168
getFeeData: (parameters) => getFeeData(client, parameters),
6269
getFeeQuote: (parameters) => getFeeQuote(client, parameters),
70+
getGelatoStatus: (parameters) => getGelatoStatus(client, parameters),
6371
getStatus: (parameters) => getStatus(client, parameters),
6472
sendTransaction: (parameters) => sendTransaction(client, parameters),
6573
sendTransactionSync: (parameters) => sendTransactionSync(client, parameters),
74+
waitForGelatoStatus: (parameters) => waitForGelatoStatus(client, parameters),
6675
waitForStatus: (parameters) => waitForStatus(client, parameters)
6776
};
6877
};

0 commit comments

Comments
 (0)