sorokeep 1.0.0

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 (275) hide show
  1. package/CONTRIBUTING.md +296 -0
  2. package/LICENSE +21 -0
  3. package/README.md +677 -0
  4. package/dist/alerts/alerts.d.ts +21 -0
  5. package/dist/alerts/alerts.d.ts.map +1 -0
  6. package/dist/alerts/alerts.js +18 -0
  7. package/dist/alerts/alerts.js.map +1 -0
  8. package/dist/alerts/discord.d.ts +3 -0
  9. package/dist/alerts/discord.d.ts.map +1 -0
  10. package/dist/alerts/discord.js +199 -0
  11. package/dist/alerts/discord.js.map +1 -0
  12. package/dist/alerts/dispatcher.d.ts +13 -0
  13. package/dist/alerts/dispatcher.d.ts.map +1 -0
  14. package/dist/alerts/dispatcher.js +91 -0
  15. package/dist/alerts/dispatcher.js.map +1 -0
  16. package/dist/alerts/keys.d.ts +24 -0
  17. package/dist/alerts/keys.d.ts.map +1 -0
  18. package/dist/alerts/keys.js +44 -0
  19. package/dist/alerts/keys.js.map +1 -0
  20. package/dist/alerts/pagerduty.d.ts +8 -0
  21. package/dist/alerts/pagerduty.d.ts.map +1 -0
  22. package/dist/alerts/pagerduty.js +164 -0
  23. package/dist/alerts/pagerduty.js.map +1 -0
  24. package/dist/alerts/resource.d.ts +23 -0
  25. package/dist/alerts/resource.d.ts.map +1 -0
  26. package/dist/alerts/resource.js +167 -0
  27. package/dist/alerts/resource.js.map +1 -0
  28. package/dist/alerts/slack.d.ts +7 -0
  29. package/dist/alerts/slack.d.ts.map +1 -0
  30. package/dist/alerts/slack.js +184 -0
  31. package/dist/alerts/slack.js.map +1 -0
  32. package/dist/alerts/telegram.d.ts +9 -0
  33. package/dist/alerts/telegram.d.ts.map +1 -0
  34. package/dist/alerts/telegram.js +133 -0
  35. package/dist/alerts/telegram.js.map +1 -0
  36. package/dist/alerts/templates.d.ts +109 -0
  37. package/dist/alerts/templates.d.ts.map +1 -0
  38. package/dist/alerts/templates.js +139 -0
  39. package/dist/alerts/templates.js.map +1 -0
  40. package/dist/alerts/types.d.ts +113 -0
  41. package/dist/alerts/types.d.ts.map +1 -0
  42. package/dist/alerts/types.js +87 -0
  43. package/dist/alerts/types.js.map +1 -0
  44. package/dist/alerts/webhook.d.ts +13 -0
  45. package/dist/alerts/webhook.d.ts.map +1 -0
  46. package/dist/alerts/webhook.js +56 -0
  47. package/dist/alerts/webhook.js.map +1 -0
  48. package/dist/cli/schemaFormatter.d.ts +11 -0
  49. package/dist/cli/schemaFormatter.d.ts.map +1 -0
  50. package/dist/cli/schemaFormatter.js +74 -0
  51. package/dist/cli/schemaFormatter.js.map +1 -0
  52. package/dist/commands/alerts.d.ts +3 -0
  53. package/dist/commands/alerts.d.ts.map +1 -0
  54. package/dist/commands/alerts.js +256 -0
  55. package/dist/commands/alerts.js.map +1 -0
  56. package/dist/commands/budget.d.ts +3 -0
  57. package/dist/commands/budget.d.ts.map +1 -0
  58. package/dist/commands/budget.js +47 -0
  59. package/dist/commands/budget.js.map +1 -0
  60. package/dist/commands/channels.d.ts +3 -0
  61. package/dist/commands/channels.d.ts.map +1 -0
  62. package/dist/commands/channels.js +84 -0
  63. package/dist/commands/channels.js.map +1 -0
  64. package/dist/commands/check.d.ts +3 -0
  65. package/dist/commands/check.d.ts.map +1 -0
  66. package/dist/commands/check.js +58 -0
  67. package/dist/commands/check.js.map +1 -0
  68. package/dist/commands/completion.d.ts +3 -0
  69. package/dist/commands/completion.d.ts.map +1 -0
  70. package/dist/commands/completion.js +36 -0
  71. package/dist/commands/completion.js.map +1 -0
  72. package/dist/commands/costs.d.ts +15 -0
  73. package/dist/commands/costs.d.ts.map +1 -0
  74. package/dist/commands/costs.js +280 -0
  75. package/dist/commands/costs.js.map +1 -0
  76. package/dist/commands/daemon.d.ts +3 -0
  77. package/dist/commands/daemon.d.ts.map +1 -0
  78. package/dist/commands/daemon.js +93 -0
  79. package/dist/commands/daemon.js.map +1 -0
  80. package/dist/commands/db.d.ts +3 -0
  81. package/dist/commands/db.d.ts.map +1 -0
  82. package/dist/commands/db.js +140 -0
  83. package/dist/commands/db.js.map +1 -0
  84. package/dist/commands/guard.d.ts +3 -0
  85. package/dist/commands/guard.d.ts.map +1 -0
  86. package/dist/commands/guard.js +181 -0
  87. package/dist/commands/guard.js.map +1 -0
  88. package/dist/commands/history.d.ts +3 -0
  89. package/dist/commands/history.d.ts.map +1 -0
  90. package/dist/commands/history.js +57 -0
  91. package/dist/commands/history.js.map +1 -0
  92. package/dist/commands/inspect.d.ts +3 -0
  93. package/dist/commands/inspect.d.ts.map +1 -0
  94. package/dist/commands/inspect.js +82 -0
  95. package/dist/commands/inspect.js.map +1 -0
  96. package/dist/commands/mcp.d.ts +3 -0
  97. package/dist/commands/mcp.d.ts.map +1 -0
  98. package/dist/commands/mcp.js +20 -0
  99. package/dist/commands/mcp.js.map +1 -0
  100. package/dist/commands/pause.d.ts +3 -0
  101. package/dist/commands/pause.d.ts.map +1 -0
  102. package/dist/commands/pause.js +32 -0
  103. package/dist/commands/pause.js.map +1 -0
  104. package/dist/commands/resources.d.ts +3 -0
  105. package/dist/commands/resources.d.ts.map +1 -0
  106. package/dist/commands/resources.js +95 -0
  107. package/dist/commands/resources.js.map +1 -0
  108. package/dist/commands/restore.d.ts +3 -0
  109. package/dist/commands/restore.d.ts.map +1 -0
  110. package/dist/commands/restore.js +92 -0
  111. package/dist/commands/restore.js.map +1 -0
  112. package/dist/commands/resume.d.ts +3 -0
  113. package/dist/commands/resume.d.ts.map +1 -0
  114. package/dist/commands/resume.js +31 -0
  115. package/dist/commands/resume.js.map +1 -0
  116. package/dist/commands/status.d.ts +3 -0
  117. package/dist/commands/status.d.ts.map +1 -0
  118. package/dist/commands/status.js +63 -0
  119. package/dist/commands/status.js.map +1 -0
  120. package/dist/commands/watch.d.ts +3 -0
  121. package/dist/commands/watch.d.ts.map +1 -0
  122. package/dist/commands/watch.js +163 -0
  123. package/dist/commands/watch.js.map +1 -0
  124. package/dist/core/aws_secrets.d.ts +13 -0
  125. package/dist/core/aws_secrets.d.ts.map +1 -0
  126. package/dist/core/aws_secrets.js +34 -0
  127. package/dist/core/aws_secrets.js.map +1 -0
  128. package/dist/core/budget.d.ts +10 -0
  129. package/dist/core/budget.d.ts.map +1 -0
  130. package/dist/core/budget.js +31 -0
  131. package/dist/core/budget.js.map +1 -0
  132. package/dist/core/channels.d.ts +67 -0
  133. package/dist/core/channels.d.ts.map +1 -0
  134. package/dist/core/channels.js +136 -0
  135. package/dist/core/channels.js.map +1 -0
  136. package/dist/core/check.d.ts +25 -0
  137. package/dist/core/check.d.ts.map +1 -0
  138. package/dist/core/check.js +85 -0
  139. package/dist/core/check.js.map +1 -0
  140. package/dist/core/completion.d.ts +9 -0
  141. package/dist/core/completion.d.ts.map +1 -0
  142. package/dist/core/completion.js +68 -0
  143. package/dist/core/completion.js.map +1 -0
  144. package/dist/core/costs.d.ts +90 -0
  145. package/dist/core/costs.d.ts.map +1 -0
  146. package/dist/core/costs.js +147 -0
  147. package/dist/core/costs.js.map +1 -0
  148. package/dist/core/decoder.d.ts +7 -0
  149. package/dist/core/decoder.d.ts.map +1 -0
  150. package/dist/core/decoder.js +38 -0
  151. package/dist/core/decoder.js.map +1 -0
  152. package/dist/core/discovery.d.ts +38 -0
  153. package/dist/core/discovery.d.ts.map +1 -0
  154. package/dist/core/discovery.js +208 -0
  155. package/dist/core/discovery.js.map +1 -0
  156. package/dist/core/extension.d.ts +83 -0
  157. package/dist/core/extension.d.ts.map +1 -0
  158. package/dist/core/extension.js +429 -0
  159. package/dist/core/extension.js.map +1 -0
  160. package/dist/core/inspect.d.ts +62 -0
  161. package/dist/core/inspect.d.ts.map +1 -0
  162. package/dist/core/inspect.js +303 -0
  163. package/dist/core/inspect.js.map +1 -0
  164. package/dist/core/introspection.d.ts +8 -0
  165. package/dist/core/introspection.d.ts.map +1 -0
  166. package/dist/core/introspection.js +8 -0
  167. package/dist/core/introspection.js.map +1 -0
  168. package/dist/core/monitor.d.ts +42 -0
  169. package/dist/core/monitor.d.ts.map +1 -0
  170. package/dist/core/monitor.js +188 -0
  171. package/dist/core/monitor.js.map +1 -0
  172. package/dist/core/rent_projection.d.ts +153 -0
  173. package/dist/core/rent_projection.d.ts.map +1 -0
  174. package/dist/core/rent_projection.js +146 -0
  175. package/dist/core/rent_projection.js.map +1 -0
  176. package/dist/core/scvalTranslator.d.ts +11 -0
  177. package/dist/core/scvalTranslator.d.ts.map +1 -0
  178. package/dist/core/scvalTranslator.js +36 -0
  179. package/dist/core/scvalTranslator.js.map +1 -0
  180. package/dist/core/state_diff.d.ts +45 -0
  181. package/dist/core/state_diff.d.ts.map +1 -0
  182. package/dist/core/state_diff.js +112 -0
  183. package/dist/core/state_diff.js.map +1 -0
  184. package/dist/core/status.d.ts +24 -0
  185. package/dist/core/status.d.ts.map +1 -0
  186. package/dist/core/status.js +57 -0
  187. package/dist/core/status.js.map +1 -0
  188. package/dist/core/vault.d.ts +37 -0
  189. package/dist/core/vault.d.ts.map +1 -0
  190. package/dist/core/vault.js +179 -0
  191. package/dist/core/vault.js.map +1 -0
  192. package/dist/core/watch.d.ts +36 -0
  193. package/dist/core/watch.d.ts.map +1 -0
  194. package/dist/core/watch.js +176 -0
  195. package/dist/core/watch.js.map +1 -0
  196. package/dist/daemon/loop.d.ts +38 -0
  197. package/dist/daemon/loop.d.ts.map +1 -0
  198. package/dist/daemon/loop.js +169 -0
  199. package/dist/daemon/loop.js.map +1 -0
  200. package/dist/db/backup.d.ts +12 -0
  201. package/dist/db/backup.d.ts.map +1 -0
  202. package/dist/db/backup.js +132 -0
  203. package/dist/db/backup.js.map +1 -0
  204. package/dist/db/budget.d.ts +17 -0
  205. package/dist/db/budget.d.ts.map +1 -0
  206. package/dist/db/budget.js +31 -0
  207. package/dist/db/budget.js.map +1 -0
  208. package/dist/db/database.d.ts +6 -0
  209. package/dist/db/database.d.ts.map +1 -0
  210. package/dist/db/database.js +134 -0
  211. package/dist/db/database.js.map +1 -0
  212. package/dist/db/migrations/.gitkeep +1 -0
  213. package/dist/db/migrations/001_resource_usage_logs.sql +28 -0
  214. package/dist/db/migrator.d.ts +28 -0
  215. package/dist/db/migrator.d.ts.map +1 -0
  216. package/dist/db/migrator.js +75 -0
  217. package/dist/db/migrator.js.map +1 -0
  218. package/dist/db/repositories.d.ts +474 -0
  219. package/dist/db/repositories.d.ts.map +1 -0
  220. package/dist/db/repositories.js +809 -0
  221. package/dist/db/repositories.js.map +1 -0
  222. package/dist/db/schema.sql +207 -0
  223. package/dist/index.d.ts +3 -0
  224. package/dist/index.d.ts.map +1 -0
  225. package/dist/index.js +47 -0
  226. package/dist/index.js.map +1 -0
  227. package/dist/lib.d.ts +20 -0
  228. package/dist/lib.d.ts.map +1 -0
  229. package/dist/lib.js +16 -0
  230. package/dist/lib.js.map +1 -0
  231. package/dist/logging/index.d.ts +22 -0
  232. package/dist/logging/index.d.ts.map +1 -0
  233. package/dist/logging/index.js +34 -0
  234. package/dist/logging/index.js.map +1 -0
  235. package/dist/logging/logger.d.ts +14 -0
  236. package/dist/logging/logger.d.ts.map +1 -0
  237. package/dist/logging/logger.js +135 -0
  238. package/dist/logging/logger.js.map +1 -0
  239. package/dist/logging/types.d.ts +10 -0
  240. package/dist/logging/types.d.ts.map +1 -0
  241. package/dist/logging/types.js +2 -0
  242. package/dist/logging/types.js.map +1 -0
  243. package/dist/mcp/index.d.ts +3 -0
  244. package/dist/mcp/index.d.ts.map +1 -0
  245. package/dist/mcp/index.js +14 -0
  246. package/dist/mcp/index.js.map +1 -0
  247. package/dist/mcp/server.d.ts +10 -0
  248. package/dist/mcp/server.d.ts.map +1 -0
  249. package/dist/mcp/server.js +51 -0
  250. package/dist/mcp/server.js.map +1 -0
  251. package/dist/mcp/tools/get-extension-costs.d.ts +4 -0
  252. package/dist/mcp/tools/get-extension-costs.d.ts.map +1 -0
  253. package/dist/mcp/tools/get-extension-costs.js +33 -0
  254. package/dist/mcp/tools/get-extension-costs.js.map +1 -0
  255. package/dist/mcp/tools/get_contract_status.d.ts +8 -0
  256. package/dist/mcp/tools/get_contract_status.d.ts.map +1 -0
  257. package/dist/mcp/tools/get_contract_status.js +33 -0
  258. package/dist/mcp/tools/get_contract_status.js.map +1 -0
  259. package/dist/rpc/client.d.ts +154 -0
  260. package/dist/rpc/client.d.ts.map +1 -0
  261. package/dist/rpc/client.js +766 -0
  262. package/dist/rpc/client.js.map +1 -0
  263. package/dist/utils/config.d.ts +51 -0
  264. package/dist/utils/config.d.ts.map +1 -0
  265. package/dist/utils/config.js +86 -0
  266. package/dist/utils/config.js.map +1 -0
  267. package/dist/utils/formatting.d.ts +10 -0
  268. package/dist/utils/formatting.d.ts.map +1 -0
  269. package/dist/utils/formatting.js +66 -0
  270. package/dist/utils/formatting.js.map +1 -0
  271. package/dist/utils/watch-config.d.ts +13 -0
  272. package/dist/utils/watch-config.d.ts.map +1 -0
  273. package/dist/utils/watch-config.js +32 -0
  274. package/dist/utils/watch-config.js.map +1 -0
  275. package/package.json +73 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"decoder.js","sourceRoot":"","sources":["../../src/core/decoder.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAQnE,MAAM,UAAU,eAAe,CAAC,SAAiB;IAC/C,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;IAC7C,MAAM,GAAG,GAAG,GAAG,CAAC,SAAS,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IAEvC,IAAI,GAAG,CAAC,MAAM,EAAE,KAAK,GAAG,CAAC,eAAe,CAAC,YAAY,EAAE,EAAE,CAAC;QACxD,MAAM,IAAI,KAAK,CAAC,+BAA+B,CAAC,CAAC;IACnD,CAAC;IAED,MAAM,YAAY,GAAG,GAAG,CAAC,YAAY,EAAE,CAAC;IACxC,MAAM,eAAe,GAAG,OAAO,CAAC,aAAa,CAAC,YAAY,CAAC,QAAQ,EAAE,CAAC,CAAC;IACvE,MAAM,UAAU,GAAG,eAAe,CAAC,QAAQ,EAAE,CAAC;IAE9C,MAAM,QAAQ,GAAG,YAAY,CAAC,GAAG,EAAE,CAAC;IACpC,IAAI,MAAW,CAAC;IAChB,IAAI,QAAQ,CAAC,MAAM,EAAE,KAAK,GAAG,CAAC,SAAS,CAAC,4BAA4B,EAAE,EAAE,CAAC;QACvE,MAAM,GAAG,kBAAkB,CAAC;IAC9B,CAAC;SAAM,CAAC;QACN,IAAI,CAAC;YACH,MAAM,GAAG,aAAa,CAAC,QAAQ,CAAC,CAAC;QACnC,CAAC;QAAC,MAAM,CAAC;YACP,MAAM,GAAG,SAAS,CAAC;QACrB,CAAC;IACH,CAAC;IAED,MAAM,cAAc,GAAG,YAAY,CAAC,UAAU,EAAE,CAAC;IACjD,IAAI,UAAU,GAAG,SAAS,CAAC;IAC3B,IAAI,cAAc,CAAC,KAAK,KAAK,GAAG,CAAC,sBAAsB,CAAC,UAAU,EAAE,CAAC,KAAK,EAAE,CAAC;QAC3E,UAAU,GAAG,YAAY,CAAC;IAC5B,CAAC;SAAM,IAAI,cAAc,CAAC,KAAK,KAAK,GAAG,CAAC,sBAAsB,CAAC,SAAS,EAAE,CAAC,KAAK,EAAE,CAAC;QACjF,UAAU,GAAG,WAAW,CAAC;IAC3B,CAAC;IAED,OAAO;QACL,UAAU;QACV,MAAM;QACN,UAAU;KACX,CAAC;AACJ,CAAC"}
