@prb/effect-evm 1.0.0-beta.5 → 1.0.0-beta.7

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 (232) hide show
  1. package/dist/constants/index.d.ts +0 -4
  2. package/dist/constants/index.d.ts.map +1 -1
  3. package/dist/constants/index.js +1 -5
  4. package/dist/constants/index.js.map +1 -1
  5. package/dist/contract/pipeline/internal/core.d.ts +2 -2
  6. package/dist/contract/pipeline/internal/core.d.ts.map +1 -1
  7. package/dist/contract/pipeline/internal/core.js.map +1 -1
  8. package/dist/contract/pipeline/internal/receipt.d.ts +2 -2
  9. package/dist/contract/pipeline/internal/receipt.d.ts.map +1 -1
  10. package/dist/contract/pipeline/internal/receipt.js +1 -1
  11. package/dist/contract/pipeline/internal/receipt.js.map +1 -1
  12. package/dist/contract/pipeline/service.d.ts +3 -3
  13. package/dist/contract/pipeline/service.d.ts.map +1 -1
  14. package/dist/contract/pipeline/service.js.map +1 -1
  15. package/dist/contract/pipeline/types.d.ts +2 -2
  16. package/dist/contract/pipeline/types.d.ts.map +1 -1
  17. package/dist/contract/pipeline/types.js.map +1 -1
  18. package/dist/contract/pipeline/write-and-track.d.ts.map +1 -1
  19. package/dist/contract/pipeline/write-and-track.js +5 -6
  20. package/dist/contract/pipeline/write-and-track.js.map +1 -1
  21. package/dist/contract/pipeline/write-and-wait.d.ts +1 -1
  22. package/dist/contract/pipeline/write-and-wait.d.ts.map +1 -1
  23. package/dist/core/errors/transaction.d.ts +7 -7
  24. package/dist/core/errors/transaction.d.ts.map +1 -1
  25. package/dist/core/errors/transaction.js +2 -2
  26. package/dist/core/errors/transaction.js.map +1 -1
  27. package/dist/core/errors/viem-mapper.d.ts +3 -3
  28. package/dist/core/errors/viem-mapper.d.ts.map +1 -1
  29. package/dist/core/errors/viem-mapper.js +3 -3
  30. package/dist/core/errors/viem-mapper.js.map +1 -1
  31. package/dist/deploy/service.d.ts +3 -3
  32. package/dist/deploy/service.d.ts.map +1 -1
  33. package/dist/deploy/service.js.map +1 -1
  34. package/dist/eip7702/errors.d.ts +3 -3
  35. package/dist/eip7702/errors.d.ts.map +1 -1
  36. package/dist/eip7702/errors.js +1 -1
  37. package/dist/eip7702/errors.js.map +1 -1
  38. package/dist/eip7702/service.d.ts +8 -8
  39. package/dist/eip7702/service.d.ts.map +1 -1
  40. package/dist/eip7702/service.js +2 -2
  41. package/dist/eip7702/service.js.map +1 -1
  42. package/dist/react-hooks/index.d.ts +0 -4
  43. package/dist/react-hooks/index.d.ts.map +1 -1
  44. package/dist/react-hooks/index.js +0 -4
  45. package/dist/react-hooks/index.js.map +1 -1
  46. package/dist/subscriptions/pending-tx.d.ts +1 -1
  47. package/dist/subscriptions/pending-tx.d.ts.map +1 -1
  48. package/dist/subscriptions/pending-tx.js +1 -1
  49. package/dist/subscriptions/pending-tx.js.map +1 -1
  50. package/dist/subscriptions/service.d.ts +2 -2
  51. package/dist/subscriptions/service.d.ts.map +1 -1
  52. package/dist/subscriptions/service.js +4 -4
  53. package/dist/subscriptions/service.js.map +1 -1
  54. package/dist/testing-kit/mock-subscription-service.d.ts +2 -2
  55. package/dist/testing-kit/mock-subscription-service.d.ts.map +1 -1
  56. package/dist/testing-kit/mock-subscription-service.js +5 -5
  57. package/dist/testing-kit/mock-subscription-service.js.map +1 -1
  58. package/dist/testing-kit/mock-transfer-service.d.ts +3 -3
  59. package/dist/testing-kit/mock-transfer-service.d.ts.map +1 -1
  60. package/dist/testing-kit/mock-transfer-service.js.map +1 -1
  61. package/dist/transfer/service.d.ts +3 -3
  62. package/dist/transfer/service.d.ts.map +1 -1
  63. package/dist/transfer/service.js +3 -3
  64. package/dist/transfer/service.js.map +1 -1
  65. package/dist/tx/manager.d.ts +3 -2
  66. package/dist/tx/manager.d.ts.map +1 -1
  67. package/dist/tx/manager.js +232 -216
  68. package/dist/tx/manager.js.map +1 -1
  69. package/dist/tx/manager.test.integration.js +25 -5
  70. package/dist/tx/manager.test.integration.js.map +1 -1
  71. package/dist/tx/policy.d.ts +0 -1
  72. package/dist/tx/policy.d.ts.map +1 -1
  73. package/dist/tx/policy.js.map +1 -1
  74. package/dist/tx/replacement.d.ts +3 -3
  75. package/dist/tx/replacement.d.ts.map +1 -1
  76. package/dist/tx/replacement.js +3 -3
  77. package/dist/tx/replacement.js.map +1 -1
  78. package/dist/tx/tracker.d.ts +6 -6
  79. package/dist/tx/tracker.d.ts.map +1 -1
  80. package/dist/tx/tracker.js +9 -9
  81. package/dist/tx/tracker.js.map +1 -1
  82. package/dist/types/params.d.ts +1 -1
  83. package/dist/types/params.d.ts.map +1 -1
  84. package/dist/types/params.js.map +1 -1
  85. package/dist/wallet/errors.d.ts +3 -3
  86. package/dist/wallet/errors.d.ts.map +1 -1
  87. package/dist/wallet/errors.js +1 -1
  88. package/dist/wallet/errors.js.map +1 -1
  89. package/dist/wallet/operations.d.ts +2 -2
  90. package/dist/wallet/operations.d.ts.map +1 -1
  91. package/dist/wallet/operations.js +2 -2
  92. package/dist/wallet/operations.js.map +1 -1
  93. package/dist/wallet/service.d.ts +2 -2
  94. package/dist/wallet/service.d.ts.map +1 -1
  95. package/dist/wallet/service.js.map +1 -1
  96. package/package.json +1 -6
  97. package/dist/react-hooks/safe-app-origins.d.ts +0 -8
  98. package/dist/react-hooks/safe-app-origins.d.ts.map +0 -1
  99. package/dist/react-hooks/safe-app-origins.js +0 -124
  100. package/dist/react-hooks/safe-app-origins.js.map +0 -1
  101. package/dist/react-hooks/use-is-host-safe-app.d.ts +0 -2
  102. package/dist/react-hooks/use-is-host-safe-app.d.ts.map +0 -1
  103. package/dist/react-hooks/use-is-host-safe-app.js +0 -16
  104. package/dist/react-hooks/use-is-host-safe-app.js.map +0 -1
  105. package/dist/react-hooks/use-is-safe-app-context.d.ts +0 -2
  106. package/dist/react-hooks/use-is-safe-app-context.d.ts.map +0 -1
  107. package/dist/react-hooks/use-is-safe-app-context.js +0 -41
  108. package/dist/react-hooks/use-is-safe-app-context.js.map +0 -1
  109. package/dist/react-hooks/use-is-safe-multisig-wallet.d.ts +0 -2
  110. package/dist/react-hooks/use-is-safe-multisig-wallet.d.ts.map +0 -1
  111. package/dist/react-hooks/use-is-safe-multisig-wallet.js +0 -24
  112. package/dist/react-hooks/use-is-safe-multisig-wallet.js.map +0 -1
  113. package/dist/safe/adapter.d.ts +0 -9
  114. package/dist/safe/adapter.d.ts.map +0 -1
  115. package/dist/safe/adapter.js +0 -13
  116. package/dist/safe/adapter.js.map +0 -1
  117. package/dist/safe/detection.d.ts +0 -26
  118. package/dist/safe/detection.d.ts.map +0 -1
  119. package/dist/safe/detection.js +0 -102
  120. package/dist/safe/detection.js.map +0 -1
  121. package/dist/safe/detection.test.integration.d.ts +0 -2
  122. package/dist/safe/detection.test.integration.d.ts.map +0 -1
  123. package/dist/safe/detection.test.integration.js +0 -92
  124. package/dist/safe/detection.test.integration.js.map +0 -1
  125. package/dist/safe/errors.d.ts +0 -79
  126. package/dist/safe/errors.d.ts.map +0 -1
  127. package/dist/safe/errors.js +0 -34
  128. package/dist/safe/errors.js.map +0 -1
  129. package/dist/safe/index.d.ts +0 -8
  130. package/dist/safe/index.d.ts.map +0 -1
  131. package/dist/safe/index.js +0 -6
  132. package/dist/safe/index.js.map +0 -1
  133. package/dist/safe/live.d.ts +0 -8
  134. package/dist/safe/live.d.ts.map +0 -1
  135. package/dist/safe/live.js +0 -250
  136. package/dist/safe/live.js.map +0 -1
  137. package/dist/safe/service.d.ts +0 -26
  138. package/dist/safe/service.d.ts.map +0 -1
  139. package/dist/safe/service.js +0 -4
  140. package/dist/safe/service.js.map +0 -1
  141. package/dist/safe/service.test.integration.d.ts +0 -2
  142. package/dist/safe/service.test.integration.d.ts.map +0 -1
  143. package/dist/safe/service.test.integration.js +0 -171
  144. package/dist/safe/service.test.integration.js.map +0 -1
  145. package/dist/safe/simulation/abis.d.ts +0 -73
  146. package/dist/safe/simulation/abis.d.ts.map +0 -1
  147. package/dist/safe/simulation/abis.js +0 -61
  148. package/dist/safe/simulation/abis.js.map +0 -1
  149. package/dist/safe/simulation/addresses.d.ts +0 -4
  150. package/dist/safe/simulation/addresses.d.ts.map +0 -1
  151. package/dist/safe/simulation/addresses.js +0 -54
  152. package/dist/safe/simulation/addresses.js.map +0 -1
  153. package/dist/safe/simulation/encoding.d.ts +0 -16
  154. package/dist/safe/simulation/encoding.d.ts.map +0 -1
  155. package/dist/safe/simulation/encoding.js +0 -36
  156. package/dist/safe/simulation/encoding.js.map +0 -1
  157. package/dist/safe/simulation/errors.d.ts +0 -56
  158. package/dist/safe/simulation/errors.d.ts.map +0 -1
  159. package/dist/safe/simulation/errors.js +0 -37
  160. package/dist/safe/simulation/errors.js.map +0 -1
  161. package/dist/safe/simulation/index.d.ts +0 -7
  162. package/dist/safe/simulation/index.d.ts.map +0 -1
  163. package/dist/safe/simulation/index.js +0 -6
  164. package/dist/safe/simulation/index.js.map +0 -1
  165. package/dist/safe/simulation/internal/calldata/calldata.d.ts +0 -5
  166. package/dist/safe/simulation/internal/calldata/calldata.d.ts.map +0 -1
  167. package/dist/safe/simulation/internal/calldata/calldata.js +0 -17
  168. package/dist/safe/simulation/internal/calldata/calldata.js.map +0 -1
  169. package/dist/safe/simulation/internal/calldata/index.d.ts +0 -2
  170. package/dist/safe/simulation/internal/calldata/index.d.ts.map +0 -1
  171. package/dist/safe/simulation/internal/calldata/index.js +0 -2
  172. package/dist/safe/simulation/internal/calldata/index.js.map +0 -1
  173. package/dist/safe/simulation/internal/contracts/contracts.d.ts +0 -5
  174. package/dist/safe/simulation/internal/contracts/contracts.d.ts.map +0 -1
  175. package/dist/safe/simulation/internal/contracts/contracts.js +0 -25
  176. package/dist/safe/simulation/internal/contracts/contracts.js.map +0 -1
  177. package/dist/safe/simulation/internal/contracts/index.d.ts +0 -2
  178. package/dist/safe/simulation/internal/contracts/index.d.ts.map +0 -1
  179. package/dist/safe/simulation/internal/contracts/index.js +0 -2
  180. package/dist/safe/simulation/internal/contracts/index.js.map +0 -1
  181. package/dist/safe/simulation/internal/evaluation/evaluation.d.ts +0 -6
  182. package/dist/safe/simulation/internal/evaluation/evaluation.d.ts.map +0 -1
  183. package/dist/safe/simulation/internal/evaluation/evaluation.js +0 -20
  184. package/dist/safe/simulation/internal/evaluation/evaluation.js.map +0 -1
  185. package/dist/safe/simulation/internal/evaluation/index.d.ts +0 -2
  186. package/dist/safe/simulation/internal/evaluation/index.d.ts.map +0 -1
  187. package/dist/safe/simulation/internal/evaluation/index.js +0 -2
  188. package/dist/safe/simulation/internal/evaluation/index.js.map +0 -1
  189. package/dist/safe/simulation/internal/execution/execution.d.ts +0 -9
  190. package/dist/safe/simulation/internal/execution/execution.d.ts.map +0 -1
  191. package/dist/safe/simulation/internal/execution/execution.js +0 -65
  192. package/dist/safe/simulation/internal/execution/execution.js.map +0 -1
  193. package/dist/safe/simulation/internal/execution/index.d.ts +0 -2
  194. package/dist/safe/simulation/internal/execution/index.d.ts.map +0 -1
  195. package/dist/safe/simulation/internal/execution/index.js +0 -2
  196. package/dist/safe/simulation/internal/execution/index.js.map +0 -1
  197. package/dist/safe/simulation/internal/limits/index.d.ts +0 -2
  198. package/dist/safe/simulation/internal/limits/index.d.ts.map +0 -1
  199. package/dist/safe/simulation/internal/limits/index.js +0 -2
  200. package/dist/safe/simulation/internal/limits/index.js.map +0 -1
  201. package/dist/safe/simulation/internal/limits/limits.d.ts +0 -5
  202. package/dist/safe/simulation/internal/limits/limits.d.ts.map +0 -1
  203. package/dist/safe/simulation/internal/limits/limits.js +0 -18
  204. package/dist/safe/simulation/internal/limits/limits.js.map +0 -1
  205. package/dist/safe/simulation/internal/types/index.d.ts +0 -2
  206. package/dist/safe/simulation/internal/types/index.d.ts.map +0 -1
  207. package/dist/safe/simulation/internal/types/index.js +0 -2
  208. package/dist/safe/simulation/internal/types/index.js.map +0 -1
  209. package/dist/safe/simulation/internal/types/types.d.ts +0 -11
  210. package/dist/safe/simulation/internal/types/types.d.ts.map +0 -1
  211. package/dist/safe/simulation/internal/types/types.js +0 -2
  212. package/dist/safe/simulation/internal/types/types.js.map +0 -1
  213. package/dist/safe/simulation/internal/validation/index.d.ts +0 -2
  214. package/dist/safe/simulation/internal/validation/index.d.ts.map +0 -1
  215. package/dist/safe/simulation/internal/validation/index.js +0 -2
  216. package/dist/safe/simulation/internal/validation/index.js.map +0 -1
  217. package/dist/safe/simulation/internal/validation/validation.d.ts +0 -5
  218. package/dist/safe/simulation/internal/validation/validation.d.ts.map +0 -1
  219. package/dist/safe/simulation/internal/validation/validation.js +0 -27
  220. package/dist/safe/simulation/internal/validation/validation.js.map +0 -1
  221. package/dist/safe/simulation/service.d.ts +0 -14
  222. package/dist/safe/simulation/service.d.ts.map +0 -1
  223. package/dist/safe/simulation/service.js +0 -25
  224. package/dist/safe/simulation/service.js.map +0 -1
  225. package/dist/safe/simulation/types.d.ts +0 -20
  226. package/dist/safe/simulation/types.d.ts.map +0 -1
  227. package/dist/safe/simulation/types.js +0 -2
  228. package/dist/safe/simulation/types.js.map +0 -1
  229. package/dist/safe/types.d.ts +0 -61
  230. package/dist/safe/types.d.ts.map +0 -1
  231. package/dist/safe/types.js +0 -2
  232. package/dist/safe/types.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"manager.js","sourceRoot":"","sources":["../../src/tx/manager.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Scope, SubscriptionRef } from \"effect\";\nimport { Clock, Context, Effect, Fiber, Layer, Ref, Stream } from \"effect\";\nimport type { Hash, TransactionReceipt } from \"viem\";\nimport { WaitForTransactionReceiptTimeoutError } from \"viem\";\nimport { DEFAULT_RECEIPT_TIMEOUT, DEFAULT_STUCK_TX_MS } from \"@/src/constants/index.js\";\nimport type { ClientNotFoundError, TransactionReplacementReason } from \"@/src/core/index.js\";\nimport {\n PublicClientService,\n ReceiptTimeoutError,\n TransactionFailedError,\n TransactionReplacedError,\n TransportError,\n} from \"@/src/core/index.js\";\nimport { SpanNames } from \"@/src/telemetry/index.js\";\nimport type { TxPolicy } from \"./policy.js\";\nimport { defaultPolicy } from \"./policy.js\";\nimport { TxReplacement } from \"./replacement.js\";\nimport type { TxState } from \"./tracker.js\";\nimport { makeTxTracker } from \"./tracker.js\";\n\nexport type TxManagerShape = {\n /**\n * Track an existing transaction hash and return a SubscriptionRef for state updates\n */\n readonly track: (\n chainId: number,\n hash: Hash,\n policy?: TxPolicy\n ) => Effect.Effect<SubscriptionRef.SubscriptionRef<TxState>, ClientNotFoundError, Scope.Scope>;\n\n /**\n * Wait for transaction receipt with timeout\n */\n readonly waitForReceipt: (\n chainId: number,\n hash: Hash,\n timeoutOrPolicy?: number | TxPolicy\n ) => Effect.Effect<\n TransactionReceipt,\n TransactionFailedError | ReceiptTimeoutError | TransactionReplacedError | ClientNotFoundError\n >;\n\n /**\n * Get the number of confirmations for a transaction\n */\n readonly getConfirmations: (\n chainId: number,\n params: { hash: Hash } | { transactionReceipt: TransactionReceipt }\n ) => Effect.Effect<bigint, ClientNotFoundError | TransportError>;\n};\n\nexport class TxManager extends Context.Tag(\"ew3/TxManager\")<TxManager, TxManagerShape>() {}\n\nexport const TxManagerLive = Layer.effect(\n TxManager,\n Effect.gen(function* () {\n const publicClientService = yield* PublicClientService;\n const txReplacement = yield* TxReplacement;\n\n return {\n getConfirmations: Effect.fn(\"TxManager.getConfirmations\")(function* (chainId, params) {\n const client = yield* publicClientService.get(chainId);\n\n return yield* Effect.tryPromise({\n catch: (cause) =>\n new TransportError({\n cause,\n message:\n cause instanceof Error ? cause.message : \"Failed to get transaction confirmations\",\n url: client.transport.url ?? \"\",\n }),\n try: () => client.getTransactionConfirmations(params),\n }).pipe(\n Effect.withSpan(SpanNames.TX_GET_CONFIRMATIONS, {\n attributes: {\n chainId,\n hash: \"hash\" in params ? params.hash : params.transactionReceipt.transactionHash,\n },\n })\n );\n }),\n track: Effect.fn(\"TxManager.track\")(function* (chainId, hash, providedPolicy) {\n const tracker = yield* makeTxTracker;\n const client = yield* publicClientService.get(chainId);\n const policy: TxPolicy = {\n ...defaultPolicy,\n ...providedPolicy,\n replacement: {\n ...(defaultPolicy.replacement ?? {}),\n ...(providedPolicy?.replacement ?? {}),\n },\n };\n\n // Set initial state\n yield* tracker.set({ hash, status: \"submitted\" });\n\n // Start tracking in background\n yield* Effect.forkScoped(\n Effect.gen(function* () {\n const currentHashRef = yield* Ref.make<Hash>(hash);\n const confirmationsRef = yield* Ref.make(0);\n const startedAtMsRef = yield* Ref.make(yield* Clock.currentTimeMillis);\n const autoAttemptsRef = yield* Ref.make(0);\n const autoReplacingRef = yield* Ref.make(false);\n\n const replacementStrategy =\n policy.replacement?.strategy ?? policy.replacementStrategy ?? \"none\";\n const stuckBlocks = policy.replacement?.stuckBlocks ?? 3;\n const stuckMs = policy.replacement?.stuckMs ?? DEFAULT_STUCK_TX_MS;\n const maxAttempts = policy.replacement?.maxAttempts ?? 1;\n\n const updatePendingState = (currentHash: Hash) =>\n Effect.gen(function* () {\n const confirmations = yield* Ref.modify(\n confirmationsRef,\n (n) => [n + 1, n + 1] as const\n );\n\n yield* tracker.set({\n confirmations,\n hash: currentHash,\n status: \"pending\",\n });\n return confirmations;\n });\n\n const performAutoReplacement = (currentHash: Hash, now: number) =>\n Ref.set(autoReplacingRef, true).pipe(\n Effect.zipRight(\n (replacementStrategy === \"cancel\"\n ? txReplacement.cancel(chainId, currentHash, policy)\n : txReplacement.speedup(chainId, currentHash, policy)\n ).pipe(\n Effect.either,\n Effect.ensuring(Ref.set(autoReplacingRef, false)),\n Effect.flatMap((replaced) => {\n if (replaced._tag === \"Left\") {\n return Effect.void;\n }\n\n const newHash = replaced.right;\n return Effect.all([\n Ref.set(currentHashRef, newHash),\n Ref.set(confirmationsRef, 0),\n Ref.set(startedAtMsRef, now),\n Ref.update(autoAttemptsRef, (n) => n + 1),\n tracker.set({\n newHash,\n oldHash: currentHash,\n reason: replacementStrategy === \"cancel\" ? \"cancelled\" : \"repriced\",\n status: \"replaced\",\n }),\n tracker.set({ hash: newHash, status: \"submitted\" }),\n ]).pipe(Effect.asVoid);\n })\n )\n )\n );\n\n const autoReplaceIfStuck = (currentHash: Hash, confirmations: number) => {\n if (replacementStrategy === \"none\") {\n return Effect.void;\n }\n\n return Effect.all({\n alreadyReplacing: Ref.get(autoReplacingRef),\n attempts: Ref.get(autoAttemptsRef),\n now: Clock.currentTimeMillis,\n startedAt: Ref.get(startedAtMsRef),\n }).pipe(\n Effect.flatMap(({ alreadyReplacing, attempts, now, startedAt }) => {\n const elapsed = startedAt > 0 ? now - startedAt : 0;\n const stuck = confirmations >= stuckBlocks || elapsed >= stuckMs;\n const allowed = attempts < maxAttempts && !alreadyReplacing;\n return stuck && allowed ? performAutoReplacement(currentHash, now) : Effect.void;\n })\n );\n };\n\n const onPendingBlock = Effect.gen(function* () {\n const currentHash = yield* Ref.get(currentHashRef);\n const confirmations = yield* updatePendingState(currentHash);\n yield* autoReplaceIfStuck(currentHash, confirmations);\n });\n\n const pendingFiber = yield* Stream.runForEach(\n Stream.async<bigint, unknown>((emit) => {\n const unwatch = client.watchBlockNumber({\n onBlockNumber: (blockNumber: bigint) => emit.single(blockNumber),\n onError: (error) => emit.fail(error as unknown),\n pollingInterval: policy.pollingInterval,\n });\n\n return Effect.sync(() => {\n unwatch();\n });\n }),\n () => onPendingBlock\n ).pipe(Effect.forkScoped);\n\n let replacement:\n | {\n oldHash: Hash;\n newHash: Hash;\n reason: TransactionReplacementReason;\n }\n | undefined;\n\n const receiptResult = yield* Effect.either(\n Effect.tryPromise({\n catch: (e) => e,\n try: () =>\n client.waitForTransactionReceipt({\n hash,\n onReplaced: (info) => {\n replacement = {\n newHash: info.transaction.hash,\n oldHash: info.replacedTransaction.hash,\n reason: info.reason,\n };\n },\n pollingInterval: policy.pollingInterval,\n timeout: policy.receiptTimeout,\n }),\n })\n ).pipe(Effect.ensuring(Fiber.interrupt(pendingFiber)));\n\n if (receiptResult._tag === \"Left\") {\n const cause = receiptResult.left;\n const timeout = policy.receiptTimeout ?? DEFAULT_RECEIPT_TIMEOUT;\n\n const failure =\n cause instanceof WaitForTransactionReceiptTimeoutError\n ? new ReceiptTimeoutError({\n hash,\n message: cause.message,\n timeout,\n })\n : cause;\n\n yield* tracker.set({\n error: new TransactionFailedError({\n cause: failure,\n hash,\n message: failure instanceof Error ? failure.message : String(failure),\n }),\n status: \"failed\",\n });\n\n return;\n }\n\n const receipt = receiptResult.right;\n\n if (replacement) {\n yield* Ref.set(currentHashRef, replacement.newHash);\n yield* tracker.set({\n newHash: replacement.newHash,\n oldHash: replacement.oldHash,\n reason: replacement.reason,\n status: \"replaced\",\n });\n yield* tracker.set({\n hash: replacement.newHash,\n status: \"submitted\",\n });\n }\n\n yield* tracker.set({\n effectiveGasPrice: receipt.effectiveGasPrice,\n hash: receipt.transactionHash,\n receipt,\n status: \"mined\",\n });\n })\n );\n\n return tracker.ref;\n }),\n\n waitForReceipt: Effect.fn(\"TxManager.waitForReceipt\")(\n function* (chainId, hash, timeoutOrPolicy) {\n const client = yield* publicClientService.get(chainId);\n const policy =\n typeof timeoutOrPolicy === \"object\" && timeoutOrPolicy !== null\n ? timeoutOrPolicy\n : undefined;\n const timeout =\n typeof timeoutOrPolicy === \"number\"\n ? timeoutOrPolicy\n : (policy?.receiptTimeout ?? defaultPolicy.receiptTimeout ?? DEFAULT_RECEIPT_TIMEOUT);\n const pollingInterval = policy?.pollingInterval ?? defaultPolicy.pollingInterval;\n\n return yield* Effect.tryPromise({\n catch: (cause) => {\n if (cause instanceof TransactionReplacedError) {\n return cause;\n }\n\n if (cause instanceof WaitForTransactionReceiptTimeoutError) {\n return new ReceiptTimeoutError({\n hash,\n message: cause.message,\n timeout,\n });\n }\n\n if (cause instanceof Error && cause.message.toLowerCase().includes(\"timeout\")) {\n return new ReceiptTimeoutError({\n hash,\n message: cause.message,\n timeout,\n });\n }\n\n return new TransactionFailedError({\n cause,\n hash,\n message: `Failed to get receipt for ${hash}`,\n });\n },\n try: async () => {\n let replacement: { newHash: Hash; reason: TransactionReplacementReason } | undefined;\n\n const receipt = await client.waitForTransactionReceipt({\n hash,\n onReplaced: (info) => {\n replacement = {\n newHash: info.transaction.hash,\n reason: info.reason,\n };\n },\n pollingInterval,\n timeout,\n });\n\n // Only throw if there's an actual replacement (different hash)\n if (replacement && replacement.newHash !== hash) {\n throw new TransactionReplacedError({\n message: `Transaction ${hash} was ${replacement.reason} with ${replacement.newHash}`,\n newHash: replacement.newHash,\n oldHash: hash,\n reason: replacement.reason,\n });\n }\n\n return receipt;\n },\n }).pipe(\n Effect.withSpan(SpanNames.TX_WAIT, {\n attributes: {\n chainId,\n hash,\n timeout,\n },\n })\n );\n }\n ),\n };\n })\n);\n"]}
