@waiaas/daemon 2.0.0-rc.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 (480) hide show
  1. package/dist/api/error-hints.d.ts +15 -0
  2. package/dist/api/error-hints.d.ts.map +1 -0
  3. package/dist/api/error-hints.js +71 -0
  4. package/dist/api/error-hints.js.map +1 -0
  5. package/dist/api/index.d.ts +11 -0
  6. package/dist/api/index.d.ts.map +1 -0
  7. package/dist/api/index.js +14 -0
  8. package/dist/api/index.js.map +1 -0
  9. package/dist/api/middleware/address-validation.d.ts +38 -0
  10. package/dist/api/middleware/address-validation.d.ts.map +1 -0
  11. package/dist/api/middleware/address-validation.js +134 -0
  12. package/dist/api/middleware/address-validation.js.map +1 -0
  13. package/dist/api/middleware/csp.d.ts +17 -0
  14. package/dist/api/middleware/csp.d.ts.map +1 -0
  15. package/dist/api/middleware/csp.js +31 -0
  16. package/dist/api/middleware/csp.js.map +1 -0
  17. package/dist/api/middleware/error-handler.d.ts +16 -0
  18. package/dist/api/middleware/error-handler.d.ts.map +1 -0
  19. package/dist/api/middleware/error-handler.js +46 -0
  20. package/dist/api/middleware/error-handler.js.map +1 -0
  21. package/dist/api/middleware/host-guard.d.ts +11 -0
  22. package/dist/api/middleware/host-guard.d.ts.map +1 -0
  23. package/dist/api/middleware/host-guard.js +25 -0
  24. package/dist/api/middleware/host-guard.js.map +1 -0
  25. package/dist/api/middleware/index.d.ts +13 -0
  26. package/dist/api/middleware/index.d.ts.map +1 -0
  27. package/dist/api/middleware/index.js +13 -0
  28. package/dist/api/middleware/index.js.map +1 -0
  29. package/dist/api/middleware/kill-switch-guard.d.ts +19 -0
  30. package/dist/api/middleware/kill-switch-guard.d.ts.map +1 -0
  31. package/dist/api/middleware/kill-switch-guard.js +49 -0
  32. package/dist/api/middleware/kill-switch-guard.js.map +1 -0
  33. package/dist/api/middleware/master-auth.d.ts +15 -0
  34. package/dist/api/middleware/master-auth.d.ts.map +1 -0
  35. package/dist/api/middleware/master-auth.js +35 -0
  36. package/dist/api/middleware/master-auth.js.map +1 -0
  37. package/dist/api/middleware/owner-auth.d.ts +30 -0
  38. package/dist/api/middleware/owner-auth.d.ts.map +1 -0
  39. package/dist/api/middleware/owner-auth.js +133 -0
  40. package/dist/api/middleware/owner-auth.js.map +1 -0
  41. package/dist/api/middleware/request-id.d.ts +10 -0
  42. package/dist/api/middleware/request-id.d.ts.map +1 -0
  43. package/dist/api/middleware/request-id.js +18 -0
  44. package/dist/api/middleware/request-id.js.map +1 -0
  45. package/dist/api/middleware/request-logger.d.ts +9 -0
  46. package/dist/api/middleware/request-logger.d.ts.map +1 -0
  47. package/dist/api/middleware/request-logger.js +18 -0
  48. package/dist/api/middleware/request-logger.js.map +1 -0
  49. package/dist/api/middleware/session-auth.d.ts +21 -0
  50. package/dist/api/middleware/session-auth.d.ts.map +1 -0
  51. package/dist/api/middleware/session-auth.js +51 -0
  52. package/dist/api/middleware/session-auth.js.map +1 -0
  53. package/dist/api/middleware/siwe-verify.d.ts +31 -0
  54. package/dist/api/middleware/siwe-verify.d.ts.map +1 -0
  55. package/dist/api/middleware/siwe-verify.js +55 -0
  56. package/dist/api/middleware/siwe-verify.js.map +1 -0
  57. package/dist/api/routes/actions.d.ts +56 -0
  58. package/dist/api/routes/actions.d.ts.map +1 -0
  59. package/dist/api/routes/actions.js +291 -0
  60. package/dist/api/routes/actions.js.map +1 -0
  61. package/dist/api/routes/admin.d.ts +99 -0
  62. package/dist/api/routes/admin.d.ts.map +1 -0
  63. package/dist/api/routes/admin.js +1304 -0
  64. package/dist/api/routes/admin.js.map +1 -0
  65. package/dist/api/routes/display-currency-helper.d.ts +26 -0
  66. package/dist/api/routes/display-currency-helper.d.ts.map +1 -0
  67. package/dist/api/routes/display-currency-helper.js +47 -0
  68. package/dist/api/routes/display-currency-helper.js.map +1 -0
  69. package/dist/api/routes/health.d.ts +14 -0
  70. package/dist/api/routes/health.d.ts.map +1 -0
  71. package/dist/api/routes/health.js +47 -0
  72. package/dist/api/routes/health.js.map +1 -0
  73. package/dist/api/routes/index.d.ts +15 -0
  74. package/dist/api/routes/index.d.ts.map +1 -0
  75. package/dist/api/routes/index.js +15 -0
  76. package/dist/api/routes/index.js.map +1 -0
  77. package/dist/api/routes/mcp.d.ts +30 -0
  78. package/dist/api/routes/mcp.d.ts.map +1 -0
  79. package/dist/api/routes/mcp.js +156 -0
  80. package/dist/api/routes/mcp.js.map +1 -0
  81. package/dist/api/routes/nonce.d.ts +20 -0
  82. package/dist/api/routes/nonce.d.ts.map +1 -0
  83. package/dist/api/routes/nonce.js +48 -0
  84. package/dist/api/routes/nonce.js.map +1 -0
  85. package/dist/api/routes/openapi-schemas.d.ts +2281 -0
  86. package/dist/api/routes/openapi-schemas.d.ts.map +1 -0
  87. package/dist/api/routes/openapi-schemas.js +770 -0
  88. package/dist/api/routes/openapi-schemas.js.map +1 -0
  89. package/dist/api/routes/policies.d.ts +29 -0
  90. package/dist/api/routes/policies.d.ts.map +1 -0
  91. package/dist/api/routes/policies.js +332 -0
  92. package/dist/api/routes/policies.js.map +1 -0
  93. package/dist/api/routes/sessions.d.ts +35 -0
  94. package/dist/api/routes/sessions.d.ts.map +1 -0
  95. package/dist/api/routes/sessions.js +347 -0
  96. package/dist/api/routes/sessions.js.map +1 -0
  97. package/dist/api/routes/skills.d.ts +9 -0
  98. package/dist/api/routes/skills.d.ts.map +1 -0
  99. package/dist/api/routes/skills.js +59 -0
  100. package/dist/api/routes/skills.js.map +1 -0
  101. package/dist/api/routes/tokens.d.ts +25 -0
  102. package/dist/api/routes/tokens.d.ts.map +1 -0
  103. package/dist/api/routes/tokens.js +161 -0
  104. package/dist/api/routes/tokens.js.map +1 -0
  105. package/dist/api/routes/transactions.d.ts +68 -0
  106. package/dist/api/routes/transactions.d.ts.map +1 -0
  107. package/dist/api/routes/transactions.js +576 -0
  108. package/dist/api/routes/transactions.js.map +1 -0
  109. package/dist/api/routes/utils.d.ts +9 -0
  110. package/dist/api/routes/utils.d.ts.map +1 -0
  111. package/dist/api/routes/utils.js +52 -0
  112. package/dist/api/routes/utils.js.map +1 -0
  113. package/dist/api/routes/wallet.d.ts +36 -0
  114. package/dist/api/routes/wallet.d.ts.map +1 -0
  115. package/dist/api/routes/wallet.js +358 -0
  116. package/dist/api/routes/wallet.js.map +1 -0
  117. package/dist/api/routes/wallets.d.ts +43 -0
  118. package/dist/api/routes/wallets.d.ts.map +1 -0
  119. package/dist/api/routes/wallets.js +630 -0
  120. package/dist/api/routes/wallets.js.map +1 -0
  121. package/dist/api/routes/wc.d.ts +46 -0
  122. package/dist/api/routes/wc.d.ts.map +1 -0
  123. package/dist/api/routes/wc.js +354 -0
  124. package/dist/api/routes/wc.js.map +1 -0
  125. package/dist/api/routes/x402.d.ts +61 -0
  126. package/dist/api/routes/x402.d.ts.map +1 -0
  127. package/dist/api/routes/x402.js +493 -0
  128. package/dist/api/routes/x402.js.map +1 -0
  129. package/dist/api/server.d.ts +81 -0
  130. package/dist/api/server.d.ts.map +1 -0
  131. package/dist/api/server.js +406 -0
  132. package/dist/api/server.js.map +1 -0
  133. package/dist/index.d.ts +35 -0
  134. package/dist/index.d.ts.map +1 -0
  135. package/dist/index.js +43 -0
  136. package/dist/index.js.map +1 -0
  137. package/dist/infrastructure/action/action-provider-registry.d.ts +77 -0
  138. package/dist/infrastructure/action/action-provider-registry.d.ts.map +1 -0
  139. package/dist/infrastructure/action/action-provider-registry.js +239 -0
  140. package/dist/infrastructure/action/action-provider-registry.js.map +1 -0
  141. package/dist/infrastructure/action/api-key-store.d.ts +60 -0
  142. package/dist/infrastructure/action/api-key-store.d.ts.map +1 -0
  143. package/dist/infrastructure/action/api-key-store.js +130 -0
  144. package/dist/infrastructure/action/api-key-store.js.map +1 -0
  145. package/dist/infrastructure/action/index.d.ts +10 -0
  146. package/dist/infrastructure/action/index.d.ts.map +1 -0
  147. package/dist/infrastructure/action/index.js +9 -0
  148. package/dist/infrastructure/action/index.js.map +1 -0
  149. package/dist/infrastructure/adapter-pool.d.ts +50 -0
  150. package/dist/infrastructure/adapter-pool.d.ts.map +1 -0
  151. package/dist/infrastructure/adapter-pool.js +110 -0
  152. package/dist/infrastructure/adapter-pool.js.map +1 -0
  153. package/dist/infrastructure/backup/backup-service.d.ts +53 -0
  154. package/dist/infrastructure/backup/backup-service.d.ts.map +1 -0
  155. package/dist/infrastructure/backup/backup-service.js +158 -0
  156. package/dist/infrastructure/backup/backup-service.js.map +1 -0
  157. package/dist/infrastructure/backup/index.d.ts +2 -0
  158. package/dist/infrastructure/backup/index.d.ts.map +1 -0
  159. package/dist/infrastructure/backup/index.js +2 -0
  160. package/dist/infrastructure/backup/index.js.map +1 -0
  161. package/dist/infrastructure/config/index.d.ts +8 -0
  162. package/dist/infrastructure/config/index.d.ts.map +1 -0
  163. package/dist/infrastructure/config/index.js +7 -0
  164. package/dist/infrastructure/config/index.js.map +1 -0
  165. package/dist/infrastructure/config/loader.d.ts +555 -0
  166. package/dist/infrastructure/config/loader.d.ts.map +1 -0
  167. package/dist/infrastructure/config/loader.js +311 -0
  168. package/dist/infrastructure/config/loader.js.map +1 -0
  169. package/dist/infrastructure/database/checks.d.ts +19 -0
  170. package/dist/infrastructure/database/checks.d.ts.map +1 -0
  171. package/dist/infrastructure/database/checks.js +27 -0
  172. package/dist/infrastructure/database/checks.js.map +1 -0
  173. package/dist/infrastructure/database/compatibility.d.ts +36 -0
  174. package/dist/infrastructure/database/compatibility.d.ts.map +1 -0
  175. package/dist/infrastructure/database/compatibility.js +75 -0
  176. package/dist/infrastructure/database/compatibility.js.map +1 -0
  177. package/dist/infrastructure/database/connection.d.ts +36 -0
  178. package/dist/infrastructure/database/connection.d.ts.map +1 -0
  179. package/dist/infrastructure/database/connection.js +47 -0
  180. package/dist/infrastructure/database/connection.js.map +1 -0
  181. package/dist/infrastructure/database/id.d.ts +17 -0
  182. package/dist/infrastructure/database/id.d.ts.map +1 -0
  183. package/dist/infrastructure/database/id.js +20 -0
  184. package/dist/infrastructure/database/id.js.map +1 -0
  185. package/dist/infrastructure/database/index.d.ts +15 -0
  186. package/dist/infrastructure/database/index.d.ts.map +1 -0
  187. package/dist/infrastructure/database/index.js +12 -0
  188. package/dist/infrastructure/database/index.js.map +1 -0
  189. package/dist/infrastructure/database/migrate.d.ts +76 -0
  190. package/dist/infrastructure/database/migrate.d.ts.map +1 -0
  191. package/dist/infrastructure/database/migrate.js +1214 -0
  192. package/dist/infrastructure/database/migrate.js.map +1 -0
  193. package/dist/infrastructure/database/schema.d.ts +2352 -0
  194. package/dist/infrastructure/database/schema.d.ts.map +1 -0
  195. package/dist/infrastructure/database/schema.js +288 -0
  196. package/dist/infrastructure/database/schema.js.map +1 -0
  197. package/dist/infrastructure/jwt/index.d.ts +2 -0
  198. package/dist/infrastructure/jwt/index.d.ts.map +1 -0
  199. package/dist/infrastructure/jwt/index.js +2 -0
  200. package/dist/infrastructure/jwt/index.js.map +1 -0
  201. package/dist/infrastructure/jwt/jwt-secret-manager.d.ts +58 -0
  202. package/dist/infrastructure/jwt/jwt-secret-manager.d.ts.map +1 -0
  203. package/dist/infrastructure/jwt/jwt-secret-manager.js +222 -0
  204. package/dist/infrastructure/jwt/jwt-secret-manager.js.map +1 -0
  205. package/dist/infrastructure/keystore/crypto.d.ts +62 -0
  206. package/dist/infrastructure/keystore/crypto.d.ts.map +1 -0
  207. package/dist/infrastructure/keystore/crypto.js +89 -0
  208. package/dist/infrastructure/keystore/crypto.js.map +1 -0
  209. package/dist/infrastructure/keystore/index.d.ts +4 -0
  210. package/dist/infrastructure/keystore/index.d.ts.map +1 -0
  211. package/dist/infrastructure/keystore/index.js +5 -0
  212. package/dist/infrastructure/keystore/index.js.map +1 -0
  213. package/dist/infrastructure/keystore/keystore.d.ts +115 -0
  214. package/dist/infrastructure/keystore/keystore.d.ts.map +1 -0
  215. package/dist/infrastructure/keystore/keystore.js +327 -0
  216. package/dist/infrastructure/keystore/keystore.js.map +1 -0
  217. package/dist/infrastructure/keystore/memory.d.ts +45 -0
  218. package/dist/infrastructure/keystore/memory.d.ts.map +1 -0
  219. package/dist/infrastructure/keystore/memory.js +105 -0
  220. package/dist/infrastructure/keystore/memory.js.map +1 -0
  221. package/dist/infrastructure/oracle/coingecko-forex.d.ts +35 -0
  222. package/dist/infrastructure/oracle/coingecko-forex.d.ts.map +1 -0
  223. package/dist/infrastructure/oracle/coingecko-forex.js +69 -0
  224. package/dist/infrastructure/oracle/coingecko-forex.js.map +1 -0
  225. package/dist/infrastructure/oracle/coingecko-oracle.d.ts +73 -0
  226. package/dist/infrastructure/oracle/coingecko-oracle.d.ts.map +1 -0
  227. package/dist/infrastructure/oracle/coingecko-oracle.js +199 -0
  228. package/dist/infrastructure/oracle/coingecko-oracle.js.map +1 -0
  229. package/dist/infrastructure/oracle/coingecko-platform-ids.d.ts +32 -0
  230. package/dist/infrastructure/oracle/coingecko-platform-ids.d.ts.map +1 -0
  231. package/dist/infrastructure/oracle/coingecko-platform-ids.js +30 -0
  232. package/dist/infrastructure/oracle/coingecko-platform-ids.js.map +1 -0
  233. package/dist/infrastructure/oracle/forex-currencies.d.ts +36 -0
  234. package/dist/infrastructure/oracle/forex-currencies.d.ts.map +1 -0
  235. package/dist/infrastructure/oracle/forex-currencies.js +71 -0
  236. package/dist/infrastructure/oracle/forex-currencies.js.map +1 -0
  237. package/dist/infrastructure/oracle/forex-rate-service.d.ts +51 -0
  238. package/dist/infrastructure/oracle/forex-rate-service.d.ts.map +1 -0
  239. package/dist/infrastructure/oracle/forex-rate-service.js +149 -0
  240. package/dist/infrastructure/oracle/forex-rate-service.js.map +1 -0
  241. package/dist/infrastructure/oracle/index.d.ts +18 -0
  242. package/dist/infrastructure/oracle/index.d.ts.map +1 -0
  243. package/dist/infrastructure/oracle/index.js +19 -0
  244. package/dist/infrastructure/oracle/index.js.map +1 -0
  245. package/dist/infrastructure/oracle/oracle-chain.d.ts +101 -0
  246. package/dist/infrastructure/oracle/oracle-chain.d.ts.map +1 -0
  247. package/dist/infrastructure/oracle/oracle-chain.js +163 -0
  248. package/dist/infrastructure/oracle/oracle-chain.js.map +1 -0
  249. package/dist/infrastructure/oracle/oracle-errors.d.ts +42 -0
  250. package/dist/infrastructure/oracle/oracle-errors.d.ts.map +1 -0
  251. package/dist/infrastructure/oracle/oracle-errors.js +53 -0
  252. package/dist/infrastructure/oracle/oracle-errors.js.map +1 -0
  253. package/dist/infrastructure/oracle/price-age.d.ts +38 -0
  254. package/dist/infrastructure/oracle/price-age.d.ts.map +1 -0
  255. package/dist/infrastructure/oracle/price-age.js +44 -0
  256. package/dist/infrastructure/oracle/price-age.js.map +1 -0
  257. package/dist/infrastructure/oracle/price-cache.d.ts +99 -0
  258. package/dist/infrastructure/oracle/price-cache.d.ts.map +1 -0
  259. package/dist/infrastructure/oracle/price-cache.js +173 -0
  260. package/dist/infrastructure/oracle/price-cache.js.map +1 -0
  261. package/dist/infrastructure/oracle/pyth-feed-ids.d.ts +31 -0
  262. package/dist/infrastructure/oracle/pyth-feed-ids.d.ts.map +1 -0
  263. package/dist/infrastructure/oracle/pyth-feed-ids.js +44 -0
  264. package/dist/infrastructure/oracle/pyth-feed-ids.js.map +1 -0
  265. package/dist/infrastructure/oracle/pyth-oracle.d.ts +69 -0
  266. package/dist/infrastructure/oracle/pyth-oracle.d.ts.map +1 -0
  267. package/dist/infrastructure/oracle/pyth-oracle.js +149 -0
  268. package/dist/infrastructure/oracle/pyth-oracle.js.map +1 -0
  269. package/dist/infrastructure/settings/hot-reload.d.ts +71 -0
  270. package/dist/infrastructure/settings/hot-reload.d.ts.map +1 -0
  271. package/dist/infrastructure/settings/hot-reload.js +315 -0
  272. package/dist/infrastructure/settings/hot-reload.js.map +1 -0
  273. package/dist/infrastructure/settings/index.d.ts +13 -0
  274. package/dist/infrastructure/settings/index.d.ts.map +1 -0
  275. package/dist/infrastructure/settings/index.js +10 -0
  276. package/dist/infrastructure/settings/index.js.map +1 -0
  277. package/dist/infrastructure/settings/setting-keys.d.ts +28 -0
  278. package/dist/infrastructure/settings/setting-keys.d.ts.map +1 -0
  279. package/dist/infrastructure/settings/setting-keys.js +105 -0
  280. package/dist/infrastructure/settings/setting-keys.js.map +1 -0
  281. package/dist/infrastructure/settings/settings-crypto.d.ts +39 -0
  282. package/dist/infrastructure/settings/settings-crypto.d.ts.map +1 -0
  283. package/dist/infrastructure/settings/settings-crypto.js +73 -0
  284. package/dist/infrastructure/settings/settings-crypto.js.map +1 -0
  285. package/dist/infrastructure/settings/settings-service.d.ts +82 -0
  286. package/dist/infrastructure/settings/settings-service.d.ts.map +1 -0
  287. package/dist/infrastructure/settings/settings-service.js +267 -0
  288. package/dist/infrastructure/settings/settings-service.js.map +1 -0
  289. package/dist/infrastructure/telegram/index.d.ts +6 -0
  290. package/dist/infrastructure/telegram/index.d.ts.map +1 -0
  291. package/dist/infrastructure/telegram/index.js +5 -0
  292. package/dist/infrastructure/telegram/index.js.map +1 -0
  293. package/dist/infrastructure/telegram/telegram-api.d.ts +35 -0
  294. package/dist/infrastructure/telegram/telegram-api.d.ts.map +1 -0
  295. package/dist/infrastructure/telegram/telegram-api.js +82 -0
  296. package/dist/infrastructure/telegram/telegram-api.js.map +1 -0
  297. package/dist/infrastructure/telegram/telegram-auth.d.ts +57 -0
  298. package/dist/infrastructure/telegram/telegram-auth.d.ts.map +1 -0
  299. package/dist/infrastructure/telegram/telegram-auth.js +88 -0
  300. package/dist/infrastructure/telegram/telegram-auth.js.map +1 -0
  301. package/dist/infrastructure/telegram/telegram-bot-service.d.ts +95 -0
  302. package/dist/infrastructure/telegram/telegram-bot-service.d.ts.map +1 -0
  303. package/dist/infrastructure/telegram/telegram-bot-service.js +564 -0
  304. package/dist/infrastructure/telegram/telegram-bot-service.js.map +1 -0
  305. package/dist/infrastructure/telegram/telegram-keyboard.d.ts +27 -0
  306. package/dist/infrastructure/telegram/telegram-keyboard.d.ts.map +1 -0
  307. package/dist/infrastructure/telegram/telegram-keyboard.js +52 -0
  308. package/dist/infrastructure/telegram/telegram-keyboard.js.map +1 -0
  309. package/dist/infrastructure/telegram/telegram-types.d.ts +43 -0
  310. package/dist/infrastructure/telegram/telegram-types.d.ts.map +1 -0
  311. package/dist/infrastructure/telegram/telegram-types.js +8 -0
  312. package/dist/infrastructure/telegram/telegram-types.js.map +1 -0
  313. package/dist/infrastructure/token-registry/builtin-tokens.d.ts +39 -0
  314. package/dist/infrastructure/token-registry/builtin-tokens.d.ts.map +1 -0
  315. package/dist/infrastructure/token-registry/builtin-tokens.js +135 -0
  316. package/dist/infrastructure/token-registry/builtin-tokens.js.map +1 -0
  317. package/dist/infrastructure/token-registry/index.d.ts +8 -0
  318. package/dist/infrastructure/token-registry/index.d.ts.map +1 -0
  319. package/dist/infrastructure/token-registry/index.js +8 -0
  320. package/dist/infrastructure/token-registry/index.js.map +1 -0
  321. package/dist/infrastructure/token-registry/token-registry-service.d.ts +49 -0
  322. package/dist/infrastructure/token-registry/token-registry-service.d.ts.map +1 -0
  323. package/dist/infrastructure/token-registry/token-registry-service.js +93 -0
  324. package/dist/infrastructure/token-registry/token-registry-service.js.map +1 -0
  325. package/dist/infrastructure/version/index.d.ts +5 -0
  326. package/dist/infrastructure/version/index.d.ts.map +1 -0
  327. package/dist/infrastructure/version/index.js +5 -0
  328. package/dist/infrastructure/version/index.js.map +1 -0
  329. package/dist/infrastructure/version/version-check-service.d.ts +35 -0
  330. package/dist/infrastructure/version/version-check-service.d.ts.map +1 -0
  331. package/dist/infrastructure/version/version-check-service.js +92 -0
  332. package/dist/infrastructure/version/version-check-service.js.map +1 -0
  333. package/dist/lifecycle/daemon.d.ts +103 -0
  334. package/dist/lifecycle/daemon.d.ts.map +1 -0
  335. package/dist/lifecycle/daemon.js +934 -0
  336. package/dist/lifecycle/daemon.js.map +1 -0
  337. package/dist/lifecycle/index.d.ts +9 -0
  338. package/dist/lifecycle/index.d.ts.map +1 -0
  339. package/dist/lifecycle/index.js +9 -0
  340. package/dist/lifecycle/index.js.map +1 -0
  341. package/dist/lifecycle/signal-handler.d.ts +18 -0
  342. package/dist/lifecycle/signal-handler.d.ts.map +1 -0
  343. package/dist/lifecycle/signal-handler.js +37 -0
  344. package/dist/lifecycle/signal-handler.js.map +1 -0
  345. package/dist/lifecycle/workers.d.ts +46 -0
  346. package/dist/lifecycle/workers.d.ts.map +1 -0
  347. package/dist/lifecycle/workers.js +101 -0
  348. package/dist/lifecycle/workers.js.map +1 -0
  349. package/dist/notifications/channels/discord.d.ts +10 -0
  350. package/dist/notifications/channels/discord.d.ts.map +1 -0
  351. package/dist/notifications/channels/discord.js +54 -0
  352. package/dist/notifications/channels/discord.js.map +1 -0
  353. package/dist/notifications/channels/ntfy.d.ts +13 -0
  354. package/dist/notifications/channels/ntfy.d.ts.map +1 -0
  355. package/dist/notifications/channels/ntfy.js +58 -0
  356. package/dist/notifications/channels/ntfy.js.map +1 -0
  357. package/dist/notifications/channels/slack.d.ts +10 -0
  358. package/dist/notifications/channels/slack.d.ts.map +1 -0
  359. package/dist/notifications/channels/slack.js +55 -0
  360. package/dist/notifications/channels/slack.js.map +1 -0
  361. package/dist/notifications/channels/telegram.d.ts +10 -0
  362. package/dist/notifications/channels/telegram.d.ts.map +1 -0
  363. package/dist/notifications/channels/telegram.js +40 -0
  364. package/dist/notifications/channels/telegram.js.map +1 -0
  365. package/dist/notifications/index.d.ts +9 -0
  366. package/dist/notifications/index.d.ts.map +1 -0
  367. package/dist/notifications/index.js +7 -0
  368. package/dist/notifications/index.js.map +1 -0
  369. package/dist/notifications/notification-service.d.ts +75 -0
  370. package/dist/notifications/notification-service.d.ts.map +1 -0
  371. package/dist/notifications/notification-service.js +213 -0
  372. package/dist/notifications/notification-service.js.map +1 -0
  373. package/dist/notifications/templates/message-templates.d.ts +12 -0
  374. package/dist/notifications/templates/message-templates.d.ts.map +1 -0
  375. package/dist/notifications/templates/message-templates.js +22 -0
  376. package/dist/notifications/templates/message-templates.js.map +1 -0
  377. package/dist/pipeline/database-policy-engine.d.ts +286 -0
  378. package/dist/pipeline/database-policy-engine.d.ts.map +1 -0
  379. package/dist/pipeline/database-policy-engine.js +992 -0
  380. package/dist/pipeline/database-policy-engine.js.map +1 -0
  381. package/dist/pipeline/default-policy-engine.d.ts +26 -0
  382. package/dist/pipeline/default-policy-engine.d.ts.map +1 -0
  383. package/dist/pipeline/default-policy-engine.js +25 -0
  384. package/dist/pipeline/default-policy-engine.js.map +1 -0
  385. package/dist/pipeline/index.d.ts +9 -0
  386. package/dist/pipeline/index.d.ts.map +1 -0
  387. package/dist/pipeline/index.js +9 -0
  388. package/dist/pipeline/index.js.map +1 -0
  389. package/dist/pipeline/network-resolver.d.ts +22 -0
  390. package/dist/pipeline/network-resolver.d.ts.map +1 -0
  391. package/dist/pipeline/network-resolver.js +32 -0
  392. package/dist/pipeline/network-resolver.js.map +1 -0
  393. package/dist/pipeline/pipeline.d.ts +72 -0
  394. package/dist/pipeline/pipeline.d.ts.map +1 -0
  395. package/dist/pipeline/pipeline.js +87 -0
  396. package/dist/pipeline/pipeline.js.map +1 -0
  397. package/dist/pipeline/resolve-effective-amount-usd.d.ts +41 -0
  398. package/dist/pipeline/resolve-effective-amount-usd.d.ts.map +1 -0
  399. package/dist/pipeline/resolve-effective-amount-usd.js +208 -0
  400. package/dist/pipeline/resolve-effective-amount-usd.js.map +1 -0
  401. package/dist/pipeline/sign-only.d.ts +99 -0
  402. package/dist/pipeline/sign-only.d.ts.map +1 -0
  403. package/dist/pipeline/sign-only.js +267 -0
  404. package/dist/pipeline/sign-only.js.map +1 -0
  405. package/dist/pipeline/sleep.d.ts +6 -0
  406. package/dist/pipeline/sleep.d.ts.map +1 -0
  407. package/dist/pipeline/sleep.js +8 -0
  408. package/dist/pipeline/sleep.js.map +1 -0
  409. package/dist/pipeline/stages.d.ts +82 -0
  410. package/dist/pipeline/stages.d.ts.map +1 -0
  411. package/dist/pipeline/stages.js +784 -0
  412. package/dist/pipeline/stages.js.map +1 -0
  413. package/dist/services/autostop-rules.d.ts +79 -0
  414. package/dist/services/autostop-rules.d.ts.map +1 -0
  415. package/dist/services/autostop-rules.js +174 -0
  416. package/dist/services/autostop-rules.js.map +1 -0
  417. package/dist/services/autostop-service.d.ts +82 -0
  418. package/dist/services/autostop-service.d.ts.map +1 -0
  419. package/dist/services/autostop-service.js +223 -0
  420. package/dist/services/autostop-service.js.map +1 -0
  421. package/dist/services/kill-switch-service.d.ts +118 -0
  422. package/dist/services/kill-switch-service.d.ts.map +1 -0
  423. package/dist/services/kill-switch-service.js +291 -0
  424. package/dist/services/kill-switch-service.js.map +1 -0
  425. package/dist/services/monitoring/balance-monitor-service.d.ts +65 -0
  426. package/dist/services/monitoring/balance-monitor-service.d.ts.map +1 -0
  427. package/dist/services/monitoring/balance-monitor-service.js +207 -0
  428. package/dist/services/monitoring/balance-monitor-service.js.map +1 -0
  429. package/dist/services/wc-session-service.d.ts +123 -0
  430. package/dist/services/wc-session-service.d.ts.map +1 -0
  431. package/dist/services/wc-session-service.js +363 -0
  432. package/dist/services/wc-session-service.js.map +1 -0
  433. package/dist/services/wc-signing-bridge.d.ts +60 -0
  434. package/dist/services/wc-signing-bridge.d.ts.map +1 -0
  435. package/dist/services/wc-signing-bridge.js +334 -0
  436. package/dist/services/wc-signing-bridge.js.map +1 -0
  437. package/dist/services/wc-storage.d.ts +32 -0
  438. package/dist/services/wc-storage.d.ts.map +1 -0
  439. package/dist/services/wc-storage.js +64 -0
  440. package/dist/services/wc-storage.js.map +1 -0
  441. package/dist/services/x402/payment-signer.d.ts +88 -0
  442. package/dist/services/x402/payment-signer.d.ts.map +1 -0
  443. package/dist/services/x402/payment-signer.js +311 -0
  444. package/dist/services/x402/payment-signer.js.map +1 -0
  445. package/dist/services/x402/ssrf-guard.d.ts +27 -0
  446. package/dist/services/x402/ssrf-guard.d.ts.map +1 -0
  447. package/dist/services/x402/ssrf-guard.js +236 -0
  448. package/dist/services/x402/ssrf-guard.js.map +1 -0
  449. package/dist/services/x402/x402-domain-policy.d.ts +50 -0
  450. package/dist/services/x402/x402-domain-policy.d.ts.map +1 -0
  451. package/dist/services/x402/x402-domain-policy.js +78 -0
  452. package/dist/services/x402/x402-domain-policy.js.map +1 -0
  453. package/dist/services/x402/x402-handler.d.ts +71 -0
  454. package/dist/services/x402/x402-handler.d.ts.map +1 -0
  455. package/dist/services/x402/x402-handler.js +195 -0
  456. package/dist/services/x402/x402-handler.js.map +1 -0
  457. package/dist/services/x402/x402-usd-resolver.d.ts +26 -0
  458. package/dist/services/x402/x402-usd-resolver.d.ts.map +1 -0
  459. package/dist/services/x402/x402-usd-resolver.js +79 -0
  460. package/dist/services/x402/x402-usd-resolver.js.map +1 -0
  461. package/dist/workflow/approval-workflow.d.ts +103 -0
  462. package/dist/workflow/approval-workflow.d.ts.map +1 -0
  463. package/dist/workflow/approval-workflow.js +202 -0
  464. package/dist/workflow/approval-workflow.js.map +1 -0
  465. package/dist/workflow/delay-queue.d.ts +78 -0
  466. package/dist/workflow/delay-queue.d.ts.map +1 -0
  467. package/dist/workflow/delay-queue.js +174 -0
  468. package/dist/workflow/delay-queue.js.map +1 -0
  469. package/dist/workflow/index.d.ts +11 -0
  470. package/dist/workflow/index.d.ts.map +1 -0
  471. package/dist/workflow/index.js +9 -0
  472. package/dist/workflow/index.js.map +1 -0
  473. package/dist/workflow/owner-state.d.ts +97 -0
  474. package/dist/workflow/owner-state.d.ts.map +1 -0
  475. package/dist/workflow/owner-state.js +168 -0
  476. package/dist/workflow/owner-state.js.map +1 -0
  477. package/package.json +71 -0
  478. package/public/admin/assets/index-BPoUSH8W.css +1 -0
  479. package/public/admin/assets/index-CDi1qoXB.js +1 -0
  480. package/public/admin/index.html +13 -0
