@hugomrdias/foxer 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (311) hide show
  1. package/README.md +56 -0
  2. package/dist/src/api/index.d.ts +2 -0
  3. package/dist/src/api/index.d.ts.map +1 -0
  4. package/dist/src/api/index.js +2 -0
  5. package/dist/src/api/index.js.map +1 -0
  6. package/dist/src/api/runner.d.ts +12 -0
  7. package/dist/src/api/runner.d.ts.map +1 -0
  8. package/dist/src/api/runner.js +29 -0
  9. package/dist/src/api/runner.js.map +1 -0
  10. package/dist/src/api/server.d.ts +18 -0
  11. package/dist/src/api/server.d.ts.map +1 -0
  12. package/dist/src/api/server.js +21 -0
  13. package/dist/src/api/server.js.map +1 -0
  14. package/dist/src/api/sql-middleware.d.ts +7 -0
  15. package/dist/src/api/sql-middleware.d.ts.map +1 -0
  16. package/dist/src/api/sql-middleware.js +95 -0
  17. package/dist/src/api/sql-middleware.js.map +1 -0
  18. package/dist/src/api/sql.d.ts +14 -0
  19. package/dist/src/api/sql.d.ts.map +1 -0
  20. package/dist/src/api/sql.js +108 -0
  21. package/dist/src/api/sql.js.map +1 -0
  22. package/dist/src/api/sse.d.ts +3 -0
  23. package/dist/src/api/sse.d.ts.map +1 -0
  24. package/dist/src/api/sse.js +11 -0
  25. package/dist/src/api/sse.js.map +1 -0
  26. package/dist/src/bin/dev.d.ts +3 -0
  27. package/dist/src/bin/dev.d.ts.map +1 -0
  28. package/dist/src/bin/dev.js +76 -0
  29. package/dist/src/bin/dev.js.map +1 -0
  30. package/dist/src/bin/flags.d.ts +32 -0
  31. package/dist/src/bin/flags.d.ts.map +1 -0
  32. package/dist/src/bin/flags.js +55 -0
  33. package/dist/src/bin/flags.js.map +1 -0
  34. package/dist/src/bin/index.d.ts +3 -0
  35. package/dist/src/bin/index.d.ts.map +1 -0
  36. package/dist/src/bin/index.js +22 -0
  37. package/dist/src/bin/index.js.map +1 -0
  38. package/dist/src/bin/utils.d.ts +4 -0
  39. package/dist/src/bin/utils.d.ts.map +1 -0
  40. package/dist/src/bin/utils.js +52 -0
  41. package/dist/src/bin/utils.js.map +1 -0
  42. package/dist/src/client/index.d.ts +18 -0
  43. package/dist/src/client/index.d.ts.map +1 -0
  44. package/dist/src/client/index.js +150 -0
  45. package/dist/src/client/index.js.map +1 -0
  46. package/dist/src/config/config.d.ts +157 -0
  47. package/dist/src/config/config.d.ts.map +1 -0
  48. package/dist/src/config/config.js +65 -0
  49. package/dist/src/config/config.js.map +1 -0
  50. package/dist/src/config/env.d.ts +25 -0
  51. package/dist/src/config/env.d.ts.map +1 -0
  52. package/dist/src/config/env.js +21 -0
  53. package/dist/src/config/env.js.map +1 -0
  54. package/dist/src/contants.d.ts +4 -0
  55. package/dist/src/contants.d.ts.map +1 -0
  56. package/dist/src/contants.js +4 -0
  57. package/dist/src/contants.js.map +1 -0
  58. package/dist/src/db/actions/blocks.d.ts +44 -0
  59. package/dist/src/db/actions/blocks.d.ts.map +1 -0
  60. package/dist/src/db/actions/blocks.js +152 -0
  61. package/dist/src/db/actions/blocks.js.map +1 -0
  62. package/dist/src/db/actions/index.d.ts +2 -0
  63. package/dist/src/db/actions/index.d.ts.map +1 -0
  64. package/dist/src/db/actions/index.js +2 -0
  65. package/dist/src/db/actions/index.js.map +1 -0
  66. package/dist/src/db/actions/transactions.d.ts +11 -0
  67. package/dist/src/db/actions/transactions.d.ts.map +1 -0
  68. package/dist/src/db/actions/transactions.js +22 -0
  69. package/dist/src/db/actions/transactions.js.map +1 -0
  70. package/dist/src/db/client.d.ts +329 -0
  71. package/dist/src/db/client.d.ts.map +1 -0
  72. package/dist/src/db/client.js +108 -0
  73. package/dist/src/db/client.js.map +1 -0
  74. package/dist/src/db/column-types.d.ts +132 -0
  75. package/dist/src/db/column-types.d.ts.map +1 -0
  76. package/dist/src/db/column-types.js +86 -0
  77. package/dist/src/db/column-types.js.map +1 -0
  78. package/dist/src/db/encode.d.ts +10 -0
  79. package/dist/src/db/encode.d.ts.map +1 -0
  80. package/dist/src/db/encode.js +79 -0
  81. package/dist/src/db/encode.js.map +1 -0
  82. package/dist/src/db/migrate.d.ts +31 -0
  83. package/dist/src/db/migrate.d.ts.map +1 -0
  84. package/dist/src/db/migrate.js +147 -0
  85. package/dist/src/db/migrate.js.map +1 -0
  86. package/dist/src/db/schema/blocks.d.ts +369 -0
  87. package/dist/src/db/schema/blocks.d.ts.map +1 -0
  88. package/dist/src/db/schema/blocks.js +24 -0
  89. package/dist/src/db/schema/blocks.js.map +1 -0
  90. package/dist/src/db/schema/index.d.ts +1415 -0
  91. package/dist/src/db/schema/index.d.ts.map +1 -0
  92. package/dist/src/db/schema/index.js +18 -0
  93. package/dist/src/db/schema/index.js.map +1 -0
  94. package/dist/src/db/schema/transactions.d.ts +336 -0
  95. package/dist/src/db/schema/transactions.d.ts.map +1 -0
  96. package/dist/src/db/schema/transactions.js +33 -0
  97. package/dist/src/db/schema/transactions.js.map +1 -0
  98. package/dist/src/db/transaction.d.ts +7 -0
  99. package/dist/src/db/transaction.d.ts.map +1 -0
  100. package/dist/src/db/transaction.js +8 -0
  101. package/dist/src/db/transaction.js.map +1 -0
  102. package/dist/src/hooks/default-hooks.d.ts +2 -0
  103. package/dist/src/hooks/default-hooks.d.ts.map +1 -0
  104. package/dist/src/hooks/default-hooks.js +107 -0
  105. package/dist/src/hooks/default-hooks.js.map +1 -0
  106. package/dist/src/hooks/registry.d.ts +51 -0
  107. package/dist/src/hooks/registry.d.ts.map +1 -0
  108. package/dist/src/hooks/registry.js +32 -0
  109. package/dist/src/hooks/registry.js.map +1 -0
  110. package/dist/src/index.d.ts +10 -0
  111. package/dist/src/index.d.ts.map +1 -0
  112. package/dist/src/index.js +4 -0
  113. package/dist/src/index.js.map +1 -0
  114. package/dist/src/indexer/backfill.d.ts +15 -0
  115. package/dist/src/indexer/backfill.d.ts.map +1 -0
  116. package/dist/src/indexer/backfill.js +95 -0
  117. package/dist/src/indexer/backfill.js.map +1 -0
  118. package/dist/src/indexer/live.d.ts +20 -0
  119. package/dist/src/indexer/live.d.ts.map +1 -0
  120. package/dist/src/indexer/live.js +51 -0
  121. package/dist/src/indexer/live.js.map +1 -0
  122. package/dist/src/indexer/process-block.d.ts +29 -0
  123. package/dist/src/indexer/process-block.d.ts.map +1 -0
  124. package/dist/src/indexer/process-block.js +91 -0
  125. package/dist/src/indexer/process-block.js.map +1 -0
  126. package/dist/src/indexer/queue-block.d.ts +18 -0
  127. package/dist/src/indexer/queue-block.d.ts.map +1 -0
  128. package/dist/src/indexer/queue-block.js +38 -0
  129. package/dist/src/indexer/queue-block.js.map +1 -0
  130. package/dist/src/indexer/reorg.d.ts +24 -0
  131. package/dist/src/indexer/reorg.d.ts.map +1 -0
  132. package/dist/src/indexer/reorg.js +83 -0
  133. package/dist/src/indexer/reorg.js.map +1 -0
  134. package/dist/src/indexer/runner.d.ts +14 -0
  135. package/dist/src/indexer/runner.d.ts.map +1 -0
  136. package/dist/src/indexer/runner.js +22 -0
  137. package/dist/src/indexer/runner.js.map +1 -0
  138. package/dist/src/rpc/client.d.ts +11 -0
  139. package/dist/src/rpc/client.d.ts.map +1 -0
  140. package/dist/src/rpc/client.js +18 -0
  141. package/dist/src/rpc/client.js.map +1 -0
  142. package/dist/src/rpc/get-block.d.ts +16 -0
  143. package/dist/src/rpc/get-block.d.ts.map +1 -0
  144. package/dist/src/rpc/get-block.js +77 -0
  145. package/dist/src/rpc/get-block.js.map +1 -0
  146. package/dist/src/rpc/get-logs.d.ts +11 -0
  147. package/dist/src/rpc/get-logs.d.ts.map +1 -0
  148. package/dist/src/rpc/get-logs.js +23 -0
  149. package/dist/src/rpc/get-logs.js.map +1 -0
  150. package/dist/src/schema.d.ts +3 -0
  151. package/dist/src/schema.d.ts.map +1 -0
  152. package/dist/src/schema.js +9 -0
  153. package/dist/src/schema.js.map +1 -0
  154. package/dist/src/types.d.ts +22 -0
  155. package/dist/src/types.d.ts.map +1 -0
  156. package/dist/src/types.js +1 -0
  157. package/dist/src/types.js.map +1 -0
  158. package/dist/src/utils/bloom.d.ts +6 -0
  159. package/dist/src/utils/bloom.d.ts.map +1 -0
  160. package/dist/src/utils/bloom.js +30 -0
  161. package/dist/src/utils/bloom.js.map +1 -0
  162. package/dist/src/utils/build-conflict-columns.d.ts +4 -0
  163. package/dist/src/utils/build-conflict-columns.d.ts.map +1 -0
  164. package/dist/src/utils/build-conflict-columns.js +14 -0
  165. package/dist/src/utils/build-conflict-columns.js.map +1 -0
  166. package/dist/src/utils/common.d.ts +2 -0
  167. package/dist/src/utils/common.d.ts.map +1 -0
  168. package/dist/src/utils/common.js +4 -0
  169. package/dist/src/utils/common.js.map +1 -0
  170. package/dist/src/utils/cursor.d.ts +5 -0
  171. package/dist/src/utils/cursor.d.ts.map +1 -0
  172. package/dist/src/utils/cursor.js +8 -0
  173. package/dist/src/utils/cursor.js.map +1 -0
  174. package/dist/src/utils/format.d.ts +2 -0
  175. package/dist/src/utils/format.d.ts.map +1 -0
  176. package/dist/src/utils/format.js +16 -0
  177. package/dist/src/utils/format.js.map +1 -0
  178. package/dist/src/utils/hash.d.ts +9 -0
  179. package/dist/src/utils/hash.d.ts.map +1 -0
  180. package/dist/src/utils/hash.js +15 -0
  181. package/dist/src/utils/hash.js.map +1 -0
  182. package/dist/src/utils/json.d.ts +5 -0
  183. package/dist/src/utils/json.d.ts.map +1 -0
  184. package/dist/src/utils/json.js +11 -0
  185. package/dist/src/utils/json.js.map +1 -0
  186. package/dist/src/utils/logger.d.ts +11 -0
  187. package/dist/src/utils/logger.d.ts.map +1 -0
  188. package/dist/src/utils/logger.js +111 -0
  189. package/dist/src/utils/logger.js.map +1 -0
  190. package/dist/src/utils/shutdown.d.ts +9 -0
  191. package/dist/src/utils/shutdown.d.ts.map +1 -0
  192. package/dist/src/utils/shutdown.js +24 -0
  193. package/dist/src/utils/shutdown.js.map +1 -0
  194. package/dist/src/utils/timer.d.ts +6 -0
  195. package/dist/src/utils/timer.d.ts.map +1 -0
  196. package/dist/src/utils/timer.js +9 -0
  197. package/dist/src/utils/timer.js.map +1 -0
  198. package/dist/src/utils/types.d.ts +39 -0
  199. package/dist/src/utils/types.d.ts.map +1 -0
  200. package/dist/src/utils/types.js +1 -0
  201. package/dist/src/utils/types.js.map +1 -0
  202. package/dist/tsconfig.tsbuildinfo +1 -0
  203. package/hello/apps/foc-api/README.md +69 -0
  204. package/hello/apps/foc-api/biome.json +8 -0
  205. package/hello/apps/foc-api/index.html +13 -0
  206. package/hello/apps/foc-api/package.json +39 -0
  207. package/hello/apps/foc-api/public/vite.svg +1 -0
  208. package/hello/apps/foc-api/src/app.css +45 -0
  209. package/hello/apps/foc-api/src/app.tsx +43 -0
  210. package/hello/apps/foc-api/src/assets/Cloudflare_Logo.svg +51 -0
  211. package/hello/apps/foc-api/src/assets/react.svg +1 -0
  212. package/hello/apps/foc-api/src/client.ts +41 -0
  213. package/hello/apps/foc-api/src/components/account.tsx +100 -0
  214. package/hello/apps/foc-api/src/components/wallet-options.tsx +43 -0
  215. package/hello/apps/foc-api/src/index.css +68 -0
  216. package/hello/apps/foc-api/src/main.tsx +38 -0
  217. package/hello/apps/foc-api/src/vite-env.d.ts +1 -0
  218. package/hello/apps/foc-api/tsconfig.app.json +44 -0
  219. package/hello/apps/foc-api/tsconfig.json +17 -0
  220. package/hello/apps/foc-api/tsconfig.node.json +25 -0
  221. package/hello/apps/foc-api/tsconfig.worker.json +8 -0
  222. package/hello/apps/foc-api/vite.config.ts +8 -0
  223. package/hello/apps/foc-api/worker/capabilities.ts +25 -0
  224. package/hello/apps/foc-api/worker/index.ts +64 -0
  225. package/hello/apps/foc-api/worker/router.ts +35 -0
  226. package/hello/apps/foc-api/worker-configuration.d.ts +7357 -0
  227. package/hello/apps/foc-api/wrangler.jsonc +50 -0
  228. package/hello/apps/foc-app/README.md +69 -0
  229. package/hello/apps/foc-app/biome.json +8 -0
  230. package/hello/apps/foc-app/index.html +13 -0
  231. package/hello/apps/foc-app/package.json +39 -0
  232. package/hello/apps/foc-app/public/vite.svg +1 -0
  233. package/hello/apps/foc-app/src/app.css +45 -0
  234. package/hello/apps/foc-app/src/app.tsx +43 -0
  235. package/hello/apps/foc-app/src/assets/Cloudflare_Logo.svg +51 -0
  236. package/hello/apps/foc-app/src/assets/react.svg +1 -0
  237. package/hello/apps/foc-app/src/client.ts +41 -0
  238. package/hello/apps/foc-app/src/components/account.tsx +100 -0
  239. package/hello/apps/foc-app/src/components/wallet-options.tsx +43 -0
  240. package/hello/apps/foc-app/src/index.css +68 -0
  241. package/hello/apps/foc-app/src/main.tsx +38 -0
  242. package/hello/apps/foc-app/src/vite-env.d.ts +1 -0
  243. package/hello/apps/foc-app/tsconfig.app.json +44 -0
  244. package/hello/apps/foc-app/tsconfig.json +17 -0
  245. package/hello/apps/foc-app/tsconfig.node.json +25 -0
  246. package/hello/apps/foc-app/tsconfig.worker.json +8 -0
  247. package/hello/apps/foc-app/vite.config.ts +8 -0
  248. package/hello/apps/foc-app/worker/capabilities.ts +25 -0
  249. package/hello/apps/foc-app/worker/index.ts +64 -0
  250. package/hello/apps/foc-app/worker/router.ts +35 -0
  251. package/hello/apps/foc-app/worker-configuration.d.ts +7357 -0
  252. package/hello/apps/foc-app/wrangler.jsonc +50 -0
  253. package/hello/biome.json +50 -0
  254. package/hello/package.json +22 -0
  255. package/hello/pnpm-workspace.yaml +3 -0
  256. package/hello/tsconfig.json +37 -0
  257. package/package.json +78 -0
  258. package/src/api/index.ts +1 -0
  259. package/src/api/runner.ts +43 -0
  260. package/src/api/server.ts +38 -0
  261. package/src/api/sql-middleware.ts +131 -0
  262. package/src/api/sql.ts +149 -0
  263. package/src/api/sse.ts +12 -0
  264. package/src/bin/create.ts +199 -0
  265. package/src/bin/dev.ts +91 -0
  266. package/src/bin/flags.ts +65 -0
  267. package/src/bin/index.ts +28 -0
  268. package/src/bin/utils.ts +55 -0
  269. package/src/config/config.ts +221 -0
  270. package/src/config/env.ts +28 -0
  271. package/src/contants.ts +3 -0
  272. package/src/db/actions/blocks.ts +209 -0
  273. package/src/db/actions/index.ts +1 -0
  274. package/src/db/actions/transactions.ts +32 -0
  275. package/src/db/client.ts +186 -0
  276. package/src/db/column-types.ts +105 -0
  277. package/src/db/encode.ts +99 -0
  278. package/src/db/migrate.ts +222 -0
  279. package/src/db/schema/blocks.ts +24 -0
  280. package/src/db/schema/index.ts +21 -0
  281. package/src/db/schema/transactions.ts +39 -0
  282. package/src/db/transaction.ts +20 -0
  283. package/src/hooks/registry.ts +107 -0
  284. package/src/index.ts +9 -0
  285. package/src/indexer/backfill.ts +133 -0
  286. package/src/indexer/live.ts +76 -0
  287. package/src/indexer/process-block.ts +142 -0
  288. package/src/indexer/queue-block.ts +74 -0
  289. package/src/indexer/reorg.ts +120 -0
  290. package/src/indexer/runner.ts +35 -0
  291. package/src/rpc/client.ts +27 -0
  292. package/src/rpc/get-block.ts +100 -0
  293. package/src/rpc/get-logs.ts +38 -0
  294. package/src/schema.ts +10 -0
  295. package/src/types.ts +32 -0
  296. package/src/utils/bloom.ts +41 -0
  297. package/src/utils/build-conflict-columns.ts +26 -0
  298. package/src/utils/common.ts +3 -0
  299. package/src/utils/cursor.ts +7 -0
  300. package/src/utils/format.ts +18 -0
  301. package/src/utils/hash.ts +17 -0
  302. package/src/utils/json.ts +11 -0
  303. package/src/utils/logger.ts +149 -0
  304. package/src/utils/shutdown.ts +36 -0
  305. package/src/utils/timer.ts +8 -0
  306. package/src/utils/types.ts +87 -0
  307. package/template/biome.json +50 -0
  308. package/template/package.json +22 -0
  309. package/template/pnpm-workspace.yaml +3 -0
  310. package/template/tsconfig.json +37 -0
  311. package/tsconfig.json +8 -0
