safehands-pharos 1.4.0 → 2.6.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 (571) hide show
  1. package/.agents/policies/default.json +15 -0
  2. package/.env.example +81 -64
  3. package/README.md +301 -333
  4. package/SECURITY.md +112 -0
  5. package/SKILL.md +59 -0
  6. package/contracts/SafeHandsAttestation.sol +182 -0
  7. package/contracts/SafeHandsRegistry.sol +149 -0
  8. package/dist/agent/SafeHandsGuardianAgent.d.ts +39 -0
  9. package/dist/agent/SafeHandsGuardianAgent.d.ts.map +1 -0
  10. package/dist/agent/SafeHandsGuardianAgent.js +98 -0
  11. package/dist/agent/SafeHandsGuardianAgent.js.map +1 -0
  12. package/dist/agent/agentDecisionFormatter.d.ts +43 -0
  13. package/dist/agent/agentDecisionFormatter.d.ts.map +1 -0
  14. package/dist/agent/agentDecisionFormatter.js +96 -0
  15. package/dist/agent/agentDecisionFormatter.js.map +1 -0
  16. package/dist/agent/agentEnrich.d.ts +28 -0
  17. package/dist/agent/agentEnrich.d.ts.map +1 -0
  18. package/dist/agent/agentEnrich.js +99 -0
  19. package/dist/agent/agentEnrich.js.map +1 -0
  20. package/dist/agent/agentIntentClassifier.d.ts +44 -0
  21. package/dist/agent/agentIntentClassifier.d.ts.map +1 -0
  22. package/dist/agent/agentIntentClassifier.js +77 -0
  23. package/dist/agent/agentIntentClassifier.js.map +1 -0
  24. package/dist/agent/agentPolicyResolver.d.ts +44 -0
  25. package/dist/agent/agentPolicyResolver.d.ts.map +1 -0
  26. package/dist/agent/agentPolicyResolver.js +94 -0
  27. package/dist/agent/agentPolicyResolver.js.map +1 -0
  28. package/dist/agent/agentRuntime.d.ts +12 -0
  29. package/dist/agent/agentRuntime.d.ts.map +1 -0
  30. package/dist/agent/agentRuntime.js +31 -0
  31. package/dist/agent/agentRuntime.js.map +1 -0
  32. package/dist/agent/agentToolRouter.d.ts +24 -0
  33. package/dist/agent/agentToolRouter.d.ts.map +1 -0
  34. package/dist/agent/agentToolRouter.js +89 -0
  35. package/dist/agent/agentToolRouter.js.map +1 -0
  36. package/dist/agent/guardianOperator.d.ts +35 -0
  37. package/dist/agent/guardianOperator.d.ts.map +1 -0
  38. package/dist/agent/guardianOperator.js +65 -0
  39. package/dist/agent/guardianOperator.js.map +1 -0
  40. package/dist/agent/index.d.ts +8 -0
  41. package/dist/agent/index.d.ts.map +1 -0
  42. package/dist/agent/index.js +14 -0
  43. package/dist/agent/index.js.map +1 -0
  44. package/dist/api/activityRoutes.d.ts +70 -0
  45. package/dist/api/activityRoutes.d.ts.map +1 -0
  46. package/dist/api/activityRoutes.js +100 -0
  47. package/dist/api/activityRoutes.js.map +1 -0
  48. package/dist/api/agentRoutes.d.ts +16 -0
  49. package/dist/api/agentRoutes.d.ts.map +1 -0
  50. package/dist/api/agentRoutes.js +37 -0
  51. package/dist/api/agentRoutes.js.map +1 -0
  52. package/dist/api/broadcastRoutes.d.ts +34 -0
  53. package/dist/api/broadcastRoutes.d.ts.map +1 -0
  54. package/dist/api/broadcastRoutes.js +147 -0
  55. package/dist/api/broadcastRoutes.js.map +1 -0
  56. package/dist/api/consolePage.d.ts +2 -0
  57. package/dist/api/consolePage.d.ts.map +1 -0
  58. package/dist/api/consolePage.js +206 -0
  59. package/dist/api/consolePage.js.map +1 -0
  60. package/dist/api/httpHardening.d.ts +75 -0
  61. package/dist/api/httpHardening.d.ts.map +1 -0
  62. package/dist/api/httpHardening.js +122 -0
  63. package/dist/api/httpHardening.js.map +1 -0
  64. package/dist/api/indexerRoutes.d.ts +46 -0
  65. package/dist/api/indexerRoutes.d.ts.map +1 -0
  66. package/dist/api/indexerRoutes.js +75 -0
  67. package/dist/api/indexerRoutes.js.map +1 -0
  68. package/dist/api/paidRoutes.d.ts +8 -0
  69. package/dist/api/paidRoutes.d.ts.map +1 -0
  70. package/dist/api/paidRoutes.js +175 -0
  71. package/dist/api/paidRoutes.js.map +1 -0
  72. package/dist/api/prepareRoutes.d.ts +58 -0
  73. package/dist/api/prepareRoutes.d.ts.map +1 -0
  74. package/dist/api/prepareRoutes.js +90 -0
  75. package/dist/api/prepareRoutes.js.map +1 -0
  76. package/dist/api/response.d.ts +39 -0
  77. package/dist/api/response.d.ts.map +1 -0
  78. package/dist/api/response.js +53 -0
  79. package/dist/api/response.js.map +1 -0
  80. package/dist/api/routes.d.ts +175 -0
  81. package/dist/api/routes.d.ts.map +1 -0
  82. package/dist/api/routes.js +276 -0
  83. package/dist/api/routes.js.map +1 -0
  84. package/dist/api/schemas.d.ts +147 -0
  85. package/dist/api/schemas.d.ts.map +1 -0
  86. package/dist/api/schemas.js +81 -0
  87. package/dist/api/schemas.js.map +1 -0
  88. package/dist/api/server.d.ts +11 -0
  89. package/dist/api/server.d.ts.map +1 -0
  90. package/dist/api/server.js +505 -0
  91. package/dist/api/server.js.map +1 -0
  92. package/dist/api/toolRoutes.d.ts +14 -0
  93. package/dist/api/toolRoutes.d.ts.map +1 -0
  94. package/dist/api/toolRoutes.js +138 -0
  95. package/dist/api/toolRoutes.js.map +1 -0
  96. package/dist/api/walletPrepareRoutes.d.ts +74 -0
  97. package/dist/api/walletPrepareRoutes.d.ts.map +1 -0
  98. package/dist/api/walletPrepareRoutes.js +127 -0
  99. package/dist/api/walletPrepareRoutes.js.map +1 -0
  100. package/dist/api/x402Gate.d.ts +51 -0
  101. package/dist/api/x402Gate.d.ts.map +1 -0
  102. package/dist/api/x402Gate.js +184 -0
  103. package/dist/api/x402Gate.js.map +1 -0
  104. package/dist/cli.d.ts +5 -5
  105. package/dist/cli.d.ts.map +1 -1
  106. package/dist/cli.js +154 -124
  107. package/dist/cli.js.map +1 -1
  108. package/dist/data/ecosystemRegistry.data.d.ts +3 -0
  109. package/dist/data/ecosystemRegistry.data.d.ts.map +1 -0
  110. package/dist/data/ecosystemRegistry.data.js +582 -0
  111. package/dist/data/ecosystemRegistry.data.js.map +1 -0
  112. package/dist/demo.d.ts +1 -1
  113. package/dist/demo.d.ts.map +1 -1
  114. package/dist/demo.js +206 -171
  115. package/dist/demo.js.map +1 -1
  116. package/dist/index.d.ts +2 -2
  117. package/dist/index.d.ts.map +1 -1
  118. package/dist/index.js +249 -164
  119. package/dist/index.js.map +1 -1
  120. package/dist/init.d.ts +1 -1
  121. package/dist/init.d.ts.map +1 -1
  122. package/dist/init.js +127 -65
  123. package/dist/init.js.map +1 -1
  124. package/dist/lib/analysis/approval.d.ts +29 -0
  125. package/dist/lib/analysis/approval.d.ts.map +1 -0
  126. package/dist/lib/analysis/approval.js +162 -0
  127. package/dist/lib/analysis/approval.js.map +1 -0
  128. package/dist/lib/analysis/calldata.d.ts +60 -0
  129. package/dist/lib/analysis/calldata.d.ts.map +1 -0
  130. package/dist/lib/analysis/calldata.js +349 -0
  131. package/dist/lib/analysis/calldata.js.map +1 -0
  132. package/dist/lib/analysis/contractIntel.d.ts +65 -0
  133. package/dist/lib/analysis/contractIntel.d.ts.map +1 -0
  134. package/dist/lib/analysis/contractIntel.js +320 -0
  135. package/dist/lib/analysis/contractIntel.js.map +1 -0
  136. package/dist/lib/analysis/evm.d.ts +42 -0
  137. package/dist/lib/analysis/evm.d.ts.map +1 -0
  138. package/dist/lib/analysis/evm.js +185 -0
  139. package/dist/lib/analysis/evm.js.map +1 -0
  140. package/dist/lib/analysis/gas.d.ts +4 -0
  141. package/dist/lib/analysis/gas.d.ts.map +1 -0
  142. package/dist/lib/analysis/gas.js +13 -0
  143. package/dist/lib/analysis/gas.js.map +1 -0
  144. package/dist/lib/analysis/index.d.ts +11 -0
  145. package/dist/lib/analysis/index.d.ts.map +1 -0
  146. package/dist/lib/analysis/index.js +16 -0
  147. package/dist/lib/analysis/index.js.map +1 -0
  148. package/dist/lib/analysis/pharosTokens.d.ts +31 -0
  149. package/dist/lib/analysis/pharosTokens.d.ts.map +1 -0
  150. package/dist/lib/analysis/pharosTokens.js +78 -0
  151. package/dist/lib/analysis/pharosTokens.js.map +1 -0
  152. package/dist/lib/analysis/safeTx.d.ts +27 -0
  153. package/dist/lib/analysis/safeTx.d.ts.map +1 -0
  154. package/dist/lib/analysis/safeTx.js +118 -0
  155. package/dist/lib/analysis/safeTx.js.map +1 -0
  156. package/dist/lib/analysis/token.d.ts +21 -0
  157. package/dist/lib/analysis/token.d.ts.map +1 -0
  158. package/dist/lib/analysis/token.js +151 -0
  159. package/dist/lib/analysis/token.js.map +1 -0
  160. package/dist/lib/analysis/types.d.ts +49 -0
  161. package/dist/lib/analysis/types.d.ts.map +1 -0
  162. package/dist/lib/analysis/types.js +10 -0
  163. package/dist/lib/analysis/types.js.map +1 -0
  164. package/dist/lib/analysis/x402.d.ts +24 -0
  165. package/dist/lib/analysis/x402.d.ts.map +1 -0
  166. package/dist/lib/analysis/x402.js +60 -0
  167. package/dist/lib/analysis/x402.js.map +1 -0
  168. package/dist/lib/auditLog.d.ts +1 -0
  169. package/dist/lib/auditLog.d.ts.map +1 -1
  170. package/dist/lib/auditLog.js +0 -0
  171. package/dist/lib/auditLog.js.map +1 -1
  172. package/dist/lib/config.d.ts +77 -0
  173. package/dist/lib/config.d.ts.map +1 -0
  174. package/dist/lib/config.js +120 -0
  175. package/dist/lib/config.js.map +1 -0
  176. package/dist/lib/constants.d.ts +452 -291
  177. package/dist/lib/constants.d.ts.map +1 -1
  178. package/dist/lib/constants.js +509 -292
  179. package/dist/lib/constants.js.map +1 -1
  180. package/dist/lib/dodoApi.d.ts +101 -78
  181. package/dist/lib/dodoApi.d.ts.map +1 -1
  182. package/dist/lib/dodoApi.js +259 -196
  183. package/dist/lib/dodoApi.js.map +1 -1
  184. package/dist/lib/ecosystemRegistry.d.ts +116 -0
  185. package/dist/lib/ecosystemRegistry.d.ts.map +1 -0
  186. package/dist/lib/ecosystemRegistry.js +178 -0
  187. package/dist/lib/ecosystemRegistry.js.map +1 -0
  188. package/dist/lib/envLoader.d.ts +2 -0
  189. package/dist/lib/envLoader.d.ts.map +1 -0
  190. package/dist/lib/envLoader.js +65 -0
  191. package/dist/lib/envLoader.js.map +1 -0
  192. package/dist/lib/goldsky.d.ts +58 -0
  193. package/dist/lib/goldsky.d.ts.map +1 -0
  194. package/dist/lib/goldsky.js +275 -0
  195. package/dist/lib/goldsky.js.map +1 -0
  196. package/dist/lib/guardian/decision.d.ts +23 -0
  197. package/dist/lib/guardian/decision.d.ts.map +1 -0
  198. package/dist/lib/guardian/decision.js +40 -0
  199. package/dist/lib/guardian/decision.js.map +1 -0
  200. package/dist/lib/http.d.ts +13 -14
  201. package/dist/lib/http.d.ts.map +1 -1
  202. package/dist/lib/http.js +383 -118
  203. package/dist/lib/http.js.map +1 -1
  204. package/dist/lib/managedExecution.d.ts +19 -0
  205. package/dist/lib/managedExecution.d.ts.map +1 -0
  206. package/dist/lib/managedExecution.js +64 -0
  207. package/dist/lib/managedExecution.js.map +1 -0
  208. package/dist/lib/merkleBatcher.d.ts +23 -0
  209. package/dist/lib/merkleBatcher.d.ts.map +1 -0
  210. package/dist/lib/merkleBatcher.js +62 -0
  211. package/dist/lib/merkleBatcher.js.map +1 -0
  212. package/dist/lib/networks.d.ts +48 -0
  213. package/dist/lib/networks.d.ts.map +1 -0
  214. package/dist/lib/networks.js +103 -0
  215. package/dist/lib/networks.js.map +1 -0
  216. package/dist/lib/observability/accessContext.d.ts +29 -0
  217. package/dist/lib/observability/accessContext.d.ts.map +1 -0
  218. package/dist/lib/observability/accessContext.js +50 -0
  219. package/dist/lib/observability/accessContext.js.map +1 -0
  220. package/dist/lib/observability/activityStore.d.ts +70 -0
  221. package/dist/lib/observability/activityStore.d.ts.map +1 -0
  222. package/dist/lib/observability/activityStore.js +149 -0
  223. package/dist/lib/observability/activityStore.js.map +1 -0
  224. package/dist/lib/observability/apiKey.d.ts +55 -0
  225. package/dist/lib/observability/apiKey.d.ts.map +1 -0
  226. package/dist/lib/observability/apiKey.js +141 -0
  227. package/dist/lib/observability/apiKey.js.map +1 -0
  228. package/dist/lib/observability/logger.d.ts +30 -0
  229. package/dist/lib/observability/logger.d.ts.map +1 -0
  230. package/dist/lib/observability/logger.js +30 -0
  231. package/dist/lib/observability/logger.js.map +1 -0
  232. package/dist/lib/observability/quota.d.ts +33 -0
  233. package/dist/lib/observability/quota.d.ts.map +1 -0
  234. package/dist/lib/observability/quota.js +49 -0
  235. package/dist/lib/observability/quota.js.map +1 -0
  236. package/dist/lib/observability/requestId.d.ts +8 -0
  237. package/dist/lib/observability/requestId.d.ts.map +1 -0
  238. package/dist/lib/observability/requestId.js +24 -0
  239. package/dist/lib/observability/requestId.js.map +1 -0
  240. package/dist/lib/observability/sanitize.d.ts +77 -0
  241. package/dist/lib/observability/sanitize.d.ts.map +1 -0
  242. package/dist/lib/observability/sanitize.js +228 -0
  243. package/dist/lib/observability/sanitize.js.map +1 -0
  244. package/dist/lib/observability/scopes.d.ts +20 -0
  245. package/dist/lib/observability/scopes.d.ts.map +1 -0
  246. package/dist/lib/observability/scopes.js +77 -0
  247. package/dist/lib/observability/scopes.js.map +1 -0
  248. package/dist/lib/okxDexApi.d.ts +106 -0
  249. package/dist/lib/okxDexApi.d.ts.map +1 -0
  250. package/dist/lib/okxDexApi.js +221 -0
  251. package/dist/lib/okxDexApi.js.map +1 -0
  252. package/dist/lib/persistentJsonStore.d.ts +5 -0
  253. package/dist/lib/persistentJsonStore.d.ts.map +1 -0
  254. package/dist/lib/persistentJsonStore.js +39 -0
  255. package/dist/lib/persistentJsonStore.js.map +1 -0
  256. package/dist/lib/pharos/attestationPublisher.d.ts +50 -0
  257. package/dist/lib/pharos/attestationPublisher.d.ts.map +1 -0
  258. package/dist/lib/pharos/attestationPublisher.js +262 -0
  259. package/dist/lib/pharos/attestationPublisher.js.map +1 -0
  260. package/dist/lib/pharos/ecosystem.d.ts +52 -0
  261. package/dist/lib/pharos/ecosystem.d.ts.map +1 -0
  262. package/dist/lib/pharos/ecosystem.js +431 -0
  263. package/dist/lib/pharos/ecosystem.js.map +1 -0
  264. package/dist/lib/pharos/ecosystemEvidence.d.ts +53 -0
  265. package/dist/lib/pharos/ecosystemEvidence.d.ts.map +1 -0
  266. package/dist/lib/pharos/ecosystemEvidence.js +133 -0
  267. package/dist/lib/pharos/ecosystemEvidence.js.map +1 -0
  268. package/dist/lib/pharos/rpc.d.ts +44 -0
  269. package/dist/lib/pharos/rpc.d.ts.map +1 -0
  270. package/dist/lib/pharos/rpc.js +90 -0
  271. package/dist/lib/pharos/rpc.js.map +1 -0
  272. package/dist/lib/pharos/rpcEvidence.d.ts +49 -0
  273. package/dist/lib/pharos/rpcEvidence.d.ts.map +1 -0
  274. package/dist/lib/pharos/rpcEvidence.js +46 -0
  275. package/dist/lib/pharos/rpcEvidence.js.map +1 -0
  276. package/dist/lib/pharos/rpcMethods.d.ts +46 -0
  277. package/dist/lib/pharos/rpcMethods.d.ts.map +1 -0
  278. package/dist/lib/pharos/rpcMethods.js +176 -0
  279. package/dist/lib/pharos/rpcMethods.js.map +1 -0
  280. package/dist/lib/pharos/spvVerifier.d.ts +47 -0
  281. package/dist/lib/pharos/spvVerifier.d.ts.map +1 -0
  282. package/dist/lib/pharos/spvVerifier.js +105 -0
  283. package/dist/lib/pharos/spvVerifier.js.map +1 -0
  284. package/dist/lib/pharos/userSignedBroadcaster.d.ts +10 -0
  285. package/dist/lib/pharos/userSignedBroadcaster.d.ts.map +1 -0
  286. package/dist/lib/pharos/userSignedBroadcaster.js +50 -0
  287. package/dist/lib/pharos/userSignedBroadcaster.js.map +1 -0
  288. package/dist/lib/pharosClient.d.ts +53 -58
  289. package/dist/lib/pharosClient.d.ts.map +1 -1
  290. package/dist/lib/pharosClient.js +56 -63
  291. package/dist/lib/pharosClient.js.map +1 -1
  292. package/dist/lib/policy/actionPolicyEngine.d.ts +89 -53
  293. package/dist/lib/policy/actionPolicyEngine.d.ts.map +1 -1
  294. package/dist/lib/policy/actionPolicyEngine.js +373 -212
  295. package/dist/lib/policy/actionPolicyEngine.js.map +1 -1
  296. package/dist/lib/policy/agentPolicy.d.ts +29 -0
  297. package/dist/lib/policy/agentPolicy.d.ts.map +1 -0
  298. package/dist/lib/policy/agentPolicy.js +154 -0
  299. package/dist/lib/policy/agentPolicy.js.map +1 -0
  300. package/dist/lib/policy/policyPresets.d.ts +30 -0
  301. package/dist/lib/policy/policyPresets.d.ts.map +1 -0
  302. package/dist/lib/policy/policyPresets.js +124 -0
  303. package/dist/lib/policy/policyPresets.js.map +1 -0
  304. package/dist/lib/policy/writeExecutionGate.d.ts +23 -0
  305. package/dist/lib/policy/writeExecutionGate.d.ts.map +1 -0
  306. package/dist/lib/policy/writeExecutionGate.js +65 -0
  307. package/dist/lib/policy/writeExecutionGate.js.map +1 -0
  308. package/dist/lib/preparedTxStore.d.ts +21 -0
  309. package/dist/lib/preparedTxStore.d.ts.map +1 -0
  310. package/dist/lib/preparedTxStore.js +90 -0
  311. package/dist/lib/preparedTxStore.js.map +1 -0
  312. package/dist/lib/price/chainlinkPushProvider.d.ts +34 -0
  313. package/dist/lib/price/chainlinkPushProvider.d.ts.map +1 -0
  314. package/dist/lib/price/chainlinkPushProvider.js +36 -0
  315. package/dist/lib/price/chainlinkPushProvider.js.map +1 -0
  316. package/dist/lib/price/feedRegistry.d.ts +26 -0
  317. package/dist/lib/price/feedRegistry.d.ts.map +1 -0
  318. package/dist/lib/price/feedRegistry.js +67 -0
  319. package/dist/lib/price/feedRegistry.js.map +1 -0
  320. package/dist/lib/price/priceResolver.d.ts +35 -0
  321. package/dist/lib/price/priceResolver.d.ts.map +1 -0
  322. package/dist/lib/price/priceResolver.js +246 -0
  323. package/dist/lib/price/priceResolver.js.map +1 -0
  324. package/dist/lib/price/supraProvider.d.ts +9 -0
  325. package/dist/lib/price/supraProvider.d.ts.map +1 -0
  326. package/dist/lib/price/supraProvider.js +17 -0
  327. package/dist/lib/price/supraProvider.js.map +1 -0
  328. package/dist/lib/price/types.d.ts +67 -0
  329. package/dist/lib/price/types.d.ts.map +1 -0
  330. package/dist/lib/price/types.js +7 -0
  331. package/dist/lib/price/types.js.map +1 -0
  332. package/dist/lib/productionGuards.d.ts +16 -0
  333. package/dist/lib/productionGuards.d.ts.map +1 -0
  334. package/dist/lib/productionGuards.js +93 -0
  335. package/dist/lib/productionGuards.js.map +1 -0
  336. package/dist/lib/recipientSafety.d.ts +5 -0
  337. package/dist/lib/recipientSafety.d.ts.map +1 -0
  338. package/dist/lib/recipientSafety.js +28 -0
  339. package/dist/lib/recipientSafety.js.map +1 -0
  340. package/dist/lib/riskEngine.d.ts +45 -26
  341. package/dist/lib/riskEngine.d.ts.map +1 -1
  342. package/dist/lib/riskEngine.js +346 -283
  343. package/dist/lib/riskEngine.js.map +1 -1
  344. package/dist/lib/riskInclusion.d.ts +72 -0
  345. package/dist/lib/riskInclusion.d.ts.map +1 -0
  346. package/dist/lib/riskInclusion.js +252 -0
  347. package/dist/lib/riskInclusion.js.map +1 -0
  348. package/dist/lib/safeHandsRegistry.d.ts +32 -0
  349. package/dist/lib/safeHandsRegistry.d.ts.map +1 -0
  350. package/dist/lib/safeHandsRegistry.js +151 -0
  351. package/dist/lib/safeHandsRegistry.js.map +1 -0
  352. package/dist/lib/signer/index.d.ts +24 -24
  353. package/dist/lib/signer/index.d.ts.map +1 -1
  354. package/dist/lib/signer/index.js +110 -88
  355. package/dist/lib/signer/index.js.map +1 -1
  356. package/dist/lib/spendAccumulator.d.ts +24 -1
  357. package/dist/lib/spendAccumulator.d.ts.map +1 -1
  358. package/dist/lib/spendAccumulator.js +76 -6
  359. package/dist/lib/spendAccumulator.js.map +1 -1
  360. package/dist/lib/toolResponse.d.ts +30 -25
  361. package/dist/lib/toolResponse.d.ts.map +1 -1
  362. package/dist/lib/toolResponse.js +57 -53
  363. package/dist/lib/toolResponse.js.map +1 -1
  364. package/dist/lib/validation.d.ts +7 -0
  365. package/dist/lib/validation.d.ts.map +1 -0
  366. package/dist/lib/validation.js +62 -0
  367. package/dist/lib/validation.js.map +1 -0
  368. package/dist/lib/wallet/index.d.ts +33 -37
  369. package/dist/lib/wallet/index.d.ts.map +1 -1
  370. package/dist/lib/wallet/index.js +141 -128
  371. package/dist/lib/wallet/index.js.map +1 -1
  372. package/dist/lib/x402ReplayStore.d.ts +6 -0
  373. package/dist/lib/x402ReplayStore.d.ts.map +1 -0
  374. package/dist/lib/x402ReplayStore.js +79 -0
  375. package/dist/lib/x402ReplayStore.js.map +1 -0
  376. package/dist/safehands.zip +0 -0
  377. package/dist/sdk.d.ts +14 -0
  378. package/dist/sdk.d.ts.map +1 -0
  379. package/dist/sdk.js +25 -0
  380. package/dist/sdk.js.map +1 -0
  381. package/dist/tools/approveToken.d.ts +66 -45
  382. package/dist/tools/approveToken.d.ts.map +1 -1
  383. package/dist/tools/approveToken.js +152 -85
  384. package/dist/tools/approveToken.js.map +1 -1
  385. package/dist/tools/assessRisk.d.ts +66 -79
  386. package/dist/tools/assessRisk.d.ts.map +1 -1
  387. package/dist/tools/assessRisk.js +63 -104
  388. package/dist/tools/assessRisk.js.map +1 -1
  389. package/dist/tools/checkAllowance.d.ts +49 -43
  390. package/dist/tools/checkAllowance.d.ts.map +1 -1
  391. package/dist/tools/checkAllowance.js +78 -56
  392. package/dist/tools/checkAllowance.js.map +1 -1
  393. package/dist/tools/checkTokenSecurity.d.ts +103 -46
  394. package/dist/tools/checkTokenSecurity.d.ts.map +1 -1
  395. package/dist/tools/checkTokenSecurity.js +240 -95
  396. package/dist/tools/checkTokenSecurity.js.map +1 -1
  397. package/dist/tools/createAgentWallet.d.ts +30 -26
  398. package/dist/tools/createAgentWallet.d.ts.map +1 -1
  399. package/dist/tools/createAgentWallet.js +87 -58
  400. package/dist/tools/createAgentWallet.js.map +1 -1
  401. package/dist/tools/estimateGas.d.ts +84 -79
  402. package/dist/tools/estimateGas.d.ts.map +1 -1
  403. package/dist/tools/estimateGas.js +130 -124
  404. package/dist/tools/estimateGas.js.map +1 -1
  405. package/dist/tools/executeSwap.d.ts +109 -61
  406. package/dist/tools/executeSwap.d.ts.map +1 -1
  407. package/dist/tools/executeSwap.js +289 -141
  408. package/dist/tools/executeSwap.js.map +1 -1
  409. package/dist/tools/explainRisk.d.ts +29 -29
  410. package/dist/tools/explainRisk.d.ts.map +1 -1
  411. package/dist/tools/explainRisk.js +33 -32
  412. package/dist/tools/explainRisk.js.map +1 -1
  413. package/dist/tools/getAgentPolicy.d.ts +15 -0
  414. package/dist/tools/getAgentPolicy.d.ts.map +1 -0
  415. package/dist/tools/getAgentPolicy.js +16 -0
  416. package/dist/tools/getAgentPolicy.js.map +1 -0
  417. package/dist/tools/getAgentReputation.d.ts +31 -0
  418. package/dist/tools/getAgentReputation.d.ts.map +1 -0
  419. package/dist/tools/getAgentReputation.js +44 -0
  420. package/dist/tools/getAgentReputation.js.map +1 -0
  421. package/dist/tools/getAgentWallet.d.ts +21 -21
  422. package/dist/tools/getAgentWallet.d.ts.map +1 -1
  423. package/dist/tools/getAgentWallet.js +37 -27
  424. package/dist/tools/getAgentWallet.js.map +1 -1
  425. package/dist/tools/getAgentWalletBalance.d.ts +11 -11
  426. package/dist/tools/getAgentWalletBalance.d.ts.map +1 -1
  427. package/dist/tools/getAgentWalletBalance.js +102 -70
  428. package/dist/tools/getAgentWalletBalance.js.map +1 -1
  429. package/dist/tools/getExecutionHistory.d.ts +49 -49
  430. package/dist/tools/getExecutionHistory.d.ts.map +1 -1
  431. package/dist/tools/getExecutionHistory.js +148 -154
  432. package/dist/tools/getExecutionHistory.js.map +1 -1
  433. package/dist/tools/getGasPrice.d.ts +43 -43
  434. package/dist/tools/getGasPrice.d.ts.map +0 -0
  435. package/dist/tools/getGasPrice.js +59 -59
  436. package/dist/tools/getGasPrice.js.map +1 -1
  437. package/dist/tools/getPoolInfo.d.ts +75 -75
  438. package/dist/tools/getPoolInfo.d.ts.map +1 -1
  439. package/dist/tools/getPoolInfo.js +142 -137
  440. package/dist/tools/getPoolInfo.js.map +1 -1
  441. package/dist/tools/getSpvProof.d.ts +24 -0
  442. package/dist/tools/getSpvProof.d.ts.map +1 -0
  443. package/dist/tools/getSpvProof.js +64 -0
  444. package/dist/tools/getSpvProof.js.map +1 -0
  445. package/dist/tools/getTokenPrice.d.ts +56 -113
  446. package/dist/tools/getTokenPrice.d.ts.map +1 -1
  447. package/dist/tools/getTokenPrice.js +110 -117
  448. package/dist/tools/getTokenPrice.js.map +1 -1
  449. package/dist/tools/getTransactionStatus.d.ts +43 -43
  450. package/dist/tools/getTransactionStatus.d.ts.map +0 -0
  451. package/dist/tools/getTransactionStatus.js +59 -59
  452. package/dist/tools/getTransactionStatus.js.map +0 -0
  453. package/dist/tools/getWalletBalance.d.ts +103 -68
  454. package/dist/tools/getWalletBalance.d.ts.map +1 -1
  455. package/dist/tools/getWalletBalance.js +127 -87
  456. package/dist/tools/getWalletBalance.js.map +1 -1
  457. package/dist/tools/publishRiskScore.d.ts +85 -63
  458. package/dist/tools/publishRiskScore.d.ts.map +1 -1
  459. package/dist/tools/publishRiskScore.js +136 -88
  460. package/dist/tools/publishRiskScore.js.map +1 -1
  461. package/dist/tools/queryGoldsky.d.ts +20 -0
  462. package/dist/tools/queryGoldsky.d.ts.map +1 -0
  463. package/dist/tools/queryGoldsky.js +29 -0
  464. package/dist/tools/queryGoldsky.js.map +1 -0
  465. package/dist/tools/queryRiskRegistry.d.ts +38 -38
  466. package/dist/tools/queryRiskRegistry.d.ts.map +1 -1
  467. package/dist/tools/queryRiskRegistry.js +59 -55
  468. package/dist/tools/queryRiskRegistry.js.map +1 -1
  469. package/dist/tools/safehandsPreflightCheck.d.ts +92 -77
  470. package/dist/tools/safehandsPreflightCheck.d.ts.map +1 -1
  471. package/dist/tools/safehandsPreflightCheck.js +174 -47
  472. package/dist/tools/safehandsPreflightCheck.js.map +1 -1
  473. package/dist/tools/safehandsRiskReport.d.ts +96 -81
  474. package/dist/tools/safehandsRiskReport.d.ts.map +1 -1
  475. package/dist/tools/safehandsRiskReport.js +48 -28
  476. package/dist/tools/safehandsRiskReport.js.map +1 -1
  477. package/dist/tools/safehandsSafeExecute.d.ts +20 -20
  478. package/dist/tools/safehandsSafeExecute.d.ts.map +1 -1
  479. package/dist/tools/safehandsSafeExecute.js +164 -81
  480. package/dist/tools/safehandsSafeExecute.js.map +1 -1
  481. package/dist/tools/safehandsWalletHealth.d.ts +28 -14
  482. package/dist/tools/safehandsWalletHealth.d.ts.map +1 -1
  483. package/dist/tools/safehandsWalletHealth.js +145 -103
  484. package/dist/tools/safehandsWalletHealth.js.map +1 -1
  485. package/dist/tools/safehandsX402Preflight.d.ts +26 -26
  486. package/dist/tools/safehandsX402Preflight.d.ts.map +1 -1
  487. package/dist/tools/safehandsX402Preflight.js +86 -65
  488. package/dist/tools/safehandsX402Preflight.js.map +1 -1
  489. package/dist/tools/sendPayment.d.ts +63 -57
  490. package/dist/tools/sendPayment.d.ts.map +1 -1
  491. package/dist/tools/sendPayment.js +144 -117
  492. package/dist/tools/sendPayment.js.map +1 -1
  493. package/dist/tools/setAgentPolicy.d.ts +75 -0
  494. package/dist/tools/setAgentPolicy.d.ts.map +1 -0
  495. package/dist/tools/setAgentPolicy.js +80 -0
  496. package/dist/tools/setAgentPolicy.js.map +1 -0
  497. package/dist/tools/simulateTransaction.d.ts +64 -60
  498. package/dist/tools/simulateTransaction.d.ts.map +1 -1
  499. package/dist/tools/simulateTransaction.js +116 -83
  500. package/dist/tools/simulateTransaction.js.map +1 -1
  501. package/dist/tools/tokenRegistryStatus.d.ts +46 -26
  502. package/dist/tools/tokenRegistryStatus.d.ts.map +1 -1
  503. package/dist/tools/tokenRegistryStatus.js +126 -96
  504. package/dist/tools/tokenRegistryStatus.js.map +1 -1
  505. package/dist/tools/verifyRiskInclusion.d.ts +59 -0
  506. package/dist/tools/verifyRiskInclusion.d.ts.map +1 -0
  507. package/dist/tools/verifyRiskInclusion.js +40 -0
  508. package/dist/tools/verifyRiskInclusion.js.map +1 -0
  509. package/dist/tools/x402PayAndFetch.d.ts +87 -81
  510. package/dist/tools/x402PayAndFetch.d.ts.map +1 -1
  511. package/dist/tools/x402PayAndFetch.js +295 -152
  512. package/dist/tools/x402PayAndFetch.js.map +1 -1
  513. package/dist/worker.d.ts +3 -0
  514. package/dist/worker.d.ts.map +1 -0
  515. package/dist/worker.js +39 -0
  516. package/dist/worker.js.map +1 -0
  517. package/dist/x402Server.d.ts +1 -1
  518. package/dist/x402Server.d.ts.map +1 -1
  519. package/dist/x402Server.js +409 -252
  520. package/dist/x402Server.js.map +1 -1
  521. package/docs/REVIEWER_QUICKSTART.md +113 -0
  522. package/docs/SAFEHANDS_REVIEWER_DEMO_SCRIPT.md +228 -0
  523. package/package.json +130 -83
  524. package/contracts/RiskRegistry.json +0 -223
  525. package/contracts/RiskRegistry.sol +0 -58
  526. package/dist/lib/testDodoLive.d.ts +0 -2
  527. package/dist/lib/testDodoLive.d.ts.map +0 -1
  528. package/dist/lib/testDodoLive.js +0 -105
  529. package/dist/lib/testDodoLive.js.map +0 -1
  530. package/dist/lib/testLiveSafehands.d.ts +0 -2
  531. package/dist/lib/testLiveSafehands.d.ts.map +0 -1
  532. package/dist/lib/testLiveSafehands.js +0 -93
  533. package/dist/lib/testLiveSafehands.js.map +0 -1
  534. package/dist/lib/testRpc.d.ts +0 -2
  535. package/dist/lib/testRpc.d.ts.map +0 -1
  536. package/dist/lib/testRpc.js +0 -30
  537. package/dist/lib/testRpc.js.map +0 -1
  538. package/dist/lib/testRpcLive.d.ts +0 -2
  539. package/dist/lib/testRpcLive.d.ts.map +0 -1
  540. package/dist/lib/testRpcLive.js +0 -89
  541. package/dist/lib/testRpcLive.js.map +0 -1
  542. package/dist/lib/testTools.d.ts +0 -2
  543. package/dist/lib/testTools.d.ts.map +0 -1
  544. package/dist/lib/testTools.js +0 -398
  545. package/dist/lib/testTools.js.map +0 -1
  546. package/dist/lib/testX402Live.d.ts +0 -2
  547. package/dist/lib/testX402Live.d.ts.map +0 -1
  548. package/dist/lib/testX402Live.js +0 -160
  549. package/dist/lib/testX402Live.js.map +0 -1
  550. package/dist/scripts/checkDeploy.d.ts +0 -2
  551. package/dist/scripts/checkDeploy.d.ts.map +0 -1
  552. package/dist/scripts/checkDeploy.js +0 -25
  553. package/dist/scripts/checkDeploy.js.map +0 -1
  554. package/dist/scripts/deployRegistry.d.ts +0 -2
  555. package/dist/scripts/deployRegistry.d.ts.map +0 -1
  556. package/dist/scripts/deployRegistry.js +0 -101
  557. package/dist/scripts/deployRegistry.js.map +0 -1
  558. package/dist/scripts/testRegistry.d.ts +0 -2
  559. package/dist/scripts/testRegistry.d.ts.map +0 -1
  560. package/dist/scripts/testRegistry.js +0 -44
  561. package/dist/scripts/testRegistry.js.map +0 -1
  562. package/examples/dashboard/index.html +0 -337
  563. package/examples/pharos-skill-engine/SKILL.safehands.md +0 -85
  564. package/examples/pharos-skill-engine/assets/safehands/example-actions.json +0 -49
  565. package/examples/pharos-skill-engine/assets/safehands/policy-defaults.json +0 -11
  566. package/examples/pharos-skill-engine/references/safehands.md +0 -345
  567. package/examples/scenario-hack.ts +0 -38
  568. package/skill/SKILL.md +0 -133
  569. package/skill/assets/safehands/example-actions.json +0 -49
  570. package/skill/assets/safehands/policy-defaults.json +0 -11
  571. package/skill/references/safehands.md +0 -345