@@ -0,0 +1,36 @@
1
+ /**
2
+ * Fiat currency metadata for 43 supported display currencies.
3
+ *
4
+ * Used by:
5
+ * - Admin UI: currency dropdown (name, symbol)
6
+ * - Intl.NumberFormat: locale-aware formatting (decimals, locale)
7
+ * - ForexRateService: validation of currency codes
8
+ *
9
+ * Decimals follow ISO 4217:
10
+ * - 0: KRW, JPY, VND, CLP, HUF, PKR
11
+ * - 2: Most currencies (USD, EUR, GBP, ...)
12
+ * - 3: KWD, BHD (1/1000 subunit)
13
+ */
14
+ /** Metadata for a fiat currency. */
15
+ export interface CurrencyMeta {
16
+ /** ISO 4217 currency code (e.g. 'KRW'). */
17
+ code: string;
18
+ /** English display name (e.g. 'Korean Won'). */
19
+ name: string;
20
+ /** Currency symbol (e.g. '\u20A9'). */
21
+ symbol: string;
22
+ /** Decimal places per ISO 4217 (0, 2, or 3). */
23
+ decimals: number;
24
+ /** Preferred locale for Intl.NumberFormat (e.g. 'ko-KR'). */
25
+ locale: string;
26
+ }
27
+ /** 43 supported fiat currencies with metadata. Ordered by CurrencyCodeSchema enum. */
28
+ export declare const CURRENCY_META: readonly CurrencyMeta[];
29
+ /**
30
+ * Get metadata for a currency code.
31
+ *
32
+ * @param code - ISO 4217 currency code (e.g. 'KRW').
33
+ * @returns CurrencyMeta or undefined if not supported.
34
+ */
35
+ export declare function getCurrencyMeta(code: string): CurrencyMeta | undefined;
36
+ //# sourceMappingURL=forex-currencies.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"forex-currencies.d.ts","sourceRoot":"","sources":["../../../src/infrastructure/oracle/forex-currencies.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,oCAAoC;AACpC,MAAM,WAAW,YAAY;IAC3B,2CAA2C;IAC3C,IAAI,EAAE,MAAM,CAAC;IACb,gDAAgD;IAChD,IAAI,EAAE,MAAM,CAAC;IACb,uCAAuC;IACvC,MAAM,EAAE,MAAM,CAAC;IACf,gDAAgD;IAChD,QAAQ,EAAE,MAAM,CAAC;IACjB,6DAA6D;IAC7D,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,sFAAsF;AACtF,eAAO,MAAM,aAAa,EAAE,SAAS,YAAY,EA4CvC,CAAC;AAOX;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS,CAEtE"}
@@ -0,0 +1,71 @@
1
+ /**
2
+ * Fiat currency metadata for 43 supported display currencies.
3
+ *
4
+ * Used by:
5
+ * - Admin UI: currency dropdown (name, symbol)
6
+ * - Intl.NumberFormat: locale-aware formatting (decimals, locale)
7
+ * - ForexRateService: validation of currency codes
8
+ *
9
+ * Decimals follow ISO 4217:
10
+ * - 0: KRW, JPY, VND, CLP, HUF, PKR
11
+ * - 2: Most currencies (USD, EUR, GBP, ...)
12
+ * - 3: KWD, BHD (1/1000 subunit)
13
+ */
14
+ /** 43 supported fiat currencies with metadata. Ordered by CurrencyCodeSchema enum. */
15
+ export const CURRENCY_META = [
16
+ { code: 'USD', name: 'US Dollar', symbol: '$', decimals: 2, locale: 'en-US' },
17
+ { code: 'KRW', name: 'Korean Won', symbol: '\u20A9', decimals: 0, locale: 'ko-KR' },
18
+ { code: 'JPY', name: 'Japanese Yen', symbol: '\u00A5', decimals: 0, locale: 'ja-JP' },
19
+ { code: 'EUR', name: 'Euro', symbol: '\u20AC', decimals: 2, locale: 'de-DE' },
20
+ { code: 'GBP', name: 'British Pound', symbol: '\u00A3', decimals: 2, locale: 'en-GB' },
21
+ { code: 'CNY', name: 'Chinese Yuan', symbol: '\u00A5', decimals: 2, locale: 'zh-CN' },
22
+ { code: 'CAD', name: 'Canadian Dollar', symbol: 'CA$', decimals: 2, locale: 'en-CA' },
23
+ { code: 'AUD', name: 'Australian Dollar', symbol: 'A$', decimals: 2, locale: 'en-AU' },
24
+ { code: 'CHF', name: 'Swiss Franc', symbol: 'CHF', decimals: 2, locale: 'de-CH' },
25
+ { code: 'SGD', name: 'Singapore Dollar', symbol: 'S$', decimals: 2, locale: 'en-SG' },
26
+ { code: 'HKD', name: 'Hong Kong Dollar', symbol: 'HK$', decimals: 2, locale: 'en-HK' },
27
+ { code: 'INR', name: 'Indian Rupee', symbol: '\u20B9', decimals: 2, locale: 'en-IN' },
28
+ { code: 'TWD', name: 'Taiwan Dollar', symbol: 'NT$', decimals: 2, locale: 'zh-TW' },
29
+ { code: 'THB', name: 'Thai Baht', symbol: '\u0E3F', decimals: 2, locale: 'th-TH' },
30
+ { code: 'MYR', name: 'Malaysian Ringgit', symbol: 'RM', decimals: 2, locale: 'ms-MY' },
31
+ { code: 'IDR', name: 'Indonesian Rupiah', symbol: 'Rp', decimals: 2, locale: 'id-ID' },
32
+ { code: 'PHP', name: 'Philippine Peso', symbol: '\u20B1', decimals: 2, locale: 'en-PH' },
33
+ { code: 'VND', name: 'Vietnamese Dong', symbol: '\u20AB', decimals: 0, locale: 'vi-VN' },
34
+ { code: 'BRL', name: 'Brazilian Real', symbol: 'R$', decimals: 2, locale: 'pt-BR' },
35
+ { code: 'MXN', name: 'Mexican Peso', symbol: 'MX$', decimals: 2, locale: 'es-MX' },
36
+ { code: 'CLP', name: 'Chilean Peso', symbol: 'CL$', decimals: 0, locale: 'es-CL' },
37
+ { code: 'TRY', name: 'Turkish Lira', symbol: '\u20BA', decimals: 2, locale: 'tr-TR' },
38
+ { code: 'PLN', name: 'Polish Zloty', symbol: 'z\u0142', decimals: 2, locale: 'pl-PL' },
39
+ { code: 'CZK', name: 'Czech Koruna', symbol: 'K\u010D', decimals: 2, locale: 'cs-CZ' },
40
+ { code: 'HUF', name: 'Hungarian Forint', symbol: 'Ft', decimals: 0, locale: 'hu-HU' },
41
+ { code: 'SEK', name: 'Swedish Krona', symbol: 'kr', decimals: 2, locale: 'sv-SE' },
42
+ { code: 'NOK', name: 'Norwegian Krone', symbol: 'kr', decimals: 2, locale: 'nb-NO' },
43
+ { code: 'DKK', name: 'Danish Krone', symbol: 'kr', decimals: 2, locale: 'da-DK' },
44
+ { code: 'NZD', name: 'New Zealand Dollar', symbol: 'NZ$', decimals: 2, locale: 'en-NZ' },
45
+ { code: 'ZAR', name: 'South African Rand', symbol: 'R', decimals: 2, locale: 'en-ZA' },
46
+ { code: 'ILS', name: 'Israeli Shekel', symbol: '\u20AA', decimals: 2, locale: 'he-IL' },
47
+ { code: 'SAR', name: 'Saudi Riyal', symbol: 'SR', decimals: 2, locale: 'ar-SA' },
48
+ { code: 'AED', name: 'UAE Dirham', symbol: 'AED', decimals: 2, locale: 'ar-AE' },
49
+ { code: 'KWD', name: 'Kuwaiti Dinar', symbol: 'KD', decimals: 3, locale: 'ar-KW' },
50
+ { code: 'BHD', name: 'Bahraini Dinar', symbol: 'BD', decimals: 3, locale: 'ar-BH' },
51
+ { code: 'NGN', name: 'Nigerian Naira', symbol: '\u20A6', decimals: 2, locale: 'en-NG' },
52
+ { code: 'RUB', name: 'Russian Ruble', symbol: '\u20BD', decimals: 2, locale: 'ru-RU' },
53
+ { code: 'UAH', name: 'Ukrainian Hryvnia', symbol: '\u20B4', decimals: 2, locale: 'uk-UA' },
54
+ { code: 'PKR', name: 'Pakistani Rupee', symbol: 'Rs', decimals: 0, locale: 'ur-PK' },
55
+ { code: 'BDT', name: 'Bangladeshi Taka', symbol: '\u09F3', decimals: 2, locale: 'bn-BD' },
56
+ { code: 'LKR', name: 'Sri Lankan Rupee', symbol: 'Rs', decimals: 2, locale: 'si-LK' },
57
+ { code: 'MMK', name: 'Myanmar Kyat', symbol: 'K', decimals: 2, locale: 'my-MM' },
58
+ { code: 'GEL', name: 'Georgian Lari', symbol: '\u20BE', decimals: 2, locale: 'ka-GE' },
59
+ ];
60
+ /** Map from currency code to metadata for O(1) lookup. */
61
+ const CURRENCY_MAP = new Map(CURRENCY_META.map((c) => [c.code, c]));
62
+ /**
63
+ * Get metadata for a currency code.
64
+ *
65
+ * @param code - ISO 4217 currency code (e.g. 'KRW').
66
+ * @returns CurrencyMeta or undefined if not supported.
67
+ */
68
+ export function getCurrencyMeta(code) {
69
+ return CURRENCY_MAP.get(code);
70
+ }
71
+ //# sourceMappingURL=forex-currencies.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"forex-currencies.js","sourceRoot":"","sources":["../../../src/infrastructure/oracle/forex-currencies.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,51 @@
1
+ /**
2
+ * ForexRateService: IForexRateService implementation with caching.
3
+ *
4
+ * Uses CoinGeckoForexProvider for rate fetching and a dedicated
5
+ * InMemoryPriceCache instance (30-minute TTL) for caching.
6
+ *
7
+ * Cache key pattern: `forex:USD/{currency}` -- avoids collision with
8
+ * crypto cache keys (`chain:address`).
9
+ *
10
+ * Graceful fallback: getRate() returns null on any error (caller shows USD).
11
+ * getRates() omits failed currencies from result Map.
12
+ */
13
+ import type { CurrencyCode, ForexRate, IForexRateService } from '@waiaas/core';
14
+ import type { CoinGeckoForexProvider } from './coingecko-forex.js';
15
+ import type { InMemoryPriceCache } from './price-cache.js';
16
+ /** Dependency injection for ForexRateService. */
17
+ export interface ForexRateServiceDeps {
18
+ /** CoinGecko forex rate provider. */
19
+ forexProvider: CoinGeckoForexProvider;
20
+ /** Dedicated cache instance (30-min TTL, separate from crypto cache). */
21
+ cache: InMemoryPriceCache;
22
+ }
23
+ /**
24
+ * Forex rate service with CoinGecko provider and InMemoryPriceCache.
25
+ *
26
+ * - getRate('USD') returns rate=1 immediately (no API call).
27
+ * - getRate(other) checks cache first, then fetches from CoinGecko.
28
+ * - All errors caught and returned as null (graceful fallback).
29
+ */
30
+ export declare class ForexRateService implements IForexRateService {
31
+ private readonly provider;
32
+ private readonly cache;
33
+ constructor(deps: ForexRateServiceDeps);
34
+ /**
35
+ * Get exchange rate from USD to target currency.
36
+ *
37
+ * @param to - Target currency code.
38
+ * @returns ForexRate or null on failure (graceful fallback).
39
+ */
40
+ getRate(to: CurrencyCode): Promise<ForexRate | null>;
41
+ /**
42
+ * Get exchange rates for multiple currencies.
43
+ *
44
+ * Batch-optimized: only fetches cache-miss currencies from CoinGecko.
45
+ *
46
+ * @param currencies - Array of target currency codes.
47
+ * @returns Map from currency code to ForexRate. Missing rates omitted.
48
+ */
49
+ getRates(currencies: CurrencyCode[]): Promise<Map<CurrencyCode, ForexRate>>;
50
+ }
51
+ //# sourceMappingURL=forex-rate-service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"forex-rate-service.d.ts","sourceRoot":"","sources":["../../../src/infrastructure/oracle/forex-rate-service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,OAAO,KAAK,EAAE,YAAY,EAAE,SAAS,EAAE,iBAAiB,EAAa,MAAM,cAAc,CAAC;AAC1F,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAC;AACnE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAM3D,iDAAiD;AACjD,MAAM,WAAW,oBAAoB;IACnC,qCAAqC;IACrC,aAAa,EAAE,sBAAsB,CAAC;IACtC,yEAAyE;IACzE,KAAK,EAAE,kBAAkB,CAAC;CAC3B;AAqDD;;;;;;GAMG;AACH,qBAAa,gBAAiB,YAAW,iBAAiB;IACxD,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAyB;IAClD,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAqB;gBAE/B,IAAI,EAAE,oBAAoB;IAKtC;;;;;OAKG;IACG,OAAO,CAAC,EAAE,EAAE,YAAY,GAAG,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC;IA0C1D;;;;;;;OAOG;IACG,QAAQ,CAAC,UAAU,EAAE,YAAY,EAAE,GAAG,OAAO,CAAC,GAAG,CAAC,YAAY,EAAE,SAAS,CAAC,CAAC;CA8ClF"}
@@ -0,0 +1,149 @@
1
+ // ---------------------------------------------------------------------------
2
+ // Constants
3
+ // ---------------------------------------------------------------------------
4
+ /** Cache key prefix for forex rates. */
5
+ const FOREX_KEY_PREFIX = 'forex:USD/';
6
+ /** ForexRate TTL in milliseconds (30 minutes). */
7
+ const FOREX_TTL_MS = 30 * 60 * 1000;
8
+ // ---------------------------------------------------------------------------
9
+ // Helpers
10
+ // ---------------------------------------------------------------------------
11
+ /** Build cache key for a forex rate. */
12
+ function forexCacheKey(currency) {
13
+ return `${FOREX_KEY_PREFIX}${currency}`;
14
+ }
15
+ /** Convert a PriceInfo (from cache) back to ForexRate. */
16
+ function priceInfoToForexRate(to, price, source) {
17
+ return {
18
+ from: 'USD',
19
+ to,
20
+ rate: price.usdPrice, // We store rate in usdPrice field
21
+ source,
22
+ fetchedAt: price.fetchedAt,
23
+ expiresAt: price.expiresAt,
24
+ };
25
+ }
26
+ /** Create a PriceInfo wrapper for storing a forex rate in the cache. */
27
+ function rateToPriceInfo(rate) {
28
+ const now = Date.now();
29
+ return {
30
+ usdPrice: rate, // Store exchange rate in usdPrice field
31
+ source: 'coingecko',
32
+ fetchedAt: now,
33
+ expiresAt: now + FOREX_TTL_MS,
34
+ isStale: false,
35
+ };
36
+ }
37
+ // ---------------------------------------------------------------------------
38
+ // ForexRateService
39
+ // ---------------------------------------------------------------------------
40
+ /**
41
+ * Forex rate service with CoinGecko provider and InMemoryPriceCache.
42
+ *
43
+ * - getRate('USD') returns rate=1 immediately (no API call).
44
+ * - getRate(other) checks cache first, then fetches from CoinGecko.
45
+ * - All errors caught and returned as null (graceful fallback).
46
+ */
47
+ export class ForexRateService {
48
+ provider;
49
+ cache;
50
+ constructor(deps) {
51
+ this.provider = deps.forexProvider;
52
+ this.cache = deps.cache;
53
+ }
54
+ /**
55
+ * Get exchange rate from USD to target currency.
56
+ *
57
+ * @param to - Target currency code.
58
+ * @returns ForexRate or null on failure (graceful fallback).
59
+ */
60
+ async getRate(to) {
61
+ try {
62
+ // USD -> USD is always 1 (no API call needed)
63
+ if (to === 'USD') {
64
+ const now = Date.now();
65
+ return {
66
+ from: 'USD',
67
+ to: 'USD',
68
+ rate: 1,
69
+ source: 'cache',
70
+ fetchedAt: now,
71
+ expiresAt: now + FOREX_TTL_MS,
72
+ };
73
+ }
74
+ const cacheKey = forexCacheKey(to);
75
+ // Check cache first
76
+ const cached = this.cache.get(cacheKey);
77
+ if (cached) {
78
+ return priceInfoToForexRate(to, cached, 'cache');
79
+ }
80
+ // Fetch from CoinGecko
81
+ const rates = await this.provider.getRates([to]);
82
+ const rate = rates.get(to);
83
+ if (rate === undefined) {
84
+ return null;
85
+ }
86
+ // Store in cache
87
+ const priceInfo = rateToPriceInfo(rate);
88
+ this.cache.set(cacheKey, priceInfo);
89
+ return priceInfoToForexRate(to, priceInfo, 'coingecko');
90
+ }
91
+ catch {
92
+ // Graceful fallback: any error -> null
93
+ return null;
94
+ }
95
+ }
96
+ /**
97
+ * Get exchange rates for multiple currencies.
98
+ *
99
+ * Batch-optimized: only fetches cache-miss currencies from CoinGecko.
100
+ *
101
+ * @param currencies - Array of target currency codes.
102
+ * @returns Map from currency code to ForexRate. Missing rates omitted.
103
+ */
104
+ async getRates(currencies) {
105
+ const result = new Map();
106
+ const toFetch = [];
107
+ // Phase 1: Check cache, collect misses
108
+ for (const currency of currencies) {
109
+ if (currency === 'USD') {
110
+ const now = Date.now();
111
+ result.set('USD', {
112
+ from: 'USD',
113
+ to: 'USD',
114
+ rate: 1,
115
+ source: 'cache',
116
+ fetchedAt: now,
117
+ expiresAt: now + FOREX_TTL_MS,
118
+ });
119
+ continue;
120
+ }
121
+ const cached = this.cache.get(forexCacheKey(currency));
122
+ if (cached) {
123
+ result.set(currency, priceInfoToForexRate(currency, cached, 'cache'));
124
+ }
125
+ else {
126
+ toFetch.push(currency);
127
+ }
128
+ }
129
+ // Phase 2: Batch fetch cache misses
130
+ if (toFetch.length > 0) {
131
+ try {
132
+ const rates = await this.provider.getRates(toFetch);
133
+ for (const currency of toFetch) {
134
+ const rate = rates.get(currency);
135
+ if (rate !== undefined) {
136
+ const priceInfo = rateToPriceInfo(rate);
137
+ this.cache.set(forexCacheKey(currency), priceInfo);
138
+ result.set(currency, priceInfoToForexRate(currency, priceInfo, 'coingecko'));
139
+ }
140
+ }
141
+ }
142
+ catch {
143
+ // Graceful: batch fetch failure -> cached results only
144
+ }
145
+ }
146
+ return result;
147
+ }
148
+ }
149
+ //# sourceMappingURL=forex-rate-service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"forex-rate-service.js","sourceRoot":"","sources":["../../../src/infrastructure/oracle/forex-rate-service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Oracle infrastructure module barrel export.
3
+ *
4
+ * Re-exports price age classification, cache utilities, error classes,
5
+ * Pyth oracle, CoinGecko oracle, and feed/platform ID helpers.
6
+ */
7
+ export { classifyPriceAge, PriceAgeEnum, PRICE_AGE_THRESHOLDS, PRICE_AGES, type PriceAge, } from './price-age.js';
8
+ export { InMemoryPriceCache, buildCacheKey } from './price-cache.js';
9
+ export { PriceNotAvailableError, CoinGeckoNotConfiguredError, ForexNotAvailableError } from './oracle-errors.js';
10
+ export { PythOracle } from './pyth-oracle.js';
11
+ export { PYTH_FEED_IDS, getFeedId, getNativeFeedId, } from './pyth-feed-ids.js';
12
+ export { CoinGeckoOracle } from './coingecko-oracle.js';
13
+ export { COINGECKO_PLATFORM_MAP, getCoinGeckoPlatform, type CoinGeckoPlatform, } from './coingecko-platform-ids.js';
14
+ export { OracleChain, type OracleChainDeps } from './oracle-chain.js';
15
+ export { CoinGeckoForexProvider } from './coingecko-forex.js';
16
+ export { ForexRateService, type ForexRateServiceDeps } from './forex-rate-service.js';
17
+ export { CURRENCY_META, getCurrencyMeta, type CurrencyMeta } from './forex-currencies.js';
18
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/infrastructure/oracle/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EACL,gBAAgB,EAChB,YAAY,EACZ,oBAAoB,EACpB,UAAU,EACV,KAAK,QAAQ,GACd,MAAM,gBAAgB,CAAC;AAExB,OAAO,EAAE,kBAAkB,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAErE,OAAO,EAAE,sBAAsB,EAAE,2BAA2B,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAC;AAEjH,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAE9C,OAAO,EACL,aAAa,EACb,SAAS,EACT,eAAe,GAChB,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAExD,OAAO,EACL,sBAAsB,EACtB,oBAAoB,EACpB,KAAK,iBAAiB,GACvB,MAAM,6BAA6B,CAAC;AAErC,OAAO,EAAE,WAAW,EAAE,KAAK,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAGtE,OAAO,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAC;AAC9D,OAAO,EAAE,gBAAgB,EAAE,KAAK,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AACtF,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,KAAK,YAAY,EAAE,MAAM,uBAAuB,CAAC"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Oracle infrastructure module barrel export.
3
+ *
4
+ * Re-exports price age classification, cache utilities, error classes,
5
+ * Pyth oracle, CoinGecko oracle, and feed/platform ID helpers.
6
+ */
7
+ export { classifyPriceAge, PriceAgeEnum, PRICE_AGE_THRESHOLDS, PRICE_AGES, } from './price-age.js';
8
+ export { InMemoryPriceCache, buildCacheKey } from './price-cache.js';
9
+ export { PriceNotAvailableError, CoinGeckoNotConfiguredError, ForexNotAvailableError } from './oracle-errors.js';
10
+ export { PythOracle } from './pyth-oracle.js';
11
+ export { PYTH_FEED_IDS, getFeedId, getNativeFeedId, } from './pyth-feed-ids.js';
12
+ export { CoinGeckoOracle } from './coingecko-oracle.js';
13
+ export { COINGECKO_PLATFORM_MAP, getCoinGeckoPlatform, } from './coingecko-platform-ids.js';
14
+ export { OracleChain } from './oracle-chain.js';
15
+ // v1.5.3 Forex rate service
16
+ export { CoinGeckoForexProvider } from './coingecko-forex.js';
17
+ export { ForexRateService } from './forex-rate-service.js';
18
+ export { CURRENCY_META, getCurrencyMeta } from './forex-currencies.js';
19
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/infrastructure/oracle/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EACL,gBAAgB,EAChB,YAAY,EACZ,oBAAoB,EACpB,UAAU,GAEX,MAAM,gBAAgB,CAAC;AAExB,OAAO,EAAE,kBAAkB,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAErE,OAAO,EAAE,sBAAsB,EAAE,2BAA2B,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAC;AAEjH,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAE9C,OAAO,EACL,aAAa,EACb,SAAS,EACT,eAAe,GAChB,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAExD,OAAO,EACL,sBAAsB,EACtB,oBAAoB,GAErB,MAAM,6BAA6B,CAAC;AAErC,OAAO,EAAE,WAAW,EAAwB,MAAM,mBAAmB,CAAC;AAEtE,4BAA4B;AAC5B,OAAO,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAC;AAC9D,OAAO,EAAE,gBAAgB,EAA6B,MAAM,yBAAyB,CAAC;AACtF,OAAO,EAAE,aAAa,EAAE,eAAe,EAAqB,MAAM,uBAAuB,CAAC"}
@@ -0,0 +1,101 @@
1
+ /**
2
+ * OracleChain: Composite IPriceOracle with 3-stage fallback + cross-validation.
3
+ *
4
+ * Stage 1: Primary oracle (PythOracle) -- always tried first.
5
+ * Stage 2: Fallback oracle (CoinGeckoOracle) -- tried when primary fails;
6
+ * also used for cross-validation when both succeed.
7
+ * Stage 3: Stale cache -- used when all oracles fail (within staleMax window).
8
+ *
9
+ * Cross-validation (when fallback is configured):
10
+ * - Both primary and fallback succeed -> compare prices.
11
+ * - Deviation > threshold (default 5%) -> degrade to isStale=true.
12
+ * - Deviation <= threshold -> adopt primary price (isStale=false).
13
+ * - Fallback failure during cross-validation -> trust primary as-is.
14
+ *
15
+ * Cache management: OracleChain owns InMemoryPriceCache exclusively.
16
+ * Individual oracles (PythOracle, CoinGeckoOracle) do NOT cache internally.
17
+ * Uses cache.getOrFetch() for stampede prevention.
18
+ */
19
+ import type { ChainType, PriceInfo, CacheStats, IPriceOracle, TokenRef } from '@waiaas/core';
20
+ import type { InMemoryPriceCache } from './price-cache.js';
21
+ /** Dependency injection interface for OracleChain constructor. */
22
+ export interface OracleChainDeps {
23
+ /** Primary oracle (PythOracle). Always tried first. */
24
+ primary: IPriceOracle;
25
+ /** Optional fallback oracle (CoinGeckoOracle). Used for fallback + cross-validation. */
26
+ fallback?: IPriceOracle;
27
+ /** Shared price cache (InMemoryPriceCache). OracleChain manages cache exclusively. */
28
+ cache: InMemoryPriceCache;
29
+ /** Cross-validation deviation threshold in percent. Default: 5. */
30
+ crossValidationThreshold?: number;
31
+ }
32
+ /**
33
+ * Composite price oracle with fallback chain and cross-validation.
34
+ *
35
+ * Implements IPriceOracle. Uses InMemoryPriceCache.getOrFetch() for
36
+ * cache-first access with stampede prevention.
37
+ */
38
+ export declare class OracleChain implements IPriceOracle {
39
+ private readonly primary;
40
+ private readonly fallback;
41
+ private readonly cache;
42
+ private readonly threshold;
43
+ constructor(deps: OracleChainDeps);
44
+ /**
45
+ * Get price for a single token.
46
+ *
47
+ * Flow:
48
+ * 1. Check cache (via getOrFetch stampede prevention).
49
+ * 2. Try primary oracle (Pyth).
50
+ * 3. If primary succeeds and fallback exists, cross-validate.
51
+ * 4. If primary fails, try fallback oracle (CoinGecko).
52
+ * 5. If all fail, try stale cache.
53
+ * 6. If nothing available, throw PriceNotAvailableError.
54
+ *
55
+ * @param token - Token reference for price lookup.
56
+ * @returns PriceInfo from best available source.
57
+ * @throws PriceNotAvailableError when no source can provide a price.
58
+ */
59
+ getPrice(token: TokenRef): Promise<PriceInfo>;
60
+ /**
61
+ * Get prices for multiple tokens.
62
+ *
63
+ * Each token is queried individually via getPrice() (which handles
64
+ * cache, fallback, and cross-validation per token). Failed tokens
65
+ * are silently excluded from the result Map.
66
+ *
67
+ * @param tokens - Array of token references.
68
+ * @returns Map from cache key to PriceInfo.
69
+ */
70
+ getPrices(tokens: TokenRef[]): Promise<Map<string, PriceInfo>>;
71
+ /**
72
+ * Get native token price (SOL or ETH).
73
+ *
74
+ * Delegates to getPrice() with address='native' and chain-appropriate decimals.
75
+ *
76
+ * @param chain - Chain type ('solana' or 'ethereum').
77
+ * @returns PriceInfo for the native token.
78
+ */
79
+ getNativePrice(chain: ChainType): Promise<PriceInfo>;
80
+ /**
81
+ * Get cache statistics from InMemoryPriceCache.
82
+ *
83
+ * @returns Current cache hit/miss/stale/size/eviction counts.
84
+ */
85
+ getCacheStats(): CacheStats;
86
+ /**
87
+ * Core fallback + cross-validation logic.
88
+ *
89
+ * Called by cache.getOrFetch() on cache miss. This function:
90
+ * 1. Tries primary oracle.
91
+ * 2. On primary success, cross-validates with fallback (if available).
92
+ * 3. On primary failure, tries fallback as data source.
93
+ * 4. On all failures, checks stale cache.
94
+ * 5. If everything fails, throws PriceNotAvailableError.
95
+ *
96
+ * Note: stale fallback is handled inside the fetcher so it can
97
+ * return stale data that gets re-cached (intentional: oracle outage survival).
98
+ */
99
+ private fetchWithFallback;
100
+ }
101
+ //# sourceMappingURL=oracle-chain.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"oracle-chain.d.ts","sourceRoot":"","sources":["../../../src/infrastructure/oracle/oracle-chain.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AACH,OAAO,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,UAAU,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AAC7F,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAQ3D,kEAAkE;AAClE,MAAM,WAAW,eAAe;IAC9B,uDAAuD;IACvD,OAAO,EAAE,YAAY,CAAC;IACtB,wFAAwF;IACxF,QAAQ,CAAC,EAAE,YAAY,CAAC;IACxB,sFAAsF;IACtF,KAAK,EAAE,kBAAkB,CAAC;IAC1B,mEAAmE;IACnE,wBAAwB,CAAC,EAAE,MAAM,CAAC;CACnC;AAqBD;;;;;GAKG;AACH,qBAAa,WAAY,YAAW,YAAY;IAC9C,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAe;IACvC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAA2B;IACpD,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAqB;IAC3C,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;gBAEvB,IAAI,EAAE,eAAe;IAOjC;;;;;;;;;;;;;;OAcG;IACG,QAAQ,CAAC,KAAK,EAAE,QAAQ,GAAG,OAAO,CAAC,SAAS,CAAC;IAQnD;;;;;;;;;OASG;IACG,SAAS,CAAC,MAAM,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IAiBpE;;;;;;;OAOG;IACG,cAAc,CAAC,KAAK,EAAE,SAAS,GAAG,OAAO,CAAC,SAAS,CAAC;IAK1D;;;;OAIG;IACH,aAAa,IAAI,UAAU;IAQ3B;;;;;;;;;;;;OAYG;YACW,iBAAiB;CA4ChC"}
@@ -0,0 +1,163 @@
1
+ import { buildCacheKey } from './price-cache.js';
2
+ import { PriceNotAvailableError } from './oracle-errors.js';
3
+ // ---------------------------------------------------------------------------
4
+ // Helpers
5
+ // ---------------------------------------------------------------------------
6
+ /**
7
+ * Calculate percentage deviation between two prices.
8
+ *
9
+ * Formula: |primary - fallback| / primary * 100
10
+ * Returns 0 when primary is 0 (avoid division by zero).
11
+ */
12
+ function calculateDeviation(primary, fallback) {
13
+ if (primary === 0)
14
+ return 0;
15
+ return (Math.abs(primary - fallback) / primary) * 100;
16
+ }
17
+ // ---------------------------------------------------------------------------
18
+ // OracleChain
19
+ // ---------------------------------------------------------------------------
20
+ /**
21
+ * Composite price oracle with fallback chain and cross-validation.
22
+ *
23
+ * Implements IPriceOracle. Uses InMemoryPriceCache.getOrFetch() for
24
+ * cache-first access with stampede prevention.
25
+ */
26
+ export class OracleChain {
27
+ primary;
28
+ fallback;
29
+ cache;
30
+ threshold;
31
+ constructor(deps) {
32
+ this.primary = deps.primary;
33
+ this.fallback = deps.fallback;
34
+ this.cache = deps.cache;
35
+ this.threshold = deps.crossValidationThreshold ?? 5;
36
+ }
37
+ /**
38
+ * Get price for a single token.
39
+ *
40
+ * Flow:
41
+ * 1. Check cache (via getOrFetch stampede prevention).
42
+ * 2. Try primary oracle (Pyth).
43
+ * 3. If primary succeeds and fallback exists, cross-validate.
44
+ * 4. If primary fails, try fallback oracle (CoinGecko).
45
+ * 5. If all fail, try stale cache.
46
+ * 6. If nothing available, throw PriceNotAvailableError.
47
+ *
48
+ * @param token - Token reference for price lookup.
49
+ * @returns PriceInfo from best available source.
50
+ * @throws PriceNotAvailableError when no source can provide a price.
51
+ */
52
+ async getPrice(token) {
53
+ const cacheKey = buildCacheKey(token.chain, token.address);
54
+ return this.cache.getOrFetch(cacheKey, async () => {
55
+ return this.fetchWithFallback(token, cacheKey);
56
+ });
57
+ }
58
+ /**
59
+ * Get prices for multiple tokens.
60
+ *
61
+ * Each token is queried individually via getPrice() (which handles
62
+ * cache, fallback, and cross-validation per token). Failed tokens
63
+ * are silently excluded from the result Map.
64
+ *
65
+ * @param tokens - Array of token references.
66
+ * @returns Map from cache key to PriceInfo.
67
+ */
68
+ async getPrices(tokens) {
69
+ const result = new Map();
70
+ const promises = tokens.map(async (token) => {
71
+ try {
72
+ const price = await this.getPrice(token);
73
+ const key = buildCacheKey(token.chain, token.address);
74
+ result.set(key, price);
75
+ }
76
+ catch {
77
+ // Skip failed tokens
78
+ }
79
+ });
80
+ await Promise.all(promises);
81
+ return result;
82
+ }
83
+ /**
84
+ * Get native token price (SOL or ETH).
85
+ *
86
+ * Delegates to getPrice() with address='native' and chain-appropriate decimals.
87
+ *
88
+ * @param chain - Chain type ('solana' or 'ethereum').
89
+ * @returns PriceInfo for the native token.
90
+ */
91
+ async getNativePrice(chain) {
92
+ const decimals = chain === 'solana' ? 9 : 18;
93
+ return this.getPrice({ address: 'native', decimals, chain });
94
+ }
95
+ /**
96
+ * Get cache statistics from InMemoryPriceCache.
97
+ *
98
+ * @returns Current cache hit/miss/stale/size/eviction counts.
99
+ */
100
+ getCacheStats() {
101
+ return this.cache.getStats();
102
+ }
103
+ // ---------------------------------------------------------------------------
104
+ // Private: Fetch with fallback and cross-validation
105
+ // ---------------------------------------------------------------------------
106
+ /**
107
+ * Core fallback + cross-validation logic.
108
+ *
109
+ * Called by cache.getOrFetch() on cache miss. This function:
110
+ * 1. Tries primary oracle.
111
+ * 2. On primary success, cross-validates with fallback (if available).
112
+ * 3. On primary failure, tries fallback as data source.
113
+ * 4. On all failures, checks stale cache.
114
+ * 5. If everything fails, throws PriceNotAvailableError.
115
+ *
116
+ * Note: stale fallback is handled inside the fetcher so it can
117
+ * return stale data that gets re-cached (intentional: oracle outage survival).
118
+ */
119
+ async fetchWithFallback(token, cacheKey) {
120
+ // Stage 1: Try primary oracle (Pyth)
121
+ let primaryResult = null;
122
+ try {
123
+ primaryResult = await this.primary.getPrice(token);
124
+ }
125
+ catch {
126
+ // Primary failed, continue to fallback
127
+ }
128
+ // Stage 2a: Primary succeeded -> cross-validate with fallback
129
+ if (primaryResult) {
130
+ if (this.fallback) {
131
+ try {
132
+ const fallbackResult = await this.fallback.getPrice(token);
133
+ const deviation = calculateDeviation(primaryResult.usdPrice, fallbackResult.usdPrice);
134
+ if (deviation > this.threshold) {
135
+ // Deviation too high -- degrade to stale
136
+ return { ...primaryResult, isStale: true };
137
+ }
138
+ }
139
+ catch {
140
+ // Fallback failed during cross-validation -- trust primary as-is
141
+ }
142
+ }
143
+ return primaryResult;
144
+ }
145
+ // Stage 2b: Primary failed -> try fallback as data source
146
+ if (this.fallback) {
147
+ try {
148
+ return await this.fallback.getPrice(token);
149
+ }
150
+ catch {
151
+ // Fallback also failed
152
+ }
153
+ }
154
+ // Stage 3: All oracles failed -> try stale cache
155
+ const stale = this.cache.getStale(cacheKey);
156
+ if (stale) {
157
+ return { ...stale, isStale: true, source: 'cache' };
158
+ }
159
+ // Stage 4: Nothing available
160
+ throw new PriceNotAvailableError(cacheKey);
161
+ }
162
+ }
163
+ //# sourceMappingURL=oracle-chain.js.map