@layerzerolabs/gated-transaction 0.0.29 → 0.0.31

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (51) hide show
  1. package/.turbo/turbo-build.log +34 -34
  2. package/.turbo/turbo-test.log +4 -4
  3. package/dist/{AYIRG6WY.cjs → 3SOQJCDG.cjs} +16 -4
  4. package/dist/3SOQJCDG.cjs.map +1 -0
  5. package/dist/{QGZD4SJ4.cjs → 422FLJZW.cjs} +5 -5
  6. package/dist/422FLJZW.cjs.map +1 -0
  7. package/dist/{6NWNACVT.cjs → 4ND4S3IS.cjs} +23 -24
  8. package/dist/4ND4S3IS.cjs.map +1 -0
  9. package/dist/{CG43CWKE.js → BCFOKBQQ.js} +105 -51
  10. package/dist/BCFOKBQQ.js.map +1 -0
  11. package/dist/{GMAAYDJ4.js → PGJAXI5M.js} +23 -25
  12. package/dist/PGJAXI5M.js.map +1 -0
  13. package/dist/{DBJG544E.js → TLPNG7S6.js} +3 -3
  14. package/dist/TLPNG7S6.js.map +1 -0
  15. package/dist/{XYULD3ZM.cjs → TYY6L3E5.cjs} +109 -55
  16. package/dist/TYY6L3E5.cjs.map +1 -0
  17. package/dist/WWHK47IY.js +25 -0
  18. package/dist/WWHK47IY.js.map +1 -0
  19. package/dist/gatedTransactionSignalLock.cjs +5 -5
  20. package/dist/gatedTransactionSignalLock.d.ts +2 -4
  21. package/dist/gatedTransactionSignalLock.d.ts.map +1 -1
  22. package/dist/gatedTransactionSignalLock.js +2 -2
  23. package/dist/gatedTx.cjs +7 -3
  24. package/dist/gatedTx.d.ts +28 -5
  25. package/dist/gatedTx.d.ts.map +1 -1
  26. package/dist/gatedTx.js +1 -1
  27. package/dist/index.cjs +25 -17
  28. package/dist/index.js +4 -4
  29. package/dist/resolver.cjs +5 -5
  30. package/dist/resolver.d.ts +6 -10
  31. package/dist/resolver.d.ts.map +1 -1
  32. package/dist/resolver.js +3 -3
  33. package/dist/types.cjs +11 -7
  34. package/dist/types.d.ts +52 -72
  35. package/dist/types.d.ts.map +1 -1
  36. package/dist/types.js +1 -1
  37. package/package.json +9 -8
  38. package/src/gatedTransactionSignalLock.ts +3 -6
  39. package/src/gatedTx.ts +53 -6
  40. package/src/resolver.ts +150 -57
  41. package/src/types.ts +134 -76
  42. package/test/resolver.test.ts +151 -6
  43. package/dist/5INFRBMB.js +0 -14
  44. package/dist/5INFRBMB.js.map +0 -1
  45. package/dist/6NWNACVT.cjs.map +0 -1
  46. package/dist/AYIRG6WY.cjs.map +0 -1
  47. package/dist/CG43CWKE.js.map +0 -1
  48. package/dist/DBJG544E.js.map +0 -1
  49. package/dist/GMAAYDJ4.js.map +0 -1
  50. package/dist/QGZD4SJ4.cjs.map +0 -1
  51. package/dist/XYULD3ZM.cjs.map +0 -1
@@ -2,7 +2,11 @@ import { describe, expect, test, vi } from 'vitest';
2
2
 
3
3
  import { WorkflowFunctions } from '@layerzerolabs/common-workflow';
4
4
 
5
- import { constructGatedTransaction, getIdForGatedTransaction } from '../src/gatedTx';
5
+ import {
6
+ constructGatedTransaction,
7
+ constructGatedTransactionFromPointer,
8
+ getIdForGatedTransaction,
9
+ } from '../src/gatedTx';
6
10
  import { resolveGatedTransactions } from '../src/resolver';
7
11
  import type { GatedTransaction } from '../src/types';
8
12
  import { GatedTransactionStatus } from '../src/types';
@@ -10,22 +14,18 @@ import { GatedTransactionStatus } from '../src/types';
10
14
  type Handler = {
11
15
  initial?: (...args: any[]) => any | Promise<any>;
12
16
  final?: (...args: any[]) => any | Promise<any>;
13
- throwsInitial?: any;
14
- throwsFinal?: any;
15
17
  };
16
18
 