@@ -0,0 +1,90 @@
1
+ import { keccak256, stringToHex } from "viem";
2
+ import { randomUUID } from "crypto";
3
+ import { readJsonFile, stateFile, writeJsonFileAtomic } from "./persistentJsonStore.js";
4
+ const STORE_PATH = stateFile("prepared_transactions.json", "SAFEHANDS_PREPARED_TX_STORE_PATH");
5
+ const EXPIRATION_MS = Number(process.env.SAFEHANDS_PREPARED_TX_TTL_MS || 60 * 60 * 1000);
6
+ let state = loadState();
7
+ function loadState() {
8
+ const loaded = readJsonFile(STORE_PATH, { records: {} });
9
+ cleanupExpired(loaded, Date.now(), false);
10
+ return loaded;
11
+ }
12
+ function persist() {
13
+ writeJsonFileAtomic(STORE_PATH, state);
14
+ }
15
+ function cleanupExpired(target = state, now = Date.now(), shouldPersist = true) {
16
+ let changed = false;
17
+ for (const [id, record] of Object.entries(target.records)) {
18
+ if (record.expiresAt < now) {
19
+ delete target.records[id];
20
+ changed = true;
21
+ }
22
+ }
23
+ if (changed && shouldPersist)
24
+ persist();
25
+ }
26
+ // Bound the store so an anonymous flood of /wallet/prepare writes cannot grow
27
+ // it without limit between TTL sweeps. Evicts oldest-created first. (Public-scale
28
+ // deployments should back this with Redis/Postgres rather than a JSON file.)
29
+ const MAX_PREPARED_TX_RECORDS = Number(process.env.SAFEHANDS_PREPARED_TX_MAX || 5000);
30
+ function enforceStoreCap() {
31
+ const ids = Object.keys(state.records);
32
+ if (ids.length <= MAX_PREPARED_TX_RECORDS)
33
+ return;
34
+ const excess = ids.length - MAX_PREPARED_TX_RECORDS;
35
+ const oldest = ids
36
+ .map((id) => ({ id, createdAt: state.records[id].createdAt ?? 0 }))
37
+ .sort((a, b) => a.createdAt - b.createdAt)
38
+ .slice(0, excess);
39
+ for (const { id } of oldest)
40
+ delete state.records[id];
41
+ }
42
+ export function generatePreparedTransactionHash(from, to, data, value, chainId, decision) {
43
+ const payload = `${from.toLowerCase()}:${to.toLowerCase()}:${data.toLowerCase()}:${value}:${chainId}:${decision}`;
44
+ return keccak256(stringToHex(payload));
45
+ }
46
+ export function savePreparedTx(from, to, data, value, chainId, decision, policyVersion, policyPreset) {
47
+ cleanupExpired();
48
+ const id = randomUUID();
49
+ const hash = generatePreparedTransactionHash(from, to, data, value, chainId, decision);
50
+ const now = Date.now();
51
+ const record = {
52
+ id,
53
+ hash,
54
+ from: from.toLowerCase(),
55
+ to: to.toLowerCase(),
56
+ dataHash: keccak256(data),
57
+ value,
58
+ chainId,
59
+ decision,
60
+ policyVersion,
61
+ policyPreset,
62
+ expiresAt: now + EXPIRATION_MS,
63
+ usedAt: null,
64
+ createdAt: now,
65
+ updatedAt: now,
66
+ };
67
+ state.records[id] = record;
68
+ enforceStoreCap();
69
+ persist();
70
+ return record;
71
+ }
72
+ export function getPreparedTx(id) {
73
+ // Reload on read so a restarted process or another single-node lifecycle write
74
+ // is visible without requiring a full application restart.
75
+ state = loadState();
76
+ const record = state.records[id];
77
+ return record ?? null;
78
+ }
79
+ export function markPreparedTxUsed(id) {
80
+ state = loadState();
81
+ const record = state.records[id];
82
+ if (record && !record.usedAt) {
83
+ const now = Date.now();
84
+ record.usedAt = now;
85
+ record.updatedAt = now;
86
+ persist();
87
+ }
88
+ }
89
+ setInterval(() => cleanupExpired(), 5 * 60 * 1000).unref();
90
+ //# sourceMappingURL=preparedTxStore.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"preparedTxStore.js","sourceRoot":"","sources":["../../src/lib/preparedTxStore.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,34 @@
1
+ import type { ContractReader, PriceFeedConfig, PriceProvider, ProviderQuote } from "./types.js";
2
+ export declare const CHAINLINK_PUSH_FEED_ABI: readonly [{
3
+ readonly name: "latestAnswer";
4
+ readonly type: "function";
5
+ readonly stateMutability: "view";
6
+ readonly inputs: readonly [];
7
+ readonly outputs: readonly [{
8
+ readonly type: "int256";
9
+ }];
10
+ }, {
11
+ readonly name: "latestTimestamp";
12
+ readonly type: "function";
13
+ readonly stateMutability: "view";
14
+ readonly inputs: readonly [];
15
+ readonly outputs: readonly [{
16
+ readonly type: "uint256";
17
+ }];
18
+ }, {
19
+ readonly name: "getFeedId";
20
+ readonly type: "function";
21
+ readonly stateMutability: "view";
22
+ readonly inputs: readonly [];
23
+ readonly outputs: readonly [{
24
+ readonly type: "bytes32";
25
+ }];
26
+ }];
27
+ export declare class ChainlinkPushProvider implements PriceProvider {
28
+ readonly kind: "chainlink-push";
29
+ readonly label = "Chainlink Push Engine feed on Pharos";
30
+ private readonly reader;
31
+ constructor(reader?: ContractReader);
32
+ fetchQuote(feed: PriceFeedConfig): Promise<ProviderQuote>;
33
+ }
34
+ //# sourceMappingURL=chainlinkPushProvider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chainlinkPushProvider.d.ts","sourceRoot":"","sources":["../../../src/lib/price/chainlinkPushProvider.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,cAAc,EAAE,eAAe,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAEhG,eAAO,MAAM,uBAAuB;;;;;;;;;;;;;;;;;;;;;;;;EAMlC,CAAC;AAEH,qBAAa,qBAAsB,YAAW,aAAa;IACzD,QAAQ,CAAC,IAAI,EAAG,gBAAgB,CAAU;IAC1C,QAAQ,CAAC,KAAK,0CAA0C;IACxD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAiB;gBAE5B,MAAM,CAAC,EAAE,cAAc;IAI7B,UAAU,CAAC,IAAI,EAAE,eAAe,GAAG,OAAO,CAAC,aAAa,CAAC;CAchE"}
@@ -0,0 +1,36 @@
1
+ // ─── Chainlink Push Engine Provider ────────────────────────────────────
2
+ // Reads latestAnswer/latestTimestamp live from Chainlink Push Engine feed
3
+ // contracts on Pharos via viem eth_call.
4
+ // ────────────────────────────────────────────────────────────────────────
5
+ import { parseAbi } from "viem";
6
+ import { publicClient } from "../pharosClient.js";
7
+ export const CHAINLINK_PUSH_FEED_ABI = parseAbi([
8
+ "function latestAnswer() view returns (int256)",
9
+ "function latestTimestamp() view returns (uint256)",
10
+ // Declared for verification tooling only — never called per price request;
11
+ // feed identity is static registry config.
12
+ "function getFeedId() view returns (bytes32)",
13
+ ]);
14
+ export class ChainlinkPushProvider {
15
+ kind = "chainlink-push";
16
+ label = "Chainlink Push Engine feed on Pharos";
17
+ reader;
18
+ constructor(reader) {
19
+ this.reader = reader ?? publicClient;
20
+ }
21
+ async fetchQuote(feed) {
22
+ // Sequential on purpose: the public Pharos RPC rate-limits parallel eth_call bursts.
23
+ const answer = (await this.reader.readContract({
24
+ address: feed.feedAddress,
25
+ abi: CHAINLINK_PUSH_FEED_ABI,
26
+ functionName: "latestAnswer",
27
+ }));
28
+ const updatedAt = (await this.reader.readContract({
29
+ address: feed.feedAddress,
30
+ abi: CHAINLINK_PUSH_FEED_ABI,
31
+ functionName: "latestTimestamp",
32
+ }));
33
+ return { answer, updatedAtUnix: Number(updatedAt) };
34
+ }
35
+ }
36
+ //# sourceMappingURL=chainlinkPushProvider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chainlinkPushProvider.js","sourceRoot":"","sources":["../../../src/lib/price/chainlinkPushProvider.ts"],"names":[],"mappings":"AAAA,0EAA0E;AAC1E,0EAA0E;AAC1E,yCAAyC;AACzC,2EAA2E;AAE3E,OAAO,EAAE,QAAQ,EAAE,MAAM,MAAM,CAAC;AAChC,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAGlD,MAAM,CAAC,MAAM,uBAAuB,GAAG,QAAQ,CAAC;IAC9C,+CAA+C;IAC/C,mDAAmD;IACnD,2EAA2E;IAC3E,2CAA2C;IAC3C,6CAA6C;CAC9C,CAAC,CAAC;AAEH,MAAM,OAAO,qBAAqB;IACvB,IAAI,GAAG,gBAAyB,CAAC;IACjC,KAAK,GAAG,sCAAsC,CAAC;IACvC,MAAM,CAAiB;IAExC,YAAY,MAAuB;QACjC,IAAI,CAAC,MAAM,GAAG,MAAM,IAAK,YAA0C,CAAC;IACtE,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,IAAqB;QACpC,qFAAqF;QACrF,MAAM,MAAM,GAAG,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC;YAC7C,OAAO,EAAE,IAAI,CAAC,WAAW;YACzB,GAAG,EAAE,uBAAuB;YAC5B,YAAY,EAAE,cAAc;SAC7B,CAAC,CAAW,CAAC;QACd,MAAM,SAAS,GAAG,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC;YAChD,OAAO,EAAE,IAAI,CAAC,WAAW;YACzB,GAAG,EAAE,uBAAuB;YAC5B,YAAY,EAAE,iBAAiB;SAChC,CAAC,CAAW,CAAC;QACd,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC;IACtD,CAAC;CACF"}
@@ -0,0 +1,26 @@
1
+ import type { PriceFeedConfig } from "./types.js";
2
+ /**
3
+ * Pacific Mainnet (1672) Chainlink Push Engine feeds — derived from the
4
+ * canonical ecosystem registry (src/data/ecosystemRegistry.data.ts) so the
5
+ * price resolver and the Anvita hosted-skill assets share one feed set.
6
+ */
7
+ export declare const PACIFIC_MAINNET_PRICE_FEEDS: Record<string, PriceFeedConfig>;
8
+ /** No published Push Engine feed addresses for Atlantic testnet — fail closed. */
9
+ export declare const ATLANTIC_TESTNET_PRICE_FEEDS: Record<string, PriceFeedConfig>;
10
+ /**
11
+ * Wrapped/native aliases → canonical feed key. WBTC is NOT aliased to BTC:
12
+ * a dedicated WBTC/USD feed exists on Pacific Mainnet.
13
+ */
14
+ export declare const PRICE_FEED_ALIASES: Record<string, string>;
15
+ export declare function activePriceFeeds(): Record<string, PriceFeedConfig>;
16
+ export interface FeedLookup {
17
+ requested: string;
18
+ canonical: string;
19
+ aliased: boolean;
20
+ feed: PriceFeedConfig;
21
+ }
22
+ /** Case-insensitive symbol → feed lookup with alias mapping; null if not configured for the active network. */
23
+ export declare function resolveFeedSymbol(symbol: string): FeedLookup | null;
24
+ /** Symbols the active network can price (canonical feeds + configured aliases). */
25
+ export declare function pricedSymbolsForActiveNetwork(): string[];
26
+ //# sourceMappingURL=feedRegistry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"feedRegistry.d.ts","sourceRoot":"","sources":["../../../src/lib/price/feedRegistry.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAiBlD;;;;GAIG;AACH,eAAO,MAAM,2BAA2B,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAOpE,CAAC;AAEL,kFAAkF;AAClF,eAAO,MAAM,4BAA4B,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAM,CAAC;AAEhF;;;GAGG;AACH,eAAO,MAAM,kBAAkB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAMrD,CAAC;AAEF,wBAAgB,gBAAgB,IAAI,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,CAElE;AAED,MAAM,WAAW,UAAU;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,EAAE,eAAe,CAAC;CACvB;AAED,+GAA+G;AAC/G,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,UAAU,GAAG,IAAI,CAMnE;AAED,mFAAmF;AACnF,wBAAgB,6BAA6B,IAAI,MAAM,EAAE,CAMxD"}
@@ -0,0 +1,67 @@
1
+ // ─── Price Feed Registry ───────────────────────────────────────────────
2
+ // Network-keyed oracle feed configuration. Feed addresses/decimals/heartbeats
3
+ // are static config; prices are ALWAYS read live from the feed contracts.
4
+ // ────────────────────────────────────────────────────────────────────────
5
+ import { getActiveNetwork } from "../networks.js";
6
+ import { ECOSYSTEM_REGISTRY_ITEMS } from "../../data/ecosystemRegistry.data.js";
7
+ const CHAINLINK_PUSH_DOCS = "Chainlink Push Engine Feeds on Pharos Pacific Mainnet (docs.pharos.xyz)";
8
+ function pushFeed(base, feedAddress) {
9
+ return {
10
+ pair: `${base}/USD`,
11
+ base,
12
+ quote: "USD",
13
+ feedAddress,
14
+ decimals: 18,
15
+ heartbeatSeconds: 3600,
16
+ provider: "chainlink-push",
17
+ docsSource: CHAINLINK_PUSH_DOCS,
18
+ };
19
+ }
20
+ /**
21
+ * Pacific Mainnet (1672) Chainlink Push Engine feeds — derived from the
22
+ * canonical ecosystem registry (src/data/ecosystemRegistry.data.ts) so the
23
+ * price resolver and the Anvita hosted-skill assets share one feed set.
24
+ */
25
+ export const PACIFIC_MAINNET_PRICE_FEEDS = (() => {
26
+ const item = ECOSYSTEM_REGISTRY_ITEMS.find((i) => i.id === "oracle:pacific-mainnet:chainlink-push-feeds");
27
+ const feeds = {};
28
+ for (const c of item?.contracts ?? []) {
29
+ if (c.symbol)
30
+ feeds[c.symbol] = pushFeed(c.symbol, c.address);
31
+ }
32
+ return feeds;
33
+ })();
34
+ /** No published Push Engine feed addresses for Atlantic testnet — fail closed. */
35
+ export const ATLANTIC_TESTNET_PRICE_FEEDS = {};
36
+ /**
37
+ * Wrapped/native aliases → canonical feed key. WBTC is NOT aliased to BTC:
38
+ * a dedicated WBTC/USD feed exists on Pacific Mainnet.
39
+ */
40
+ export const PRICE_FEED_ALIASES = {
41
+ WPROS: "PROS",
42
+ WETH: "ETH",
43
+ // Pharos is the network/ecosystem; PROS is the token. Priced via the PROS/USD
44
+ // feed. Matches supported-assets.json + the Anvita engine.
45
+ PHAROS: "PROS",
46
+ };
47
+ export function activePriceFeeds() {
48
+ return getActiveNetwork().isMainnet ? PACIFIC_MAINNET_PRICE_FEEDS : ATLANTIC_TESTNET_PRICE_FEEDS;
49
+ }
50
+ /** Case-insensitive symbol → feed lookup with alias mapping; null if not configured for the active network. */
51
+ export function resolveFeedSymbol(symbol) {
52
+ const requested = symbol.trim().toUpperCase();
53
+ const canonical = PRICE_FEED_ALIASES[requested] ?? requested;
54
+ const feed = activePriceFeeds()[canonical];
55
+ if (!feed)
56
+ return null;
57
+ return { requested, canonical, aliased: canonical !== requested, feed };
58
+ }
59
+ /** Symbols the active network can price (canonical feeds + configured aliases). */
60
+ export function pricedSymbolsForActiveNetwork() {
61
+ const canonical = Object.keys(activePriceFeeds());
62
+ const aliases = Object.entries(PRICE_FEED_ALIASES)
63
+ .filter(([, target]) => canonical.includes(target))
64
+ .map(([alias]) => alias);
65
+ return [...canonical, ...aliases].sort();
66
+ }
67
+ //# sourceMappingURL=feedRegistry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"feedRegistry.js","sourceRoot":"","sources":["../../../src/lib/price/feedRegistry.ts"],"names":[],"mappings":"AAAA,0EAA0E;AAC1E,8EAA8E;AAC9E,0EAA0E;AAC1E,2EAA2E;AAE3E,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,EAAE,wBAAwB,EAAE,MAAM,sCAAsC,CAAC;AAGhF,MAAM,mBAAmB,GAAG,yEAAyE,CAAC;AAEtG,SAAS,QAAQ,CAAC,IAAY,EAAE,WAA0B;IACxD,OAAO;QACL,IAAI,EAAE,GAAG,IAAI,MAAM;QACnB,IAAI;QACJ,KAAK,EAAE,KAAK;QACZ,WAAW;QACX,QAAQ,EAAE,EAAE;QACZ,gBAAgB,EAAE,IAAI;QACtB,QAAQ,EAAE,gBAAgB;QAC1B,UAAU,EAAE,mBAAmB;KAChC,CAAC;AACJ,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,MAAM,2BAA2B,GAAoC,CAAC,GAAG,EAAE;IAChF,MAAM,IAAI,GAAG,wBAAwB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,6CAA6C,CAAC,CAAC;IAC1G,MAAM,KAAK,GAAoC,EAAE,CAAC;IAClD,KAAK,MAAM,CAAC,IAAI,IAAI,EAAE,SAAS,IAAI,EAAE,EAAE,CAAC;QACtC,IAAI,CAAC,CAAC,MAAM;YAAE,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC;IAChE,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC,CAAC,EAAE,CAAC;AAEL,kFAAkF;AAClF,MAAM,CAAC,MAAM,4BAA4B,GAAoC,EAAE,CAAC;AAEhF;;;GAGG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAA2B;IACxD,KAAK,EAAE,MAAM;IACb,IAAI,EAAE,KAAK;IACX,8EAA8E;IAC9E,2DAA2D;IAC3D,MAAM,EAAE,MAAM;CACf,CAAC;AAEF,MAAM,UAAU,gBAAgB;IAC9B,OAAO,gBAAgB,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,2BAA2B,CAAC,CAAC,CAAC,4BAA4B,CAAC;AACnG,CAAC;AASD,+GAA+G;AAC/G,MAAM,UAAU,iBAAiB,CAAC,MAAc;IAC9C,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAC9C,MAAM,SAAS,GAAG,kBAAkB,CAAC,SAAS,CAAC,IAAI,SAAS,CAAC;IAC7D,MAAM,IAAI,GAAG,gBAAgB,EAAE,CAAC,SAAS,CAAC,CAAC;IAC3C,IAAI,CAAC,IAAI;QAAE,OAAO,IAAI,CAAC;IACvB,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,OAAO,EAAE,SAAS,KAAK,SAAS,EAAE,IAAI,EAAE,CAAC;AAC1E,CAAC;AAED,mFAAmF;AACnF,MAAM,UAAU,6BAA6B;IAC3C,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,gBAAgB,EAAE,CAAC,CAAC;IAClD,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,kBAAkB,CAAC;SAC/C,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,EAAE,EAAE,CAAC,SAAS,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;SAClD,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC;IAC3B,OAAO,CAAC,GAAG,SAAS,EAAE,GAAG,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC;AAC3C,CAAC"}
@@ -0,0 +1,35 @@
1
+ import type { PriceFeedProviderKind, PriceProvider, PriceResolverResult } from "./types.js";
2
+ export declare const PRICE_CACHE_TTL_MS = 45000;
3
+ export declare const DEGRADED_CACHE_MAX_AGE_MS = 300000;
4
+ export interface ResolvePriceOptions {
5
+ cacheTtlMs?: number;
6
+ /** Set false to disable rpc_degraded_cache serves and strictly fail on RPC errors. */
7
+ allowDegradedCache?: boolean;
8
+ }
9
+ export declare class PriceResolver {
10
+ private readonly providers;
11
+ private readonly now;
12
+ private readonly cache;
13
+ private readonly inflight;
14
+ constructor(providers: Partial<Record<PriceFeedProviderKind, PriceProvider>>, now?: () => number);
15
+ clearCache(): void;
16
+ resolvePriceUsd(symbol: string, opts?: ResolvePriceOptions): Promise<PriceResolverResult>;
17
+ /**
18
+ * Serve a cached resolution if it is within maxAgeMs AND the original oracle
19
+ * timestamp is still within the feed heartbeat. Returns null otherwise.
20
+ */
21
+ private serveFromCache;
22
+ private fetchLive;
23
+ private invalid;
24
+ }
25
+ /**
26
+ * Process-wide singleton wired to the live publicClient. Only implemented
27
+ * providers are registered — the Supra pull provider is a stub
28
+ * (src/lib/price/supraProvider.ts) and is deliberately NOT registered; a feed
29
+ * configured for "supra-pull" fails closed with a structured
30
+ * PRICE_SOURCE_UNAVAILABLE ("no provider registered") instead of advertising an
31
+ * unimplemented source.
32
+ */
33
+ export declare const priceResolver: PriceResolver;
34
+ export declare function resolvePriceUsd(symbol: string, opts?: ResolvePriceOptions): Promise<PriceResolverResult>;
35
+ //# sourceMappingURL=priceResolver.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"priceResolver.d.ts","sourceRoot":"","sources":["../../../src/lib/price/priceResolver.ts"],"names":[],"mappings":"AAqBA,OAAO,KAAK,EAEV,qBAAqB,EACrB,aAAa,EAEb,mBAAmB,EACpB,MAAM,YAAY,CAAC;AAEpB,eAAO,MAAM,kBAAkB,QAAS,CAAC;AACzC,eAAO,MAAM,yBAAyB,SAAU,CAAC;AAQjD,MAAM,WAAW,mBAAmB;IAClC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,sFAAsF;IACtF,kBAAkB,CAAC,EAAE,OAAO,CAAC;CAC9B;AAqDD,qBAAa,aAAa;IAKtB,OAAO,CAAC,QAAQ,CAAC,SAAS;IAC1B,OAAO,CAAC,QAAQ,CAAC,GAAG;IALtB,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAiC;IACvD,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAmD;gBAGzD,SAAS,EAAE,OAAO,CAAC,MAAM,CAAC,qBAAqB,EAAE,aAAa,CAAC,CAAC,EAChE,GAAG,GAAE,MAAM,MAAiB;IAG/C,UAAU,IAAI,IAAI;IAIZ,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,mBAAmB,GAAG,OAAO,CAAC,mBAAmB,CAAC;IAwC/F;;;OAGG;IACH,OAAO,CAAC,cAAc;YAwBR,SAAS;IAiGvB,OAAO,CAAC,OAAO;CAYhB;AAED;;;;;;;GAOG;AACH,eAAO,MAAM,aAAa,eAExB,CAAC;AAEH,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,mBAAmB,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAExG"}
@@ -0,0 +1,246 @@
1
+ // ─── PriceResolver ─────────────────────────────────────────────────────
2
+ // Canonical USD price resolution: live oracle reads + validation + bounded
3
+ // per-feed cache + structured error classification. Never fabricates prices;
4
+ // never assumes stablecoins equal exactly 1 USD.
5
+ //
6
+ // Cache semantics:
7
+ // - Fresh serve: entry younger than the TTL AND the oracle timestamp still
8
+ // within heartbeat → sourceStatus "ok", confidence "high".
9
+ // - Degraded serve (RPC failed transiently): allowed ONLY after a previous
10
+ // successful oracle read, cache age <= 5 minutes, AND the oracle timestamp
11
+ // still within heartbeat → sourceStatus "rpc_degraded_cache",
12
+ // confidence "degraded". feedStale is never set just because a value came
13
+ // from cache — it means heartbeat violation only.
14
+ // - Otherwise: structured PRICE_SOURCE_* failure with no price.
15
+ // ────────────────────────────────────────────────────────────────────────
16
+ import { formatUnits, BaseError, HttpRequestError, RpcRequestError, TimeoutError } from "viem";
17
+ import { getActiveNetwork } from "../networks.js";
18
+ import { CHAIN_ID } from "../constants.js";
19
+ import { resolveFeedSymbol, pricedSymbolsForActiveNetwork } from "./feedRegistry.js";
20
+ import { ChainlinkPushProvider } from "./chainlinkPushProvider.js";
21
+ export const PRICE_CACHE_TTL_MS = 45_000; // fresh-serve window (mandated 30–60s)
22
+ export const DEGRADED_CACHE_MAX_AGE_MS = 300_000; // hard bound for rpc_degraded_cache serves
23
+ const MAX_FUTURE_SKEW_SECONDS = 300;
24
+ function classifyPriceSourceError(err) {
25
+ const message = err instanceof Error ? err.message : String(err);
26
+ const lower = message.toLowerCase();
27
+ // viem readContract failures arrive as ContractFunctionExecutionError wrapping
28
+ // the transport error; walk the chain, but also match the top-level message —
29
+ // the fallback transport can rewrap and viem embeds status text in `details`.
30
+ const walked = err instanceof BaseError
31
+ ? err.walk((e) => e instanceof HttpRequestError || e instanceof RpcRequestError || e instanceof TimeoutError)
32
+ : undefined;
33
+ const httpStatus = walked instanceof HttpRequestError ? walked.status : undefined;
34
+ const rpcCode = walked instanceof RpcRequestError ? walked.code : undefined;
35
+ const rateLimited = httpStatus === 429 ||
36
+ rpcCode === -32005 || // JSON-RPC "limit exceeded" (EIP-1474)
37
+ rpcCode === -32016 || // provider-specific throttle code
38
+ /\b429\b/.test(lower) ||
39
+ lower.includes("rate limit") ||
40
+ lower.includes("rate-limit") ||
41
+ lower.includes("too many requests") ||
42
+ lower.includes("compute unit") ||
43
+ lower.includes("cu limit") ||
44
+ lower.includes("capacity exceeded") ||
45
+ lower.includes("request limit") ||
46
+ lower.includes("quota");
47
+ if (rateLimited) {
48
+ return { code: "PRICE_SOURCE_RATE_LIMITED", retryable: true, message };
49
+ }
50
+ if (lower.includes("supra_provider_not_implemented")) {
51
+ return { code: "PRICE_SOURCE_UNAVAILABLE", retryable: false, message };
52
+ }
53
+ // Zero-data/revert at the feed address means a wrong or absent contract —
54
+ // a configuration problem, not a transient outage.
55
+ if (lower.includes("returned no data") || lower.includes("zero data") || lower.includes("reverted")) {
56
+ return { code: "PRICE_SOURCE_INVALID", retryable: false, message };
57
+ }
58
+ // Timeouts, aborts, network failures, 5xx → transient unavailability.
59
+ return { code: "PRICE_SOURCE_UNAVAILABLE", retryable: true, message };
60
+ }
61
+ export class PriceResolver {
62
+ providers;
63
+ now;
64
+ cache = new Map();
65
+ inflight = new Map();
66
+ constructor(providers, now = Date.now) {
67
+ this.providers = providers;
68
+ this.now = now;
69
+ }
70
+ clearCache() {
71
+ this.cache.clear();
72
+ }
73
+ async resolvePriceUsd(symbol, opts) {
74
+ const lookup = resolveFeedSymbol(symbol);
75
+ if (!lookup) {
76
+ const network = getActiveNetwork().name;
77
+ const configured = pricedSymbolsForActiveNetwork();
78
+ return {
79
+ ok: false,
80
+ error: {
81
+ code: "PRICE_FEED_NOT_CONFIGURED",
82
+ message: `${symbol} has no price feed configured for ${network} (${CHAIN_ID}). Configured symbols: ${configured.length > 0 ? configured.join(", ") : "none"}. No fallback price was fabricated.`,
83
+ retryable: false,
84
+ provider: "none",
85
+ },
86
+ };
87
+ }
88
+ const key = `${getActiveNetwork().name}:${lookup.feed.pair}`;
89
+ const ttlMs = opts?.cacheTtlMs ?? PRICE_CACHE_TTL_MS;
90
+ const fresh = this.serveFromCache(key, lookup, ttlMs, "ok");
91
+ if (fresh)
92
+ return { ok: true, resolution: fresh };
93
+ const inflight = this.inflight.get(key);
94
+ if (inflight) {
95
+ const shared = await inflight;
96
+ if (shared.ok) {
97
+ return { ok: true, resolution: { ...shared.resolution, token: lookup.requested } };
98
+ }
99
+ return shared;
100
+ }
101
+ const pending = this.fetchLive(key, lookup, opts).finally(() => {
102
+ this.inflight.delete(key);
103
+ });
104
+ this.inflight.set(key, pending);
105
+ return pending;
106
+ }
107
+ /**
108
+ * Serve a cached resolution if it is within maxAgeMs AND the original oracle
109
+ * timestamp is still within the feed heartbeat. Returns null otherwise.
110
+ */
111
+ serveFromCache(key, lookup, maxAgeMs, mode) {
112
+ const entry = this.cache.get(key);
113
+ if (!entry)
114
+ return null;
115
+ const nowMs = this.now();
116
+ const cacheAgeMs = nowMs - entry.fetchedAtMs;
117
+ if (cacheAgeMs < 0 || cacheAgeMs > maxAgeMs)
118
+ return null;
119
+ const feedAgeSeconds = Math.max(0, Math.floor(nowMs / 1000) - entry.resolution.updatedAtUnix);
120
+ if (feedAgeSeconds > lookup.feed.heartbeatSeconds)
121
+ return null;
122
+ return {
123
+ ...entry.resolution,
124
+ token: lookup.requested,
125
+ cached: true,
126
+ cacheAgeSeconds: Math.floor(cacheAgeMs / 1000),
127
+ feedAgeSeconds,
128
+ sourceStatus: mode,
129
+ confidence: mode === "ok" ? "high" : "degraded",
130
+ };
131
+ }
132
+ async fetchLive(key, lookup, opts) {
133
+ const feed = lookup.feed;
134
+ const provider = this.providers[feed.provider];
135
+ if (!provider) {
136
+ return {
137
+ ok: false,
138
+ error: {
139
+ code: "PRICE_SOURCE_UNAVAILABLE",
140
+ message: `No ${feed.provider} provider is registered for ${feed.pair}.`,
141
+ retryable: false,
142
+ provider: feed.provider,
143
+ pair: feed.pair,
144
+ },
145
+ };
146
+ }
147
+ try {
148
+ const quote = await provider.fetchQuote(feed);
149
+ const nowSec = Math.floor(this.now() / 1000);
150
+ if (quote.answer <= 0n) {
151
+ return this.invalid(feed, `latestAnswer ${quote.answer} is not a positive value`);
152
+ }
153
+ if (!Number.isFinite(quote.updatedAtUnix) ||
154
+ quote.updatedAtUnix <= 0 ||
155
+ quote.updatedAtUnix > nowSec + MAX_FUTURE_SKEW_SECONDS) {
156
+ return this.invalid(feed, `latestTimestamp ${quote.updatedAtUnix} is zero or implausible`);
157
+ }
158
+ const feedAgeSeconds = Math.max(0, nowSec - quote.updatedAtUnix);
159
+ if (feedAgeSeconds > feed.heartbeatSeconds) {
160
+ return {
161
+ ok: false,
162
+ error: {
163
+ code: "PRICE_SOURCE_STALE",
164
+ message: `${feed.pair} feed is stale: feed age ${feedAgeSeconds}s exceeds heartbeat ${feed.heartbeatSeconds}s (feed ${feed.feedAddress}).`,
165
+ retryable: true,
166
+ provider: feed.provider,
167
+ pair: feed.pair,
168
+ },
169
+ };
170
+ }
171
+ const priceUsd = formatUnits(quote.answer, feed.decimals);
172
+ const priceUsdNumber = Number(priceUsd);
173
+ if (!Number.isFinite(priceUsdNumber) || priceUsdNumber <= 0) {
174
+ return this.invalid(feed, `latestAnswer did not decode to a finite positive price (${priceUsd})`);
175
+ }
176
+ const resolution = {
177
+ token: lookup.requested,
178
+ canonicalSymbol: lookup.canonical,
179
+ pair: feed.pair,
180
+ priceUsd,
181
+ priceUsdNumber,
182
+ provider: feed.provider,
183
+ source: provider.label,
184
+ sourceStatus: "ok",
185
+ confidence: "high",
186
+ timestamp: new Date(quote.updatedAtUnix * 1000).toISOString(),
187
+ updatedAtUnix: quote.updatedAtUnix,
188
+ feedAgeSeconds,
189
+ feedStale: false,
190
+ cached: false,
191
+ cacheAgeSeconds: null,
192
+ feedAddress: feed.feedAddress,
193
+ heartbeatSeconds: feed.heartbeatSeconds,
194
+ network: getActiveNetwork().name,
195
+ chainId: CHAIN_ID,
196
+ };
197
+ this.cache.set(key, { resolution, fetchedAtMs: this.now() });
198
+ return { ok: true, resolution };
199
+ }
200
+ catch (err) {
201
+ const classified = classifyPriceSourceError(err);
202
+ if (classified.retryable && opts?.allowDegradedCache !== false) {
203
+ const degraded = this.serveFromCache(key, lookup, DEGRADED_CACHE_MAX_AGE_MS, "rpc_degraded_cache");
204
+ if (degraded)
205
+ return { ok: true, resolution: degraded };
206
+ }
207
+ return {
208
+ ok: false,
209
+ error: {
210
+ code: classified.code,
211
+ message: classified.message,
212
+ retryable: classified.retryable,
213
+ provider: feed.provider,
214
+ pair: feed.pair,
215
+ },
216
+ };
217
+ }
218
+ }
219
+ invalid(feed, detail) {
220
+ return {
221
+ ok: false,
222
+ error: {
223
+ code: "PRICE_SOURCE_INVALID",
224
+ message: `${feed.pair} feed returned invalid data: ${detail} (feed ${feed.feedAddress}).`,
225
+ retryable: false,
226
+ provider: feed.provider,
227
+ pair: feed.pair,
228
+ },
229
+ };
230
+ }
231
+ }
232
+ /**
233
+ * Process-wide singleton wired to the live publicClient. Only implemented
234
+ * providers are registered — the Supra pull provider is a stub
235
+ * (src/lib/price/supraProvider.ts) and is deliberately NOT registered; a feed
236
+ * configured for "supra-pull" fails closed with a structured
237
+ * PRICE_SOURCE_UNAVAILABLE ("no provider registered") instead of advertising an
238
+ * unimplemented source.
239
+ */
240
+ export const priceResolver = new PriceResolver({
241
+ "chainlink-push": new ChainlinkPushProvider(),
242
+ });
243
+ export function resolvePriceUsd(symbol, opts) {
244
+ return priceResolver.resolvePriceUsd(symbol, opts);
245
+ }
246
+ //# sourceMappingURL=priceResolver.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"priceResolver.js","sourceRoot":"","sources":["../../../src/lib/price/priceResolver.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import type { PriceFeedConfig, PriceProvider, ProviderQuote } from "./types.js";
2
+ export declare const SUPRA_DORA_STORAGE_ADDRESS: "0x58e158c74DF7Ad6396C0dcbadc4878faC9e93d57";
3
+ export declare const SUPRA_DORA_PULL_ADDRESS: "0x16f70cAD28dd621b0072B5A8a8c392970E87C3dD";
4
+ export declare class SupraPullProvider implements PriceProvider {
5
+ readonly kind: "supra-pull";
6
+ readonly label = "Supra DORA pull oracle on Pharos (not yet enabled)";
7
+ fetchQuote(_feed: PriceFeedConfig): Promise<ProviderQuote>;
8
+ }
9
+ //# sourceMappingURL=supraProvider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"supraProvider.d.ts","sourceRoot":"","sources":["../../../src/lib/price/supraProvider.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,eAAe,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAGhF,eAAO,MAAM,0BAA0B,EAAG,4CAAqD,CAAC;AAChG,eAAO,MAAM,uBAAuB,EAAG,4CAAqD,CAAC;AAE7F,qBAAa,iBAAkB,YAAW,aAAa;IACrD,QAAQ,CAAC,IAAI,EAAG,YAAY,CAAU;IACtC,QAAQ,CAAC,KAAK,wDAAwD;IAEhE,UAAU,CAAC,KAAK,EAAE,eAAe,GAAG,OAAO,CAAC,aAAa,CAAC;CAKjE"}
@@ -0,0 +1,17 @@
1
+ // ─── Supra DORA Provider (placeholder) ─────────────────────────────────
2
+ // Supra DORA Pull Oracle is deployed on Pharos, but exact feed IDs / pull
3
+ // payload schema / timestamp semantics are not yet confirmed, so this provider
4
+ // is intentionally a stub. The PriceResolver treats it as an unavailable
5
+ // source; no price is ever fabricated.
6
+ // ────────────────────────────────────────────────────────────────────────
7
+ // Pacific Mainnet deployment (recorded for future Phase 2 wiring).
8
+ export const SUPRA_DORA_STORAGE_ADDRESS = "0x58e158c74DF7Ad6396C0dcbadc4878faC9e93d57";
9
+ export const SUPRA_DORA_PULL_ADDRESS = "0x16f70cAD28dd621b0072B5A8a8c392970E87C3dD";
10
+ export class SupraPullProvider {
11
+ kind = "supra-pull";
12
+ label = "Supra DORA pull oracle on Pharos (not yet enabled)";
13
+ async fetchQuote(_feed) {
14
+ throw new Error("SUPRA_PROVIDER_NOT_IMPLEMENTED: Supra DORA pull provider is a stub until feed IDs and payload schema are confirmed.");
15
+ }
16
+ }
17
+ //# sourceMappingURL=supraProvider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"supraProvider.js","sourceRoot":"","sources":["../../../src/lib/price/supraProvider.ts"],"names":[],"mappings":"AAAA,0EAA0E;AAC1E,0EAA0E;AAC1E,+EAA+E;AAC/E,yEAAyE;AACzE,uCAAuC;AACvC,2EAA2E;AAI3E,mEAAmE;AACnE,MAAM,CAAC,MAAM,0BAA0B,GAAG,4CAAqD,CAAC;AAChG,MAAM,CAAC,MAAM,uBAAuB,GAAG,4CAAqD,CAAC;AAE7F,MAAM,OAAO,iBAAiB;IACnB,IAAI,GAAG,YAAqB,CAAC;IAC7B,KAAK,GAAG,oDAAoD,CAAC;IAEtE,KAAK,CAAC,UAAU,CAAC,KAAsB;QACrC,MAAM,IAAI,KAAK,CACb,qHAAqH,CACtH,CAAC;IACJ,CAAC;CACF"}