@prb/effect-evm 1.0.0-beta.1 → 1.0.0-beta.10

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 (390) hide show
  1. package/DOCS.md +13 -0
  2. package/README.md +4 -0
  3. package/dist/abi/erc165.js.map +1 -1
  4. package/dist/abi/erc20-no-output.js.map +1 -1
  5. package/dist/abi/erc20.js.map +1 -1
  6. package/dist/abi/erc721.js.map +1 -1
  7. package/dist/abi/index.js.map +1 -1
  8. package/dist/balance/index.js.map +1 -1
  9. package/dist/balance/service.js.map +1 -1
  10. package/dist/balance/service.test.integration.d.ts +2 -0
  11. package/dist/balance/service.test.integration.d.ts.map +1 -0
  12. package/dist/balance/service.test.integration.js +289 -0
  13. package/dist/balance/service.test.integration.js.map +1 -0
  14. package/dist/balance/utils.js.map +1 -1
  15. package/dist/block/errors.js.map +1 -1
  16. package/dist/block/index.js.map +1 -1
  17. package/dist/block/service.js.map +1 -1
  18. package/dist/block/service.test.integration.d.ts +2 -0
  19. package/dist/block/service.test.integration.d.ts.map +1 -0
  20. package/dist/block/service.test.integration.js +190 -0
  21. package/dist/block/service.test.integration.js.map +1 -0
  22. package/dist/constants/index.d.ts +0 -4
  23. package/dist/constants/index.d.ts.map +1 -1
  24. package/dist/constants/index.js +1 -5
  25. package/dist/constants/index.js.map +1 -1
  26. package/dist/contract/cross-chain-reader.js.map +1 -1
  27. package/dist/contract/index.js.map +1 -1
  28. package/dist/contract/pipeline/index.js.map +1 -1
  29. package/dist/contract/pipeline/internal/core.d.ts +2 -2
  30. package/dist/contract/pipeline/internal/core.d.ts.map +1 -1
  31. package/dist/contract/pipeline/internal/core.js.map +1 -1
  32. package/dist/contract/pipeline/internal/helpers.js.map +1 -1
  33. package/dist/contract/pipeline/internal/nonce.js.map +1 -1
  34. package/dist/contract/pipeline/internal/prepare.js.map +1 -1
  35. package/dist/contract/pipeline/internal/receipt.d.ts +2 -2
  36. package/dist/contract/pipeline/internal/receipt.d.ts.map +1 -1
  37. package/dist/contract/pipeline/internal/receipt.js +1 -1
  38. package/dist/contract/pipeline/internal/receipt.js.map +1 -1
  39. package/dist/contract/pipeline/live.js.map +1 -1
  40. package/dist/contract/pipeline/service.d.ts +3 -3
  41. package/dist/contract/pipeline/service.d.ts.map +1 -1
  42. package/dist/contract/pipeline/service.js.map +1 -1
  43. package/dist/contract/pipeline/types.d.ts +2 -2
  44. package/dist/contract/pipeline/types.d.ts.map +1 -1
  45. package/dist/contract/pipeline/types.js.map +1 -1
  46. package/dist/contract/pipeline/write-and-track.d.ts.map +1 -1
  47. package/dist/contract/pipeline/write-and-track.js +5 -6
  48. package/dist/contract/pipeline/write-and-track.js.map +1 -1
  49. package/dist/contract/pipeline/write-and-wait.d.ts +1 -1
  50. package/dist/contract/pipeline/write-and-wait.d.ts.map +1 -1
  51. package/dist/contract/pipeline/write-and-wait.js.map +1 -1
  52. package/dist/contract/pipeline.js.map +1 -1
  53. package/dist/contract/reader.js.map +1 -1
  54. package/dist/contract/typed-contract.js.map +1 -1
  55. package/dist/contract/writer.js.map +1 -1
  56. package/dist/core/clients/index.js.map +1 -1
  57. package/dist/core/clients/public-client.js.map +1 -1
  58. package/dist/core/clients/wallet-client.js.map +1 -1
  59. package/dist/core/errors/client.js.map +1 -1
  60. package/dist/core/errors/contract.js.map +1 -1
  61. package/dist/core/errors/erc20.js.map +1 -1
  62. package/dist/core/errors/event.js.map +1 -1
  63. package/dist/core/errors/index.js.map +1 -1
  64. package/dist/core/errors/predicates.js.map +1 -1
  65. package/dist/core/errors/transaction.d.ts +7 -7
  66. package/dist/core/errors/transaction.d.ts.map +1 -1
  67. package/dist/core/errors/transaction.js +2 -2
  68. package/dist/core/errors/transaction.js.map +1 -1
  69. package/dist/core/errors/viem-mapper.d.ts +3 -3
  70. package/dist/core/errors/viem-mapper.d.ts.map +1 -1
  71. package/dist/core/errors/viem-mapper.js +14 -5
  72. package/dist/core/errors/viem-mapper.js.map +1 -1
  73. package/dist/core/index.js.map +1 -1
  74. package/dist/deploy/errors.js.map +1 -1
  75. package/dist/deploy/index.js.map +1 -1
  76. package/dist/deploy/service.d.ts +3 -3
  77. package/dist/deploy/service.d.ts.map +1 -1
  78. package/dist/deploy/service.js.map +1 -1
  79. package/dist/eip7702/erc7579.js.map +1 -1
  80. package/dist/eip7702/errors.d.ts +3 -3
  81. package/dist/eip7702/errors.d.ts.map +1 -1
  82. package/dist/eip7702/errors.js +1 -1
  83. package/dist/eip7702/errors.js.map +1 -1
  84. package/dist/eip7702/index.js.map +1 -1
  85. package/dist/eip7702/service.d.ts +8 -8
  86. package/dist/eip7702/service.d.ts.map +1 -1
  87. package/dist/eip7702/service.js +2 -2
  88. package/dist/eip7702/service.js.map +1 -1
  89. package/dist/ens/ens.d.ts.map +1 -1
  90. package/dist/ens/ens.js +6 -6
  91. package/dist/ens/ens.js.map +1 -1
  92. package/dist/ens/errors.js.map +1 -1
  93. package/dist/ens/index.js.map +1 -1
  94. package/dist/erc20/allowance/core.js.map +1 -1
  95. package/dist/erc20/allowance/index.js.map +1 -1
  96. package/dist/erc20/allowance/no-output.js.map +1 -1
  97. package/dist/erc20/allowance/types.js.map +1 -1
  98. package/dist/erc20/index.d.ts +1 -0
  99. package/dist/erc20/index.d.ts.map +1 -1
  100. package/dist/erc20/index.js +1 -0
  101. package/dist/erc20/index.js.map +1 -1
  102. package/dist/erc20/metadata.d.ts +16 -0
  103. package/dist/erc20/metadata.d.ts.map +1 -0
  104. package/dist/erc20/metadata.js +67 -0
  105. package/dist/erc20/metadata.js.map +1 -0
  106. package/dist/erc721/errors.js.map +1 -1
  107. package/dist/erc721/helpers.js.map +1 -1
  108. package/dist/erc721/index.js.map +1 -1
  109. package/dist/erc721/metadata.js.map +1 -1
  110. package/dist/erc721/service.js.map +1 -1
  111. package/dist/events/backfill.js.map +1 -1
  112. package/dist/events/backfill.test.integration.d.ts +2 -0
  113. package/dist/events/backfill.test.integration.d.ts.map +1 -0
  114. package/dist/events/backfill.test.integration.js +112 -0
  115. package/dist/events/backfill.test.integration.js.map +1 -0
  116. package/dist/events/cursor.js.map +1 -1
  117. package/dist/events/decoder.js.map +1 -1
  118. package/dist/events/index.js.map +1 -1
  119. package/dist/events/reliable-stream-simple.test.integration.d.ts +2 -0
  120. package/dist/events/reliable-stream-simple.test.integration.d.ts.map +1 -0
  121. package/dist/events/reliable-stream-simple.test.integration.js +22 -0
  122. package/dist/events/reliable-stream-simple.test.integration.js.map +1 -0
  123. package/dist/events/reliable-stream.js.map +1 -1
  124. package/dist/events/reliable-stream.test.integration.d.ts +2 -0
  125. package/dist/events/reliable-stream.test.integration.d.ts.map +1 -0
  126. package/dist/events/reliable-stream.test.integration.js +327 -0
  127. package/dist/events/reliable-stream.test.integration.js.map +1 -0
  128. package/dist/events/stream.js.map +1 -1
  129. package/dist/events/stream.test.integration.d.ts +2 -0
  130. package/dist/events/stream.test.integration.d.ts.map +1 -0
  131. package/dist/events/stream.test.integration.js +120 -0
  132. package/dist/events/stream.test.integration.js.map +1 -0
  133. package/dist/gas/errors.js.map +1 -1
  134. package/dist/gas/estimator.d.ts.map +1 -1
  135. package/dist/gas/estimator.js +75 -58
  136. package/dist/gas/estimator.js.map +1 -1
  137. package/dist/gas/index.js.map +1 -1
  138. package/dist/gas/service.d.ts.map +1 -1
  139. package/dist/gas/service.js +14 -2
  140. package/dist/gas/service.js.map +1 -1
  141. package/dist/gas/service.test.integration.d.ts +2 -0
  142. package/dist/gas/service.test.integration.d.ts.map +1 -0
  143. package/dist/gas/service.test.integration.js +152 -0
  144. package/dist/gas/service.test.integration.js.map +1 -0
  145. package/dist/index.js.map +1 -1
  146. package/dist/integrations/react-hooks/convenience/index.js.map +1 -1
  147. package/dist/integrations/react-hooks/internal/error.js.map +1 -1
  148. package/dist/integrations/react-hooks/internal/is-dev.js.map +1 -1
  149. package/dist/integrations/react-hooks/internal/runtime.js.map +1 -1
  150. package/dist/integrations/react-hooks/internal/scoped-run.js.map +1 -1
  151. package/dist/integrations/react-hooks/internal/stable.js.map +1 -1
  152. package/dist/integrations/react-hooks/primitives/use-effect-memo-factory.js.map +1 -1
  153. package/dist/integrations/react-hooks/primitives/use-effect.js.map +1 -1
  154. package/dist/integrations/react-hooks/primitives/use-fork-effect.js.map +1 -1
  155. package/dist/integrations/react-hooks/primitives/use-stream.js.map +1 -1
  156. package/dist/integrations/react-hooks/primitives.js.map +1 -1
  157. package/dist/integrations/react-hooks/provider.js.map +1 -1
  158. package/dist/integrations/react-hooks/wagmi/index.js.map +1 -1
  159. package/dist/integrations/react-hooks/wallet-provider-ref.js.map +1 -1
  160. package/dist/integrations/wagmi/index.js.map +1 -1
  161. package/dist/integrations/wagmi/layers.js.map +1 -1
  162. package/dist/internal/index.js.map +1 -1
  163. package/dist/internal/numbers.js.map +1 -1
  164. package/dist/internal/schedule.js.map +1 -1
  165. package/dist/internal/stream-adapters.js.map +1 -1
  166. package/dist/internal/viem-effect.js.map +1 -1
  167. package/dist/nonce/index.js.map +1 -1
  168. package/dist/nonce/manager.js.map +1 -1
  169. package/dist/nonce/service.js.map +1 -1
  170. package/dist/nonce/service.test.integration.d.ts +2 -0
  171. package/dist/nonce/service.test.integration.d.ts.map +1 -0
  172. package/dist/nonce/service.test.integration.js +141 -0
  173. package/dist/nonce/service.test.integration.js.map +1 -0
  174. package/dist/platform/browser/cursor-store/index.js.map +1 -1
  175. package/dist/platform/browser/cursor-store/local-storage.js.map +1 -1
  176. package/dist/platform/browser/index.js.map +1 -1
  177. package/dist/platform/browser/layers.js.map +1 -1
  178. package/dist/platform/browser/storage/errors.js.map +1 -1
  179. package/dist/platform/browser/storage/index.js.map +1 -1
  180. package/dist/platform/browser/storage/local-storage.js.map +1 -1
  181. package/dist/platform/browser/tx-persistence/index.js.map +1 -1
  182. package/dist/platform/browser/tx-persistence/persistence.js.map +1 -1
  183. package/dist/platform/browser/tx-store/errors.js.map +1 -1
  184. package/dist/platform/browser/tx-store/index.js.map +1 -1
  185. package/dist/platform/browser/tx-store/local-storage.js.map +1 -1
  186. package/dist/platform/browser/tx-store/store.js.map +1 -1
  187. package/dist/platform/browser/tx-store/types.js.map +1 -1
  188. package/dist/presets/index.js.map +1 -1
  189. package/dist/presets/layers.js.map +1 -1
  190. package/dist/presets/transports.js.map +1 -1
  191. package/dist/query/chain-head.js.map +1 -1
  192. package/dist/query/client.js.map +1 -1
  193. package/dist/query/client.test.integration.d.ts +2 -0
  194. package/dist/query/client.test.integration.d.ts.map +1 -0
  195. package/dist/query/client.test.integration.js +94 -0
  196. package/dist/query/client.test.integration.js.map +1 -0
  197. package/dist/query/contract-query.js.map +1 -1
  198. package/dist/query/contract-query.test.integration.d.ts +2 -0
  199. package/dist/query/contract-query.test.integration.d.ts.map +1 -0
  200. package/dist/query/contract-query.test.integration.js +133 -0
  201. package/dist/query/contract-query.test.integration.js.map +1 -0
  202. package/dist/query/index.js.map +1 -1
  203. package/dist/query/multicall-batcher.js.map +1 -1
  204. package/dist/react-hooks/index.d.ts +0 -2
  205. package/dist/react-hooks/index.d.ts.map +1 -1
  206. package/dist/react-hooks/index.js +0 -2
  207. package/dist/react-hooks/index.js.map +1 -1
  208. package/dist/react-hooks/wagmi/index.js.map +1 -1
  209. package/dist/rpc/cache.js.map +1 -1
  210. package/dist/rpc/circuit-breaker.js.map +1 -1
  211. package/dist/rpc/dedup.js.map +1 -1
  212. package/dist/rpc/index.js.map +1 -1
  213. package/dist/rpc/retry.js.map +1 -1
  214. package/dist/rpc/routemesh.js.map +1 -1
  215. package/dist/signature/errors.js.map +1 -1
  216. package/dist/signature/index.js.map +1 -1
  217. package/dist/signature/service.js.map +1 -1
  218. package/dist/signature/service.test.integration.d.ts +2 -0
  219. package/dist/signature/service.test.integration.d.ts.map +1 -0
  220. package/dist/signature/service.test.integration.js +179 -0
  221. package/dist/signature/service.test.integration.js.map +1 -0
  222. package/dist/signature/utils.js.map +1 -1
  223. package/dist/simulation/errors.js.map +1 -1
  224. package/dist/simulation/index.js.map +1 -1
  225. package/dist/simulation/service.js.map +1 -1
  226. package/dist/simulation/tenderly.js.map +1 -1
  227. package/dist/simulation/tenderly.test.integration.d.ts +2 -0
  228. package/dist/simulation/tenderly.test.integration.d.ts.map +1 -0
  229. package/dist/simulation/tenderly.test.integration.js +104 -0
  230. package/dist/simulation/tenderly.test.integration.js.map +1 -0
  231. package/dist/simulation/types.js.map +1 -1
  232. package/dist/subscriptions/block-subscription.js.map +1 -1
  233. package/dist/subscriptions/errors.js.map +1 -1
  234. package/dist/subscriptions/index.js.map +1 -1
  235. package/dist/subscriptions/log-subscription.js.map +1 -1
  236. package/dist/subscriptions/pending-tx.d.ts +1 -1
  237. package/dist/subscriptions/pending-tx.d.ts.map +1 -1
  238. package/dist/subscriptions/pending-tx.js +1 -1
  239. package/dist/subscriptions/pending-tx.js.map +1 -1
  240. package/dist/subscriptions/service.d.ts +2 -2
  241. package/dist/subscriptions/service.d.ts.map +1 -1
  242. package/dist/subscriptions/service.js +4 -4
  243. package/dist/subscriptions/service.js.map +1 -1
  244. package/dist/telemetry/index.js.map +1 -1
  245. package/dist/telemetry/logger.js.map +1 -1
  246. package/dist/telemetry/tracer.d.ts +2 -2
  247. package/dist/telemetry/tracer.js +2 -2
  248. package/dist/telemetry/tracer.js.map +1 -1
  249. package/dist/testing-kit/_fixtures/addresses.js.map +1 -1
  250. package/dist/testing-kit/_fixtures/receipts.js.map +1 -1
  251. package/dist/testing-kit/helpers.js.map +1 -1
  252. package/dist/testing-kit/index.js.map +1 -1
  253. package/dist/testing-kit/mock-balance-service.js.map +1 -1
  254. package/dist/testing-kit/mock-block-service.js.map +1 -1
  255. package/dist/testing-kit/mock-cross-chain-reader.js.map +1 -1
  256. package/dist/testing-kit/mock-deploy-service.js.map +1 -1
  257. package/dist/testing-kit/mock-erc721-service.js.map +1 -1
  258. package/dist/testing-kit/mock-gas-service.js.map +1 -1
  259. package/dist/testing-kit/mock-nonce-service.js.map +1 -1
  260. package/dist/testing-kit/mock-public-client.js.map +1 -1
  261. package/dist/testing-kit/mock-signature-service.js.map +1 -1
  262. package/dist/testing-kit/mock-simulation-service.js.map +1 -1
  263. package/dist/testing-kit/mock-subscription-service.d.ts +2 -2
  264. package/dist/testing-kit/mock-subscription-service.d.ts.map +1 -1
  265. package/dist/testing-kit/mock-subscription-service.js +5 -5
  266. package/dist/testing-kit/mock-subscription-service.js.map +1 -1
  267. package/dist/testing-kit/mock-transfer-service.d.ts +3 -3
  268. package/dist/testing-kit/mock-transfer-service.d.ts.map +1 -1
  269. package/dist/testing-kit/mock-transfer-service.js.map +1 -1
  270. package/dist/testing-kit/mock-wallet-client.js.map +1 -1
  271. package/dist/testing-kit/mock-wallet-provider.js.map +1 -1
  272. package/dist/testing-kit/test-layer.js.map +1 -1
  273. package/dist/transfer/index.js.map +1 -1
  274. package/dist/transfer/service.d.ts +8 -11
  275. package/dist/transfer/service.d.ts.map +1 -1
  276. package/dist/transfer/service.js +32 -13
  277. package/dist/transfer/service.js.map +1 -1
  278. package/dist/tx/fees.d.ts.map +1 -1
  279. package/dist/tx/fees.js +3 -0
  280. package/dist/tx/fees.js.map +1 -1
  281. package/dist/tx/index.js.map +1 -1
  282. package/dist/tx/manager.d.ts +3 -2
  283. package/dist/tx/manager.d.ts.map +1 -1
  284. package/dist/tx/manager.js +232 -216
  285. package/dist/tx/manager.js.map +1 -1
  286. package/dist/tx/manager.test.integration.d.ts +2 -0
  287. package/dist/tx/manager.test.integration.d.ts.map +1 -0
  288. package/dist/tx/manager.test.integration.js +177 -0
  289. package/dist/tx/manager.test.integration.js.map +1 -0
  290. package/dist/tx/policy.d.ts +1 -1
  291. package/dist/tx/policy.d.ts.map +1 -1
  292. package/dist/tx/policy.js.map +1 -1
  293. package/dist/tx/replacement.d.ts +3 -3
  294. package/dist/tx/replacement.d.ts.map +1 -1
  295. package/dist/tx/replacement.js +3 -3
  296. package/dist/tx/replacement.js.map +1 -1
  297. package/dist/tx/tracker.d.ts +6 -6
  298. package/dist/tx/tracker.d.ts.map +1 -1
  299. package/dist/tx/tracker.js +9 -9
  300. package/dist/tx/tracker.js.map +1 -1
  301. package/dist/types/abi.js.map +1 -1
  302. package/dist/types/index.js.map +1 -1
  303. package/dist/types/params.d.ts +1 -1
  304. package/dist/types/params.d.ts.map +1 -1
  305. package/dist/types/params.js.map +1 -1
  306. package/dist/types/tx-overrides.d.ts +1 -1
  307. package/dist/types/tx-overrides.d.ts.map +1 -1
  308. package/dist/types/tx-overrides.js.map +1 -1
  309. package/dist/wagmi/index.js.map +1 -1
  310. package/dist/wagmi/layers.js.map +1 -1
  311. package/dist/wallet/errors.d.ts +3 -3
  312. package/dist/wallet/errors.d.ts.map +1 -1
  313. package/dist/wallet/errors.js +1 -1
  314. package/dist/wallet/errors.js.map +1 -1
  315. package/dist/wallet/index.js.map +1 -1
  316. package/dist/wallet/lifecycle.js.map +1 -1
  317. package/dist/wallet/operations.d.ts +2 -2
  318. package/dist/wallet/operations.d.ts.map +1 -1
  319. package/dist/wallet/operations.js +2 -2
  320. package/dist/wallet/operations.js.map +1 -1
  321. package/dist/wallet/provider-ref.js.map +1 -1
  322. package/dist/wallet/service.d.ts +2 -2
  323. package/dist/wallet/service.d.ts.map +1 -1
  324. package/dist/wallet/service.js.map +1 -1
  325. package/dist/wallet/types.js.map +1 -1
  326. package/package.json +25 -14
  327. package/dist/react-hooks/use-is-safe-multisig.d.ts +0 -2
  328. package/dist/react-hooks/use-is-safe-multisig.d.ts.map +0 -1
  329. package/dist/react-hooks/use-is-safe-multisig.js +0 -44
  330. package/dist/react-hooks/use-is-safe-multisig.js.map +0 -1
  331. package/dist/react-hooks/use-safe-context.d.ts +0 -2
  332. package/dist/react-hooks/use-safe-context.d.ts.map +0 -1
  333. package/dist/react-hooks/use-safe-context.js +0 -41
  334. package/dist/react-hooks/use-safe-context.js.map +0 -1
  335. package/dist/safe/adapter.d.ts +0 -9
  336. package/dist/safe/adapter.d.ts.map +0 -1
  337. package/dist/safe/adapter.js +0 -13
  338. package/dist/safe/adapter.js.map +0 -1
  339. package/dist/safe/detection.d.ts +0 -26
  340. package/dist/safe/detection.d.ts.map +0 -1
  341. package/dist/safe/detection.js +0 -102
  342. package/dist/safe/detection.js.map +0 -1
  343. package/dist/safe/errors.d.ts +0 -79
  344. package/dist/safe/errors.d.ts.map +0 -1
  345. package/dist/safe/errors.js +0 -34
  346. package/dist/safe/errors.js.map +0 -1
  347. package/dist/safe/index.d.ts +0 -8
  348. package/dist/safe/index.d.ts.map +0 -1
  349. package/dist/safe/index.js +0 -6
  350. package/dist/safe/index.js.map +0 -1
  351. package/dist/safe/live.d.ts +0 -8
  352. package/dist/safe/live.d.ts.map +0 -1
  353. package/dist/safe/live.js +0 -250
  354. package/dist/safe/live.js.map +0 -1
  355. package/dist/safe/service.d.ts +0 -26
  356. package/dist/safe/service.d.ts.map +0 -1
  357. package/dist/safe/service.js +0 -4
  358. package/dist/safe/service.js.map +0 -1
  359. package/dist/safe/simulation/abis.d.ts +0 -73
  360. package/dist/safe/simulation/abis.d.ts.map +0 -1
  361. package/dist/safe/simulation/abis.js +0 -61
  362. package/dist/safe/simulation/abis.js.map +0 -1
  363. package/dist/safe/simulation/addresses.d.ts +0 -4
  364. package/dist/safe/simulation/addresses.d.ts.map +0 -1
  365. package/dist/safe/simulation/addresses.js +0 -40
  366. package/dist/safe/simulation/addresses.js.map +0 -1
  367. package/dist/safe/simulation/encoding.d.ts +0 -16
  368. package/dist/safe/simulation/encoding.d.ts.map +0 -1
  369. package/dist/safe/simulation/encoding.js +0 -36
  370. package/dist/safe/simulation/encoding.js.map +0 -1
  371. package/dist/safe/simulation/errors.d.ts +0 -56
  372. package/dist/safe/simulation/errors.d.ts.map +0 -1
  373. package/dist/safe/simulation/errors.js +0 -37
  374. package/dist/safe/simulation/errors.js.map +0 -1
  375. package/dist/safe/simulation/index.d.ts +0 -7
  376. package/dist/safe/simulation/index.d.ts.map +0 -1
  377. package/dist/safe/simulation/index.js +0 -6
  378. package/dist/safe/simulation/index.js.map +0 -1
  379. package/dist/safe/simulation/service.d.ts +0 -14
  380. package/dist/safe/simulation/service.d.ts.map +0 -1
  381. package/dist/safe/simulation/service.js +0 -140
  382. package/dist/safe/simulation/service.js.map +0 -1
  383. package/dist/safe/simulation/types.d.ts +0 -20
  384. package/dist/safe/simulation/types.d.ts.map +0 -1
  385. package/dist/safe/simulation/types.js +0 -2
  386. package/dist/safe/simulation/types.js.map +0 -1
  387. package/dist/safe/types.d.ts +0 -61
  388. package/dist/safe/types.d.ts.map +0 -1
  389. package/dist/safe/types.js +0 -2
  390. package/dist/safe/types.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/query/client.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/query/client.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Fiber } from \"effect\";\nimport { Context, Effect, Layer, Ref, Stream } from \"effect\";\nimport { ChainHead } from \"@/src/query/chain-head.js\";\nimport { RequestDedup, RpcCache } from \"@/src/rpc/index.js\";\n\nexport type QueryOptions = {\n readonly ttl?: number | undefined;\n readonly blockScoped?: boolean | undefined;\n readonly chainId?: number | undefined;\n};\n\nexport type WatchOptions = QueryOptions & {\n readonly refetchOn: Stream.Stream<unknown, never>;\n};\n\nexport type QueryClientShape = {\n readonly query: <A, E, R>(\n key: string,\n effect: Effect.Effect<A, E, R>,\n options?: QueryOptions | undefined\n ) => Effect.Effect<A, E, R>;\n\n readonly watch: <A, E, R>(\n key: string,\n effect: Effect.Effect<A, E, R>,\n options: WatchOptions\n ) => Stream.Stream<A, E, R>;\n};\n\nexport class QueryClient extends Context.Tag(\"ew3/QueryClient\")<QueryClient, QueryClientShape>() {}\n\nexport const QueryClientLive = Layer.scoped(\n QueryClient,\n Effect.gen(function* () {\n const cache = yield* RpcCache;\n const dedup = yield* RequestDedup;\n const chainHead = yield* ChainHead;\n const scope = yield* Effect.scope;\n\n type InvalidatorState = Fiber.RuntimeFiber<void, never> | \"starting\";\n const invalidatorsRef = yield* Ref.make(new Map<number, InvalidatorState>());\n\n const ensureInvalidator = (chainId: number): Effect.Effect<void> =>\n Effect.gen(function* () {\n const shouldStart = yield* Ref.modify(invalidatorsRef, (current) => {\n if (current.has(chainId)) {\n return [false, current] as const;\n }\n const next = new Map(current);\n next.set(chainId, \"starting\");\n return [true, next] as const;\n });\n\n if (!shouldStart) {\n return;\n }\n\n const stream = yield* chainHead.watch(chainId);\n const started = Stream.runForEach(stream, (blockNumber) =>\n cache.invalidateBlock(blockNumber)\n )\n .pipe(Effect.forkIn(scope))\n .pipe(\n Effect.tap((fiber) =>\n Ref.update(invalidatorsRef, (current) => {\n const next = new Map(current);\n next.set(chainId, fiber);\n return next;\n })\n ),\n Effect.catchAll(() =>\n Ref.update(invalidatorsRef, (current) => {\n const next = new Map(current);\n next.delete(chainId);\n return next;\n })\n )\n );\n\n yield* started;\n }).pipe(Effect.catchAll(() => Effect.void));\n\n const query: QueryClientShape[\"query\"] = <A, E, R>(\n key: string,\n effect: Effect.Effect<A, E, R>,\n options?: QueryOptions | undefined\n ) =>\n Effect.gen(function* () {\n if (options?.blockScoped && options.chainId !== undefined) {\n yield* ensureInvalidator(options.chainId);\n }\n\n const cached = yield* cache.get<A>(key);\n if (cached !== null) {\n return cached;\n }\n\n return yield* dedup.dedupe(key, effect).pipe(\n Effect.tap((value) =>\n Effect.gen(function* () {\n if (options?.blockScoped && options.chainId !== undefined) {\n const current = yield* chainHead.current(options.chainId).pipe(Effect.either);\n if (current._tag === \"Right\") {\n yield* cache.set(key, value, current.right, options.ttl);\n return;\n }\n }\n yield* cache.set(key, value, undefined, options?.ttl);\n })\n )\n );\n });\n\n const watch: QueryClientShape[\"watch\"] = <A, E, R>(\n key: string,\n effect: Effect.Effect<A, E, R>,\n options: WatchOptions\n ) => {\n const initial = Stream.fromEffect(query(key, effect, options));\n const refetch = options.refetchOn.pipe(Stream.mapEffect(() => query(key, effect, options)));\n return Stream.concat(initial, refetch);\n };\n\n return QueryClient.of({ query, watch });\n })\n);\n"]}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=client.test.integration.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.test.integration.d.ts","sourceRoot":"","sources":["../../src/query/client.test.integration.ts"],"names":[],"mappings":""}