@@ -0,0 +1,38 @@
1
+ import type Database from "better-sqlite3";
2
+ export interface DiscoveryResult {
3
+ /** Contract ID that was scanned. */
4
+ contractId: string;
5
+ /** Number of new storage keys discovered. */
6
+ newKeysDiscovered: number;
7
+ /** Total transactions scanned. */
8
+ transactionsScanned: number;
9
+ /** Error message if discovery failed. */
10
+ error?: string;
11
+ }
12
+ export interface BatchDiscoveryResult {
13
+ /** Total contracts scanned. */
14
+ contractsScanned: number;
15
+ /** Total new keys discovered across all contracts. */
16
+ totalNewKeys: number;
17
+ /** Per-contract results. */
18
+ results: DiscoveryResult[];
19
+ /** Errors that occurred during discovery. */
20
+ errors: string[];
21
+ }
22
+ /**
23
+ * Discover new storage keys for a contract by scanning recent transactions.
24
+ *
25
+ * Uses the Stellar RPC `getEvents` endpoint to find contract invocation events,
26
+ * then extracts ledger keys from the event data to discover persistent and
27
+ * temporary storage entries that the contract has touched.
28
+ *
29
+ * This is Layer 2 of the discovery architecture — it learns keys over time
30
+ * from observed contract activity.
31
+ */
32
+ export declare function discoverStorageKeys(db: Database.Database, contractId: string, network: string, rpcUrl?: string): Promise<DiscoveryResult>;
33
+ /**
34
+ * Run discovery for all registered contracts on a network.
35
+ * Called by the daemon as an optional step after the monitor cycle.
36
+ */
37
+ export declare function runBatchDiscovery(db: Database.Database, network: string, rpcUrl?: string): Promise<BatchDiscoveryResult>;
38
+ //# sourceMappingURL=discovery.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"discovery.d.ts","sourceRoot":"","sources":["../../src/core/discovery.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAS3C,MAAM,WAAW,eAAe;IAC5B,oCAAoC;IACpC,UAAU,EAAE,MAAM,CAAC;IACnB,6CAA6C;IAC7C,iBAAiB,EAAE,MAAM,CAAC;IAC1B,kCAAkC;IAClC,mBAAmB,EAAE,MAAM,CAAC;IAC5B,yCAAyC;IACzC,KAAK,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,oBAAoB;IACjC,+BAA+B;IAC/B,gBAAgB,EAAE,MAAM,CAAC;IACzB,sDAAsD;IACtD,YAAY,EAAE,MAAM,CAAC;IACrB,4BAA4B;IAC5B,OAAO,EAAE,eAAe,EAAE,CAAC;IAC3B,6CAA6C;IAC7C,MAAM,EAAE,MAAM,EAAE,CAAC;CACpB;AAWD;;;;;;;;;GASG;AACH,wBAAsB,mBAAmB,CACrC,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,MAAM,EACf,MAAM,CAAC,EAAE,MAAM,GAChB,OAAO,CAAC,eAAe,CAAC,CAsK1B;AAED;;;GAGG;AACH,wBAAsB,iBAAiB,CACnC,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,OAAO,EAAE,MAAM,EACf,MAAM,CAAC,EAAE,MAAM,GAChB,OAAO,CAAC,oBAAoB,CAAC,CA4B/B"}
@@ -0,0 +1,208 @@
1
+ import { rpc, xdr, StrKey } from "@stellar/stellar-sdk";
2
+ import { getEntriesForContract, upsertEntry, getAllContracts } from "../db/repositories.js";
3
+ import { getLogger } from "../logging/index.js";
4
+ const logger = getLogger().child({ component: "Discovery" });
5
+ // ─── RPC URLs ──────────────────────────────────────────────────────────────────
6
+ const RPC_URLS = {
7
+ testnet: "https://soroban-testnet.stellar.org",
8
+ mainnet: "https://mainnet.sorobanrpc.com",
9
+ };
10
+ // ─── Core implementation ──────────────────────────────────────────────────────
11
+ /**
12
+ * Discover new storage keys for a contract by scanning recent transactions.
13
+ *
14
+ * Uses the Stellar RPC `getEvents` endpoint to find contract invocation events,
15
+ * then extracts ledger keys from the event data to discover persistent and
16
+ * temporary storage entries that the contract has touched.
17
+ *
18
+ * This is Layer 2 of the discovery architecture — it learns keys over time
19
+ * from observed contract activity.
20
+ */
21
+ export async function discoverStorageKeys(db, contractId, network, rpcUrl) {
22
+ const result = {
23
+ contractId,
24
+ newKeysDiscovered: 0,
25
+ transactionsScanned: 0,
26
+ };
27
+ const url = rpcUrl ?? RPC_URLS[network];
28
+ if (!url) {
29
+ result.error = `Unknown network "${network}"`;
30
+ return result;
31
+ }
32
+ try {
33
+ const server = new rpc.Server(url);
34
+ // Get the latest ledger to set up the event window
35
+ const health = await server.getHealth();
36
+ const latestLedger = health.latestLedger ?? 0;
37
+ if (latestLedger === 0) {
38
+ result.error = "Could not determine latest ledger";
39
+ return result;
40
+ }
41
+ // Look back ~1 hour of ledgers (approximately 655 ledgers at 5.5s/ledger)
42
+ // The RPC limits event lookback, so we use a reasonable window
43
+ const startLedger = Math.max(1, latestLedger - 655);
44
+ // Get existing entry keys so we can identify new ones
45
+ const existingEntries = getEntriesForContract(db, contractId);
46
+ const existingKeys = new Set(existingEntries.map(e => e.entry_key_xdr));
47
+ // Fetch events for this contract with cursor-based pagination
48
+ const allEvents = [];
49
+ let cursor;
50
+ while (true) {
51
+ const request = {
52
+ filters: [
53
+ {
54
+ type: "contract",
55
+ contractIds: [contractId],
56
+ },
57
+ ],
58
+ limit: 100,
59
+ };
60
+ if (cursor) {
61
+ request.pagination = { cursor };
62
+ }
63
+ else {
64
+ request.startLedger = startLedger;
65
+ }
66
+ const page = await server.getEvents(request);
67
+ if (page.events && page.events.length > 0) {
68
+ allEvents.push(...page.events);
69
+ }
70
+ // Continue if there's a cursor for the next page
71
+ if (page.cursor && page.events && page.events.length === 100) {
72
+ cursor = page.cursor;
73
+ }
74
+ else {
75
+ break;
76
+ }
77
+ }
78
+ const txHashes = new Set();
79
+ for (const event of allEvents) {
80
+ if (event.txHash) {
81
+ txHashes.add(event.txHash);
82
+ }
83
+ }
84
+ if (txHashes.size === 0) {
85
+ logger.debug(`No events/transactions found for ${contractId} since ledger ${startLedger}`);
86
+ return result;
87
+ }
88
+ result.transactionsScanned = txHashes.size;
89
+ const rawContract = Buffer.from(contractId, "hex").length === 32
90
+ ? Buffer.from(contractId, "hex")
91
+ : decodeContractId(contractId);
92
+ for (const txHash of txHashes) {
93
+ try {
94
+ const txResponse = await server.getTransaction(txHash);
95
+ if (!txResponse.envelopeXdr) {
96
+ continue; // Skip if no envelope
97
+ }
98
+ // Parse envelope
99
+ // For mock compatibility, handle if envelopeXdr is already an object or a base64 string
100
+ const env = typeof txResponse.envelopeXdr === 'string'
101
+ ? xdr.TransactionEnvelope.fromXDR(txResponse.envelopeXdr, "base64")
102
+ : txResponse.envelopeXdr;
103
+ let innerTx;
104
+ if (env.switch().name === 'envelopeTypeTx') {
105
+ innerTx = env.v1().tx();
106
+ }
107
+ else if (env.switch().name === 'envelopeTypeTxFeeBump') {
108
+ innerTx = env.feeBump().tx().innerTx().v1().tx();
109
+ }
110
+ if (!innerTx)
111
+ continue;
112
+ const ext = innerTx.ext();
113
+ if (ext.switch().value !== 1)
114
+ continue;
115
+ const sorobanData = ext.v1().sorobanData();
116
+ const footprint = sorobanData.resources().footprint();
117
+ const keys = [...footprint.readOnly(), ...footprint.readWrite()];
118
+ for (const key of keys) {
119
+ if (key.switch().name === 'contractData') {
120
+ const contractData = key.contractData();
121
+ const contractAddr = contractData.contract();
122
+ // Check if key belongs to our contract
123
+ if (contractAddr.switch().name === 'scAddressTypeContract') {
124
+ const addrRaw = contractAddr.contractId();
125
+ // Compare raw contract address
126
+ if (Buffer.compare(Buffer.from(addrRaw), Buffer.from(rawContract)) === 0) {
127
+ const keyXdr = key.toXDR("base64");
128
+ if (!existingKeys.has(keyXdr)) {
129
+ existingKeys.add(keyXdr);
130
+ // Identify type (persistent, temporary, instance)
131
+ let entryType = "persistent";
132
+ if (contractData.durability().name === "temporary")
133
+ entryType = "temporary";
134
+ if (contractData.key().switch().name === "scvLedgerKeyContractInstance")
135
+ entryType = "instance";
136
+ upsertEntry(db, {
137
+ contract_id: contractId,
138
+ entry_key_xdr: keyXdr,
139
+ entry_type: entryType,
140
+ label: `Discovered (footprint)`,
141
+ live_until_ledger: 0, // We could fetch from getLedgerEntries if we want TTL, but we can do that in a sync pass
142
+ last_modified_ledger: 0,
143
+ discovery_source: "footprint",
144
+ });
145
+ result.newKeysDiscovered++;
146
+ }
147
+ }
148
+ }
149
+ }
150
+ }
151
+ }
152
+ catch (err) {
153
+ logger.debug(`Failed to parse transaction footprint for ${contractId} (tx: ${txHash}): ${err}`);
154
+ }
155
+ }
156
+ logger.debug(`Discovery for ${contractId}: scanned ${result.transactionsScanned} transactions, ` +
157
+ `found ${result.newKeysDiscovered} new keys`);
158
+ }
159
+ catch (err) {
160
+ const message = err instanceof Error ? err.message : String(err);
161
+ result.error = message;
162
+ logger.error(`Discovery failed for ${contractId}: ${message}`, err);
163
+ }
164
+ return result;
165
+ }
166
+ /**
167
+ * Run discovery for all registered contracts on a network.
168
+ * Called by the daemon as an optional step after the monitor cycle.
169
+ */
170
+ export async function runBatchDiscovery(db, network, rpcUrl) {
171
+ const batchResult = {
172
+ contractsScanned: 0,
173
+ totalNewKeys: 0,
174
+ results: [],
175
+ errors: [],
176
+ };
177
+ const contracts = getAllContracts(db).filter(c => c.network === network);
178
+ for (const contract of contracts) {
179
+ batchResult.contractsScanned++;
180
+ try {
181
+ const result = await discoverStorageKeys(db, contract.id, network, rpcUrl);
182
+ batchResult.results.push(result);
183
+ batchResult.totalNewKeys += result.newKeysDiscovered;
184
+ if (result.error) {
185
+ batchResult.errors.push(`${contract.id}: ${result.error}`);
186
+ }
187
+ }
188
+ catch (err) {
189
+ const message = err instanceof Error ? err.message : String(err);
190
+ batchResult.errors.push(`${contract.id}: ${message}`);
191
+ }
192
+ }
193
+ return batchResult;
194
+ }
195
+ // ─── Private helpers ──────────────────────────────────────────────────────────
196
+ /**
197
+ * Decode a Stellar contract ID (C...) to raw 32-byte buffer.
198
+ */
199
+ function decodeContractId(contractId) {
200
+ try {
201
+ return Buffer.from(StrKey.decodeContract(contractId));
202
+ }
203
+ catch {
204
+ // Fallback: assume hex
205
+ return Buffer.from(contractId, "hex");
206
+ }
207
+ }
208
+ //# sourceMappingURL=discovery.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"discovery.js","sourceRoot":"","sources":["../../src/core/discovery.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,83 @@
1
+ import type Database from "better-sqlite3";
2
+ /**
3
+ * Maximum number of auto-extension transactions allowed per contract per hour.
4
+ * Prevents runaway fee submissions under extreme network load (issue #142).
5
+ */
6
+ export declare const HOURLY_RATE_LIMIT = 5;
7
+ /**
8
+ * Check whether the given contract has reached its hourly auto-extension rate limit.
9
+ *
10
+ * Queries `extension_history` for records within the last 60 minutes and
11
+ * compares the count against `limit` (default: HOURLY_RATE_LIMIT).
12
+ *
13
+ * @param db - The SQLite database connection.
14
+ * @param contractId - The contract to check.
15
+ * @param limit - Maximum allowed extensions per hour (defaults to HOURLY_RATE_LIMIT).
16
+ * @returns `true` when the contract is rate-limited; `false` otherwise.
17
+ */
18
+ export declare function isRateLimited(db: import("better-sqlite3").Database, contractId: string, limit?: number): boolean;
19
+ export interface ExtensionResult {
20
+ success: boolean;
21
+ contractId: string;
22
+ entriesExtended: number;
23
+ txHash?: string;
24
+ ledger?: number;
25
+ error?: string;
26
+ /** Estimated fee in stroops (from simulation, before submission). */
27
+ estimatedFee?: number;
28
+ /** Actual fee charged in stroops (from submitted transaction result). */
29
+ feeCharged?: number;
30
+ /** CPU instructions consumed by the transaction. */
31
+ cpuInsns?: number;
32
+ memBytes?: number;
33
+ /** Read footprint size in bytes. */
34
+ readBytes?: number;
35
+ /** Write footprint size in bytes. */
36
+ writeBytes?: number;
37
+ /** Whether resource usage spiked. */
38
+ isAnomaly?: boolean;
39
+ anomalyDetails?: string;
40
+ }
41
+ export interface AutoExtensionResult {
42
+ contractsChecked: number;
43
+ contractsExtended: number;
44
+ entriesExtended: number;
45
+ errors: string[];
46
+ extensions: Array<{
47
+ contractId: string;
48
+ txHash: string;
49
+ entriesExtended: number;
50
+ ledger: number;
51
+ isAnomaly?: boolean;
52
+ anomalyDetails?: string;
53
+ }>;
54
+ }
55
+ export interface RestoreResult {
56
+ success: boolean;
57
+ contractId: string;
58
+ entriesRestored: number;
59
+ txHash?: string;
60
+ ledger?: number;
61
+ error?: string;
62
+ /** Estimated fee in stroops (from simulation, before submission). */
63
+ estimatedFee?: number;
64
+ cpuInsns?: number;
65
+ memBytes?: number;
66
+ minResourceFee?: number;
67
+ /** Fee charged in stroops. */
68
+ feeCharged?: number;
69
+ }
70
+ export declare function simulateExtension(db: Database.Database, contractId: string, entryKeyXdrs: string[], extendToLedgers: number, sourcePublicKey: string, rpcUrl?: string): Promise<ExtensionResult>;
71
+ export declare function extendEntries(db: Database.Database, contractId: string, entryKeyXdrs: string[], extendToLedgers: number, secretKey: string, rpcUrl?: string, sponsorSecret?: string): Promise<ExtensionResult>;
72
+ export declare function runAutoExtensions(db: Database.Database, network: string, rpcUrl?: string, sponsorSecret?: string): Promise<AutoExtensionResult>;
73
+ export declare function simulateRestore(db: Database.Database, contractId: string, entryKeyXdrs: string[], sourcePublicKey: string, rpcUrl?: string): Promise<RestoreResult>;
74
+ export declare function restoreEntries(db: Database.Database, contractId: string, entryKeyXdrs: string[], secretKey: string, rpcUrl?: string): Promise<RestoreResult>;
75
+ /**
76
+ * Resolve a secret key from a keypair_source string.
77
+ * Supports:
78
+ * - "env:VAR_NAME" — reads from environment variable
79
+ * - "vault:<secret_path>" — reads from HashiCorp Vault (KV v1/v2)
80
+ * - Direct secret key string starting with "S" (56 chars)
81
+ */
82
+ export declare function resolveSecretKey(source: string | null): Promise<string | null>;
83
+ //# sourceMappingURL=extension.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extension.d.ts","sourceRoot":"","sources":["../../src/core/extension.ts"],"names":[],"mappings":"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"}