17
19
  const makeRegistry = (handlers: Record<string, Handler>) => ({
18
20
  callByPointer: async (fn: string, params: any[]) => {
19
21
  const h = handlers[fn];
20
22
  if (!h) throw new Error(`No handler for ${fn}`);
21
- const isFinal = params.length > 0;
23
+ const isFinal = params.length > 0 || (h.final != null && h.initial == null);
22
24
  if (isFinal) {
23
- if (h.throwsFinal !== undefined) throw h.throwsFinal;
24
25
  if (h.final) return await h.final(...params);
25
26
  if (h.initial) return await h.initial(...params);
26
27
  return undefined;
27
28
  }
28
- if (h.throwsInitial !== undefined) throw h.throwsInitial;
29
29
  if (h.initial) return await h.initial(...params);
30
30
  return undefined;
31
31
  },
@@ -34,6 +34,7 @@ const makeRegistry = (handlers: Record<string, Handler>) => ({
34
34
  const makeTx = (name: string, functionPointer: string, expected: any, deps?: GatedTransaction[]) =>
35
35
  constructGatedTransaction({
36
36
  name,
37
+ chainName: 'test-chain',
37
38
  transaction: { name } as any,
38
39
  check: {
39
40
  functionPointer: functionPointer as any,
@@ -212,6 +213,7 @@ describe('resolveGatedTransactions - dependency and edge cases', () => {
212
213
 
213
214
  const tx1 = constructGatedTransaction({
214
215
  name: 'X',
216
+ chainName: 'test-chain',
215
217
  transaction: { name: 'X', chainName: 'chainA' } as any,
216
218
  check: {
217
219
  functionPointer: 'checkX' as any,
@@ -223,6 +225,7 @@ describe('resolveGatedTransactions - dependency and edge cases', () => {
223
225
 
224
226
  const tx2 = constructGatedTransaction({
225
227
  name: 'X',
228
+ chainName: 'test-chain',
226
229
  transaction: { name: 'X', chainName: 'chainA' } as any,
227
230
  check: {
228
231
  functionPointer: 'checkX' as any,
@@ -248,3 +251,145 @@ describe('resolveGatedTransactions - dependency and edge cases', () => {
248
251
  expect(processTx).toHaveBeenCalledTimes(2);
249
252
  });
250
253
  });
254
+
255
+ describe('resolveGatedTransactions - functional transactions', () => {
256
+ test('functional transaction without dependencies builds and succeeds', async () => {
257
+ const registry = makeRegistry({
258
+ buildFn: {
259
+ final: () => ({ name: 'F', built: true }) as any,
260
+ },
261
+ checkF: {
262
+ initial: () => false,
263
+ final: () => true,
264
+ },
265
+ });
266
+
267
+ const processTx = vi.fn(async (tx) => {
268
+ expect(tx).toMatchObject({ name: 'F', built: true });
269
+ return makeProcessedTx();
270
+ });
271
+
272
+ const txF = constructGatedTransactionFromPointer({
273
+ name: 'F',
274
+ chainName: 'test-chain',
275
+ dependencies: [],
276
+ check: {
277
+ functionPointer: 'checkF' as any,
278
+ params: [],
279
+ expectedResult: { operator: '=', comparisonValue: true },
280
+ },
281
+ getTransactionPointer: 'buildFn' as any,
282
+ uniqueIdKeys: { name: 'F' },
283
+ });
284
+
285
+ const [resF] = await resolveGatedTransactions({
286
+ activityRegistry: registry as any,
287
+ gatedTxes: [txF],
288
+ processTx,
289
+ fn: makeFn(),
290
+ });
291
+
292
+ expect(resF.result.status).toBe(GatedTransactionStatus.SUCCESS);
293
+ expect(processTx).toHaveBeenCalledTimes(1);
294
+ });
295
+
296
+ test('functional transaction builds from dependency data and succeeds', async () => {
297
+ const registry = makeRegistry({
298
+ depCheck: {
299
+ initial: () => false,
300
+ final: () => 10,
301
+ },
302
+ buildFromDep: {
303
+ final: (...deps: any[]) => ({ name: 'F2', builtFrom: deps[0] }) as any,
304
+ },
305
+ checkF2: {
306
+ initial: () => false,
307
+ final: () => true,
308
+ },
309
+ });
310
+
311
+ const dep = constructGatedTransaction({
312
+ name: 'Dep',
313
+ chainName: 'test-chain',
314
+ transaction: { name: 'DepTx' } as any,
315
+ check: {
316
+ functionPointer: 'depCheck' as any,
317
+ params: [],
318
+ expectedResult: { operator: '=', comparisonValue: 10 },
319
+ },
320
+ uniqueIdKeys: { name: 'Dep' },
321
+ });
322
+
323
+ const func = constructGatedTransactionFromPointer({
324
+ name: 'F2',
325
+ chainName: 'test-chain',
326
+ check: {
327
+ functionPointer: 'checkF2' as any,
328
+ params: [],
329
+ expectedResult: { operator: '=', comparisonValue: true },
330
+ },
331
+ getTransactionPointer: 'buildFromDep' as any,
332
+ uniqueIdKeys: { name: 'F2' },
333
+ dependencies: [dep],
334
+ });
335
+
336
+ const processTx = vi.fn(async (tx) => {
337
+ // ensure the built tx used dependency output (10)
338
+ if (tx.name === 'F2') {
339
+ delete (dep as any).transaction;
340
+ delete (dep as any).transactionType;
341
+ expect(tx.builtFrom[0]).toMatchObject(dep);
342
+ }
343
+ return makeProcessedTx();
344
+ });
345
+
346
+ const [resDep, resFunc] = await resolveGatedTransactions({
347
+ activityRegistry: registry as any,
348
+ gatedTxes: [dep, func],
349
+ processTx,
350
+ fn: makeFn(),
351
+ });
352
+
353
+ expect(resDep.result.status).toBe(GatedTransactionStatus.SUCCESS);
354
+ expect(resFunc.result.status).toBe(GatedTransactionStatus.SUCCESS);
355
+ expect(processTx).toHaveBeenCalledTimes(2);
356
+ });
357
+
358
+ test('functional getTransactionPointer error yields TRANSACTION_FAILED', async () => {
359
+ const registry = makeRegistry({
360
+ buildBad: {
361
+ final: () => {
362
+ throw new Error('build failed');
363
+ },
364
+ },
365
+ checkFBad: {
366
+ initial: () => false,
367
+ },
368
+ });
369
+
370
+ const processTx = vi.fn(async (_tx) => makeProcessedTx());
371
+
372
+ const tx = constructGatedTransactionFromPointer({
373
+ name: 'FBad',
374
+ chainName: 'test-chain',
375
+ dependencies: [],
376
+ check: {
377
+ functionPointer: 'checkFBad' as any,
378
+ params: [],
379
+ expectedResult: { operator: '=', comparisonValue: true },
380
+ },
381
+ getTransactionPointer: 'buildBad' as any,
382
+ uniqueIdKeys: { name: 'FBad' },
383
+ });
384
+
385
+ const [res] = await resolveGatedTransactions({
386
+ activityRegistry: registry as any,
387
+ gatedTxes: [tx],
388
+ processTx,
389
+ fn: makeFn(),
390
+ });
391
+
392
+ expect(res.result.status).toBe(GatedTransactionStatus.TRANSACTION_FAILED);
393
+ expect(processTx).toHaveBeenCalledTimes(0);
394
+ });
395
+ });
package/dist/5INFRBMB.js DELETED
@@ -1,14 +0,0 @@
1
- import { __name } from './VUOMXK5T.js';
2
-
3
- // src/gatedTx.ts
4
- var constructGatedTransaction = /* @__PURE__ */ __name((gtx) => {
5
- return gtx;
6
- }, "constructGatedTransaction");
7
- var getIdForGatedTransaction = /* @__PURE__ */ __name((gtx) => {
8
- const serializedUniqueIdKeys = gtx.uniqueIdKeys ? Object.entries(gtx.uniqueIdKeys).map(([k, v]) => `${k}:${v}`).join("-") : "";
9
- return `${gtx.name}-${gtx.transaction.chainName}-${serializedUniqueIdKeys}`;
10
- }, "getIdForGatedTransaction");
11
-
12
- export { constructGatedTransaction, getIdForGatedTransaction };
13
- //# sourceMappingURL=5INFRBMB.js.map
14
- //# sourceMappingURL=5INFRBMB.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/gatedTx.ts"],"names":["constructGatedTransaction","gtx","getIdForGatedTransaction","serializedUniqueIdKeys","uniqueIdKeys","Object","entries","map","k","v","join","name","transaction","chainName"],"mappings":";;;AAQO,IAAMA,yBAAAA,2BAIXC,GAAAA,KAAAA;AAaE,EAAA,OAAOA,GAAAA;AACX,CAAA,EAlByC,2BAAA;AAoBlC,IAAMC,wBAAAA,2BAA4BD,GAAAA,KAAAA;AACrC,EAAA,MAAME,sBAAAA,GAAyBF,IAAIG,YAAAA,GAC7BC,MAAAA,CAAOC,QAAQL,GAAAA,CAAIG,YAAY,CAAA,CAC1BG,GAAAA,CAAI,CAAC,CAACC,GAAGC,CAAAA,CAAAA,KAAO,GAAGD,CAAAA,CAAAA,CAAAA,EAAKC,CAAAA,CAAAA,CAAG,CAAA,CAC3BC,IAAAA,CAAK,GAAA,CAAA,GACV,EAAA;AAEN,EAAA,OAAO,CAAA,EAAGT,IAAIU,IAAI,CAAA,CAAA,EAAIV,IAAIW,WAAAA,CAAYC,SAAS,IAAIV,sBAAAA,CAAAA,CAAAA;AACvD,CAAA,EARwC,0BAAA","file":"5INFRBMB.js","sourcesContent":["import type { Transaction } from '@layerzerolabs/common-chain-model';\nimport type { FunctionPointer } from '@layerzerolabs/common-utils';\n\nimport type { GatedTransaction, GatedTransactionId, OnChainDataComparison } from './types';\n\n/**\n * Builds a {@link GatedTransaction}\n */\nexport const constructGatedTransaction = <\n const Name extends string,\n Tx extends Transaction,\n Method extends (...args: any[]) => any,\n>(gtx: {\n name: Name;\n bundleName?: string;\n transaction: Tx;\n check: {\n functionPointer: FunctionPointer<Method>;\n params: Parameters<Method>;\n expectedResult: OnChainDataComparison<Awaited<ReturnType<Method>>>;\n };\n uniqueIdKeys?: Record<string, string | number | boolean>;\n cacheable?: boolean;\n dependencies?: GatedTransaction[];\n}): GatedTransaction<Name, Tx, Method> => {\n return gtx;\n};\n\nexport const getIdForGatedTransaction = (gtx: GatedTransaction): GatedTransactionId => {\n const serializedUniqueIdKeys = gtx.uniqueIdKeys\n ? Object.entries(gtx.uniqueIdKeys)\n .map(([k, v]) => `${k}:${v}`)\n .join('-')\n : '';\n\n return `${gtx.name}-${gtx.transaction.chainName}-${serializedUniqueIdKeys}`;\n};\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/types.ts"],"names":["gatedTransactionSchema","__name","transactionSchema","name","z","object","transaction","check","functionPointer","any","params","array","expectedResult","operator","custom","comparisonValue","gatedTransactionResultSchema","onchainDataSchema","union","status","literal","submittedTransaction","transactionError","finalOnChainState","processedGatedTransactionSchema","and","result","GatedTransactionStatus","gatedTransactionCacheSchema","getCachedTxCheckData","functionSchema","input","tuple","output","promise","cacheSuccessfulTxCheckData"],"mappings":"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","file":"6NWNACVT.cjs","sourcesContent":["import z from 'zod/v4';\n\nimport type {\n Transaction,\n transactionSchema as _transactionSchema,\n} from '@layerzerolabs/common-chain-model';\nimport type { FunctionPointer } from '@layerzerolabs/common-utils';\nimport { functionSchema } from '@layerzerolabs/zod-utils';\n\nexport type OnChainDataComparisonOperator<OnChainDataType> = OnChainDataType extends number\n ? '<' | '<=' | '=' | '!=' | '>' | '>='\n : '=' | '!=';\n\nexport type OnChainDataComparison<OnChainDataType> = {\n operator: OnChainDataComparisonOperator<OnChainDataType>;\n comparisonValue: OnChainDataType;\n};\n\nexport type GatedTransactionCheck<\n Method extends (...args: any[]) => any = (...args: any[]) => unknown,\n> = {\n functionPointer: FunctionPointer<Method>;\n params: any[];\n expectedResult: OnChainDataComparison<Awaited<ReturnType<Method>>>;\n};\n\nexport const gatedTransactionSchema = <TransactionSchema extends typeof _transactionSchema>({\n transactionSchema,\n name,\n}: {\n transactionSchema: TransactionSchema;\n name: z.ZodString | z.ZodLiteral<string>;\n}) =>\n z.object({\n name,\n transaction: transactionSchema,\n check: z.object({\n functionPointer: z.any(),\n params: z.array(z.any()),\n expectedResult: z.object({\n operator: z.custom<OnChainDataComparisonOperator<any>>(),\n comparisonValue: z.any(),\n }),\n }),\n });\n\n// Schema for gated transaction results\nexport const gatedTransactionResultSchema = <\n TransactionSchema extends typeof _transactionSchema,\n OnchainDataSchema extends z.ZodType,\n>(\n transactionSchema: TransactionSchema,\n onchainDataSchema: OnchainDataSchema,\n) =>\n z.union([\n z.object({\n status: z.literal(GatedTransactionStatus.NO_OP),\n }),\n z.object({\n status: z.literal(GatedTransactionStatus.SUCCESS),\n submittedTransaction: transactionSchema,\n }),\n z.object({\n status: z.literal(GatedTransactionStatus.TRANSACTION_FAILED),\n transactionError: z.any(),\n }),\n z.object({\n status: z.literal(GatedTransactionStatus.FINAL_CHECK_FAILED),\n submittedTransaction: transactionSchema,\n finalOnChainState: onchainDataSchema,\n }),\n z.object({\n status: z.literal(GatedTransactionStatus.DEPENDENCY_FAILED),\n }),\n z.object({\n status: z.literal(GatedTransactionStatus.DENIED),\n }),\n ]);\n\n// Schema for processed gated transactions (with results)\nexport const processedGatedTransactionSchema = <\n TransactionSchema extends typeof _transactionSchema,\n OnchainDataSchema extends z.ZodType,\n>({\n transactionSchema,\n onchainDataSchema,\n name,\n}: {\n transactionSchema: TransactionSchema;\n onchainDataSchema: OnchainDataSchema;\n name: z.ZodString | z.ZodLiteral<string>;\n}) =>\n gatedTransactionSchema({\n transactionSchema,\n name,\n }).and(\n z.object({\n result: gatedTransactionResultSchema(transactionSchema, onchainDataSchema),\n }),\n );\n\ntype GatedTransactionDependencies = GatedTransaction[];\n\nexport type GatedTransaction<\n Name extends string = string,\n TxType extends Transaction = Transaction,\n CheckMethod extends (...args: any[]) => any = (...args: any[]) => any,\n Dependencies extends GatedTransactionDependencies = GatedTransactionDependencies,\n> = {\n bundleName?: string;\n name: Name;\n transaction: TxType;\n check: GatedTransactionCheck<CheckMethod>;\n cacheable?: boolean;\n uniqueIdKeys?: Record<string, string | number | boolean>;\n dependencies?: Dependencies;\n};\n\nexport type ProcessedGatedTransaction<\n Name extends string = string,\n TxType extends Transaction = Transaction,\n CheckMethod extends (...args: any[]) => any = (...args: any[]) => any,\n> = GatedTransaction<Name, TxType, CheckMethod> & {\n result: GatedTransactionResult<GatedTransaction<Name, TxType, CheckMethod>, TxType>;\n};\n\nexport type InferOnChainDataTypeFromGatedTransaction<GatedTx extends GatedTransaction> =\n GatedTx extends GatedTransaction<any, any, infer Check> ? Awaited<ReturnType<Check>> : unknown;\n\nexport enum GatedTransactionStatus {\n NO_OP = 'no_op',\n SUCCESS = 'success',\n TRANSACTION_FAILED = 'transaction_failed',\n FINAL_CHECK_FAILED = 'final_check_failed',\n DEPENDENCY_FAILED = 'dependency_failed',\n DENIED = 'denied',\n}\n\ntype NoOpGatedTransaction = {\n status: GatedTransactionStatus.NO_OP;\n};\n\ntype SuccessfulGatedTransaction<ProcessedTx extends Transaction> = {\n status: GatedTransactionStatus.SUCCESS;\n submittedTransaction: ProcessedTx;\n};\n\ntype TxFailedGatedTransaction = {\n status: GatedTransactionStatus.TRANSACTION_FAILED;\n transactionError: any;\n};\n\ntype CheckFailedGatedTransaction<ProcessedTx extends Transaction, State> = {\n status: GatedTransactionStatus.FINAL_CHECK_FAILED;\n submittedTransaction: ProcessedTx;\n finalOnChainState: State;\n};\n\ntype DependencyFailedGatedTransaction = {\n status: GatedTransactionStatus.DEPENDENCY_FAILED;\n};\n\ntype DeniedGatedTransaction = {\n status: GatedTransactionStatus.DENIED;\n};\n\nexport type GatedTransactionResult<\n GatedTx extends GatedTransaction = GatedTransaction,\n ProcessedTxType extends Transaction = Transaction,\n> =\n | NoOpGatedTransaction\n | SuccessfulGatedTransaction<ProcessedTxType>\n | TxFailedGatedTransaction\n | CheckFailedGatedTransaction<\n ProcessedTxType,\n InferOnChainDataTypeFromGatedTransaction<GatedTx>\n >\n | DependencyFailedGatedTransaction\n | DeniedGatedTransaction;\n\nexport const gatedTransactionCacheSchema = z.object({\n getCachedTxCheckData: functionSchema({\n input: z.tuple([z.any()]),\n output: z.promise(z.any()),\n }) as z.ZodType<\n <GatedTx extends GatedTransaction>(\n gtx: GatedTx,\n ) => Promise<InferOnChainDataTypeFromGatedTransaction<GatedTx> | undefined>\n >,\n cacheSuccessfulTxCheckData: functionSchema({\n input: z.tuple([z.any(), z.any()]),\n output: z.promise(z.any()),\n }) as z.ZodType<\n <GatedTx extends GatedTransaction>(\n gtx: GatedTx,\n data: InferOnChainDataTypeFromGatedTransaction<GatedTx>,\n ) => Promise<void>\n >,\n});\n\nexport type IGatedTransactionCache = z.infer<typeof gatedTransactionCacheSchema>;\n\n/**\n * name-chain-uniqueIdKeys\n *\n * E.g., setDelegate-ethereum-oAppAddress:0xMY_OAPP\n */\nexport type GatedTransactionId = `${string}-${string}-${string}`;\n\nexport type UserInteractionCallbacks = {\n confirmationCallback?: (gtx: GatedTransaction) => Promise<boolean>;\n onResultCallback?: (result: GatedTransaction & { result: GatedTransactionResult }) => void;\n};\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/gatedTx.ts"],"names":["constructGatedTransaction","gtx","getIdForGatedTransaction","serializedUniqueIdKeys","uniqueIdKeys","Object","entries","map","k","v","join","name","transaction","chainName"],"mappings":";;;;;AAQO,IAAMA,yBAAAA,wCAIXC,GAAAA,KAAAA;AAaE,EAAA,OAAOA,GAAAA;AACX,CAAA,EAlByC,2BAAA;AAoBlC,IAAMC,wBAAAA,wCAA4BD,GAAAA,KAAAA;AACrC,EAAA,MAAME,sBAAAA,GAAyBF,IAAIG,YAAAA,GAC7BC,MAAAA,CAAOC,QAAQL,GAAAA,CAAIG,YAAY,CAAA,CAC1BG,GAAAA,CAAI,CAAC,CAACC,GAAGC,CAAAA,CAAAA,KAAO,GAAGD,CAAAA,CAAAA,CAAAA,EAAKC,CAAAA,CAAAA,CAAG,CAAA,CAC3BC,IAAAA,CAAK,GAAA,CAAA,GACV,EAAA;AAEN,EAAA,OAAO,CAAA,EAAGT,IAAIU,IAAI,CAAA,CAAA,EAAIV,IAAIW,WAAAA,CAAYC,SAAS,IAAIV,sBAAAA,CAAAA,CAAAA;AACvD,CAAA,EARwC,0BAAA","file":"AYIRG6WY.cjs","sourcesContent":["import type { Transaction } from '@layerzerolabs/common-chain-model';\nimport type { FunctionPointer } from '@layerzerolabs/common-utils';\n\nimport type { GatedTransaction, GatedTransactionId, OnChainDataComparison } from './types';\n\n/**\n * Builds a {@link GatedTransaction}\n */\nexport const constructGatedTransaction = <\n const Name extends string,\n Tx extends Transaction,\n Method extends (...args: any[]) => any,\n>(gtx: {\n name: Name;\n bundleName?: string;\n transaction: Tx;\n check: {\n functionPointer: FunctionPointer<Method>;\n params: Parameters<Method>;\n expectedResult: OnChainDataComparison<Awaited<ReturnType<Method>>>;\n };\n uniqueIdKeys?: Record<string, string | number | boolean>;\n cacheable?: boolean;\n dependencies?: GatedTransaction[];\n}): GatedTransaction<Name, Tx, Method> => {\n return gtx;\n};\n\nexport const getIdForGatedTransaction = (gtx: GatedTransaction): GatedTransactionId => {\n const serializedUniqueIdKeys = gtx.uniqueIdKeys\n ? Object.entries(gtx.uniqueIdKeys)\n .map(([k, v]) => `${k}:${v}`)\n .join('-')\n : '';\n\n return `${gtx.name}-${gtx.transaction.chainName}-${serializedUniqueIdKeys}`;\n};\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/resolver.ts"],"names":["checkGatedTransaction","registry","gatedTransaction","cachedCheckResult","processedTransaction","onChainData","undefined","params","check","callByPointer","functionPointer","expectationMet","expectedResult","operator","isEqual","comparisonValue","Error","resolveGatedTransaction","activityRegistry","gatedTx","isTransactionSuccessful","processTx","confirmationCallback","fn","cache","dependencyIds","dependencies","map","tx","getIdForGatedTransaction","dependenciesAreAllProcessed","every","id","condition","dependenciesWereSuccessful","result","status","GatedTransactionStatus","DEPENDENCY_FAILED","initialCheckResult","getCachedTxCheckData","cacheSuccessfulTxCheckData","NO_OP","confirmation","DENIED","processed","transaction","finalCheckResult","SUCCESS","submittedTransaction","stringify","o","JSON","_","v","toString","console","error","name","FINAL_CHECK_FAILED","finalOnChainState","e","TRANSACTION_FAILED","transactionError","resolveGatedTransactions","gatedTxes","userInteractionCallbacks","allInternalIds","allDeps","flatMap","allExternalDeps","filter","includes","results","Object","fromEntries","Promise","all","checkResult","gtxId","txFunctions","res","resId","onResultCallback","func","resolveSequencedGatedTransactions","seq","push"],"mappings":"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","file":"CG43CWKE.js","sourcesContent":["import isEqual from 'lodash.isequal';\n\nimport type { ActivityRegistry } from '@layerzerolabs/common-activities';\nimport type { Transaction } from '@layerzerolabs/common-chain-model';\nimport type { WorkflowFunctions } from '@layerzerolabs/common-workflow';\n\nimport { getIdForGatedTransaction } from './gatedTx';\nimport type {\n GatedTransaction,\n GatedTransactionId,\n GatedTransactionResult,\n IGatedTransactionCache,\n InferOnChainDataTypeFromGatedTransaction,\n UserInteractionCallbacks,\n} from './types';\nimport { GatedTransactionStatus } from './types';\n\ntype OnChainCheckResult<DataType = any> = {\n expectationMet: boolean;\n onChainData: DataType;\n};\n\nconst checkGatedTransaction = async <GatedTx extends GatedTransaction>({\n registry,\n gatedTransaction,\n cachedCheckResult,\n processedTransaction,\n}: {\n registry: ActivityRegistry;\n gatedTransaction: GatedTx;\n cachedCheckResult?: InferOnChainDataTypeFromGatedTransaction<GatedTx>;\n processedTransaction?: any;\n}): Promise<OnChainCheckResult<InferOnChainDataTypeFromGatedTransaction<GatedTx>>> => {\n let onChainData: InferOnChainDataTypeFromGatedTransaction<GatedTx>;\n if (cachedCheckResult !== undefined) {\n onChainData = cachedCheckResult;\n } else {\n // Always inject the processed transaction as the last parameter when available\n let params = gatedTransaction.check.params;\n if (processedTransaction !== undefined) {\n params = [...gatedTransaction.check.params, processedTransaction];\n }\n\n onChainData = await registry.callByPointer(gatedTransaction.check.functionPointer, params);\n }\n\n let expectationMet: boolean;\n\n switch (gatedTransaction.check.expectedResult.operator) {\n case '=':\n expectationMet = isEqual(\n onChainData,\n gatedTransaction.check.expectedResult.comparisonValue,\n );\n break;\n case '!=':\n expectationMet = !isEqual(\n onChainData,\n gatedTransaction.check.expectedResult.comparisonValue,\n );\n break;\n case '>':\n expectationMet =\n (onChainData as number) >\n (gatedTransaction.check.expectedResult.comparisonValue as number);\n break;\n case '>=':\n expectationMet =\n (onChainData as number) >=\n (gatedTransaction.check.expectedResult.comparisonValue as number);\n break;\n case '<':\n expectationMet =\n (onChainData as number) <\n (gatedTransaction.check.expectedResult.comparisonValue as number);\n break;\n case '<=':\n expectationMet =\n (onChainData as number) <=\n (gatedTransaction.check.expectedResult.comparisonValue as number);\n break;\n default:\n throw new Error(\n `Gated transaction operator \"${gatedTransaction.check.expectedResult.operator}\" is not supported`,\n );\n }\n\n return {\n expectationMet,\n onChainData,\n };\n};\n\nconst resolveGatedTransaction = async <\n TxType extends Transaction,\n ProcessedTxType extends Transaction,\n GatedTx extends GatedTransaction<string, TxType, any>,\n ProcessTx extends (transaction: TxType) => Promise<ProcessedTxType>,\n>({\n activityRegistry,\n gatedTx,\n isTransactionSuccessful,\n processTx,\n confirmationCallback,\n fn,\n cache,\n}: {\n activityRegistry: ActivityRegistry;\n gatedTx: GatedTx;\n processTx: ProcessTx;\n isTransactionSuccessful: (gtxId: GatedTransactionId) => boolean | undefined;\n confirmationCallback: NonNullable<UserInteractionCallbacks['confirmationCallback']>;\n fn: WorkflowFunctions;\n cache?: IGatedTransactionCache;\n}): Promise<GatedTx & { result: GatedTransactionResult<GatedTx, ProcessedTxType> }> => {\n const dependencyIds = (gatedTx.dependencies ?? []).map((tx) => getIdForGatedTransaction(tx));\n\n const dependenciesAreAllProcessed = () =>\n dependencyIds.every((id) => isTransactionSuccessful(id) != null);\n\n await fn.condition(dependenciesAreAllProcessed);\n\n //check that the dependencies succeeded\n const dependenciesWereSuccessful = dependencyIds.every((id) => isTransactionSuccessful(id));\n\n if (!dependenciesWereSuccessful) {\n return {\n ...gatedTx,\n result: {\n status: GatedTransactionStatus.DEPENDENCY_FAILED,\n },\n };\n }\n\n const initialCheckResult = await checkGatedTransaction({\n gatedTransaction: gatedTx,\n registry: activityRegistry,\n cachedCheckResult: await cache?.getCachedTxCheckData?.(gatedTx),\n });\n\n await cache?.cacheSuccessfulTxCheckData?.(gatedTx, initialCheckResult.onChainData);\n\n if (initialCheckResult.expectationMet) {\n //already met\n return {\n ...gatedTx,\n result: {\n status: GatedTransactionStatus.NO_OP,\n },\n };\n }\n\n //get confirmation before sending\n const confirmation = await confirmationCallback(gatedTx);\n if (!confirmation) {\n return {\n ...gatedTx,\n result: {\n status: GatedTransactionStatus.DENIED,\n },\n };\n }\n\n //send the tx\n try {\n const processed = await processTx(gatedTx.transaction);\n const finalCheckResult = await checkGatedTransaction({\n registry: activityRegistry,\n gatedTransaction: gatedTx,\n processedTransaction: processed,\n });\n\n await cache?.cacheSuccessfulTxCheckData?.(gatedTx, finalCheckResult.onChainData);\n\n if (finalCheckResult.expectationMet) {\n //sent and successful\n return {\n ...gatedTx,\n result: {\n status: GatedTransactionStatus.SUCCESS,\n submittedTransaction: processed,\n },\n };\n } else {\n //sent and unsuccessful\n const stringify = (o: any) =>\n JSON.stringify(o, (_, v) => (typeof v === 'bigint' ? v.toString() : v), 2);\n console.error(\n `Gated transaction ${gatedTx.name} final check failed:\\nExpected result ${stringify(gatedTx.check.expectedResult.comparisonValue)}, but got:\\n${stringify(finalCheckResult.onChainData)}`,\n );\n return {\n ...gatedTx,\n result: {\n status: GatedTransactionStatus.FINAL_CHECK_FAILED,\n submittedTransaction: processed,\n finalOnChainState: finalCheckResult.onChainData,\n },\n };\n }\n } catch (e) {\n //sent and failed\n return {\n ...gatedTx,\n result: {\n status: GatedTransactionStatus.TRANSACTION_FAILED,\n transactionError: e,\n },\n };\n }\n};\n\nexport const resolveGatedTransactions = async <\n TxType extends Transaction,\n ProcessedTxType extends Transaction,\n GatedTx extends GatedTransaction<string, TxType, any>,\n ProcessTx extends (transaction: TxType) => Promise<ProcessedTxType>,\n>({\n activityRegistry,\n gatedTxes,\n processTx,\n fn,\n cache,\n userInteractionCallbacks,\n}: {\n activityRegistry: ActivityRegistry;\n gatedTxes: GatedTx[];\n processTx: ProcessTx;\n fn: WorkflowFunctions;\n cache?: IGatedTransactionCache;\n userInteractionCallbacks?: UserInteractionCallbacks;\n}): Promise<(GatedTx & { result: GatedTransactionResult })[]> => {\n //compute deps\n const allInternalIds = gatedTxes.map((tx) => getIdForGatedTransaction(tx));\n const allDeps = gatedTxes.flatMap((tx) => tx.dependencies ?? []);\n const allExternalDeps = allDeps.filter(\n (tx) => !allInternalIds.includes(getIdForGatedTransaction(tx)),\n );\n\n //prepopulate results for external dependencies\n //this map is only used for internal status tracking\n //map id -> was successful\n const results: Record<GatedTransactionId, boolean> = Object.fromEntries(\n await Promise.all(\n allExternalDeps.map(async (tx) => {\n const checkResult = await checkGatedTransaction({\n gatedTransaction: tx,\n registry: activityRegistry,\n cachedCheckResult: await cache?.getCachedTxCheckData?.(tx),\n });\n\n return [getIdForGatedTransaction(tx), checkResult.expectationMet];\n }),\n ),\n );\n\n const isTransactionSuccessful = (gtxId: GatedTransactionId) => results[gtxId];\n\n const txFunctions = gatedTxes.map((tx) => async () => {\n const res = await resolveGatedTransaction<TxType, ProcessedTxType, GatedTx, ProcessTx>({\n gatedTx: tx,\n activityRegistry,\n isTransactionSuccessful,\n processTx,\n confirmationCallback:\n userInteractionCallbacks?.confirmationCallback ?? (async () => true),\n fn,\n cache,\n });\n\n const resId = getIdForGatedTransaction(res);\n results[resId] = [GatedTransactionStatus.SUCCESS, GatedTransactionStatus.NO_OP].includes(\n res.result.status,\n );\n\n userInteractionCallbacks?.onResultCallback?.(res);\n return res;\n });\n\n return await Promise.all(txFunctions.map((func) => func()));\n};\n\nexport const resolveSequencedGatedTransactions = async <\n TxType extends Transaction,\n ProcessedTxType extends Transaction,\n GatedTx extends GatedTransaction<string, TxType, any>,\n ProcessTx extends (transaction: TxType) => Promise<ProcessedTxType>,\n>({\n activityRegistry,\n gatedTxes,\n processTx,\n cache,\n userInteractionCallbacks,\n fn,\n}: {\n activityRegistry: ActivityRegistry;\n gatedTxes: GatedTx[][];\n processTx: ProcessTx;\n fn: WorkflowFunctions;\n cache?: IGatedTransactionCache;\n userInteractionCallbacks?: UserInteractionCallbacks;\n}) => {\n const results = [];\n for (const seq of gatedTxes) {\n const result = await resolveGatedTransactions<TxType, ProcessedTxType, GatedTx, ProcessTx>({\n gatedTxes: seq,\n activityRegistry,\n processTx,\n cache,\n userInteractionCallbacks,\n fn,\n });\n results.push(result);\n }\n\n return results;\n};\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/gatedTransactionSignalLock.ts"],"names":["gatedTransactionGoSignal","defineSignal","queryGatedTransactions","defineQuery","useGatedTransactionSignalLock","fn","getPassthrough","approvedIds","Set","approvedBundleNames","pendingTransactions","sentTransactions","completedTransactions","setHandler","passthroughWfIds","map","handle","workflowId","Object","values","passthroughWorkflowIds","id","add","passthrough","Promise","allSettled","wf","signal","confirmationCallback","tx","getIdForGatedTransaction","condition","has","bundleName","onResultCallback","result"],"mappings":";;;;AAkBO,IAAMA,wBAAAA,GACTC,aAAuC,oBAAA;AACpC,IAAMC,sBAAAA,GACTC,YAA0C,uBAAA;AAEvC,IAAMC,6BAAAA,mBAAgC,MAAA,CAAA,CACzCC,EAAAA,EACAC,cAAAA,KAAAA;AAEA,EAAA,MAAMC,WAAAA,uBAA2CC,GAAAA,EAAAA;AACjD,EAAA,MAAMC,mBAAAA,uBAAuCD,GAAAA,EAAAA;AAE7C,EAAA,MAAME,sBAAoE,EAAC;AAC3E,EAAA,MAAMC,mBAAiE,EAAC;AACxE,EAAA,MAAMC,wBAGF,EAAC;AAELP,EAAAA,EAAAA,CAAGQ,UAAAA,CAAWX,wBAAwB,MAAA;AAClC,IAAA,MAAMY,mBAAmBR,cAAAA,IAAAA,CAAmBS,MAAM,CAACC,MAAAA,KAAWA,OAAOC,UAAU,CAAA;AAC/E,IAAA,OAAO;MACHP,mBAAAA,EAAqBQ,MAAAA,CAAOC,OAAOT,mBAAAA,CAAAA;MACnCC,gBAAAA,EAAkBO,MAAAA,CAAOC,OAAOR,gBAAAA,CAAAA;MAChCC,qBAAAA,EAAuBM,MAAAA,CAAOC,OAAOP,qBAAAA,CAAAA;AACrCQ,MAAAA,sBAAAA,EAAwBN,oBAAoB;AAChD,KAAA;EACJ,CAAA,CAAA;AAEAT,EAAAA,EAAAA,CAAGQ,UAAAA,CAAWb,wBAAAA,EAA0B,OAAOqB,EAAAA,KAAAA;AAC3Cd,IAAAA,WAAAA,CAAYe,IAAID,EAAAA,CAAAA;AAChB,IAAA,MAAME,cAAcjB,cAAAA,IAAAA;AACpB,IAAA,IAAIiB,WAAAA,EAAa;AACb,MAAA,MAAMC,OAAAA,CAAQC,UAAAA,CACVF,WAAAA,CAAYR,GAAAA,CAAI,CAACW,EAAAA,KAAAA;AACb,QAAA,OAAOA,EAAAA,CAAGC,OAAO3B,wBAAAA,EAA0B;AAACqB,UAAAA;AAAG,SAAA,CAAA;AACnD,MAAA,CAAA,CAAA,CAAA;AAER,IAAA;EACJ,CAAA,CAAA;AAEA,EAAA,MAAMO,oBAAAA,iCAAgFC,EAAAA,KAAAA;AAClF,IAAA,MAAMR,EAAAA,GAAKS,yBAAyBD,EAAAA,CAAAA;AACpCnB,IAAAA,mBAAAA,CAAoBW,EAAAA,CAAAA,GAAMQ,EAAAA;AAE1B,IAAA,MAAMxB,EAAAA,CAAG0B,SAAAA,CACL,MACIxB,WAAAA,CAAYyB,IAAIX,EAAAA,CAAAA,IAAQ,CAAC,CAACQ,GAAGI,UAAAA,IAAcxB,mBAAAA,CAAoBuB,GAAAA,CAAIH,EAAAA,CAAGI,UAAU,CAAA,CAAA;AAGxFJ,IAAAA,EAAAA,CAAGI,UAAAA,IAAcxB,mBAAAA,CAAoBa,GAAAA,CAAIO,EAAAA,CAAGI,UAAU,CAAA;AACtDtB,IAAAA,gBAAAA,CAAiBU,EAAAA,CAAAA,GAAMQ,EAAAA;AACvB,IAAA,OAAOnB,oBAAoBW,EAAAA,CAAAA;AAC3B,IAAA,OAAO,IAAA;EACX,CAAA,EAb+E,sBAAA,CAAA;AAe/E,EAAA,MAAMa,gBAAAA,2BAAkEC,MAAAA,KAAAA;AACpE,IAAA,MAAMd,EAAAA,GAAKS,yBAAyBK,MAAAA,CAAAA;AACpCvB,IAAAA,qBAAAA,CAAsBS,EAAAA,CAAAA,GAAMc,MAAAA;AAC5B,IAAA,OAAOxB,iBAAiBU,EAAAA,CAAAA;EAC5B,CAAA,EAJuE,kBAAA,CAAA;AAMvE,EAAA,OAAO;AAAEO,IAAAA,oBAAAA;AAAsBM,IAAAA;AAAiB,GAAA;AACpD,CAAA,EA1D6C,+BAAA","file":"DBJG544E.js","sourcesContent":["import type { WorkflowFunctions, WorkflowHandle } from '@layerzerolabs/common-workflow';\nimport { defineQuery, defineSignal } from '@layerzerolabs/common-workflow';\n\nimport { getIdForGatedTransaction } from './gatedTx';\nimport type {\n GatedTransaction,\n GatedTransactionId,\n GatedTransactionResult,\n UserInteractionCallbacks,\n} from './types';\n\nexport type QueryGatedTransactionsResult = {\n pendingTransactions: GatedTransaction[];\n sentTransactions: GatedTransaction[];\n completedTransactions: (GatedTransaction & { result: GatedTransactionResult })[];\n passthroughWorkflowIds: string[];\n};\n\nexport const gatedTransactionGoSignal =\n defineSignal<[id: GatedTransactionId]>('GatedTransactionGo');\nexport const queryGatedTransactions =\n defineQuery<QueryGatedTransactionsResult>('GatedTransactionQuery');\n\nexport const useGatedTransactionSignalLock = (\n fn: WorkflowFunctions,\n getPassthrough?: () => WorkflowHandle<any>[],\n): UserInteractionCallbacks => {\n const approvedIds: Set<GatedTransactionId> = new Set();\n const approvedBundleNames: Set<string> = new Set();\n\n const pendingTransactions: Record<GatedTransactionId, GatedTransaction> = {};\n const sentTransactions: Record<GatedTransactionId, GatedTransaction> = {};\n const completedTransactions: Record<\n GatedTransactionId,\n GatedTransaction & { result: GatedTransactionResult }\n > = {};\n\n fn.setHandler(queryGatedTransactions, () => {\n const passthroughWfIds = getPassthrough?.().map?.((handle) => handle.workflowId);\n return {\n pendingTransactions: Object.values(pendingTransactions),\n sentTransactions: Object.values(sentTransactions),\n completedTransactions: Object.values(completedTransactions),\n passthroughWorkflowIds: passthroughWfIds ?? [],\n };\n });\n\n fn.setHandler(gatedTransactionGoSignal, async (id) => {\n approvedIds.add(id);\n const passthrough = getPassthrough?.();\n if (passthrough) {\n await Promise.allSettled(\n passthrough.map((wf) => {\n return wf.signal(gatedTransactionGoSignal, [id]);\n }),\n );\n }\n });\n\n const confirmationCallback: UserInteractionCallbacks['confirmationCallback'] = async (tx) => {\n const id = getIdForGatedTransaction(tx);\n pendingTransactions[id] = tx;\n\n await fn.condition(\n () =>\n approvedIds.has(id) || (!!tx.bundleName && approvedBundleNames.has(tx.bundleName)),\n );\n\n tx.bundleName && approvedBundleNames.add(tx.bundleName);\n sentTransactions[id] = tx;\n delete pendingTransactions[id];\n return true;\n };\n\n const onResultCallback: UserInteractionCallbacks['onResultCallback'] = (result) => {\n const id = getIdForGatedTransaction(result);\n completedTransactions[id] = result;\n delete sentTransactions[id];\n };\n\n return { confirmationCallback, onResultCallback };\n};\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/types.ts"],"names":["gatedTransactionSchema","transactionSchema","name","z","object","transaction","check","functionPointer","any","params","array","expectedResult","operator","custom","comparisonValue","gatedTransactionResultSchema","onchainDataSchema","union","status","literal","submittedTransaction","transactionError","finalOnChainState","processedGatedTransactionSchema","and","result","GatedTransactionStatus","gatedTransactionCacheSchema","getCachedTxCheckData","functionSchema","input","tuple","output","promise","cacheSuccessfulTxCheckData"],"mappings":"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","file":"GMAAYDJ4.js","sourcesContent":["import z from 'zod/v4';\n\nimport type {\n Transaction,\n transactionSchema as _transactionSchema,\n} from '@layerzerolabs/common-chain-model';\nimport type { FunctionPointer } from '@layerzerolabs/common-utils';\nimport { functionSchema } from '@layerzerolabs/zod-utils';\n\nexport type OnChainDataComparisonOperator<OnChainDataType> = OnChainDataType extends number\n ? '<' | '<=' | '=' | '!=' | '>' | '>='\n : '=' | '!=';\n\nexport type OnChainDataComparison<OnChainDataType> = {\n operator: OnChainDataComparisonOperator<OnChainDataType>;\n comparisonValue: OnChainDataType;\n};\n\nexport type GatedTransactionCheck<\n Method extends (...args: any[]) => any = (...args: any[]) => unknown,\n> = {\n functionPointer: FunctionPointer<Method>;\n params: any[];\n expectedResult: OnChainDataComparison<Awaited<ReturnType<Method>>>;\n};\n\nexport const gatedTransactionSchema = <TransactionSchema extends typeof _transactionSchema>({\n transactionSchema,\n name,\n}: {\n transactionSchema: TransactionSchema;\n name: z.ZodString | z.ZodLiteral<string>;\n}) =>\n z.object({\n name,\n transaction: transactionSchema,\n check: z.object({\n functionPointer: z.any(),\n params: z.array(z.any()),\n expectedResult: z.object({\n operator: z.custom<OnChainDataComparisonOperator<any>>(),\n comparisonValue: z.any(),\n }),\n }),\n });\n\n// Schema for gated transaction results\nexport const gatedTransactionResultSchema = <\n TransactionSchema extends typeof _transactionSchema,\n OnchainDataSchema extends z.ZodType,\n>(\n transactionSchema: TransactionSchema,\n onchainDataSchema: OnchainDataSchema,\n) =>\n z.union([\n z.object({\n status: z.literal(GatedTransactionStatus.NO_OP),\n }),\n z.object({\n status: z.literal(GatedTransactionStatus.SUCCESS),\n submittedTransaction: transactionSchema,\n }),\n z.object({\n status: z.literal(GatedTransactionStatus.TRANSACTION_FAILED),\n transactionError: z.any(),\n }),\n z.object({\n status: z.literal(GatedTransactionStatus.FINAL_CHECK_FAILED),\n submittedTransaction: transactionSchema,\n finalOnChainState: onchainDataSchema,\n }),\n z.object({\n status: z.literal(GatedTransactionStatus.DEPENDENCY_FAILED),\n }),\n z.object({\n status: z.literal(GatedTransactionStatus.DENIED),\n }),\n ]);\n\n// Schema for processed gated transactions (with results)\nexport const processedGatedTransactionSchema = <\n TransactionSchema extends typeof _transactionSchema,\n OnchainDataSchema extends z.ZodType,\n>({\n transactionSchema,\n onchainDataSchema,\n name,\n}: {\n transactionSchema: TransactionSchema;\n onchainDataSchema: OnchainDataSchema;\n name: z.ZodString | z.ZodLiteral<string>;\n}) =>\n gatedTransactionSchema({\n transactionSchema,\n name,\n }).and(\n z.object({\n result: gatedTransactionResultSchema(transactionSchema, onchainDataSchema),\n }),\n );\n\ntype GatedTransactionDependencies = GatedTransaction[];\n\nexport type GatedTransaction<\n Name extends string = string,\n TxType extends Transaction = Transaction,\n CheckMethod extends (...args: any[]) => any = (...args: any[]) => any,\n Dependencies extends GatedTransactionDependencies = GatedTransactionDependencies,\n> = {\n bundleName?: string;\n name: Name;\n transaction: TxType;\n check: GatedTransactionCheck<CheckMethod>;\n cacheable?: boolean;\n uniqueIdKeys?: Record<string, string | number | boolean>;\n dependencies?: Dependencies;\n};\n\nexport type ProcessedGatedTransaction<\n Name extends string = string,\n TxType extends Transaction = Transaction,\n CheckMethod extends (...args: any[]) => any = (...args: any[]) => any,\n> = GatedTransaction<Name, TxType, CheckMethod> & {\n result: GatedTransactionResult<GatedTransaction<Name, TxType, CheckMethod>, TxType>;\n};\n\nexport type InferOnChainDataTypeFromGatedTransaction<GatedTx extends GatedTransaction> =\n GatedTx extends GatedTransaction<any, any, infer Check> ? Awaited<ReturnType<Check>> : unknown;\n\nexport enum GatedTransactionStatus {\n NO_OP = 'no_op',\n SUCCESS = 'success',\n TRANSACTION_FAILED = 'transaction_failed',\n FINAL_CHECK_FAILED = 'final_check_failed',\n DEPENDENCY_FAILED = 'dependency_failed',\n DENIED = 'denied',\n}\n\ntype NoOpGatedTransaction = {\n status: GatedTransactionStatus.NO_OP;\n};\n\ntype SuccessfulGatedTransaction<ProcessedTx extends Transaction> = {\n status: GatedTransactionStatus.SUCCESS;\n submittedTransaction: ProcessedTx;\n};\n\ntype TxFailedGatedTransaction = {\n status: GatedTransactionStatus.TRANSACTION_FAILED;\n transactionError: any;\n};\n\ntype CheckFailedGatedTransaction<ProcessedTx extends Transaction, State> = {\n status: GatedTransactionStatus.FINAL_CHECK_FAILED;\n submittedTransaction: ProcessedTx;\n finalOnChainState: State;\n};\n\ntype DependencyFailedGatedTransaction = {\n status: GatedTransactionStatus.DEPENDENCY_FAILED;\n};\n\ntype DeniedGatedTransaction = {\n status: GatedTransactionStatus.DENIED;\n};\n\nexport type GatedTransactionResult<\n GatedTx extends GatedTransaction = GatedTransaction,\n ProcessedTxType extends Transaction = Transaction,\n> =\n | NoOpGatedTransaction\n | SuccessfulGatedTransaction<ProcessedTxType>\n | TxFailedGatedTransaction\n | CheckFailedGatedTransaction<\n ProcessedTxType,\n InferOnChainDataTypeFromGatedTransaction<GatedTx>\n >\n | DependencyFailedGatedTransaction\n | DeniedGatedTransaction;\n\nexport const gatedTransactionCacheSchema = z.object({\n getCachedTxCheckData: functionSchema({\n input: z.tuple([z.any()]),\n output: z.promise(z.any()),\n }) as z.ZodType<\n <GatedTx extends GatedTransaction>(\n gtx: GatedTx,\n ) => Promise<InferOnChainDataTypeFromGatedTransaction<GatedTx> | undefined>\n >,\n cacheSuccessfulTxCheckData: functionSchema({\n input: z.tuple([z.any(), z.any()]),\n output: z.promise(z.any()),\n }) as z.ZodType<\n <GatedTx extends GatedTransaction>(\n gtx: GatedTx,\n data: InferOnChainDataTypeFromGatedTransaction<GatedTx>,\n ) => Promise<void>\n >,\n});\n\nexport type IGatedTransactionCache = z.infer<typeof gatedTransactionCacheSchema>;\n\n/**\n * name-chain-uniqueIdKeys\n *\n * E.g., setDelegate-ethereum-oAppAddress:0xMY_OAPP\n */\nexport type GatedTransactionId = `${string}-${string}-${string}`;\n\nexport type UserInteractionCallbacks = {\n confirmationCallback?: (gtx: GatedTransaction) => Promise<boolean>;\n onResultCallback?: (result: GatedTransaction & { result: GatedTransactionResult }) => void;\n};\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/gatedTransactionSignalLock.ts"],"names":["gatedTransactionGoSignal","defineSignal","queryGatedTransactions","defineQuery","useGatedTransactionSignalLock","__name","fn","getPassthrough","approvedIds","Set","approvedBundleNames","pendingTransactions","sentTransactions","completedTransactions","setHandler","passthroughWfIds","map","handle","workflowId","Object","values","passthroughWorkflowIds","id","add","passthrough","Promise","allSettled","wf","signal","confirmationCallback","tx","getIdForGatedTransaction","condition","has","bundleName","onResultCallback","result"],"mappings":";;;;;;AAkBO,IAAMA,wBAAAA,GACTC,4BAAuC,oBAAA;AACpC,IAAMC,sBAAAA,GACTC,2BAA0C,uBAAA;AAEvC,IAAMC,6BAAAA,mBAAgCC,mBAAA,CAAA,CACzCC,EAAAA,EACAC,cAAAA,KAAAA;AAEA,EAAA,MAAMC,WAAAA,uBAA2CC,GAAAA,EAAAA;AACjD,EAAA,MAAMC,mBAAAA,uBAAuCD,GAAAA,EAAAA;AAE7C,EAAA,MAAME,sBAAoE,EAAC;AAC3E,EAAA,MAAMC,mBAAiE,EAAC;AACxE,EAAA,MAAMC,wBAGF,EAAC;AAELP,EAAAA,EAAAA,CAAGQ,UAAAA,CAAWZ,wBAAwB,MAAA;AAClC,IAAA,MAAMa,mBAAmBR,cAAAA,IAAAA,CAAmBS,MAAM,CAACC,MAAAA,KAAWA,OAAOC,UAAU,CAAA;AAC/E,IAAA,OAAO;MACHP,mBAAAA,EAAqBQ,MAAAA,CAAOC,OAAOT,mBAAAA,CAAAA;MACnCC,gBAAAA,EAAkBO,MAAAA,CAAOC,OAAOR,gBAAAA,CAAAA;MAChCC,qBAAAA,EAAuBM,MAAAA,CAAOC,OAAOP,qBAAAA,CAAAA;AACrCQ,MAAAA,sBAAAA,EAAwBN,oBAAoB;AAChD,KAAA;EACJ,CAAA,CAAA;AAEAT,EAAAA,EAAAA,CAAGQ,UAAAA,CAAWd,wBAAAA,EAA0B,OAAOsB,EAAAA,KAAAA;AAC3Cd,IAAAA,WAAAA,CAAYe,IAAID,EAAAA,CAAAA;AAChB,IAAA,MAAME,cAAcjB,cAAAA,IAAAA;AACpB,IAAA,IAAIiB,WAAAA,EAAa;AACb,MAAA,MAAMC,OAAAA,CAAQC,UAAAA,CACVF,WAAAA,CAAYR,GAAAA,CAAI,CAACW,EAAAA,KAAAA;AACb,QAAA,OAAOA,EAAAA,CAAGC,OAAO5B,wBAAAA,EAA0B;AAACsB,UAAAA;AAAG,SAAA,CAAA;AACnD,MAAA,CAAA,CAAA,CAAA;AAER,IAAA;EACJ,CAAA,CAAA;AAEA,EAAA,MAAMO,oBAAAA,8CAAgFC,EAAAA,KAAAA;AAClF,IAAA,MAAMR,EAAAA,GAAKS,sCAAyBD,EAAAA,CAAAA;AACpCnB,IAAAA,mBAAAA,CAAoBW,EAAAA,CAAAA,GAAMQ,EAAAA;AAE1B,IAAA,MAAMxB,EAAAA,CAAG0B,SAAAA,CACL,MACIxB,WAAAA,CAAYyB,IAAIX,EAAAA,CAAAA,IAAQ,CAAC,CAACQ,GAAGI,UAAAA,IAAcxB,mBAAAA,CAAoBuB,GAAAA,CAAIH,EAAAA,CAAGI,UAAU,CAAA,CAAA;AAGxFJ,IAAAA,EAAAA,CAAGI,UAAAA,IAAcxB,mBAAAA,CAAoBa,GAAAA,CAAIO,EAAAA,CAAGI,UAAU,CAAA;AACtDtB,IAAAA,gBAAAA,CAAiBU,EAAAA,CAAAA,GAAMQ,EAAAA;AACvB,IAAA,OAAOnB,oBAAoBW,EAAAA,CAAAA;AAC3B,IAAA,OAAO,IAAA;EACX,CAAA,EAb+E,sBAAA,CAAA;AAe/E,EAAA,MAAMa,gBAAAA,wCAAkEC,MAAAA,KAAAA;AACpE,IAAA,MAAMd,EAAAA,GAAKS,sCAAyBK,MAAAA,CAAAA;AACpCvB,IAAAA,qBAAAA,CAAsBS,EAAAA,CAAAA,GAAMc,MAAAA;AAC5B,IAAA,OAAOxB,iBAAiBU,EAAAA,CAAAA;EAC5B,CAAA,EAJuE,kBAAA,CAAA;AAMvE,EAAA,OAAO;AAAEO,IAAAA,oBAAAA;AAAsBM,IAAAA;AAAiB,GAAA;AACpD,CAAA,EA1D6C,+BAAA","file":"QGZD4SJ4.cjs","sourcesContent":["import type { WorkflowFunctions, WorkflowHandle } from '@layerzerolabs/common-workflow';\nimport { defineQuery, defineSignal } from '@layerzerolabs/common-workflow';\n\nimport { getIdForGatedTransaction } from './gatedTx';\nimport type {\n GatedTransaction,\n GatedTransactionId,\n GatedTransactionResult,\n UserInteractionCallbacks,\n} from './types';\n\nexport type QueryGatedTransactionsResult = {\n pendingTransactions: GatedTransaction[];\n sentTransactions: GatedTransaction[];\n completedTransactions: (GatedTransaction & { result: GatedTransactionResult })[];\n passthroughWorkflowIds: string[];\n};\n\nexport const gatedTransactionGoSignal =\n defineSignal<[id: GatedTransactionId]>('GatedTransactionGo');\nexport const queryGatedTransactions =\n defineQuery<QueryGatedTransactionsResult>('GatedTransactionQuery');\n\nexport const useGatedTransactionSignalLock = (\n fn: WorkflowFunctions,\n getPassthrough?: () => WorkflowHandle<any>[],\n): UserInteractionCallbacks => {\n const approvedIds: Set<GatedTransactionId> = new Set();\n const approvedBundleNames: Set<string> = new Set();\n\n const pendingTransactions: Record<GatedTransactionId, GatedTransaction> = {};\n const sentTransactions: Record<GatedTransactionId, GatedTransaction> = {};\n const completedTransactions: Record<\n GatedTransactionId,\n GatedTransaction & { result: GatedTransactionResult }\n > = {};\n\n fn.setHandler(queryGatedTransactions, () => {\n const passthroughWfIds = getPassthrough?.().map?.((handle) => handle.workflowId);\n return {\n pendingTransactions: Object.values(pendingTransactions),\n sentTransactions: Object.values(sentTransactions),\n completedTransactions: Object.values(completedTransactions),\n passthroughWorkflowIds: passthroughWfIds ?? [],\n };\n });\n\n fn.setHandler(gatedTransactionGoSignal, async (id) => {\n approvedIds.add(id);\n const passthrough = getPassthrough?.();\n if (passthrough) {\n await Promise.allSettled(\n passthrough.map((wf) => {\n return wf.signal(gatedTransactionGoSignal, [id]);\n }),\n );\n }\n });\n\n const confirmationCallback: UserInteractionCallbacks['confirmationCallback'] = async (tx) => {\n const id = getIdForGatedTransaction(tx);\n pendingTransactions[id] = tx;\n\n await fn.condition(\n () =>\n approvedIds.has(id) || (!!tx.bundleName && approvedBundleNames.has(tx.bundleName)),\n );\n\n tx.bundleName && approvedBundleNames.add(tx.bundleName);\n sentTransactions[id] = tx;\n delete pendingTransactions[id];\n return true;\n };\n\n const onResultCallback: UserInteractionCallbacks['onResultCallback'] = (result) => {\n const id = getIdForGatedTransaction(result);\n completedTransactions[id] = result;\n delete sentTransactions[id];\n };\n\n return { confirmationCallback, onResultCallback };\n};\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/resolver.ts"],"names":["checkGatedTransaction","__name","registry","gatedTransaction","cachedCheckResult","processedTransaction","onChainData","undefined","params","check","callByPointer","functionPointer","expectationMet","expectedResult","operator","isEqual","comparisonValue","Error","resolveGatedTransaction","activityRegistry","gatedTx","isTransactionSuccessful","processTx","confirmationCallback","fn","cache","dependencyIds","dependencies","map","tx","getIdForGatedTransaction","dependenciesAreAllProcessed","every","id","condition","dependenciesWereSuccessful","result","status","GatedTransactionStatus","DEPENDENCY_FAILED","initialCheckResult","getCachedTxCheckData","cacheSuccessfulTxCheckData","NO_OP","confirmation","DENIED","processed","transaction","finalCheckResult","SUCCESS","submittedTransaction","stringify","o","JSON","_","v","toString","console","error","name","FINAL_CHECK_FAILED","finalOnChainState","e","TRANSACTION_FAILED","transactionError","resolveGatedTransactions","gatedTxes","userInteractionCallbacks","allInternalIds","allDeps","flatMap","allExternalDeps","filter","includes","results","Object","fromEntries","Promise","all","checkResult","gtxId","txFunctions","res","resId","onResultCallback","func","resolveSequencedGatedTransactions","seq","push"],"mappings":"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","file":"XYULD3ZM.cjs","sourcesContent":["import isEqual from 'lodash.isequal';\n\nimport type { ActivityRegistry } from '@layerzerolabs/common-activities';\nimport type { Transaction } from '@layerzerolabs/common-chain-model';\nimport type { WorkflowFunctions } from '@layerzerolabs/common-workflow';\n\nimport { getIdForGatedTransaction } from './gatedTx';\nimport type {\n GatedTransaction,\n GatedTransactionId,\n GatedTransactionResult,\n IGatedTransactionCache,\n InferOnChainDataTypeFromGatedTransaction,\n UserInteractionCallbacks,\n} from './types';\nimport { GatedTransactionStatus } from './types';\n\ntype OnChainCheckResult<DataType = any> = {\n expectationMet: boolean;\n onChainData: DataType;\n};\n\nconst checkGatedTransaction = async <GatedTx extends GatedTransaction>({\n registry,\n gatedTransaction,\n cachedCheckResult,\n processedTransaction,\n}: {\n registry: ActivityRegistry;\n gatedTransaction: GatedTx;\n cachedCheckResult?: InferOnChainDataTypeFromGatedTransaction<GatedTx>;\n processedTransaction?: any;\n}): Promise<OnChainCheckResult<InferOnChainDataTypeFromGatedTransaction<GatedTx>>> => {\n let onChainData: InferOnChainDataTypeFromGatedTransaction<GatedTx>;\n if (cachedCheckResult !== undefined) {\n onChainData = cachedCheckResult;\n } else {\n // Always inject the processed transaction as the last parameter when available\n let params = gatedTransaction.check.params;\n if (processedTransaction !== undefined) {\n params = [...gatedTransaction.check.params, processedTransaction];\n }\n\n onChainData = await registry.callByPointer(gatedTransaction.check.functionPointer, params);\n }\n\n let expectationMet: boolean;\n\n switch (gatedTransaction.check.expectedResult.operator) {\n case '=':\n expectationMet = isEqual(\n onChainData,\n gatedTransaction.check.expectedResult.comparisonValue,\n );\n break;\n case '!=':\n expectationMet = !isEqual(\n onChainData,\n gatedTransaction.check.expectedResult.comparisonValue,\n );\n break;\n case '>':\n expectationMet =\n (onChainData as number) >\n (gatedTransaction.check.expectedResult.comparisonValue as number);\n break;\n case '>=':\n expectationMet =\n (onChainData as number) >=\n (gatedTransaction.check.expectedResult.comparisonValue as number);\n break;\n case '<':\n expectationMet =\n (onChainData as number) <\n (gatedTransaction.check.expectedResult.comparisonValue as number);\n break;\n case '<=':\n expectationMet =\n (onChainData as number) <=\n (gatedTransaction.check.expectedResult.comparisonValue as number);\n break;\n default:\n throw new Error(\n `Gated transaction operator \"${gatedTransaction.check.expectedResult.operator}\" is not supported`,\n );\n }\n\n return {\n expectationMet,\n onChainData,\n };\n};\n\nconst resolveGatedTransaction = async <\n TxType extends Transaction,\n ProcessedTxType extends Transaction,\n GatedTx extends GatedTransaction<string, TxType, any>,\n ProcessTx extends (transaction: TxType) => Promise<ProcessedTxType>,\n>({\n activityRegistry,\n gatedTx,\n isTransactionSuccessful,\n processTx,\n confirmationCallback,\n fn,\n cache,\n}: {\n activityRegistry: ActivityRegistry;\n gatedTx: GatedTx;\n processTx: ProcessTx;\n isTransactionSuccessful: (gtxId: GatedTransactionId) => boolean | undefined;\n confirmationCallback: NonNullable<UserInteractionCallbacks['confirmationCallback']>;\n fn: WorkflowFunctions;\n cache?: IGatedTransactionCache;\n}): Promise<GatedTx & { result: GatedTransactionResult<GatedTx, ProcessedTxType> }> => {\n const dependencyIds = (gatedTx.dependencies ?? []).map((tx) => getIdForGatedTransaction(tx));\n\n const dependenciesAreAllProcessed = () =>\n dependencyIds.every((id) => isTransactionSuccessful(id) != null);\n\n await fn.condition(dependenciesAreAllProcessed);\n\n //check that the dependencies succeeded\n const dependenciesWereSuccessful = dependencyIds.every((id) => isTransactionSuccessful(id));\n\n if (!dependenciesWereSuccessful) {\n return {\n ...gatedTx,\n result: {\n status: GatedTransactionStatus.DEPENDENCY_FAILED,\n },\n };\n }\n\n const initialCheckResult = await checkGatedTransaction({\n gatedTransaction: gatedTx,\n registry: activityRegistry,\n cachedCheckResult: await cache?.getCachedTxCheckData?.(gatedTx),\n });\n\n await cache?.cacheSuccessfulTxCheckData?.(gatedTx, initialCheckResult.onChainData);\n\n if (initialCheckResult.expectationMet) {\n //already met\n return {\n ...gatedTx,\n result: {\n status: GatedTransactionStatus.NO_OP,\n },\n };\n }\n\n //get confirmation before sending\n const confirmation = await confirmationCallback(gatedTx);\n if (!confirmation) {\n return {\n ...gatedTx,\n result: {\n status: GatedTransactionStatus.DENIED,\n },\n };\n }\n\n //send the tx\n try {\n const processed = await processTx(gatedTx.transaction);\n const finalCheckResult = await checkGatedTransaction({\n registry: activityRegistry,\n gatedTransaction: gatedTx,\n processedTransaction: processed,\n });\n\n await cache?.cacheSuccessfulTxCheckData?.(gatedTx, finalCheckResult.onChainData);\n\n if (finalCheckResult.expectationMet) {\n //sent and successful\n return {\n ...gatedTx,\n result: {\n status: GatedTransactionStatus.SUCCESS,\n submittedTransaction: processed,\n },\n };\n } else {\n //sent and unsuccessful\n const stringify = (o: any) =>\n JSON.stringify(o, (_, v) => (typeof v === 'bigint' ? v.toString() : v), 2);\n console.error(\n `Gated transaction ${gatedTx.name} final check failed:\\nExpected result ${stringify(gatedTx.check.expectedResult.comparisonValue)}, but got:\\n${stringify(finalCheckResult.onChainData)}`,\n );\n return {\n ...gatedTx,\n result: {\n status: GatedTransactionStatus.FINAL_CHECK_FAILED,\n submittedTransaction: processed,\n finalOnChainState: finalCheckResult.onChainData,\n },\n };\n }\n } catch (e) {\n //sent and failed\n return {\n ...gatedTx,\n result: {\n status: GatedTransactionStatus.TRANSACTION_FAILED,\n transactionError: e,\n },\n };\n }\n};\n\nexport const resolveGatedTransactions = async <\n TxType extends Transaction,\n ProcessedTxType extends Transaction,\n GatedTx extends GatedTransaction<string, TxType, any>,\n ProcessTx extends (transaction: TxType) => Promise<ProcessedTxType>,\n>({\n activityRegistry,\n gatedTxes,\n processTx,\n fn,\n cache,\n userInteractionCallbacks,\n}: {\n activityRegistry: ActivityRegistry;\n gatedTxes: GatedTx[];\n processTx: ProcessTx;\n fn: WorkflowFunctions;\n cache?: IGatedTransactionCache;\n userInteractionCallbacks?: UserInteractionCallbacks;\n}): Promise<(GatedTx & { result: GatedTransactionResult })[]> => {\n //compute deps\n const allInternalIds = gatedTxes.map((tx) => getIdForGatedTransaction(tx));\n const allDeps = gatedTxes.flatMap((tx) => tx.dependencies ?? []);\n const allExternalDeps = allDeps.filter(\n (tx) => !allInternalIds.includes(getIdForGatedTransaction(tx)),\n );\n\n //prepopulate results for external dependencies\n //this map is only used for internal status tracking\n //map id -> was successful\n const results: Record<GatedTransactionId, boolean> = Object.fromEntries(\n await Promise.all(\n allExternalDeps.map(async (tx) => {\n const checkResult = await checkGatedTransaction({\n gatedTransaction: tx,\n registry: activityRegistry,\n cachedCheckResult: await cache?.getCachedTxCheckData?.(tx),\n });\n\n return [getIdForGatedTransaction(tx), checkResult.expectationMet];\n }),\n ),\n );\n\n const isTransactionSuccessful = (gtxId: GatedTransactionId) => results[gtxId];\n\n const txFunctions = gatedTxes.map((tx) => async () => {\n const res = await resolveGatedTransaction<TxType, ProcessedTxType, GatedTx, ProcessTx>({\n gatedTx: tx,\n activityRegistry,\n isTransactionSuccessful,\n processTx,\n confirmationCallback:\n userInteractionCallbacks?.confirmationCallback ?? (async () => true),\n fn,\n cache,\n });\n\n const resId = getIdForGatedTransaction(res);\n results[resId] = [GatedTransactionStatus.SUCCESS, GatedTransactionStatus.NO_OP].includes(\n res.result.status,\n );\n\n userInteractionCallbacks?.onResultCallback?.(res);\n return res;\n });\n\n return await Promise.all(txFunctions.map((func) => func()));\n};\n\nexport const resolveSequencedGatedTransactions = async <\n TxType extends Transaction,\n ProcessedTxType extends Transaction,\n GatedTx extends GatedTransaction<string, TxType, any>,\n ProcessTx extends (transaction: TxType) => Promise<ProcessedTxType>,\n>({\n activityRegistry,\n gatedTxes,\n processTx,\n cache,\n userInteractionCallbacks,\n fn,\n}: {\n activityRegistry: ActivityRegistry;\n gatedTxes: GatedTx[][];\n processTx: ProcessTx;\n fn: WorkflowFunctions;\n cache?: IGatedTransactionCache;\n userInteractionCallbacks?: UserInteractionCallbacks;\n}) => {\n const results = [];\n for (const seq of gatedTxes) {\n const result = await resolveGatedTransactions<TxType, ProcessedTxType, GatedTx, ProcessTx>({\n gatedTxes: seq,\n activityRegistry,\n processTx,\n cache,\n userInteractionCallbacks,\n fn,\n });\n results.push(result);\n }\n\n return results;\n};\n"]}