@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":"service.js","sourceRoot":"","sources":["../../src/transfer/service.ts"],"names":[],"mappings":"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","sourcesContent":["import { Context, Effect, Layer } from \"effect\";\nimport type { Address, Hash, TransactionReceipt, WalletClient } from \"viem\";\nimport { MIN_TX_GAS } from \"@/src/constants/index.js\";\nimport type { ClientNotFoundError, WrongNetworkError } from \"@/src/core/index.js\";\nimport {\n InsufficientFundsError,\n isInsufficientFunds,\n isUserRejection,\n PublicClientService,\n ReceiptTimeoutError,\n TransactionFailedError,\n UserRejectedError,\n WalletClientService,\n WalletNotConnectedError,\n} from \"@/src/core/index.js\";\n\nexport type TransferOverrides = {\n readonly gas?: bigint;\n readonly gasPrice?: bigint;\n readonly maxFeePerGas?: bigint;\n readonly maxPriorityFeePerGas?: bigint;\n readonly nonce?: number;\n};\n\nexport type TransferServiceShape = {\n readonly send: (params: {\n chainId: number;\n to: Address;\n value: bigint;\n overrides?: TransferOverrides;\n }) => Effect.Effect<\n Hash,\n | InsufficientFundsError\n | UserRejectedError\n | WalletNotConnectedError\n | WrongNetworkError\n | ClientNotFoundError\n | TransactionFailedError\n >;\n\n readonly sendAndWait: (params: {\n chainId: number;\n to: Address;\n value: bigint;\n confirmations?: number;\n overrides?: TransferOverrides;\n }) => Effect.Effect<\n TransactionReceipt,\n | InsufficientFundsError\n | UserRejectedError\n | WalletNotConnectedError\n | WrongNetworkError\n | ClientNotFoundError\n | TransactionFailedError\n | ReceiptTimeoutError\n >;\n\n readonly estimateGas: (params: {\n chainId: number;\n to: Address;\n value: bigint;\n }) => Effect.Effect<bigint, ClientNotFoundError>;\n};\n\nexport class TransferService extends Context.Tag(\"ew3/TransferService\")<\n TransferService,\n TransferServiceShape\n>() {}\n\n/**\n * Classify transfer errors into appropriate error types\n */\nconst classifyTransferError = (\n error: unknown,\n to: Address\n): InsufficientFundsError | UserRejectedError | TransactionFailedError => {\n if (isUserRejection(error)) {\n return new UserRejectedError({\n message: error instanceof Error ? error.message : \"User rejected the transaction\",\n });\n }\n\n if (isInsufficientFunds(error)) {\n return new InsufficientFundsError({\n available: \"0\",\n message: error instanceof Error ? error.message : \"Insufficient funds for transfer\",\n required: \"0\",\n });\n }\n\n return new TransactionFailedError({\n cause: error,\n hash: \"0x\",\n message: error instanceof Error ? error.message : `Failed to send transfer to ${to}`,\n });\n};\n\nexport const TransferServiceLive = Layer.effect(\n TransferService,\n Effect.gen(function* () {\n const walletClientService = yield* WalletClientService;\n const publicClientService = yield* PublicClientService;\n\n return TransferService.of({\n estimateGas: Effect.fn(\"TransferService.estimateGas\")(function* (params) {\n const publicClient = yield* publicClientService.get(params.chainId);\n\n // Try to estimate, fallback to standard transfer gas on failure\n return yield* Effect.tryPromise({\n catch: () => MIN_TX_GAS,\n try: () =>\n publicClient.estimateGas({\n to: params.to,\n value: params.value,\n }),\n }).pipe(Effect.catchAll(() => Effect.succeed(MIN_TX_GAS)));\n }),\n\n send: Effect.fn(\"TransferService.send\")(function* (params) {\n const walletClient = yield* walletClientService.get(params.chainId);\n const [account] = yield* Effect.tryPromise({\n catch: () =>\n new WalletNotConnectedError({\n chainId: params.chainId,\n message: \"No account found\",\n }),\n try: () => walletClient.getAddresses(),\n });\n\n if (!account) {\n return yield* Effect.fail(\n new WalletNotConnectedError({\n chainId: params.chainId,\n message: \"No account connected\",\n })\n );\n }\n\n // Determine if we should use legacy or EIP-1559 transaction type\n const useLegacy = params.overrides?.gasPrice !== undefined;\n\n return yield* Effect.tryPromise({\n catch: (error) => classifyTransferError(error, params.to),\n try: () =>\n useLegacy\n ? (walletClient as WalletClient).sendTransaction({\n account,\n chain: null,\n gas: params.overrides?.gas,\n gasPrice: params.overrides?.gasPrice,\n nonce: params.overrides?.nonce,\n to: params.to,\n type: \"legacy\",\n value: params.value,\n })\n : (walletClient as WalletClient).sendTransaction({\n account,\n chain: null,\n gas: params.overrides?.gas,\n maxFeePerGas: params.overrides?.maxFeePerGas,\n maxPriorityFeePerGas: params.overrides?.maxPriorityFeePerGas,\n nonce: params.overrides?.nonce,\n to: params.to,\n type: \"eip1559\",\n value: params.value,\n }),\n });\n }),\n\n sendAndWait: Effect.fn(\"TransferService.sendAndWait\")(function* (params) {\n const walletClient = yield* walletClientService.get(params.chainId);\n const publicClient = yield* publicClientService.get(params.chainId);\n const [account] = yield* Effect.tryPromise({\n catch: () =>\n new WalletNotConnectedError({\n chainId: params.chainId,\n message: \"No account found\",\n }),\n try: () => walletClient.getAddresses(),\n });\n\n if (!account) {\n return yield* Effect.fail(\n new WalletNotConnectedError({\n chainId: params.chainId,\n message: \"No account connected\",\n })\n );\n }\n\n // Determine if we should use legacy or EIP-1559 transaction type\n const useLegacy = params.overrides?.gasPrice !== undefined;\n\n const hash = yield* Effect.tryPromise({\n catch: (error) => classifyTransferError(error, params.to),\n try: () =>\n useLegacy\n ? (walletClient as WalletClient).sendTransaction({\n account,\n chain: null,\n gas: params.overrides?.gas,\n gasPrice: params.overrides?.gasPrice,\n nonce: params.overrides?.nonce,\n to: params.to,\n type: \"legacy\",\n value: params.value,\n })\n : (walletClient as WalletClient).sendTransaction({\n account,\n chain: null,\n gas: params.overrides?.gas,\n maxFeePerGas: params.overrides?.maxFeePerGas,\n maxPriorityFeePerGas: params.overrides?.maxPriorityFeePerGas,\n nonce: params.overrides?.nonce,\n to: params.to,\n type: \"eip1559\",\n value: params.value,\n }),\n });\n\n return yield* Effect.tryPromise({\n catch: (error) => {\n if (error instanceof Error && error.message.includes(\"timeout\")) {\n return new ReceiptTimeoutError({\n hash,\n message: `Transaction receipt timeout for ${hash}`,\n timeout: 30_000,\n });\n }\n return new TransactionFailedError({\n cause: error,\n hash,\n message: `Failed to wait for transaction ${hash}`,\n });\n },\n try: () =>\n publicClient.waitForTransactionReceipt({\n confirmations: params.confirmations,\n hash,\n }),\n });\n }),\n });\n })\n);\n"]}
1
+ {"version":3,"file":"service.js","sourceRoot":"","sources":["../../src/transfer/service.ts"],"names":[],"mappings":"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","sourcesContent":["import { Context, Effect, Layer } from \"effect\";\nimport type { Address, Hash, TransactionReceipt, WalletClient } from \"viem\";\nimport { MIN_TX_GAS } from \"@/src/constants/index.js\";\nimport type { ClientNotFoundError, WrongNetworkError } from \"@/src/core/index.js\";\nimport {\n InsufficientFundsError,\n isInsufficientFunds,\n isUserRejection,\n PublicClientService,\n ReceiptTimeoutError,\n TxFailedError,\n UserRejectedError,\n WalletClientService,\n WalletNotConnectedError,\n} from \"@/src/core/index.js\";\n\nexport type TransferOverrides = {\n readonly gas?: bigint;\n readonly gasPrice?: bigint;\n readonly maxFeePerGas?: bigint;\n readonly maxPriorityFeePerGas?: bigint;\n readonly nonce?: number;\n};\n\nexport type TransferServiceShape = {\n readonly send: (params: {\n chainId: number;\n to: Address;\n value: bigint;\n overrides?: TransferOverrides;\n }) => Effect.Effect<\n Hash,\n | InsufficientFundsError\n | UserRejectedError\n | WalletNotConnectedError\n | WrongNetworkError\n | ClientNotFoundError\n | TxFailedError\n >;\n\n readonly sendAndWait: (params: {\n chainId: number;\n to: Address;\n value: bigint;\n confirmations?: number;\n overrides?: TransferOverrides;\n }) => Effect.Effect<\n TransactionReceipt,\n | InsufficientFundsError\n | UserRejectedError\n | WalletNotConnectedError\n | WrongNetworkError\n | ClientNotFoundError\n | TxFailedError\n | ReceiptTimeoutError\n >;\n\n readonly estimateGas: (params: {\n chainId: number;\n to: Address;\n value: bigint;\n }) => Effect.Effect<bigint, ClientNotFoundError>;\n};\n\nexport class TransferService extends Context.Tag(\"ew3/TransferService\")<\n TransferService,\n TransferServiceShape\n>() {}\n\n/**\n * Classify transfer errors into appropriate error types\n */\nconst classifyTransferError = (\n error: unknown,\n to: Address\n): InsufficientFundsError | UserRejectedError | TxFailedError => {\n if (isUserRejection(error)) {\n return new UserRejectedError({\n message: error instanceof Error ? error.message : \"User rejected the transaction\",\n });\n }\n\n if (isInsufficientFunds(error)) {\n return new InsufficientFundsError({\n available: \"0\",\n message: error instanceof Error ? error.message : \"Insufficient funds for transfer\",\n required: \"0\",\n });\n }\n\n return new TxFailedError({\n cause: error,\n hash: \"0x\",\n message: error instanceof Error ? error.message : `Failed to send transfer to ${to}`,\n });\n};\n\nexport const TransferServiceLive = Layer.effect(\n TransferService,\n Effect.gen(function* () {\n const walletClientService = yield* WalletClientService;\n const publicClientService = yield* PublicClientService;\n\n return TransferService.of({\n estimateGas: Effect.fn(\"TransferService.estimateGas\")(function* (params) {\n const publicClient = yield* publicClientService.get(params.chainId);\n\n // Try to estimate, fallback to standard transfer gas on failure\n return yield* Effect.tryPromise({\n catch: () => MIN_TX_GAS,\n try: () =>\n publicClient.estimateGas({\n to: params.to,\n value: params.value,\n }),\n }).pipe(Effect.catchAll(() => Effect.succeed(MIN_TX_GAS)));\n }),\n\n send: Effect.fn(\"TransferService.send\")(function* (params) {\n const walletClient = yield* walletClientService.get(params.chainId);\n const [account] = yield* Effect.tryPromise({\n catch: () =>\n new WalletNotConnectedError({\n chainId: params.chainId,\n message: \"No account found\",\n }),\n try: () => walletClient.getAddresses(),\n });\n\n if (!account) {\n return yield* Effect.fail(\n new WalletNotConnectedError({\n chainId: params.chainId,\n message: \"No account connected\",\n })\n );\n }\n\n // Determine if we should use legacy or EIP-1559 transaction type\n const useLegacy = params.overrides?.gasPrice !== undefined;\n\n return yield* Effect.tryPromise({\n catch: (error) => classifyTransferError(error, params.to),\n try: () =>\n useLegacy\n ? (walletClient as WalletClient).sendTransaction({\n account,\n chain: null,\n gas: params.overrides?.gas,\n gasPrice: params.overrides?.gasPrice,\n nonce: params.overrides?.nonce,\n to: params.to,\n type: \"legacy\",\n value: params.value,\n })\n : (walletClient as WalletClient).sendTransaction({\n account,\n chain: null,\n gas: params.overrides?.gas,\n maxFeePerGas: params.overrides?.maxFeePerGas,\n maxPriorityFeePerGas: params.overrides?.maxPriorityFeePerGas,\n nonce: params.overrides?.nonce,\n to: params.to,\n type: \"eip1559\",\n value: params.value,\n }),\n });\n }),\n\n sendAndWait: Effect.fn(\"TransferService.sendAndWait\")(function* (params) {\n const walletClient = yield* walletClientService.get(params.chainId);\n const publicClient = yield* publicClientService.get(params.chainId);\n const [account] = yield* Effect.tryPromise({\n catch: () =>\n new WalletNotConnectedError({\n chainId: params.chainId,\n message: \"No account found\",\n }),\n try: () => walletClient.getAddresses(),\n });\n\n if (!account) {\n return yield* Effect.fail(\n new WalletNotConnectedError({\n chainId: params.chainId,\n message: \"No account connected\",\n })\n );\n }\n\n // Determine if we should use legacy or EIP-1559 transaction type\n const useLegacy = params.overrides?.gasPrice !== undefined;\n\n const hash = yield* Effect.tryPromise({\n catch: (error) => classifyTransferError(error, params.to),\n try: () =>\n useLegacy\n ? (walletClient as WalletClient).sendTransaction({\n account,\n chain: null,\n gas: params.overrides?.gas,\n gasPrice: params.overrides?.gasPrice,\n nonce: params.overrides?.nonce,\n to: params.to,\n type: \"legacy\",\n value: params.value,\n })\n : (walletClient as WalletClient).sendTransaction({\n account,\n chain: null,\n gas: params.overrides?.gas,\n maxFeePerGas: params.overrides?.maxFeePerGas,\n maxPriorityFeePerGas: params.overrides?.maxPriorityFeePerGas,\n nonce: params.overrides?.nonce,\n to: params.to,\n type: \"eip1559\",\n value: params.value,\n }),\n });\n\n return yield* Effect.tryPromise({\n catch: (error) => {\n if (error instanceof Error && error.message.includes(\"timeout\")) {\n return new ReceiptTimeoutError({\n hash,\n message: `Transaction receipt timeout for ${hash}`,\n timeout: 30_000,\n });\n }\n return new TxFailedError({\n cause: error,\n hash,\n message: `Failed to wait for transaction ${hash}`,\n });\n },\n try: () =>\n publicClient.waitForTransactionReceipt({\n confirmations: params.confirmations,\n hash,\n }),\n });\n }),\n });\n })\n);\n"]}
@@ -2,13 +2,13 @@ import type { Scope, SubscriptionRef } from "effect";
2
2
  import { Context, Effect, Layer } from "effect";
