@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
package/DOCS.md CHANGED
@@ -229,6 +229,19 @@ function App() {
229
229
  }
230
230
  ```
231
231
 
232
+ ### Safe App vs Safe multisig
233
+
234
+ Use Safe App hooks to detect the host iframe context, and Safe multisig hooks to detect the connected wallet.
235
+
236
+ - Safe App context (SDK): `useIsSafeAppContext`
237
+ - Safe App host (SDK + origin): `useIsHostSafeApp`
238
+ - Safe multisig wallet (SDK + connector + host): `useIsSafeMultisigWallet`
239
+
240
+ Safe App origin utilities let you control the allowed host list:
241
+
242
+ - `DEFAULT_SAFE_APP_ORIGINS`
243
+ - `getSafeAppOrigins`, `setSafeAppOrigins`, `extendSafeAppOrigins`, `subscribeSafeAppOrigins`
244
+
232
245
  ### Primitive hooks
233
246
 
234
247
  Low-level hooks for running Effects and Streams in React:
package/README.md CHANGED
@@ -4,6 +4,9 @@
4
4
  [![Effect](https://img.shields.io/badge/Effect-v3-7C3AED)](https://effect.website)
5
5
  [![viem](https://img.shields.io/badge/viem-v2-1E1E1E)](https://viem.sh)
6
6
 
7
+ > [!WARNING] This is experimental, beta software. It is provided "as is" without warranty of any kind, express or
8
+ > implied.
9
+
7
10
  Type-safe, composable EVM abstractions for [Effect](https://effect.website), built on [viem](https://viem.sh).
8
11
 
9
12
  ## 📦 Installation
@@ -60,6 +63,7 @@ Effect.runPromise(program.pipe(Effect.provide(EvmLayer)));
60
63
  - **Subscriptions** — `SubscriptionService` (blocks/logs/pending tx)
61
64
  - **EIP-7702** — Delegation and atomic batching for EOAs
62
65
  - **React hooks** — `effect-evm/react-hooks` (primitives + convenience hooks)
66
+ - **Safe App + Safe multisig** — `useIsSafeAppContext`, `useIsHostSafeApp`, `useIsSafeMultisigWallet`
63
67
  - **Wagmi integration** — `effect-evm/wagmi` (build layers from wagmi config)
64
68
  - **Browser persistence** — `browser` namespace (localStorage-backed stores)
65
69
  - **Testing** — `effect-evm/testing-kit` (mocks + `makeEffectEvmTestLayer`)
@@ -1 +1 @@
1
- {"version":3,"file":"erc165.js","sourceRoot":"","sources":["../../src/abi/erc165.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAEhC,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAIzD,MAAM,CAAC,MAAM,SAAS,GAAG;IACvB;QACE,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;QACjD,IAAI,EAAE,mBAAmB;QACzB,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;QACrC,eAAe,EAAE,MAAM;QACvB,IAAI,EAAE,UAAU;KACjB;CACO,CAAC;AAGX,MAAM,CAAC,MAAM,mBAAmB,GAAG,YAAqB,CAAC;AAKzD,MAAM,CAAC,MAAM,QAAQ,GAAG,CACtB,OAAe,EACf,OAAgB,EACiE,EAAE,CACnF,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;IAClB,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,cAAc,CAAC;IACrC,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC;QAChC,GAAG,EAAE,SAAS;QACd,OAAO;QACP,IAAI,EAAE,CAAC,mBAAmB,CAAC;QAC3B,OAAO;QACP,YAAY,EAAE,mBAAmB;KAClC,CAAC,CAAC;IACH,OAAO,MAAiB,CAAC;AAC3B,CAAC,CAAC,CAAC;AAKL,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAC/B,OAAe,EACf,OAAgB,EAChB,WAAgB,EACiE,EAAE,CACnF,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;IAClB,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,cAAc,CAAC;IACrC,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC;QAChC,GAAG,EAAE,SAAS;QACd,OAAO;QACP,IAAI,EAAE,CAAC,WAAW,CAAC;QACnB,OAAO;QACP,YAAY,EAAE,mBAAmB;KAClC,CAAC,CAAC;IACH,OAAO,MAAiB,CAAC;AAC3B,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"erc165.js","sourceRoot":"","sources":["../../src/abi/erc165.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAEhC,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAIzD,MAAM,CAAC,MAAM,SAAS,GAAG;IACvB;QACE,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;QACjD,IAAI,EAAE,mBAAmB;QACzB,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;QACrC,eAAe,EAAE,MAAM;QACvB,IAAI,EAAE,UAAU;KACjB;CACO,CAAC;AAGX,MAAM,CAAC,MAAM,mBAAmB,GAAG,YAAqB,CAAC;AAKzD,MAAM,CAAC,MAAM,QAAQ,GAAG,CACtB,OAAe,EACf,OAAgB,EACiE,EAAE,CACnF,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;IAClB,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,cAAc,CAAC;IACrC,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC;QAChC,GAAG,EAAE,SAAS;QACd,OAAO;QACP,IAAI,EAAE,CAAC,mBAAmB,CAAC;QAC3B,OAAO;QACP,YAAY,EAAE,mBAAmB;KAClC,CAAC,CAAC;IACH,OAAO,MAAiB,CAAC;AAC3B,CAAC,CAAC,CAAC;AAKL,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAC/B,OAAe,EACf,OAAgB,EAChB,WAAgB,EACiE,EAAE,CACnF,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;IAClB,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,cAAc,CAAC;IACrC,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC;QAChC,GAAG,EAAE,SAAS;QACd,OAAO;QACP,IAAI,EAAE,CAAC,WAAW,CAAC;QACnB,OAAO;QACP,YAAY,EAAE,mBAAmB;KAClC,CAAC,CAAC;IACH,OAAO,MAAiB,CAAC;AAC3B,CAAC,CAAC,CAAC","sourcesContent":["import { Effect } from \"effect\";\nimport type { Address, Hex } from \"viem\";\nimport { ERC721_INTERFACE_ID } from \"@/src/abi/index.js\";\nimport { ContractReader } from \"@/src/contract/index.js\";\nimport type { ClientNotFoundError, ContractReadError } from \"@/src/core/index.js\";\n\n/** ERC-165 ABI for supportsInterface check */\nexport const erc165Abi = [\n {\n inputs: [{ name: \"interfaceId\", type: \"bytes4\" }],\n name: \"supportsInterface\",\n outputs: [{ name: \"\", type: \"bool\" }],\n stateMutability: \"view\",\n type: \"function\",\n },\n] as const;\n\n/** ERC-165 interface ID for ERC-721 */\nexport const ERC165_INTERFACE_ID = \"0x01ffc9a7\" as const;\n\n/**\n * Check if a contract supports ERC-721 via ERC-165 supportsInterface\n */\nexport const isErc721 = (\n chainId: number,\n address: Address\n): Effect.Effect<boolean, ContractReadError | ClientNotFoundError, ContractReader> =>\n Effect.gen(function* () {\n const reader = yield* ContractReader;\n const result = yield* reader.read({\n abi: erc165Abi,\n address,\n args: [ERC721_INTERFACE_ID],\n chainId,\n functionName: \"supportsInterface\",\n });\n return result as boolean;\n });\n\n/**\n * Check if a contract supports a given interface via ERC-165\n */\nexport const supportsInterface = (\n chainId: number,\n address: Address,\n interfaceId: Hex\n): Effect.Effect<boolean, ContractReadError | ClientNotFoundError, ContractReader> =>\n Effect.gen(function* () {\n const reader = yield* ContractReader;\n const result = yield* reader.read({\n abi: erc165Abi,\n address,\n args: [interfaceId],\n chainId,\n functionName: \"supportsInterface\",\n });\n return result as boolean;\n });\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"erc20-no-output.js","sourceRoot":"","sources":["../../src/abi/erc20-no-output.ts"],"names":[],"mappings":"AAQA,MAAM,CAAC,MAAM,gBAAgB,GAAG;IAC9B;QACE,MAAM,EAAE;YACN,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE;YACpC,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE;SACnC;QACD,IAAI,EAAE,SAAS;QACf,OAAO,EAAE,EAAE;QACX,eAAe,EAAE,YAAY;QAC7B,IAAI,EAAE,UAAU;KACjB;CACqB,CAAC"}
1
+ {"version":3,"file":"erc20-no-output.js","sourceRoot":"","sources":["../../src/abi/erc20-no-output.ts"],"names":[],"mappings":"AAQA,MAAM,CAAC,MAAM,gBAAgB,GAAG;IAC9B;QACE,MAAM,EAAE;YACN,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE;YACpC,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE;SACnC;QACD,IAAI,EAAE,SAAS;QACf,OAAO,EAAE,EAAE;QACX,eAAe,EAAE,YAAY;QAC7B,IAAI,EAAE,UAAU;KACjB;CACqB,CAAC","sourcesContent":["import type { Abi } from \"viem\";\n\n/**\n * Minimal ERC-20 ABI variant where `approve` has no return value.\n *\n * Some tokens (notably USDT on mainnet) do not return a boolean from `approve`,\n * which makes standard ERC-20 ABIs fail when decoding the response.\n */\nexport const erc20NoOutputAbi = [\n {\n inputs: [\n { name: \"spender\", type: \"address\" },\n { name: \"value\", type: \"uint256\" },\n ],\n name: \"approve\",\n outputs: [],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n] as const satisfies Abi;\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"erc20.js","sourceRoot":"","sources":["../../src/abi/erc20.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,gBAAgB,EAAE,MAAM,MAAM,CAAC"}
1
+ {"version":3,"file":"erc20.js","sourceRoot":"","sources":["../../src/abi/erc20.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,gBAAgB,EAAE,MAAM,MAAM,CAAC","sourcesContent":["export { erc20Abi, erc20Abi_bytes32 } from \"viem\";\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"erc721.js","sourceRoot":"","sources":["../../src/abi/erc721.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,MAAM,CAAC;AAMjC,MAAM,CAAC,MAAM,mBAAmB,GAAG,YAAqB,CAAC"}
1
+ {"version":3,"file":"erc721.js","sourceRoot":"","sources":["../../src/abi/erc721.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,MAAM,CAAC;AAMjC,MAAM,CAAC,MAAM,mBAAmB,GAAG,YAAqB,CAAC","sourcesContent":["export { erc721Abi } from \"viem\";\n\n/**\n * ERC-165 interface ID for ERC-721\n * @see https://github.com/binodnp/openzeppelin-solidity/blob/ffc4bcbba398b61d19ede03e4fdf673ddbce1083/contracts/token/ERC721/ERC721.sol#L34-L46\n */\nexport const ERC721_INTERFACE_ID = \"0x80ac58cd\" as const;\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/abi/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,sBAAsB,CAAC;AACrC,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/abi/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,sBAAsB,CAAC;AACrC,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC","sourcesContent":["export * from \"./erc20.js\";\nexport * from \"./erc20-no-output.js\";\nexport * from \"./erc165.js\";\nexport * from \"./erc721.js\";\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/balance/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAC;AAC7B,OAAO,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/balance/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAC;AAC7B,OAAO,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC","sourcesContent":["export * from \"./service.js\";\nexport { decodeBytes32String } from \"./utils.js\";\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"service.js","sourceRoot":"","sources":["../../src/balance/service.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"service.js","sourceRoot":"","sources":["../../src/balance/service.ts"],"names":[],"mappings":"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","sourcesContent":["import { Context, Effect, Layer, Stream } from \"effect\";\nimport type { Address, Hex } from \"viem\";\nimport { erc20Abi, erc20Abi_bytes32 } from \"@/src/abi/index.js\";\nimport type { ContractReaderShape } from \"@/src/contract/index.js\";\nimport { ContractReader } from \"@/src/contract/index.js\";\nimport type { ClientNotFoundError, ContractReadError, MulticallError } from \"@/src/core/index.js\";\nimport { PublicClientService, TransportError } from \"@/src/core/index.js\";\nimport { SpanNames } from \"@/src/telemetry/index.js\";\nimport type { MulticallResult } from \"@/src/types/index.js\";\nimport { decodeBytes32String } from \"./utils.js\";\n\nexport type TokenBalance = {\n address: Address;\n balance: bigint;\n decimals: number;\n symbol?: string;\n name?: string;\n};\n\nexport type BalanceServiceShape = {\n readonly getBalance: (params: {\n chainId: number;\n address: Address;\n blockTag?: \"latest\" | \"pending\";\n }) => Effect.Effect<bigint, ClientNotFoundError | TransportError>;\n\n readonly getTokenBalance: (params: {\n chainId: number;\n address: Address;\n tokenAddress: Address;\n }) => Effect.Effect<bigint, ContractReadError | ClientNotFoundError>;\n\n readonly getTokenBalances: (params: {\n chainId: number;\n address: Address;\n tokenAddresses: Address[];\n }) => Effect.Effect<TokenBalance[], ClientNotFoundError | MulticallError>;\n\n readonly watchBalance: (params: {\n chainId: number;\n address: Address;\n pollingInterval?: number;\n }) => Effect.Effect<Stream.Stream<bigint, unknown>, ClientNotFoundError>;\n\n readonly watchTokenBalance: (params: {\n chainId: number;\n address: Address;\n tokenAddress: Address;\n pollingInterval?: number;\n }) => Effect.Effect<Stream.Stream<bigint, unknown>, ClientNotFoundError>;\n\n readonly hasSufficientBalance: (params: {\n chainId: number;\n address: Address;\n required: bigint;\n }) => Effect.Effect<boolean, ClientNotFoundError | TransportError>;\n\n readonly hasSufficientTokenBalance: (params: {\n chainId: number;\n address: Address;\n tokenAddress: Address;\n required: bigint;\n }) => Effect.Effect<boolean, ContractReadError | ClientNotFoundError>;\n};\n\nexport class BalanceService extends Context.Tag(\"ew3/BalanceService\")<\n BalanceService,\n BalanceServiceShape\n>() {}\n\n/**\n * Build multicall requests for token balances including bytes32 fallbacks\n */\nfunction buildMulticallRequests(\n params: { chainId: number; address: Address; tokenAddresses: Address[] },\n contractReader: ContractReaderShape\n) {\n // Use multicall for efficient batch queries\n const balanceCalls = params.tokenAddresses.map((tokenAddress) => ({\n abi: erc20Abi,\n address: tokenAddress,\n args: [params.address] as const,\n functionName: \"balanceOf\" as const,\n }));\n\n const decimalsCalls = params.tokenAddresses.map((tokenAddress) => ({\n abi: erc20Abi,\n address: tokenAddress,\n args: [] as const,\n functionName: \"decimals\" as const,\n }));\n\n const symbolCalls = params.tokenAddresses.map((tokenAddress) => ({\n abi: erc20Abi,\n address: tokenAddress,\n args: [] as const,\n functionName: \"symbol\" as const,\n }));\n\n const nameCalls = params.tokenAddresses.map((tokenAddress) => ({\n abi: erc20Abi,\n address: tokenAddress,\n args: [] as const,\n functionName: \"name\" as const,\n }));\n\n const symbolBytes32Calls = params.tokenAddresses.map((tokenAddress) => ({\n abi: erc20Abi_bytes32,\n address: tokenAddress,\n args: [] as const,\n functionName: \"symbol\" as const,\n }));\n\n const nameBytes32Calls = params.tokenAddresses.map((tokenAddress) => ({\n abi: erc20Abi_bytes32,\n address: tokenAddress,\n args: [] as const,\n functionName: \"name\" as const,\n }));\n\n // Combine all calls\n const allCalls = [\n ...balanceCalls,\n ...decimalsCalls,\n ...symbolCalls,\n ...nameCalls,\n ...symbolBytes32Calls,\n ...nameBytes32Calls,\n ];\n\n return contractReader.multicall(params.chainId, allCalls);\n}\n\n/**\n * Process multicall results and extract token balance data\n */\nfunction processTokenBalanceResults(\n tokenAddresses: Address[],\n results: readonly MulticallResult[]\n): TokenBalance[] {\n const tokenCount = tokenAddresses.length;\n const tokenBalances: TokenBalance[] = [];\n\n for (let i = 0; i < tokenCount; i++) {\n const balanceResult = results[i];\n const decimalsResult = results[tokenCount + i];\n const symbolResult = results[tokenCount * 2 + i];\n const nameResult = results[tokenCount * 3 + i];\n const symbolBytes32Result = results[tokenCount * 4 + i];\n const nameBytes32Result = results[tokenCount * 5 + i];\n\n // Prefer string results, fall back to bytes32\n const symbol = extractStringOrBytes32(symbolResult, symbolBytes32Result);\n const name = extractStringOrBytes32(nameResult, nameBytes32Result);\n\n tokenBalances.push({\n address: tokenAddresses[i],\n balance: balanceResult.status === \"success\" ? (balanceResult.result as bigint) : 0n,\n decimals: decimalsResult.status === \"success\" ? (decimalsResult.result as number) : 18,\n name,\n symbol,\n });\n }\n\n return tokenBalances;\n}\n\n/**\n * Extract string value, preferring string result over bytes32 fallback\n */\nfunction extractStringOrBytes32(\n stringResult: MulticallResult,\n bytes32Result: MulticallResult\n): string | undefined {\n if (stringResult.status === \"success\") {\n return stringResult.result as string;\n }\n if (bytes32Result.status === \"success\") {\n return decodeBytes32String(bytes32Result.result as Hex);\n }\n return undefined;\n}\n\nexport const BalanceServiceLive = Layer.effect(\n BalanceService,\n Effect.gen(function* () {\n const publicClientService = yield* PublicClientService;\n const contractReader = yield* ContractReader;\n\n return BalanceService.of({\n getBalance: (params) =>\n Effect.gen(function* () {\n const client = yield* publicClientService.get(params.chainId);\n\n return yield* Effect.tryPromise({\n catch: (cause) =>\n new TransportError({\n cause,\n message: `Failed to get balance (chainId=${params.chainId}, address=${params.address})`,\n url: client.transport.url ?? \"unknown\",\n }),\n try: () =>\n client.getBalance({\n address: params.address,\n blockTag: params.blockTag ?? \"latest\",\n }),\n });\n }).pipe(\n Effect.withSpan(SpanNames.BALANCE_GET, {\n attributes: {\n address: params.address,\n blockTag: params.blockTag,\n chainId: params.chainId,\n },\n })\n ),\n\n getTokenBalance: (params) =>\n Effect.gen(function* () {\n return (yield* contractReader.read({\n abi: erc20Abi,\n address: params.tokenAddress,\n args: [params.address],\n chainId: params.chainId,\n functionName: \"balanceOf\",\n })) as bigint;\n }).pipe(\n Effect.withSpan(SpanNames.BALANCE_GET_TOKEN, {\n attributes: {\n address: params.address,\n chainId: params.chainId,\n tokenAddress: params.tokenAddress,\n },\n })\n ),\n\n getTokenBalances: (params) =>\n Effect.gen(function* () {\n const results = yield* buildMulticallRequests(params, contractReader);\n return processTokenBalanceResults(params.tokenAddresses, results);\n }).pipe(\n Effect.withSpan(SpanNames.BALANCE_GET_TOKEN_BATCH, {\n attributes: {\n address: params.address,\n chainId: params.chainId,\n tokenCount: params.tokenAddresses.length,\n },\n })\n ),\n\n hasSufficientBalance: (params) =>\n Effect.gen(function* () {\n const client = yield* publicClientService.get(params.chainId);\n\n const balance = yield* Effect.tryPromise({\n catch: (cause) =>\n new TransportError({\n cause,\n message: `Failed to get balance (chainId=${params.chainId}, address=${params.address})`,\n url: client.transport.url ?? \"unknown\",\n }),\n try: () =>\n client.getBalance({\n address: params.address,\n }),\n });\n\n return balance >= params.required;\n }).pipe(\n Effect.withSpan(SpanNames.BALANCE_CHECK, {\n attributes: {\n address: params.address,\n chainId: params.chainId,\n required: params.required.toString(),\n },\n })\n ),\n\n hasSufficientTokenBalance: (params) =>\n Effect.gen(function* () {\n const balance = (yield* contractReader.read({\n abi: erc20Abi,\n address: params.tokenAddress,\n args: [params.address],\n chainId: params.chainId,\n functionName: \"balanceOf\",\n })) as bigint;\n\n return balance >= params.required;\n }).pipe(\n Effect.withSpan(SpanNames.BALANCE_CHECK_TOKEN, {\n attributes: {\n address: params.address,\n chainId: params.chainId,\n required: params.required.toString(),\n tokenAddress: params.tokenAddress,\n },\n })\n ),\n\n watchBalance: (params) =>\n Effect.gen(function* () {\n const client = yield* publicClientService.get(params.chainId);\n\n return Stream.async<bigint, unknown>((emit) => {\n const unwatch = client.watchBlockNumber({\n onBlockNumber: async (blockNumber) => {\n try {\n const balance = await client.getBalance({\n address: params.address,\n blockNumber,\n });\n emit.single(balance);\n } catch (error) {\n emit.fail(error as unknown);\n }\n },\n onError: (error) => {\n emit.fail(error as unknown);\n },\n pollingInterval: params.pollingInterval,\n });\n\n return Effect.sync(() => {\n unwatch();\n });\n });\n }).pipe(\n Effect.withSpan(SpanNames.BALANCE_WATCH, {\n attributes: {\n address: params.address,\n chainId: params.chainId,\n pollingInterval: params.pollingInterval,\n },\n })\n ),\n\n watchTokenBalance: (params) =>\n Effect.gen(function* () {\n const client = yield* publicClientService.get(params.chainId);\n\n return Stream.async<bigint, unknown>((emit) => {\n const unwatch = client.watchBlockNumber({\n onBlockNumber: async () => {\n try {\n const balanceEffect = contractReader.read({\n abi: erc20Abi,\n address: params.tokenAddress,\n args: [params.address],\n chainId: params.chainId,\n functionName: \"balanceOf\",\n });\n\n const balance = (await Effect.runPromise(balanceEffect)) as bigint;\n emit.single(balance);\n } catch (error) {\n emit.fail(error as unknown);\n }\n },\n onError: (error) => {\n emit.fail(error as unknown);\n },\n pollingInterval: params.pollingInterval,\n });\n\n return Effect.sync(() => {\n unwatch();\n });\n });\n }).pipe(\n Effect.withSpan(SpanNames.BALANCE_WATCH_TOKEN, {\n attributes: {\n address: params.address,\n chainId: params.chainId,\n pollingInterval: params.pollingInterval,\n tokenAddress: params.tokenAddress,\n },\n })\n ),\n });\n })\n);\n"]}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=service.test.integration.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"service.test.integration.d.ts","sourceRoot":"","sources":["../../src/balance/service.test.integration.ts"],"names":[],"mappings":""}
@@ -0,0 +1,289 @@
1
+ import { describe, expect, it } from "@effect/vitest";
2
+ import { Cause, Effect, Exit } from "effect";
3
+ import { mainnet } from "viem/chains";
4
+ import { BalanceService, decodeBytes32String } from "../balance/index.js";
5
+ import { ClientNotFoundError, TransportError } from "../core/index.js";
6
+ import { makeEffectEvmTestLayer } from "../testing-kit/index.js";
7
+ describe("BalanceService (Live)", () => {
8
+ const testAddress = "0x1234567890123456789012345678901234567890";
9
+ const tokenAddress = "0xabcdefabcdefabcdefabcdefabcdefabcdefabcd";
10
+ const testLayer = makeEffectEvmTestLayer({
11
+ publicClient: {
12
+ getBalance: () => Promise.resolve(1000000000000000000n),
13
+ multicall: (params) => {
14
+ const contracts = params.contracts ?? [];
15
+ return Promise.resolve(contracts.map((c) => {
16
+ switch (c.functionName) {
17
+ case "balanceOf":
18
+ return { result: 1000000000n, status: "success" };
19
+ case "decimals":
20
+ return { result: 18, status: "success" };
21
+ case "symbol":
22
+ return { result: "MOCK", status: "success" };
23
+ case "name":
24
+ return { result: "Mock Token", status: "success" };
25
+ default:
26
+ return { result: 0n, status: "success" };
27
+ }
28
+ }));
29
+ },
30
+ readContract: (params) => {
31
+ const functionName = params.functionName;
32
+ if (functionName === "balanceOf") {
33
+ return Promise.resolve(1000000000n);
34
+ }
35
+ return Promise.resolve(0n);
36
+ },
37
+ },
38
+ });
39
+ describe("getBalance", () => {
40
+ it.effect("returns native balance", () => Effect.gen(function* () {
41
+ const service = yield* BalanceService;
42
+ const result = yield* service.getBalance({
43
+ address: testAddress,
44
+ chainId: mainnet.id,
45
+ });
46
+ expect(result).toBe(1000000000000000000n);
47
+ }).pipe(Effect.provide(testLayer)));
48
+ it.effect("supports blockTag parameter", () => Effect.gen(function* () {
49
+ const service = yield* BalanceService;
50
+ const result = yield* service.getBalance({
51
+ address: testAddress,
52
+ blockTag: "latest",
53
+ chainId: mainnet.id,
54
+ });
55
+ expect(result).toBe(1000000000000000000n);
56
+ }).pipe(Effect.provide(testLayer)));
57
+ it.effect("fails with TransportError (not defect) when RPC rejects", () => {
58
+ const failingLayer = makeEffectEvmTestLayer({
59
+ publicClient: {
60
+ getBalance: () => Promise.reject(new Error("boom")),
61
+ },
62
+ });
63
+ return Effect.gen(function* () {
64
+ const service = yield* BalanceService;
65
+ const exit = yield* Effect.exit(service.getBalance({
66
+ address: testAddress,
67
+ chainId: mainnet.id,
68
+ }));
69
+ expect(Exit.isFailure(exit)).toBe(true);
70
+ if (Exit.isFailure(exit)) {
71
+ const error = Cause.failureOption(exit.cause);
72
+ expect(error._tag).toBe("Some");
73
+ if (error._tag === "Some") {
74
+ expect(error.value).toBeInstanceOf(TransportError);
75
+ }
76
+ }
77
+ }).pipe(Effect.provide(failingLayer));
78
+ });
79
+ it.effect("fails with ClientNotFoundError for unsupported chainId", () => Effect.gen(function* () {
80
+ const service = yield* BalanceService;
81
+ const exit = yield* Effect.exit(service.getBalance({
82
+ address: testAddress,
83
+ chainId: 123_456_789,
84
+ }));
85
+ expect(Exit.isFailure(exit)).toBe(true);
86
+ if (Exit.isFailure(exit)) {
87
+ const error = Cause.failureOption(exit.cause);
88
+ if (error._tag === "Some") {
89
+ expect(error.value).toBeInstanceOf(ClientNotFoundError);
90
+ }
91
+ }
92
+ }).pipe(Effect.provide(testLayer)));
93
+ });
94
+ describe("getTokenBalance", () => {
95
+ it.effect("returns token balance", () => Effect.gen(function* () {
96
+ const service = yield* BalanceService;
97
+ const result = yield* service.getTokenBalance({
98
+ address: testAddress,
99
+ chainId: mainnet.id,
100
+ tokenAddress,
101
+ });
102
+ expect(result).toBe(1000000000n);
103
+ }).pipe(Effect.provide(testLayer)));
104
+ });
105
+ describe("getTokenBalances", () => {
106
+ it.effect("returns multiple token balances with metadata", () => Effect.gen(function* () {
107
+ const service = yield* BalanceService;
108
+ const tokenAddresses = [
109
+ "0xabcdefabcdefabcdefabcdefabcdefabcdefabcd",
110
+ "0x1111111111111111111111111111111111111111",
111
+ ];
112
+ const result = yield* service.getTokenBalances({
113
+ address: testAddress,
114
+ chainId: mainnet.id,
115
+ tokenAddresses,
116
+ });
117
+ expect(result).toHaveLength(2);
118
+ expect(result[0]?.balance).toBe(1000000000n);
119
+ expect(result[0]?.decimals).toBe(18);
120
+ expect(result[0]?.symbol).toBe("MOCK");
121
+ expect(result[0]?.name).toBe("Mock Token");
122
+ }).pipe(Effect.provide(testLayer)));
123
+ it.effect("falls back to bytes32 when string calls fail", () => {
124
+ const bytes32Layer = makeEffectEvmTestLayer({
125
+ publicClient: {
126
+ multicall: (params) => {
127
+ const contracts = params.contracts ?? [];
128
+ return Promise.resolve(contracts.map((c) => {
129
+ const isBytes32Abi = Array.isArray(c.abi) &&
130
+ c.abi.some((item) => item.name === c.functionName && item.outputs?.[0]?.type === "bytes32");
131
+ switch (c.functionName) {
132
+ case "balanceOf":
133
+ return { result: 1000000000n, status: "success" };
134
+ case "decimals":
135
+ return { result: 18, status: "success" };
136
+ case "symbol":
137
+ if (isBytes32Abi) {
138
+ return {
139
+ result: "0x5553445400000000000000000000000000000000000000000000000000000000",
140
+ status: "success",
141
+ };
142
+ }
143
+ return {
144
+ error: new Error("not supported"),
145
+ status: "failure",
146
+ };
147
+ case "name":
148
+ if (isBytes32Abi) {
149
+ return {
150
+ result: "0x5465746865722055534400000000000000000000000000000000000000000000",
151
+ status: "success",
152
+ };
153
+ }
154
+ return {
155
+ error: new Error("not supported"),
156
+ status: "failure",
157
+ };
158
+ default:
159
+ return { result: 0n, status: "success" };
160
+ }
161
+ }));
162
+ },
163
+ },
164
+ });
165
+ return Effect.gen(function* () {
166
+ const service = yield* BalanceService;
167
+ const result = yield* service.getTokenBalances({
168
+ address: testAddress,
169
+ chainId: mainnet.id,
170
+ tokenAddresses: [tokenAddress],
171
+ });
172
+ expect(result).toHaveLength(1);
173
+ expect(result[0]?.symbol).toBe("USDT");
174
+ expect(result[0]?.name).toBe("Tether USD");
175
+ }).pipe(Effect.provide(bytes32Layer));
176
+ });
177
+ it.effect("prefers string results over bytes32 when both succeed", () => {
178
+ const hybridLayer = makeEffectEvmTestLayer({
179
+ publicClient: {
180
+ multicall: (params) => {
181
+ const contracts = params.contracts ?? [];
182
+ return Promise.resolve(contracts.map((c) => {
183
+ const isBytes32Abi = Array.isArray(c.abi) &&
184
+ c.abi.some((item) => item.name === c.functionName && item.outputs?.[0]?.type === "bytes32");
185
+ switch (c.functionName) {
186
+ case "balanceOf":
187
+ return { result: 1000000000n, status: "success" };
188
+ case "decimals":
189
+ return { result: 18, status: "success" };
190
+ case "symbol":
191
+ if (isBytes32Abi) {
192
+ return {
193
+ result: "0x4d4f434b00000000000000000000000000000000000000000000000000000000",
194
+ status: "success",
195
+ };
196
+ }
197
+ return {
198
+ result: "MOCK_STRING",
199
+ status: "success",
200
+ };
201
+ case "name":
202
+ if (isBytes32Abi) {
203
+ return {
204
+ result: "0x4d6f636b20546f6b656e0000000000000000000000000000000000000000000000",
205
+ status: "success",
206
+ };
207
+ }
208
+ return {
209
+ result: "Mock Token String",
210
+ status: "success",
211
+ };
212
+ default:
213
+ return { result: 0n, status: "success" };
214
+ }
215
+ }));
216
+ },
217
+ },
218
+ });
219
+ return Effect.gen(function* () {
220
+ const service = yield* BalanceService;
221
+ const result = yield* service.getTokenBalances({
222
+ address: testAddress,
223
+ chainId: mainnet.id,
224
+ tokenAddresses: [tokenAddress],
225
+ });
226
+ expect(result).toHaveLength(1);
227
+ expect(result[0]?.symbol).toBe("MOCK_STRING");
228
+ expect(result[0]?.name).toBe("Mock Token String");
229
+ }).pipe(Effect.provide(hybridLayer));
230
+ });
231
+ });
232
+ describe("hasSufficientBalance", () => {
233
+ it.effect("returns true/false based on native balance", () => Effect.gen(function* () {
234
+ const service = yield* BalanceService;
235
+ const ok = yield* service.hasSufficientBalance({
236
+ address: testAddress,
237
+ chainId: mainnet.id,
238
+ required: 500000000000000000n,
239
+ });
240
+ const notOk = yield* service.hasSufficientBalance({
241
+ address: testAddress,
242
+ chainId: mainnet.id,
243
+ required: 2000000000000000000n,
244
+ });
245
+ expect(ok).toBe(true);
246
+ expect(notOk).toBe(false);
247
+ }).pipe(Effect.provide(testLayer)));
248
+ });
249
+ describe("hasSufficientTokenBalance", () => {
250
+ it.effect("returns true/false based on token balance", () => Effect.gen(function* () {
251
+ const service = yield* BalanceService;
252
+ const ok = yield* service.hasSufficientTokenBalance({
253
+ address: testAddress,
254
+ chainId: mainnet.id,
255
+ required: 500000000n,
256
+ tokenAddress,
257
+ });
258
+ const notOk = yield* service.hasSufficientTokenBalance({
259
+ address: testAddress,
260
+ chainId: mainnet.id,
261
+ required: 2000000000n,
262
+ tokenAddress,
263
+ });
264
+ expect(ok).toBe(true);
265
+ expect(notOk).toBe(false);
266
+ }).pipe(Effect.provide(testLayer)));
267
+ });
268
+ });
269
+ describe("decodeBytes32String", () => {
270
+ it("decodes bytes32 string correctly", () => {
271
+ const usdt = "0x5553445400000000000000000000000000000000000000000000000000000000";
272
+ expect(decodeBytes32String(usdt)).toBe("USDT");
273
+ const tetherUsd = "0x5465746865722055534400000000000000000000000000000000000000000000";
274
+ expect(decodeBytes32String(tetherUsd)).toBe("Tether USD");
275
+ });
276
+ it("returns undefined for empty or invalid input", () => {
277
+ expect(decodeBytes32String("0x")).toBeUndefined();
278
+ expect(decodeBytes32String("0x0000000000000000000000000000000000000000000000000000000000000000")).toBeUndefined();
279
+ });
280
+ it("handles trailing null bytes", () => {
281
+ const dai = "0x4441490000000000000000000000000000000000000000000000000000000000";
282
+ expect(decodeBytes32String(dai)).toBe("DAI");
283
+ });
284
+ it("strips whitespace", () => {
285
+ const testWithSpace = "0x5445535420000000000000000000000000000000000000000000000000000000";
286
+ expect(decodeBytes32String(testWithSpace)).toBe("TEST");
287
+ });
288
+ });
289
+ //# sourceMappingURL=service.test.integration.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"service.test.integration.js","sourceRoot":"","sources":["../../src/balance/service.test.integration.ts"],"names":[],"mappings":"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","sourcesContent":["import { describe, expect, it } from \"@effect/vitest\";\nimport { Cause, Effect, Exit } from \"effect\";\nimport type { Address, Hex } from \"viem\";\nimport { mainnet } from \"viem/chains\";\nimport { BalanceService, decodeBytes32String } from \"@/src/balance/index.js\";\nimport { ClientNotFoundError, TransportError } from \"@/src/core/index.js\";\nimport { makeEffectEvmTestLayer } from \"@/src/testing-kit/index.js\";\n\ndescribe(\"BalanceService (Live)\", () => {\n const testAddress = \"0x1234567890123456789012345678901234567890\" as Address;\n const tokenAddress = \"0xabcdefabcdefabcdefabcdefabcdefabcdefabcd\" as Address;\n\n const testLayer = makeEffectEvmTestLayer({\n publicClient: {\n getBalance: () => Promise.resolve(1000000000000000000n),\n multicall: (params: unknown) => {\n const contracts =\n (params as { contracts?: Array<{ functionName?: string }> }).contracts ?? [];\n return Promise.resolve(\n contracts.map((c) => {\n switch (c.functionName) {\n case \"balanceOf\":\n return { result: 1000000000n, status: \"success\" as const };\n case \"decimals\":\n return { result: 18, status: \"success\" as const };\n case \"symbol\":\n return { result: \"MOCK\", status: \"success\" as const };\n case \"name\":\n return { result: \"Mock Token\", status: \"success\" as const };\n default:\n return { result: 0n, status: \"success\" as const };\n }\n })\n );\n },\n readContract: (params: unknown) => {\n const functionName = (params as { functionName?: string }).functionName;\n if (functionName === \"balanceOf\") {\n return Promise.resolve(1000000000n);\n }\n return Promise.resolve(0n);\n },\n },\n });\n\n describe(\"getBalance\", () => {\n it.effect(\"returns native balance\", () =>\n Effect.gen(function* () {\n const service = yield* BalanceService;\n const result = yield* service.getBalance({\n address: testAddress,\n chainId: mainnet.id,\n });\n\n expect(result).toBe(1000000000000000000n);\n }).pipe(Effect.provide(testLayer))\n );\n\n it.effect(\"supports blockTag parameter\", () =>\n Effect.gen(function* () {\n const service = yield* BalanceService;\n const result = yield* service.getBalance({\n address: testAddress,\n blockTag: \"latest\",\n chainId: mainnet.id,\n });\n\n expect(result).toBe(1000000000000000000n);\n }).pipe(Effect.provide(testLayer))\n );\n\n it.effect(\"fails with TransportError (not defect) when RPC rejects\", () => {\n const failingLayer = makeEffectEvmTestLayer({\n publicClient: {\n getBalance: () => Promise.reject(new Error(\"boom\")),\n },\n });\n\n return Effect.gen(function* () {\n const service = yield* BalanceService;\n const exit = yield* Effect.exit(\n service.getBalance({\n address: testAddress,\n chainId: mainnet.id,\n })\n );\n\n expect(Exit.isFailure(exit)).toBe(true);\n if (Exit.isFailure(exit)) {\n const error = Cause.failureOption(exit.cause);\n expect(error._tag).toBe(\"Some\");\n if (error._tag === \"Some\") {\n expect(error.value).toBeInstanceOf(TransportError);\n }\n }\n }).pipe(Effect.provide(failingLayer));\n });\n\n it.effect(\"fails with ClientNotFoundError for unsupported chainId\", () =>\n Effect.gen(function* () {\n const service = yield* BalanceService;\n const exit = yield* Effect.exit(\n service.getBalance({\n address: testAddress,\n chainId: 123_456_789,\n })\n );\n\n expect(Exit.isFailure(exit)).toBe(true);\n if (Exit.isFailure(exit)) {\n const error = Cause.failureOption(exit.cause);\n if (error._tag === \"Some\") {\n expect(error.value).toBeInstanceOf(ClientNotFoundError);\n }\n }\n }).pipe(Effect.provide(testLayer))\n );\n });\n\n describe(\"getTokenBalance\", () => {\n it.effect(\"returns token balance\", () =>\n Effect.gen(function* () {\n const service = yield* BalanceService;\n const result = yield* service.getTokenBalance({\n address: testAddress,\n chainId: mainnet.id,\n tokenAddress,\n });\n\n expect(result).toBe(1000000000n);\n }).pipe(Effect.provide(testLayer))\n );\n });\n\n describe(\"getTokenBalances\", () => {\n it.effect(\"returns multiple token balances with metadata\", () =>\n Effect.gen(function* () {\n const service = yield* BalanceService;\n const tokenAddresses = [\n \"0xabcdefabcdefabcdefabcdefabcdefabcdefabcd\" as Address,\n \"0x1111111111111111111111111111111111111111\" as Address,\n ];\n\n const result = yield* service.getTokenBalances({\n address: testAddress,\n chainId: mainnet.id,\n tokenAddresses,\n });\n\n expect(result).toHaveLength(2);\n expect(result[0]?.balance).toBe(1000000000n);\n expect(result[0]?.decimals).toBe(18);\n expect(result[0]?.symbol).toBe(\"MOCK\");\n expect(result[0]?.name).toBe(\"Mock Token\");\n }).pipe(Effect.provide(testLayer))\n );\n\n it.effect(\"falls back to bytes32 when string calls fail\", () => {\n type AbiItem = { name?: string; outputs?: Array<{ type?: string }> };\n type ContractCall = { functionName?: string; abi?: AbiItem[] };\n type MulticallParams = { contracts?: ContractCall[] };\n\n // Simulate token that uses bytes32 for symbol/name\n const bytes32Layer = makeEffectEvmTestLayer({\n publicClient: {\n multicall: (params: unknown) => {\n const contracts = (params as MulticallParams).contracts ?? [];\n return Promise.resolve(\n contracts.map((c) => {\n // Detect bytes32 ABI by checking if it returns bytes32\n const isBytes32Abi =\n Array.isArray(c.abi) &&\n c.abi.some(\n (item) => item.name === c.functionName && item.outputs?.[0]?.type === \"bytes32\"\n );\n\n switch (c.functionName) {\n case \"balanceOf\":\n return { result: 1000000000n, status: \"success\" as const };\n case \"decimals\":\n return { result: 18, status: \"success\" as const };\n case \"symbol\":\n if (isBytes32Abi) {\n // Return USDT in bytes32 format\n return {\n result:\n \"0x5553445400000000000000000000000000000000000000000000000000000000\" as Hex,\n status: \"success\" as const,\n };\n }\n // String version fails\n return {\n error: new Error(\"not supported\"),\n status: \"failure\" as const,\n };\n case \"name\":\n if (isBytes32Abi) {\n // Return \"Tether USD\" in bytes32 format\n return {\n result:\n \"0x5465746865722055534400000000000000000000000000000000000000000000\" as Hex,\n status: \"success\" as const,\n };\n }\n // String version fails\n return {\n error: new Error(\"not supported\"),\n status: \"failure\" as const,\n };\n default:\n return { result: 0n, status: \"success\" as const };\n }\n })\n );\n },\n },\n });\n\n return Effect.gen(function* () {\n const service = yield* BalanceService;\n const result = yield* service.getTokenBalances({\n address: testAddress,\n chainId: mainnet.id,\n tokenAddresses: [tokenAddress],\n });\n\n expect(result).toHaveLength(1);\n expect(result[0]?.symbol).toBe(\"USDT\");\n expect(result[0]?.name).toBe(\"Tether USD\");\n }).pipe(Effect.provide(bytes32Layer));\n });\n\n it.effect(\"prefers string results over bytes32 when both succeed\", () => {\n type AbiItem = { name?: string; outputs?: Array<{ type?: string }> };\n type ContractCall = { functionName?: string; abi?: AbiItem[] };\n type MulticallParams = { contracts?: ContractCall[] };\n\n // Simulate token that supports both string and bytes32\n const hybridLayer = makeEffectEvmTestLayer({\n publicClient: {\n multicall: (params: unknown) => {\n const contracts = (params as MulticallParams).contracts ?? [];\n return Promise.resolve(\n contracts.map((c) => {\n const isBytes32Abi =\n Array.isArray(c.abi) &&\n c.abi.some(\n (item) => item.name === c.functionName && item.outputs?.[0]?.type === \"bytes32\"\n );\n\n switch (c.functionName) {\n case \"balanceOf\":\n return { result: 1000000000n, status: \"success\" as const };\n case \"decimals\":\n return { result: 18, status: \"success\" as const };\n case \"symbol\":\n if (isBytes32Abi) {\n return {\n result:\n \"0x4d4f434b00000000000000000000000000000000000000000000000000000000\" as Hex,\n status: \"success\" as const,\n };\n }\n return {\n result: \"MOCK_STRING\",\n status: \"success\" as const,\n };\n case \"name\":\n if (isBytes32Abi) {\n return {\n result:\n \"0x4d6f636b20546f6b656e0000000000000000000000000000000000000000000000\" as Hex,\n status: \"success\" as const,\n };\n }\n return {\n result: \"Mock Token String\",\n status: \"success\" as const,\n };\n default:\n return { result: 0n, status: \"success\" as const };\n }\n })\n );\n },\n },\n });\n\n return Effect.gen(function* () {\n const service = yield* BalanceService;\n const result = yield* service.getTokenBalances({\n address: testAddress,\n chainId: mainnet.id,\n tokenAddresses: [tokenAddress],\n });\n\n expect(result).toHaveLength(1);\n // Should prefer string results\n expect(result[0]?.symbol).toBe(\"MOCK_STRING\");\n expect(result[0]?.name).toBe(\"Mock Token String\");\n }).pipe(Effect.provide(hybridLayer));\n });\n });\n\n describe(\"hasSufficientBalance\", () => {\n it.effect(\"returns true/false based on native balance\", () =>\n Effect.gen(function* () {\n const service = yield* BalanceService;\n const ok = yield* service.hasSufficientBalance({\n address: testAddress,\n chainId: mainnet.id,\n required: 500000000000000000n,\n });\n const notOk = yield* service.hasSufficientBalance({\n address: testAddress,\n chainId: mainnet.id,\n required: 2000000000000000000n,\n });\n\n expect(ok).toBe(true);\n expect(notOk).toBe(false);\n }).pipe(Effect.provide(testLayer))\n );\n });\n\n describe(\"hasSufficientTokenBalance\", () => {\n it.effect(\"returns true/false based on token balance\", () =>\n Effect.gen(function* () {\n const service = yield* BalanceService;\n const ok = yield* service.hasSufficientTokenBalance({\n address: testAddress,\n chainId: mainnet.id,\n required: 500000000n,\n tokenAddress,\n });\n const notOk = yield* service.hasSufficientTokenBalance({\n address: testAddress,\n chainId: mainnet.id,\n required: 2000000000n,\n tokenAddress,\n });\n\n expect(ok).toBe(true);\n expect(notOk).toBe(false);\n }).pipe(Effect.provide(testLayer))\n );\n });\n});\n\ndescribe(\"decodeBytes32String\", () => {\n it(\"decodes bytes32 string correctly\", () => {\n // \"USDT\" encoded as bytes32\n const usdt = \"0x5553445400000000000000000000000000000000000000000000000000000000\" as Hex;\n expect(decodeBytes32String(usdt)).toBe(\"USDT\");\n\n // \"Tether USD\" encoded as bytes32\n const tetherUsd = \"0x5465746865722055534400000000000000000000000000000000000000000000\" as Hex;\n expect(decodeBytes32String(tetherUsd)).toBe(\"Tether USD\");\n });\n\n it(\"returns undefined for empty or invalid input\", () => {\n expect(decodeBytes32String(\"0x\" as Hex)).toBeUndefined();\n expect(\n decodeBytes32String(\n \"0x0000000000000000000000000000000000000000000000000000000000000000\" as Hex\n )\n ).toBeUndefined();\n });\n\n it(\"handles trailing null bytes\", () => {\n // \"DAI\" with trailing nulls\n const dai = \"0x4441490000000000000000000000000000000000000000000000000000000000\" as Hex;\n expect(decodeBytes32String(dai)).toBe(\"DAI\");\n });\n\n it(\"strips whitespace\", () => {\n // \"TEST \" with space and nulls\n const testWithSpace =\n \"0x5445535420000000000000000000000000000000000000000000000000000000\" as Hex;\n expect(decodeBytes32String(testWithSpace)).toBe(\"TEST\");\n });\n});\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/balance/utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAEhC,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAOvD,MAAM,UAAU,mBAAmB,CAAC,GAAQ;IAC1C,IAAI,CAAC,GAAG,IAAI,GAAG,KAAK,IAAI,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC3C,OAAO,SAAS,CAAC;IACnB,CAAC;IAGD,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAG3B,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;QACzC,MAAM,UAAU,GAAG,YAAY,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QACvD,IAAI,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,EAAE,CAAC;YAE9B,SAAS;QACX,CAAC;QACD,MAAM,IAAI,GAAG,UAAU,CAAC,KAAK,CAAC;QAC9B,IAAI,IAAI,KAAK,CAAC,EAAE,CAAC;YACf,MAAM;QACR,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC;IACxC,CAAC;IAED,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IACrC,OAAO,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC;AAChD,CAAC"}
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/balance/utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAEhC,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAOvD,MAAM,UAAU,mBAAmB,CAAC,GAAQ;IAC1C,IAAI,CAAC,GAAG,IAAI,GAAG,KAAK,IAAI,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC3C,OAAO,SAAS,CAAC;IACnB,CAAC;IAGD,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAG3B,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;QACzC,MAAM,UAAU,GAAG,YAAY,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QACvD,IAAI,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,EAAE,CAAC;YAE9B,SAAS;QACX,CAAC;QACD,MAAM,IAAI,GAAG,UAAU,CAAC,KAAK,CAAC;QAC9B,IAAI,IAAI,KAAK,CAAC,EAAE,CAAC;YACf,MAAM;QACR,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC;IACxC,CAAC;IAED,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IACrC,OAAO,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC;AAChD,CAAC","sourcesContent":["import { Option } from \"effect\";\nimport type { Hex } from \"viem\";\nimport { parseHexByte } from \"@/src/internal/index.js\";\n\n/**\n * Decode a bytes32 string (used by some ERC-20 tokens for name/symbol).\n * Strips trailing null bytes and decodes as UTF-8.\n * Returns undefined if the result is empty or invalid.\n */\nexport function decodeBytes32String(hex: Hex): string | undefined {\n if (!hex || hex === \"0x\" || hex.length < 4) {\n return undefined;\n }\n\n // Remove 0x prefix\n const bytes = hex.slice(2);\n\n // Convert hex to bytes, stopping at first null byte\n const chars: string[] = [];\n for (let i = 0; i < bytes.length; i += 2) {\n const byteOption = parseHexByte(bytes.slice(i, i + 2));\n if (Option.isNone(byteOption)) {\n // Invalid hex byte, skip\n continue;\n }\n const byte = byteOption.value;\n if (byte === 0) {\n break;\n }\n chars.push(String.fromCharCode(byte));\n }\n\n const result = chars.join(\"\").trim();\n return result.length > 0 ? result : undefined;\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/block/errors.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAEhC,MAAM,OAAO,kBAAmB,SAAQ,MAAM,CAAC,WAAW,EAAsB,CAC9E,oBAAoB,EACpB;IACE,eAAe,EAAE,MAAM,CAAC,MAAM;IAC9B,OAAO,EAAE,MAAM,CAAC,MAAM;IACtB,OAAO,EAAE,MAAM,CAAC,MAAM;CACvB,CACF;CAAG;AAEJ,MAAM,OAAO,iBAAkB,SAAQ,MAAM,CAAC,WAAW,EAAqB,CAC5E,mBAAmB,EACnB;IACE,WAAW,EAAE,MAAM,CAAC,cAAc;IAClC,OAAO,EAAE,MAAM,CAAC,MAAM;IACtB,OAAO,EAAE,MAAM,CAAC,MAAM;IACtB,OAAO,EAAE,MAAM,CAAC,MAAM;CACvB,CACF;CAAG"}
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/block/errors.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAEhC,MAAM,OAAO,kBAAmB,SAAQ,MAAM,CAAC,WAAW,EAAsB,CAC9E,oBAAoB,EACpB;IACE,eAAe,EAAE,MAAM,CAAC,MAAM;IAC9B,OAAO,EAAE,MAAM,CAAC,MAAM;IACtB,OAAO,EAAE,MAAM,CAAC,MAAM;CACvB,CACF;CAAG;AAEJ,MAAM,OAAO,iBAAkB,SAAQ,MAAM,CAAC,WAAW,EAAqB,CAC5E,mBAAmB,EACnB;IACE,WAAW,EAAE,MAAM,CAAC,cAAc;IAClC,OAAO,EAAE,MAAM,CAAC,MAAM;IACtB,OAAO,EAAE,MAAM,CAAC,MAAM;IACtB,OAAO,EAAE,MAAM,CAAC,MAAM;CACvB,CACF;CAAG","sourcesContent":["import { Schema } from \"effect\";\n\nexport class BlockNotFoundError extends Schema.TaggedError<BlockNotFoundError>()(\n \"BlockNotFoundError\",\n {\n blockIdentifier: Schema.String,\n chainId: Schema.Number,\n message: Schema.String,\n }\n) {}\n\nexport class BlockTimeoutError extends Schema.TaggedError<BlockTimeoutError>()(\n \"BlockTimeoutError\",\n {\n blockNumber: Schema.BigIntFromSelf,\n chainId: Schema.Number,\n message: Schema.String,\n timeout: Schema.Number,\n }\n) {}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/block/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,cAAc,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/block/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,cAAc,CAAC","sourcesContent":["export * from \"./errors.js\";\nexport * from \"./service.js\";\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"service.js","sourceRoot":"","sources":["../../src/block/service.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAC;AAEhD,OAAO,EAAE,0BAA0B,EAAE,MAAM,0BAA0B,CAAC;AAEtE,OAAO,EAAE,mBAAmB,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAC1E,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AACrD,OAAO,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAgDpE,MAAM,OAAO,YAAa,SAAQ,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,EAG9D;CAAG;AAEN,MAAM,CAAC,MAAM,gBAAgB,GAAG,KAAK,CAAC,MAAM,CAC1C,YAAY,EACZ,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;IAClB,MAAM,mBAAmB,GAAG,KAAK,CAAC,CAAC,mBAAmB,CAAC;IAEvD,OAAO,YAAY,CAAC,EAAE,CAAC;QACrB,QAAQ,EAAE,CAAC,MAAM,EAAE,EAAE,CACnB,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;YAClB,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,mBAAmB,CAAC,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;YAE9D,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC;gBACrC,KAAK,EAAE,CAAC,KAAK,EAAE,EAAE,CACf,IAAI,kBAAkB,CAAC;oBACrB,eAAe,EAAE,MAAM,CAAC,WAAW,EAAE,QAAQ,EAAE,IAAI,MAAM,CAAC,QAAQ,IAAI,QAAQ;oBAC9E,OAAO,EAAE,MAAM,CAAC,OAAO;oBACvB,OAAO,EAAE,oBAAoB,KAAK,EAAE;iBACrC,CAAC;gBACJ,GAAG,EAAE,GAAG,EAAE;oBACR,IAAI,MAAM,CAAC,WAAW,KAAK,SAAS,EAAE,CAAC;wBACrC,OAAO,MAAM,CAAC,QAAQ,CAAC;4BACrB,WAAW,EAAE,MAAM,CAAC,WAAW;4BAC/B,mBAAmB,EAAE,MAAM,CAAC,mBAAmB,IAAI,KAAK;yBACzD,CAAC,CAAC;oBACL,CAAC;oBACD,OAAO,MAAM,CAAC,QAAQ,CAAC;wBACrB,QAAQ,EAAE,MAAM,CAAC,QAAQ,IAAI,QAAQ;wBACrC,mBAAmB,EAAE,MAAM,CAAC,mBAAmB,IAAI,KAAK;qBACzD,CAAC,CAAC;gBACL,CAAC;aACF,CAAC,CAAC;YAEH,OAAO,KAAK,CAAC;QACf,CAAC,CAAC,CAAC,IAAI,CACL,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,SAAS,EAAE;YACnC,UAAU,EAAE;gBACV,WAAW,EAAE,MAAM,CAAC,WAAW,EAAE,QAAQ,EAAE;gBAC3C,QAAQ,EAAE,MAAM,CAAC,QAAQ;gBACzB,OAAO,EAAE,MAAM,CAAC,OAAO;gBACvB,mBAAmB,EAAE,MAAM,CAAC,mBAAmB;aAChD;SACF,CAAC,CACH;QAEH,cAAc,EAAE,CAAC,MAAM,EAAE,EAAE,CACzB,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;YAClB,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,mBAAmB,CAAC,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;YAE9D,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC;gBACrC,KAAK,EAAE,CAAC,KAAK,EAAE,EAAE,CACf,IAAI,kBAAkB,CAAC;oBACrB,eAAe,EAAE,MAAM,CAAC,IAAI;oBAC5B,OAAO,EAAE,MAAM,CAAC,OAAO;oBACvB,OAAO,EAAE,4BAA4B,KAAK,EAAE;iBAC7C,CAAC;gBACJ,GAAG,EAAE,GAAG,EAAE,CACR,MAAM,CAAC,QAAQ,CAAC;oBACd,SAAS,EAAE,MAAM,CAAC,IAAI;oBACtB,mBAAmB,EAAE,MAAM,CAAC,mBAAmB,IAAI,KAAK;iBACzD,CAAC;aACL,CAAC,CAAC;YAEH,OAAO,KAAK,CAAC;QACf,CAAC,CAAC,CAAC,IAAI,CACL,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,iBAAiB,EAAE;YAC3C,UAAU,EAAE;gBACV,OAAO,EAAE,MAAM,CAAC,OAAO;gBACvB,IAAI,EAAE,MAAM,CAAC,IAAI;gBACjB,mBAAmB,EAAE,MAAM,CAAC,mBAAmB;aAChD;SACF,CAAC,CACH;QAEH,cAAc,EAAE,CAAC,MAAM,EAAE,EAAE,CACzB,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;YAClB,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,mBAAmB,CAAC,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;YAE9D,OAAO,KAAK,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC;gBAC9B,KAAK,EAAE,CAAC,KAAK,EAAE,EAAE,CACf,IAAI,cAAc,CAAC;oBACjB,KAAK;oBACL,OAAO,EAAE,+CAA+C,MAAM,CAAC,OAAO,GAAG;oBACzE,GAAG,EAAE,MAAM,CAAC,SAAS,CAAC,GAAG,IAAI,SAAS;iBACvC,CAAC;gBACJ,GAAG,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,cAAc,EAAE;aACnC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC,IAAI,CACL,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,gBAAgB,EAAE;YAC1C,UAAU,EAAE;gBACV,OAAO,EAAE,MAAM,CAAC,OAAO;aACxB;SACF,CAAC,CACH;QAEH,SAAS,EAAE,CAAC,MAAM,EAAE,EAAE,CACpB,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;YAClB,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,mBAAmB,CAAC,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;YAC9D,MAAM,MAAM,GAAY,EAAE,CAAC;YAE3B,KAAK,IAAI,CAAC,GAAG,MAAM,CAAC,SAAS,EAAE,CAAC,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC,EAAE,EAAE,CAAC;gBACxD,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC;oBACrC,KAAK,EAAE,CAAC,KAAK,EAAE,EAAE,CACf,IAAI,kBAAkB,CAAC;wBACrB,eAAe,EAAE,CAAC,CAAC,QAAQ,EAAE;wBAC7B,OAAO,EAAE,MAAM,CAAC,OAAO;wBACvB,OAAO,EAAE,SAAS,CAAC,eAAe,KAAK,EAAE;qBAC1C,CAAC;oBACJ,GAAG,EAAE,GAAG,EAAE,CACR,MAAM,CAAC,QAAQ,CAAC;wBACd,WAAW,EAAE,CAAC;wBACd,mBAAmB,EAAE,MAAM,CAAC,mBAAmB,IAAI,KAAK;qBACzD,CAAC;iBACL,CAAC,CAAC;gBAEH,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACrB,CAAC;YAED,OAAO,MAAM,CAAC;QAChB,CAAC,CAAC,CAAC,IAAI,CACL,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,eAAe,EAAE;YACzC,UAAU,EAAE;gBACV,OAAO,EAAE,MAAM,CAAC,OAAO;gBACvB,SAAS,EAAE,MAAM,CAAC,SAAS,CAAC,QAAQ,EAAE;gBACtC,mBAAmB,EAAE,MAAM,CAAC,mBAAmB;gBAC/C,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC,QAAQ,EAAE;aACnC;SACF,CAAC,CACH;QAEH,iBAAiB,EAAE,CAAC,MAAM,EAAE,EAAE,CAC5B,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;YAClB,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,mBAAmB,CAAC,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;YAE9D,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC;gBACrC,KAAK,EAAE,CAAC,KAAK,EAAE,EAAE,CACf,IAAI,kBAAkB,CAAC;oBACrB,eAAe,EAAE,MAAM,CAAC,WAAW,EAAE,QAAQ,EAAE,IAAI,QAAQ;oBAC3D,OAAO,EAAE,MAAM,CAAC,OAAO;oBACvB,OAAO,EAAE,oBAAoB,KAAK,EAAE;iBACrC,CAAC;gBACJ,GAAG,EAAE,GAAG,EAAE;oBACR,IAAI,MAAM,CAAC,WAAW,KAAK,SAAS,EAAE,CAAC;wBACrC,OAAO,MAAM,CAAC,QAAQ,CAAC;4BACrB,WAAW,EAAE,MAAM,CAAC,WAAW;yBAChC,CAAC,CAAC;oBACL,CAAC;oBACD,OAAO,MAAM,CAAC,QAAQ,CAAC;wBACrB,QAAQ,EAAE,QAAQ;qBACnB,CAAC,CAAC;gBACL,CAAC;aACF,CAAC,CAAC;YAEH,OAAO,KAAK,CAAC,SAAS,CAAC;QACzB,CAAC,CAAC,CAAC,IAAI,CACL,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,mBAAmB,EAAE;YAC7C,UAAU,EAAE;gBACV,WAAW,EAAE,MAAM,CAAC,WAAW,EAAE,QAAQ,EAAE;gBAC3C,OAAO,EAAE,MAAM,CAAC,OAAO;aACxB;SACF,CAAC,CACH;QAEH,YAAY,EAAE,CAAC,MAAM,EAAE,EAAE,CACvB,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;YAClB,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,mBAAmB,CAAC,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;YAC9D,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,IAAI,0BAA0B,CAAC;YAE7D,MAAM,IAAI,GAAG,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;gBAC/B,OAAO,IAAI,EAAE,CAAC;oBACZ,MAAM,YAAY,GAAG,KAAK,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC;wBAC5C,KAAK,EAAE,CAAC,KAAK,EAAE,EAAE,CACf,IAAI,cAAc,CAAC;4BACjB,KAAK;4BACL,OAAO,EAAE,+CAA+C,MAAM,CAAC,OAAO,GAAG;4BACzE,GAAG,EAAE,MAAM,CAAC,SAAS,CAAC,GAAG,IAAI,SAAS;yBACvC,CAAC;wBACJ,GAAG,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,cAAc,EAAE;qBACnC,CAAC,CAAC;oBAEH,IAAI,YAAY,IAAI,MAAM,CAAC,WAAW,EAAE,CAAC;wBACvC,OAAO,KAAK,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC;4BAC9B,KAAK,EAAE,CAAC,KAAK,EAAE,EAAE,CACf,IAAI,kBAAkB,CAAC;gCACrB,eAAe,EAAE,MAAM,CAAC,WAAW,CAAC,QAAQ,EAAE;gCAC9C,OAAO,EAAE,MAAM,CAAC,OAAO;gCACvB,OAAO,EAAE,yBAAyB,MAAM,CAAC,WAAW,KAAK,MAAM,CAAC,KAAK,CAAC,EAAE;6BACzE,CAAC;4BACJ,GAAG,EAAE,GAAG,EAAE,CACR,MAAM,CAAC,QAAQ,CAAC;gCACd,WAAW,EAAE,MAAM,CAAC,WAAW;6BAChC,CAAC;yBACL,CAAC,CAAC;oBACL,CAAC;oBAED,KAAK,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;gBAC5B,CAAC;YACH,CAAC,CAAC,CAAC;YAEH,OAAO,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CACrB,MAAM,CAAC,WAAW,CAAC;gBACjB,QAAQ,EAAE,OAAO;gBACjB,SAAS,EAAE,GAAG,EAAE,CACd,IAAI,iBAAiB,CAAC;oBACpB,WAAW,EAAE,MAAM,CAAC,WAAW;oBAC/B,OAAO,EAAE,MAAM,CAAC,OAAO;oBACvB,OAAO,EAAE,6BAA6B,MAAM,CAAC,WAAW,EAAE;oBAC1D,OAAO;iBACR,CAAC;aACL,CAAC,CACH,CAAC;QACJ,CAAC,CAAC,CAAC,IAAI,CACL,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,UAAU,EAAE;YACpC,UAAU,EAAE;gBACV,WAAW,EAAE,MAAM,CAAC,WAAW,CAAC,QAAQ,EAAE;gBAC1C,OAAO,EAAE,MAAM,CAAC,OAAO;gBACvB,OAAO,EAAE,MAAM,CAAC,OAAO;aACxB;SACF,CAAC,CACH;QAEH,WAAW,EAAE,CAAC,MAAM,EAAE,EAAE,CACtB,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;YAClB,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,mBAAmB,CAAC,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;YAE9D,OAAO,iBAAiB,CAAiB;gBACvC,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,KAAgB;gBACrC,KAAK,EAAE,CAAC,EAAE,EAAE,EAAE,CACZ,MAAM,CAAC,WAAW,CAAC;oBACjB,mBAAmB,EAAE,MAAM,CAAC,mBAAmB,IAAI,KAAK;oBACxD,OAAO,EAAE,EAAE,CAAC,MAAM;oBAClB,OAAO,EAAE,EAAE,CAAC,OAAO;oBACnB,eAAe,EAAE,MAAM,CAAC,eAAe;iBACxC,CAAC;aACL,CAAC,CAAC;QACL,CAAC,CAAC,CAAC,IAAI,CACL,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,WAAW,EAAE;YACrC,UAAU,EAAE;gBACV,OAAO,EAAE,MAAM,CAAC,OAAO;gBACvB,mBAAmB,EAAE,MAAM,CAAC,mBAAmB;gBAC/C,eAAe,EAAE,MAAM,CAAC,eAAe;aACxC;SACF,CAAC,CACH;KACJ,CAAC,CAAC;AACL,CAAC,CAAC,CACH,CAAC"}
1
+ {"version":3,"file":"service.js","sourceRoot":"","sources":["../../src/block/service.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Stream } from \"effect\";\nimport { Context, Effect, Layer } from \"effect\";\nimport type { Block, Hash } from \"viem\";\nimport { DEFAULT_BLOCK_WAIT_TIMEOUT } from \"@/src/constants/index.js\";\nimport type { ClientNotFoundError } from \"@/src/core/index.js\";\nimport { PublicClientService, TransportError } from \"@/src/core/index.js\";\nimport { fromWatchCallback } from \"@/src/internal/index.js\";\nimport { SpanNames } from \"@/src/telemetry/index.js\";\nimport { BlockNotFoundError, BlockTimeoutError } from \"./errors.js\";\n\nexport type BlockServiceShape = {\n readonly getBlock: (params: {\n chainId: number;\n blockNumber?: bigint;\n blockTag?: \"latest\" | \"pending\" | \"earliest\" | \"safe\" | \"finalized\";\n includeTransactions?: boolean;\n }) => Effect.Effect<Block, BlockNotFoundError | ClientNotFoundError>;\n\n readonly getBlockByHash: (params: {\n chainId: number;\n hash: Hash;\n includeTransactions?: boolean;\n }) => Effect.Effect<Block, BlockNotFoundError | ClientNotFoundError>;\n\n readonly getBlockNumber: (params: {\n chainId: number;\n }) => Effect.Effect<bigint, ClientNotFoundError | TransportError>;\n\n readonly watchBlocks: (params: {\n chainId: number;\n pollingInterval?: number;\n includeTransactions?: boolean;\n }) => Effect.Effect<Stream.Stream<Block, unknown>, ClientNotFoundError>;\n\n readonly waitForBlock: (params: {\n chainId: number;\n blockNumber: bigint;\n timeout?: number;\n }) => Effect.Effect<\n Block,\n BlockNotFoundError | BlockTimeoutError | ClientNotFoundError | TransportError\n >;\n\n readonly getBlocks: (params: {\n chainId: number;\n fromBlock: bigint;\n toBlock: bigint;\n includeTransactions?: boolean;\n }) => Effect.Effect<Block[], ClientNotFoundError | BlockNotFoundError>;\n\n readonly getBlockTimestamp: (params: {\n chainId: number;\n blockNumber?: bigint;\n }) => Effect.Effect<bigint, ClientNotFoundError | BlockNotFoundError>;\n};\n\nexport class BlockService extends Context.Tag(\"ew3/BlockService\")<\n BlockService,\n BlockServiceShape\n>() {}\n\nexport const BlockServiceLive = Layer.effect(\n BlockService,\n Effect.gen(function* () {\n const publicClientService = yield* PublicClientService;\n\n return BlockService.of({\n getBlock: (params) =>\n Effect.gen(function* () {\n const client = yield* publicClientService.get(params.chainId);\n\n const block = yield* Effect.tryPromise({\n catch: (cause) =>\n new BlockNotFoundError({\n blockIdentifier: params.blockNumber?.toString() ?? params.blockTag ?? \"latest\",\n chainId: params.chainId,\n message: `Block not found: ${cause}`,\n }),\n try: () => {\n if (params.blockNumber !== undefined) {\n return client.getBlock({\n blockNumber: params.blockNumber,\n includeTransactions: params.includeTransactions ?? false,\n });\n }\n return client.getBlock({\n blockTag: params.blockTag ?? \"latest\",\n includeTransactions: params.includeTransactions ?? false,\n });\n },\n });\n\n return block;\n }).pipe(\n Effect.withSpan(SpanNames.BLOCK_GET, {\n attributes: {\n blockNumber: params.blockNumber?.toString(),\n blockTag: params.blockTag,\n chainId: params.chainId,\n includeTransactions: params.includeTransactions,\n },\n })\n ),\n\n getBlockByHash: (params) =>\n Effect.gen(function* () {\n const client = yield* publicClientService.get(params.chainId);\n\n const block = yield* Effect.tryPromise({\n catch: (cause) =>\n new BlockNotFoundError({\n blockIdentifier: params.hash,\n chainId: params.chainId,\n message: `Block not found by hash: ${cause}`,\n }),\n try: () =>\n client.getBlock({\n blockHash: params.hash,\n includeTransactions: params.includeTransactions ?? false,\n }),\n });\n\n return block;\n }).pipe(\n Effect.withSpan(SpanNames.BLOCK_GET_BY_HASH, {\n attributes: {\n chainId: params.chainId,\n hash: params.hash,\n includeTransactions: params.includeTransactions,\n },\n })\n ),\n\n getBlockNumber: (params) =>\n Effect.gen(function* () {\n const client = yield* publicClientService.get(params.chainId);\n\n return yield* Effect.tryPromise({\n catch: (cause) =>\n new TransportError({\n cause,\n message: `Failed to get current block number (chainId=${params.chainId})`,\n url: client.transport.url ?? \"unknown\",\n }),\n try: () => client.getBlockNumber(),\n });\n }).pipe(\n Effect.withSpan(SpanNames.BLOCK_GET_NUMBER, {\n attributes: {\n chainId: params.chainId,\n },\n })\n ),\n\n getBlocks: (params) =>\n Effect.gen(function* () {\n const client = yield* publicClientService.get(params.chainId);\n const blocks: Block[] = [];\n\n for (let i = params.fromBlock; i <= params.toBlock; i++) {\n const block = yield* Effect.tryPromise({\n catch: (cause) =>\n new BlockNotFoundError({\n blockIdentifier: i.toString(),\n chainId: params.chainId,\n message: `Block ${i} not found: ${cause}`,\n }),\n try: () =>\n client.getBlock({\n blockNumber: i,\n includeTransactions: params.includeTransactions ?? false,\n }),\n });\n\n blocks.push(block);\n }\n\n return blocks;\n }).pipe(\n Effect.withSpan(SpanNames.BLOCK_GET_RANGE, {\n attributes: {\n chainId: params.chainId,\n fromBlock: params.fromBlock.toString(),\n includeTransactions: params.includeTransactions,\n toBlock: params.toBlock.toString(),\n },\n })\n ),\n\n getBlockTimestamp: (params) =>\n Effect.gen(function* () {\n const client = yield* publicClientService.get(params.chainId);\n\n const block = yield* Effect.tryPromise({\n catch: (cause) =>\n new BlockNotFoundError({\n blockIdentifier: params.blockNumber?.toString() ?? \"latest\",\n chainId: params.chainId,\n message: `Block not found: ${cause}`,\n }),\n try: () => {\n if (params.blockNumber !== undefined) {\n return client.getBlock({\n blockNumber: params.blockNumber,\n });\n }\n return client.getBlock({\n blockTag: \"latest\",\n });\n },\n });\n\n return block.timestamp;\n }).pipe(\n Effect.withSpan(SpanNames.BLOCK_GET_TIMESTAMP, {\n attributes: {\n blockNumber: params.blockNumber?.toString(),\n chainId: params.chainId,\n },\n })\n ),\n\n waitForBlock: (params) =>\n Effect.gen(function* () {\n const client = yield* publicClientService.get(params.chainId);\n const timeout = params.timeout ?? DEFAULT_BLOCK_WAIT_TIMEOUT;\n\n const poll = Effect.gen(function* () {\n while (true) {\n const currentBlock = yield* Effect.tryPromise({\n catch: (cause) =>\n new TransportError({\n cause,\n message: `Failed to get current block number (chainId=${params.chainId})`,\n url: client.transport.url ?? \"unknown\",\n }),\n try: () => client.getBlockNumber(),\n });\n\n if (currentBlock >= params.blockNumber) {\n return yield* Effect.tryPromise({\n catch: (cause) =>\n new BlockNotFoundError({\n blockIdentifier: params.blockNumber.toString(),\n chainId: params.chainId,\n message: `Failed to fetch block ${params.blockNumber}: ${String(cause)}`,\n }),\n try: () =>\n client.getBlock({\n blockNumber: params.blockNumber,\n }),\n });\n }\n\n yield* Effect.sleep(1000);\n }\n });\n\n return yield* poll.pipe(\n Effect.timeoutFail({\n duration: timeout,\n onTimeout: () =>\n new BlockTimeoutError({\n blockNumber: params.blockNumber,\n chainId: params.chainId,\n message: `Timeout waiting for block ${params.blockNumber}`,\n timeout,\n }),\n })\n );\n }).pipe(\n Effect.withSpan(SpanNames.BLOCK_WAIT, {\n attributes: {\n blockNumber: params.blockNumber.toString(),\n chainId: params.chainId,\n timeout: params.timeout,\n },\n })\n ),\n\n watchBlocks: (params) =>\n Effect.gen(function* () {\n const client = yield* publicClientService.get(params.chainId);\n\n return fromWatchCallback<Block, unknown>({\n mapError: (error) => error as unknown,\n watch: (cb) =>\n client.watchBlocks({\n includeTransactions: params.includeTransactions ?? false,\n onBlock: cb.onData,\n onError: cb.onError,\n pollingInterval: params.pollingInterval,\n }),\n });\n }).pipe(\n Effect.withSpan(SpanNames.BLOCK_WATCH, {\n attributes: {\n chainId: params.chainId,\n includeTransactions: params.includeTransactions,\n pollingInterval: params.pollingInterval,\n },\n })\n ),\n });\n })\n);\n"]}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=service.test.integration.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"service.test.integration.d.ts","sourceRoot":"","sources":["../../src/block/service.test.integration.ts"],"names":[],"mappings":""}