smart-multisig-engine 0.1.0 → 0.1.1
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.
- package/README.md +192 -0
- package/dist/react.cjs +56 -6
- package/dist/react.cjs.map +1 -1
- package/dist/react.d.cts +44 -3
- package/dist/react.d.ts +44 -3
- package/dist/react.js +53 -4
- package/dist/react.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -12,6 +12,8 @@ pnpm add smart-multisig-engine
|
|
|
12
12
|
|
|
13
13
|
Peer dependencies: `@wagmi/core`, `viem`.
|
|
14
14
|
|
|
15
|
+
Optional peer dependencies for React hooks: `react`, `@tanstack/react-query`.
|
|
16
|
+
|
|
15
17
|
## Quick Start
|
|
16
18
|
|
|
17
19
|
Use `submitTx` with the generic adapter interface to submit transactions to any supported multisig:
|
|
@@ -392,6 +394,196 @@ const result = await safe.waitForExecution({
|
|
|
392
394
|
console.log("Executed:", result.transactionHash);
|
|
393
395
|
```
|
|
394
396
|
|
|
397
|
+
## React Hooks
|
|
398
|
+
|
|
399
|
+
The library provides React Query hooks via a separate entry point. These hooks wrap the adapter functions and provide a familiar React Query interface.
|
|
400
|
+
|
|
401
|
+
```bash
|
|
402
|
+
# Requires these peer dependencies
|
|
403
|
+
pnpm add react @tanstack/react-query
|
|
404
|
+
```
|
|
405
|
+
|
|
406
|
+
```typescript
|
|
407
|
+
import {
|
|
408
|
+
useSubmitTx,
|
|
409
|
+
useWaitForExecution,
|
|
410
|
+
useWaitForExecutionReceipt,
|
|
411
|
+
useFetchPendingTxs,
|
|
412
|
+
useSimulate,
|
|
413
|
+
useWrite,
|
|
414
|
+
} from "smart-multisig-engine/react";
|
|
415
|
+
```
|
|
416
|
+
|
|
417
|
+
### Hooks Overview
|
|
418
|
+
|
|
419
|
+
| Hook | Type | Description |
|
|
420
|
+
|------|------|-------------|
|
|
421
|
+
| `useSubmitTx` | Mutation | Submit a transaction through an adapter |
|
|
422
|
+
| `useWaitForExecution` | Query | Wait for a transaction to be executed |
|
|
423
|
+
| `useWaitForExecutionReceipt` | Query | Wait for execution + fetch receipt with logs |
|
|
424
|
+
| `useFetchPendingTxs` | Query | Fetch pending transactions for a wallet |
|
|
425
|
+
| `useSimulate` | Query | Simulate a contract call |
|
|
426
|
+
| `useWrite` | Mutation | Write a contract call |
|
|
427
|
+
|
|
428
|
+
### `useSubmitTx`
|
|
429
|
+
|
|
430
|
+
Mutation hook for submitting transactions.
|
|
431
|
+
|
|
432
|
+
```typescript
|
|
433
|
+
const { mutate, mutateAsync, isPending, isSuccess, data } = useSubmitTx();
|
|
434
|
+
|
|
435
|
+
// Submit a transaction
|
|
436
|
+
mutate({
|
|
437
|
+
adapter: "safe",
|
|
438
|
+
config,
|
|
439
|
+
walletAddress: "0xSafe...",
|
|
440
|
+
address: "0xContract...",
|
|
441
|
+
abi,
|
|
442
|
+
functionName: "transfer",
|
|
443
|
+
args: [recipient, amount],
|
|
444
|
+
chainId: 11155111n,
|
|
445
|
+
});
|
|
446
|
+
|
|
447
|
+
// Or with async/await
|
|
448
|
+
const { txHash } = await mutateAsync({ ... });
|
|
449
|
+
```
|
|
450
|
+
|
|
451
|
+
### `useWaitForExecution`
|
|
452
|
+
|
|
453
|
+
Query hook that waits for a Safe transaction to be executed. Maintains a stable loading state throughout polling (similar to wagmi's `useWaitForTransactionReceipt`).
|
|
454
|
+
|
|
455
|
+
```typescript
|
|
456
|
+
interface UseWaitForExecutionOptions {
|
|
457
|
+
adapter: "safe";
|
|
458
|
+
txHash: string;
|
|
459
|
+
chainId: bigint;
|
|
460
|
+
txServiceUrl?: string;
|
|
461
|
+
apiKey?: string;
|
|
462
|
+
enabled?: boolean; // Default: true
|
|
463
|
+
pollingInterval?: number; // Default: 5000ms
|
|
464
|
+
timeout?: number; // Default: 120000ms (2 min)
|
|
465
|
+
}
|
|
466
|
+
```
|
|
467
|
+
|
|
468
|
+
```typescript
|
|
469
|
+
const { data, isLoading, isSuccess, isError } = useWaitForExecution({
|
|
470
|
+
adapter: "safe",
|
|
471
|
+
txHash: safeTxHash,
|
|
472
|
+
chainId: 11155111n,
|
|
473
|
+
timeout: 120000, // Fail after 2 minutes
|
|
474
|
+
enabled: !!safeTxHash,
|
|
475
|
+
});
|
|
476
|
+
|
|
477
|
+
// States are stable throughout polling:
|
|
478
|
+
// - isLoading = true while waiting
|
|
479
|
+
// - isSuccess = true once executed
|
|
480
|
+
// - isError = true if timeout reached
|
|
481
|
+
|
|
482
|
+
if (isSuccess) {
|
|
483
|
+
console.log("Executed:", data.transactionHash);
|
|
484
|
+
}
|
|
485
|
+
```
|
|
486
|
+
|
|
487
|
+
### `useWaitForExecutionReceipt`
|
|
488
|
+
|
|
489
|
+
Query hook that waits for execution AND fetches the full transaction receipt with logs.
|
|
490
|
+
|
|
491
|
+
```typescript
|
|
492
|
+
interface UseWaitForExecutionReceiptOptions {
|
|
493
|
+
adapter: "safe";
|
|
494
|
+
txHash: string;
|
|
495
|
+
chainId: bigint;
|
|
496
|
+
config: Config; // wagmi config for fetching receipt
|
|
497
|
+
txServiceUrl?: string;
|
|
498
|
+
apiKey?: string;
|
|
499
|
+
enabled?: boolean; // Default: true
|
|
500
|
+
pollingInterval?: number; // Default: 5000ms
|
|
501
|
+
timeout?: number; // Default: 120000ms
|
|
502
|
+
confirmations?: number; // Default: 1
|
|
503
|
+
}
|
|
504
|
+
```
|
|
505
|
+
|
|
506
|
+
```typescript
|
|
507
|
+
const { data, isLoading, isSuccess } = useWaitForExecutionReceipt({
|
|
508
|
+
adapter: "safe",
|
|
509
|
+
txHash: safeTxHash,
|
|
510
|
+
chainId: 11155111n,
|
|
511
|
+
config: wagmiConfig,
|
|
512
|
+
confirmations: 1,
|
|
513
|
+
});
|
|
514
|
+
|
|
515
|
+
if (isSuccess) {
|
|
516
|
+
console.log("Transaction hash:", data.transactionHash);
|
|
517
|
+
console.log("Logs:", data.receipt.logs);
|
|
518
|
+
console.log("Gas used:", data.receipt.gasUsed);
|
|
519
|
+
}
|
|
520
|
+
```
|
|
521
|
+
|
|
522
|
+
### `useFetchPendingTxs`
|
|
523
|
+
|
|
524
|
+
Query hook for fetching pending transactions.
|
|
525
|
+
|
|
526
|
+
```typescript
|
|
527
|
+
const { data: pending, isLoading } = useFetchPendingTxs({
|
|
528
|
+
adapter: "safe",
|
|
529
|
+
walletAddress: "0xSafe...",
|
|
530
|
+
chainId: 11155111n,
|
|
531
|
+
refetchInterval: 10000, // Optional: auto-refresh every 10s
|
|
532
|
+
});
|
|
533
|
+
```
|
|
534
|
+
|
|
535
|
+
### Full Example
|
|
536
|
+
|
|
537
|
+
```typescript
|
|
538
|
+
import { useSubmitTx, useWaitForExecutionReceipt } from "smart-multisig-engine/react";
|
|
539
|
+
|
|
540
|
+
function SafeTransaction() {
|
|
541
|
+
const submitTx = useSubmitTx();
|
|
542
|
+
|
|
543
|
+
const { data, isLoading, isSuccess } = useWaitForExecutionReceipt({
|
|
544
|
+
adapter: "safe",
|
|
545
|
+
txHash: submitTx.data?.txHash,
|
|
546
|
+
chainId: 11155111n,
|
|
547
|
+
config: wagmiConfig,
|
|
548
|
+
enabled: !!submitTx.data?.txHash,
|
|
549
|
+
});
|
|
550
|
+
|
|
551
|
+
const handleSubmit = () => {
|
|
552
|
+
submitTx.mutate({
|
|
553
|
+
adapter: "safe",
|
|
554
|
+
config: wagmiConfig,
|
|
555
|
+
walletAddress: safeAddress,
|
|
556
|
+
address: contractAddress,
|
|
557
|
+
abi: contractAbi,
|
|
558
|
+
functionName: "transfer",
|
|
559
|
+
args: [recipient, amount],
|
|
560
|
+
chainId: 11155111n,
|
|
561
|
+
});
|
|
562
|
+
};
|
|
563
|
+
|
|
564
|
+
return (
|
|
565
|
+
<div>
|
|
566
|
+
<button onClick={handleSubmit} disabled={submitTx.isPending}>
|
|
567
|
+
{submitTx.isPending ? "Submitting..." : "Submit Transaction"}
|
|
568
|
+
</button>
|
|
569
|
+
|
|
570
|
+
{submitTx.isSuccess && !isSuccess && (
|
|
571
|
+
<p>Waiting for execution... {isLoading && "(polling)"}</p>
|
|
572
|
+
)}
|
|
573
|
+
|
|
574
|
+
{isSuccess && (
|
|
575
|
+
<div>
|
|
576
|
+
<p>Executed: {data.transactionHash}</p>
|
|
577
|
+
<p>Gas used: {data.receipt.gasUsed.toString()}</p>
|
|
578
|
+
</div>
|
|
579
|
+
)}
|
|
580
|
+
</div>
|
|
581
|
+
);
|
|
582
|
+
}
|
|
583
|
+
```
|
|
584
|
+
|
|
585
|
+
---
|
|
586
|
+
|
|
395
587
|
## Development
|
|
396
588
|
|
|
397
589
|
```bash
|
package/dist/react.cjs
CHANGED
|
@@ -34,6 +34,7 @@ __export(react_exports, {
|
|
|
34
34
|
useSimulate: () => useSimulate,
|
|
35
35
|
useSubmitTx: () => useSubmitTx,
|
|
36
36
|
useWaitForExecution: () => useWaitForExecution,
|
|
37
|
+
useWaitForExecutionReceipt: () => useWaitForExecutionReceipt,
|
|
37
38
|
useWrite: () => useWrite
|
|
38
39
|
});
|
|
39
40
|
module.exports = __toCommonJS(react_exports);
|
|
@@ -270,11 +271,59 @@ function useWaitForExecution(options) {
|
|
|
270
271
|
});
|
|
271
272
|
}
|
|
272
273
|
|
|
273
|
-
// src/react/use-
|
|
274
|
+
// src/react/use-wait-for-execution-receipt.ts
|
|
274
275
|
var import_react_query3 = require("@tanstack/react-query");
|
|
276
|
+
var import_core3 = require("@wagmi/core");
|
|
277
|
+
function useWaitForExecutionReceipt(options) {
|
|
278
|
+
const {
|
|
279
|
+
config,
|
|
280
|
+
enabled = true,
|
|
281
|
+
pollingInterval = 5e3,
|
|
282
|
+
timeout = 12e4,
|
|
283
|
+
confirmations = 1,
|
|
284
|
+
...waitOptions
|
|
285
|
+
} = options;
|
|
286
|
+
const maxAttempts = Math.ceil(timeout / pollingInterval);
|
|
287
|
+
return (0, import_react_query3.useQuery)({
|
|
288
|
+
queryKey: [
|
|
289
|
+
"adapter",
|
|
290
|
+
options.adapter,
|
|
291
|
+
"waitForExecutionReceipt",
|
|
292
|
+
options.txHash,
|
|
293
|
+
options.chainId.toString(),
|
|
294
|
+
confirmations
|
|
295
|
+
],
|
|
296
|
+
queryFn: async () => {
|
|
297
|
+
const { transactionHash } = await waitForExecution2({
|
|
298
|
+
...waitOptions,
|
|
299
|
+
pollingInterval,
|
|
300
|
+
maxAttempts
|
|
301
|
+
});
|
|
302
|
+
const receipt = await (0, import_core3.waitForTransactionReceipt)(config, {
|
|
303
|
+
hash: transactionHash,
|
|
304
|
+
confirmations
|
|
305
|
+
});
|
|
306
|
+
return {
|
|
307
|
+
transactionHash,
|
|
308
|
+
receipt
|
|
309
|
+
};
|
|
310
|
+
},
|
|
311
|
+
enabled: enabled && !!options.txHash,
|
|
312
|
+
refetchInterval: false,
|
|
313
|
+
refetchOnWindowFocus: false,
|
|
314
|
+
refetchOnMount: false,
|
|
315
|
+
refetchOnReconnect: false,
|
|
316
|
+
retry: false,
|
|
317
|
+
staleTime: Infinity,
|
|
318
|
+
gcTime: 1e3 * 60 * 5
|
|
319
|
+
});
|
|
320
|
+
}
|
|
321
|
+
|
|
322
|
+
// src/react/use-fetch-pending-txs.ts
|
|
323
|
+
var import_react_query4 = require("@tanstack/react-query");
|
|
275
324
|
function useFetchPendingTxs(options) {
|
|
276
325
|
const { enabled = true, refetchInterval = false, ...fetchOptions } = options;
|
|
277
|
-
return (0,
|
|
326
|
+
return (0, import_react_query4.useQuery)({
|
|
278
327
|
queryKey: [
|
|
279
328
|
"adapter",
|
|
280
329
|
options.adapter,
|
|
@@ -289,10 +338,10 @@ function useFetchPendingTxs(options) {
|
|
|
289
338
|
}
|
|
290
339
|
|
|
291
340
|
// src/react/use-simulate.ts
|
|
292
|
-
var
|
|
341
|
+
var import_react_query5 = require("@tanstack/react-query");
|
|
293
342
|
function useSimulate(options) {
|
|
294
343
|
const { enabled = true, ...simulateOptions } = options;
|
|
295
|
-
return (0,
|
|
344
|
+
return (0, import_react_query5.useQuery)({
|
|
296
345
|
queryKey: [
|
|
297
346
|
"adapter",
|
|
298
347
|
options.adapter,
|
|
@@ -307,9 +356,9 @@ function useSimulate(options) {
|
|
|
307
356
|
}
|
|
308
357
|
|
|
309
358
|
// src/react/use-write.ts
|
|
310
|
-
var
|
|
359
|
+
var import_react_query6 = require("@tanstack/react-query");
|
|
311
360
|
function useWrite() {
|
|
312
|
-
return (0,
|
|
361
|
+
return (0, import_react_query6.useMutation)({
|
|
313
362
|
mutationFn: (options) => write(options)
|
|
314
363
|
});
|
|
315
364
|
}
|
|
@@ -319,6 +368,7 @@ function useWrite() {
|
|
|
319
368
|
useSimulate,
|
|
320
369
|
useSubmitTx,
|
|
321
370
|
useWaitForExecution,
|
|
371
|
+
useWaitForExecutionReceipt,
|
|
322
372
|
useWrite
|
|
323
373
|
});
|
|
324
374
|
//# sourceMappingURL=react.cjs.map
|
package/dist/react.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/react/index.ts","../src/react/use-submit-tx.ts","../src/adapters/safe/simulate-contract-call.ts","../src/adapters/safe/write-contract-call.ts","../src/adapters/safe/fetch-pending-transactions.ts","../src/core/extract-call-data.ts","../src/core/match-pending-tx.ts","../src/adapters/safe/submit-and-find-safe-tx.ts","../src/adapters/safe/wait-for-execution.ts","../src/adapters/registry.ts","../src/adapters/index.ts","../src/react/use-wait-for-execution.ts","../src/react/use-fetch-pending-txs.ts","../src/react/use-simulate.ts","../src/react/use-write.ts"],"sourcesContent":["export * from \"./use-submit-tx.js\";\nexport * from \"./use-wait-for-execution.js\";\nexport * from \"./use-fetch-pending-txs.js\";\nexport * from \"./use-simulate.js\";\nexport * from \"./use-write.js\";\n","import { useMutation } from \"@tanstack/react-query\";\nimport { submitTx } from \"../adapters/index.js\";\nimport type { SubmitTxOptions, SubmitTxResult } from \"../adapters/types.js\";\n\nexport type UseSubmitTxOptions = Omit<SubmitTxOptions, \"config\"> & {\n config: SubmitTxOptions[\"config\"];\n};\n\nexport function useSubmitTx() {\n return useMutation<SubmitTxResult, Error, UseSubmitTxOptions>({\n mutationFn: (options) => submitTx(options),\n });\n}\n","import { simulateContract, type Config } from \"@wagmi/core\";\nimport type { ContractCallParams } from \"../../core/types.js\";\n\nexport async function simulateContractCall(\n config: Config,\n params: ContractCallParams,\n) {\n return simulateContract(config, {\n address: params.address,\n abi: params.abi,\n functionName: params.functionName,\n args: params.args as unknown[],\n value: params.value,\n chainId: params.chainId,\n account: params.account,\n });\n}\n","import { writeContract, type Config } from \"@wagmi/core\";\nimport type { Hex } from \"viem\";\n\nexport async function writeContractCall(\n config: Config,\n request: Parameters<typeof writeContract>[1],\n): Promise<Hex> {\n return writeContract(config, request);\n}\n","import SafeApiKit from \"@safe-global/api-kit\";\nimport type { SafeMultisigTransactionResponse } from \"@safe-global/types-kit\";\n\nexport interface FetchPendingTransactionsParams {\n chainId: bigint;\n safeAddress: string;\n txServiceUrl?: string;\n apiKey?: string;\n}\n\nexport async function fetchPendingTransactions(\n params: FetchPendingTransactionsParams,\n): Promise<SafeMultisigTransactionResponse[]> {\n const apiKit = new SafeApiKit({\n chainId: params.chainId,\n ...(params.txServiceUrl && { txServiceUrl: params.txServiceUrl }),\n apiKey: params.apiKey,\n });\n\n const response = await apiKit.getPendingTransactions(params.safeAddress);\n return response.results;\n}\n","import type { Abi, Address } from \"viem\";\nimport { encodeFunctionData } from \"viem\";\nimport type { EncodedCallData } from \"./types.js\";\n\nexport function extractCallData(params: {\n abi: Abi;\n functionName: string;\n args?: readonly unknown[];\n address: Address;\n value?: bigint;\n}): EncodedCallData {\n const data = encodeFunctionData({\n abi: params.abi,\n functionName: params.functionName,\n args: params.args as unknown[],\n });\n\n return {\n to: params.address,\n data,\n value: params.value ?? 0n,\n };\n}\n","import type { SafeMultisigTransactionResponse } from \"@safe-global/types-kit\";\nimport type { TxMatchCriteria } from \"./types.js\";\n\nexport function matchPendingTransaction(\n pendingTxs: SafeMultisigTransactionResponse[],\n criteria: TxMatchCriteria,\n): SafeMultisigTransactionResponse | undefined {\n return pendingTxs.find(\n (tx) =>\n tx.to.toLowerCase() === criteria.to.toLowerCase() &&\n tx.value === String(criteria.value) &&\n tx.data?.toLowerCase() === criteria.data.toLowerCase(),\n );\n}\n","import { extractCallData } from \"../../core/extract-call-data.js\";\nimport { matchPendingTransaction } from \"../../core/match-pending-tx.js\";\nimport { fetchPendingTransactions } from \"./fetch-pending-transactions.js\";\nimport { simulateContractCall } from \"./simulate-contract-call.js\";\nimport { writeContractCall } from \"./write-contract-call.js\";\nimport type {\n SubmitAndFindSafeTxOptions,\n SubmitAndFindSafeTxResult,\n} from \"./types.js\";\n\nfunction delay(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nexport async function submitAndFindSafeTx(\n options: SubmitAndFindSafeTxOptions,\n): Promise<SubmitAndFindSafeTxResult> {\n const {\n config,\n safeAddress,\n txServiceUrl,\n apiKey,\n pollingInterval = 3000,\n maxAttempts = 20,\n ...callParams\n } = options;\n\n const callData = extractCallData(callParams);\n\n const simulation = await simulateContractCall(config, callParams);\n\n await writeContractCall(config, simulation.request as Parameters<typeof writeContractCall>[1]);\n\n const chainId = BigInt(callParams.chainId ?? (await getChainId(config)));\n\n for (let attempt = 0; attempt < maxAttempts; attempt++) {\n await delay(pollingInterval);\n\n const pendingTxs = await fetchPendingTransactions({\n chainId,\n safeAddress,\n txServiceUrl,\n apiKey,\n });\n const match = matchPendingTransaction(pendingTxs, callData);\n\n if (match) {\n return {\n safeTxHash: match.safeTxHash,\n };\n }\n }\n\n throw new Error(\n `Could not find matching Safe transaction after ${maxAttempts} attempts`,\n );\n}\n\nasync function getChainId(config: Parameters<typeof simulateContractCall>[0]): Promise<number> {\n const { getChainId: wagmiGetChainId } = await import(\"@wagmi/core\");\n return wagmiGetChainId(config);\n}\n","import SafeApiKit from \"@safe-global/api-kit\";\nimport type {\n WaitForExecutionOptions,\n WaitForExecutionResult,\n} from \"./types.js\";\n\nfunction delay(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nexport async function waitForExecution(\n options: WaitForExecutionOptions,\n): Promise<WaitForExecutionResult> {\n const {\n safeTxHash,\n chainId,\n txServiceUrl,\n apiKey,\n pollingInterval = 5000,\n maxAttempts = 60,\n } = options;\n\n const apiKit = new SafeApiKit({\n chainId,\n ...(txServiceUrl && { txServiceUrl }),\n apiKey,\n });\n\n for (let attempt = 0; attempt < maxAttempts; attempt++) {\n const tx = await apiKit.getTransaction(safeTxHash);\n\n if (tx.isExecuted && tx.transactionHash) {\n return {\n transactionHash: tx.transactionHash,\n };\n }\n\n await delay(pollingInterval);\n }\n\n throw new Error(\n `Safe transaction ${safeTxHash} was not executed after ${maxAttempts} attempts`,\n );\n}\n","import * as safe from \"./safe/index.js\";\n\nexport const adapters = {\n safe: {\n submitTx: safe.submitAndFindSafeTx,\n waitForExecution: safe.waitForExecution,\n fetchPending: safe.fetchPendingTransactions,\n simulate: safe.simulateContractCall,\n write: safe.writeContractCall,\n },\n} as const;\n\nexport type AdapterRegistry = typeof adapters;\n","import { adapters } from \"./registry.js\";\nimport type {\n AdapterType,\n SubmitTxOptions,\n SubmitTxResult,\n WaitForExecutionOptions,\n WaitForExecutionResult,\n FetchPendingOptions,\n SimulateOptions,\n WriteOptions,\n} from \"./types.js\";\n\n// Re-export types\nexport * from \"./types.js\";\n\n// Re-export Safe adapter for direct access\nexport * as safe from \"./safe/index.js\";\n\n// Generic entry functions\n\nexport async function submitTx(\n options: SubmitTxOptions,\n): Promise<SubmitTxResult> {\n const { adapter, walletAddress, ...rest } = options;\n assertAdapter(adapter);\n\n const result = await adapters[adapter].submitTx({\n safeAddress: walletAddress,\n ...rest,\n });\n\n return { txHash: result.safeTxHash };\n}\n\nexport async function waitForExecution(\n options: WaitForExecutionOptions,\n): Promise<WaitForExecutionResult> {\n const { adapter, txHash, ...rest } = options;\n assertAdapter(adapter);\n\n const result = await adapters[adapter].waitForExecution({\n safeTxHash: txHash,\n ...rest,\n });\n\n return { transactionHash: result.transactionHash };\n}\n\nexport async function fetchPendingTxs(\n options: FetchPendingOptions,\n): Promise<unknown[]> {\n const { adapter, walletAddress, ...rest } = options;\n assertAdapter(adapter);\n\n return adapters[adapter].fetchPending({\n safeAddress: walletAddress,\n ...rest,\n });\n}\n\nexport async function simulate(\n options: SimulateOptions,\n): Promise<unknown> {\n const { adapter, config, ...params } = options;\n assertAdapter(adapter);\n\n return adapters[adapter].simulate(config, params);\n}\n\nexport async function write(\n options: WriteOptions,\n): Promise<string> {\n const { adapter, config, request } = options;\n assertAdapter(adapter);\n\n return adapters[adapter].write(config, request as Parameters<typeof adapters.safe.write>[1]);\n}\n\nfunction assertAdapter(adapter: AdapterType): asserts adapter is keyof typeof adapters {\n if (!(adapter in adapters)) {\n throw new Error(`Unknown adapter: ${adapter}. Available: ${Object.keys(adapters).join(\", \")}`);\n }\n}\n","import { useQuery } from \"@tanstack/react-query\";\nimport { waitForExecution } from \"../adapters/index.js\";\nimport type { WaitForExecutionOptions, WaitForExecutionResult } from \"../adapters/types.js\";\n\nexport interface UseWaitForExecutionOptions extends Omit<WaitForExecutionOptions, \"maxAttempts\"> {\n /** Enable/disable the query. Defaults to true. */\n enabled?: boolean;\n /** Polling interval in ms. Defaults to 5000. */\n pollingInterval?: number;\n /** Timeout in ms. After this duration, the query will fail. Defaults to 120000 (2 min). */\n timeout?: number;\n}\n\n/**\n * Hook to wait for a Safe transaction to be executed on-chain.\n *\n * Unlike standard polling queries, this hook maintains a stable loading state\n * throughout the polling process (similar to wagmi's useWaitForTransactionReceipt):\n * - `isLoading` = true while waiting for execution\n * - `isSuccess` = true once transaction is executed\n * - `isError` = true if timeout is reached\n */\nexport function useWaitForExecution(options: UseWaitForExecutionOptions) {\n const {\n enabled = true,\n pollingInterval = 5000,\n timeout = 120000,\n ...waitOptions\n } = options;\n\n // Calculate max attempts from timeout and polling interval\n const maxAttempts = Math.ceil(timeout / pollingInterval);\n\n return useQuery<WaitForExecutionResult, Error>({\n queryKey: [\n \"adapter\",\n options.adapter,\n \"waitForExecution\",\n options.txHash,\n options.chainId.toString(),\n ],\n queryFn: () =>\n waitForExecution({\n ...waitOptions,\n pollingInterval,\n maxAttempts,\n }),\n enabled: enabled && !!options.txHash,\n // Don't refetch - the query handles polling internally\n refetchInterval: false,\n refetchOnWindowFocus: false,\n refetchOnMount: false,\n refetchOnReconnect: false,\n // Don't retry on error - timeout is intentional\n retry: false,\n // Keep data fresh\n staleTime: Infinity,\n // Cache result for this specific txHash\n gcTime: 1000 * 60 * 5, // 5 minutes\n });\n}\n","import { useQuery } from \"@tanstack/react-query\";\nimport { fetchPendingTxs } from \"../adapters/index.js\";\nimport type { FetchPendingOptions } from \"../adapters/types.js\";\n\nexport interface UseFetchPendingTxsOptions extends FetchPendingOptions {\n enabled?: boolean;\n refetchInterval?: number | false;\n}\n\nexport function useFetchPendingTxs(options: UseFetchPendingTxsOptions) {\n const { enabled = true, refetchInterval = false, ...fetchOptions } = options;\n\n return useQuery<unknown[], Error>({\n queryKey: [\n \"adapter\",\n options.adapter,\n \"pendingTxs\",\n options.walletAddress,\n options.chainId.toString(),\n ],\n queryFn: () => fetchPendingTxs(fetchOptions),\n enabled: enabled && !!options.walletAddress,\n refetchInterval,\n });\n}\n","import { useQuery } from \"@tanstack/react-query\";\nimport { simulate } from \"../adapters/index.js\";\nimport type { SimulateOptions } from \"../adapters/types.js\";\n\nexport interface UseSimulateOptions extends SimulateOptions {\n enabled?: boolean;\n}\n\nexport function useSimulate(options: UseSimulateOptions) {\n const { enabled = true, ...simulateOptions } = options;\n\n return useQuery<unknown, Error>({\n queryKey: [\n \"adapter\",\n options.adapter,\n \"simulate\",\n options.address,\n options.functionName,\n JSON.stringify(options.args),\n ],\n queryFn: () => simulate(simulateOptions),\n enabled,\n });\n}\n","import { useMutation } from \"@tanstack/react-query\";\nimport { write } from \"../adapters/index.js\";\nimport type { WriteOptions } from \"../adapters/types.js\";\n\nexport function useWrite() {\n return useMutation<string, Error, WriteOptions>({\n mutationFn: (options) => write(options),\n });\n}\n"],"mappings":"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","names":["import_core","SafeApiKit","import_api_kit","delay","SafeApiKit","waitForExecution","import_react_query","waitForExecution","import_react_query","import_react_query","import_react_query"]}
|
|
1
|
+
{"version":3,"sources":["../src/react/index.ts","../src/react/use-submit-tx.ts","../src/adapters/safe/simulate-contract-call.ts","../src/adapters/safe/write-contract-call.ts","../src/adapters/safe/fetch-pending-transactions.ts","../src/core/extract-call-data.ts","../src/core/match-pending-tx.ts","../src/adapters/safe/submit-and-find-safe-tx.ts","../src/adapters/safe/wait-for-execution.ts","../src/adapters/registry.ts","../src/adapters/index.ts","../src/react/use-wait-for-execution.ts","../src/react/use-wait-for-execution-receipt.ts","../src/react/use-fetch-pending-txs.ts","../src/react/use-simulate.ts","../src/react/use-write.ts"],"sourcesContent":["export * from \"./use-submit-tx.js\";\nexport * from \"./use-wait-for-execution.js\";\nexport * from \"./use-wait-for-execution-receipt.js\";\nexport * from \"./use-fetch-pending-txs.js\";\nexport * from \"./use-simulate.js\";\nexport * from \"./use-write.js\";\n","import { useMutation } from \"@tanstack/react-query\";\nimport { submitTx } from \"../adapters/index.js\";\nimport type { SubmitTxOptions, SubmitTxResult } from \"../adapters/types.js\";\n\nexport type UseSubmitTxOptions = Omit<SubmitTxOptions, \"config\"> & {\n config: SubmitTxOptions[\"config\"];\n};\n\nexport function useSubmitTx() {\n return useMutation<SubmitTxResult, Error, UseSubmitTxOptions>({\n mutationFn: (options) => submitTx(options),\n });\n}\n","import { simulateContract, type Config } from \"@wagmi/core\";\nimport type { ContractCallParams } from \"../../core/types.js\";\n\nexport async function simulateContractCall(\n config: Config,\n params: ContractCallParams,\n) {\n return simulateContract(config, {\n address: params.address,\n abi: params.abi,\n functionName: params.functionName,\n args: params.args as unknown[],\n value: params.value,\n chainId: params.chainId,\n account: params.account,\n });\n}\n","import { writeContract, type Config } from \"@wagmi/core\";\nimport type { Hex } from \"viem\";\n\nexport async function writeContractCall(\n config: Config,\n request: Parameters<typeof writeContract>[1],\n): Promise<Hex> {\n return writeContract(config, request);\n}\n","import SafeApiKit from \"@safe-global/api-kit\";\nimport type { SafeMultisigTransactionResponse } from \"@safe-global/types-kit\";\n\nexport interface FetchPendingTransactionsParams {\n chainId: bigint;\n safeAddress: string;\n txServiceUrl?: string;\n apiKey?: string;\n}\n\nexport async function fetchPendingTransactions(\n params: FetchPendingTransactionsParams,\n): Promise<SafeMultisigTransactionResponse[]> {\n const apiKit = new SafeApiKit({\n chainId: params.chainId,\n ...(params.txServiceUrl && { txServiceUrl: params.txServiceUrl }),\n apiKey: params.apiKey,\n });\n\n const response = await apiKit.getPendingTransactions(params.safeAddress);\n return response.results;\n}\n","import type { Abi, Address } from \"viem\";\nimport { encodeFunctionData } from \"viem\";\nimport type { EncodedCallData } from \"./types.js\";\n\nexport function extractCallData(params: {\n abi: Abi;\n functionName: string;\n args?: readonly unknown[];\n address: Address;\n value?: bigint;\n}): EncodedCallData {\n const data = encodeFunctionData({\n abi: params.abi,\n functionName: params.functionName,\n args: params.args as unknown[],\n });\n\n return {\n to: params.address,\n data,\n value: params.value ?? 0n,\n };\n}\n","import type { SafeMultisigTransactionResponse } from \"@safe-global/types-kit\";\nimport type { TxMatchCriteria } from \"./types.js\";\n\nexport function matchPendingTransaction(\n pendingTxs: SafeMultisigTransactionResponse[],\n criteria: TxMatchCriteria,\n): SafeMultisigTransactionResponse | undefined {\n return pendingTxs.find(\n (tx) =>\n tx.to.toLowerCase() === criteria.to.toLowerCase() &&\n tx.value === String(criteria.value) &&\n tx.data?.toLowerCase() === criteria.data.toLowerCase(),\n );\n}\n","import { extractCallData } from \"../../core/extract-call-data.js\";\nimport { matchPendingTransaction } from \"../../core/match-pending-tx.js\";\nimport { fetchPendingTransactions } from \"./fetch-pending-transactions.js\";\nimport { simulateContractCall } from \"./simulate-contract-call.js\";\nimport { writeContractCall } from \"./write-contract-call.js\";\nimport type {\n SubmitAndFindSafeTxOptions,\n SubmitAndFindSafeTxResult,\n} from \"./types.js\";\n\nfunction delay(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nexport async function submitAndFindSafeTx(\n options: SubmitAndFindSafeTxOptions,\n): Promise<SubmitAndFindSafeTxResult> {\n const {\n config,\n safeAddress,\n txServiceUrl,\n apiKey,\n pollingInterval = 3000,\n maxAttempts = 20,\n ...callParams\n } = options;\n\n const callData = extractCallData(callParams);\n\n const simulation = await simulateContractCall(config, callParams);\n\n await writeContractCall(config, simulation.request as Parameters<typeof writeContractCall>[1]);\n\n const chainId = BigInt(callParams.chainId ?? (await getChainId(config)));\n\n for (let attempt = 0; attempt < maxAttempts; attempt++) {\n await delay(pollingInterval);\n\n const pendingTxs = await fetchPendingTransactions({\n chainId,\n safeAddress,\n txServiceUrl,\n apiKey,\n });\n const match = matchPendingTransaction(pendingTxs, callData);\n\n if (match) {\n return {\n safeTxHash: match.safeTxHash,\n };\n }\n }\n\n throw new Error(\n `Could not find matching Safe transaction after ${maxAttempts} attempts`,\n );\n}\n\nasync function getChainId(config: Parameters<typeof simulateContractCall>[0]): Promise<number> {\n const { getChainId: wagmiGetChainId } = await import(\"@wagmi/core\");\n return wagmiGetChainId(config);\n}\n","import SafeApiKit from \"@safe-global/api-kit\";\nimport type {\n WaitForExecutionOptions,\n WaitForExecutionResult,\n} from \"./types.js\";\n\nfunction delay(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nexport async function waitForExecution(\n options: WaitForExecutionOptions,\n): Promise<WaitForExecutionResult> {\n const {\n safeTxHash,\n chainId,\n txServiceUrl,\n apiKey,\n pollingInterval = 5000,\n maxAttempts = 60,\n } = options;\n\n const apiKit = new SafeApiKit({\n chainId,\n ...(txServiceUrl && { txServiceUrl }),\n apiKey,\n });\n\n for (let attempt = 0; attempt < maxAttempts; attempt++) {\n const tx = await apiKit.getTransaction(safeTxHash);\n\n if (tx.isExecuted && tx.transactionHash) {\n return {\n transactionHash: tx.transactionHash,\n };\n }\n\n await delay(pollingInterval);\n }\n\n throw new Error(\n `Safe transaction ${safeTxHash} was not executed after ${maxAttempts} attempts`,\n );\n}\n","import * as safe from \"./safe/index.js\";\n\nexport const adapters = {\n safe: {\n submitTx: safe.submitAndFindSafeTx,\n waitForExecution: safe.waitForExecution,\n fetchPending: safe.fetchPendingTransactions,\n simulate: safe.simulateContractCall,\n write: safe.writeContractCall,\n },\n} as const;\n\nexport type AdapterRegistry = typeof adapters;\n","import { adapters } from \"./registry.js\";\nimport type {\n AdapterType,\n SubmitTxOptions,\n SubmitTxResult,\n WaitForExecutionOptions,\n WaitForExecutionResult,\n FetchPendingOptions,\n SimulateOptions,\n WriteOptions,\n} from \"./types.js\";\n\n// Re-export types\nexport * from \"./types.js\";\n\n// Re-export Safe adapter for direct access\nexport * as safe from \"./safe/index.js\";\n\n// Generic entry functions\n\nexport async function submitTx(\n options: SubmitTxOptions,\n): Promise<SubmitTxResult> {\n const { adapter, walletAddress, ...rest } = options;\n assertAdapter(adapter);\n\n const result = await adapters[adapter].submitTx({\n safeAddress: walletAddress,\n ...rest,\n });\n\n return { txHash: result.safeTxHash };\n}\n\nexport async function waitForExecution(\n options: WaitForExecutionOptions,\n): Promise<WaitForExecutionResult> {\n const { adapter, txHash, ...rest } = options;\n assertAdapter(adapter);\n\n const result = await adapters[adapter].waitForExecution({\n safeTxHash: txHash,\n ...rest,\n });\n\n return { transactionHash: result.transactionHash };\n}\n\nexport async function fetchPendingTxs(\n options: FetchPendingOptions,\n): Promise<unknown[]> {\n const { adapter, walletAddress, ...rest } = options;\n assertAdapter(adapter);\n\n return adapters[adapter].fetchPending({\n safeAddress: walletAddress,\n ...rest,\n });\n}\n\nexport async function simulate(\n options: SimulateOptions,\n): Promise<unknown> {\n const { adapter, config, ...params } = options;\n assertAdapter(adapter);\n\n return adapters[adapter].simulate(config, params);\n}\n\nexport async function write(\n options: WriteOptions,\n): Promise<string> {\n const { adapter, config, request } = options;\n assertAdapter(adapter);\n\n return adapters[adapter].write(config, request as Parameters<typeof adapters.safe.write>[1]);\n}\n\nfunction assertAdapter(adapter: AdapterType): asserts adapter is keyof typeof adapters {\n if (!(adapter in adapters)) {\n throw new Error(`Unknown adapter: ${adapter}. Available: ${Object.keys(adapters).join(\", \")}`);\n }\n}\n","import { useQuery } from \"@tanstack/react-query\";\nimport { waitForExecution } from \"../adapters/index.js\";\nimport type { WaitForExecutionOptions, WaitForExecutionResult } from \"../adapters/types.js\";\n\nexport interface UseWaitForExecutionOptions extends Omit<WaitForExecutionOptions, \"maxAttempts\"> {\n /** Enable/disable the query. Defaults to true. */\n enabled?: boolean;\n /** Polling interval in ms. Defaults to 5000. */\n pollingInterval?: number;\n /** Timeout in ms. After this duration, the query will fail. Defaults to 120000 (2 min). */\n timeout?: number;\n}\n\n/**\n * Hook to wait for a Safe transaction to be executed on-chain.\n *\n * Unlike standard polling queries, this hook maintains a stable loading state\n * throughout the polling process (similar to wagmi's useWaitForTransactionReceipt):\n * - `isLoading` = true while waiting for execution\n * - `isSuccess` = true once transaction is executed\n * - `isError` = true if timeout is reached\n */\nexport function useWaitForExecution(options: UseWaitForExecutionOptions) {\n const {\n enabled = true,\n pollingInterval = 5000,\n timeout = 120000,\n ...waitOptions\n } = options;\n\n // Calculate max attempts from timeout and polling interval\n const maxAttempts = Math.ceil(timeout / pollingInterval);\n\n return useQuery<WaitForExecutionResult, Error>({\n queryKey: [\n \"adapter\",\n options.adapter,\n \"waitForExecution\",\n options.txHash,\n options.chainId.toString(),\n ],\n queryFn: () =>\n waitForExecution({\n ...waitOptions,\n pollingInterval,\n maxAttempts,\n }),\n enabled: enabled && !!options.txHash,\n // Don't refetch - the query handles polling internally\n refetchInterval: false,\n refetchOnWindowFocus: false,\n refetchOnMount: false,\n refetchOnReconnect: false,\n // Don't retry on error - timeout is intentional\n retry: false,\n // Keep data fresh\n staleTime: Infinity,\n // Cache result for this specific txHash\n gcTime: 1000 * 60 * 5, // 5 minutes\n });\n}\n","import { useQuery } from \"@tanstack/react-query\";\nimport { waitForTransactionReceipt } from \"@wagmi/core\";\nimport type { Config } from \"@wagmi/core\";\nimport type { TransactionReceipt } from \"viem\";\nimport { waitForExecution } from \"../adapters/index.js\";\nimport type { WaitForExecutionOptions } from \"../adapters/types.js\";\n\nexport interface UseWaitForExecutionReceiptOptions\n extends Omit<WaitForExecutionOptions, \"maxAttempts\"> {\n /** Wagmi config for fetching the receipt. */\n config: Config;\n /** Enable/disable the query. Defaults to true. */\n enabled?: boolean;\n /** Polling interval in ms for Safe tx. Defaults to 5000. */\n pollingInterval?: number;\n /** Timeout in ms for Safe tx execution. Defaults to 120000 (2 min). */\n timeout?: number;\n /** Number of confirmations to wait for. Defaults to 1. */\n confirmations?: number;\n}\n\nexport interface WaitForExecutionReceiptResult {\n /** The on-chain transaction hash. */\n transactionHash: string;\n /** The full transaction receipt with logs. */\n receipt: TransactionReceipt;\n}\n\n/**\n * Hook to wait for a Safe transaction to be executed and return the full receipt with logs.\n *\n * Combines waiting for Safe execution with fetching the transaction receipt:\n * 1. Polls Safe Transaction Service until the tx is executed\n * 2. Fetches the on-chain transaction receipt with logs\n *\n * @example\n * ```tsx\n * const { data, isLoading, isSuccess } = useWaitForExecutionReceipt({\n * adapter: \"safe\",\n * txHash: safeTxHash,\n * chainId: 11155111n,\n * config: wagmiConfig,\n * });\n *\n * if (isSuccess) {\n * console.log(\"Logs:\", data.receipt.logs);\n * }\n * ```\n */\nexport function useWaitForExecutionReceipt(\n options: UseWaitForExecutionReceiptOptions\n) {\n const {\n config,\n enabled = true,\n pollingInterval = 5000,\n timeout = 120000,\n confirmations = 1,\n ...waitOptions\n } = options;\n\n const maxAttempts = Math.ceil(timeout / pollingInterval);\n\n return useQuery<WaitForExecutionReceiptResult, Error>({\n queryKey: [\n \"adapter\",\n options.adapter,\n \"waitForExecutionReceipt\",\n options.txHash,\n options.chainId.toString(),\n confirmations,\n ],\n queryFn: async () => {\n // Step 1: Wait for Safe tx to be executed\n const { transactionHash } = await waitForExecution({\n ...waitOptions,\n pollingInterval,\n maxAttempts,\n });\n\n // Step 2: Get the transaction receipt with logs\n const receipt = await waitForTransactionReceipt(config, {\n hash: transactionHash as `0x${string}`,\n confirmations,\n });\n\n return {\n transactionHash,\n receipt,\n };\n },\n enabled: enabled && !!options.txHash,\n refetchInterval: false,\n refetchOnWindowFocus: false,\n refetchOnMount: false,\n refetchOnReconnect: false,\n retry: false,\n staleTime: Infinity,\n gcTime: 1000 * 60 * 5,\n });\n}\n","import { useQuery } from \"@tanstack/react-query\";\nimport { fetchPendingTxs } from \"../adapters/index.js\";\nimport type { FetchPendingOptions } from \"../adapters/types.js\";\n\nexport interface UseFetchPendingTxsOptions extends FetchPendingOptions {\n enabled?: boolean;\n refetchInterval?: number | false;\n}\n\nexport function useFetchPendingTxs(options: UseFetchPendingTxsOptions) {\n const { enabled = true, refetchInterval = false, ...fetchOptions } = options;\n\n return useQuery<unknown[], Error>({\n queryKey: [\n \"adapter\",\n options.adapter,\n \"pendingTxs\",\n options.walletAddress,\n options.chainId.toString(),\n ],\n queryFn: () => fetchPendingTxs(fetchOptions),\n enabled: enabled && !!options.walletAddress,\n refetchInterval,\n });\n}\n","import { useQuery } from \"@tanstack/react-query\";\nimport { simulate } from \"../adapters/index.js\";\nimport type { SimulateOptions } from \"../adapters/types.js\";\n\nexport interface UseSimulateOptions extends SimulateOptions {\n enabled?: boolean;\n}\n\nexport function useSimulate(options: UseSimulateOptions) {\n const { enabled = true, ...simulateOptions } = options;\n\n return useQuery<unknown, Error>({\n queryKey: [\n \"adapter\",\n options.adapter,\n \"simulate\",\n options.address,\n options.functionName,\n JSON.stringify(options.args),\n ],\n queryFn: () => simulate(simulateOptions),\n enabled,\n });\n}\n","import { useMutation } from \"@tanstack/react-query\";\nimport { write } from \"../adapters/index.js\";\nimport type { WriteOptions } from \"../adapters/types.js\";\n\nexport function useWrite() {\n return useMutation<string, Error, WriteOptions>({\n mutationFn: (options) => write(options),\n });\n}\n"],"mappings":"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","names":["import_core","SafeApiKit","import_api_kit","delay","SafeApiKit","waitForExecution","import_react_query","waitForExecution","import_react_query","import_core","waitForExecution","import_react_query","import_react_query","import_react_query"]}
|
package/dist/react.d.cts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import * as _tanstack_react_query from '@tanstack/react-query';
|
|
2
2
|
import { a as SubmitTxOptions, b as SubmitTxResult, W as WaitForExecutionOptions, c as WaitForExecutionResult, F as FetchPendingOptions, S as SimulateOptions, d as WriteOptions } from './types-BJD1jdcY.cjs';
|
|
3
|
-
import '@wagmi/core';
|
|
4
|
-
import 'viem';
|
|
3
|
+
import { Config } from '@wagmi/core';
|
|
4
|
+
import { TransactionReceipt } from 'viem';
|
|
5
5
|
|
|
6
6
|
type UseSubmitTxOptions = Omit<SubmitTxOptions, "config"> & {
|
|
7
7
|
config: SubmitTxOptions["config"];
|
|
@@ -27,6 +27,47 @@ interface UseWaitForExecutionOptions extends Omit<WaitForExecutionOptions, "maxA
|
|
|
27
27
|
*/
|
|
28
28
|
declare function useWaitForExecution(options: UseWaitForExecutionOptions): _tanstack_react_query.UseQueryResult<WaitForExecutionResult, Error>;
|
|
29
29
|
|
|
30
|
+
interface UseWaitForExecutionReceiptOptions extends Omit<WaitForExecutionOptions, "maxAttempts"> {
|
|
31
|
+
/** Wagmi config for fetching the receipt. */
|
|
32
|
+
config: Config;
|
|
33
|
+
/** Enable/disable the query. Defaults to true. */
|
|
34
|
+
enabled?: boolean;
|
|
35
|
+
/** Polling interval in ms for Safe tx. Defaults to 5000. */
|
|
36
|
+
pollingInterval?: number;
|
|
37
|
+
/** Timeout in ms for Safe tx execution. Defaults to 120000 (2 min). */
|
|
38
|
+
timeout?: number;
|
|
39
|
+
/** Number of confirmations to wait for. Defaults to 1. */
|
|
40
|
+
confirmations?: number;
|
|
41
|
+
}
|
|
42
|
+
interface WaitForExecutionReceiptResult {
|
|
43
|
+
/** The on-chain transaction hash. */
|
|
44
|
+
transactionHash: string;
|
|
45
|
+
/** The full transaction receipt with logs. */
|
|
46
|
+
receipt: TransactionReceipt;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Hook to wait for a Safe transaction to be executed and return the full receipt with logs.
|
|
50
|
+
*
|
|
51
|
+
* Combines waiting for Safe execution with fetching the transaction receipt:
|
|
52
|
+
* 1. Polls Safe Transaction Service until the tx is executed
|
|
53
|
+
* 2. Fetches the on-chain transaction receipt with logs
|
|
54
|
+
*
|
|
55
|
+
* @example
|
|
56
|
+
* ```tsx
|
|
57
|
+
* const { data, isLoading, isSuccess } = useWaitForExecutionReceipt({
|
|
58
|
+
* adapter: "safe",
|
|
59
|
+
* txHash: safeTxHash,
|
|
60
|
+
* chainId: 11155111n,
|
|
61
|
+
* config: wagmiConfig,
|
|
62
|
+
* });
|
|
63
|
+
*
|
|
64
|
+
* if (isSuccess) {
|
|
65
|
+
* console.log("Logs:", data.receipt.logs);
|
|
66
|
+
* }
|
|
67
|
+
* ```
|
|
68
|
+
*/
|
|
69
|
+
declare function useWaitForExecutionReceipt(options: UseWaitForExecutionReceiptOptions): _tanstack_react_query.UseQueryResult<WaitForExecutionReceiptResult, Error>;
|
|
70
|
+
|
|
30
71
|
interface UseFetchPendingTxsOptions extends FetchPendingOptions {
|
|
31
72
|
enabled?: boolean;
|
|
32
73
|
refetchInterval?: number | false;
|
|
@@ -40,4 +81,4 @@ declare function useSimulate(options: UseSimulateOptions): _tanstack_react_query
|
|
|
40
81
|
|
|
41
82
|
declare function useWrite(): _tanstack_react_query.UseMutationResult<string, Error, WriteOptions, unknown>;
|
|
42
83
|
|
|
43
|
-
export { type UseFetchPendingTxsOptions, type UseSimulateOptions, type UseSubmitTxOptions, type UseWaitForExecutionOptions, useFetchPendingTxs, useSimulate, useSubmitTx, useWaitForExecution, useWrite };
|
|
84
|
+
export { type UseFetchPendingTxsOptions, type UseSimulateOptions, type UseSubmitTxOptions, type UseWaitForExecutionOptions, type UseWaitForExecutionReceiptOptions, type WaitForExecutionReceiptResult, useFetchPendingTxs, useSimulate, useSubmitTx, useWaitForExecution, useWaitForExecutionReceipt, useWrite };
|
package/dist/react.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import * as _tanstack_react_query from '@tanstack/react-query';
|
|
2
2
|
import { a as SubmitTxOptions, b as SubmitTxResult, W as WaitForExecutionOptions, c as WaitForExecutionResult, F as FetchPendingOptions, S as SimulateOptions, d as WriteOptions } from './types-BJD1jdcY.js';
|
|
3
|
-
import '@wagmi/core';
|
|
4
|
-
import 'viem';
|
|
3
|
+
import { Config } from '@wagmi/core';
|
|
4
|
+
import { TransactionReceipt } from 'viem';
|
|
5
5
|
|
|
6
6
|
type UseSubmitTxOptions = Omit<SubmitTxOptions, "config"> & {
|
|
7
7
|
config: SubmitTxOptions["config"];
|
|
@@ -27,6 +27,47 @@ interface UseWaitForExecutionOptions extends Omit<WaitForExecutionOptions, "maxA
|
|
|
27
27
|
*/
|
|
28
28
|
declare function useWaitForExecution(options: UseWaitForExecutionOptions): _tanstack_react_query.UseQueryResult<WaitForExecutionResult, Error>;
|
|
29
29
|
|
|
30
|
+
interface UseWaitForExecutionReceiptOptions extends Omit<WaitForExecutionOptions, "maxAttempts"> {
|
|
31
|
+
/** Wagmi config for fetching the receipt. */
|
|
32
|
+
config: Config;
|
|
33
|
+
/** Enable/disable the query. Defaults to true. */
|
|
34
|
+
enabled?: boolean;
|
|
35
|
+
/** Polling interval in ms for Safe tx. Defaults to 5000. */
|
|
36
|
+
pollingInterval?: number;
|
|
37
|
+
/** Timeout in ms for Safe tx execution. Defaults to 120000 (2 min). */
|
|
38
|
+
timeout?: number;
|
|
39
|
+
/** Number of confirmations to wait for. Defaults to 1. */
|
|
40
|
+
confirmations?: number;
|
|
41
|
+
}
|
|
42
|
+
interface WaitForExecutionReceiptResult {
|
|
43
|
+
/** The on-chain transaction hash. */
|
|
44
|
+
transactionHash: string;
|
|
45
|
+
/** The full transaction receipt with logs. */
|
|
46
|
+
receipt: TransactionReceipt;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Hook to wait for a Safe transaction to be executed and return the full receipt with logs.
|
|
50
|
+
*
|
|
51
|
+
* Combines waiting for Safe execution with fetching the transaction receipt:
|
|
52
|
+
* 1. Polls Safe Transaction Service until the tx is executed
|
|
53
|
+
* 2. Fetches the on-chain transaction receipt with logs
|
|
54
|
+
*
|
|
55
|
+
* @example
|
|
56
|
+
* ```tsx
|
|
57
|
+
* const { data, isLoading, isSuccess } = useWaitForExecutionReceipt({
|
|
58
|
+
* adapter: "safe",
|
|
59
|
+
* txHash: safeTxHash,
|
|
60
|
+
* chainId: 11155111n,
|
|
61
|
+
* config: wagmiConfig,
|
|
62
|
+
* });
|
|
63
|
+
*
|
|
64
|
+
* if (isSuccess) {
|
|
65
|
+
* console.log("Logs:", data.receipt.logs);
|
|
66
|
+
* }
|
|
67
|
+
* ```
|
|
68
|
+
*/
|
|
69
|
+
declare function useWaitForExecutionReceipt(options: UseWaitForExecutionReceiptOptions): _tanstack_react_query.UseQueryResult<WaitForExecutionReceiptResult, Error>;
|
|
70
|
+
|
|
30
71
|
interface UseFetchPendingTxsOptions extends FetchPendingOptions {
|
|
31
72
|
enabled?: boolean;
|
|
32
73
|
refetchInterval?: number | false;
|
|
@@ -40,4 +81,4 @@ declare function useSimulate(options: UseSimulateOptions): _tanstack_react_query
|
|
|
40
81
|
|
|
41
82
|
declare function useWrite(): _tanstack_react_query.UseMutationResult<string, Error, WriteOptions, unknown>;
|
|
42
83
|
|
|
43
|
-
export { type UseFetchPendingTxsOptions, type UseSimulateOptions, type UseSubmitTxOptions, type UseWaitForExecutionOptions, useFetchPendingTxs, useSimulate, useSubmitTx, useWaitForExecution, useWrite };
|
|
84
|
+
export { type UseFetchPendingTxsOptions, type UseSimulateOptions, type UseSubmitTxOptions, type UseWaitForExecutionOptions, type UseWaitForExecutionReceiptOptions, type WaitForExecutionReceiptResult, useFetchPendingTxs, useSimulate, useSubmitTx, useWaitForExecution, useWaitForExecutionReceipt, useWrite };
|
package/dist/react.js
CHANGED
|
@@ -53,11 +53,59 @@ function useWaitForExecution(options) {
|
|
|
53
53
|
});
|
|
54
54
|
}
|
|
55
55
|
|
|
56
|
-
// src/react/use-
|
|
56
|
+
// src/react/use-wait-for-execution-receipt.ts
|
|
57
57
|
import { useQuery as useQuery2 } from "@tanstack/react-query";
|
|
58
|
+
import { waitForTransactionReceipt } from "@wagmi/core";
|
|
59
|
+
function useWaitForExecutionReceipt(options) {
|
|
60
|
+
const {
|
|
61
|
+
config,
|
|
62
|
+
enabled = true,
|
|
63
|
+
pollingInterval = 5e3,
|
|
64
|
+
timeout = 12e4,
|
|
65
|
+
confirmations = 1,
|
|
66
|
+
...waitOptions
|
|
67
|
+
} = options;
|
|
68
|
+
const maxAttempts = Math.ceil(timeout / pollingInterval);
|
|
69
|
+
return useQuery2({
|
|
70
|
+
queryKey: [
|
|
71
|
+
"adapter",
|
|
72
|
+
options.adapter,
|
|
73
|
+
"waitForExecutionReceipt",
|
|
74
|
+
options.txHash,
|
|
75
|
+
options.chainId.toString(),
|
|
76
|
+
confirmations
|
|
77
|
+
],
|
|
78
|
+
queryFn: async () => {
|
|
79
|
+
const { transactionHash } = await waitForExecution({
|
|
80
|
+
...waitOptions,
|
|
81
|
+
pollingInterval,
|
|
82
|
+
maxAttempts
|
|
83
|
+
});
|
|
84
|
+
const receipt = await waitForTransactionReceipt(config, {
|
|
85
|
+
hash: transactionHash,
|
|
86
|
+
confirmations
|
|
87
|
+
});
|
|
88
|
+
return {
|
|
89
|
+
transactionHash,
|
|
90
|
+
receipt
|
|
91
|
+
};
|
|
92
|
+
},
|
|
93
|
+
enabled: enabled && !!options.txHash,
|
|
94
|
+
refetchInterval: false,
|
|
95
|
+
refetchOnWindowFocus: false,
|
|
96
|
+
refetchOnMount: false,
|
|
97
|
+
refetchOnReconnect: false,
|
|
98
|
+
retry: false,
|
|
99
|
+
staleTime: Infinity,
|
|
100
|
+
gcTime: 1e3 * 60 * 5
|
|
101
|
+
});
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
// src/react/use-fetch-pending-txs.ts
|
|
105
|
+
import { useQuery as useQuery3 } from "@tanstack/react-query";
|
|
58
106
|
function useFetchPendingTxs(options) {
|
|
59
107
|
const { enabled = true, refetchInterval = false, ...fetchOptions } = options;
|
|
60
|
-
return
|
|
108
|
+
return useQuery3({
|
|
61
109
|
queryKey: [
|
|
62
110
|
"adapter",
|
|
63
111
|
options.adapter,
|
|
@@ -72,10 +120,10 @@ function useFetchPendingTxs(options) {
|
|
|
72
120
|
}
|
|
73
121
|
|
|
74
122
|
// src/react/use-simulate.ts
|
|
75
|
-
import { useQuery as
|
|
123
|
+
import { useQuery as useQuery4 } from "@tanstack/react-query";
|
|
76
124
|
function useSimulate(options) {
|
|
77
125
|
const { enabled = true, ...simulateOptions } = options;
|
|
78
|
-
return
|
|
126
|
+
return useQuery4({
|
|
79
127
|
queryKey: [
|
|
80
128
|
"adapter",
|
|
81
129
|
options.adapter,
|
|
@@ -101,6 +149,7 @@ export {
|
|
|
101
149
|
useSimulate,
|
|
102
150
|
useSubmitTx,
|
|
103
151
|
useWaitForExecution,
|
|
152
|
+
useWaitForExecutionReceipt,
|
|
104
153
|
useWrite
|
|
105
154
|
};
|
|
106
155
|
//# sourceMappingURL=react.js.map
|
package/dist/react.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/react/use-submit-tx.ts","../src/react/use-wait-for-execution.ts","../src/react/use-fetch-pending-txs.ts","../src/react/use-simulate.ts","../src/react/use-write.ts"],"sourcesContent":["import { useMutation } from \"@tanstack/react-query\";\nimport { submitTx } from \"../adapters/index.js\";\nimport type { SubmitTxOptions, SubmitTxResult } from \"../adapters/types.js\";\n\nexport type UseSubmitTxOptions = Omit<SubmitTxOptions, \"config\"> & {\n config: SubmitTxOptions[\"config\"];\n};\n\nexport function useSubmitTx() {\n return useMutation<SubmitTxResult, Error, UseSubmitTxOptions>({\n mutationFn: (options) => submitTx(options),\n });\n}\n","import { useQuery } from \"@tanstack/react-query\";\nimport { waitForExecution } from \"../adapters/index.js\";\nimport type { WaitForExecutionOptions, WaitForExecutionResult } from \"../adapters/types.js\";\n\nexport interface UseWaitForExecutionOptions extends Omit<WaitForExecutionOptions, \"maxAttempts\"> {\n /** Enable/disable the query. Defaults to true. */\n enabled?: boolean;\n /** Polling interval in ms. Defaults to 5000. */\n pollingInterval?: number;\n /** Timeout in ms. After this duration, the query will fail. Defaults to 120000 (2 min). */\n timeout?: number;\n}\n\n/**\n * Hook to wait for a Safe transaction to be executed on-chain.\n *\n * Unlike standard polling queries, this hook maintains a stable loading state\n * throughout the polling process (similar to wagmi's useWaitForTransactionReceipt):\n * - `isLoading` = true while waiting for execution\n * - `isSuccess` = true once transaction is executed\n * - `isError` = true if timeout is reached\n */\nexport function useWaitForExecution(options: UseWaitForExecutionOptions) {\n const {\n enabled = true,\n pollingInterval = 5000,\n timeout = 120000,\n ...waitOptions\n } = options;\n\n // Calculate max attempts from timeout and polling interval\n const maxAttempts = Math.ceil(timeout / pollingInterval);\n\n return useQuery<WaitForExecutionResult, Error>({\n queryKey: [\n \"adapter\",\n options.adapter,\n \"waitForExecution\",\n options.txHash,\n options.chainId.toString(),\n ],\n queryFn: () =>\n waitForExecution({\n ...waitOptions,\n pollingInterval,\n maxAttempts,\n }),\n enabled: enabled && !!options.txHash,\n // Don't refetch - the query handles polling internally\n refetchInterval: false,\n refetchOnWindowFocus: false,\n refetchOnMount: false,\n refetchOnReconnect: false,\n // Don't retry on error - timeout is intentional\n retry: false,\n // Keep data fresh\n staleTime: Infinity,\n // Cache result for this specific txHash\n gcTime: 1000 * 60 * 5, // 5 minutes\n });\n}\n","import { useQuery } from \"@tanstack/react-query\";\nimport { fetchPendingTxs } from \"../adapters/index.js\";\nimport type { FetchPendingOptions } from \"../adapters/types.js\";\n\nexport interface UseFetchPendingTxsOptions extends FetchPendingOptions {\n enabled?: boolean;\n refetchInterval?: number | false;\n}\n\nexport function useFetchPendingTxs(options: UseFetchPendingTxsOptions) {\n const { enabled = true, refetchInterval = false, ...fetchOptions } = options;\n\n return useQuery<unknown[], Error>({\n queryKey: [\n \"adapter\",\n options.adapter,\n \"pendingTxs\",\n options.walletAddress,\n options.chainId.toString(),\n ],\n queryFn: () => fetchPendingTxs(fetchOptions),\n enabled: enabled && !!options.walletAddress,\n refetchInterval,\n });\n}\n","import { useQuery } from \"@tanstack/react-query\";\nimport { simulate } from \"../adapters/index.js\";\nimport type { SimulateOptions } from \"../adapters/types.js\";\n\nexport interface UseSimulateOptions extends SimulateOptions {\n enabled?: boolean;\n}\n\nexport function useSimulate(options: UseSimulateOptions) {\n const { enabled = true, ...simulateOptions } = options;\n\n return useQuery<unknown, Error>({\n queryKey: [\n \"adapter\",\n options.adapter,\n \"simulate\",\n options.address,\n options.functionName,\n JSON.stringify(options.args),\n ],\n queryFn: () => simulate(simulateOptions),\n enabled,\n });\n}\n","import { useMutation } from \"@tanstack/react-query\";\nimport { write } from \"../adapters/index.js\";\nimport type { WriteOptions } from \"../adapters/types.js\";\n\nexport function useWrite() {\n return useMutation<string, Error, WriteOptions>({\n mutationFn: (options) => write(options),\n });\n}\n"],"mappings":";;;;;;;;;AAAA,SAAS,mBAAmB;AAQrB,SAAS,cAAc;AAC5B,SAAO,YAAuD;AAAA,IAC5D,YAAY,CAAC,YAAY,SAAS,OAAO;AAAA,EAC3C,CAAC;AACH;;;ACZA,SAAS,gBAAgB;AAsBlB,SAAS,oBAAoB,SAAqC;AACvE,QAAM;AAAA,IACJ,UAAU;AAAA,IACV,kBAAkB;AAAA,IAClB,UAAU;AAAA,IACV,GAAG;AAAA,EACL,IAAI;AAGJ,QAAM,cAAc,KAAK,KAAK,UAAU,eAAe;AAEvD,SAAO,SAAwC;AAAA,IAC7C,UAAU;AAAA,MACR;AAAA,MACA,QAAQ;AAAA,MACR;AAAA,MACA,QAAQ;AAAA,MACR,QAAQ,QAAQ,SAAS;AAAA,IAC3B;AAAA,IACA,SAAS,MACP,iBAAiB;AAAA,MACf,GAAG;AAAA,MACH;AAAA,MACA;AAAA,IACF,CAAC;AAAA,IACH,SAAS,WAAW,CAAC,CAAC,QAAQ;AAAA;AAAA,IAE9B,iBAAiB;AAAA,IACjB,sBAAsB;AAAA,IACtB,gBAAgB;AAAA,IAChB,oBAAoB;AAAA;AAAA,IAEpB,OAAO;AAAA;AAAA,IAEP,WAAW;AAAA;AAAA,IAEX,QAAQ,MAAO,KAAK;AAAA;AAAA,EACtB,CAAC;AACH;;;AC5DA,SAAS,YAAAA,iBAAgB;AASlB,SAAS,mBAAmB,SAAoC;AACrE,QAAM,EAAE,UAAU,MAAM,kBAAkB,OAAO,GAAG,aAAa,IAAI;AAErE,SAAOC,UAA2B;AAAA,IAChC,UAAU;AAAA,MACR;AAAA,MACA,QAAQ;AAAA,MACR;AAAA,MACA,QAAQ;AAAA,MACR,QAAQ,QAAQ,SAAS;AAAA,IAC3B;AAAA,IACA,SAAS,MAAM,gBAAgB,YAAY;AAAA,IAC3C,SAAS,WAAW,CAAC,CAAC,QAAQ;AAAA,IAC9B;AAAA,EACF,CAAC;AACH;;;ACxBA,SAAS,YAAAC,iBAAgB;AAQlB,SAAS,YAAY,SAA6B;AACvD,QAAM,EAAE,UAAU,MAAM,GAAG,gBAAgB,IAAI;AAE/C,SAAOC,UAAyB;AAAA,IAC9B,UAAU;AAAA,MACR;AAAA,MACA,QAAQ;AAAA,MACR;AAAA,MACA,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,KAAK,UAAU,QAAQ,IAAI;AAAA,IAC7B;AAAA,IACA,SAAS,MAAM,SAAS,eAAe;AAAA,IACvC;AAAA,EACF,CAAC;AACH;;;ACvBA,SAAS,eAAAC,oBAAmB;AAIrB,SAAS,WAAW;AACzB,SAAOC,aAAyC;AAAA,IAC9C,YAAY,CAAC,YAAY,MAAM,OAAO;AAAA,EACxC,CAAC;AACH;","names":["useQuery","useQuery","useQuery","useQuery","useMutation","useMutation"]}
|
|
1
|
+
{"version":3,"sources":["../src/react/use-submit-tx.ts","../src/react/use-wait-for-execution.ts","../src/react/use-wait-for-execution-receipt.ts","../src/react/use-fetch-pending-txs.ts","../src/react/use-simulate.ts","../src/react/use-write.ts"],"sourcesContent":["import { useMutation } from \"@tanstack/react-query\";\nimport { submitTx } from \"../adapters/index.js\";\nimport type { SubmitTxOptions, SubmitTxResult } from \"../adapters/types.js\";\n\nexport type UseSubmitTxOptions = Omit<SubmitTxOptions, \"config\"> & {\n config: SubmitTxOptions[\"config\"];\n};\n\nexport function useSubmitTx() {\n return useMutation<SubmitTxResult, Error, UseSubmitTxOptions>({\n mutationFn: (options) => submitTx(options),\n });\n}\n","import { useQuery } from \"@tanstack/react-query\";\nimport { waitForExecution } from \"../adapters/index.js\";\nimport type { WaitForExecutionOptions, WaitForExecutionResult } from \"../adapters/types.js\";\n\nexport interface UseWaitForExecutionOptions extends Omit<WaitForExecutionOptions, \"maxAttempts\"> {\n /** Enable/disable the query. Defaults to true. */\n enabled?: boolean;\n /** Polling interval in ms. Defaults to 5000. */\n pollingInterval?: number;\n /** Timeout in ms. After this duration, the query will fail. Defaults to 120000 (2 min). */\n timeout?: number;\n}\n\n/**\n * Hook to wait for a Safe transaction to be executed on-chain.\n *\n * Unlike standard polling queries, this hook maintains a stable loading state\n * throughout the polling process (similar to wagmi's useWaitForTransactionReceipt):\n * - `isLoading` = true while waiting for execution\n * - `isSuccess` = true once transaction is executed\n * - `isError` = true if timeout is reached\n */\nexport function useWaitForExecution(options: UseWaitForExecutionOptions) {\n const {\n enabled = true,\n pollingInterval = 5000,\n timeout = 120000,\n ...waitOptions\n } = options;\n\n // Calculate max attempts from timeout and polling interval\n const maxAttempts = Math.ceil(timeout / pollingInterval);\n\n return useQuery<WaitForExecutionResult, Error>({\n queryKey: [\n \"adapter\",\n options.adapter,\n \"waitForExecution\",\n options.txHash,\n options.chainId.toString(),\n ],\n queryFn: () =>\n waitForExecution({\n ...waitOptions,\n pollingInterval,\n maxAttempts,\n }),\n enabled: enabled && !!options.txHash,\n // Don't refetch - the query handles polling internally\n refetchInterval: false,\n refetchOnWindowFocus: false,\n refetchOnMount: false,\n refetchOnReconnect: false,\n // Don't retry on error - timeout is intentional\n retry: false,\n // Keep data fresh\n staleTime: Infinity,\n // Cache result for this specific txHash\n gcTime: 1000 * 60 * 5, // 5 minutes\n });\n}\n","import { useQuery } from \"@tanstack/react-query\";\nimport { waitForTransactionReceipt } from \"@wagmi/core\";\nimport type { Config } from \"@wagmi/core\";\nimport type { TransactionReceipt } from \"viem\";\nimport { waitForExecution } from \"../adapters/index.js\";\nimport type { WaitForExecutionOptions } from \"../adapters/types.js\";\n\nexport interface UseWaitForExecutionReceiptOptions\n extends Omit<WaitForExecutionOptions, \"maxAttempts\"> {\n /** Wagmi config for fetching the receipt. */\n config: Config;\n /** Enable/disable the query. Defaults to true. */\n enabled?: boolean;\n /** Polling interval in ms for Safe tx. Defaults to 5000. */\n pollingInterval?: number;\n /** Timeout in ms for Safe tx execution. Defaults to 120000 (2 min). */\n timeout?: number;\n /** Number of confirmations to wait for. Defaults to 1. */\n confirmations?: number;\n}\n\nexport interface WaitForExecutionReceiptResult {\n /** The on-chain transaction hash. */\n transactionHash: string;\n /** The full transaction receipt with logs. */\n receipt: TransactionReceipt;\n}\n\n/**\n * Hook to wait for a Safe transaction to be executed and return the full receipt with logs.\n *\n * Combines waiting for Safe execution with fetching the transaction receipt:\n * 1. Polls Safe Transaction Service until the tx is executed\n * 2. Fetches the on-chain transaction receipt with logs\n *\n * @example\n * ```tsx\n * const { data, isLoading, isSuccess } = useWaitForExecutionReceipt({\n * adapter: \"safe\",\n * txHash: safeTxHash,\n * chainId: 11155111n,\n * config: wagmiConfig,\n * });\n *\n * if (isSuccess) {\n * console.log(\"Logs:\", data.receipt.logs);\n * }\n * ```\n */\nexport function useWaitForExecutionReceipt(\n options: UseWaitForExecutionReceiptOptions\n) {\n const {\n config,\n enabled = true,\n pollingInterval = 5000,\n timeout = 120000,\n confirmations = 1,\n ...waitOptions\n } = options;\n\n const maxAttempts = Math.ceil(timeout / pollingInterval);\n\n return useQuery<WaitForExecutionReceiptResult, Error>({\n queryKey: [\n \"adapter\",\n options.adapter,\n \"waitForExecutionReceipt\",\n options.txHash,\n options.chainId.toString(),\n confirmations,\n ],\n queryFn: async () => {\n // Step 1: Wait for Safe tx to be executed\n const { transactionHash } = await waitForExecution({\n ...waitOptions,\n pollingInterval,\n maxAttempts,\n });\n\n // Step 2: Get the transaction receipt with logs\n const receipt = await waitForTransactionReceipt(config, {\n hash: transactionHash as `0x${string}`,\n confirmations,\n });\n\n return {\n transactionHash,\n receipt,\n };\n },\n enabled: enabled && !!options.txHash,\n refetchInterval: false,\n refetchOnWindowFocus: false,\n refetchOnMount: false,\n refetchOnReconnect: false,\n retry: false,\n staleTime: Infinity,\n gcTime: 1000 * 60 * 5,\n });\n}\n","import { useQuery } from \"@tanstack/react-query\";\nimport { fetchPendingTxs } from \"../adapters/index.js\";\nimport type { FetchPendingOptions } from \"../adapters/types.js\";\n\nexport interface UseFetchPendingTxsOptions extends FetchPendingOptions {\n enabled?: boolean;\n refetchInterval?: number | false;\n}\n\nexport function useFetchPendingTxs(options: UseFetchPendingTxsOptions) {\n const { enabled = true, refetchInterval = false, ...fetchOptions } = options;\n\n return useQuery<unknown[], Error>({\n queryKey: [\n \"adapter\",\n options.adapter,\n \"pendingTxs\",\n options.walletAddress,\n options.chainId.toString(),\n ],\n queryFn: () => fetchPendingTxs(fetchOptions),\n enabled: enabled && !!options.walletAddress,\n refetchInterval,\n });\n}\n","import { useQuery } from \"@tanstack/react-query\";\nimport { simulate } from \"../adapters/index.js\";\nimport type { SimulateOptions } from \"../adapters/types.js\";\n\nexport interface UseSimulateOptions extends SimulateOptions {\n enabled?: boolean;\n}\n\nexport function useSimulate(options: UseSimulateOptions) {\n const { enabled = true, ...simulateOptions } = options;\n\n return useQuery<unknown, Error>({\n queryKey: [\n \"adapter\",\n options.adapter,\n \"simulate\",\n options.address,\n options.functionName,\n JSON.stringify(options.args),\n ],\n queryFn: () => simulate(simulateOptions),\n enabled,\n });\n}\n","import { useMutation } from \"@tanstack/react-query\";\nimport { write } from \"../adapters/index.js\";\nimport type { WriteOptions } from \"../adapters/types.js\";\n\nexport function useWrite() {\n return useMutation<string, Error, WriteOptions>({\n mutationFn: (options) => write(options),\n });\n}\n"],"mappings":"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","names":["useQuery","useQuery","useQuery","useQuery","useQuery","useQuery","useMutation","useMutation"]}
|