@@ -0,0 +1,94 @@
1
+ import { describe, expect, it } from "@effect/vitest";
2
+ import { Deferred, Effect, Fiber, Layer, Ref, Stream, SubscriptionRef } from "effect";
3
+ import { ChainHead, QueryClient, QueryClientLive } from "../query/index.js";
4
+ import { makeRpcCacheLive, RequestDedupLive, RpcCache } from "../rpc/index.js";
5
+ import { TEST_CHAIN_ID } from "../testing-kit/index.js";
6
+ describe("QueryClient", () => {
7
+ it.effect("caches repeated queries", () => Effect.gen(function* () {
8
+ const queryClient = yield* QueryClient;
9
+ let executions = 0;
10
+ const effect = Effect.sync(() => {
11
+ executions += 1;
12
+ return "value";
13
+ });
14
+ const result1 = yield* queryClient.query("key", effect, { ttl: 60_000 });
15
+ const result2 = yield* queryClient.query("key", effect, { ttl: 60_000 });
16
+ expect(result1).toBe("value");
17
+ expect(result2).toBe("value");
18
+ expect(executions).toBe(1);
19
+ }).pipe(Effect.provide(Layer.provide(QueryClientLive, Layer.mergeAll(Layer.succeed(ChainHead, ChainHead.of({
20
+ current: () => Effect.succeed(1n),
21
+ watch: () => Effect.succeed(Stream.empty),
22
+ })), makeRpcCacheLive({ ttl: 60_000 }), RequestDedupLive)))));
23
+ it.effect("dedupes concurrent queries with the same key", () => Effect.gen(function* () {
24
+ const queryClient = yield* QueryClient;
25
+ const started = yield* Deferred.make();
26
+ const gate = yield* Deferred.make();
27
+ let executions = 0;
28
+ const effect = Effect.gen(function* () {
29
+ executions += 1;
30
+ yield* Deferred.succeed(started, undefined);
31
+ yield* Deferred.await(gate);
32
+ return "shared";
33
+ });
34
+ const fiber1 = yield* Effect.fork(queryClient.query("key", effect, { ttl: 60_000 }));
35
+ const fiber2 = yield* Effect.fork(queryClient.query("key", effect, { ttl: 60_000 }));
36
+ yield* Deferred.await(started);
37
+ yield* Deferred.succeed(gate, undefined);
38
+ const result1 = yield* Fiber.join(fiber1);
39
+ const result2 = yield* Fiber.join(fiber2);
40
+ expect(result1).toBe("shared");
41
+ expect(result2).toBe("shared");
42
+ expect(executions).toBe(1);
43
+ }).pipe(Effect.provide(Layer.provide(QueryClientLive, Layer.mergeAll(Layer.succeed(ChainHead, ChainHead.of({
44
+ current: () => Effect.succeed(1n),
45
+ watch: () => Effect.succeed(Stream.empty),
46
+ })), makeRpcCacheLive({ ttl: 60_000 }), RequestDedupLive)))));
47
+ it.effect("invalidates block-scoped cache entries on new head blocks", () => Effect.gen(function* () {
48
+ const headRef = yield* SubscriptionRef.make(1n);
49
+ const watchStarted = yield* Deferred.make();
50
+ const invalidated = yield* Deferred.make();
51
+ const invalidationsRef = yield* Ref.make([]);
52
+ const queryClientLayer = Layer.provideMerge(QueryClientLive, Layer.mergeAll(Layer.succeed(ChainHead, ChainHead.of({
53
+ current: () => SubscriptionRef.get(headRef),
54
+ watch: () => Effect.succeed(headRef.changes.pipe(Stream.onStart(Deferred.succeed(watchStarted, undefined)))),
55
+ })), Layer.provide(Layer.effect(RpcCache, Effect.gen(function* () {
56
+ const base = yield* RpcCache;
57
+ return RpcCache.of({
58
+ ...base,
59
+ invalidateBlock: (blockNumber) => base.invalidateBlock(blockNumber).pipe(Effect.tap(() => Ref.update(invalidationsRef, (current) => [...current, blockNumber])), Effect.tap(() => blockNumber === 2n
60
+ ? Deferred.succeed(invalidated, undefined).pipe(Effect.asVoid)
61
+ : Effect.void)),
62
+ });
63
+ })), makeRpcCacheLive({ ttl: 60_000 })), RequestDedupLive));
64
+ return yield* Effect.gen(function* () {
65
+ const queryClient = yield* QueryClient;
66
+ const cache = yield* RpcCache;
67
+ let executions = 0;
68
+ const effect = Effect.sync(() => {
69
+ executions += 1;
70
+ return "value";
71
+ });
72
+ const result1 = yield* queryClient.query("key", effect, {
73
+ blockScoped: true,
74
+ chainId: TEST_CHAIN_ID,
75
+ ttl: 60_000,
76
+ });
77
+ expect(yield* cache.get("key")).toBe("value");
78
+ yield* Deferred.await(watchStarted);
79
+ yield* SubscriptionRef.set(headRef, 2n);
80
+ yield* Deferred.await(invalidated);
81
+ expect(yield* cache.get("key")).toBeNull();
82
+ expect(yield* Ref.get(invalidationsRef)).toContain(2n);
83
+ const result2 = yield* queryClient.query("key", effect, {
84
+ blockScoped: true,
85
+ chainId: TEST_CHAIN_ID,
86
+ ttl: 60_000,
87
+ });
88
+ expect(result1).toBe("value");
89
+ expect(result2).toBe("value");
90
+ expect(executions).toBe(2);
91
+ }).pipe(Effect.provide(queryClientLayer));
92
+ }).pipe(Effect.scoped));
93
+ });
94
+ //# sourceMappingURL=client.test.integration.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.test.integration.js","sourceRoot":"","sources":["../../src/query/client.test.integration.ts"],"names":[],"mappings":"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","sourcesContent":["import { describe, expect, it } from \"@effect/vitest\";\nimport { Deferred, Effect, Fiber, Layer, Ref, Stream, SubscriptionRef } from \"effect\";\nimport { ChainHead, QueryClient, QueryClientLive } from \"@/src/query/index.js\";\nimport { makeRpcCacheLive, RequestDedupLive, RpcCache } from \"@/src/rpc/index.js\";\nimport { TEST_CHAIN_ID } from \"@/src/testing-kit/index.js\";\n\ndescribe(\"QueryClient\", () => {\n it.effect(\"caches repeated queries\", () =>\n Effect.gen(function* () {\n const queryClient = yield* QueryClient;\n\n let executions = 0;\n const effect = Effect.sync(() => {\n executions += 1;\n return \"value\";\n });\n\n const result1 = yield* queryClient.query(\"key\", effect, { ttl: 60_000 });\n const result2 = yield* queryClient.query(\"key\", effect, { ttl: 60_000 });\n\n expect(result1).toBe(\"value\");\n expect(result2).toBe(\"value\");\n expect(executions).toBe(1);\n }).pipe(\n Effect.provide(\n Layer.provide(\n QueryClientLive,\n Layer.mergeAll(\n Layer.succeed(\n ChainHead,\n ChainHead.of({\n current: () => Effect.succeed(1n),\n watch: () => Effect.succeed(Stream.empty),\n })\n ),\n makeRpcCacheLive({ ttl: 60_000 }),\n RequestDedupLive\n )\n )\n )\n )\n );\n\n it.effect(\"dedupes concurrent queries with the same key\", () =>\n Effect.gen(function* () {\n const queryClient = yield* QueryClient;\n const started = yield* Deferred.make<void>();\n const gate = yield* Deferred.make<void>();\n\n let executions = 0;\n const effect = Effect.gen(function* () {\n executions += 1;\n yield* Deferred.succeed(started, undefined);\n yield* Deferred.await(gate);\n return \"shared\";\n });\n\n const fiber1 = yield* Effect.fork(queryClient.query(\"key\", effect, { ttl: 60_000 }));\n const fiber2 = yield* Effect.fork(queryClient.query(\"key\", effect, { ttl: 60_000 }));\n\n yield* Deferred.await(started);\n yield* Deferred.succeed(gate, undefined);\n\n const result1 = yield* Fiber.join(fiber1);\n const result2 = yield* Fiber.join(fiber2);\n\n expect(result1).toBe(\"shared\");\n expect(result2).toBe(\"shared\");\n expect(executions).toBe(1);\n }).pipe(\n Effect.provide(\n Layer.provide(\n QueryClientLive,\n Layer.mergeAll(\n Layer.succeed(\n ChainHead,\n ChainHead.of({\n current: () => Effect.succeed(1n),\n watch: () => Effect.succeed(Stream.empty),\n })\n ),\n makeRpcCacheLive({ ttl: 60_000 }),\n RequestDedupLive\n )\n )\n )\n )\n );\n\n it.effect(\"invalidates block-scoped cache entries on new head blocks\", () =>\n Effect.gen(function* () {\n const headRef = yield* SubscriptionRef.make(1n);\n const watchStarted = yield* Deferred.make<void>();\n const invalidated = yield* Deferred.make<void>();\n const invalidationsRef = yield* Ref.make<readonly bigint[]>([]);\n\n const queryClientLayer = Layer.provideMerge(\n QueryClientLive,\n Layer.mergeAll(\n Layer.succeed(\n ChainHead,\n ChainHead.of({\n current: () => SubscriptionRef.get(headRef),\n watch: () =>\n Effect.succeed(\n headRef.changes.pipe(Stream.onStart(Deferred.succeed(watchStarted, undefined)))\n ),\n })\n ),\n Layer.provide(\n Layer.effect(\n RpcCache,\n Effect.gen(function* () {\n const base = yield* RpcCache;\n return RpcCache.of({\n ...base,\n invalidateBlock: (blockNumber) =>\n base.invalidateBlock(blockNumber).pipe(\n Effect.tap(() =>\n Ref.update(invalidationsRef, (current) => [...current, blockNumber])\n ),\n Effect.tap(() =>\n blockNumber === 2n\n ? Deferred.succeed(invalidated, undefined).pipe(Effect.asVoid)\n : Effect.void\n )\n ),\n });\n })\n ),\n makeRpcCacheLive({ ttl: 60_000 })\n ),\n RequestDedupLive\n )\n );\n\n return yield* Effect.gen(function* () {\n const queryClient = yield* QueryClient;\n const cache = yield* RpcCache;\n\n let executions = 0;\n const effect = Effect.sync(() => {\n executions += 1;\n return \"value\";\n });\n\n const result1 = yield* queryClient.query(\"key\", effect, {\n blockScoped: true,\n chainId: TEST_CHAIN_ID,\n ttl: 60_000,\n });\n\n expect(yield* cache.get<string>(\"key\")).toBe(\"value\");\n\n yield* Deferred.await(watchStarted);\n\n // Set the new block - this will trigger invalidation via headRef.changes\n yield* SubscriptionRef.set(headRef, 2n);\n\n yield* Deferred.await(invalidated);\n expect(yield* cache.get<string>(\"key\")).toBeNull();\n expect(yield* Ref.get(invalidationsRef)).toContain(2n);\n\n const result2 = yield* queryClient.query(\"key\", effect, {\n blockScoped: true,\n chainId: TEST_CHAIN_ID,\n ttl: 60_000,\n });\n\n expect(result1).toBe(\"value\");\n expect(result2).toBe(\"value\");\n expect(executions).toBe(2);\n }).pipe(Effect.provide(queryClientLayer));\n }).pipe(Effect.scoped)\n );\n});\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"contract-query.js","sourceRoot":"","sources":["../../src/query/contract-query.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"contract-query.js","sourceRoot":"","sources":["../../src/query/contract-query.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Stream } from \"effect\";\nimport { Context, Effect, Layer } from \"effect\";\nimport type { Abi, ContractFunctionName } from \"viem\";\nimport type { ClientNotFoundError, ContractReadError, MulticallError } from \"@/src/core/index.js\";\nimport { ContractReadError as ContractReadErrorClass } from \"@/src/core/index.js\";\nimport { ChainHead } from \"@/src/query/chain-head.js\";\nimport { QueryClient } from \"@/src/query/client.js\";\nimport { MulticallBatcher } from \"@/src/query/multicall-batcher.js\";\nimport type { ContractFunctionReturnType, MulticallCall, ReadParams } from \"@/src/types/index.js\";\n\nexport type ContractQueryReadOptions = {\n readonly ttl?: number | undefined;\n readonly blockScoped?: boolean | undefined;\n};\n\nexport type ContractQueryWatchOptions = ContractQueryReadOptions & {\n readonly refetchOn?: Stream.Stream<unknown, never> | undefined;\n};\n\nexport type ContractQueryShape = {\n readonly read: <\n TAbi extends Abi,\n TFunctionName extends ContractFunctionName<TAbi, \"pure\" | \"view\">,\n >(\n params: ReadParams<TAbi, TFunctionName>,\n options?: ContractQueryReadOptions | undefined\n ) => Effect.Effect<\n ContractFunctionReturnType<TAbi, \"pure\" | \"view\", TFunctionName>,\n ContractReadError | MulticallError | ClientNotFoundError\n >;\n\n readonly watchRead: <\n TAbi extends Abi,\n TFunctionName extends ContractFunctionName<TAbi, \"pure\" | \"view\">,\n >(\n params: ReadParams<TAbi, TFunctionName>,\n options?: ContractQueryWatchOptions | undefined\n ) => Effect.Effect<\n Stream.Stream<\n ContractFunctionReturnType<TAbi, \"pure\" | \"view\", TFunctionName>,\n ContractReadError | MulticallError | ClientNotFoundError\n >,\n ClientNotFoundError\n >;\n};\n\nexport class ContractQuery extends Context.Tag(\"ew3/ContractQuery\")<\n ContractQuery,\n ContractQueryShape\n>() {}\n\nconst stableStringify = (value: unknown): string =>\n JSON.stringify(value, (_, v) => (typeof v === \"bigint\" ? v.toString() : v));\n\nconst stableKey = (params: ReadParams<Abi, string>): string => {\n const args = params.args ?? [];\n return [\n \"contractRead\",\n params.chainId,\n params.address,\n params.account ?? \"no-account\",\n String(params.functionName),\n params.blockNumber?.toString() ?? \"no-block-number\",\n params.blockTag ?? \"no-block-tag\",\n stableStringify(args),\n stableStringify(params.abi),\n ].join(\":\");\n};\n\nconst normalizeReadError = (\n params: ReadParams<Abi, string>,\n cause: unknown\n): ContractReadError | MulticallError | ClientNotFoundError => {\n const anyCause = cause as { _tag?: string } | null;\n if (anyCause && typeof anyCause === \"object\" && \"_tag\" in anyCause) {\n const tag = anyCause._tag;\n if (tag === \"ClientNotFoundError\" || tag === \"MulticallError\") {\n return cause as ClientNotFoundError | MulticallError;\n }\n }\n\n const message = cause instanceof Error ? cause.message : String(cause);\n return new ContractReadErrorClass({\n address: params.address,\n cause,\n functionName: params.functionName as string,\n message,\n });\n};\n\nexport const ContractQueryLive = Layer.effect(\n ContractQuery,\n Effect.gen(function* () {\n const queryClient = yield* QueryClient;\n const chainHead = yield* ChainHead;\n const batcher = yield* MulticallBatcher;\n\n const read = <\n TAbi extends Abi,\n TFunctionName extends ContractFunctionName<TAbi, \"pure\" | \"view\">,\n >(\n params: ReadParams<TAbi, TFunctionName>,\n options?: ContractQueryReadOptions | undefined\n ) => {\n const key = stableKey(params as unknown as ReadParams<Abi, string>);\n const call = {\n abi: params.abi,\n address: params.address,\n args: params.args as unknown as MulticallCall[\"args\"],\n functionName: params.functionName,\n } satisfies MulticallCall;\n\n const effect = batcher\n .enqueue<ContractFunctionReturnType<TAbi, \"pure\" | \"view\", TFunctionName>>(\n params.chainId,\n call,\n {\n blockNumber: params.blockNumber,\n blockTag: params.blockTag,\n }\n )\n .pipe(\n Effect.mapError((cause) =>\n normalizeReadError(params as unknown as ReadParams<Abi, string>, cause)\n )\n );\n\n return queryClient.query(key, effect, {\n blockScoped: options?.blockScoped ?? true,\n chainId: params.chainId,\n ttl: options?.ttl,\n });\n };\n\n const watchRead = <\n TAbi extends Abi,\n TFunctionName extends ContractFunctionName<TAbi, \"pure\" | \"view\">,\n >(\n params: ReadParams<TAbi, TFunctionName>,\n options?: ContractQueryWatchOptions | undefined\n ) =>\n Effect.gen(function* () {\n const refetchOn = options?.refetchOn ?? (yield* chainHead.watch(params.chainId));\n const key = stableKey(params as unknown as ReadParams<Abi, string>);\n\n const effect = read(params, options);\n return queryClient.watch(key, effect, {\n blockScoped: options?.blockScoped ?? true,\n chainId: params.chainId,\n refetchOn,\n ttl: options?.ttl,\n });\n });\n\n return ContractQuery.of({ read, watchRead });\n })\n);\n"]}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=contract-query.test.integration.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"contract-query.test.integration.d.ts","sourceRoot":"","sources":["../../src/query/contract-query.test.integration.ts"],"names":[],"mappings":""}
@@ -0,0 +1,133 @@
1
+ import { describe, expect, it } from "@effect/vitest";
2
+ import { Effect, Layer, Stream } from "effect";
3
+ import { erc20Abi } from "viem";
4
+ import { ContractReader } from "../contract/index.js";
5
+ import { ChainHead, ContractQuery, ContractQueryLive, MulticallBatcherLive, QueryClientLive, } from "../query/index.js";
6
+ import { makeRpcCacheLive, RequestDedupLive } from "../rpc/index.js";
7
+ import { TEST_ADDRESS, TEST_ADDRESS_2, TEST_CHAIN_ID } from "../testing-kit/index.js";
8
+ describe("ContractQuery", () => {
9
+ it.effect("batches concurrent reads into a single multicall", () => Effect.gen(function* () {
10
+ let multicallCount = 0;
11
+ let lastBatchSize = 0;
12
+ const contractReaderLayer = Layer.succeed(ContractReader, ContractReader.of({
13
+ multicall: (_chainId, calls) => {
14
+ multicallCount += 1;
15
+ lastBatchSize = calls.length;
16
+ return Effect.succeed(calls.map((_, i) => ({
17
+ result: BigInt(i + 1),
18
+ status: "success",
19
+ })));
20
+ },
21
+ read: () => Effect.succeed(0n),
22
+ }));
23
+ const chainHeadLayer = Layer.succeed(ChainHead, ChainHead.of({
24
+ current: () => Effect.succeed(1n),
25
+ watch: () => Effect.succeed(Stream.empty),
26
+ }));
27
+ const queryClientLayer = Layer.provideMerge(QueryClientLive, Layer.mergeAll(chainHeadLayer, makeRpcCacheLive({ ttl: 60_000 }), RequestDedupLive));
28
+ const multicallBatcherLayer = Layer.provideMerge(MulticallBatcherLive, contractReaderLayer);
29
+ const contractQueryLayer = Layer.provide(ContractQueryLive, Layer.mergeAll(queryClientLayer, multicallBatcherLayer));
30
+ const contractQuery = yield* ContractQuery.pipe(Effect.provide(contractQueryLayer));
31
+ const [r1, r2, r3] = yield* Effect.all([
32
+ contractQuery.read({
33
+ abi: erc20Abi,
34
+ address: TEST_ADDRESS,
35
+ args: [TEST_ADDRESS],
36
+ chainId: TEST_CHAIN_ID,
37
+ functionName: "balanceOf",
38
+ }),
39
+ contractQuery.read({
40
+ abi: erc20Abi,
41
+ address: TEST_ADDRESS,
42
+ args: [TEST_ADDRESS_2],
43
+ chainId: TEST_CHAIN_ID,
44
+ functionName: "balanceOf",
45
+ }),
46
+ contractQuery.read({
47
+ abi: erc20Abi,
48
+ address: TEST_ADDRESS,
49
+ chainId: TEST_CHAIN_ID,
50
+ functionName: "totalSupply",
51
+ }),
52
+ ], { batching: true, concurrency: 3 });
53
+ expect(r1).toBe(1n);
54
+ expect(r2).toBe(2n);
55
+ expect(r3).toBe(3n);
56
+ expect(multicallCount).toBe(1);
57
+ expect(lastBatchSize).toBe(3);
58
+ }).pipe(Effect.scoped));
59
+ it.effect("caches identical reads (no additional multicall)", () => Effect.gen(function* () {
60
+ let multicallCount = 0;
61
+ const contractReaderLayer = Layer.succeed(ContractReader, ContractReader.of({
62
+ multicall: (_chainId, calls) => {
63
+ multicallCount += 1;
64
+ return Effect.succeed(calls.map(() => ({
65
+ result: 123n,
66
+ status: "success",
67
+ })));
68
+ },
69
+ read: () => Effect.succeed(0n),
70
+ }));
71
+ const chainHeadLayer = Layer.succeed(ChainHead, ChainHead.of({
72
+ current: () => Effect.succeed(1n),
73
+ watch: () => Effect.succeed(Stream.empty),
74
+ }));
75
+ const queryClientLayer = Layer.provideMerge(QueryClientLive, Layer.mergeAll(chainHeadLayer, makeRpcCacheLive({ ttl: 60_000 }), RequestDedupLive));
76
+ const multicallBatcherLayer = Layer.provideMerge(MulticallBatcherLive, contractReaderLayer);
77
+ const contractQueryLayer = Layer.provide(ContractQueryLive, Layer.mergeAll(queryClientLayer, multicallBatcherLayer));
78
+ const contractQuery = yield* ContractQuery.pipe(Effect.provide(contractQueryLayer));
79
+ const params = {
80
+ abi: erc20Abi,
81
+ address: TEST_ADDRESS,
82
+ args: [TEST_ADDRESS],
83
+ chainId: TEST_CHAIN_ID,
84
+ functionName: "balanceOf",
85
+ };
86
+ const r1 = yield* contractQuery.read(params);
87
+ const r2 = yield* contractQuery.read(params);
88
+ expect(r1).toBe(123n);
89
+ expect(r2).toBe(123n);
90
+ expect(multicallCount).toBe(1);
91
+ }).pipe(Effect.scoped));
92
+ it.effect("does not crash when args contain BigInt (cache key)", () => Effect.gen(function* () {
93
+ let multicallCount = 0;
94
+ const bigintArgAbi = [
95
+ {
96
+ inputs: [{ name: "x", type: "uint256" }],
97
+ name: "echo",
98
+ outputs: [{ name: "y", type: "uint256" }],
99
+ stateMutability: "view",
100
+ type: "function",
101
+ },
102
+ ];
103
+ const contractReaderLayer = Layer.succeed(ContractReader, ContractReader.of({
104
+ multicall: (_chainId, calls) => {
105
+ multicallCount += 1;
106
+ expect(calls).toHaveLength(1);
107
+ return Effect.succeed([{ result: 456n, status: "success" }]);
108
+ },
109
+ read: () => Effect.succeed(0n),
110
+ }));
111
+ const chainHeadLayer = Layer.succeed(ChainHead, ChainHead.of({
112
+ current: () => Effect.succeed(1n),
113
+ watch: () => Effect.succeed(Stream.empty),
114
+ }));
115
+ const queryClientLayer = Layer.provideMerge(QueryClientLive, Layer.mergeAll(chainHeadLayer, makeRpcCacheLive({ ttl: 60_000 }), RequestDedupLive));
116
+ const multicallBatcherLayer = Layer.provideMerge(MulticallBatcherLive, contractReaderLayer);
117
+ const contractQueryLayer = Layer.provide(ContractQueryLive, Layer.mergeAll(queryClientLayer, multicallBatcherLayer));
118
+ const contractQuery = yield* ContractQuery.pipe(Effect.provide(contractQueryLayer));
119
+ const params = {
120
+ abi: bigintArgAbi,
121
+ address: TEST_ADDRESS,
122
+ args: [1n],
123
+ chainId: TEST_CHAIN_ID,
124
+ functionName: "echo",
125
+ };
126
+ const r1 = yield* contractQuery.read(params);
127
+ const r2 = yield* contractQuery.read(params);
128
+ expect(r1).toBe(456n);
129
+ expect(r2).toBe(456n);
130
+ expect(multicallCount).toBe(1);
131
+ }).pipe(Effect.scoped));
132
+ });
133
+ //# sourceMappingURL=contract-query.test.integration.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"contract-query.test.integration.js","sourceRoot":"","sources":["../../src/query/contract-query.test.integration.ts"],"names":[],"mappings":"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","sourcesContent":["import { describe, expect, it } from \"@effect/vitest\";\nimport { Effect, Layer, Stream } from \"effect\";\nimport type { Abi } from \"viem\";\nimport { erc20Abi } from \"viem\";\nimport { ContractReader } from \"@/src/contract/index.js\";\nimport {\n ChainHead,\n ContractQuery,\n ContractQueryLive,\n MulticallBatcherLive,\n QueryClientLive,\n} from \"@/src/query/index.js\";\nimport { makeRpcCacheLive, RequestDedupLive } from \"@/src/rpc/index.js\";\nimport { TEST_ADDRESS, TEST_ADDRESS_2, TEST_CHAIN_ID } from \"@/src/testing-kit/index.js\";\n\ndescribe(\"ContractQuery\", () => {\n it.effect(\"batches concurrent reads into a single multicall\", () =>\n Effect.gen(function* () {\n let multicallCount = 0;\n let lastBatchSize = 0;\n\n const contractReaderLayer = Layer.succeed(\n ContractReader,\n ContractReader.of({\n multicall: (_chainId, calls) => {\n multicallCount += 1;\n lastBatchSize = calls.length;\n return Effect.succeed(\n calls.map((_, i) => ({\n result: BigInt(i + 1),\n status: \"success\" as const,\n })) as any\n );\n },\n read: () => Effect.succeed(0n as any),\n })\n );\n\n const chainHeadLayer = Layer.succeed(\n ChainHead,\n ChainHead.of({\n current: () => Effect.succeed(1n),\n watch: () => Effect.succeed(Stream.empty),\n })\n );\n\n const queryClientLayer = Layer.provideMerge(\n QueryClientLive,\n Layer.mergeAll(chainHeadLayer, makeRpcCacheLive({ ttl: 60_000 }), RequestDedupLive)\n );\n\n const multicallBatcherLayer = Layer.provideMerge(MulticallBatcherLive, contractReaderLayer);\n\n const contractQueryLayer = Layer.provide(\n ContractQueryLive,\n Layer.mergeAll(queryClientLayer, multicallBatcherLayer)\n );\n\n const contractQuery = yield* ContractQuery.pipe(Effect.provide(contractQueryLayer));\n\n // Use batching: true to enable request batching for concurrent effects\n const [r1, r2, r3] = yield* Effect.all(\n [\n contractQuery.read({\n abi: erc20Abi,\n address: TEST_ADDRESS,\n args: [TEST_ADDRESS] as const,\n chainId: TEST_CHAIN_ID,\n functionName: \"balanceOf\",\n }),\n contractQuery.read({\n abi: erc20Abi,\n address: TEST_ADDRESS,\n args: [TEST_ADDRESS_2] as const,\n chainId: TEST_CHAIN_ID,\n functionName: \"balanceOf\",\n }),\n contractQuery.read({\n abi: erc20Abi,\n address: TEST_ADDRESS,\n chainId: TEST_CHAIN_ID,\n functionName: \"totalSupply\",\n }),\n ],\n { batching: true, concurrency: 3 }\n );\n\n expect(r1).toBe(1n);\n expect(r2).toBe(2n);\n expect(r3).toBe(3n);\n expect(multicallCount).toBe(1);\n expect(lastBatchSize).toBe(3);\n }).pipe(Effect.scoped)\n );\n\n it.effect(\"caches identical reads (no additional multicall)\", () =>\n Effect.gen(function* () {\n let multicallCount = 0;\n\n const contractReaderLayer = Layer.succeed(\n ContractReader,\n ContractReader.of({\n multicall: (_chainId, calls) => {\n multicallCount += 1;\n return Effect.succeed(\n calls.map(() => ({\n result: 123n,\n status: \"success\" as const,\n })) as any\n );\n },\n read: () => Effect.succeed(0n as any),\n })\n );\n\n const chainHeadLayer = Layer.succeed(\n ChainHead,\n ChainHead.of({\n current: () => Effect.succeed(1n),\n watch: () => Effect.succeed(Stream.empty),\n })\n );\n\n const queryClientLayer = Layer.provideMerge(\n QueryClientLive,\n Layer.mergeAll(chainHeadLayer, makeRpcCacheLive({ ttl: 60_000 }), RequestDedupLive)\n );\n\n const multicallBatcherLayer = Layer.provideMerge(MulticallBatcherLive, contractReaderLayer);\n\n const contractQueryLayer = Layer.provide(\n ContractQueryLive,\n Layer.mergeAll(queryClientLayer, multicallBatcherLayer)\n );\n\n const contractQuery = yield* ContractQuery.pipe(Effect.provide(contractQueryLayer));\n\n const params = {\n abi: erc20Abi,\n address: TEST_ADDRESS,\n args: [TEST_ADDRESS] as const,\n chainId: TEST_CHAIN_ID,\n functionName: \"balanceOf\" as const,\n };\n\n const r1 = yield* contractQuery.read(params);\n const r2 = yield* contractQuery.read(params);\n\n expect(r1).toBe(123n);\n expect(r2).toBe(123n);\n expect(multicallCount).toBe(1);\n }).pipe(Effect.scoped)\n );\n\n it.effect(\"does not crash when args contain BigInt (cache key)\", () =>\n Effect.gen(function* () {\n let multicallCount = 0;\n\n const bigintArgAbi = [\n {\n inputs: [{ name: \"x\", type: \"uint256\" }],\n name: \"echo\",\n outputs: [{ name: \"y\", type: \"uint256\" }],\n stateMutability: \"view\",\n type: \"function\",\n },\n ] as const satisfies Abi;\n\n const contractReaderLayer = Layer.succeed(\n ContractReader,\n ContractReader.of({\n multicall: (_chainId, calls) => {\n multicallCount += 1;\n expect(calls).toHaveLength(1);\n return Effect.succeed([{ result: 456n, status: \"success\" as const }] as any);\n },\n read: () => Effect.succeed(0n as any),\n })\n );\n\n const chainHeadLayer = Layer.succeed(\n ChainHead,\n ChainHead.of({\n current: () => Effect.succeed(1n),\n watch: () => Effect.succeed(Stream.empty),\n })\n );\n\n const queryClientLayer = Layer.provideMerge(\n QueryClientLive,\n Layer.mergeAll(chainHeadLayer, makeRpcCacheLive({ ttl: 60_000 }), RequestDedupLive)\n );\n\n const multicallBatcherLayer = Layer.provideMerge(MulticallBatcherLive, contractReaderLayer);\n\n const contractQueryLayer = Layer.provide(\n ContractQueryLive,\n Layer.mergeAll(queryClientLayer, multicallBatcherLayer)\n );\n\n const contractQuery = yield* ContractQuery.pipe(Effect.provide(contractQueryLayer));\n\n const params = {\n abi: bigintArgAbi,\n address: TEST_ADDRESS,\n args: [1n] as const,\n chainId: TEST_CHAIN_ID,\n functionName: \"echo\" as const,\n };\n\n const r1 = yield* contractQuery.read(params);\n const r2 = yield* contractQuery.read(params);\n\n expect(r1).toBe(456n);\n expect(r2).toBe(456n);\n expect(multicallCount).toBe(1);\n }).pipe(Effect.scoped)\n );\n});\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/query/index.ts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAC;AAChC,cAAc,aAAa,CAAC;AAC5B,cAAc,qBAAqB,CAAC;AACpC,cAAc,wBAAwB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/query/index.ts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAC;AAChC,cAAc,aAAa,CAAC;AAC5B,cAAc,qBAAqB,CAAC;AACpC,cAAc,wBAAwB,CAAC","sourcesContent":["export * from \"./chain-head.js\";\nexport * from \"./client.js\";\nexport * from \"./contract-query.js\";\nexport * from \"./multicall-batcher.js\";\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"multicall-batcher.js","sourceRoot":"","sources":["../../src/query/multicall-batcher.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"multicall-batcher.js","sourceRoot":"","sources":["../../src/query/multicall-batcher.ts"],"names":[],"mappings":"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","sourcesContent":["import { Context, Effect, Layer, Request, RequestResolver } from \"effect\";\nimport type { ContractReaderShape } from \"@/src/contract/index.js\";\nimport { ContractReader } from \"@/src/contract/index.js\";\nimport type { MulticallCall } from \"@/src/types/index.js\";\n\nexport type MulticallBatchOptions = {\n readonly blockNumber?: bigint | undefined;\n readonly blockTag?: import(\"viem\").BlockTag | undefined;\n};\n\n/**\n * Request type for multicall batching.\n * Each request represents a single contract call to be batched.\n */\ninterface MulticallRequest extends Request.Request<unknown, Error> {\n readonly _tag: \"MulticallRequest\";\n readonly chainId: number;\n readonly call: MulticallCall;\n readonly options?: MulticallBatchOptions | undefined;\n}\n\nconst MulticallRequest = Request.tagged<MulticallRequest>(\"MulticallRequest\");\n\n/**\n * Generate a stable cache key for grouping requests by chainId and options.\n */\nconst stableStringify = (value: unknown): string =>\n JSON.stringify(value, (_, v) => (typeof v === \"bigint\" ? v.toString() : v));\n\nconst keyFor = (chainId: number, options?: MulticallBatchOptions | undefined): string =>\n `${chainId}:${stableStringify(options ?? {})}`;\n\ntype RequestGroup = {\n chainId: number;\n options?: MulticallBatchOptions | undefined;\n requests: readonly MulticallRequest[];\n};\n\n/**\n * Group requests by chainId and block options.\n */\nconst groupRequests = (requests: readonly MulticallRequest[]): Map<string, RequestGroup> => {\n const grouped = new Map<string, RequestGroup>();\n\n for (const req of requests) {\n const key = keyFor(req.chainId, req.options);\n const existing = grouped.get(key);\n if (existing) {\n grouped.set(key, {\n ...existing,\n requests: [...existing.requests, req],\n });\n } else {\n grouped.set(key, {\n chainId: req.chainId,\n options: req.options,\n requests: [req],\n });\n }\n }\n\n return grouped;\n};\n\n/**\n * Complete all requests in a group with a failure.\n */\nconst failGroup = (requests: readonly MulticallRequest[], error: Error) =>\n Effect.forEach(requests, (req) => Request.completeEffect(req, Effect.fail(error)), {\n discard: true,\n });\n\n/**\n * Complete all requests in a group with their corresponding results.\n */\nconst completeGroup = (\n requests: readonly MulticallRequest[],\n results: readonly {\n status: \"success\" | \"failure\";\n result?: unknown;\n error?: Error;\n }[]\n) =>\n Effect.forEach(\n requests,\n (req, i) => {\n const res = results[i];\n if (res?.status === \"success\") {\n return Request.completeEffect(req, Effect.succeed(res.result));\n }\n return Request.completeEffect(\n req,\n Effect.fail(res?.error ?? new Error(\"Unknown multicall error\"))\n );\n },\n { discard: true }\n );\n\n/**\n * Execute a single multicall group and complete all requests.\n */\nconst executeGroup = (contractReader: ContractReaderShape, group: RequestGroup) =>\n Effect.gen(function* () {\n const result = yield* contractReader\n .multicall(\n group.chainId,\n group.requests.map((r) => r.call),\n group.options\n )\n .pipe(Effect.either);\n\n if (result._tag === \"Left\") {\n const error = result.left instanceof Error ? result.left : new Error(String(result.left));\n yield* failGroup(group.requests, error);\n } else {\n yield* completeGroup(group.requests, result.right);\n }\n });\n\n/**\n * Creates a batched RequestResolver that groups multicall requests by chainId and options.\n */\nconst makeMulticallResolver = (\n contractReader: ContractReaderShape\n): RequestResolver.RequestResolver<MulticallRequest, never> =>\n RequestResolver.makeBatched((requests: readonly MulticallRequest[]) =>\n Effect.gen(function* () {\n const grouped = groupRequests(requests);\n\n // Execute groups in parallel (cross-chain requests can run concurrently)\n yield* Effect.all(\n [...grouped.values()].map((group) => executeGroup(contractReader, group)),\n { concurrency: \"unbounded\" }\n );\n })\n ).pipe(RequestResolver.batchN(100));\n\nexport type MulticallBatcherShape = {\n readonly enqueue: <A>(\n chainId: number,\n call: MulticallCall,\n options?: MulticallBatchOptions | undefined\n ) => Effect.Effect<A, Error>;\n};\n\nexport class MulticallBatcher extends Context.Tag(\"ew3/MulticallBatcher\")<\n MulticallBatcher,\n MulticallBatcherShape\n>() {}\n\n/**\n * Live implementation of MulticallBatcher using Effect's Request/RequestResolver.\n * Automatically batches and deduplicates multicall requests across concurrent fibers.\n */\nexport const MulticallBatcherLive = Layer.effect(\n MulticallBatcher,\n Effect.gen(function* () {\n const contractReader = yield* ContractReader;\n const resolver = makeMulticallResolver(contractReader);\n\n return MulticallBatcher.of({\n enqueue: <A>(chainId: number, call: MulticallCall, options?: MulticallBatchOptions) =>\n Effect.request(MulticallRequest({ call, chainId, options }), resolver) as Effect.Effect<\n A,\n Error\n >,\n });\n })\n);\n"]}
@@ -4,6 +4,4 @@ export type { EffectEvmLayerProviderProps, EffectEvmProviderProps, } from "../in
4
4
  export { EffectEvmLayerProvider, EffectEvmProvider, EffectEvmProviderSync, useEffectEvmLayer, useEffectEvmRuntime, } from "../integrations/react-hooks/provider.js";