1
+ {"version":3,"file":"manager.js","sourceRoot":"","sources":["../../src/tx/manager.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAE3E,OAAO,EAAE,qCAAqC,EAAE,MAAM,MAAM,CAAC;AAC7D,OAAO,EAAE,uBAAuB,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAExF,OAAO,EACL,mBAAmB,EACnB,mBAAmB,EACnB,cAAc,EACd,aAAa,EACb,eAAe,GAChB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AAErD,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAEjD,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAiC7C,MAAM,OAAO,SAAU,SAAQ,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,EAA6B;CAAG;AAE3F,MAAM,UAAU,iBAAiB,CAC/B,WAAsB;IAEtB,MAAM,YAAY,GAAa;QAC7B,GAAG,aAAa;QAChB,GAAG,WAAW;QACd,WAAW,EAAE;YACX,GAAG,CAAC,aAAa,CAAC,WAAW,IAAI,EAAE,CAAC;YACpC,GAAG,CAAC,WAAW,EAAE,WAAW,IAAI,EAAE,CAAC;SACpC;KACF,CAAC;IAEF,OAAO,KAAK,CAAC,MAAM,CACjB,SAAS,EACT,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;QAClB,MAAM,mBAAmB,GAAG,KAAK,CAAC,CAAC,mBAAmB,CAAC;QACvD,MAAM,aAAa,GAAG,KAAK,CAAC,CAAC,aAAa,CAAC;QAE3C,OAAO;YACL,gBAAgB,EAAE,MAAM,CAAC,EAAE,CAAC,4BAA4B,CAAC,CAAC,QAAQ,CAAC,EAAE,OAAO,EAAE,MAAM;gBAClF,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,mBAAmB,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;gBAEvD,OAAO,KAAK,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC;oBAC9B,KAAK,EAAE,CAAC,KAAK,EAAE,EAAE,CACf,IAAI,cAAc,CAAC;wBACjB,KAAK;wBACL,OAAO,EACL,KAAK,YAAY,KAAK;4BACpB,CAAC,CAAC,KAAK,CAAC,OAAO;4BACf,CAAC,CAAC,yCAAyC;wBAC/C,GAAG,EAAE,MAAM,CAAC,SAAS,CAAC,GAAG,IAAI,EAAE;qBAChC,CAAC;oBACJ,GAAG,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,2BAA2B,CAAC,MAAM,CAAC;iBACtD,CAAC,CAAC,IAAI,CACL,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,oBAAoB,EAAE;oBAC9C,UAAU,EAAE;wBACV,OAAO;wBACP,IAAI,EAAE,MAAM,IAAI,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,kBAAkB,CAAC,eAAe;qBACjF;iBACF,CAAC,CACH,CAAC;YACJ,CAAC,CAAC;YACF,KAAK,EAAE,MAAM,CAAC,EAAE,CAAC,iBAAiB,CAAC,CAAC,QAAQ,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,cAAc;gBAC1E,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,aAAa,CAAC;gBACrC,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,mBAAmB,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;gBACvD,MAAM,MAAM,GAAa;oBACvB,GAAG,YAAY;oBACf,GAAG,cAAc;oBACjB,WAAW,EAAE;wBACX,GAAG,CAAC,YAAY,CAAC,WAAW,IAAI,EAAE,CAAC;wBACnC,GAAG,CAAC,cAAc,EAAE,WAAW,IAAI,EAAE,CAAC;qBACvC;iBACF,CAAC;gBAGF,KAAK,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC,CAAC;gBAGlD,KAAK,CAAC,CAAC,MAAM,CAAC,UAAU,CAEtB,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;oBAClB,MAAM,cAAc,GAAG,KAAK,CAAC,CAAC,GAAG,CAAC,IAAI,CAAO,IAAI,CAAC,CAAC;oBACnD,MAAM,gBAAgB,GAAG,KAAK,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;oBAC5C,MAAM,cAAc,GAAG,KAAK,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC;oBACvE,MAAM,eAAe,GAAG,KAAK,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;oBAC3C,MAAM,gBAAgB,GAAG,KAAK,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;oBAEhD,MAAM,mBAAmB,GACvB,MAAM,CAAC,WAAW,EAAE,QAAQ,IAAI,MAAM,CAAC,mBAAmB,IAAI,MAAM,CAAC;oBACvE,MAAM,OAAO,GAAG,MAAM,CAAC,WAAW,EAAE,OAAO,IAAI,mBAAmB,CAAC;oBACnE,MAAM,WAAW,GAAG,MAAM,CAAC,WAAW,EAAE,WAAW,IAAI,CAAC,CAAC;oBAEzD,MAAM,kBAAkB,GAAG,CAAC,WAAiB,EAAE,EAAE,CAC/C,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;wBAClB,MAAM,aAAa,GAAG,KAAK,CAAC,CAAC,GAAG,CAAC,MAAM,CACrC,gBAAgB,EAChB,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAU,CAC/B,CAAC;wBAEF,KAAK,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC;4BACjB,aAAa;4BACb,IAAI,EAAE,WAAW;4BACjB,MAAM,EAAE,SAAS;yBAClB,CAAC,CAAC;wBACH,OAAO,aAAa,CAAC;oBACvB,CAAC,CAAC,CAAC;oBAEL,MAAM,sBAAsB,GAAG,CAAC,WAAiB,EAAE,GAAW,EAAE,EAAE,CAChE,GAAG,CAAC,GAAG,CAAC,gBAAgB,EAAE,IAAI,CAAC,CAAC,IAAI,CAClC,MAAM,CAAC,QAAQ,CACb,CAAC,mBAAmB,KAAK,QAAQ;wBAC/B,CAAC,CAAC,aAAa,CAAC,MAAM,CAAC,OAAO,EAAE,WAAW,EAAE,MAAM,CAAC;wBACpD,CAAC,CAAC,aAAa,CAAC,OAAO,CAAC,OAAO,EAAE,WAAW,EAAE,MAAM,CAAC,CACtD,CAAC,IAAI,CACJ,MAAM,CAAC,MAAM,EACb,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,gBAAgB,EAAE,KAAK,CAAC,CAAC,EACjD,MAAM,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,EAAE;wBAC1B,IAAI,QAAQ,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;4BAC7B,OAAO,MAAM,CAAC,IAAI,CAAC;wBACrB,CAAC;wBAED,MAAM,OAAO,GAAG,QAAQ,CAAC,KAAK,CAAC;wBAC/B,OAAO,MAAM,CAAC,GAAG,CAAC;4BAChB,GAAG,CAAC,GAAG,CAAC,cAAc,EAAE,OAAO,CAAC;4BAChC,GAAG,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC,CAAC;4BAC5B,GAAG,CAAC,GAAG,CAAC,cAAc,EAAE,GAAG,CAAC;4BAC5B,GAAG,CAAC,MAAM,CAAC,eAAe,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC;4BACzC,OAAO,CAAC,GAAG,CAAC;gCACV,OAAO;gCACP,OAAO,EAAE,WAAW;gCACpB,MAAM,EAAE,mBAAmB,KAAK,QAAQ,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,UAAU;gCACnE,MAAM,EAAE,UAAU;6BACnB,CAAC;4BACF,OAAO,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC;yBACpD,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;oBACzB,CAAC,CAAC,CACH,CACF,CACF,CAAC;oBAEJ,MAAM,kBAAkB,GAAG,CAAC,WAAiB,EAAE,EAAE;wBAC/C,IAAI,mBAAmB,KAAK,MAAM,EAAE,CAAC;4BACnC,OAAO,MAAM,CAAC,IAAI,CAAC;wBACrB,CAAC;wBAED,OAAO,MAAM,CAAC,GAAG,CAAC;4BAChB,gBAAgB,EAAE,GAAG,CAAC,GAAG,CAAC,gBAAgB,CAAC;4BAC3C,QAAQ,EAAE,GAAG,CAAC,GAAG,CAAC,eAAe,CAAC;4BAClC,GAAG,EAAE,KAAK,CAAC,iBAAiB;4BAC5B,SAAS,EAAE,GAAG,CAAC,GAAG,CAAC,cAAc,CAAC;yBACnC,CAAC,CAAC,IAAI,CACL,MAAM,CAAC,OAAO,CAAC,CAAC,EAAE,gBAAgB,EAAE,QAAQ,EAAE,GAAG,EAAE,SAAS,EAAE,EAAE,EAAE;4BAChE,MAAM,OAAO,GAAG,SAAS,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;4BACpD,MAAM,KAAK,GAAG,OAAO,IAAI,OAAO,CAAC;4BACjC,MAAM,OAAO,GAAG,QAAQ,GAAG,WAAW,IAAI,CAAC,gBAAgB,CAAC;4BAC5D,OAAO,KAAK,IAAI,OAAO;gCACrB,CAAC,CAAC,sBAAsB,CAAC,WAAW,EAAE,GAAG,CAAC;gCAC1C,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC;wBAClB,CAAC,CAAC,CACH,CAAC;oBACJ,CAAC,CAAC;oBAEF,MAAM,cAAc,GAAG,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;wBACzC,MAAM,WAAW,GAAG,KAAK,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;wBACnD,KAAK,CAAC,CAAC,kBAAkB,CAAC,WAAW,CAAC,CAAC;wBACvC,KAAK,CAAC,CAAC,kBAAkB,CAAC,WAAW,CAAC,CAAC;oBACzC,CAAC,CAAC,CAAC;oBAEH,MAAM,YAAY,GAAG,KAAK,CAAC,CAAC,MAAM,CAAC,UAAU,CAC3C,MAAM,CAAC,KAAK,CAAkB,CAAC,IAAI,EAAE,EAAE;wBACrC,MAAM,OAAO,GAAG,MAAM,CAAC,gBAAgB,CAAC;4BACtC,aAAa,EAAE,CAAC,WAAmB,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC;4BAChE,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,KAAgB,CAAC;4BAC/C,eAAe,EAAE,MAAM,CAAC,eAAe;yBACxC,CAAC,CAAC;wBAEH,OAAO,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE;4BACtB,OAAO,EAAE,CAAC;wBACZ,CAAC,CAAC,CAAC;oBACL,CAAC,CAAC,EACF,GAAG,EAAE,CAAC,cAAc,CACrB,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;oBAE1B,IAAI,WAMS,CAAC;oBAEd,MAAM,aAAa,GAAG,KAAK,CAAC,CAAC,MAAM,CAAC,MAAM,CACxC,MAAM,CAAC,UAAU,CAAC;wBAChB,KAAK,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;wBACf,GAAG,EAAE,GAAG,EAAE,CACR,MAAM,CAAC,yBAAyB,CAAC;4BAC/B,IAAI;4BACJ,UAAU,EAAE,CAAC,IAAI,EAAE,EAAE;gCACnB,WAAW,GAAG;oCACZ,OAAO,EAAE,IAAI,CAAC,WAAW,CAAC,IAAI;oCAC9B,OAAO,EAAE,IAAI,CAAC,mBAAmB,CAAC,IAAI;oCACtC,MAAM,EAAE,IAAI,CAAC,MAAM;iCACpB,CAAC;4BACJ,CAAC;4BACD,eAAe,EAAE,MAAM,CAAC,eAAe;4BACvC,OAAO,EAAE,MAAM,CAAC,cAAc;yBAC/B,CAAC;qBACL,CAAC,CACH,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;oBAEvD,IAAI,aAAa,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;wBAClC,MAAM,KAAK,GAAG,aAAa,CAAC,IAAI,CAAC;wBACjC,MAAM,OAAO,GAAG,MAAM,CAAC,cAAc,IAAI,uBAAuB,CAAC;wBAEjE,MAAM,OAAO,GACX,KAAK,YAAY,qCAAqC;4BACpD,CAAC,CAAC,IAAI,mBAAmB,CAAC;gCACtB,IAAI;gCACJ,OAAO,EAAE,KAAK,CAAC,OAAO;gCACtB,OAAO;6BACR,CAAC;4BACJ,CAAC,CAAC,KAAK,CAAC;wBAEZ,KAAK,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC;4BACjB,KAAK,EAAE,IAAI,aAAa,CAAC;gCACvB,KAAK,EAAE,OAAO;gCACd,IAAI;gCACJ,OAAO,EAAE,OAAO,YAAY,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC;6BACtE,CAAC;4BACF,MAAM,EAAE,QAAQ;yBACjB,CAAC,CAAC;wBAEH,OAAO;oBACT,CAAC;oBAED,MAAM,OAAO,GAAG,aAAa,CAAC,KAAK,CAAC;oBAEpC,IAAI,WAAW,EAAE,CAAC;wBAChB,KAAK,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,cAAc,EAAE,WAAW,CAAC,OAAO,CAAC,CAAC;wBACpD,KAAK,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC;4BACjB,OAAO,EAAE,WAAW,CAAC,OAAO;4BAC5B,OAAO,EAAE,WAAW,CAAC,OAAO;4BAC5B,MAAM,EAAE,WAAW,CAAC,MAAM;4BAC1B,MAAM,EAAE,UAAU;yBACnB,CAAC,CAAC;wBACH,KAAK,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC;4BACjB,IAAI,EAAE,WAAW,CAAC,OAAO;4BACzB,MAAM,EAAE,WAAW;yBACpB,CAAC,CAAC;oBACL,CAAC;oBAED,KAAK,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC;wBACjB,iBAAiB,EAAE,OAAO,CAAC,iBAAiB;wBAC5C,IAAI,EAAE,OAAO,CAAC,eAAe;wBAC7B,OAAO;wBACP,MAAM,EAAE,OAAO;qBAChB,CAAC,CAAC;gBACL,CAAC,CAAC,CACH,CAAC;gBAEF,OAAO,OAAO,CAAC,GAAG,CAAC;YACrB,CAAC,CAAC;YAEF,cAAc,EAAE,MAAM,CAAC,EAAE,CAAC,0BAA0B,CAAC,CACnD,QAAQ,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,eAAe;gBACvC,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,mBAAmB,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;gBACvD,MAAM,MAAM,GACV,OAAO,eAAe,KAAK,QAAQ,IAAI,eAAe,KAAK,IAAI;oBAC7D,CAAC,CAAC,eAAe;oBACjB,CAAC,CAAC,SAAS,CAAC;gBAChB,MAAM,OAAO,GACX,OAAO,eAAe,KAAK,QAAQ;oBACjC,CAAC,CAAC,eAAe;oBACjB,CAAC,CAAC,CAAC,MAAM,EAAE,cAAc;wBACvB,YAAY,CAAC,cAAc;wBAC3B,uBAAuB,CAAC,CAAC;gBAC/B,MAAM,eAAe,GAAG,MAAM,EAAE,eAAe,IAAI,YAAY,CAAC,eAAe,CAAC;gBAEhF,OAAO,KAAK,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC;oBAC9B,KAAK,EAAE,CAAC,KAAK,EAAE,EAAE;wBACf,IAAI,KAAK,YAAY,eAAe,EAAE,CAAC;4BACrC,OAAO,KAAK,CAAC;wBACf,CAAC;wBAED,IAAI,KAAK,YAAY,qCAAqC,EAAE,CAAC;4BAC3D,OAAO,IAAI,mBAAmB,CAAC;gCAC7B,IAAI;gCACJ,OAAO,EAAE,KAAK,CAAC,OAAO;gCACtB,OAAO;6BACR,CAAC,CAAC;wBACL,CAAC;wBAED,IAAI,KAAK,YAAY,KAAK,IAAI,KAAK,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;4BAC9E,OAAO,IAAI,mBAAmB,CAAC;gCAC7B,IAAI;gCACJ,OAAO,EAAE,KAAK,CAAC,OAAO;gCACtB,OAAO;6BACR,CAAC,CAAC;wBACL,CAAC;wBAED,OAAO,IAAI,aAAa,CAAC;4BACvB,KAAK;4BACL,IAAI;4BACJ,OAAO,EAAE,6BAA6B,IAAI,EAAE;yBAC7C,CAAC,CAAC;oBACL,CAAC;oBACD,GAAG,EAAE,KAAK,IAAI,EAAE;wBACd,IAAI,WAAuE,CAAC;wBAE5E,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,yBAAyB,CAAC;4BACrD,IAAI;4BACJ,UAAU,EAAE,CAAC,IAAI,EAAE,EAAE;gCACnB,WAAW,GAAG;oCACZ,OAAO,EAAE,IAAI,CAAC,WAAW,CAAC,IAAI;oCAC9B,MAAM,EAAE,IAAI,CAAC,MAAM;iCACpB,CAAC;4BACJ,CAAC;4BACD,eAAe;4BACf,OAAO;yBACR,CAAC,CAAC;wBAGH,IAAI,WAAW,IAAI,WAAW,CAAC,OAAO,KAAK,IAAI,EAAE,CAAC;4BAChD,MAAM,IAAI,eAAe,CAAC;gCACxB,OAAO,EAAE,eAAe,IAAI,QAAQ,WAAW,CAAC,MAAM,SAAS,WAAW,CAAC,OAAO,EAAE;gCACpF,OAAO,EAAE,WAAW,CAAC,OAAO;gCAC5B,OAAO,EAAE,IAAI;gCACb,MAAM,EAAE,WAAW,CAAC,MAAM;6BAC3B,CAAC,CAAC;wBACL,CAAC;wBAED,OAAO,OAAO,CAAC;oBACjB,CAAC;iBACF,CAAC,CAAC,IAAI,CACL,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,OAAO,EAAE;oBACjC,UAAU,EAAE;wBACV,OAAO;wBACP,IAAI;wBACJ,OAAO;qBACR;iBACF,CAAC,CACH,CAAC;YACJ,CAAC,CACF;SACF,CAAC;IACJ,CAAC,CAAC,CACH,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,MAAM,aAAa,GAAG,iBAAiB,EAAE,CAAC","sourcesContent":["import type { Scope, SubscriptionRef } from \"effect\";\nimport { Clock, Context, Effect, Fiber, Layer, Ref, Stream } from \"effect\";\nimport type { Hash, TransactionReceipt } from \"viem\";\nimport { WaitForTransactionReceiptTimeoutError } from \"viem\";\nimport { DEFAULT_RECEIPT_TIMEOUT, DEFAULT_STUCK_TX_MS } from \"@/src/constants/index.js\";\nimport type { ClientNotFoundError, TxReplacementReason } from \"@/src/core/index.js\";\nimport {\n PublicClientService,\n ReceiptTimeoutError,\n TransportError,\n TxFailedError,\n TxReplacedError,\n} from \"@/src/core/index.js\";\nimport { SpanNames } from \"@/src/telemetry/index.js\";\nimport type { TxPolicy } from \"./policy.js\";\nimport { defaultPolicy } from \"./policy.js\";\nimport { TxReplacement } from \"./replacement.js\";\nimport type { TxState } from \"./tracker.js\";\nimport { makeTxTracker } from \"./tracker.js\";\n\nexport type TxManagerShape = {\n /**\n * Track an existing transaction hash and return a SubscriptionRef for state updates\n */\n readonly track: (\n chainId: number,\n hash: Hash,\n policy?: TxPolicy\n ) => Effect.Effect<SubscriptionRef.SubscriptionRef<TxState>, ClientNotFoundError, Scope.Scope>;\n\n /**\n * Wait for transaction receipt with timeout\n */\n readonly waitForReceipt: (\n chainId: number,\n hash: Hash,\n timeoutOrPolicy?: number | TxPolicy\n ) => Effect.Effect<\n TransactionReceipt,\n TxFailedError | ReceiptTimeoutError | TxReplacedError | ClientNotFoundError\n >;\n\n /**\n * Get the number of confirmations for a transaction\n */\n readonly getConfirmations: (\n chainId: number,\n params: { hash: Hash } | { transactionReceipt: TransactionReceipt }\n ) => Effect.Effect<bigint, ClientNotFoundError | TransportError>;\n};\n\nexport class TxManager extends Context.Tag(\"ew3/TxManager\")<TxManager, TxManagerShape>() {}\n\nexport function makeTxManagerLive(\n layerPolicy?: TxPolicy\n): Layer.Layer<TxManager, never, PublicClientService | TxReplacement> {\n const layerDefault: TxPolicy = {\n ...defaultPolicy,\n ...layerPolicy,\n replacement: {\n ...(defaultPolicy.replacement ?? {}),\n ...(layerPolicy?.replacement ?? {}),\n },\n };\n\n return Layer.effect(\n TxManager,\n Effect.gen(function* () {\n const publicClientService = yield* PublicClientService;\n const txReplacement = yield* TxReplacement;\n\n return {\n getConfirmations: Effect.fn(\"TxManager.getConfirmations\")(function* (chainId, params) {\n const client = yield* publicClientService.get(chainId);\n\n return yield* Effect.tryPromise({\n catch: (cause) =>\n new TransportError({\n cause,\n message:\n cause instanceof Error\n ? cause.message\n : \"Failed to get transaction confirmations\",\n url: client.transport.url ?? \"\",\n }),\n try: () => client.getTransactionConfirmations(params),\n }).pipe(\n Effect.withSpan(SpanNames.TX_GET_CONFIRMATIONS, {\n attributes: {\n chainId,\n hash: \"hash\" in params ? params.hash : params.transactionReceipt.transactionHash,\n },\n })\n );\n }),\n track: Effect.fn(\"TxManager.track\")(function* (chainId, hash, providedPolicy) {\n const tracker = yield* makeTxTracker;\n const client = yield* publicClientService.get(chainId);\n const policy: TxPolicy = {\n ...layerDefault,\n ...providedPolicy,\n replacement: {\n ...(layerDefault.replacement ?? {}),\n ...(providedPolicy?.replacement ?? {}),\n },\n };\n\n // Set initial state\n yield* tracker.set({ hash, status: \"submitted\" });\n\n // Start tracking in background\n yield* Effect.forkScoped(\n // biome-ignore lint/complexity/noExcessiveCognitiveComplexity: tracking orchestration is inherently complex\n Effect.gen(function* () {\n const currentHashRef = yield* Ref.make<Hash>(hash);\n const confirmationsRef = yield* Ref.make(0);\n const startedAtMsRef = yield* Ref.make(yield* Clock.currentTimeMillis);\n const autoAttemptsRef = yield* Ref.make(0);\n const autoReplacingRef = yield* Ref.make(false);\n\n const replacementStrategy =\n policy.replacement?.strategy ?? policy.replacementStrategy ?? \"none\";\n const stuckMs = policy.replacement?.stuckMs ?? DEFAULT_STUCK_TX_MS;\n const maxAttempts = policy.replacement?.maxAttempts ?? 1;\n\n const updatePendingState = (currentHash: Hash) =>\n Effect.gen(function* () {\n const confirmations = yield* Ref.modify(\n confirmationsRef,\n (n) => [n + 1, n + 1] as const\n );\n\n yield* tracker.set({\n confirmations,\n hash: currentHash,\n status: \"pending\",\n });\n return confirmations;\n });\n\n const performAutoReplacement = (currentHash: Hash, now: number) =>\n Ref.set(autoReplacingRef, true).pipe(\n Effect.zipRight(\n (replacementStrategy === \"cancel\"\n ? txReplacement.cancel(chainId, currentHash, policy)\n : txReplacement.speedup(chainId, currentHash, policy)\n ).pipe(\n Effect.either,\n Effect.ensuring(Ref.set(autoReplacingRef, false)),\n Effect.flatMap((replaced) => {\n if (replaced._tag === \"Left\") {\n return Effect.void;\n }\n\n const newHash = replaced.right;\n return Effect.all([\n Ref.set(currentHashRef, newHash),\n Ref.set(confirmationsRef, 0),\n Ref.set(startedAtMsRef, now),\n Ref.update(autoAttemptsRef, (n) => n + 1),\n tracker.set({\n newHash,\n oldHash: currentHash,\n reason: replacementStrategy === \"cancel\" ? \"cancelled\" : \"repriced\",\n status: \"replaced\",\n }),\n tracker.set({ hash: newHash, status: \"submitted\" }),\n ]).pipe(Effect.asVoid);\n })\n )\n )\n );\n\n const autoReplaceIfStuck = (currentHash: Hash) => {\n if (replacementStrategy === \"none\") {\n return Effect.void;\n }\n\n return Effect.all({\n alreadyReplacing: Ref.get(autoReplacingRef),\n attempts: Ref.get(autoAttemptsRef),\n now: Clock.currentTimeMillis,\n startedAt: Ref.get(startedAtMsRef),\n }).pipe(\n Effect.flatMap(({ alreadyReplacing, attempts, now, startedAt }) => {\n const elapsed = startedAt > 0 ? now - startedAt : 0;\n const stuck = elapsed >= stuckMs;\n const allowed = attempts < maxAttempts && !alreadyReplacing;\n return stuck && allowed\n ? performAutoReplacement(currentHash, now)\n : Effect.void;\n })\n );\n };\n\n const onPendingBlock = Effect.gen(function* () {\n const currentHash = yield* Ref.get(currentHashRef);\n yield* updatePendingState(currentHash);\n yield* autoReplaceIfStuck(currentHash);\n });\n\n const pendingFiber = yield* Stream.runForEach(\n Stream.async<bigint, unknown>((emit) => {\n const unwatch = client.watchBlockNumber({\n onBlockNumber: (blockNumber: bigint) => emit.single(blockNumber),\n onError: (error) => emit.fail(error as unknown),\n pollingInterval: policy.pollingInterval,\n });\n\n return Effect.sync(() => {\n unwatch();\n });\n }),\n () => onPendingBlock\n ).pipe(Effect.forkScoped);\n\n let replacement:\n | {\n oldHash: Hash;\n newHash: Hash;\n reason: TxReplacementReason;\n }\n | undefined;\n\n const receiptResult = yield* Effect.either(\n Effect.tryPromise({\n catch: (e) => e,\n try: () =>\n client.waitForTransactionReceipt({\n hash,\n onReplaced: (info) => {\n replacement = {\n newHash: info.transaction.hash,\n oldHash: info.replacedTransaction.hash,\n reason: info.reason,\n };\n },\n pollingInterval: policy.pollingInterval,\n timeout: policy.receiptTimeout,\n }),\n })\n ).pipe(Effect.ensuring(Fiber.interrupt(pendingFiber)));\n\n if (receiptResult._tag === \"Left\") {\n const cause = receiptResult.left;\n const timeout = policy.receiptTimeout ?? DEFAULT_RECEIPT_TIMEOUT;\n\n const failure =\n cause instanceof WaitForTransactionReceiptTimeoutError\n ? new ReceiptTimeoutError({\n hash,\n message: cause.message,\n timeout,\n })\n : cause;\n\n yield* tracker.set({\n error: new TxFailedError({\n cause: failure,\n hash,\n message: failure instanceof Error ? failure.message : String(failure),\n }),\n status: \"failed\",\n });\n\n return;\n }\n\n const receipt = receiptResult.right;\n\n if (replacement) {\n yield* Ref.set(currentHashRef, replacement.newHash);\n yield* tracker.set({\n newHash: replacement.newHash,\n oldHash: replacement.oldHash,\n reason: replacement.reason,\n status: \"replaced\",\n });\n yield* tracker.set({\n hash: replacement.newHash,\n status: \"submitted\",\n });\n }\n\n yield* tracker.set({\n effectiveGasPrice: receipt.effectiveGasPrice,\n hash: receipt.transactionHash,\n receipt,\n status: \"mined\",\n });\n })\n );\n\n return tracker.ref;\n }),\n\n waitForReceipt: Effect.fn(\"TxManager.waitForReceipt\")(\n function* (chainId, hash, timeoutOrPolicy) {\n const client = yield* publicClientService.get(chainId);\n const policy =\n typeof timeoutOrPolicy === \"object\" && timeoutOrPolicy !== null\n ? timeoutOrPolicy\n : undefined;\n const timeout =\n typeof timeoutOrPolicy === \"number\"\n ? timeoutOrPolicy\n : (policy?.receiptTimeout ??\n layerDefault.receiptTimeout ??\n DEFAULT_RECEIPT_TIMEOUT);\n const pollingInterval = policy?.pollingInterval ?? layerDefault.pollingInterval;\n\n return yield* Effect.tryPromise({\n catch: (cause) => {\n if (cause instanceof TxReplacedError) {\n return cause;\n }\n\n if (cause instanceof WaitForTransactionReceiptTimeoutError) {\n return new ReceiptTimeoutError({\n hash,\n message: cause.message,\n timeout,\n });\n }\n\n if (cause instanceof Error && cause.message.toLowerCase().includes(\"timeout\")) {\n return new ReceiptTimeoutError({\n hash,\n message: cause.message,\n timeout,\n });\n }\n\n return new TxFailedError({\n cause,\n hash,\n message: `Failed to get receipt for ${hash}`,\n });\n },\n try: async () => {\n let replacement: { newHash: Hash; reason: TxReplacementReason } | undefined;\n\n const receipt = await client.waitForTransactionReceipt({\n hash,\n onReplaced: (info) => {\n replacement = {\n newHash: info.transaction.hash,\n reason: info.reason,\n };\n },\n pollingInterval,\n timeout,\n });\n\n // Only throw if there's an actual replacement (different hash)\n if (replacement && replacement.newHash !== hash) {\n throw new TxReplacedError({\n message: `Transaction ${hash} was ${replacement.reason} with ${replacement.newHash}`,\n newHash: replacement.newHash,\n oldHash: hash,\n reason: replacement.reason,\n });\n }\n\n return receipt;\n },\n }).pipe(\n Effect.withSpan(SpanNames.TX_WAIT, {\n attributes: {\n chainId,\n hash,\n timeout,\n },\n })\n );\n }\n ),\n };\n })\n );\n}\n\nexport const TxManagerLive = makeTxManagerLive();\n"]}
@@ -2,7 +2,7 @@ import { describe, expect, it } from "@effect/vitest";
2
2
  import { Effect, Either, Exit, Layer } from "effect";
3
3
  import { MIN_TX_GAS } from "../constants/index.js";
4
4
  import { makeMockPublicClientLayer, TEST_CHAIN_ID, TEST_TX_HASH } from "../testing-kit/index.js";
5
- import { TxManager, TxManagerLive, TxReplacement } from "../tx/index.js";
5
+ import { makeTxManagerLive, TxManager, TxManagerLive, TxReplacement } from "../tx/index.js";
6
6
  const txReplacementLayer = Layer.succeed(TxReplacement, TxReplacement.of({
7
7
  cancel: () => Effect.succeed(TEST_TX_HASH),
8
8
  speedup: () => Effect.succeed(TEST_TX_HASH),
@@ -33,7 +33,7 @@ describe("TxManager", () => {
33
33
  }).pipe(Effect.provide(Layer.provide(TxManagerLive, Layer.mergeAll(makeMockPublicClientLayer({
34
34
  waitForTransactionReceipt: async () => TEST_RECEIPT,
35
35
  }), txReplacementLayer)))));
36
- it.effect("returns TransactionFailedError on failure", () => Effect.gen(function* () {
36
+ it.effect("returns TxFailedError on failure", () => Effect.gen(function* () {
37
37
  const manager = yield* TxManager;
38
38
  const exit = yield* manager.waitForReceipt(TEST_CHAIN_ID, TEST_TX_HASH).pipe(Effect.exit);
39
39
  expect(Exit.isFailure(exit)).toBe(true);
@@ -49,15 +49,15 @@ describe("TxManager", () => {
49
49
  }).pipe(Effect.provide(Layer.provide(TxManagerLive, Layer.mergeAll(makeMockPublicClientLayer({
50
50
  waitForTransactionReceipt: () => Promise.reject(new Error("timeout waiting for transaction")),
51
51
  }), txReplacementLayer)))));
52
- it.effect("returns TransactionReplacedError when transaction is replaced", () => Effect.gen(function* () {
52
+ it.effect("returns TxReplacedError when transaction is replaced", () => Effect.gen(function* () {
53
53
  const manager = yield* TxManager;
54
54
  const result = yield* manager
55
55
  .waitForReceipt(TEST_CHAIN_ID, TEST_TX_HASH)
56
56
  .pipe(Effect.either);
57
57
  Either.match(result, {
58
58
  onLeft: (error) => {
59
- expect(error._tag).toBe("TransactionReplacedError");
60
- if (error._tag === "TransactionReplacedError") {
59
+ expect(error._tag).toBe("TxReplacedError");
60
+ if (error._tag === "TxReplacedError") {
61
61
  expect(error.oldHash).toBe(TEST_TX_HASH);
62
62
  expect(error.newHash).toBe("0x9999999999999999999999999999999999999999999999999999999999999999");
63
63
  expect(error.reason).toBe("replaced");
@@ -124,6 +124,26 @@ describe("TxManager", () => {
124
124
  }),
125
125
  }), txReplacementLayer))), Effect.scoped));
126
126
  });
127
+ describe("makeTxManagerLive", () => {
128
+ it.effect("applies custom layer policy as base for waitForReceipt", () => Effect.gen(function* () {
129
+ const manager = yield* TxManager;
130
+ const exit = yield* manager.waitForReceipt(TEST_CHAIN_ID, TEST_TX_HASH).pipe(Effect.exit);
131
+ expect(Exit.isFailure(exit)).toBe(true);
132
+ }).pipe(Effect.provide(Layer.provide(makeTxManagerLive({ receiptTimeout: 100 }), Layer.mergeAll(makeMockPublicClientLayer({
133
+ waitForTransactionReceipt: () => new Promise((_resolve, reject) => {
134
+ setTimeout(() => reject(new Error("timeout waiting for transaction")), 200);
135
+ }),
136
+ }), txReplacementLayer)))));
137
+ it.effect("per-call policy overrides layer policy", () => Effect.gen(function* () {
138
+ const manager = yield* TxManager;
139
+ const receipt = yield* manager.waitForReceipt(TEST_CHAIN_ID, TEST_TX_HASH, {
140
+ receiptTimeout: 5000,
141
+ });
142
+ expect(receipt.transactionHash).toBe(TEST_TX_HASH);
143
+ }).pipe(Effect.provide(Layer.provide(makeTxManagerLive({ receiptTimeout: 100 }), Layer.mergeAll(makeMockPublicClientLayer({
144
+ waitForTransactionReceipt: async () => TEST_RECEIPT,
145
+ }), txReplacementLayer)))));
146
+ });
127
147
  describe("getConfirmations", () => {
128
148
  it.effect("returns confirmations when called with hash param", () => Effect.gen(function* () {
129
149
  const manager = yield* TxManager;
@@ -1 +1 @@
1
- {"version":3,"file":"manager.test.integration.js","sourceRoot":"","sources":["../../src/tx/manager.test.integration.ts"],"names":[],"mappings":"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","sourcesContent":["import { describe, expect, it } from \"@effect/vitest\";\nimport { Effect, Either, Exit, Layer } from \"effect\";\nimport type { TransactionReceipt } from \"viem\";\nimport { MIN_TX_GAS } from \"@/src/constants/index.js\";\nimport { makeMockPublicClientLayer, TEST_CHAIN_ID, TEST_TX_HASH } from \"@/src/testing-kit/index.js\";\nimport { TxManager, TxManagerLive, TxReplacement } from \"@/src/tx/index.js\";\n\nconst txReplacementLayer = Layer.succeed(\n TxReplacement,\n TxReplacement.of({\n cancel: () => Effect.succeed(TEST_TX_HASH),\n speedup: () => Effect.succeed(TEST_TX_HASH),\n })\n);\n\nconst TEST_RECEIPT: TransactionReceipt = {\n blockHash: \"0xblock\",\n blockNumber: 123n,\n contractAddress: null,\n cumulativeGasUsed: MIN_TX_GAS,\n effectiveGasPrice: 1n,\n from: \"0xfrom\",\n gasUsed: MIN_TX_GAS,\n logs: [],\n logsBloom: \"0x\",\n status: \"success\",\n to: \"0xto\",\n transactionHash: TEST_TX_HASH,\n transactionIndex: 0,\n type: \"0x2\",\n};\n\ndescribe(\"TxManager\", () => {\n describe(\"waitForReceipt\", () => {\n it.effect(\"returns receipt on success\", () =>\n Effect.gen(function* () {\n const manager = yield* TxManager;\n const receipt = yield* manager.waitForReceipt(TEST_CHAIN_ID, TEST_TX_HASH);\n\n expect(receipt.transactionHash).toBe(TEST_TX_HASH);\n expect(receipt.status).toBe(\"success\");\n }).pipe(\n Effect.provide(\n Layer.provide(\n TxManagerLive,\n Layer.mergeAll(\n makeMockPublicClientLayer({\n waitForTransactionReceipt: async () => TEST_RECEIPT,\n }),\n txReplacementLayer\n )\n )\n )\n )\n );\n\n it.effect(\"returns TransactionFailedError on failure\", () =>\n Effect.gen(function* () {\n const manager = yield* TxManager;\n const exit = yield* manager.waitForReceipt(TEST_CHAIN_ID, TEST_TX_HASH).pipe(Effect.exit);\n\n expect(Exit.isFailure(exit)).toBe(true);\n }).pipe(\n Effect.provide(\n Layer.provide(\n TxManagerLive,\n Layer.mergeAll(\n makeMockPublicClientLayer({\n waitForTransactionReceipt: () => Promise.reject(new Error(\"Transaction reverted\")),\n }),\n txReplacementLayer\n )\n )\n )\n )\n );\n\n it.effect(\"returns ReceiptTimeoutError when error message contains timeout\", () =>\n Effect.gen(function* () {\n const manager = yield* TxManager;\n const exit = yield* manager\n .waitForReceipt(TEST_CHAIN_ID, TEST_TX_HASH, 5000)\n .pipe(Effect.exit);\n\n expect(Exit.isFailure(exit)).toBe(true);\n }).pipe(\n Effect.provide(\n Layer.provide(\n TxManagerLive,\n Layer.mergeAll(\n makeMockPublicClientLayer({\n waitForTransactionReceipt: () =>\n Promise.reject(new Error(\"timeout waiting for transaction\")),\n }),\n txReplacementLayer\n )\n )\n )\n )\n );\n\n it.effect(\"returns TransactionReplacedError when transaction is replaced\", () =>\n Effect.gen(function* () {\n const manager = yield* TxManager;\n const result = yield* manager\n .waitForReceipt(TEST_CHAIN_ID, TEST_TX_HASH)\n .pipe(Effect.either);\n\n Either.match(result, {\n onLeft: (error) => {\n expect(error._tag).toBe(\"TransactionReplacedError\");\n if (error._tag === \"TransactionReplacedError\") {\n expect(error.oldHash).toBe(TEST_TX_HASH);\n expect(error.newHash).toBe(\n \"0x9999999999999999999999999999999999999999999999999999999999999999\"\n );\n expect(error.reason).toBe(\"replaced\");\n }\n },\n onRight: () => {\n throw new Error(\"Expected failure (Left), got success (Right)\");\n },\n });\n }).pipe(\n Effect.provide(\n Layer.provide(\n TxManagerLive,\n Layer.mergeAll(\n makeMockPublicClientLayer({\n waitForTransactionReceipt: (params: unknown) => {\n type ReplacementInfo = {\n reason: \"cancelled\" | \"replaced\" | \"repriced\";\n transaction: { hash: string };\n };\n type WaitForTransactionReceiptParams = {\n hash: string;\n onReplaced?: (info: ReplacementInfo) => void;\n };\n\n const { onReplaced } = params as WaitForTransactionReceiptParams;\n\n onReplaced?.({\n reason: \"replaced\",\n transaction: {\n hash: \"0x9999999999999999999999999999999999999999999999999999999999999999\",\n },\n });\n\n return Promise.resolve({\n ...TEST_RECEIPT,\n transactionHash:\n \"0x9999999999999999999999999999999999999999999999999999999999999999\",\n } as TransactionReceipt);\n },\n }),\n txReplacementLayer\n )\n )\n )\n )\n );\n\n it.effect(\"returns receipt when onReplaced fires with same hash (no actual replacement)\", () =>\n Effect.gen(function* () {\n const manager = yield* TxManager;\n const result = yield* manager\n .waitForReceipt(TEST_CHAIN_ID, TEST_TX_HASH)\n .pipe(Effect.either);\n\n Either.match(result, {\n onLeft: (error) => {\n throw new Error(`Expected success (Right), got error (Left): ${error._tag}`);\n },\n onRight: (receipt) => {\n expect(receipt.transactionHash).toBe(TEST_TX_HASH);\n expect(receipt.status).toBe(\"success\");\n },\n });\n }).pipe(\n Effect.provide(\n Layer.provide(\n TxManagerLive,\n Layer.mergeAll(\n makeMockPublicClientLayer({\n waitForTransactionReceipt: (params: unknown) => {\n type ReplacementInfo = {\n reason: \"cancelled\" | \"replaced\" | \"repriced\";\n transaction: { hash: string };\n };\n type WaitForTransactionReceiptParams = {\n hash: string;\n onReplaced?: (info: ReplacementInfo) => void;\n };\n\n const { onReplaced, hash } = params as WaitForTransactionReceiptParams;\n\n // Simulate viem calling onReplaced with same hash (edge case)\n onReplaced?.({\n reason: \"repriced\",\n transaction: { hash }, // Same hash as original!\n });\n\n return Promise.resolve({\n ...TEST_RECEIPT,\n transactionHash: hash, // Same hash\n } as TransactionReceipt);\n },\n }),\n txReplacementLayer\n )\n )\n )\n )\n );\n });\n\n describe(\"track\", () => {\n it.effect(\"returns SubscriptionRef with initial submitted state\", () =>\n Effect.gen(function* () {\n const manager = yield* TxManager;\n const ref = yield* manager.track(TEST_CHAIN_ID, TEST_TX_HASH);\n const state = yield* ref.get;\n\n expect(state.status).toBe(\"submitted\");\n if (state.status === \"submitted\") {\n expect(state.hash).toBe(TEST_TX_HASH);\n }\n }).pipe(\n Effect.provide(\n Layer.provide(\n TxManagerLive,\n Layer.mergeAll(\n makeMockPublicClientLayer({\n waitForTransactionReceipt: async () =>\n new Promise<never>(() => {\n // Intentionally never resolves.\n }),\n }),\n txReplacementLayer\n )\n )\n ),\n Effect.scoped\n )\n );\n\n // Note: Testing background state updates in a scoped fork is complex\n // These tests verify that track() returns a proper SubscriptionRef\n // Integration tests should verify the full async behavior\n });\n\n describe(\"getConfirmations\", () => {\n it.effect(\"returns confirmations when called with hash param\", () =>\n Effect.gen(function* () {\n const manager = yield* TxManager;\n const confirmations = yield* manager.getConfirmations(TEST_CHAIN_ID, {\n hash: TEST_TX_HASH,\n });\n\n expect(confirmations).toBe(5n);\n }).pipe(\n Effect.provide(\n Layer.provide(\n TxManagerLive,\n Layer.mergeAll(\n makeMockPublicClientLayer({\n getTransactionConfirmations: async () => 5n,\n }),\n txReplacementLayer\n )\n )\n )\n )\n );\n\n it.effect(\"returns confirmations when called with transactionReceipt param\", () =>\n Effect.gen(function* () {\n const manager = yield* TxManager;\n\n const confirmations = yield* manager.getConfirmations(TEST_CHAIN_ID, {\n transactionReceipt: TEST_RECEIPT,\n });\n\n expect(confirmations).toBe(10n);\n }).pipe(\n Effect.provide(\n Layer.provide(\n TxManagerLive,\n Layer.mergeAll(\n makeMockPublicClientLayer({\n getTransactionConfirmations: async () => 10n,\n }),\n txReplacementLayer\n )\n )\n )\n )\n );\n\n it.effect(\"returns TransportError on failure\", () =>\n Effect.gen(function* () {\n const manager = yield* TxManager;\n const exit = yield* manager\n .getConfirmations(TEST_CHAIN_ID, { hash: TEST_TX_HASH })\n .pipe(Effect.exit);\n\n expect(Exit.isFailure(exit)).toBe(true);\n }).pipe(\n Effect.provide(\n Layer.provide(\n TxManagerLive,\n Layer.mergeAll(\n makeMockPublicClientLayer({\n getTransactionConfirmations: () => Promise.reject(new Error(\"RPC error\")),\n }),\n txReplacementLayer\n )\n )\n )\n )\n );\n });\n});\n"]}
1
+ {"version":3,"file":"manager.test.integration.js","sourceRoot":"","sources":["../../src/tx/manager.test.integration.ts"],"names":[],"mappings":"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","sourcesContent":["import { describe, expect, it } from \"@effect/vitest\";\nimport { Effect, Either, Exit, Layer } from \"effect\";\nimport type { TransactionReceipt } from \"viem\";\nimport { MIN_TX_GAS } from \"@/src/constants/index.js\";\nimport { makeMockPublicClientLayer, TEST_CHAIN_ID, TEST_TX_HASH } from \"@/src/testing-kit/index.js\";\nimport { makeTxManagerLive, TxManager, TxManagerLive, TxReplacement } from \"@/src/tx/index.js\";\n\nconst txReplacementLayer = Layer.succeed(\n TxReplacement,\n TxReplacement.of({\n cancel: () => Effect.succeed(TEST_TX_HASH),\n speedup: () => Effect.succeed(TEST_TX_HASH),\n })\n);\n\nconst TEST_RECEIPT: TransactionReceipt = {\n blockHash: \"0xblock\",\n blockNumber: 123n,\n contractAddress: null,\n cumulativeGasUsed: MIN_TX_GAS,\n effectiveGasPrice: 1n,\n from: \"0xfrom\",\n gasUsed: MIN_TX_GAS,\n logs: [],\n logsBloom: \"0x\",\n status: \"success\",\n to: \"0xto\",\n transactionHash: TEST_TX_HASH,\n transactionIndex: 0,\n type: \"0x2\",\n};\n\ndescribe(\"TxManager\", () => {\n describe(\"waitForReceipt\", () => {\n it.effect(\"returns receipt on success\", () =>\n Effect.gen(function* () {\n const manager = yield* TxManager;\n const receipt = yield* manager.waitForReceipt(TEST_CHAIN_ID, TEST_TX_HASH);\n\n expect(receipt.transactionHash).toBe(TEST_TX_HASH);\n expect(receipt.status).toBe(\"success\");\n }).pipe(\n Effect.provide(\n Layer.provide(\n TxManagerLive,\n Layer.mergeAll(\n makeMockPublicClientLayer({\n waitForTransactionReceipt: async () => TEST_RECEIPT,\n }),\n txReplacementLayer\n )\n )\n )\n )\n );\n\n it.effect(\"returns TxFailedError on failure\", () =>\n Effect.gen(function* () {\n const manager = yield* TxManager;\n const exit = yield* manager.waitForReceipt(TEST_CHAIN_ID, TEST_TX_HASH).pipe(Effect.exit);\n\n expect(Exit.isFailure(exit)).toBe(true);\n }).pipe(\n Effect.provide(\n Layer.provide(\n TxManagerLive,\n Layer.mergeAll(\n makeMockPublicClientLayer({\n waitForTransactionReceipt: () => Promise.reject(new Error(\"Transaction reverted\")),\n }),\n txReplacementLayer\n )\n )\n )\n )\n );\n\n it.effect(\"returns ReceiptTimeoutError when error message contains timeout\", () =>\n Effect.gen(function* () {\n const manager = yield* TxManager;\n const exit = yield* manager\n .waitForReceipt(TEST_CHAIN_ID, TEST_TX_HASH, 5000)\n .pipe(Effect.exit);\n\n expect(Exit.isFailure(exit)).toBe(true);\n }).pipe(\n Effect.provide(\n Layer.provide(\n TxManagerLive,\n Layer.mergeAll(\n makeMockPublicClientLayer({\n waitForTransactionReceipt: () =>\n Promise.reject(new Error(\"timeout waiting for transaction\")),\n }),\n txReplacementLayer\n )\n )\n )\n )\n );\n\n it.effect(\"returns TxReplacedError when transaction is replaced\", () =>\n Effect.gen(function* () {\n const manager = yield* TxManager;\n const result = yield* manager\n .waitForReceipt(TEST_CHAIN_ID, TEST_TX_HASH)\n .pipe(Effect.either);\n\n Either.match(result, {\n onLeft: (error) => {\n expect(error._tag).toBe(\"TxReplacedError\");\n if (error._tag === \"TxReplacedError\") {\n expect(error.oldHash).toBe(TEST_TX_HASH);\n expect(error.newHash).toBe(\n \"0x9999999999999999999999999999999999999999999999999999999999999999\"\n );\n expect(error.reason).toBe(\"replaced\");\n }\n },\n onRight: () => {\n throw new Error(\"Expected failure (Left), got success (Right)\");\n },\n });\n }).pipe(\n Effect.provide(\n Layer.provide(\n TxManagerLive,\n Layer.mergeAll(\n makeMockPublicClientLayer({\n waitForTransactionReceipt: (params: unknown) => {\n type ReplacementInfo = {\n reason: \"cancelled\" | \"replaced\" | \"repriced\";\n transaction: { hash: string };\n };\n type WaitForTransactionReceiptParams = {\n hash: string;\n onReplaced?: (info: ReplacementInfo) => void;\n };\n\n const { onReplaced } = params as WaitForTransactionReceiptParams;\n\n onReplaced?.({\n reason: \"replaced\",\n transaction: {\n hash: \"0x9999999999999999999999999999999999999999999999999999999999999999\",\n },\n });\n\n return Promise.resolve({\n ...TEST_RECEIPT,\n transactionHash:\n \"0x9999999999999999999999999999999999999999999999999999999999999999\",\n } as TransactionReceipt);\n },\n }),\n txReplacementLayer\n )\n )\n )\n )\n );\n\n it.effect(\"returns receipt when onReplaced fires with same hash (no actual replacement)\", () =>\n Effect.gen(function* () {\n const manager = yield* TxManager;\n const result = yield* manager\n .waitForReceipt(TEST_CHAIN_ID, TEST_TX_HASH)\n .pipe(Effect.either);\n\n Either.match(result, {\n onLeft: (error) => {\n throw new Error(`Expected success (Right), got error (Left): ${error._tag}`);\n },\n onRight: (receipt) => {\n expect(receipt.transactionHash).toBe(TEST_TX_HASH);\n expect(receipt.status).toBe(\"success\");\n },\n });\n }).pipe(\n Effect.provide(\n Layer.provide(\n TxManagerLive,\n Layer.mergeAll(\n makeMockPublicClientLayer({\n waitForTransactionReceipt: (params: unknown) => {\n type ReplacementInfo = {\n reason: \"cancelled\" | \"replaced\" | \"repriced\";\n transaction: { hash: string };\n };\n type WaitForTransactionReceiptParams = {\n hash: string;\n onReplaced?: (info: ReplacementInfo) => void;\n };\n\n const { onReplaced, hash } = params as WaitForTransactionReceiptParams;\n\n // Simulate viem calling onReplaced with same hash (edge case)\n onReplaced?.({\n reason: \"repriced\",\n transaction: { hash }, // Same hash as original!\n });\n\n return Promise.resolve({\n ...TEST_RECEIPT,\n transactionHash: hash, // Same hash\n } as TransactionReceipt);\n },\n }),\n txReplacementLayer\n )\n )\n )\n )\n );\n });\n\n describe(\"track\", () => {\n it.effect(\"returns SubscriptionRef with initial submitted state\", () =>\n Effect.gen(function* () {\n const manager = yield* TxManager;\n const ref = yield* manager.track(TEST_CHAIN_ID, TEST_TX_HASH);\n const state = yield* ref.get;\n\n expect(state.status).toBe(\"submitted\");\n if (state.status === \"submitted\") {\n expect(state.hash).toBe(TEST_TX_HASH);\n }\n }).pipe(\n Effect.provide(\n Layer.provide(\n TxManagerLive,\n Layer.mergeAll(\n makeMockPublicClientLayer({\n waitForTransactionReceipt: async () =>\n new Promise<never>(() => {\n // Intentionally never resolves.\n }),\n }),\n txReplacementLayer\n )\n )\n ),\n Effect.scoped\n )\n );\n\n // Note: Testing background state updates in a scoped fork is complex\n // These tests verify that track() returns a proper SubscriptionRef\n // Integration tests should verify the full async behavior\n });\n\n describe(\"makeTxManagerLive\", () => {\n it.effect(\"applies custom layer policy as base for waitForReceipt\", () =>\n Effect.gen(function* () {\n const manager = yield* TxManager;\n\n // The custom layer policy sets a short timeout (100ms).\n // The mock delays 200ms, so the receipt should timeout.\n const exit = yield* manager.waitForReceipt(TEST_CHAIN_ID, TEST_TX_HASH).pipe(Effect.exit);\n\n expect(Exit.isFailure(exit)).toBe(true);\n }).pipe(\n Effect.provide(\n Layer.provide(\n makeTxManagerLive({ receiptTimeout: 100 }),\n Layer.mergeAll(\n makeMockPublicClientLayer({\n waitForTransactionReceipt: () =>\n new Promise<never>((_resolve, reject) => {\n setTimeout(() => reject(new Error(\"timeout waiting for transaction\")), 200);\n }),\n }),\n txReplacementLayer\n )\n )\n )\n )\n );\n\n it.effect(\"per-call policy overrides layer policy\", () =>\n Effect.gen(function* () {\n const manager = yield* TxManager;\n\n // Layer policy has 100ms timeout, but per-call overrides to 5000ms.\n // The mock resolves immediately, so it should succeed.\n const receipt = yield* manager.waitForReceipt(TEST_CHAIN_ID, TEST_TX_HASH, {\n receiptTimeout: 5000,\n });\n\n expect(receipt.transactionHash).toBe(TEST_TX_HASH);\n }).pipe(\n Effect.provide(\n Layer.provide(\n makeTxManagerLive({ receiptTimeout: 100 }),\n Layer.mergeAll(\n makeMockPublicClientLayer({\n waitForTransactionReceipt: async () => TEST_RECEIPT,\n }),\n txReplacementLayer\n )\n )\n )\n )\n );\n });\n\n describe(\"getConfirmations\", () => {\n it.effect(\"returns confirmations when called with hash param\", () =>\n Effect.gen(function* () {\n const manager = yield* TxManager;\n const confirmations = yield* manager.getConfirmations(TEST_CHAIN_ID, {\n hash: TEST_TX_HASH,\n });\n\n expect(confirmations).toBe(5n);\n }).pipe(\n Effect.provide(\n Layer.provide(\n TxManagerLive,\n Layer.mergeAll(\n makeMockPublicClientLayer({\n getTransactionConfirmations: async () => 5n,\n }),\n txReplacementLayer\n )\n )\n )\n )\n );\n\n it.effect(\"returns confirmations when called with transactionReceipt param\", () =>\n Effect.gen(function* () {\n const manager = yield* TxManager;\n\n const confirmations = yield* manager.getConfirmations(TEST_CHAIN_ID, {\n transactionReceipt: TEST_RECEIPT,\n });\n\n expect(confirmations).toBe(10n);\n }).pipe(\n Effect.provide(\n Layer.provide(\n TxManagerLive,\n Layer.mergeAll(\n makeMockPublicClientLayer({\n getTransactionConfirmations: async () => 10n,\n }),\n txReplacementLayer\n )\n )\n )\n )\n );\n\n it.effect(\"returns TransportError on failure\", () =>\n Effect.gen(function* () {\n const manager = yield* TxManager;\n const exit = yield* manager\n .getConfirmations(TEST_CHAIN_ID, { hash: TEST_TX_HASH })\n .pipe(Effect.exit);\n\n expect(Exit.isFailure(exit)).toBe(true);\n }).pipe(\n Effect.provide(\n Layer.provide(\n TxManagerLive,\n Layer.mergeAll(\n makeMockPublicClientLayer({\n getTransactionConfirmations: () => Promise.reject(new Error(\"RPC error\")),\n }),\n txReplacementLayer\n )\n )\n )\n )\n );\n });\n});\n"]}
@@ -9,7 +9,6 @@ export type TxPolicy = {
9
9
  replacementStrategy?: "speedup" | "cancel" | "none";
10
10
  replacement?: {
11
11
  strategy?: "speedup" | "cancel" | "none";
12
- stuckBlocks?: number;
13
12
  stuckMs?: number;
14
13
  maxAttempts?: number;
15
14
  };
@@ -1 +1 @@
1
- {"version":3,"file":"policy.d.ts","sourceRoot":"","sources":["../../src/tx/policy.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAEnD,MAAM,MAAM,QAAQ,GAAG;IAErB,YAAY,CAAC,EAAE,MAAM,CAAC;IAEtB,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAE9B,QAAQ,CAAC,EAAE,QAAQ,CAAC;IAEpB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAE5B,cAAc,CAAC,EAAE,MAAM,CAAC;IAExB,eAAe,CAAC,EAAE,MAAM,CAAC;IAEzB,mBAAmB,CAAC,EAAE,SAAS,GAAG,QAAQ,GAAG,MAAM,CAAC;IAEpD,WAAW,CAAC,EAAE;QACZ,QAAQ,CAAC,EAAE,SAAS,GAAG,QAAQ,GAAG,MAAM,CAAC;QAEzC,WAAW,CAAC,EAAE,MAAM,CAAC;QAErB,OAAO,CAAC,EAAE,MAAM,CAAC;QAEjB,WAAW,CAAC,EAAE,MAAM,CAAC;KACtB,CAAC;CACH,CAAC;AAEF,eAAO,MAAM,aAAa,EAAE,QAM3B,CAAC"}
1
+ {"version":3,"file":"policy.d.ts","sourceRoot":"","sources":["../../src/tx/policy.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAEnD,MAAM,MAAM,QAAQ,GAAG;IAErB,YAAY,CAAC,EAAE,MAAM,CAAC;IAEtB,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAE9B,QAAQ,CAAC,EAAE,QAAQ,CAAC;IAEpB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAE5B,cAAc,CAAC,EAAE,MAAM,CAAC;IAExB,eAAe,CAAC,EAAE,MAAM,CAAC;IAEzB,mBAAmB,CAAC,EAAE,SAAS,GAAG,QAAQ,GAAG,MAAM,CAAC;IAEpD,WAAW,CAAC,EAAE;QACZ,QAAQ,CAAC,EAAE,SAAS,GAAG,QAAQ,GAAG,MAAM,CAAC;QAEzC,OAAO,CAAC,EAAE,MAAM,CAAC;QAEjB,WAAW,CAAC,EAAE,MAAM,CAAC;KACtB,CAAC;CACH,CAAC;AAEF,eAAO,MAAM,aAAa,EAAE,QAM3B,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"policy.js","sourceRoot":"","sources":["../../src/tx/policy.ts"],"names":[],"mappings":"AACA,OAAO,EACL,4BAA4B,EAC5B,wBAAwB,EACxB,uBAAuB,GACxB,MAAM,0BAA0B,CAAC;AA8BlC,MAAM,CAAC,MAAM,aAAa,GAAa;IACrC,QAAQ,EAAE,UAAU;IACpB,kBAAkB,EAAE,4BAA4B;IAChD,eAAe,EAAE,wBAAwB;IACzC,cAAc,EAAE,uBAAuB;IACvC,mBAAmB,EAAE,MAAM;CAC5B,CAAC","sourcesContent":["/** Transaction execution policy */\nimport {\n DEFAULT_GAS_LIMIT_MULTIPLIER,\n DEFAULT_POLLING_INTERVAL,\n DEFAULT_RECEIPT_TIMEOUT,\n} from \"@/src/constants/index.js\";\nimport type { GasSpeed } from \"@/src/gas/index.js\";\n\nexport type TxPolicy = {\n /** Max fee per gas in wei (optional cap) */\n maxFeePerGas?: bigint;\n /** Max priority fee per gas in wei */\n maxPriorityFeePerGas?: bigint;\n /** Fee estimation speed tier */\n feeSpeed?: GasSpeed;\n /** Gas limit multiplier applied to estimates */\n gasLimitMultiplier?: number;\n /** Timeout in milliseconds for receipt polling */\n receiptTimeout?: number;\n /** Polling interval in milliseconds */\n pollingInterval?: number;\n /** Replacement strategy when stuck */\n replacementStrategy?: \"speedup\" | \"cancel\" | \"none\";\n /** Replacement behavior (preferred) */\n replacement?: {\n strategy?: \"speedup\" | \"cancel\" | \"none\";\n /** Consider tx stuck after N blocks */\n stuckBlocks?: number;\n /** Consider tx stuck after N milliseconds */\n stuckMs?: number;\n /** Maximum automatic replacement attempts */\n maxAttempts?: number;\n };\n};\n\nexport const defaultPolicy: TxPolicy = {\n feeSpeed: \"standard\",\n gasLimitMultiplier: DEFAULT_GAS_LIMIT_MULTIPLIER,\n pollingInterval: DEFAULT_POLLING_INTERVAL,\n receiptTimeout: DEFAULT_RECEIPT_TIMEOUT,\n replacementStrategy: \"none\",\n};\n"]}
1
+ {"version":3,"file":"policy.js","sourceRoot":"","sources":["../../src/tx/policy.ts"],"names":[],"mappings":"AACA,OAAO,EACL,4BAA4B,EAC5B,wBAAwB,EACxB,uBAAuB,GACxB,MAAM,0BAA0B,CAAC;AA4BlC,MAAM,CAAC,MAAM,aAAa,GAAa;IACrC,QAAQ,EAAE,UAAU;IACpB,kBAAkB,EAAE,4BAA4B;IAChD,eAAe,EAAE,wBAAwB;IACzC,cAAc,EAAE,uBAAuB;IACvC,mBAAmB,EAAE,MAAM;CAC5B,CAAC","sourcesContent":["/** Transaction execution policy */\nimport {\n DEFAULT_GAS_LIMIT_MULTIPLIER,\n DEFAULT_POLLING_INTERVAL,\n DEFAULT_RECEIPT_TIMEOUT,\n} from \"@/src/constants/index.js\";\nimport type { GasSpeed } from \"@/src/gas/index.js\";\n\nexport type TxPolicy = {\n /** Max fee per gas in wei (optional cap) */\n maxFeePerGas?: bigint;\n /** Max priority fee per gas in wei */\n maxPriorityFeePerGas?: bigint;\n /** Fee estimation speed tier */\n feeSpeed?: GasSpeed;\n /** Gas limit multiplier applied to estimates */\n gasLimitMultiplier?: number;\n /** Timeout in milliseconds for receipt polling */\n receiptTimeout?: number;\n /** Polling interval in milliseconds */\n pollingInterval?: number;\n /** Replacement strategy when stuck */\n replacementStrategy?: \"speedup\" | \"cancel\" | \"none\";\n /** Replacement behavior (preferred) */\n replacement?: {\n strategy?: \"speedup\" | \"cancel\" | \"none\";\n /** Consider tx stuck after N milliseconds */\n stuckMs?: number;\n /** Maximum automatic replacement attempts */\n maxAttempts?: number;\n };\n};\n\nexport const defaultPolicy: TxPolicy = {\n feeSpeed: \"standard\",\n gasLimitMultiplier: DEFAULT_GAS_LIMIT_MULTIPLIER,\n pollingInterval: DEFAULT_POLLING_INTERVAL,\n receiptTimeout: DEFAULT_RECEIPT_TIMEOUT,\n replacementStrategy: \"none\",\n};\n"]}
@@ -1,13 +1,13 @@
1
1
  import { Context, Effect, Layer } from "effect";
2
2
  import type { Hash } from "viem";
3
3
  import type { ClientNotFoundError, WalletNotConnectedError, WrongNetworkError } from "../core/index.js";
4
- import { PublicClientService, TransactionFailedError, WalletClientService } from "../core/index.js";
4
+ import { PublicClientService, TxFailedError, WalletClientService } from "../core/index.js";
5
5
  import type { GasPriceUnavailableError } from "../gas/index.js";
6
6
  import { GasService } from "../gas/index.js";
7
7
  import type { TxPolicy } from "../tx/index.js";
8
8
  export type TxReplacementShape = {
9
- readonly speedup: (chainId: number, hash: Hash, policy?: TxPolicy) => Effect.Effect<Hash, TransactionFailedError | WalletNotConnectedError | WrongNetworkError | ClientNotFoundError | GasPriceUnavailableError>;
10
- readonly cancel: (chainId: number, hash: Hash, policy?: TxPolicy) => Effect.Effect<Hash, TransactionFailedError | WalletNotConnectedError | WrongNetworkError | ClientNotFoundError | GasPriceUnavailableError>;
9
+ readonly speedup: (chainId: number, hash: Hash, policy?: TxPolicy) => Effect.Effect<Hash, TxFailedError | WalletNotConnectedError | WrongNetworkError | ClientNotFoundError | GasPriceUnavailableError>;
10
+ readonly cancel: (chainId: number, hash: Hash, policy?: TxPolicy) => Effect.Effect<Hash, TxFailedError | WalletNotConnectedError | WrongNetworkError | ClientNotFoundError | GasPriceUnavailableError>;
11
11
  };
12
12
  declare const TxReplacement_base: Context.TagClass<TxReplacement, "ew3/TxReplacement", TxReplacementShape>;
13
13
  export declare class TxReplacement extends TxReplacement_base {
@@ -1 +1 @@
1
- {"version":3,"file":"replacement.d.ts","sourceRoot":"","sources":["../../src/tx/replacement.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAC;AAChD,OAAO,KAAK,EAAE,IAAI,EAA6B,MAAM,MAAM,CAAC;AAE5D,OAAO,KAAK,EACV,mBAAmB,EACnB,uBAAuB,EACvB,iBAAiB,EAClB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACL,mBAAmB,EACnB,sBAAsB,EACtB,mBAAmB,EACpB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,oBAAoB,CAAC;AACnE,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAEhD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAElD,MAAM,MAAM,kBAAkB,GAAG;IAC/B,QAAQ,CAAC,OAAO,EAAE,CAChB,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,IAAI,EACV,MAAM,CAAC,EAAE,QAAQ,KACd,MAAM,CAAC,MAAM,CAChB,IAAI,EACF,sBAAsB,GACtB,uBAAuB,GACvB,iBAAiB,GACjB,mBAAmB,GACnB,wBAAwB,CAC3B,CAAC;IAEF,QAAQ,CAAC,MAAM,EAAE,CACf,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,IAAI,EACV,MAAM,CAAC,EAAE,QAAQ,KACd,MAAM,CAAC,MAAM,CAChB,IAAI,EACF,sBAAsB,GACtB,uBAAuB,GACvB,iBAAiB,GACjB,mBAAmB,GACnB,wBAAwB,CAC3B,CAAC;CACH,CAAC;;AAEF,qBAAa,aAAc,SAAQ,kBAGhC;CAAG;AA0HN,eAAO,MAAM,iBAAiB,2FA4D7B,CAAC"}
1
+ {"version":3,"file":"replacement.d.ts","sourceRoot":"","sources":["../../src/tx/replacement.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAC;AAChD,OAAO,KAAK,EAAE,IAAI,EAA6B,MAAM,MAAM,CAAC;AAE5D,OAAO,KAAK,EACV,mBAAmB,EACnB,uBAAuB,EACvB,iBAAiB,EAClB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,mBAAmB,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC9F,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,oBAAoB,CAAC;AACnE,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAEhD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAElD,MAAM,MAAM,kBAAkB,GAAG;IAC/B,QAAQ,CAAC,OAAO,EAAE,CAChB,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,IAAI,EACV,MAAM,CAAC,EAAE,QAAQ,KACd,MAAM,CAAC,MAAM,CAChB,IAAI,EACF,aAAa,GACb,uBAAuB,GACvB,iBAAiB,GACjB,mBAAmB,GACnB,wBAAwB,CAC3B,CAAC;IAEF,QAAQ,CAAC,MAAM,EAAE,CACf,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,IAAI,EACV,MAAM,CAAC,EAAE,QAAQ,KACd,MAAM,CAAC,MAAM,CAChB,IAAI,EACF,aAAa,GACb,uBAAuB,GACvB,iBAAiB,GACjB,mBAAmB,GACnB,wBAAwB,CAC3B,CAAC;CACH,CAAC;;AAEF,qBAAa,aAAc,SAAQ,kBAGhC;CAAG;AA0HN,eAAO,MAAM,iBAAiB,2FA4D7B,CAAC"}
@@ -1,6 +1,6 @@
1
1
  import { Context, Effect, Layer } from "effect";
2
2
  import { MIN_TX_GAS } from "../constants/index.js";
3
- import { PublicClientService, TransactionFailedError, WalletClientService, } from "../core/index.js";
3
+ import { PublicClientService, TxFailedError, WalletClientService } from "../core/index.js";
4
4
  import { GasService } from "../gas/index.js";
5
5
  import { bumpByPercent } from "../internal/index.js";
6
6
  export class TxReplacement extends Context.Tag("ew3/TxReplacement")() {
@@ -32,7 +32,7 @@ const sendReplacement = (params) => Effect.gen(function* () {
32
32
  const walletClientService = yield* WalletClientService;
33
33
  const walletClient = yield* walletClientService.get(params.chainId);
34
34
  return yield* Effect.tryPromise({
35
- catch: (cause) => new TransactionFailedError({
35
+ catch: (cause) => new TxFailedError({
36
36
  cause,
37
37
  hash: params.hash,
38
38
  message: `Failed to ${params.action} transaction ${params.hash}`,
@@ -71,7 +71,7 @@ export const TxReplacementLive = Layer.effect(TxReplacement, Effect.gen(function
71
71
  const getTx = (chainId, hash) => Effect.gen(function* () {
72
72
  const client = yield* publicClientService.get(chainId);
73
73
  const tx = yield* Effect.tryPromise({
74
- catch: (cause) => new TransactionFailedError({
74
+ catch: (cause) => new TxFailedError({
75
75
  cause,
76
76
  hash,
77
77
  message: `Failed to get transaction ${hash}`,
@@ -1 +1 @@
1
- {"version":3,"file":"replacement.js","sourceRoot":"","sources":["../../src/tx/replacement.ts"],"names":[],"mappings":"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","sourcesContent":["import { Context, Effect, Layer } from \"effect\";\nimport type { Hash, PublicClient, Transaction } from \"viem\";\nimport { MIN_TX_GAS } from \"@/src/constants/index.js\";\nimport type {\n ClientNotFoundError,\n WalletNotConnectedError,\n WrongNetworkError,\n} from \"@/src/core/index.js\";\nimport {\n PublicClientService,\n TransactionFailedError,\n WalletClientService,\n} from \"@/src/core/index.js\";\nimport type { GasPriceUnavailableError } from \"@/src/gas/index.js\";\nimport { GasService } from \"@/src/gas/index.js\";\nimport { bumpByPercent } from \"@/src/internal/index.js\";\nimport type { TxPolicy } from \"@/src/tx/index.js\";\n\nexport type TxReplacementShape = {\n readonly speedup: (\n chainId: number,\n hash: Hash,\n policy?: TxPolicy\n ) => Effect.Effect<\n Hash,\n | TransactionFailedError\n | WalletNotConnectedError\n | WrongNetworkError\n | ClientNotFoundError\n | GasPriceUnavailableError\n >;\n\n readonly cancel: (\n chainId: number,\n hash: Hash,\n policy?: TxPolicy\n ) => Effect.Effect<\n Hash,\n | TransactionFailedError\n | WalletNotConnectedError\n | WrongNetworkError\n | ClientNotFoundError\n | GasPriceUnavailableError\n >;\n};\n\nexport class TxReplacement extends Context.Tag(\"ew3/TxReplacement\")<\n TxReplacement,\n TxReplacementShape\n>() {}\n\nconst cap = (value: bigint, max: bigint | undefined): bigint =>\n max !== undefined && value > max ? max : value;\n\ntype FeeBump =\n | { type: \"legacy\"; gasPrice: bigint }\n | {\n type: \"eip1559\";\n maxFeePerGas: bigint;\n maxPriorityFeePerGas?: bigint | undefined;\n };\n\nconst computeFeeBump = (params: {\n tx: Transaction;\n estimate: {\n gasPrice?: bigint | undefined;\n maxFeePerGas: bigint;\n maxPriorityFeePerGas: bigint;\n };\n policy?: TxPolicy | undefined;\n}): FeeBump => {\n const tx = params.tx;\n const estimate = params.estimate;\n const policy = params.policy;\n\n const looksEip1559 =\n tx.type === \"eip1559\" || tx.maxFeePerGas !== undefined || tx.maxPriorityFeePerGas !== undefined;\n\n if (!looksEip1559) {\n const oldGasPrice = tx.gasPrice ?? estimate.gasPrice ?? estimate.maxFeePerGas;\n const candidateGasPrice = bumpByPercent(oldGasPrice, 1250n);\n const estimatedGasPrice = estimate.gasPrice ?? estimate.maxFeePerGas;\n const gasPrice = cap(\n candidateGasPrice > estimatedGasPrice ? candidateGasPrice : estimatedGasPrice,\n policy?.maxFeePerGas\n );\n\n return { gasPrice, type: \"legacy\" };\n }\n\n const oldMaxFee = tx.maxFeePerGas ?? estimate.maxFeePerGas;\n const oldPriority = tx.maxPriorityFeePerGas ?? estimate.maxPriorityFeePerGas;\n\n const candidateMaxFee = bumpByPercent(oldMaxFee, 1250n);\n const candidatePriority = bumpByPercent(oldPriority, 1250n);\n\n const maxFeePerGas = cap(\n candidateMaxFee > estimate.maxFeePerGas ? candidateMaxFee : estimate.maxFeePerGas,\n policy?.maxFeePerGas\n );\n const maxPriorityFeePerGas = cap(\n candidatePriority > estimate.maxPriorityFeePerGas\n ? candidatePriority\n : estimate.maxPriorityFeePerGas,\n policy?.maxPriorityFeePerGas\n );\n\n return { maxFeePerGas, maxPriorityFeePerGas, type: \"eip1559\" };\n};\n\nconst sendReplacement = (params: {\n action: \"cancel\" | \"speedup\";\n chainId: number;\n hash: Hash;\n tx: Transaction;\n bump: FeeBump;\n}): Effect.Effect<\n Hash,\n TransactionFailedError | WalletNotConnectedError | WrongNetworkError | ClientNotFoundError,\n WalletClientService\n> =>\n Effect.gen(function* () {\n const walletClientService = yield* WalletClientService;\n const walletClient = yield* walletClientService.get(params.chainId);\n\n return yield* Effect.tryPromise({\n catch: (cause) =>\n new TransactionFailedError({\n cause,\n hash: params.hash,\n message: `Failed to ${params.action} transaction ${params.hash}`,\n }),\n try: () => {\n const base = {\n account: params.tx.from,\n chain: null,\n data: params.action === \"cancel\" ? \"0x\" : (params.tx.input ?? \"0x\"),\n gas: params.action === \"cancel\" ? MIN_TX_GAS : (params.tx.gas ?? undefined),\n nonce: params.tx.nonce,\n to: params.action === \"cancel\" ? params.tx.from : (params.tx.to ?? undefined),\n value: params.action === \"cancel\" ? 0n : params.tx.value,\n };\n\n if (params.bump.type === \"legacy\") {\n return walletClient.sendTransaction({\n ...base,\n gasPrice: params.bump.gasPrice,\n type: \"legacy\",\n });\n }\n\n return walletClient.sendTransaction({\n ...base,\n maxFeePerGas: params.bump.maxFeePerGas,\n maxPriorityFeePerGas: params.bump.maxPriorityFeePerGas,\n type: \"eip1559\",\n });\n },\n });\n });\n\nconst computeBump = (\n tx: Transaction,\n estimate: {\n gasPrice?: bigint | undefined;\n maxFeePerGas: bigint;\n maxPriorityFeePerGas: bigint;\n },\n policy?: TxPolicy\n): FeeBump => computeFeeBump({ estimate, policy, tx });\n\nexport const TxReplacementLive = Layer.effect(\n TxReplacement,\n Effect.gen(function* () {\n const publicClientService = yield* PublicClientService;\n const walletClientService = yield* WalletClientService;\n const gasService = yield* GasService;\n\n const getTx = (chainId: number, hash: Hash) =>\n Effect.gen(function* () {\n const client = yield* publicClientService.get(chainId);\n const tx = yield* Effect.tryPromise({\n catch: (cause) =>\n new TransactionFailedError({\n cause,\n hash,\n message: `Failed to get transaction ${hash}`,\n }),\n try: () => (client as PublicClient).getTransaction({ hash }),\n });\n return tx as Transaction;\n });\n\n return TxReplacement.of({\n cancel: (chainId, hash, policy) =>\n Effect.gen(function* () {\n const tx = yield* getTx(chainId, hash);\n const estimate = yield* gasService.estimateFees({\n chainId,\n speed: policy?.feeSpeed,\n });\n\n const bump = computeBump(tx, estimate, policy);\n return yield* sendReplacement({\n action: \"cancel\",\n bump,\n chainId,\n hash,\n tx,\n }).pipe(Effect.provideService(WalletClientService, walletClientService));\n }),\n\n speedup: (chainId, hash, policy) =>\n Effect.gen(function* () {\n const tx = yield* getTx(chainId, hash);\n const estimate = yield* gasService.estimateFees({\n chainId,\n speed: policy?.feeSpeed,\n });\n\n const bump = computeBump(tx, estimate, policy);\n return yield* sendReplacement({\n action: \"speedup\",\n bump,\n chainId,\n hash,\n tx,\n }).pipe(Effect.provideService(WalletClientService, walletClientService));\n }),\n });\n })\n);\n"]}
1
+ {"version":3,"file":"replacement.js","sourceRoot":"","sources":["../../src/tx/replacement.ts"],"names":[],"mappings":"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","sourcesContent":["import { Context, Effect, Layer } from \"effect\";\nimport type { Hash, PublicClient, Transaction } from \"viem\";\nimport { MIN_TX_GAS } from \"@/src/constants/index.js\";\nimport type {\n ClientNotFoundError,\n WalletNotConnectedError,\n WrongNetworkError,\n} from \"@/src/core/index.js\";\nimport { PublicClientService, TxFailedError, WalletClientService } from \"@/src/core/index.js\";\nimport type { GasPriceUnavailableError } from \"@/src/gas/index.js\";\nimport { GasService } from \"@/src/gas/index.js\";\nimport { bumpByPercent } from \"@/src/internal/index.js\";\nimport type { TxPolicy } from \"@/src/tx/index.js\";\n\nexport type TxReplacementShape = {\n readonly speedup: (\n chainId: number,\n hash: Hash,\n policy?: TxPolicy\n ) => Effect.Effect<\n Hash,\n | TxFailedError\n | WalletNotConnectedError\n | WrongNetworkError\n | ClientNotFoundError\n | GasPriceUnavailableError\n >;\n\n readonly cancel: (\n chainId: number,\n hash: Hash,\n policy?: TxPolicy\n ) => Effect.Effect<\n Hash,\n | TxFailedError\n | WalletNotConnectedError\n | WrongNetworkError\n | ClientNotFoundError\n | GasPriceUnavailableError\n >;\n};\n\nexport class TxReplacement extends Context.Tag(\"ew3/TxReplacement\")<\n TxReplacement,\n TxReplacementShape\n>() {}\n\nconst cap = (value: bigint, max: bigint | undefined): bigint =>\n max !== undefined && value > max ? max : value;\n\ntype FeeBump =\n | { type: \"legacy\"; gasPrice: bigint }\n | {\n type: \"eip1559\";\n maxFeePerGas: bigint;\n maxPriorityFeePerGas?: bigint | undefined;\n };\n\nconst computeFeeBump = (params: {\n tx: Transaction;\n estimate: {\n gasPrice?: bigint | undefined;\n maxFeePerGas: bigint;\n maxPriorityFeePerGas: bigint;\n };\n policy?: TxPolicy | undefined;\n}): FeeBump => {\n const tx = params.tx;\n const estimate = params.estimate;\n const policy = params.policy;\n\n const looksEip1559 =\n tx.type === \"eip1559\" || tx.maxFeePerGas !== undefined || tx.maxPriorityFeePerGas !== undefined;\n\n if (!looksEip1559) {\n const oldGasPrice = tx.gasPrice ?? estimate.gasPrice ?? estimate.maxFeePerGas;\n const candidateGasPrice = bumpByPercent(oldGasPrice, 1250n);\n const estimatedGasPrice = estimate.gasPrice ?? estimate.maxFeePerGas;\n const gasPrice = cap(\n candidateGasPrice > estimatedGasPrice ? candidateGasPrice : estimatedGasPrice,\n policy?.maxFeePerGas\n );\n\n return { gasPrice, type: \"legacy\" };\n }\n\n const oldMaxFee = tx.maxFeePerGas ?? estimate.maxFeePerGas;\n const oldPriority = tx.maxPriorityFeePerGas ?? estimate.maxPriorityFeePerGas;\n\n const candidateMaxFee = bumpByPercent(oldMaxFee, 1250n);\n const candidatePriority = bumpByPercent(oldPriority, 1250n);\n\n const maxFeePerGas = cap(\n candidateMaxFee > estimate.maxFeePerGas ? candidateMaxFee : estimate.maxFeePerGas,\n policy?.maxFeePerGas\n );\n const maxPriorityFeePerGas = cap(\n candidatePriority > estimate.maxPriorityFeePerGas\n ? candidatePriority\n : estimate.maxPriorityFeePerGas,\n policy?.maxPriorityFeePerGas\n );\n\n return { maxFeePerGas, maxPriorityFeePerGas, type: \"eip1559\" };\n};\n\nconst sendReplacement = (params: {\n action: \"cancel\" | \"speedup\";\n chainId: number;\n hash: Hash;\n tx: Transaction;\n bump: FeeBump;\n}): Effect.Effect<\n Hash,\n TxFailedError | WalletNotConnectedError | WrongNetworkError | ClientNotFoundError,\n WalletClientService\n> =>\n Effect.gen(function* () {\n const walletClientService = yield* WalletClientService;\n const walletClient = yield* walletClientService.get(params.chainId);\n\n return yield* Effect.tryPromise({\n catch: (cause) =>\n new TxFailedError({\n cause,\n hash: params.hash,\n message: `Failed to ${params.action} transaction ${params.hash}`,\n }),\n try: () => {\n const base = {\n account: params.tx.from,\n chain: null,\n data: params.action === \"cancel\" ? \"0x\" : (params.tx.input ?? \"0x\"),\n gas: params.action === \"cancel\" ? MIN_TX_GAS : (params.tx.gas ?? undefined),\n nonce: params.tx.nonce,\n to: params.action === \"cancel\" ? params.tx.from : (params.tx.to ?? undefined),\n value: params.action === \"cancel\" ? 0n : params.tx.value,\n };\n\n if (params.bump.type === \"legacy\") {\n return walletClient.sendTransaction({\n ...base,\n gasPrice: params.bump.gasPrice,\n type: \"legacy\",\n });\n }\n\n return walletClient.sendTransaction({\n ...base,\n maxFeePerGas: params.bump.maxFeePerGas,\n maxPriorityFeePerGas: params.bump.maxPriorityFeePerGas,\n type: \"eip1559\",\n });\n },\n });\n });\n\nconst computeBump = (\n tx: Transaction,\n estimate: {\n gasPrice?: bigint | undefined;\n maxFeePerGas: bigint;\n maxPriorityFeePerGas: bigint;\n },\n policy?: TxPolicy\n): FeeBump => computeFeeBump({ estimate, policy, tx });\n\nexport const TxReplacementLive = Layer.effect(\n TxReplacement,\n Effect.gen(function* () {\n const publicClientService = yield* PublicClientService;\n const walletClientService = yield* WalletClientService;\n const gasService = yield* GasService;\n\n const getTx = (chainId: number, hash: Hash) =>\n Effect.gen(function* () {\n const client = yield* publicClientService.get(chainId);\n const tx = yield* Effect.tryPromise({\n catch: (cause) =>\n new TxFailedError({\n cause,\n hash,\n message: `Failed to get transaction ${hash}`,\n }),\n try: () => (client as PublicClient).getTransaction({ hash }),\n });\n return tx as Transaction;\n });\n\n return TxReplacement.of({\n cancel: (chainId, hash, policy) =>\n Effect.gen(function* () {\n const tx = yield* getTx(chainId, hash);\n const estimate = yield* gasService.estimateFees({\n chainId,\n speed: policy?.feeSpeed,\n });\n\n const bump = computeBump(tx, estimate, policy);\n return yield* sendReplacement({\n action: \"cancel\",\n bump,\n chainId,\n hash,\n tx,\n }).pipe(Effect.provideService(WalletClientService, walletClientService));\n }),\n\n speedup: (chainId, hash, policy) =>\n Effect.gen(function* () {\n const tx = yield* getTx(chainId, hash);\n const estimate = yield* gasService.estimateFees({\n chainId,\n speed: policy?.feeSpeed,\n });\n\n const bump = computeBump(tx, estimate, policy);\n return yield* sendReplacement({\n action: \"speedup\",\n bump,\n chainId,\n hash,\n tx,\n }).pipe(Effect.provideService(WalletClientService, walletClientService));\n }),\n });\n })\n);\n"]}
@@ -1,7 +1,7 @@
1
1
  import { Effect, SubscriptionRef } from "effect";
2
2
  import type { AccessList, Hash, TransactionReceipt, TransactionType } from "viem";
3
- import type { ClientNotFoundError, TransactionReplacementReason, WalletNotConnectedError, WrongNetworkError } from "../core/index.js";
4
- import { PublicClientService, TransactionFailedError, WalletClientService } from "../core/index.js";
3
+ import type { ClientNotFoundError, TxReplacementReason, WalletNotConnectedError, WrongNetworkError } from "../core/index.js";
4
+ import { PublicClientService, TxFailedError, WalletClientService } from "../core/index.js";
5
5
  export type TxRequestMeta = {
6
6
  readonly accessList?: AccessList | undefined;
7
7
  readonly gas?: bigint | undefined;
@@ -52,12 +52,12 @@ export type TxState = ({
52
52
  status: "replaced";
53
53
  oldHash: Hash;
54
54
  newHash: Hash;
55
- reason: TransactionReplacementReason;
55
+ reason: TxReplacementReason;
56
56
  }) | ({
57
57
  readonly tx?: TxRequestMeta | undefined;
58
58
  } & {
59
59
  status: "failed";
60
- error: TransactionFailedError;
60
+ error: TxFailedError;
61
61
  });
62
62
  export declare const initialTxState: TxState;
63
63
  export declare const makeTxTracker: Effect.Effect<{
@@ -67,6 +67,6 @@ export declare const makeTxTracker: Effect.Effect<{
67
67
  set: (state: TxState) => Effect.Effect<void, never, never>;
68
68
  update: (f: (s: TxState) => TxState) => Effect.Effect<void, never, never>;
69
69
  }, never, never>;
70
- export declare const speedupTransaction: (chainId: number, hash: Hash, newMaxFeePerGas: bigint, newMaxPriorityFeePerGas?: bigint) => Effect.Effect<Hash, TransactionFailedError | WalletNotConnectedError | WrongNetworkError | ClientNotFoundError, PublicClientService | WalletClientService>;
71
- export declare const cancelTransaction: (chainId: number, hash: Hash, newMaxFeePerGas: bigint, newMaxPriorityFeePerGas?: bigint) => Effect.Effect<Hash, TransactionFailedError | WalletNotConnectedError | WrongNetworkError | ClientNotFoundError, PublicClientService | WalletClientService>;
70
+ export declare const speedupTx: (chainId: number, hash: Hash, newMaxFeePerGas: bigint, newMaxPriorityFeePerGas?: bigint) => Effect.Effect<Hash, TxFailedError | WalletNotConnectedError | WrongNetworkError | ClientNotFoundError, PublicClientService | WalletClientService>;
71
+ export declare const cancelTx: (chainId: number, hash: Hash, newMaxFeePerGas: bigint, newMaxPriorityFeePerGas?: bigint) => Effect.Effect<Hash, TxFailedError | WalletNotConnectedError | WrongNetworkError | ClientNotFoundError, PublicClientService | WalletClientService>;
72
72
  //# sourceMappingURL=tracker.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"tracker.d.ts","sourceRoot":"","sources":["../../src/tx/tracker.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"tracker.d.ts","sourceRoot":"","sources":["../../src/tx/tracker.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  import { Effect, SubscriptionRef } from "effect";
2
2
  import { MIN_TX_GAS } from "../constants/index.js";
3
- import { PublicClientService, TransactionFailedError, WalletClientService, } from "../core/index.js";
3
+ import { PublicClientService, TxFailedError, WalletClientService } from "../core/index.js";
4
4
  export const initialTxState = { status: "idle" };
5
5
  export const makeTxTracker = Effect.gen(function* () {
6
6
  const ref = yield* SubscriptionRef.make(initialTxState);
@@ -12,13 +12,13 @@ export const makeTxTracker = Effect.gen(function* () {
12
12
  update: (f) => SubscriptionRef.update(ref, f),
13
13
  };
14
14
  });
15
- export const speedupTransaction = (chainId, hash, newMaxFeePerGas, newMaxPriorityFeePerGas) => Effect.gen(function* () {
15
+ export const speedupTx = (chainId, hash, newMaxFeePerGas, newMaxPriorityFeePerGas) => Effect.gen(function* () {
16
16
  const walletClientService = yield* WalletClientService;
17
17
  const walletClient = yield* walletClientService.get(chainId);
18
18
  const publicClientService = yield* PublicClientService;
19
19
  const publicClient = yield* publicClientService.get(chainId);
20
20
  const tx = yield* Effect.tryPromise({
21
- catch: (cause) => new TransactionFailedError({
21
+ catch: (cause) => new TxFailedError({
22
22
  cause,
23
23
  hash,
24
24
  message: `Failed to get transaction ${hash}`,
@@ -26,14 +26,14 @@ export const speedupTransaction = (chainId, hash, newMaxFeePerGas, newMaxPriorit
26
26
  try: () => publicClient.getTransaction({ hash }),
27
27
  });
28
28
  if (!tx) {
29
- yield* Effect.fail(new TransactionFailedError({
29
+ yield* Effect.fail(new TxFailedError({
30
30
  hash,
31
31
  message: `Transaction ${hash} not found`,
32
32
  }));
33
33
  }
34
34
  const transaction = tx;
35
35
  const newHash = yield* Effect.tryPromise({
36
- catch: (cause) => new TransactionFailedError({
36
+ catch: (cause) => new TxFailedError({
37
37
  cause,
38
38
  hash,
39
39
  message: `Failed to speed up transaction ${hash}`,
@@ -52,13 +52,13 @@ export const speedupTransaction = (chainId, hash, newMaxFeePerGas, newMaxPriorit
52
52
  });
53
53
  return newHash;
54
54
  });
55
- export const cancelTransaction = (chainId, hash, newMaxFeePerGas, newMaxPriorityFeePerGas) => Effect.gen(function* () {
55
+ export const cancelTx = (chainId, hash, newMaxFeePerGas, newMaxPriorityFeePerGas) => Effect.gen(function* () {
56
56
  const walletClientService = yield* WalletClientService;
57
57
  const walletClient = yield* walletClientService.get(chainId);
58
58
  const publicClientService = yield* PublicClientService;
59
59
  const publicClient = yield* publicClientService.get(chainId);
60
60
  const tx = yield* Effect.tryPromise({
61
- catch: (cause) => new TransactionFailedError({
61
+ catch: (cause) => new TxFailedError({
62
62
  cause,
63
63
  hash,
64
64
  message: `Failed to get transaction ${hash}`,
@@ -66,14 +66,14 @@ export const cancelTransaction = (chainId, hash, newMaxFeePerGas, newMaxPriority
66
66
  try: () => publicClient.getTransaction({ hash }),
67
67
  });
68
68
  if (!tx) {
69
- yield* Effect.fail(new TransactionFailedError({
69
+ yield* Effect.fail(new TxFailedError({
70
70
  hash,
71
71
  message: `Transaction ${hash} not found`,
72
72
  }));
73
73
  }
74
74
  const transaction = tx;
75
75
  const newHash = yield* Effect.tryPromise({
76
- catch: (cause) => new TransactionFailedError({
76
+ catch: (cause) => new TxFailedError({
77
77
  cause,
78
78
  hash,
79
79
  message: `Failed to cancel transaction ${hash}`,