3
3
  import type { Hash, TransactionReceipt } from "viem";
4
4
  import type { ClientNotFoundError } from "../core/index.js";
5
- import { PublicClientService, ReceiptTimeoutError, TransactionFailedError, TransactionReplacedError, TransportError } from "../core/index.js";
5
+ import { PublicClientService, ReceiptTimeoutError, TransportError, TxFailedError, TxReplacedError } from "../core/index.js";
6
6
  import type { TxPolicy } from "./policy.js";
7
7
  import { TxReplacement } from "./replacement.js";
8
8
  import type { TxState } from "./tracker.js";
9
9
  export type TxManagerShape = {
10
10
  readonly track: (chainId: number, hash: Hash, policy?: TxPolicy) => Effect.Effect<SubscriptionRef.SubscriptionRef<TxState>, ClientNotFoundError, Scope.Scope>;
11
- readonly waitForReceipt: (chainId: number, hash: Hash, timeoutOrPolicy?: number | TxPolicy) => Effect.Effect<TransactionReceipt, TransactionFailedError | ReceiptTimeoutError | TransactionReplacedError | ClientNotFoundError>;
11
+ readonly waitForReceipt: (chainId: number, hash: Hash, timeoutOrPolicy?: number | TxPolicy) => Effect.Effect<TransactionReceipt, TxFailedError | ReceiptTimeoutError | TxReplacedError | ClientNotFoundError>;
12
12
  readonly getConfirmations: (chainId: number, params: {
13
13
  hash: Hash;
14
14
  } | {
@@ -18,6 +18,7 @@ export type TxManagerShape = {
18
18
  declare const TxManager_base: Context.TagClass<TxManager, "ew3/TxManager", TxManagerShape>;
19
19
  export declare class TxManager extends TxManager_base {
20
20
  }
21
+ export declare function makeTxManagerLive(layerPolicy?: TxPolicy): Layer.Layer<TxManager, never, PublicClientService | TxReplacement>;
21
22
  export declare const TxManagerLive: Layer.Layer<TxManager, never, PublicClientService | TxReplacement>;
22
23
  export {};
23
24
  //# sourceMappingURL=manager.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"manager.d.ts","sourceRoot":"","sources":["../../src/tx/manager.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,eAAe,EAAE,MAAM,QAAQ,CAAC;AACrD,OAAO,EAAS,OAAO,EAAE,MAAM,EAAS,KAAK,EAAe,MAAM,QAAQ,CAAC;AAC3E,OAAO,KAAK,EAAE,IAAI,EAAE,kBAAkB,EAAE,MAAM,MAAM,CAAC;AAGrD,OAAO,KAAK,EAAE,mBAAmB,EAAgC,MAAM,qBAAqB,CAAC;AAC7F,OAAO,EACL,mBAAmB,EACnB,mBAAmB,EACnB,sBAAsB,EACtB,wBAAwB,EACxB,cAAc,EACf,MAAM,qBAAqB,CAAC;AAE7B,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAE5C,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAG5C,MAAM,MAAM,cAAc,GAAG;IAI3B,QAAQ,CAAC,KAAK,EAAE,CACd,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,IAAI,EACV,MAAM,CAAC,EAAE,QAAQ,KACd,MAAM,CAAC,MAAM,CAAC,eAAe,CAAC,eAAe,CAAC,OAAO,CAAC,EAAE,mBAAmB,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC;IAK/F,QAAQ,CAAC,cAAc,EAAE,CACvB,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,IAAI,EACV,eAAe,CAAC,EAAE,MAAM,GAAG,QAAQ,KAChC,MAAM,CAAC,MAAM,CAChB,kBAAkB,EAClB,sBAAsB,GAAG,mBAAmB,GAAG,wBAAwB,GAAG,mBAAmB,CAC9F,CAAC;IAKF,QAAQ,CAAC,gBAAgB,EAAE,CACzB,OAAO,EAAE,MAAM,EACf,MAAM,EAAE;QAAE,IAAI,EAAE,IAAI,CAAA;KAAE,GAAG;QAAE,kBAAkB,EAAE,kBAAkB,CAAA;KAAE,KAChE,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,mBAAmB,GAAG,cAAc,CAAC,CAAC;CAClE,CAAC;;AAEF,qBAAa,SAAU,SAAQ,cAAyD;CAAG;AAE3F,eAAO,MAAM,aAAa,oEAoTzB,CAAC"}
1
+ {"version":3,"file":"manager.d.ts","sourceRoot":"","sources":["../../src/tx/manager.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,eAAe,EAAE,MAAM,QAAQ,CAAC;AACrD,OAAO,EAAS,OAAO,EAAE,MAAM,EAAS,KAAK,EAAe,MAAM,QAAQ,CAAC;AAC3E,OAAO,KAAK,EAAE,IAAI,EAAE,kBAAkB,EAAE,MAAM,MAAM,CAAC;AAGrD,OAAO,KAAK,EAAE,mBAAmB,EAAuB,MAAM,qBAAqB,CAAC;AACpF,OAAO,EACL,mBAAmB,EACnB,mBAAmB,EACnB,cAAc,EACd,aAAa,EACb,eAAe,EAChB,MAAM,qBAAqB,CAAC;AAE7B,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAE5C,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAG5C,MAAM,MAAM,cAAc,GAAG;IAI3B,QAAQ,CAAC,KAAK,EAAE,CACd,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,IAAI,EACV,MAAM,CAAC,EAAE,QAAQ,KACd,MAAM,CAAC,MAAM,CAAC,eAAe,CAAC,eAAe,CAAC,OAAO,CAAC,EAAE,mBAAmB,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC;IAK/F,QAAQ,CAAC,cAAc,EAAE,CACvB,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,IAAI,EACV,eAAe,CAAC,EAAE,MAAM,GAAG,QAAQ,KAChC,MAAM,CAAC,MAAM,CAChB,kBAAkB,EAClB,aAAa,GAAG,mBAAmB,GAAG,eAAe,GAAG,mBAAmB,CAC5E,CAAC;IAKF,QAAQ,CAAC,gBAAgB,EAAE,CACzB,OAAO,EAAE,MAAM,EACf,MAAM,EAAE;QAAE,IAAI,EAAE,IAAI,CAAA;KAAE,GAAG;QAAE,kBAAkB,EAAE,kBAAkB,CAAA;KAAE,KAChE,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,mBAAmB,GAAG,cAAc,CAAC,CAAC;CAClE,CAAC;;AAEF,qBAAa,SAAU,SAAQ,cAAyD;CAAG;AAE3F,wBAAgB,iBAAiB,CAC/B,WAAW,CAAC,EAAE,QAAQ,GACrB,KAAK,CAAC,KAAK,CAAC,SAAS,EAAE,KAAK,EAAE,mBAAmB,GAAG,aAAa,CAAC,CAqUpE;AAED,eAAO,MAAM,aAAa,oEAAsB,CAAC"}
@@ -1,240 +1,256 @@
1
1
  import { Clock, Context, Effect, Fiber, Layer, Ref, Stream } from "effect";
2
2
  import { WaitForTransactionReceiptTimeoutError } from "viem";
3
3
  import { DEFAULT_RECEIPT_TIMEOUT, DEFAULT_STUCK_TX_MS } from "../constants/index.js";
4
- import { PublicClientService, ReceiptTimeoutError, TransactionFailedError, TransactionReplacedError, TransportError, } from "../core/index.js";
4
+ import { PublicClientService, ReceiptTimeoutError, TransportError, TxFailedError, TxReplacedError, } from "../core/index.js";
5
5
  import { SpanNames } from "../telemetry/index.js";
6
6
  import { defaultPolicy } from "./policy.js";
7
7
  import { TxReplacement } from "./replacement.js";
8
8
  import { makeTxTracker } from "./tracker.js";
9
9
  export class TxManager extends Context.Tag("ew3/TxManager")() {
10
10
  }
11
- export const TxManagerLive = Layer.effect(TxManager, Effect.gen(function* () {
12
- const publicClientService = yield* PublicClientService;
13
- const txReplacement = yield* TxReplacement;
14
- return {
15
- getConfirmations: Effect.fn("TxManager.getConfirmations")(function* (chainId, params) {
16
- const client = yield* publicClientService.get(chainId);
17
- return yield* Effect.tryPromise({
18
- catch: (cause) => new TransportError({
19
- cause,
20
- message: cause instanceof Error ? cause.message : "Failed to get transaction confirmations",
21
- url: client.transport.url ?? "",
22
- }),
23
- try: () => client.getTransactionConfirmations(params),
24
- }).pipe(Effect.withSpan(SpanNames.TX_GET_CONFIRMATIONS, {
25
- attributes: {
26
- chainId,
27
- hash: "hash" in params ? params.hash : params.transactionReceipt.transactionHash,
28
- },
29
- }));
30
- }),
31
- track: Effect.fn("TxManager.track")(function* (chainId, hash, providedPolicy) {
32
- const tracker = yield* makeTxTracker;
33
- const client = yield* publicClientService.get(chainId);
34
- const policy = {
35
- ...defaultPolicy,
36
- ...providedPolicy,
37
- replacement: {
38
- ...(defaultPolicy.replacement ?? {}),
39
- ...(providedPolicy?.replacement ?? {}),
40
- },
41
- };
42
- yield* tracker.set({ hash, status: "submitted" });
43
- yield* Effect.forkScoped(Effect.gen(function* () {
44
- const currentHashRef = yield* Ref.make(hash);
45
- const confirmationsRef = yield* Ref.make(0);
46
- const startedAtMsRef = yield* Ref.make(yield* Clock.currentTimeMillis);
47
- const autoAttemptsRef = yield* Ref.make(0);
48
- const autoReplacingRef = yield* Ref.make(false);
49
- const replacementStrategy = policy.replacement?.strategy ?? policy.replacementStrategy ?? "none";
50
- const stuckBlocks = policy.replacement?.stuckBlocks ?? 3;
51
- const stuckMs = policy.replacement?.stuckMs ?? DEFAULT_STUCK_TX_MS;
52
- const maxAttempts = policy.replacement?.maxAttempts ?? 1;
53
- const updatePendingState = (currentHash) => Effect.gen(function* () {
54
- const confirmations = yield* Ref.modify(confirmationsRef, (n) => [n + 1, n + 1]);
55
- yield* tracker.set({
56
- confirmations,
57
- hash: currentHash,
58
- status: "pending",
59
- });
60
- return confirmations;
61
- });
62
- const performAutoReplacement = (currentHash, now) => Ref.set(autoReplacingRef, true).pipe(Effect.zipRight((replacementStrategy === "cancel"
63
- ? txReplacement.cancel(chainId, currentHash, policy)
64
- : txReplacement.speedup(chainId, currentHash, policy)).pipe(Effect.either, Effect.ensuring(Ref.set(autoReplacingRef, false)), Effect.flatMap((replaced) => {
65
- if (replaced._tag === "Left") {
66
- return Effect.void;
67
- }
68
- const newHash = replaced.right;
69
- return Effect.all([
70
- Ref.set(currentHashRef, newHash),
71
- Ref.set(confirmationsRef, 0),
72
- Ref.set(startedAtMsRef, now),
73
- Ref.update(autoAttemptsRef, (n) => n + 1),
74
- tracker.set({
75
- newHash,
76
- oldHash: currentHash,
77
- reason: replacementStrategy === "cancel" ? "cancelled" : "repriced",
78
- status: "replaced",
79
- }),
80
- tracker.set({ hash: newHash, status: "submitted" }),
81
- ]).pipe(Effect.asVoid);
82
- }))));
83
- const autoReplaceIfStuck = (currentHash, confirmations) => {
84
- if (replacementStrategy === "none") {
85
- return Effect.void;
86
- }
87
- return Effect.all({
88
- alreadyReplacing: Ref.get(autoReplacingRef),
89
- attempts: Ref.get(autoAttemptsRef),
90
- now: Clock.currentTimeMillis,
91
- startedAt: Ref.get(startedAtMsRef),
92
- }).pipe(Effect.flatMap(({ alreadyReplacing, attempts, now, startedAt }) => {
93
- const elapsed = startedAt > 0 ? now - startedAt : 0;
94
- const stuck = confirmations >= stuckBlocks || elapsed >= stuckMs;
95
- const allowed = attempts < maxAttempts && !alreadyReplacing;
96
- return stuck && allowed ? performAutoReplacement(currentHash, now) : Effect.void;
97
- }));
11
+ export function makeTxManagerLive(layerPolicy) {
12
+ const layerDefault = {
13
+ ...defaultPolicy,
14
+ ...layerPolicy,
15
+ replacement: {
16
+ ...(defaultPolicy.replacement ?? {}),
17
+ ...(layerPolicy?.replacement ?? {}),
18
+ },
19
+ };
20
+ return Layer.effect(TxManager, Effect.gen(function* () {
21
+ const publicClientService = yield* PublicClientService;
22
+ const txReplacement = yield* TxReplacement;
23
+ return {
24
+ getConfirmations: Effect.fn("TxManager.getConfirmations")(function* (chainId, params) {
25
+ const client = yield* publicClientService.get(chainId);
26
+ return yield* Effect.tryPromise({
27
+ catch: (cause) => new TransportError({
28
+ cause,
29
+ message: cause instanceof Error
30
+ ? cause.message
31
+ : "Failed to get transaction confirmations",
32
+ url: client.transport.url ?? "",
33
+ }),
34
+ try: () => client.getTransactionConfirmations(params),
35
+ }).pipe(Effect.withSpan(SpanNames.TX_GET_CONFIRMATIONS, {
36
+ attributes: {
37
+ chainId,
38
+ hash: "hash" in params ? params.hash : params.transactionReceipt.transactionHash,
39
+ },
40
+ }));
41
+ }),
42
+ track: Effect.fn("TxManager.track")(function* (chainId, hash, providedPolicy) {
43
+ const tracker = yield* makeTxTracker;
44
+ const client = yield* publicClientService.get(chainId);
45
+ const policy = {
46
+ ...layerDefault,
47
+ ...providedPolicy,
48
+ replacement: {
49
+ ...(layerDefault.replacement ?? {}),
50
+ ...(providedPolicy?.replacement ?? {}),
51
+ },
98
52
  };
99
- const onPendingBlock = Effect.gen(function* () {
100
- const currentHash = yield* Ref.get(currentHashRef);
101
- const confirmations = yield* updatePendingState(currentHash);
102
- yield* autoReplaceIfStuck(currentHash, confirmations);
103
- });
104
- const pendingFiber = yield* Stream.runForEach(Stream.async((emit) => {
105
- const unwatch = client.watchBlockNumber({
106
- onBlockNumber: (blockNumber) => emit.single(blockNumber),
107
- onError: (error) => emit.fail(error),
108
- pollingInterval: policy.pollingInterval,
53
+ yield* tracker.set({ hash, status: "submitted" });
54
+ yield* Effect.forkScoped(Effect.gen(function* () {
55
+ const currentHashRef = yield* Ref.make(hash);
56
+ const confirmationsRef = yield* Ref.make(0);
57
+ const startedAtMsRef = yield* Ref.make(yield* Clock.currentTimeMillis);
58
+ const autoAttemptsRef = yield* Ref.make(0);
59
+ const autoReplacingRef = yield* Ref.make(false);
60
+ const replacementStrategy = policy.replacement?.strategy ?? policy.replacementStrategy ?? "none";
61
+ const stuckMs = policy.replacement?.stuckMs ?? DEFAULT_STUCK_TX_MS;
62
+ const maxAttempts = policy.replacement?.maxAttempts ?? 1;
63
+ const updatePendingState = (currentHash) => Effect.gen(function* () {
64
+ const confirmations = yield* Ref.modify(confirmationsRef, (n) => [n + 1, n + 1]);
65
+ yield* tracker.set({
66
+ confirmations,
67
+ hash: currentHash,
68
+ status: "pending",
69
+ });
70
+ return confirmations;
109
71
  });
110
- return Effect.sync(() => {
111
- unwatch();
72
+ const performAutoReplacement = (currentHash, now) => Ref.set(autoReplacingRef, true).pipe(Effect.zipRight((replacementStrategy === "cancel"
73
+ ? txReplacement.cancel(chainId, currentHash, policy)
74
+ : txReplacement.speedup(chainId, currentHash, policy)).pipe(Effect.either, Effect.ensuring(Ref.set(autoReplacingRef, false)), Effect.flatMap((replaced) => {
75
+ if (replaced._tag === "Left") {
76
+ return Effect.void;
77
+ }
78
+ const newHash = replaced.right;
79
+ return Effect.all([
80
+ Ref.set(currentHashRef, newHash),
81
+ Ref.set(confirmationsRef, 0),
82
+ Ref.set(startedAtMsRef, now),
83
+ Ref.update(autoAttemptsRef, (n) => n + 1),
84
+ tracker.set({
85
+ newHash,
86
+ oldHash: currentHash,
87
+ reason: replacementStrategy === "cancel" ? "cancelled" : "repriced",
88
+ status: "replaced",
89
+ }),
90
+ tracker.set({ hash: newHash, status: "submitted" }),
91
+ ]).pipe(Effect.asVoid);
92
+ }))));
93
+ const autoReplaceIfStuck = (currentHash) => {
94
+ if (replacementStrategy === "none") {
95
+ return Effect.void;
96
+ }
97
+ return Effect.all({
98
+ alreadyReplacing: Ref.get(autoReplacingRef),
99
+ attempts: Ref.get(autoAttemptsRef),
100
+ now: Clock.currentTimeMillis,
101
+ startedAt: Ref.get(startedAtMsRef),
102
+ }).pipe(Effect.flatMap(({ alreadyReplacing, attempts, now, startedAt }) => {
103
+ const elapsed = startedAt > 0 ? now - startedAt : 0;
104
+ const stuck = elapsed >= stuckMs;
105
+ const allowed = attempts < maxAttempts && !alreadyReplacing;
106
+ return stuck && allowed
107
+ ? performAutoReplacement(currentHash, now)
108
+ : Effect.void;
109
+ }));
110
+ };
111
+ const onPendingBlock = Effect.gen(function* () {
112
+ const currentHash = yield* Ref.get(currentHashRef);
113
+ yield* updatePendingState(currentHash);
114
+ yield* autoReplaceIfStuck(currentHash);
112
115
  });
113
- }), () => onPendingBlock).pipe(Effect.forkScoped);
114
- let replacement;
115
- const receiptResult = yield* Effect.either(Effect.tryPromise({
116
- catch: (e) => e,
117
- try: () => client.waitForTransactionReceipt({
118
- hash,
119
- onReplaced: (info) => {
120
- replacement = {
121
- newHash: info.transaction.hash,
122
- oldHash: info.replacedTransaction.hash,
123
- reason: info.reason,
124
- };
125
- },
126
- pollingInterval: policy.pollingInterval,
127
- timeout: policy.receiptTimeout,
128
- }),
129
- })).pipe(Effect.ensuring(Fiber.interrupt(pendingFiber)));
130
- if (receiptResult._tag === "Left") {
131
- const cause = receiptResult.left;
132
- const timeout = policy.receiptTimeout ?? DEFAULT_RECEIPT_TIMEOUT;
133
- const failure = cause instanceof WaitForTransactionReceiptTimeoutError
134
- ? new ReceiptTimeoutError({
135
- hash,
136
- message: cause.message,
137
- timeout,
138
- })
139
- : cause;
140
- yield* tracker.set({
141
- error: new TransactionFailedError({
142
- cause: failure,
116
+ const pendingFiber = yield* Stream.runForEach(Stream.async((emit) => {
117
+ const unwatch = client.watchBlockNumber({
118
+ onBlockNumber: (blockNumber) => emit.single(blockNumber),
119
+ onError: (error) => emit.fail(error),
120
+ pollingInterval: policy.pollingInterval,
121
+ });
122
+ return Effect.sync(() => {
123
+ unwatch();
124
+ });
125
+ }), () => onPendingBlock).pipe(Effect.forkScoped);
126
+ let replacement;
127
+ const receiptResult = yield* Effect.either(Effect.tryPromise({
128
+ catch: (e) => e,
129
+ try: () => client.waitForTransactionReceipt({
143
130
  hash,
144
- message: failure instanceof Error ? failure.message : String(failure),
131
+ onReplaced: (info) => {
132
+ replacement = {
133
+ newHash: info.transaction.hash,
134
+ oldHash: info.replacedTransaction.hash,
135
+ reason: info.reason,
136
+ };
137
+ },
138
+ pollingInterval: policy.pollingInterval,
139
+ timeout: policy.receiptTimeout,
145
140
  }),
146
- status: "failed",
147
- });
148
- return;
149
- }
150
- const receipt = receiptResult.right;
151
- if (replacement) {
152
- yield* Ref.set(currentHashRef, replacement.newHash);
153
- yield* tracker.set({
154
- newHash: replacement.newHash,
155
- oldHash: replacement.oldHash,
156
- reason: replacement.reason,
157
- status: "replaced",
158
- });
141
+ })).pipe(Effect.ensuring(Fiber.interrupt(pendingFiber)));
142
+ if (receiptResult._tag === "Left") {
143
+ const cause = receiptResult.left;
144
+ const timeout = policy.receiptTimeout ?? DEFAULT_RECEIPT_TIMEOUT;
145
+ const failure = cause instanceof WaitForTransactionReceiptTimeoutError
146
+ ? new ReceiptTimeoutError({
147
+ hash,
148
+ message: cause.message,
149
+ timeout,
150
+ })
151
+ : cause;
152
+ yield* tracker.set({
153
+ error: new TxFailedError({
154
+ cause: failure,
155
+ hash,
156
+ message: failure instanceof Error ? failure.message : String(failure),
157
+ }),
158
+ status: "failed",
159
+ });
160
+ return;
161
+ }
162
+ const receipt = receiptResult.right;
163
+ if (replacement) {
164
+ yield* Ref.set(currentHashRef, replacement.newHash);
165
+ yield* tracker.set({
166
+ newHash: replacement.newHash,
167
+ oldHash: replacement.oldHash,
168
+ reason: replacement.reason,
169
+ status: "replaced",
170
+ });
171
+ yield* tracker.set({
172
+ hash: replacement.newHash,
173
+ status: "submitted",
174
+ });
175
+ }
159
176
  yield* tracker.set({
160
- hash: replacement.newHash,
161
- status: "submitted",
177
+ effectiveGasPrice: receipt.effectiveGasPrice,
178
+ hash: receipt.transactionHash,
179
+ receipt,
180
+ status: "mined",
162
181
  });
163
- }
164
- yield* tracker.set({
165
- effectiveGasPrice: receipt.effectiveGasPrice,
166
- hash: receipt.transactionHash,
167
- receipt,
168
- status: "mined",
169
- });
170
- }));
171
- return tracker.ref;
172
- }),
173
- waitForReceipt: Effect.fn("TxManager.waitForReceipt")(function* (chainId, hash, timeoutOrPolicy) {
174
- const client = yield* publicClientService.get(chainId);
175
- const policy = typeof timeoutOrPolicy === "object" && timeoutOrPolicy !== null
176
- ? timeoutOrPolicy
177
- : undefined;
178
- const timeout = typeof timeoutOrPolicy === "number"
179
- ? timeoutOrPolicy
180
- : (policy?.receiptTimeout ?? defaultPolicy.receiptTimeout ?? DEFAULT_RECEIPT_TIMEOUT);
181
- const pollingInterval = policy?.pollingInterval ?? defaultPolicy.pollingInterval;
182
- return yield* Effect.tryPromise({
183
- catch: (cause) => {
184
- if (cause instanceof TransactionReplacedError) {
185
- return cause;
186
- }
187
- if (cause instanceof WaitForTransactionReceiptTimeoutError) {
188
- return new ReceiptTimeoutError({
182
+ }));
183
+ return tracker.ref;
184
+ }),
185
+ waitForReceipt: Effect.fn("TxManager.waitForReceipt")(function* (chainId, hash, timeoutOrPolicy) {
186
+ const client = yield* publicClientService.get(chainId);
187
+ const policy = typeof timeoutOrPolicy === "object" && timeoutOrPolicy !== null
188
+ ? timeoutOrPolicy
189
+ : undefined;
190
+ const timeout = typeof timeoutOrPolicy === "number"
191
+ ? timeoutOrPolicy
192
+ : (policy?.receiptTimeout ??
193
+ layerDefault.receiptTimeout ??
194
+ DEFAULT_RECEIPT_TIMEOUT);
195
+ const pollingInterval = policy?.pollingInterval ?? layerDefault.pollingInterval;
196
+ return yield* Effect.tryPromise({
197
+ catch: (cause) => {
198
+ if (cause instanceof TxReplacedError) {
199
+ return cause;
200
+ }
201
+ if (cause instanceof WaitForTransactionReceiptTimeoutError) {
202
+ return new ReceiptTimeoutError({
203
+ hash,
204
+ message: cause.message,
205
+ timeout,
206
+ });
207
+ }
208
+ if (cause instanceof Error && cause.message.toLowerCase().includes("timeout")) {
209
+ return new ReceiptTimeoutError({
210
+ hash,
211
+ message: cause.message,
212
+ timeout,
213
+ });
214
+ }
215
+ return new TxFailedError({
216
+ cause,
189
217
  hash,
190
- message: cause.message,
191
- timeout,
218
+ message: `Failed to get receipt for ${hash}`,
192
219
  });
193
- }
194
- if (cause instanceof Error && cause.message.toLowerCase().includes("timeout")) {
195
- return new ReceiptTimeoutError({
220
+ },
221
+ try: async () => {
222
+ let replacement;
223
+ const receipt = await client.waitForTransactionReceipt({
196
224
  hash,
197
- message: cause.message,
225
+ onReplaced: (info) => {
226
+ replacement = {
227
+ newHash: info.transaction.hash,
228
+ reason: info.reason,
229
+ };
230
+ },
231
+ pollingInterval,
198
232
  timeout,
199
233
  });
200
- }
201
- return new TransactionFailedError({
202
- cause,
203
- hash,
204
- message: `Failed to get receipt for ${hash}`,
205
- });
206
- },
207
- try: async () => {
208
- let replacement;
209
- const receipt = await client.waitForTransactionReceipt({
234
+ if (replacement && replacement.newHash !== hash) {
235
+ throw new TxReplacedError({
236
+ message: `Transaction ${hash} was ${replacement.reason} with ${replacement.newHash}`,
237
+ newHash: replacement.newHash,
238
+ oldHash: hash,
239
+ reason: replacement.reason,
240
+ });
241
+ }
242
+ return receipt;
243
+ },
244
+ }).pipe(Effect.withSpan(SpanNames.TX_WAIT, {
245
+ attributes: {
246
+ chainId,
210
247
  hash,
211
- onReplaced: (info) => {
212
- replacement = {
213
- newHash: info.transaction.hash,
214
- reason: info.reason,
215
- };
216
- },
217
- pollingInterval,
218
248
  timeout,
219
- });
220
- if (replacement && replacement.newHash !== hash) {
221
- throw new TransactionReplacedError({
222
- message: `Transaction ${hash} was ${replacement.reason} with ${replacement.newHash}`,
223
- newHash: replacement.newHash,
224
- oldHash: hash,
225
- reason: replacement.reason,
226
- });
227
- }
228
- return receipt;
229
- },
230
- }).pipe(Effect.withSpan(SpanNames.TX_WAIT, {
231
- attributes: {
232
- chainId,
233
- hash,
234
- timeout,
235
- },
236
- }));
237
- }),
238
- };
239
- }));
249
+ },
250
+ }));
251
+ }),
252
+ };
253
+ }));
254
+ }
255
+ export const TxManagerLive = makeTxManagerLive();
240
256
  //# sourceMappingURL=manager.js.map