5
5
  export type { WalletProviderRefActions } from "../integrations/react-hooks/wallet-provider-ref.js";
6
6
  export { useWalletProviderRef } from "../integrations/react-hooks/wallet-provider-ref.js";
7
- export { useIsSafeMultisig } from "./use-is-safe-multisig.js";
8
- export { useSafeContext } from "./use-safe-context.js";
9
7
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/react-hooks/index.ts"],"names":[],"mappings":"AAEA,YAAY,EACV,iBAAiB,EACjB,WAAW,EACX,eAAe,GAChB,MAAM,8CAA8C,CAAC;AACtD,OAAO,EACL,aAAa,EACb,oBAAoB,EACpB,aAAa,EACb,aAAa,EACb,SAAS,EACT,eAAe,EACf,cAAc,EACd,kBAAkB,EAClB,uBAAuB,GACxB,MAAM,8CAA8C,CAAC;AACtD,YAAY,EACV,2BAA2B,EAC3B,sBAAsB,GACvB,MAAM,4CAA4C,CAAC;AACpD,OAAO,EACL,sBAAsB,EACtB,iBAAiB,EACjB,qBAAqB,EACrB,iBAAiB,EACjB,mBAAmB,GACpB,MAAM,4CAA4C,CAAC;AACpD,YAAY,EAAE,wBAAwB,EAAE,MAAM,uDAAuD,CAAC;AACtG,OAAO,EAAE,oBAAoB,EAAE,MAAM,uDAAuD,CAAC;AAC7F,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAC9D,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/react-hooks/index.ts"],"names":[],"mappings":"AAEA,YAAY,EACV,iBAAiB,EACjB,WAAW,EACX,eAAe,GAChB,MAAM,8CAA8C,CAAC;AACtD,OAAO,EACL,aAAa,EACb,oBAAoB,EACpB,aAAa,EACb,aAAa,EACb,SAAS,EACT,eAAe,EACf,cAAc,EACd,kBAAkB,EAClB,uBAAuB,GACxB,MAAM,8CAA8C,CAAC;AACtD,YAAY,EACV,2BAA2B,EAC3B,sBAAsB,GACvB,MAAM,4CAA4C,CAAC;AACpD,OAAO,EACL,sBAAsB,EACtB,iBAAiB,EACjB,qBAAqB,EACrB,iBAAiB,EACjB,mBAAmB,GACpB,MAAM,4CAA4C,CAAC;AACpD,YAAY,EAAE,wBAAwB,EAAE,MAAM,uDAAuD,CAAC;AACtG,OAAO,EAAE,oBAAoB,EAAE,MAAM,uDAAuD,CAAC"}
@@ -2,6 +2,4 @@
2
2
  export { useEffectMemo, useEffectMemoFactory, useEffectOnce, useForkEffect, useStream, useStreamEffect, useStreamValue, useSubscriptionRef, useSubscriptionRefValue, } from "../integrations/react-hooks/primitives.js";