@@ -0,0 +1,16 @@
1
+ import type { PublicClient } from 'viem';
2
+ import type { Database } from '../db/client.ts';
3
+ import type { EncodedBlockWithTransactions } from '../types.ts';
4
+ /**
5
+ * Fetches a block while normalizing null-round behavior into an explicit result.
6
+ */
7
+ export declare function safeGetBlock(options: {
8
+ client: PublicClient;
9
+ blockNumber: bigint;
10
+ db: Database;
11
+ }): Promise<EncodedBlockWithTransactions>;
12
+ /**
13
+ * Detects Filecoin null-round RPC errors so callers can skip non-existent rounds.
14
+ */
15
+ export declare function isNullRoundRpcError(error: unknown): boolean;
16
+ //# sourceMappingURL=get-block.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-block.d.ts","sourceRoot":"","sources":["../../../src/rpc/get-block.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAQ,YAAY,EAAE,MAAM,MAAM,CAAA;AAC9C,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAA;AAK/C,OAAO,KAAK,EAAE,4BAA4B,EAAE,MAAM,aAAa,CAAA;AAE/D;;GAEG;AACH,wBAAsB,YAAY,CAAC,OAAO,EAAE;IAC1C,MAAM,EAAE,YAAY,CAAA;IACpB,WAAW,EAAE,MAAM,CAAA;IACnB,EAAE,EAAE,QAAQ,CAAA;CACb,GAAG,OAAO,CAAC,4BAA4B,CAAC,CAmDxC;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CA4B3D"}
@@ -0,0 +1,77 @@
1
+ import { encodeBlockWithTransactions, encodeNullRoundBlock, } from "../db/encode.js";
2
+ /**
3
+ * Fetches a block while normalizing null-round behavior into an explicit result.
4
+ */
5
+ export async function safeGetBlock(options) {
6
+ const { client, blockNumber, db } = options;
7
+ try {
8
+ const block = await client.getBlock({
9
+ blockNumber,
10
+ includeTransactions: true,
11
+ });
12
+ return encodeBlockWithTransactions(block);
13
+ }
14
+ catch (error) {
15
+ if (isNullRoundRpcError(error)) {
16
+ let previousBlock;
17
+ previousBlock = (await db.$prepared.getBlockById.execute({
18
+ blockNumber: blockNumber - 1n,
19
+ }))[0];
20
+ let previousBlockNumber = blockNumber - 1n;
21
+ // go to the chain and loop back until a full block is found
22
+ if (!previousBlock) {
23
+ while (!previousBlock) {
24
+ try {
25
+ const block = await client.getBlock({
26
+ blockNumber: previousBlockNumber,
27
+ });
28
+ previousBlock = {
29
+ number: block.number,
30
+ hash: block.hash,
31
+ parentHash: block.parentHash,
32
+ };
33
+ }
34
+ catch (error) {
35
+ // catched another null round, keep going
36
+ if (isNullRoundRpcError(error)) {
37
+ previousBlockNumber -= 1n;
38
+ continue;
39
+ }
40
+ throw error;
41
+ }
42
+ }
43
+ }
44
+ return encodeNullRoundBlock({
45
+ number: blockNumber,
46
+ hash: previousBlock.hash,
47
+ });
48
+ }
49
+ throw error;
50
+ }
51
+ }
52
+ /**
53
+ * Detects Filecoin null-round RPC errors so callers can skip non-existent rounds.
54
+ */
55
+ export function isNullRoundRpcError(error) {
56
+ if (!(error instanceof Error))
57
+ return false;
58
+ const message = error.message.toLowerCase();
59
+ if (message.includes('null round')) {
60
+ return true;
61
+ }
62
+ const details = error.details;
63
+ if (typeof details === 'string' &&
64
+ details.toLowerCase().includes('null round')) {
65
+ return true;
66
+ }
67
+ const cause = error.cause;
68
+ if (cause && typeof cause === 'object') {
69
+ const causeMessage = cause.message;
70
+ if (typeof causeMessage === 'string' &&
71
+ causeMessage.toLowerCase().includes('null round')) {
72
+ return true;
73
+ }
74
+ }
75
+ return false;
76
+ }
77
+ //# sourceMappingURL=get-block.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-block.js","sourceRoot":"","sources":["../../../src/rpc/get-block.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,2BAA2B,EAC3B,oBAAoB,GACrB,MAAM,iBAAiB,CAAA;AAGxB;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,OAIlC;IACC,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,EAAE,EAAE,GAAG,OAAO,CAAA;IAC3C,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC;YAClC,WAAW;YACX,mBAAmB,EAAE,IAAI;SAC1B,CAAC,CAAA;QAEF,OAAO,2BAA2B,CAAC,KAAK,CAAC,CAAA;IAC3C,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,mBAAmB,CAAC,KAAK,CAAC,EAAE,CAAC;YAC/B,IAAI,aAES,CAAA;YAEb,aAAa,GAAG,CACd,MAAM,EAAE,CAAC,SAAS,CAAC,YAAY,CAAC,OAAO,CAAC;gBACtC,WAAW,EAAE,WAAW,GAAG,EAAE;aAC9B,CAAC,CACH,CAAC,CAAC,CAAC,CAAA;YAEJ,IAAI,mBAAmB,GAAG,WAAW,GAAG,EAAE,CAAA;YAC1C,4DAA4D;YAC5D,IAAI,CAAC,aAAa,EAAE,CAAC;gBACnB,OAAO,CAAC,aAAa,EAAE,CAAC;oBACtB,IAAI,CAAC;wBACH,MAAM,KAAK,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC;4BAClC,WAAW,EAAE,mBAAmB;yBACjC,CAAC,CAAA;wBACF,aAAa,GAAG;4BACd,MAAM,EAAE,KAAK,CAAC,MAAM;4BACpB,IAAI,EAAE,KAAK,CAAC,IAAI;4BAChB,UAAU,EAAE,KAAK,CAAC,UAAU;yBAC7B,CAAA;oBACH,CAAC;oBAAC,OAAO,KAAK,EAAE,CAAC;wBACf,yCAAyC;wBACzC,IAAI,mBAAmB,CAAC,KAAK,CAAC,EAAE,CAAC;4BAC/B,mBAAmB,IAAI,EAAE,CAAA;4BACzB,SAAQ;wBACV,CAAC;wBACD,MAAM,KAAK,CAAA;oBACb,CAAC;gBACH,CAAC;YACH,CAAC;YACD,OAAO,oBAAoB,CAAC;gBAC1B,MAAM,EAAE,WAAW;gBACnB,IAAI,EAAE,aAAa,CAAC,IAAI;aACzB,CAAC,CAAA;QACJ,CAAC;QACD,MAAM,KAAK,CAAA;IACb,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,mBAAmB,CAAC,KAAc;IAChD,IAAI,CAAC,CAAC,KAAK,YAAY,KAAK,CAAC;QAAE,OAAO,KAAK,CAAA;IAE3C,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,WAAW,EAAE,CAAA;IAC3C,IAAI,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAE,CAAC;QACnC,OAAO,IAAI,CAAA;IACb,CAAC;IAED,MAAM,OAAO,GAAI,KAA+B,CAAC,OAAO,CAAA;IACxD,IACE,OAAO,OAAO,KAAK,QAAQ;QAC3B,OAAO,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,YAAY,CAAC,EAC5C,CAAC;QACD,OAAO,IAAI,CAAA;IACb,CAAC;IAED,MAAM,KAAK,GAAI,KAA6B,CAAC,KAAK,CAAA;IAClD,IAAI,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QACvC,MAAM,YAAY,GAAI,KAA+B,CAAC,OAAO,CAAA;QAC7D,IACE,OAAO,YAAY,KAAK,QAAQ;YAChC,YAAY,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,YAAY,CAAC,EACjD,CAAC;YACD,OAAO,IAAI,CAAA;QACb,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAA;AACd,CAAC"}
@@ -0,0 +1,11 @@
1
+ import type { AbiEvent, Address, Log, PublicClient } from 'viem';
2
+ import type { Logger } from '../utils/logger.ts';
3
+ export declare function getLogsInRange(args: {
4
+ logger: Logger;
5
+ client: PublicClient;
6
+ addresses: Address[];
7
+ events: readonly AbiEvent[];
8
+ fromBlock: bigint;
9
+ toBlock: bigint;
10
+ }): Promise<Map<bigint, Log<bigint, number, false, AbiEvent>[]>>;
11
+ //# sourceMappingURL=get-logs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-logs.d.ts","sourceRoot":"","sources":["../../../src/rpc/get-logs.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,EAAE,YAAY,EAAE,MAAM,MAAM,CAAA;AAChE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAA;AAGhD,wBAAsB,cAAc,CAAC,IAAI,EAAE;IACzC,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,EAAE,YAAY,CAAA;IACpB,SAAS,EAAE,OAAO,EAAE,CAAA;IACpB,MAAM,EAAE,SAAS,QAAQ,EAAE,CAAA;IAC3B,SAAS,EAAE,MAAM,CAAA;IACjB,OAAO,EAAE,MAAM,CAAA;CAChB,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,CAAC,EAAE,CAAC,CAAC,CA0B/D"}
@@ -0,0 +1,23 @@
1
+ import { startClock } from "../utils/timer.js";
2
+ export async function getLogsInRange(args) {
3
+ const { logger, client, addresses, events, fromBlock, toBlock } = args;
4
+ const endClock = startClock();
5
+ const logsByBlock = new Map();
6
+ const logs = await client.getLogs({
7
+ address: addresses,
8
+ events: events,
9
+ fromBlock: fromBlock,
10
+ toBlock: toBlock,
11
+ });
12
+ for (const log of logs) {
13
+ const byBlock = logsByBlock.get(log.blockNumber) ?? [];
14
+ byBlock.push(log);
15
+ logsByBlock.set(log.blockNumber, byBlock);
16
+ }
17
+ logger.info({
18
+ logs: logsByBlock.size,
19
+ duration: endClock(),
20
+ }, 'get logs');
21
+ return logsByBlock;
22
+ }
23
+ //# sourceMappingURL=get-logs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-logs.js","sourceRoot":"","sources":["../../../src/rpc/get-logs.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAA;AAE9C,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,IAOpC;IACC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,GAAG,IAAI,CAAA;IAEtE,MAAM,QAAQ,GAAG,UAAU,EAAE,CAAA;IAE7B,MAAM,WAAW,GAAG,IAAI,GAAG,EAAkD,CAAA;IAC7E,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC;QAChC,OAAO,EAAE,SAAS;QAClB,MAAM,EAAE,MAAM;QACd,SAAS,EAAE,SAAS;QACpB,OAAO,EAAE,OAAO;KACjB,CAAC,CAAA;IAEF,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,MAAM,OAAO,GAAG,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,WAAW,CAAC,IAAI,EAAE,CAAA;QACtD,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;QACjB,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,WAAW,EAAE,OAAO,CAAC,CAAA;IAC3C,CAAC;IACD,MAAM,CAAC,IAAI,CACT;QACE,IAAI,EAAE,WAAW,CAAC,IAAI;QACtB,QAAQ,EAAE,QAAQ,EAAE;KACrB,EACD,UAAU,CACX,CAAA;IACD,OAAO,WAAW,CAAA;AACpB,CAAC"}
@@ -0,0 +1,3 @@
1
+ export declare const schemaFiles: string[];
2
+ export { schema } from './db/schema/index.ts';
3
+ //# sourceMappingURL=schema.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/schema.ts"],"names":[],"mappings":"AAKA,eAAO,MAAM,WAAW,UAGvB,CAAA;AACD,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAA"}
@@ -0,0 +1,9 @@
1
+ import { dirname, resolve } from 'node:path';
2
+ import { fileURLToPath } from 'node:url';
3
+ const __dirname = dirname(fileURLToPath(import.meta.url));
4
+ export const schemaFiles = [
5
+ resolve(__dirname, './db/schema/blocks.js'),
6
+ resolve(__dirname, './db/schema/transactions.js'),
7
+ ];
8
+ export { schema } from "./db/schema/index.js";
9
+ //# sourceMappingURL=schema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAA;AAExC,MAAM,SAAS,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAA;AAEzD,MAAM,CAAC,MAAM,WAAW,GAAG;IACzB,OAAO,CAAC,SAAS,EAAE,uBAAuB,CAAC;IAC3C,OAAO,CAAC,SAAS,EAAE,6BAA6B,CAAC;CAClD,CAAA;AACD,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAA"}
@@ -0,0 +1,22 @@
1
+ import type { Simplify } from 'type-fest';
2
+ import type { Block, Transaction } from 'viem';
3
+ import type { Schema } from './db/schema/index';
4
+ /**
5
+ * Generic result with error
6
+ */
7
+ export type MaybeResult<ResultType = unknown, ErrorType = Error> = {
8
+ error: ErrorType;
9
+ result?: undefined;
10
+ } | {
11
+ result: ResultType;
12
+ error?: undefined;
13
+ };
14
+ export type UnknownObject = NonNullable<unknown>;
15
+ export type ChainTransaction = Transaction<bigint, number, false>;
16
+ export type ChainBlock = Block<bigint, true, 'latest' | 'safe' | 'finalized', ChainTransaction>;
17
+ export type EncodedBlock = Schema['blocks']['$inferInsert'];
18
+ export type EncodedTransaction = Schema['transactions']['$inferInsert'];
19
+ export type EncodedBlockWithTransactions = Simplify<EncodedBlock & {
20
+ transactions: EncodedTransaction[];
21
+ }>;
22
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAA;AACzC,OAAO,KAAK,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,MAAM,CAAA;AAC9C,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAA;AAC/C;;GAEG;AACH,MAAM,MAAM,WAAW,CAAC,UAAU,GAAG,OAAO,EAAE,SAAS,GAAG,KAAK,IAC3D;IACE,KAAK,EAAE,SAAS,CAAA;IAChB,MAAM,CAAC,EAAE,SAAS,CAAA;CACnB,GACD;IACE,MAAM,EAAE,UAAU,CAAA;IAClB,KAAK,CAAC,EAAE,SAAS,CAAA;CAClB,CAAA;AAEL,MAAM,MAAM,aAAa,GAAG,WAAW,CAAC,OAAO,CAAC,CAAA;AAEhD,MAAM,MAAM,gBAAgB,GAAG,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,CAAA;AACjE,MAAM,MAAM,UAAU,GAAG,KAAK,CAC5B,MAAM,EACN,IAAI,EACJ,QAAQ,GAAG,MAAM,GAAG,WAAW,EAC/B,gBAAgB,CACjB,CAAA;AACD,MAAM,MAAM,YAAY,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC,cAAc,CAAC,CAAA;AAC3D,MAAM,MAAM,kBAAkB,GAAG,MAAM,CAAC,cAAc,CAAC,CAAC,cAAc,CAAC,CAAA;AACvE,MAAM,MAAM,4BAA4B,GAAG,QAAQ,CACjD,YAAY,GAAG;IACb,YAAY,EAAE,kBAAkB,EAAE,CAAA;CACnC,CACF,CAAA"}
@@ -0,0 +1 @@
1
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,6 @@
1
+ /** biome-ignore-all lint/style/noNonNullAssertion: no need to check for null */
2
+ import { type Hex } from 'viem';
3
+ export declare const zeroLogsBloom = "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000";
4
+ export declare const isInBloom: (bloomHex: Hex, value: Hex) => boolean;
5
+ export declare function isBlockInteresting(bloomHex: Hex, addresses: Hex[], topics: Hex[]): boolean;
6
+ //# sourceMappingURL=bloom.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bloom.d.ts","sourceRoot":"","sources":["../../../src/utils/bloom.ts"],"names":[],"mappings":"AAAA,gFAAgF;AAChF,OAAO,EAAE,KAAK,GAAG,EAAyB,MAAM,MAAM,CAAA;AAEtD,eAAO,MAAM,aAAa,ugBAC4e,CAAA;AAItgB,eAAO,MAAM,SAAS,GAAI,UAAU,GAAG,EAAE,OAAO,GAAG,KAAG,OAkBrD,CAAA;AAED,wBAAgB,kBAAkB,CAChC,QAAQ,EAAE,GAAG,EACb,SAAS,EAAE,GAAG,EAAE,EAChB,MAAM,EAAE,GAAG,EAAE,GACZ,OAAO,CAQT"}
@@ -0,0 +1,30 @@
1
+ /** biome-ignore-all lint/style/noNonNullAssertion: no need to check for null */
2
+ import { hexToBytes, keccak256 } from 'viem';
3
+ export const zeroLogsBloom = '0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000';
4
+ // const BLOOM_SIZE_BYTES = 256;
5
+ export const isInBloom = (bloomHex, value) => {
6
+ const bloom = hexToBytes(bloomHex);
7
+ const hash = hexToBytes(keccak256(value));
8
+ // Ethereum uses 3 pairs of bytes from the hash to determine 3 bits
9
+ for (let i = 0; i < 6; i += 2) {
10
+ // Calculate the bit index (0 to 2047)
11
+ const bitIndex = ((hash[i] << 8) | hash[i + 1]) & 0x7ff;
12
+ // Check if that bit is set in the 256-byte bloom array
13
+ const byteIndex = 255 - Math.floor(bitIndex / 8);
14
+ const bitMask = 1 << (bitIndex % 8);
15
+ if ((bloom[byteIndex] & bitMask) === 0) {
16
+ return false; // Definitely NOT in this block
17
+ }
18
+ }
19
+ return true; // PROBABLY in this block (could be a false positive)
20
+ };
21
+ export function isBlockInteresting(bloomHex, addresses, topics) {
22
+ // Check if ANY of our target contracts might be in this block
23
+ const hasContract = addresses.some((addr) => isInBloom(bloomHex, addr));
24
+ if (!hasContract)
25
+ return false;
26
+ // Check if ANY of our target event signatures might be in this block
27
+ const hasEvent = topics.some((topic) => isInBloom(bloomHex, topic));
28
+ return hasEvent;
29
+ }
30
+ //# sourceMappingURL=bloom.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bloom.js","sourceRoot":"","sources":["../../../src/utils/bloom.ts"],"names":[],"mappings":"AAAA,gFAAgF;AAChF,OAAO,EAAY,UAAU,EAAE,SAAS,EAAE,MAAM,MAAM,CAAA;AAEtD,MAAM,CAAC,MAAM,aAAa,GACxB,ogBAAogB,CAAA;AAEtgB,gCAAgC;AAEhC,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,QAAa,EAAE,KAAU,EAAW,EAAE;IAC9D,MAAM,KAAK,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAA;IAClC,MAAM,IAAI,GAAG,UAAU,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAA;IAEzC,mEAAmE;IACnE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;QAC9B,sCAAsC;QACtC,MAAM,QAAQ,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAE,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,CAAE,CAAC,GAAG,KAAK,CAAA;QAEzD,uDAAuD;QACvD,MAAM,SAAS,GAAG,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAA;QAChD,MAAM,OAAO,GAAG,CAAC,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAA;QAEnC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAE,GAAG,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;YACxC,OAAO,KAAK,CAAA,CAAC,+BAA+B;QAC9C,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAA,CAAC,qDAAqD;AACnE,CAAC,CAAA;AAED,MAAM,UAAU,kBAAkB,CAChC,QAAa,EACb,SAAgB,EAChB,MAAa;IAEb,8DAA8D;IAC9D,MAAM,WAAW,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC,CAAA;IACvE,IAAI,CAAC,WAAW;QAAE,OAAO,KAAK,CAAA;IAE9B,qEAAqE;IACrE,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC,CAAA;IACnE,OAAO,QAAQ,CAAA;AACjB,CAAC"}
@@ -0,0 +1,4 @@
1
+ import { type SQL } from 'drizzle-orm';
2
+ import type { PgTable } from 'drizzle-orm/pg-core';
3
+ export declare const buildConflictUpdateColumns: <T extends PgTable, Q extends keyof T["_"]["columns"]>(table: T, columns?: Q[]) => Record<Q, SQL<unknown>>;
4
+ //# sourceMappingURL=build-conflict-columns.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"build-conflict-columns.d.ts","sourceRoot":"","sources":["../../../src/utils/build-conflict-columns.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,GAAG,EAAO,MAAM,aAAa,CAAA;AAC3C,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAA;AAIlD,eAAO,MAAM,0BAA0B,GACrC,CAAC,SAAS,OAAO,EACjB,CAAC,SAAS,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,SAAS,CAAC,EAEjC,OAAO,CAAC,EACR,UAAU,CAAC,EAAE,4BAed,CAAA"}
@@ -0,0 +1,14 @@
1
+ import { sql } from 'drizzle-orm';
2
+ import { getColumns } from 'drizzle-orm/utils';
3
+ import { snakeCase } from 'scule';
4
+ export const buildConflictUpdateColumns = (table, columns) => {
5
+ const cls = getColumns(table);
6
+ const cols = columns ?? Object.keys(cls);
7
+ const r = cols.reduce((acc, column) => {
8
+ const colName = snakeCase(cls[column].name);
9
+ acc[column] = sql.raw(`excluded.${colName}`);
10
+ return acc;
11
+ }, {});
12
+ return r;
13
+ };
14
+ //# sourceMappingURL=build-conflict-columns.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"build-conflict-columns.js","sourceRoot":"","sources":["../../../src/utils/build-conflict-columns.ts"],"names":[],"mappings":"AAAA,OAAO,EAAY,GAAG,EAAE,MAAM,aAAa,CAAA;AAE3C,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAA;AAC9C,OAAO,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AAEjC,MAAM,CAAC,MAAM,0BAA0B,GAAG,CAIxC,KAAQ,EACR,OAAa,EACb,EAAE;IACF,MAAM,GAAG,GAAG,UAAU,CAAC,KAAK,CAAC,CAAA;IAC7B,MAAM,IAAI,GAAG,OAAO,IAAK,MAAM,CAAC,IAAI,CAAC,GAAG,CAAS,CAAA;IACjD,MAAM,CAAC,GAAG,IAAI,CAAC,MAAM,CACnB,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE;QACd,MAAM,OAAO,GAAG,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAA;QAE3C,GAAG,CAAC,MAAM,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC,YAAY,OAAO,EAAE,CAAC,CAAA;QAC5C,OAAO,GAAG,CAAA;IACZ,CAAC,EACD,EAAoB,CACrB,CAAA;IAED,OAAO,CAAC,CAAA;AACV,CAAC,CAAA"}
@@ -0,0 +1,2 @@
1
+ export declare const noop: () => void;
2
+ //# sourceMappingURL=common.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"common.d.ts","sourceRoot":"","sources":["../../../src/utils/common.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,IAAI,QAAO,IAEvB,CAAA"}
@@ -0,0 +1,4 @@
1
+ export const noop = () => {
2
+ /** no-op */
3
+ };
4
+ //# sourceMappingURL=common.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"common.js","sourceRoot":"","sources":["../../../src/utils/common.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,IAAI,GAAG,GAAS,EAAE;IAC7B,YAAY;AACd,CAAC,CAAA"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Returns an inclusive window end, capped by a max block.
3
+ */
4
+ export declare function windowEnd(start: bigint, size: bigint, max: bigint): bigint;
5
+ //# sourceMappingURL=cursor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cursor.d.ts","sourceRoot":"","sources":["../../../src/utils/cursor.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAG1E"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Returns an inclusive window end, capped by a max block.
3
+ */
4
+ export function windowEnd(start, size, max) {
5
+ const end = start + size - 1n;
6
+ return end <= max ? end : max;
7
+ }
8
+ //# sourceMappingURL=cursor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cursor.js","sourceRoot":"","sources":["../../../src/utils/cursor.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,UAAU,SAAS,CAAC,KAAa,EAAE,IAAY,EAAE,GAAW;IAChE,MAAM,GAAG,GAAG,KAAK,GAAG,IAAI,GAAG,EAAE,CAAA;IAC7B,OAAO,GAAG,IAAI,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAA;AAC/B,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare const formatLogDuration: (ms: number) => string;
2
+ //# sourceMappingURL=format.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"format.d.ts","sourceRoot":"","sources":["../../../src/utils/format.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,iBAAiB,GAAI,IAAI,MAAM,WAiB3C,CAAA"}
@@ -0,0 +1,16 @@
1
+ export const formatLogDuration = (ms) => {
2
+ // If less than 1 second, return ms.
3
+ if (ms < 1000)
4
+ return `${Math.round(ms)}ms`;
5
+ const seconds = Math.floor(ms / 1000);
6
+ const h = Math.floor(seconds / 3600);
7
+ const m = Math.floor((seconds - h * 3600) / 60);
8
+ const s = seconds - h * 3600 - m * 60;
9
+ const secWithMs = ((ms % 60000) / 1000).toFixed(3).replace(/\.?0+$/, ''); // seconds including ms fraction, max 59.999
10
+ const hstr = h > 0 ? `${h}h ` : '';
11
+ const mstr = m > 0 || h > 0 ? `${m < 10 && h > 0 ? '0' : ''}${m}m ` : '';
12
+ // Add milliseconds fraction to the seconds string, e.g., 2.322s
13
+ const sstr = s > 0 || m > 0 ? `${s < 10 && m > 0 ? '0' : ''}${secWithMs}s` : '';
14
+ return `${hstr}${mstr}${sstr}`;
15
+ };
16
+ //# sourceMappingURL=format.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"format.js","sourceRoot":"","sources":["../../../src/utils/format.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,EAAU,EAAE,EAAE;IAC9C,oCAAoC;IACpC,IAAI,EAAE,GAAG,IAAI;QAAE,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,IAAI,CAAA;IAC3C,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,GAAG,IAAI,CAAC,CAAA;IAErC,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC,CAAA;IACpC,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,OAAO,GAAG,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,CAAA;IAC/C,MAAM,CAAC,GAAG,OAAO,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,GAAG,EAAE,CAAA;IACrC,MAAM,SAAS,GAAG,CAAC,CAAC,EAAE,GAAG,KAAK,CAAC,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAA,CAAC,4CAA4C;IAErH,MAAM,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAA;IAClC,MAAM,IAAI,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAA;IACxE,gEAAgE;IAChE,MAAM,IAAI,GACR,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,SAAS,GAAG,CAAC,CAAC,CAAC,EAAE,CAAA;IAEpE,OAAO,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,EAAE,CAAA;AAChC,CAAC,CAAA"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Normalizes hash strings so comparisons are case-insensitive.
3
+ */
4
+ export declare function normalizeHash(hash: string): string;
5
+ /**
6
+ * Compares two optional hash strings for equality.
7
+ */
8
+ export declare function hashEquals(left: string | null | undefined, right: string | null | undefined): boolean;
9
+ //# sourceMappingURL=hash.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hash.d.ts","sourceRoot":"","sources":["../../../src/utils/hash.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAElD;AAED;;GAEG;AACH,wBAAgB,UAAU,CACxB,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EAC/B,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAC/B,OAAO,CAGT"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Normalizes hash strings so comparisons are case-insensitive.
3
+ */
4
+ export function normalizeHash(hash) {
5
+ return hash.toLowerCase();
6
+ }
7
+ /**
8
+ * Compares two optional hash strings for equality.
9
+ */
10
+ export function hashEquals(left, right) {
11
+ if (left == null || right == null)
12
+ return left === right;
13
+ return normalizeHash(left) === normalizeHash(right);
14
+ }
15
+ //# sourceMappingURL=hash.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hash.js","sourceRoot":"","sources":["../../../src/utils/hash.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,UAAU,aAAa,CAAC,IAAY;IACxC,OAAO,IAAI,CAAC,WAAW,EAAE,CAAA;AAC3B,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,UAAU,CACxB,IAA+B,EAC/B,KAAgC;IAEhC,IAAI,IAAI,IAAI,IAAI,IAAI,KAAK,IAAI,IAAI;QAAE,OAAO,IAAI,KAAK,KAAK,CAAA;IACxD,OAAO,aAAa,CAAC,IAAI,CAAC,KAAK,aAAa,CAAC,KAAK,CAAC,CAAA;AACrD,CAAC"}
@@ -0,0 +1,5 @@
1
+ /** biome-ignore-all lint/suspicious/noExplicitAny: its ok */
2
+ type Reviver = (key: string, value: any) => any;
3
+ export declare function deserialize<type>(value: string, reviver?: Reviver): type;
4
+ export {};
5
+ //# sourceMappingURL=json.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"json.d.ts","sourceRoot":"","sources":["../../../src/utils/json.ts"],"names":[],"mappings":"AAAA,6DAA6D;AAC7D,KAAK,OAAO,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,KAAK,GAAG,CAAA;AAE/C,wBAAgB,WAAW,CAAC,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,GAAG,IAAI,CAOxE"}
@@ -0,0 +1,11 @@
1
+ export function deserialize(value, reviver) {
2
+ return JSON.parse(value, (key, value_) => {
3
+ let value = value_;
4
+ if (value?.__type === 'bigint')
5
+ value = BigInt(value.value);
6
+ if (value?.__type === 'Map')
7
+ value = new Map(value.value);
8
+ return reviver?.(key, value) ?? value;
9
+ });
10
+ }
11
+ //# sourceMappingURL=json.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"json.js","sourceRoot":"","sources":["../../../src/utils/json.ts"],"names":[],"mappings":"AAGA,MAAM,UAAU,WAAW,CAAO,KAAa,EAAE,OAAiB;IAChE,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE;QACvC,IAAI,KAAK,GAAG,MAAM,CAAA;QAClB,IAAI,KAAK,EAAE,MAAM,KAAK,QAAQ;YAAE,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAA;QAC3D,IAAI,KAAK,EAAE,MAAM,KAAK,KAAK;YAAE,KAAK,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,CAAA;QACzD,OAAO,OAAO,EAAE,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,KAAK,CAAA;IACvC,CAAC,CAAC,CAAA;AACJ,CAAC"}
@@ -0,0 +1,11 @@
1
+ import type { LevelWithSilent } from 'pino';
2
+ import pino from 'pino';
3
+ import type { Simplify } from 'type-fest';
4
+ export type LogMode = 'pretty' | 'json';
5
+ export type LogLevel = Simplify<LevelWithSilent>;
6
+ export type Logger = ReturnType<typeof createLogger>;
7
+ export declare function createLogger({ level, mode, }: {
8
+ level: LogLevel;
9
+ mode: LogMode;
10
+ }): pino.Logger<never, boolean>;
11
+ //# sourceMappingURL=logger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../../src/utils/logger.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAqB,eAAe,EAAE,MAAM,MAAM,CAAA;AAC9D,OAAO,IAAI,MAAM,MAAM,CAAA;AACvB,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAA;AAIzC,MAAM,MAAM,OAAO,GAAG,QAAQ,GAAG,MAAM,CAAA;AACvC,MAAM,MAAM,QAAQ,GAAG,QAAQ,CAAC,eAAe,CAAC,CAAA;AAChD,MAAM,MAAM,MAAM,GAAG,UAAU,CAAC,OAAO,YAAY,CAAC,CAAA;AAEpD,wBAAgB,YAAY,CAAC,EAC3B,KAAK,EACL,IAAI,GACL,EAAE;IACD,KAAK,EAAE,QAAQ,CAAA;IACf,IAAI,EAAE,OAAO,CAAA;CACd,+BAwCA"}
@@ -0,0 +1,111 @@
1
+ import pc from 'picocolors';
2
+ import pino from 'pino';
3
+ import { stringify } from 'viem';
4
+ import { formatLogDuration } from "./format.js";
5
+ export function createLogger({ level, mode, }) {
6
+ const stream = {
7
+ write(logString) {
8
+ const log = JSON.parse(logString);
9
+ const prettyLog = format(log);
10
+ // biome-ignore lint/suspicious/noConsole: logging to console
11
+ console.log(prettyLog);
12
+ },
13
+ };
14
+ const errorSerializer = pino.stdSerializers.wrapErrorSerializer((error) => {
15
+ error.meta = Array.isArray(error.meta) ? error.meta.join('\n') : error.meta;
16
+ // @ts-expect-error - type is not defined in the error serializer
17
+ error.type = undefined;
18
+ return error;
19
+ });
20
+ let logger;
21
+ if (mode === 'pretty') {
22
+ logger = pino({
23
+ level,
24
+ serializers: {
25
+ error: errorSerializer,
26
+ },
27
+ // Removes "pid" and "hostname" properties from the log.
28
+ base: undefined,
29
+ }, stream);
30
+ }
31
+ else {
32
+ logger = pino({
33
+ level,
34
+ serializers: {
35
+ error: errorSerializer,
36
+ },
37
+ // Removes "pid" and "hostname" properties from the log.
38
+ base: undefined,
39
+ });
40
+ }
41
+ return logger;
42
+ }
43
+ const INTERNAL_KEYS = ['level', 'time', 'msg', 'duration', 'error'];
44
+ const levels = {
45
+ 50: { label: 'ERROR', colorLabel: pc.red('ERROR') },
46
+ 40: { label: 'WARN ', colorLabel: pc.yellow('WARN ') },
47
+ 30: { label: 'INFO ', colorLabel: pc.green('INFO ') },
48
+ 20: { label: 'DEBUG', colorLabel: pc.blue('DEBUG') },
49
+ 10: { label: 'TRACE', colorLabel: pc.gray('TRACE') },
50
+ };
51
+ const timeFormatter = new Intl.DateTimeFormat(undefined, {
52
+ hour: '2-digit',
53
+ minute: '2-digit',
54
+ second: '2-digit',
55
+ fractionalSecondDigits: 3,
56
+ hour12: false,
57
+ });
58
+ const format = (log) => {
59
+ const time = timeFormatter.format(new Date(log.time));
60
+ const levelObject = levels[log.level ?? 30];
61
+ let prettyLog;
62
+ if (pc.isColorSupported) {
63
+ const level = levelObject.colorLabel;
64
+ const messageText = pc.reset(log.msg);
65
+ let keyText = '';
66
+ for (const key of Object.keys(log)) {
67
+ if (INTERNAL_KEYS.includes(key))
68
+ continue;
69
+ const value = typeof log[key] === 'string' ? log[key] : stringify(log[key]);
70
+ keyText += ` ${key}=${value}`;
71
+ }
72
+ let durationText = '';
73
+ if (log.duration) {
74
+ durationText = ` ${pc.gray(`(${formatLogDuration(log.duration)})`)}`;
75
+ }
76
+ prettyLog = [
77
+ `${pc.dim(time)} ${level} ${messageText}${pc.dim(keyText)}${durationText}`,
78
+ ];
79
+ }
80
+ else {
81
+ const level = levelObject.label;
82
+ let keyText = '';
83
+ for (const key of Object.keys(log)) {
84
+ if (INTERNAL_KEYS.includes(key))
85
+ continue;
86
+ const value = typeof log[key] === 'string' ? log[key] : stringify(log[key]);
87
+ keyText += ` ${key}=${value}`;
88
+ }
89
+ let durationText = '';
90
+ if (log.duration) {
91
+ durationText = ` (${formatLogDuration(log.duration)})`;
92
+ }
93
+ prettyLog = [`${time} ${level} ${log.msg}${keyText}${durationText}`];
94
+ }
95
+ if (log.error) {
96
+ if (log.error.stack) {
97
+ prettyLog.push(log.error.stack);
98
+ }
99
+ else {
100
+ prettyLog.push(`${log.error.name}: ${log.error.message}`);
101
+ }
102
+ if (typeof log.error === 'object' && 'where' in log.error) {
103
+ prettyLog.push(`where: ${log.error.where}`);
104
+ }
105
+ if (typeof log.error === 'object' && 'meta' in log.error) {
106
+ prettyLog.push(log.error.meta);
107
+ }
108
+ }
109
+ return prettyLog.join('\n');
110
+ };
111
+ //# sourceMappingURL=logger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.js","sourceRoot":"","sources":["../../../src/utils/logger.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import type { Logger } from 'pino';
2
+ export declare function createExit({ logger, stop, }: {
3
+ logger: Logger;
4
+ stop: () => Promise<void>;
5
+ }): void;
6
+ export declare function registerUnhandled({ logger }: {
7
+ logger: Logger;
8
+ }): void;
9
+ //# sourceMappingURL=shutdown.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shutdown.d.ts","sourceRoot":"","sources":["../../../src/utils/shutdown.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,MAAM,CAAA;AAElC,wBAAgB,UAAU,CAAC,EACzB,MAAM,EACN,IAAI,GACL,EAAE;IACD,MAAM,EAAE,MAAM,CAAA;IACd,IAAI,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;CAC1B,QAYA;AAED,wBAAgB,iBAAiB,CAAC,EAAE,MAAM,EAAE,EAAE;IAAE,MAAM,EAAE,MAAM,CAAA;CAAE,QAY/D"}
@@ -0,0 +1,24 @@
1
+ import { asyncExitHook, gracefulExit } from 'exit-hook';
2
+ export function createExit({ logger, stop, }) {
3
+ asyncExitHook(async () => {
4
+ logger.warn('shutting down...');
5
+ await stop();
6
+ logger.info('shutdown complete');
7
+ process.exit(0);
8
+ }, {
9
+ wait: 300,
10
+ });
11
+ }
12
+ export function registerUnhandled({ logger }) {
13
+ process.on('uncaughtException', (error, origin) => {
14
+ if (!origin || origin === 'uncaughtException') {
15
+ logger.error({ error }, 'uncaught exception');
16
+ gracefulExit(1);
17
+ }
18
+ });
19
+ process.on('unhandledRejection', (error) => {
20
+ logger.error({ error }, 'unhandled rejection');
21
+ gracefulExit(1);
22
+ });
23
+ }
24
+ //# sourceMappingURL=shutdown.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shutdown.js","sourceRoot":"","sources":["../../../src/utils/shutdown.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,WAAW,CAAA;AAGvD,MAAM,UAAU,UAAU,CAAC,EACzB,MAAM,EACN,IAAI,GAIL;IACC,aAAa,CACX,KAAK,IAAI,EAAE;QACT,MAAM,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAA;QAC/B,MAAM,IAAI,EAAE,CAAA;QACZ,MAAM,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAA;QAChC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACjB,CAAC,EACD;QACE,IAAI,EAAE,GAAG;KACV,CACF,CAAA;AACH,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,EAAE,MAAM,EAAsB;IAC9D,OAAO,CAAC,EAAE,CAAC,mBAAmB,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE;QAChD,IAAI,CAAC,MAAM,IAAI,MAAM,KAAK,mBAAmB,EAAE,CAAC;YAC9C,MAAM,CAAC,KAAK,CAAC,EAAE,KAAK,EAAE,EAAE,oBAAoB,CAAC,CAAA;YAC7C,YAAY,CAAC,CAAC,CAAC,CAAA;QACjB,CAAC;IACH,CAAC,CAAC,CAAA;IAEF,OAAO,CAAC,EAAE,CAAC,oBAAoB,EAAE,CAAC,KAAK,EAAE,EAAE;QACzC,MAAM,CAAC,KAAK,CAAC,EAAE,KAAK,EAAE,EAAE,qBAAqB,CAAC,CAAA;QAC9C,YAAY,CAAC,CAAC,CAAC,CAAA;IACjB,CAAC,CAAC,CAAA;AACJ,CAAC"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Measures the elapsed wall clock time in milliseconds (ms) between two points.
3
+ * @returns A function returning the elapsed time in milliseconds (ms).
4
+ */
5
+ export declare function startClock(): () => number;
6
+ //# sourceMappingURL=timer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"timer.d.ts","sourceRoot":"","sources":["../../../src/utils/timer.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,wBAAgB,UAAU,iBAGzB"}