3
3
  export { EffectEvmLayerProvider, EffectEvmProvider, EffectEvmProviderSync, useEffectEvmLayer, useEffectEvmRuntime, } from "../integrations/react-hooks/provider.js";
4
4
  export { useWalletProviderRef } from "../integrations/react-hooks/wallet-provider-ref.js";
5
- export { useIsSafeMultisig } from "./use-is-safe-multisig.js";
6
- export { useSafeContext } from "./use-safe-context.js";
7
5
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/react-hooks/index.ts"],"names":[],"mappings":"AAAA,YAAY,CAAC;AAOb,OAAO,EACL,aAAa,EACb,oBAAoB,EACpB,aAAa,EACb,aAAa,EACb,SAAS,EACT,eAAe,EACf,cAAc,EACd,kBAAkB,EAClB,uBAAuB,GACxB,MAAM,8CAA8C,CAAC;AAKtD,OAAO,EACL,sBAAsB,EACtB,iBAAiB,EACjB,qBAAqB,EACrB,iBAAiB,EACjB,mBAAmB,GACpB,MAAM,4CAA4C,CAAC;AAEpD,OAAO,EAAE,oBAAoB,EAAE,MAAM,uDAAuD,CAAC;AAC7F,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAC9D,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/react-hooks/index.ts"],"names":[],"mappings":"AAAA,YAAY,CAAC;AAOb,OAAO,EACL,aAAa,EACb,oBAAoB,EACpB,aAAa,EACb,aAAa,EACb,SAAS,EACT,eAAe,EACf,cAAc,EACd,kBAAkB,EAClB,uBAAuB,GACxB,MAAM,8CAA8C,CAAC;AAKtD,OAAO,EACL,sBAAsB,EACtB,iBAAiB,EACjB,qBAAqB,EACrB,iBAAiB,EACjB,mBAAmB,GACpB,MAAM,4CAA4C,CAAC;AAEpD,OAAO,EAAE,oBAAoB,EAAE,MAAM,uDAAuD,CAAC","sourcesContent":["\"use client\";\n\nexport type {\n EffectMemoOptions,\n StreamState,\n UseEffectResult,\n} from \"@/src/integrations/react-hooks/primitives.js\";\nexport {\n useEffectMemo,\n useEffectMemoFactory,\n useEffectOnce,\n useForkEffect,\n useStream,\n useStreamEffect,\n useStreamValue,\n useSubscriptionRef,\n useSubscriptionRefValue,\n} from \"@/src/integrations/react-hooks/primitives.js\";\nexport type {\n EffectEvmLayerProviderProps,\n EffectEvmProviderProps,\n} from \"@/src/integrations/react-hooks/provider.js\";\nexport {\n EffectEvmLayerProvider,\n EffectEvmProvider,\n EffectEvmProviderSync,\n useEffectEvmLayer,\n useEffectEvmRuntime,\n} from \"@/src/integrations/react-hooks/provider.js\";\nexport type { WalletProviderRefActions } from \"@/src/integrations/react-hooks/wallet-provider-ref.js\";\nexport { useWalletProviderRef } from \"@/src/integrations/react-hooks/wallet-provider-ref.js\";\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/react-hooks/wagmi/index.ts"],"names":[],"mappings":"AAAA,YAAY,CAAC;AAEb,cAAc,+CAA+C,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/react-hooks/wagmi/index.ts"],"names":[],"mappings":"AAAA,YAAY,CAAC;AAEb,cAAc,+CAA+C,CAAC","sourcesContent":["\"use client\";\n\nexport * from \"@/src/integrations/react-hooks/wagmi/index.js\";\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"cache.js","sourceRoot":"","sources":["../../src/rpc/cache.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"cache.js","sourceRoot":"","sources":["../../src/rpc/cache.ts"],"names":[],"mappings":"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","sourcesContent":["import { Clock, Context, Effect, Layer, Ref } from \"effect\";\n\nexport type CacheConfig = {\n ttl?: number; // default 12_000ms (1 block)\n maxSize?: number; // default 100 entries\n blockScoped?: boolean; // default true - invalidate on new block\n};\n\nexport type CacheEntry<T> = {\n value: T;\n timestamp: number;\n blockNumber?: bigint;\n ttl?: number;\n};\n\nexport type RpcCacheShape = {\n readonly get: <T>(key: string) => Effect.Effect<T | null>;\n readonly set: <T>(\n key: string,\n value: T,\n blockNumber?: bigint,\n ttl?: number\n ) => Effect.Effect<void>;\n readonly invalidate: (key: string) => Effect.Effect<void>;\n readonly invalidateBlock: (blockNumber: bigint) => Effect.Effect<void>;\n readonly clear: Effect.Effect<void>;\n};\n\nexport class RpcCache extends Context.Tag(\"ew3/RpcCache\")<RpcCache, RpcCacheShape>() {}\n\n/**\n * Create a cache layer with LRU eviction using Effect's Cache module\n */\nexport const makeRpcCacheLive = (config?: CacheConfig): Layer.Layer<RpcCache> => {\n const defaultTtl = config?.ttl ?? 12_000;\n const maxSize = config?.maxSize ?? 100;\n const blockScoped = config?.blockScoped ?? true;\n\n return Layer.effect(\n RpcCache,\n Effect.gen(function* () {\n // Store cache entries with timestamps and metadata\n const entriesRef = yield* Ref.make(new Map<string, CacheEntry<unknown>>());\n // Track access order for LRU eviction\n const accessOrderRef = yield* Ref.make(new Map<string, number>());\n const accessCounterRef = yield* Ref.make(0);\n\n // Evict the least recently used entry when at capacity\n const evictOldest = Effect.gen(function* () {\n const entries = yield* Ref.get(entriesRef);\n const accessOrder = yield* Ref.get(accessOrderRef);\n\n if (entries.size >= maxSize) {\n // Find the key with the lowest access counter (oldest)\n let oldestKey: string | null = null;\n let oldestAccess = Number.POSITIVE_INFINITY;\n\n for (const [key, access] of accessOrder.entries()) {\n if (access < oldestAccess) {\n oldestAccess = access;\n oldestKey = key;\n }\n }\n\n if (oldestKey) {\n const keyToEvict = oldestKey;\n yield* Ref.update(entriesRef, (e) => {\n const newEntries = new Map(e);\n newEntries.delete(keyToEvict);\n return newEntries;\n });\n yield* Ref.update(accessOrderRef, (o) => {\n const newAccessOrder = new Map(o);\n newAccessOrder.delete(keyToEvict);\n return newAccessOrder;\n });\n }\n }\n });\n\n const get = <T>(key: string): Effect.Effect<T | null> =>\n Effect.gen(function* () {\n const entries = yield* Ref.get(entriesRef);\n const entry = entries.get(key);\n\n if (!entry) {\n return null;\n }\n\n // Check TTL expiration\n const now = yield* Clock.currentTimeMillis;\n const entryTtl = entry.ttl ?? defaultTtl;\n\n if (now - entry.timestamp > entryTtl) {\n // Expired - remove it\n yield* Ref.update(entriesRef, (e) => {\n const newEntries = new Map(e);\n newEntries.delete(key);\n return newEntries;\n });\n yield* Ref.update(accessOrderRef, (o) => {\n const newAccessOrder = new Map(o);\n newAccessOrder.delete(key);\n return newAccessOrder;\n });\n return null;\n }\n\n // Update access order for LRU\n const accessCounter = yield* Ref.updateAndGet(accessCounterRef, (n) => n + 1);\n yield* Ref.update(accessOrderRef, (o) => {\n const newAccessOrder = new Map(o);\n newAccessOrder.set(key, accessCounter);\n return newAccessOrder;\n });\n\n return entry.value as T;\n });\n\n const set = <T>(\n key: string,\n value: T,\n blockNumber?: bigint,\n entryTtl?: number\n ): Effect.Effect<void> =>\n Effect.gen(function* () {\n const now = yield* Clock.currentTimeMillis;\n\n // Evict oldest entry if at capacity\n yield* evictOldest;\n\n // Store entry with timestamp\n yield* Ref.update(entriesRef, (entries) => {\n const newEntries = new Map(entries);\n newEntries.set(key, {\n blockNumber,\n timestamp: now,\n ttl: entryTtl,\n value,\n });\n return newEntries;\n });\n\n // Update access order for LRU\n const accessCounter = yield* Ref.updateAndGet(accessCounterRef, (n) => n + 1);\n yield* Ref.update(accessOrderRef, (o) => {\n const newAccessOrder = new Map(o);\n newAccessOrder.set(key, accessCounter);\n return newAccessOrder;\n });\n });\n\n const invalidate = (key: string): Effect.Effect<void> =>\n Effect.gen(function* () {\n yield* Ref.update(entriesRef, (entries) => {\n const newEntries = new Map(entries);\n newEntries.delete(key);\n return newEntries;\n });\n yield* Ref.update(accessOrderRef, (o) => {\n const newAccessOrder = new Map(o);\n newAccessOrder.delete(key);\n return newAccessOrder;\n });\n });\n\n const invalidateBlock = (blockNumber: bigint): Effect.Effect<void> =>\n Effect.gen(function* () {\n if (!blockScoped) {\n return;\n }\n\n const entries = yield* Ref.get(entriesRef);\n const keysToInvalidate: string[] = [];\n\n for (const [key, entry] of entries.entries()) {\n if (entry.blockNumber !== undefined && entry.blockNumber < blockNumber) {\n keysToInvalidate.push(key);\n }\n }\n\n // Invalidate all matching keys\n yield* Effect.all(\n keysToInvalidate.map((key) => invalidate(key)),\n { concurrency: \"unbounded\" }\n );\n });\n\n const clear: Effect.Effect<void> = Effect.gen(function* () {\n yield* Ref.set(entriesRef, new Map());\n yield* Ref.set(accessOrderRef, new Map());\n yield* Ref.set(accessCounterRef, 0);\n });\n\n return {\n clear,\n get,\n invalidate,\n invalidateBlock,\n set,\n } satisfies RpcCacheShape;\n })\n );\n};\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"circuit-breaker.js","sourceRoot":"","sources":["../../src/rpc/circuit-breaker.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"circuit-breaker.js","sourceRoot":"","sources":["../../src/rpc/circuit-breaker.ts"],"names":[],"mappings":"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","sourcesContent":["import { Clock, Config, Effect, Ref, Schema } from \"effect\";\nimport { DEFAULT_MAX_DELAY } from \"@/src/constants/index.js\";\n\nexport type CircuitState = \"closed\" | \"open\" | \"half-open\";\n\nexport type CircuitBreakerConfig = {\n /** Number of failures before opening the circuit (default: 5) */\n failureThreshold?: number;\n /** Time in milliseconds before attempting recovery (default: 30_000) */\n resetTimeout?: number;\n /** Number of successes needed to close from half-open (default: 2) */\n successThreshold?: number;\n};\n\n/**\n * Config-based circuit breaker configuration from environment variables.\n *\n * Environment variables (all optional, nested under `EW3_CIRCUIT_BREAKER_` prefix):\n * - `EW3_CIRCUIT_BREAKER_FAILURE_THRESHOLD`: Number of failures before opening circuit (default: 5)\n * - `EW3_CIRCUIT_BREAKER_SUCCESS_THRESHOLD`: Number of successes needed to close from half-open (default: 3)\n * - `EW3_CIRCUIT_BREAKER_RESET_TIMEOUT`: Time in ms before attempting recovery (default: 30_000)\n *\n * @example\n * ```typescript\n * import { Effect } from \"effect\";\n * import { CircuitBreakerConfigFromEnv } from \"effect-evm/rpc\";\n *\n * const program = Effect.gen(function* () {\n * const config = yield* CircuitBreakerConfigFromEnv;\n * // Use config for circuit breaker\n * });\n * ```\n */\nexport const CircuitBreakerConfigFromEnv = Config.all({\n failureThreshold: Config.number(\"FAILURE_THRESHOLD\").pipe(Config.withDefault(5)),\n resetTimeout: Config.number(\"RESET_TIMEOUT\").pipe(Config.withDefault(30_000)),\n successThreshold: Config.number(\"SUCCESS_THRESHOLD\").pipe(Config.withDefault(3)),\n}).pipe(Config.nested(\"EW3_CIRCUIT_BREAKER\"));\n\n/**\n * Error thrown when circuit breaker is open\n */\nexport class CircuitOpenError extends Schema.TaggedError<CircuitOpenError>()(\"CircuitOpenError\", {\n message: Schema.String,\n openedAt: Schema.Number,\n}) {}\n\n/**\n * Internal state tracking for circuit breaker\n */\ntype CircuitBreakerState = {\n state: CircuitState;\n failures: number;\n successes: number;\n lastFailureTime: number;\n};\n\n/**\n * Circuit breaker service definition\n */\nexport type CircuitBreaker = {\n /** Execute an effect with circuit breaker protection */\n readonly execute: <A, E, R>(\n effect: Effect.Effect<A, E, R>\n ) => Effect.Effect<A, E | CircuitOpenError, R>;\n /** Get current circuit state */\n readonly getState: Effect.Effect<CircuitState>;\n /** Manually reset the circuit to closed state */\n readonly reset: Effect.Effect<void>;\n};\n\n/**\n * Create a circuit breaker instance\n * Uses Ref for thread-safe state management\n *\n * @param config - Circuit breaker configuration options\n * @returns Effect that creates a new CircuitBreaker\n */\nexport const makeCircuitBreaker = (\n config?: CircuitBreakerConfig\n): Effect.Effect<CircuitBreaker> => {\n const {\n failureThreshold = 5,\n resetTimeout = DEFAULT_MAX_DELAY,\n successThreshold = 2,\n } = config ?? {};\n\n return Effect.gen(function* () {\n const stateRef = yield* Ref.make<CircuitBreakerState>({\n failures: 0,\n lastFailureTime: 0,\n state: \"closed\",\n successes: 0,\n });\n\n const recordSuccess = Effect.gen(function* () {\n yield* Ref.update(stateRef, (state) => {\n if (state.state === \"half-open\") {\n const newSuccesses = state.successes + 1;\n if (newSuccesses >= successThreshold) {\n // Close the circuit after enough successes\n return {\n failures: 0,\n lastFailureTime: 0,\n state: \"closed\" as const,\n successes: 0,\n };\n }\n return { ...state, successes: newSuccesses };\n }\n // Reset failure count on success in closed state\n return { ...state, failures: 0 };\n });\n });\n\n const recordFailure = Effect.gen(function* () {\n const now = yield* Clock.currentTimeMillis;\n yield* Ref.update(stateRef, (state) => {\n const newFailures = state.failures + 1;\n\n if (state.state === \"half-open\") {\n // Failure in half-open state reopens the circuit\n return {\n failures: newFailures,\n lastFailureTime: now,\n state: \"open\" as const,\n successes: 0,\n };\n }\n\n if (state.state === \"closed\" && newFailures >= failureThreshold) {\n // Open the circuit after threshold failures\n return {\n failures: newFailures,\n lastFailureTime: now,\n state: \"open\" as const,\n successes: 0,\n };\n }\n\n return { ...state, failures: newFailures, lastFailureTime: now };\n });\n });\n\n const execute = <A, E, R>(\n effect: Effect.Effect<A, E, R>\n ): Effect.Effect<A, E | CircuitOpenError, R> =>\n Effect.gen(function* () {\n const now = yield* Clock.currentTimeMillis;\n const currentState = yield* Ref.get(stateRef);\n\n // Check if we should attempt to recover\n if (currentState.state === \"open\" && now - currentState.lastFailureTime >= resetTimeout) {\n yield* Ref.update(stateRef, (s) => ({\n ...s,\n state: \"half-open\" as const,\n successes: 0,\n }));\n }\n\n const state = yield* Ref.get(stateRef);\n\n // Reject if circuit is open\n if (state.state === \"open\") {\n return yield* Effect.fail(\n new CircuitOpenError({\n message: \"Circuit breaker is open\",\n openedAt: state.lastFailureTime,\n })\n );\n }\n\n // Execute the effect and track success/failure\n const result = yield* Effect.matchEffect(effect, {\n onFailure: (error) =>\n Effect.gen(function* () {\n yield* recordFailure;\n return yield* Effect.fail(error);\n }),\n onSuccess: (value) =>\n Effect.gen(function* () {\n yield* recordSuccess;\n return value;\n }),\n });\n\n return result;\n });\n\n const getState = Effect.gen(function* () {\n const state = yield* Ref.get(stateRef);\n return state.state;\n });\n\n const reset = Ref.set(stateRef, {\n failures: 0,\n lastFailureTime: 0,\n state: \"closed\" as const,\n successes: 0,\n });\n\n return {\n execute,\n getState,\n reset,\n } satisfies CircuitBreaker;\n });\n};\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"dedup.js","sourceRoot":"","sources":["../../src/rpc/dedup.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAC;AAS1D,MAAM,OAAO,YAAa,SAAQ,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,EAG9D;CAAG;AAKN,MAAM,cAAc,GAAG,IAAI,GAAG,EAA+C,CAAC;AAK9E,MAAM,CAAC,MAAM,gBAAgB,GAA8B,KAAK,CAAC,OAAO,CAAC,YAAY,EAAE;IACrF,MAAM,EAAE,CAAU,GAAW,EAAE,MAA8B,EAA0B,EAAE,CAEvF,MAAM,CAAC,OAAO,CAAC,GAAG,EAAE;QAElB,MAAM,QAAQ,GAAG,cAAc,CAAC,GAAG,CAAC,GAAG,CAAwC,CAAC;QAChF,IAAI,QAAQ,EAAE,CAAC;YACb,OAAO,QAAQ,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QAClC,CAAC;QAID,OAAO,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;YACzB,MAAM,QAAQ,GAAG,KAAK,CAAC,CAAC,QAAQ,CAAC,IAAI,EAAQ,CAAC;YAG9C,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE;gBACjC,MAAM,OAAO,GAAG,cAAc,CAAC,GAAG,CAAC,GAAG,CAAwC,CAAC;gBAC/E,IAAI,OAAO,EAAE,CAAC;oBACZ,OAAO,EAAE,IAAI,EAAE,OAAgB,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC;gBACvD,CAAC;gBACD,cAAc,CAAC,GAAG,CAAC,GAAG,EAAE,QAA+C,CAAC,CAAC;gBACzE,OAAO,EAAE,IAAI,EAAE,OAAgB,EAAE,CAAC;YACpC,CAAC,CAAC,CAAC;YAEH,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,SAAS,CAAC;YAChC,IAAI,MAAM,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;gBAE5B,OAAO,KAAK,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;YAChD,CAAC;YAED,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE;gBAC/B,MAAM,OAAO,GAAG,cAAc,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;gBACxC,IAAI,OAAO,KAAM,QAAgD,EAAE,CAAC;oBAClE,cAAc,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;gBAC7B,CAAC;YACH,CAAC,CAAC,CAAC;YAGH,KAAK,CAAC,CAAC,MAAM,CAAC,mBAAmB,CAAC,CAAC,OAAO,EAAE,EAAE,CAC5C,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,YAAY,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,QAAQ,CAAC,EAAE,OAAO,CAAC,CACzE,CAAC;YAEF,OAAO,KAAK,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QACzC,CAAC,CAAC,CAAC;IACL,CAAC,CAAC;CACuB,CAAC,CAAC;AAM/B,MAAM,CAAC,MAAM,gBAAgB,GAAG,GAAS,EAAE;IACzC,cAAc,CAAC,KAAK,EAAE,CAAC;AACzB,CAAC,CAAC"}
1
+ {"version":3,"file":"dedup.js","sourceRoot":"","sources":["../../src/rpc/dedup.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAC;AAS1D,MAAM,OAAO,YAAa,SAAQ,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,EAG9D;CAAG;AAKN,MAAM,cAAc,GAAG,IAAI,GAAG,EAA+C,CAAC;AAK9E,MAAM,CAAC,MAAM,gBAAgB,GAA8B,KAAK,CAAC,OAAO,CAAC,YAAY,EAAE;IACrF,MAAM,EAAE,CAAU,GAAW,EAAE,MAA8B,EAA0B,EAAE,CAEvF,MAAM,CAAC,OAAO,CAAC,GAAG,EAAE;QAElB,MAAM,QAAQ,GAAG,cAAc,CAAC,GAAG,CAAC,GAAG,CAAwC,CAAC;QAChF,IAAI,QAAQ,EAAE,CAAC;YACb,OAAO,QAAQ,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QAClC,CAAC;QAID,OAAO,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;YACzB,MAAM,QAAQ,GAAG,KAAK,CAAC,CAAC,QAAQ,CAAC,IAAI,EAAQ,CAAC;YAG9C,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE;gBACjC,MAAM,OAAO,GAAG,cAAc,CAAC,GAAG,CAAC,GAAG,CAAwC,CAAC;gBAC/E,IAAI,OAAO,EAAE,CAAC;oBACZ,OAAO,EAAE,IAAI,EAAE,OAAgB,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC;gBACvD,CAAC;gBACD,cAAc,CAAC,GAAG,CAAC,GAAG,EAAE,QAA+C,CAAC,CAAC;gBACzE,OAAO,EAAE,IAAI,EAAE,OAAgB,EAAE,CAAC;YACpC,CAAC,CAAC,CAAC;YAEH,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,SAAS,CAAC;YAChC,IAAI,MAAM,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;gBAE5B,OAAO,KAAK,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;YAChD,CAAC;YAED,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE;gBAC/B,MAAM,OAAO,GAAG,cAAc,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;gBACxC,IAAI,OAAO,KAAM,QAAgD,EAAE,CAAC;oBAClE,cAAc,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;gBAC7B,CAAC;YACH,CAAC,CAAC,CAAC;YAGH,KAAK,CAAC,CAAC,MAAM,CAAC,mBAAmB,CAAC,CAAC,OAAO,EAAE,EAAE,CAC5C,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,YAAY,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,QAAQ,CAAC,EAAE,OAAO,CAAC,CACzE,CAAC;YAEF,OAAO,KAAK,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QACzC,CAAC,CAAC,CAAC;IACL,CAAC,CAAC;CACuB,CAAC,CAAC;AAM/B,MAAM,CAAC,MAAM,gBAAgB,GAAG,GAAS,EAAE;IACzC,cAAc,CAAC,KAAK,EAAE,CAAC;AACzB,CAAC,CAAC","sourcesContent":["import { Context, Deferred, Effect, Layer } from \"effect\";\n\n/**\n * Deduplicates concurrent identical requests\n */\nexport type RequestDedupShape = {\n readonly dedupe: <A, E, R>(key: string, effect: Effect.Effect<A, E, R>) => Effect.Effect<A, E, R>;\n};\n\nexport class RequestDedup extends Context.Tag(\"ew3/RequestDedup\")<\n RequestDedup,\n RequestDedupShape\n>() {}\n\n/**\n * Global mutable map - JavaScript Map is synchronous and truly shared\n */\nconst globalInflight = new Map<string, Deferred.Deferred<unknown, unknown>>();\n\n/**\n * Uses synchronous map access with Effect.suspend for atomic check-then-create\n */\nexport const RequestDedupLive: Layer.Layer<RequestDedup> = Layer.succeed(RequestDedup, {\n dedupe: <A, E, R>(key: string, effect: Effect.Effect<A, E, R>): Effect.Effect<A, E, R> =>\n // Use suspend to defer the entire check logic\n Effect.suspend(() => {\n // Synchronous check - if entry exists, return effect that waits on it\n const existing = globalInflight.get(key) as Deferred.Deferred<A, E> | undefined;\n if (existing) {\n return Deferred.await(existing);\n }\n\n // Need to create new entry - this is the critical section\n // Create the deferred, add to map, then run the effect\n return Effect.gen(function* () {\n const deferred = yield* Deferred.make<A, E>();\n\n // Synchronously add to map - check again in case of race\n const raceCheck = Effect.sync(() => {\n const current = globalInflight.get(key) as Deferred.Deferred<A, E> | undefined;\n if (current) {\n return { _tag: \"raced\" as const, existing: current };\n }\n globalInflight.set(key, deferred as Deferred.Deferred<unknown, unknown>);\n return { _tag: \"added\" as const };\n });\n\n const result = yield* raceCheck;\n if (result._tag === \"raced\") {\n // Another fiber beat us - wait on their deferred\n return yield* Deferred.await(result.existing);\n }\n\n const cleanup = Effect.sync(() => {\n const current = globalInflight.get(key);\n if (current === (deferred as Deferred.Deferred<unknown, unknown>)) {\n globalInflight.delete(key);\n }\n });\n\n // Run the effect and complete deferred with result\n yield* Effect.uninterruptibleMask((restore) =>\n Effect.ensuring(Effect.intoDeferred(restore(effect), deferred), cleanup)\n );\n\n return yield* Deferred.await(deferred);\n });\n }),\n} satisfies RequestDedupShape);\n\n/**\n * Reset global state (for testing)\n * @internal\n */\nexport const _resetDedupState = (): void => {\n globalInflight.clear();\n};\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/rpc/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,OAAO,EAGL,2BAA2B,EAC3B,gBAAgB,EAEhB,kBAAkB,GACnB,MAAM,sBAAsB,CAAC;AAC9B,cAAc,YAAY,CAAC;AAC3B,OAAO,EACL,sBAAsB,EACtB,iBAAiB,EAEjB,kBAAkB,EAClB,SAAS,GACV,MAAM,YAAY,CAAC;AACpB,cAAc,gBAAgB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/rpc/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,OAAO,EAGL,2BAA2B,EAC3B,gBAAgB,EAEhB,kBAAkB,GACnB,MAAM,sBAAsB,CAAC;AAC9B,cAAc,YAAY,CAAC;AAC3B,OAAO,EACL,sBAAsB,EACtB,iBAAiB,EAEjB,kBAAkB,EAClB,SAAS,GACV,MAAM,YAAY,CAAC;AACpB,cAAc,gBAAgB,CAAC","sourcesContent":["export * from \"./cache.js\";\nexport {\n type CircuitBreaker,\n type CircuitBreakerConfig,\n CircuitBreakerConfigFromEnv,\n CircuitOpenError,\n type CircuitState,\n makeCircuitBreaker,\n} from \"./circuit-breaker.js\";\nexport * from \"./dedup.js\";\nexport {\n defaultRetryableErrors,\n makeRetrySchedule,\n type RetryConfig,\n RetryConfigFromEnv,\n withRetry,\n} from \"./retry.js\";\nexport * from \"./routemesh.js\";\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"retry.js","sourceRoot":"","sources":["../../src/rpc/retry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAC;AAElD,OAAO,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AA2B9D,MAAM,CAAC,MAAM,kBAAkB,GAAG,MAAM,CAAC,GAAG,CAAC;IAC3C,SAAS,EAAE,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;IACpE,MAAM,EAAE,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;IAC/D,QAAQ,EAAE,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;IACrE,UAAU,EAAE,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;CACrE,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC;AAMpC,MAAM,CAAC,MAAM,sBAAsB,GAAG;IACpC,YAAY;IACZ,SAAS;IACT,YAAY;IACZ,WAAW;IACX,KAAK;IACL,KAAK;IACL,KAAK;CACN,CAAC;AAKF,MAAM,gBAAgB,GAAG,CAAC,KAAc,EAAE,iBAA2B,EAAW,EAAE;IAChF,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;QAC3B,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC;QAC5C,OAAO,iBAAiB,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;IACtF,CAAC;IACD,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,MAAM,OAAO,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC;QACpC,OAAO,iBAAiB,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;IACtF,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC,CAAC;AASF,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAI,MAAoB,EAAgC,EAAE;IACzF,MAAM,EAAE,eAAe,GAAG,sBAAsB,EAAE,GAAG,aAAa,EAAE,GAAG,MAAM,IAAI,EAAE,CAAC;IAEpF,OAAO,mBAAmB,CAAC,aAAa,CAAC,CAAC,IAAI,CAC5C,QAAQ,CAAC,UAAU,CAAI,CAAC,KAAK,EAAE,EAAE,CAAC,gBAAgB,CAAC,KAAK,EAAE,eAAe,CAAC,CAAC,CAC5E,CAAC;AACJ,CAAC,CAAC;AAUF,MAAM,CAAC,MAAM,SAAS,GACpB,CAAC,MAAoB,EAAE,EAAE,CACzB,CAAU,MAA8B,EAA0B,EAAE,CAClE,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,iBAAiB,CAAI,MAAM,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"retry.js","sourceRoot":"","sources":["../../src/rpc/retry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAC;AAElD,OAAO,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AA2B9D,MAAM,CAAC,MAAM,kBAAkB,GAAG,MAAM,CAAC,GAAG,CAAC;IAC3C,SAAS,EAAE,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;IACpE,MAAM,EAAE,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;IAC/D,QAAQ,EAAE,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;IACrE,UAAU,EAAE,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;CACrE,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC;AAMpC,MAAM,CAAC,MAAM,sBAAsB,GAAG;IACpC,YAAY;IACZ,SAAS;IACT,YAAY;IACZ,WAAW;IACX,KAAK;IACL,KAAK;IACL,KAAK;CACN,CAAC;AAKF,MAAM,gBAAgB,GAAG,CAAC,KAAc,EAAE,iBAA2B,EAAW,EAAE;IAChF,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;QAC3B,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC;QAC5C,OAAO,iBAAiB,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;IACtF,CAAC;IACD,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,MAAM,OAAO,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC;QACpC,OAAO,iBAAiB,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;IACtF,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC,CAAC;AASF,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAI,MAAoB,EAAgC,EAAE;IACzF,MAAM,EAAE,eAAe,GAAG,sBAAsB,EAAE,GAAG,aAAa,EAAE,GAAG,MAAM,IAAI,EAAE,CAAC;IAEpF,OAAO,mBAAmB,CAAC,aAAa,CAAC,CAAC,IAAI,CAC5C,QAAQ,CAAC,UAAU,CAAI,CAAC,KAAK,EAAE,EAAE,CAAC,gBAAgB,CAAC,KAAK,EAAE,eAAe,CAAC,CAAC,CAC5E,CAAC;AACJ,CAAC,CAAC;AAUF,MAAM,CAAC,MAAM,SAAS,GACpB,CAAC,MAAoB,EAAE,EAAE,CACzB,CAAU,MAA8B,EAA0B,EAAE,CAClE,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,iBAAiB,CAAI,MAAM,CAAC,CAAC,CAAC","sourcesContent":["import { Config, Effect, Schedule } from \"effect\";\nimport type { BackoffConfig } from \"@/src/internal/index.js\";\nimport { makeBackoffSchedule } from \"@/src/internal/index.js\";\n\nexport type RetryConfig = BackoffConfig & {\n /** Array of error message patterns that should trigger retries */\n retryableErrors?: string[];\n};\n\n/**\n * Config-based retry configuration from environment variables.\n *\n * Environment variables (all optional, nested under `EW3_RETRY_` prefix):\n * - `EW3_RETRY_MAX_RETRIES`: Maximum retry attempts (default: 3)\n * - `EW3_RETRY_BASE_DELAY`: Base delay in milliseconds (default: 100)\n * - `EW3_RETRY_MAX_DELAY`: Maximum delay cap in milliseconds (default: 10_000)\n * - `EW3_RETRY_JITTER`: Enable jitter for delays (default: true)\n *\n * @example\n * ```typescript\n * import { Effect } from \"effect\";\n * import { RetryConfigFromEnv } from \"effect-evm/rpc\";\n *\n * const program = Effect.gen(function* () {\n * const config = yield* RetryConfigFromEnv;\n * // Use config for retry logic\n * });\n * ```\n */\nexport const RetryConfigFromEnv = Config.all({\n baseDelay: Config.number(\"BASE_DELAY\").pipe(Config.withDefault(100)),\n jitter: Config.boolean(\"JITTER\").pipe(Config.withDefault(true)),\n maxDelay: Config.number(\"MAX_DELAY\").pipe(Config.withDefault(10_000)),\n maxRetries: Config.number(\"MAX_RETRIES\").pipe(Config.withDefault(3)),\n}).pipe(Config.nested(\"EW3_RETRY\"));\n\n/**\n * Default retryable error patterns for RPC calls\n * Includes rate limits, timeouts, network errors, and transient HTTP errors\n */\nexport const defaultRetryableErrors = [\n \"rate limit\",\n \"timeout\",\n \"ECONNRESET\",\n \"ETIMEDOUT\",\n \"503\",\n \"502\",\n \"429\",\n];\n\n/**\n * Check if an error should be retried based on its message\n */\nconst isRetryableError = (error: unknown, retryablePatterns: string[]): boolean => {\n if (error instanceof Error) {\n const message = error.message.toLowerCase();\n return retryablePatterns.some((pattern) => message.includes(pattern.toLowerCase()));\n }\n if (typeof error === \"string\") {\n const message = error.toLowerCase();\n return retryablePatterns.some((pattern) => message.includes(pattern.toLowerCase()));\n }\n return false;\n};\n\n/**\n * Create a retry schedule with exponential backoff\n * Only retries on errors matching the configured retryable patterns\n *\n * @param config - Retry configuration options\n * @returns Schedule that implements exponential backoff with jitter\n */\nexport const makeRetrySchedule = <E>(config?: RetryConfig): Schedule.Schedule<number, E> => {\n const { retryableErrors = defaultRetryableErrors, ...backoffConfig } = config ?? {};\n\n return makeBackoffSchedule(backoffConfig).pipe(\n Schedule.whileInput<E>((error) => isRetryableError(error, retryableErrors))\n );\n};\n\n/**\n * Apply retry logic to an Effect\n * Will retry the effect according to the configured schedule on retryable errors\n *\n * @param effect - The Effect to retry\n * @param config - Retry configuration options\n * @returns Effect that will be retried on transient failures\n */\nexport const withRetry =\n (config?: RetryConfig) =>\n <A, E, R>(effect: Effect.Effect<A, E, R>): Effect.Effect<A, E, R> =>\n Effect.retry(effect, makeRetrySchedule<E>(config));\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"routemesh.js","sourceRoot":"","sources":["../../src/rpc/routemesh.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAIhC,OAAO,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAC;AAI/D,MAAM,CAAC,MAAM,kBAAkB,GAAG,2BAA2B,CAAC;AA6B9D,MAAM,OAAO,2BAA4B,SAAQ,MAAM,CAAC,WAAW,EAA+B,CAChG,6BAA6B,EAC7B;IACE,OAAO,EAAE,MAAM,CAAC,MAAM;CACvB,CACF;CAAG;AAaJ,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,OAAe,EAAE,MAAc,EAAU,EAAE,CACtE,GAAG,kBAAkB,IAAI,OAAO,IAAI,MAAM,EAAE,CAAC;AAa/C,MAAM,CAAC,MAAM,YAAY,GACvB,CAAC,OAAe,EAAgC,EAAE,CAClD,CAAC,MAAM,EAAE,EAAE,CACT,YAAY,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;AAwBlC,MAAM,CAAC,MAAM,uBAAuB,GAAG,CAAC,MAAuB,EAAiB,EAAE,CAChF,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IAC5B,KAAK,EAAE,KAAK,CAAC,KAAK;IAClB,OAAO,EAAE,KAAK,CAAC,OAAO;IACtB,OAAO,EAAE,CAAC,YAAY,CAAC,KAAK,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;CACtD,CAAC,CAAC,CAAC;AAmBN,MAAM,CAAC,MAAM,qBAAqB,GAAG,CACnC,OAAe,EACf,MAAc,EACd,YAA+B,EACrB,EAAE,CAAC,CAAC,YAAY,CAAC,OAAO,EAAE,MAAM,CAAC,EAAE,GAAG,YAAY,CAAC,CAAC;AAsBhE,MAAM,CAAC,MAAM,uBAAuB,GAAG,CACrC,MAAc,EACd,MAA8C,EACnB,EAAE,CAC7B,MAAM,CAAC,MAAM,CACX,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE;IACb,MAAM,IAAI,GAAG,qBAAqB,CAAC,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,YAAY,IAAI,EAAE,CAAC,CAAC;IACpF,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,qBAAqB,CAAC,IAAI,CAAC,CAAC;IACjD,OAAO,GAAG,CAAC;AACb,CAAC,EACD,EAA+B,CAChC,CAAC"}
1
+ {"version":3,"file":"routemesh.js","sourceRoot":"","sources":["../../src/rpc/routemesh.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAIhC,OAAO,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAC;AAI/D,MAAM,CAAC,MAAM,kBAAkB,GAAG,2BAA2B,CAAC;AA6B9D,MAAM,OAAO,2BAA4B,SAAQ,MAAM,CAAC,WAAW,EAA+B,CAChG,6BAA6B,EAC7B;IACE,OAAO,EAAE,MAAM,CAAC,MAAM;CACvB,CACF;CAAG;AAaJ,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,OAAe,EAAE,MAAc,EAAU,EAAE,CACtE,GAAG,kBAAkB,IAAI,OAAO,IAAI,MAAM,EAAE,CAAC;AAa/C,MAAM,CAAC,MAAM,YAAY,GACvB,CAAC,OAAe,EAAgC,EAAE,CAClD,CAAC,MAAM,EAAE,EAAE,CACT,YAAY,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;AAwBlC,MAAM,CAAC,MAAM,uBAAuB,GAAG,CAAC,MAAuB,EAAiB,EAAE,CAChF,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IAC5B,KAAK,EAAE,KAAK,CAAC,KAAK;IAClB,OAAO,EAAE,KAAK,CAAC,OAAO;IACtB,OAAO,EAAE,CAAC,YAAY,CAAC,KAAK,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;CACtD,CAAC,CAAC,CAAC;AAmBN,MAAM,CAAC,MAAM,qBAAqB,GAAG,CACnC,OAAe,EACf,MAAc,EACd,YAA+B,EACrB,EAAE,CAAC,CAAC,YAAY,CAAC,OAAO,EAAE,MAAM,CAAC,EAAE,GAAG,YAAY,CAAC,CAAC;AAsBhE,MAAM,CAAC,MAAM,uBAAuB,GAAG,CACrC,MAAc,EACd,MAA8C,EACnB,EAAE,CAC7B,MAAM,CAAC,MAAM,CACX,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE;IACb,MAAM,IAAI,GAAG,qBAAqB,CAAC,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,YAAY,IAAI,EAAE,CAAC,CAAC;IACpF,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,qBAAqB,CAAC,IAAI,CAAC,CAAC;IACjD,OAAO,GAAG,CAAC;AACb,CAAC,EACD,EAA+B,CAChC,CAAC","sourcesContent":["import { Schema } from \"effect\";\nimport type { Chain, Transport } from \"viem\";\n\nimport type { ChainConfig } from \"@/src/presets/index.js\";\nimport { makeFallbackTransport } from \"@/src/presets/index.js\";\n\n// === Constants ===\n\nexport const ROUTEMESH_BASE_URL = \"https://lb.routeme.sh/rpc\";\n\n// === Types ===\n\n/**\n * Configuration for a single chain using RouteMesh\n */\nexport type RouteMeshChainEntry = {\n readonly chainId: number;\n readonly chain: Chain;\n};\n\n/**\n * Full RouteMesh configuration with API key\n */\nexport type RouteMeshConfig = {\n readonly apiKey: string;\n readonly chains: readonly RouteMeshChainEntry[];\n};\n\n/**\n * Configuration for a chain with RouteMesh primary + optional fallback URLs\n */\nexport type RouteMeshFallbackChainEntry = RouteMeshChainEntry & {\n readonly fallbackUrls?: readonly string[];\n};\n\n// === Errors ===\n\nexport class RouteMeshApiKeyMissingError extends Schema.TaggedError<RouteMeshApiKeyMissingError>()(\n \"RouteMeshApiKeyMissingError\",\n {\n message: Schema.String,\n }\n) {}\n\n// === URL Generation ===\n\n/**\n * Generate a RouteMesh RPC URL for a specific chain\n *\n * @example\n * ```ts\n * const url = routemeshUrl(1, \"my-api-key\");\n * // => \"https://lb.routeme.sh/rpc/1/my-api-key\"\n * ```\n */\nexport const routemeshUrl = (chainId: number, apiKey: string): string =>\n `${ROUTEMESH_BASE_URL}/${chainId}/${apiKey}`;\n\n/**\n * Create a URL generator function for a specific chain.\n * Useful for deferred API key resolution.\n *\n * @example\n * ```ts\n * const mainnetRpc = routemeshRpc(1);\n * const url = mainnetRpc(\"my-api-key\");\n * // => \"https://lb.routeme.sh/rpc/1/my-api-key\"\n * ```\n */\nexport const routemeshRpc =\n (chainId: number): ((apiKey: string) => string) =>\n (apiKey) =>\n routemeshUrl(chainId, apiKey);\n\n// === ChainConfig Integration ===\n\n/**\n * Convert RouteMesh configuration to ChainConfig array.\n * Primary integration point with existing layer factories.\n *\n * @example\n * ```ts\n * import { mainnet, arbitrum } from \"viem/chains\";\n * import { makePublicClientLayer, routemeshToChainConfigs } from \"effect-evm\";\n *\n * const configs = routemeshToChainConfigs({\n * apiKey: \"my-api-key\",\n * chains: [\n * { chainId: mainnet.id, chain: mainnet },\n * { chainId: arbitrum.id, chain: arbitrum },\n * ],\n * });\n *\n * const layer = makePublicClientLayer(configs);\n * ```\n */\nexport const routemeshToChainConfigs = (config: RouteMeshConfig): ChainConfig[] =>\n config.chains.map((entry) => ({\n chain: entry.chain,\n chainId: entry.chainId,\n rpcUrls: [routemeshUrl(entry.chainId, config.apiKey)],\n }));\n\n// === Fallback Composition ===\n\n/**\n * Create fallback URLs combining RouteMesh with other providers.\n * RouteMesh URL is placed first (primary).\n *\n * @example\n * ```ts\n * import { mainnet } from \"viem/chains\";\n *\n * const urls = routemeshWithFallback(mainnet.id, \"api-key\", [\n * \"https://eth.llamarpc.com\",\n * \"https://rpc.ankr.com/eth\",\n * ]);\n * // => [\"https://lb.routeme.sh/rpc/1/api-key\", \"https://eth.llamarpc.com\", ...]\n * ```\n */\nexport const routemeshWithFallback = (\n chainId: number,\n apiKey: string,\n fallbackUrls: readonly string[]\n): string[] => [routemeshUrl(chainId, apiKey), ...fallbackUrls];\n\n/**\n * Create chain transports with RouteMesh as primary and optional fallbacks.\n *\n * @example\n * ```ts\n * import { mainnet, arbitrum } from \"viem/chains\";\n * import { makeRouteMeshTransports } from \"effect-evm\";\n *\n * const transports = makeRouteMeshTransports(\"my-api-key\", [\n * { chainId: mainnet.id, chain: mainnet, fallbackUrls: [\"https://eth.llamarpc.com\"] },\n * { chainId: arbitrum.id, chain: arbitrum },\n * ]);\n *\n * // Use with viem directly\n * const client = createPublicClient({\n * chain: mainnet,\n * transport: transports[mainnet.id],\n * });\n * ```\n */\nexport const makeRouteMeshTransports = (\n apiKey: string,\n chains: readonly RouteMeshFallbackChainEntry[]\n): Record<number, Transport> =>\n chains.reduce(\n (acc, entry) => {\n const urls = routemeshWithFallback(entry.chainId, apiKey, entry.fallbackUrls ?? []);\n acc[entry.chainId] = makeFallbackTransport(urls);\n return acc;\n },\n {} as Record<number, Transport>\n );\n"]}