safehands-pharos 1.5.0 → 2.8.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 (566) hide show
  1. package/.agents/policies/default.json +15 -0
  2. package/.env.example +81 -64
  3. package/README.md +301 -444
  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 +1 -1
  105. package/dist/cli.d.ts.map +1 -1
  106. package/dist/cli.js +29 -1
  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 +0 -0
  113. package/dist/demo.d.ts.map +1 -1
  114. package/dist/demo.js +43 -8
  115. package/dist/demo.js.map +1 -1
  116. package/dist/handsafe.zip +0 -0
  117. package/dist/index.d.ts +0 -0
  118. package/dist/index.d.ts.map +0 -0
  119. package/dist/index.js +212 -135
  120. package/dist/index.js.map +1 -1
  121. package/dist/init.d.ts +0 -0
  122. package/dist/init.d.ts.map +1 -1
  123. package/dist/init.js +72 -10
  124. package/dist/init.js.map +1 -1
  125. package/dist/lib/analysis/abiWords.d.ts +17 -0
  126. package/dist/lib/analysis/abiWords.d.ts.map +1 -0
  127. package/dist/lib/analysis/abiWords.js +48 -0
  128. package/dist/lib/analysis/abiWords.js.map +1 -0
  129. package/dist/lib/analysis/approval.d.ts +29 -0
  130. package/dist/lib/analysis/approval.d.ts.map +1 -0
  131. package/dist/lib/analysis/approval.js +189 -0
  132. package/dist/lib/analysis/approval.js.map +1 -0
  133. package/dist/lib/analysis/calldata.d.ts +60 -0
  134. package/dist/lib/analysis/calldata.d.ts.map +1 -0
  135. package/dist/lib/analysis/calldata.js +464 -0
  136. package/dist/lib/analysis/calldata.js.map +1 -0
  137. package/dist/lib/analysis/contractIntel.d.ts +65 -0
  138. package/dist/lib/analysis/contractIntel.d.ts.map +1 -0
  139. package/dist/lib/analysis/contractIntel.js +320 -0
  140. package/dist/lib/analysis/contractIntel.js.map +1 -0
  141. package/dist/lib/analysis/evm.d.ts +42 -0
  142. package/dist/lib/analysis/evm.d.ts.map +1 -0
  143. package/dist/lib/analysis/evm.js +185 -0
  144. package/dist/lib/analysis/evm.js.map +1 -0
  145. package/dist/lib/analysis/gas.d.ts +4 -0
  146. package/dist/lib/analysis/gas.d.ts.map +1 -0
  147. package/dist/lib/analysis/gas.js +13 -0
  148. package/dist/lib/analysis/gas.js.map +1 -0
  149. package/dist/lib/analysis/index.d.ts +11 -0
  150. package/dist/lib/analysis/index.d.ts.map +1 -0
  151. package/dist/lib/analysis/index.js +16 -0
  152. package/dist/lib/analysis/index.js.map +1 -0
  153. package/dist/lib/analysis/pharosTokens.d.ts +31 -0
  154. package/dist/lib/analysis/pharosTokens.d.ts.map +1 -0
  155. package/dist/lib/analysis/pharosTokens.js +78 -0
  156. package/dist/lib/analysis/pharosTokens.js.map +1 -0
  157. package/dist/lib/analysis/safeTx.d.ts +27 -0
  158. package/dist/lib/analysis/safeTx.d.ts.map +1 -0
  159. package/dist/lib/analysis/safeTx.js +118 -0
  160. package/dist/lib/analysis/safeTx.js.map +1 -0
  161. package/dist/lib/analysis/token.d.ts +21 -0
  162. package/dist/lib/analysis/token.d.ts.map +1 -0
  163. package/dist/lib/analysis/token.js +151 -0
  164. package/dist/lib/analysis/token.js.map +1 -0
  165. package/dist/lib/analysis/types.d.ts +49 -0
  166. package/dist/lib/analysis/types.d.ts.map +1 -0
  167. package/dist/lib/analysis/types.js +10 -0
  168. package/dist/lib/analysis/types.js.map +1 -0
  169. package/dist/lib/analysis/x402.d.ts +24 -0
  170. package/dist/lib/analysis/x402.d.ts.map +1 -0
  171. package/dist/lib/analysis/x402.js +60 -0
  172. package/dist/lib/analysis/x402.js.map +1 -0
  173. package/dist/lib/auditLog.d.ts +1 -0
  174. package/dist/lib/auditLog.d.ts.map +1 -1
  175. package/dist/lib/auditLog.js +0 -0
  176. package/dist/lib/auditLog.js.map +1 -1
  177. package/dist/lib/config.d.ts +77 -0
  178. package/dist/lib/config.d.ts.map +1 -0
  179. package/dist/lib/config.js +120 -0
  180. package/dist/lib/config.js.map +1 -0
  181. package/dist/lib/constants.d.ts +246 -97
  182. package/dist/lib/constants.d.ts.map +1 -1
  183. package/dist/lib/constants.js +334 -127
  184. package/dist/lib/constants.js.map +1 -1
  185. package/dist/lib/dodoApi.d.ts +26 -3
  186. package/dist/lib/dodoApi.d.ts.map +1 -1
  187. package/dist/lib/dodoApi.js +80 -17
  188. package/dist/lib/dodoApi.js.map +1 -1
  189. package/dist/lib/ecosystemRegistry.d.ts +126 -0
  190. package/dist/lib/ecosystemRegistry.d.ts.map +1 -0
  191. package/dist/lib/ecosystemRegistry.js +178 -0
  192. package/dist/lib/ecosystemRegistry.js.map +1 -0
  193. package/dist/lib/envLoader.d.ts +0 -0
  194. package/dist/lib/envLoader.d.ts.map +0 -0
  195. package/dist/lib/envLoader.js +39 -18
  196. package/dist/lib/envLoader.js.map +1 -1
  197. package/dist/lib/goldsky.d.ts +58 -0
  198. package/dist/lib/goldsky.d.ts.map +1 -0
  199. package/dist/lib/goldsky.js +275 -0
  200. package/dist/lib/goldsky.js.map +1 -0
  201. package/dist/lib/guardian/decision.d.ts +23 -0
  202. package/dist/lib/guardian/decision.d.ts.map +1 -0
  203. package/dist/lib/guardian/decision.js +40 -0
  204. package/dist/lib/guardian/decision.js.map +1 -0
  205. package/dist/lib/http.d.ts +0 -1
  206. package/dist/lib/http.d.ts.map +1 -1
  207. package/dist/lib/http.js +297 -32
  208. package/dist/lib/http.js.map +1 -1
  209. package/dist/lib/managedExecution.d.ts +19 -0
  210. package/dist/lib/managedExecution.d.ts.map +1 -0
  211. package/dist/lib/managedExecution.js +64 -0
  212. package/dist/lib/managedExecution.js.map +1 -0
  213. package/dist/lib/merkleBatcher.d.ts +23 -0
  214. package/dist/lib/merkleBatcher.d.ts.map +1 -0
  215. package/dist/lib/merkleBatcher.js +62 -0
  216. package/dist/lib/merkleBatcher.js.map +1 -0
  217. package/dist/lib/networks.d.ts +48 -0
  218. package/dist/lib/networks.d.ts.map +1 -0
  219. package/dist/lib/networks.js +103 -0
  220. package/dist/lib/networks.js.map +1 -0
  221. package/dist/lib/observability/accessContext.d.ts +29 -0
  222. package/dist/lib/observability/accessContext.d.ts.map +1 -0
  223. package/dist/lib/observability/accessContext.js +50 -0
  224. package/dist/lib/observability/accessContext.js.map +1 -0
  225. package/dist/lib/observability/activityStore.d.ts +70 -0
  226. package/dist/lib/observability/activityStore.d.ts.map +1 -0
  227. package/dist/lib/observability/activityStore.js +149 -0
  228. package/dist/lib/observability/activityStore.js.map +1 -0
  229. package/dist/lib/observability/apiKey.d.ts +55 -0
  230. package/dist/lib/observability/apiKey.d.ts.map +1 -0
  231. package/dist/lib/observability/apiKey.js +141 -0
  232. package/dist/lib/observability/apiKey.js.map +1 -0
  233. package/dist/lib/observability/logger.d.ts +30 -0
  234. package/dist/lib/observability/logger.d.ts.map +1 -0
  235. package/dist/lib/observability/logger.js +30 -0
  236. package/dist/lib/observability/logger.js.map +1 -0
  237. package/dist/lib/observability/quota.d.ts +33 -0
  238. package/dist/lib/observability/quota.d.ts.map +1 -0
  239. package/dist/lib/observability/quota.js +49 -0
  240. package/dist/lib/observability/quota.js.map +1 -0
  241. package/dist/lib/observability/requestId.d.ts +8 -0
  242. package/dist/lib/observability/requestId.d.ts.map +1 -0
  243. package/dist/lib/observability/requestId.js +24 -0
  244. package/dist/lib/observability/requestId.js.map +1 -0
  245. package/dist/lib/observability/sanitize.d.ts +77 -0
  246. package/dist/lib/observability/sanitize.d.ts.map +1 -0
  247. package/dist/lib/observability/sanitize.js +228 -0
  248. package/dist/lib/observability/sanitize.js.map +1 -0
  249. package/dist/lib/observability/scopes.d.ts +20 -0
  250. package/dist/lib/observability/scopes.d.ts.map +1 -0
  251. package/dist/lib/observability/scopes.js +77 -0
  252. package/dist/lib/observability/scopes.js.map +1 -0
  253. package/dist/lib/okxDexApi.d.ts +106 -0
  254. package/dist/lib/okxDexApi.d.ts.map +1 -0
  255. package/dist/lib/okxDexApi.js +221 -0
  256. package/dist/lib/okxDexApi.js.map +1 -0
  257. package/dist/lib/persistentJsonStore.d.ts +5 -0
  258. package/dist/lib/persistentJsonStore.d.ts.map +1 -0
  259. package/dist/lib/persistentJsonStore.js +39 -0
  260. package/dist/lib/persistentJsonStore.js.map +1 -0
  261. package/dist/lib/pharos/attestationPublisher.d.ts +50 -0
  262. package/dist/lib/pharos/attestationPublisher.d.ts.map +1 -0
  263. package/dist/lib/pharos/attestationPublisher.js +262 -0
  264. package/dist/lib/pharos/attestationPublisher.js.map +1 -0
  265. package/dist/lib/pharos/ecosystem.d.ts +52 -0
  266. package/dist/lib/pharos/ecosystem.d.ts.map +1 -0
  267. package/dist/lib/pharos/ecosystem.js +431 -0
  268. package/dist/lib/pharos/ecosystem.js.map +1 -0
  269. package/dist/lib/pharos/ecosystemEvidence.d.ts +53 -0
  270. package/dist/lib/pharos/ecosystemEvidence.d.ts.map +1 -0
  271. package/dist/lib/pharos/ecosystemEvidence.js +133 -0
  272. package/dist/lib/pharos/ecosystemEvidence.js.map +1 -0
  273. package/dist/lib/pharos/rpc.d.ts +44 -0
  274. package/dist/lib/pharos/rpc.d.ts.map +1 -0
  275. package/dist/lib/pharos/rpc.js +90 -0
  276. package/dist/lib/pharos/rpc.js.map +1 -0
  277. package/dist/lib/pharos/rpcEvidence.d.ts +49 -0
  278. package/dist/lib/pharos/rpcEvidence.d.ts.map +1 -0
  279. package/dist/lib/pharos/rpcEvidence.js +46 -0
  280. package/dist/lib/pharos/rpcEvidence.js.map +1 -0
  281. package/dist/lib/pharos/rpcMethods.d.ts +46 -0
  282. package/dist/lib/pharos/rpcMethods.d.ts.map +1 -0
  283. package/dist/lib/pharos/rpcMethods.js +176 -0
  284. package/dist/lib/pharos/rpcMethods.js.map +1 -0
  285. package/dist/lib/pharos/spvVerifier.d.ts +47 -0
  286. package/dist/lib/pharos/spvVerifier.d.ts.map +1 -0
  287. package/dist/lib/pharos/spvVerifier.js +105 -0
  288. package/dist/lib/pharos/spvVerifier.js.map +1 -0
  289. package/dist/lib/pharos/userSignedBroadcaster.d.ts +10 -0
  290. package/dist/lib/pharos/userSignedBroadcaster.d.ts.map +1 -0
  291. package/dist/lib/pharos/userSignedBroadcaster.js +50 -0
  292. package/dist/lib/pharos/userSignedBroadcaster.js.map +1 -0
  293. package/dist/lib/pharosClient.d.ts +5 -10
  294. package/dist/lib/pharosClient.d.ts.map +1 -1
  295. package/dist/lib/pharosClient.js +9 -16
  296. package/dist/lib/pharosClient.js.map +1 -1
  297. package/dist/lib/policy/actionPolicyEngine.d.ts +37 -1
  298. package/dist/lib/policy/actionPolicyEngine.d.ts.map +1 -1
  299. package/dist/lib/policy/actionPolicyEngine.js +213 -52
  300. package/dist/lib/policy/actionPolicyEngine.js.map +1 -1
  301. package/dist/lib/policy/agentPolicy.d.ts +29 -0
  302. package/dist/lib/policy/agentPolicy.d.ts.map +1 -0
  303. package/dist/lib/policy/agentPolicy.js +154 -0
  304. package/dist/lib/policy/agentPolicy.js.map +1 -0
  305. package/dist/lib/policy/policyPresets.d.ts +30 -0
  306. package/dist/lib/policy/policyPresets.d.ts.map +1 -0
  307. package/dist/lib/policy/policyPresets.js +124 -0
  308. package/dist/lib/policy/policyPresets.js.map +1 -0
  309. package/dist/lib/policy/writeExecutionGate.d.ts +23 -0
  310. package/dist/lib/policy/writeExecutionGate.d.ts.map +1 -0
  311. package/dist/lib/policy/writeExecutionGate.js +65 -0
  312. package/dist/lib/policy/writeExecutionGate.js.map +1 -0
  313. package/dist/lib/preparedTxStore.d.ts +21 -0
  314. package/dist/lib/preparedTxStore.d.ts.map +1 -0
  315. package/dist/lib/preparedTxStore.js +90 -0
  316. package/dist/lib/preparedTxStore.js.map +1 -0
  317. package/dist/lib/price/chainlinkPushProvider.d.ts +34 -0
  318. package/dist/lib/price/chainlinkPushProvider.d.ts.map +1 -0
  319. package/dist/lib/price/chainlinkPushProvider.js +36 -0
  320. package/dist/lib/price/chainlinkPushProvider.js.map +1 -0
  321. package/dist/lib/price/feedRegistry.d.ts +26 -0
  322. package/dist/lib/price/feedRegistry.d.ts.map +1 -0
  323. package/dist/lib/price/feedRegistry.js +67 -0
  324. package/dist/lib/price/feedRegistry.js.map +1 -0
  325. package/dist/lib/price/priceResolver.d.ts +35 -0
  326. package/dist/lib/price/priceResolver.d.ts.map +1 -0
  327. package/dist/lib/price/priceResolver.js +246 -0
  328. package/dist/lib/price/priceResolver.js.map +1 -0
  329. package/dist/lib/price/supraProvider.d.ts +9 -0
  330. package/dist/lib/price/supraProvider.d.ts.map +1 -0
  331. package/dist/lib/price/supraProvider.js +17 -0
  332. package/dist/lib/price/supraProvider.js.map +1 -0
  333. package/dist/lib/price/types.d.ts +67 -0
  334. package/dist/lib/price/types.d.ts.map +1 -0
  335. package/dist/lib/price/types.js +7 -0
  336. package/dist/lib/price/types.js.map +1 -0
  337. package/dist/lib/productionGuards.d.ts +16 -0
  338. package/dist/lib/productionGuards.d.ts.map +1 -0
  339. package/dist/lib/productionGuards.js +93 -0
  340. package/dist/lib/productionGuards.js.map +1 -0
  341. package/dist/lib/recipientSafety.d.ts +5 -0
  342. package/dist/lib/recipientSafety.d.ts.map +1 -0
  343. package/dist/lib/recipientSafety.js +28 -0
  344. package/dist/lib/recipientSafety.js.map +1 -0
  345. package/dist/lib/riskEngine.d.ts +19 -0
  346. package/dist/lib/riskEngine.d.ts.map +1 -1
  347. package/dist/lib/riskEngine.js +107 -38
  348. package/dist/lib/riskEngine.js.map +1 -1
  349. package/dist/lib/riskInclusion.d.ts +72 -0
  350. package/dist/lib/riskInclusion.d.ts.map +1 -0
  351. package/dist/lib/riskInclusion.js +252 -0
  352. package/dist/lib/riskInclusion.js.map +1 -0
  353. package/dist/lib/safeHandsRegistry.d.ts +32 -0
  354. package/dist/lib/safeHandsRegistry.d.ts.map +1 -0
  355. package/dist/lib/safeHandsRegistry.js +151 -0
  356. package/dist/lib/safeHandsRegistry.js.map +1 -0
  357. package/dist/lib/signer/index.d.ts +3 -3
  358. package/dist/lib/signer/index.d.ts.map +1 -1
  359. package/dist/lib/signer/index.js +33 -11
  360. package/dist/lib/signer/index.js.map +1 -1
  361. package/dist/lib/spendAccumulator.d.ts +24 -1
  362. package/dist/lib/spendAccumulator.d.ts.map +1 -1
  363. package/dist/lib/spendAccumulator.js +76 -6
  364. package/dist/lib/spendAccumulator.js.map +1 -1
  365. package/dist/lib/toolResponse.d.ts +6 -1
  366. package/dist/lib/toolResponse.d.ts.map +1 -1
  367. package/dist/lib/toolResponse.js +13 -9
  368. package/dist/lib/toolResponse.js.map +1 -1
  369. package/dist/lib/validation.d.ts +7 -0
  370. package/dist/lib/validation.d.ts.map +1 -0
  371. package/dist/lib/validation.js +62 -0
  372. package/dist/lib/validation.js.map +1 -0
  373. package/dist/lib/wallet/index.d.ts +8 -12
  374. package/dist/lib/wallet/index.d.ts.map +1 -1
  375. package/dist/lib/wallet/index.js +48 -35
  376. package/dist/lib/wallet/index.js.map +1 -1
  377. package/dist/lib/x402ReplayStore.d.ts +6 -0
  378. package/dist/lib/x402ReplayStore.d.ts.map +1 -0
  379. package/dist/lib/x402ReplayStore.js +79 -0
  380. package/dist/lib/x402ReplayStore.js.map +1 -0
  381. package/dist/safehands.zip +0 -0
  382. package/dist/sdk.d.ts +14 -0
  383. package/dist/sdk.d.ts.map +1 -0
  384. package/dist/sdk.js +25 -0
  385. package/dist/sdk.js.map +1 -0
  386. package/dist/tools/approveToken.d.ts +31 -10
  387. package/dist/tools/approveToken.d.ts.map +1 -1
  388. package/dist/tools/approveToken.js +91 -24
  389. package/dist/tools/approveToken.js.map +1 -1
  390. package/dist/tools/assessRisk.d.ts +13 -26
  391. package/dist/tools/assessRisk.d.ts.map +1 -1
  392. package/dist/tools/assessRisk.js +34 -75
  393. package/dist/tools/assessRisk.js.map +1 -1
  394. package/dist/tools/checkAllowance.d.ts +9 -3
  395. package/dist/tools/checkAllowance.d.ts.map +1 -1
  396. package/dist/tools/checkAllowance.js +27 -5
  397. package/dist/tools/checkAllowance.js.map +1 -1
  398. package/dist/tools/checkTokenSecurity.d.ts +62 -5
  399. package/dist/tools/checkTokenSecurity.d.ts.map +1 -1
  400. package/dist/tools/checkTokenSecurity.js +166 -21
  401. package/dist/tools/checkTokenSecurity.js.map +1 -1
  402. package/dist/tools/createAgentWallet.d.ts +4 -2
  403. package/dist/tools/createAgentWallet.d.ts.map +1 -1
  404. package/dist/tools/createAgentWallet.js +36 -31
  405. package/dist/tools/createAgentWallet.js.map +1 -1
  406. package/dist/tools/estimateGas.d.ts +7 -2
  407. package/dist/tools/estimateGas.d.ts.map +1 -1
  408. package/dist/tools/estimateGas.js +16 -10
  409. package/dist/tools/estimateGas.js.map +1 -1
  410. package/dist/tools/executeSwap.d.ts +56 -8
  411. package/dist/tools/executeSwap.d.ts.map +1 -1
  412. package/dist/tools/executeSwap.js +194 -46
  413. package/dist/tools/executeSwap.js.map +1 -1
  414. package/dist/tools/explainRisk.d.ts +9 -9
  415. package/dist/tools/explainRisk.d.ts.map +1 -1
  416. package/dist/tools/explainRisk.js +5 -4
  417. package/dist/tools/explainRisk.js.map +1 -1
  418. package/dist/tools/getAgentPolicy.d.ts +15 -0
  419. package/dist/tools/getAgentPolicy.d.ts.map +1 -0
  420. package/dist/tools/getAgentPolicy.js +16 -0
  421. package/dist/tools/getAgentPolicy.js.map +1 -0
  422. package/dist/tools/getAgentReputation.d.ts +31 -0
  423. package/dist/tools/getAgentReputation.d.ts.map +1 -0
  424. package/dist/tools/getAgentReputation.js +44 -0
  425. package/dist/tools/getAgentReputation.js.map +1 -0
  426. package/dist/tools/getAgentWallet.d.ts +1 -1
  427. package/dist/tools/getAgentWallet.d.ts.map +1 -1
  428. package/dist/tools/getAgentWallet.js +11 -1
  429. package/dist/tools/getAgentWallet.js.map +1 -1
  430. package/dist/tools/getAgentWalletBalance.d.ts +1 -1
  431. package/dist/tools/getAgentWalletBalance.d.ts.map +1 -1
  432. package/dist/tools/getAgentWalletBalance.js +58 -26
  433. package/dist/tools/getAgentWalletBalance.js.map +1 -1
  434. package/dist/tools/getExecutionHistory.d.ts +1 -1
  435. package/dist/tools/getExecutionHistory.d.ts.map +1 -1
  436. package/dist/tools/getExecutionHistory.js +13 -19
  437. package/dist/tools/getExecutionHistory.js.map +1 -1
  438. package/dist/tools/getGasPrice.d.ts +3 -3
  439. package/dist/tools/getGasPrice.d.ts.map +0 -0
  440. package/dist/tools/getGasPrice.js +7 -7
  441. package/dist/tools/getGasPrice.js.map +1 -1
  442. package/dist/tools/getPoolInfo.d.ts +17 -17
  443. package/dist/tools/getPoolInfo.d.ts.map +1 -1
  444. package/dist/tools/getPoolInfo.js +14 -9
  445. package/dist/tools/getPoolInfo.js.map +1 -1
  446. package/dist/tools/getSpvProof.d.ts +24 -0
  447. package/dist/tools/getSpvProof.d.ts.map +1 -0
  448. package/dist/tools/getSpvProof.js +64 -0
  449. package/dist/tools/getSpvProof.js.map +1 -0
  450. package/dist/tools/getTokenPrice.d.ts +28 -85
  451. package/dist/tools/getTokenPrice.d.ts.map +1 -1
  452. package/dist/tools/getTokenPrice.js +87 -94
  453. package/dist/tools/getTokenPrice.js.map +1 -1
  454. package/dist/tools/getTransactionStatus.d.ts +2 -2
  455. package/dist/tools/getTransactionStatus.d.ts.map +0 -0
  456. package/dist/tools/getTransactionStatus.js +0 -0
  457. package/dist/tools/getTransactionStatus.js.map +0 -0
  458. package/dist/tools/getWalletBalance.d.ts +38 -3
  459. package/dist/tools/getWalletBalance.d.ts.map +1 -1
  460. package/dist/tools/getWalletBalance.js +92 -52
  461. package/dist/tools/getWalletBalance.js.map +1 -1
  462. package/dist/tools/publishRiskScore.d.ts +36 -14
  463. package/dist/tools/publishRiskScore.d.ts.map +1 -1
  464. package/dist/tools/publishRiskScore.js +80 -32
  465. package/dist/tools/publishRiskScore.js.map +1 -1
  466. package/dist/tools/queryGoldsky.d.ts +20 -0
  467. package/dist/tools/queryGoldsky.d.ts.map +1 -0
  468. package/dist/tools/queryGoldsky.js +29 -0
  469. package/dist/tools/queryGoldsky.js.map +1 -0
  470. package/dist/tools/queryRiskRegistry.d.ts +14 -14
  471. package/dist/tools/queryRiskRegistry.d.ts.map +1 -1
  472. package/dist/tools/queryRiskRegistry.js +34 -30
  473. package/dist/tools/queryRiskRegistry.js.map +1 -1
  474. package/dist/tools/safehandsPreflightCheck.d.ts +29 -14
  475. package/dist/tools/safehandsPreflightCheck.d.ts.map +1 -1
  476. package/dist/tools/safehandsPreflightCheck.js +133 -6
  477. package/dist/tools/safehandsPreflightCheck.js.map +1 -1
  478. package/dist/tools/safehandsRiskReport.d.ts +29 -14
  479. package/dist/tools/safehandsRiskReport.d.ts.map +1 -1
  480. package/dist/tools/safehandsRiskReport.js +23 -3
  481. package/dist/tools/safehandsRiskReport.js.map +1 -1
  482. package/dist/tools/safehandsSafeExecute.d.ts +1 -1
  483. package/dist/tools/safehandsSafeExecute.d.ts.map +1 -1
  484. package/dist/tools/safehandsSafeExecute.js +100 -17
  485. package/dist/tools/safehandsSafeExecute.js.map +1 -1
  486. package/dist/tools/safehandsWalletHealth.d.ts +15 -1
  487. package/dist/tools/safehandsWalletHealth.d.ts.map +1 -1
  488. package/dist/tools/safehandsWalletHealth.js +67 -25
  489. package/dist/tools/safehandsWalletHealth.js.map +1 -1
  490. package/dist/tools/safehandsX402Preflight.d.ts +3 -3
  491. package/dist/tools/safehandsX402Preflight.d.ts.map +1 -1
  492. package/dist/tools/safehandsX402Preflight.js +24 -3
  493. package/dist/tools/safehandsX402Preflight.js.map +1 -1
  494. package/dist/tools/sendPayment.d.ts +10 -4
  495. package/dist/tools/sendPayment.d.ts.map +1 -1
  496. package/dist/tools/sendPayment.js +63 -36
  497. package/dist/tools/sendPayment.js.map +1 -1
  498. package/dist/tools/setAgentPolicy.d.ts +75 -0
  499. package/dist/tools/setAgentPolicy.d.ts.map +1 -0
  500. package/dist/tools/setAgentPolicy.js +80 -0
  501. package/dist/tools/setAgentPolicy.js.map +1 -0
  502. package/dist/tools/simulateTransaction.d.ts +7 -3
  503. package/dist/tools/simulateTransaction.d.ts.map +1 -1
  504. package/dist/tools/simulateTransaction.js +42 -9
  505. package/dist/tools/simulateTransaction.js.map +1 -1
  506. package/dist/tools/tokenRegistryStatus.d.ts +25 -5
  507. package/dist/tools/tokenRegistryStatus.d.ts.map +1 -1
  508. package/dist/tools/tokenRegistryStatus.js +61 -31
  509. package/dist/tools/tokenRegistryStatus.js.map +1 -1
  510. package/dist/tools/verifyRiskInclusion.d.ts +59 -0
  511. package/dist/tools/verifyRiskInclusion.d.ts.map +1 -0
  512. package/dist/tools/verifyRiskInclusion.js +40 -0
  513. package/dist/tools/verifyRiskInclusion.js.map +1 -0
  514. package/dist/tools/x402PayAndFetch.d.ts +15 -9
  515. package/dist/tools/x402PayAndFetch.d.ts.map +1 -1
  516. package/dist/tools/x402PayAndFetch.js +163 -20
  517. package/dist/tools/x402PayAndFetch.js.map +1 -1
  518. package/dist/worker.d.ts +3 -0
  519. package/dist/worker.d.ts.map +1 -0
  520. package/dist/worker.js +39 -0
  521. package/dist/worker.js.map +1 -0
  522. package/dist/x402Server.d.ts +1 -1
  523. package/dist/x402Server.d.ts.map +1 -1
  524. package/dist/x402Server.js +144 -35
  525. package/dist/x402Server.js.map +1 -1
  526. package/docs/REVIEWER_QUICKSTART.md +113 -0
  527. package/docs/SAFEHANDS_REVIEWER_DEMO_SCRIPT.md +228 -0
  528. package/package.json +131 -73
  529. package/contracts/RiskRegistry.json +0 -223
  530. package/contracts/RiskRegistry.sol +0 -58
  531. package/dist/lib/testDodoLive.d.ts +0 -2
  532. package/dist/lib/testDodoLive.d.ts.map +0 -1
  533. package/dist/lib/testDodoLive.js +0 -105
  534. package/dist/lib/testDodoLive.js.map +0 -1
  535. package/dist/lib/testLiveSafehands.d.ts +0 -2
  536. package/dist/lib/testLiveSafehands.d.ts.map +0 -1
  537. package/dist/lib/testLiveSafehands.js +0 -93
  538. package/dist/lib/testLiveSafehands.js.map +0 -1
  539. package/dist/lib/testRpc.d.ts +0 -2
  540. package/dist/lib/testRpc.d.ts.map +0 -1
  541. package/dist/lib/testRpc.js +0 -30
  542. package/dist/lib/testRpc.js.map +0 -1
  543. package/dist/lib/testRpcLive.d.ts +0 -2
  544. package/dist/lib/testRpcLive.d.ts.map +0 -1
  545. package/dist/lib/testRpcLive.js +0 -89
  546. package/dist/lib/testRpcLive.js.map +0 -1
  547. package/dist/lib/testTools.d.ts +0 -2
  548. package/dist/lib/testTools.d.ts.map +0 -1
  549. package/dist/lib/testTools.js +0 -397
  550. package/dist/lib/testTools.js.map +0 -1
  551. package/dist/lib/testX402Live.d.ts +0 -2
  552. package/dist/lib/testX402Live.d.ts.map +0 -1
  553. package/dist/lib/testX402Live.js +0 -160
  554. package/dist/lib/testX402Live.js.map +0 -1
  555. package/dist/scripts/checkDeploy.d.ts +0 -2
  556. package/dist/scripts/checkDeploy.d.ts.map +0 -1
  557. package/dist/scripts/checkDeploy.js +0 -25
  558. package/dist/scripts/checkDeploy.js.map +0 -1
  559. package/dist/scripts/deployRegistry.d.ts +0 -2
  560. package/dist/scripts/deployRegistry.d.ts.map +0 -1
  561. package/dist/scripts/deployRegistry.js +0 -101
  562. package/dist/scripts/deployRegistry.js.map +0 -1
  563. package/dist/scripts/testRegistry.d.ts +0 -2
  564. package/dist/scripts/testRegistry.d.ts.map +0 -1
  565. package/dist/scripts/testRegistry.js +0 -44
  566. package/dist/scripts/testRegistry.js.map +0 -1
@@ -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":"AAAA,0EAA0E;AAC1E,2EAA2E;AAC3E,6EAA6E;AAC7E,iDAAiD;AACjD,EAAE;AACF,mBAAmB;AACnB,2EAA2E;AAC3E,6DAA6D;AAC7D,2EAA2E;AAC3E,6EAA6E;AAC7E,gEAAgE;AAChE,4EAA4E;AAC5E,oDAAoD;AACpD,gEAAgE;AAChE,2EAA2E;AAE3E,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,gBAAgB,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,MAAM,CAAC;AAC/F,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAC3C,OAAO,EAAE,iBAAiB,EAAE,6BAA6B,EAAmB,MAAM,mBAAmB,CAAC;AACtG,OAAO,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AASnE,MAAM,CAAC,MAAM,kBAAkB,GAAG,MAAM,CAAC,CAAC,uCAAuC;AACjF,MAAM,CAAC,MAAM,yBAAyB,GAAG,OAAO,CAAC,CAAC,2CAA2C;AAC7F,MAAM,uBAAuB,GAAG,GAAG,CAAC;AAmBpC,SAAS,wBAAwB,CAAC,GAAY;IAC5C,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IACjE,MAAM,KAAK,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IAEpC,+EAA+E;IAC/E,8EAA8E;IAC9E,8EAA8E;IAC9E,MAAM,MAAM,GACV,GAAG,YAAY,SAAS;QACtB,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,YAAY,gBAAgB,IAAI,CAAC,YAAY,eAAe,IAAI,CAAC,YAAY,YAAY,CAAC;QAC7G,CAAC,CAAC,SAAS,CAAC;IAChB,MAAM,UAAU,GAAG,MAAM,YAAY,gBAAgB,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC;IAClF,MAAM,OAAO,GAAG,MAAM,YAAY,eAAe,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC;IAE5E,MAAM,WAAW,GACf,UAAU,KAAK,GAAG;QAClB,OAAO,KAAK,CAAC,KAAK,IAAI,uCAAuC;QAC7D,OAAO,KAAK,CAAC,KAAK,IAAI,kCAAkC;QACxD,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC;QACrB,KAAK,CAAC,QAAQ,CAAC,YAAY,CAAC;QAC5B,KAAK,CAAC,QAAQ,CAAC,YAAY,CAAC;QAC5B,KAAK,CAAC,QAAQ,CAAC,mBAAmB,CAAC;QACnC,KAAK,CAAC,QAAQ,CAAC,cAAc,CAAC;QAC9B,KAAK,CAAC,QAAQ,CAAC,UAAU,CAAC;QAC1B,KAAK,CAAC,QAAQ,CAAC,mBAAmB,CAAC;QACnC,KAAK,CAAC,QAAQ,CAAC,eAAe,CAAC;QAC/B,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;IAC1B,IAAI,WAAW,EAAE,CAAC;QAChB,OAAO,EAAE,IAAI,EAAE,2BAA2B,EAAE,SAAS,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;IACzE,CAAC;IAED,IAAI,KAAK,CAAC,QAAQ,CAAC,gCAAgC,CAAC,EAAE,CAAC;QACrD,OAAO,EAAE,IAAI,EAAE,0BAA0B,EAAE,SAAS,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC;IACzE,CAAC;IAED,0EAA0E;IAC1E,mDAAmD;IACnD,IAAI,KAAK,CAAC,QAAQ,CAAC,kBAAkB,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;QACpG,OAAO,EAAE,IAAI,EAAE,sBAAsB,EAAE,SAAS,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC;IACrE,CAAC;IAED,sEAAsE;IACtE,OAAO,EAAE,IAAI,EAAE,0BAA0B,EAAE,SAAS,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;AACxE,CAAC;AAED,MAAM,OAAO,aAAa;IAKL;IACA;IALF,KAAK,GAAG,IAAI,GAAG,EAAsB,CAAC;IACtC,QAAQ,GAAG,IAAI,GAAG,EAAwC,CAAC;IAE5E,YACmB,SAAgE,EAChE,MAAoB,IAAI,CAAC,GAAG;QAD5B,cAAS,GAAT,SAAS,CAAuD;QAChE,QAAG,GAAH,GAAG,CAAyB;IAC5C,CAAC;IAEJ,UAAU;QACR,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;IACrB,CAAC;IAED,KAAK,CAAC,eAAe,CAAC,MAAc,EAAE,IAA0B;QAC9D,MAAM,MAAM,GAAG,iBAAiB,CAAC,MAAM,CAAC,CAAC;QACzC,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,OAAO,GAAG,gBAAgB,EAAE,CAAC,IAAI,CAAC;YACxC,MAAM,UAAU,GAAG,6BAA6B,EAAE,CAAC;YACnD,OAAO;gBACL,EAAE,EAAE,KAAK;gBACT,KAAK,EAAE;oBACL,IAAI,EAAE,2BAA2B;oBACjC,OAAO,EAAE,GAAG,MAAM,qCAAqC,OAAO,KAAK,QAAQ,0BACzE,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,MAClD,qCAAqC;oBACrC,SAAS,EAAE,KAAK;oBAChB,QAAQ,EAAE,MAAM;iBACjB;aACF,CAAC;QACJ,CAAC;QAED,MAAM,GAAG,GAAG,GAAG,gBAAgB,EAAE,CAAC,IAAI,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;QAC7D,MAAM,KAAK,GAAG,IAAI,EAAE,UAAU,IAAI,kBAAkB,CAAC;QAErD,MAAM,KAAK,GAAG,IAAI,CAAC,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC;QAC5D,IAAI,KAAK;YAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC;QAElD,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACxC,IAAI,QAAQ,EAAE,CAAC;YACb,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC;YAC9B,IAAI,MAAM,CAAC,EAAE,EAAE,CAAC;gBACd,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,EAAE,GAAG,MAAM,CAAC,UAAU,EAAE,KAAK,EAAE,MAAM,CAAC,SAAS,EAAE,EAAE,CAAC;YACrF,CAAC;YACD,OAAO,MAAM,CAAC;QAChB,CAAC;QAED,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE;YAC7D,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAC5B,CAAC,CAAC,CAAC;QACH,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;QAChC,OAAO,OAAO,CAAC;IACjB,CAAC;IAED;;;OAGG;IACK,cAAc,CACpB,GAAW,EACX,MAAkB,EAClB,QAAgB,EAChB,IAAiC;QAEjC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAClC,IAAI,CAAC,KAAK;YAAE,OAAO,IAAI,CAAC;QACxB,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACzB,MAAM,UAAU,GAAG,KAAK,GAAG,KAAK,CAAC,WAAW,CAAC;QAC7C,IAAI,UAAU,GAAG,CAAC,IAAI,UAAU,GAAG,QAAQ;YAAE,OAAO,IAAI,CAAC;QACzD,MAAM,cAAc,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC,GAAG,KAAK,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC;QAC9F,IAAI,cAAc,GAAG,MAAM,CAAC,IAAI,CAAC,gBAAgB;YAAE,OAAO,IAAI,CAAC;QAC/D,OAAO;YACL,GAAG,KAAK,CAAC,UAAU;YACnB,KAAK,EAAE,MAAM,CAAC,SAAS;YACvB,MAAM,EAAE,IAAI;YACZ,eAAe,EAAE,IAAI,CAAC,KAAK,CAAC,UAAU,GAAG,IAAI,CAAC;YAC9C,cAAc;YACd,YAAY,EAAE,IAAI;YAClB,UAAU,EAAE,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,UAAU;SAChD,CAAC;IACJ,CAAC;IAEO,KAAK,CAAC,SAAS,CACrB,GAAW,EACX,MAAkB,EAClB,IAA0B;QAE1B,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC;QACzB,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC/C,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,OAAO;gBACL,EAAE,EAAE,KAAK;gBACT,KAAK,EAAE;oBACL,IAAI,EAAE,0BAA0B;oBAChC,OAAO,EAAE,MAAM,IAAI,CAAC,QAAQ,+BAA+B,IAAI,CAAC,IAAI,GAAG;oBACvE,SAAS,EAAE,KAAK;oBAChB,QAAQ,EAAE,IAAI,CAAC,QAAQ;oBACvB,IAAI,EAAE,IAAI,CAAC,IAAI;iBAChB;aACF,CAAC;QACJ,CAAC;QAED,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,MAAM,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;YAC9C,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC;YAE7C,IAAI,KAAK,CAAC,MAAM,IAAI,EAAE,EAAE,CAAC;gBACvB,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,gBAAgB,KAAK,CAAC,MAAM,0BAA0B,CAAC,CAAC;YACpF,CAAC;YACD,IACE,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,aAAa,CAAC;gBACrC,KAAK,CAAC,aAAa,IAAI,CAAC;gBACxB,KAAK,CAAC,aAAa,GAAG,MAAM,GAAG,uBAAuB,EACtD,CAAC;gBACD,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,mBAAmB,KAAK,CAAC,aAAa,yBAAyB,CAAC,CAAC;YAC7F,CAAC;YAED,MAAM,cAAc,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,GAAG,KAAK,CAAC,aAAa,CAAC,CAAC;YACjE,IAAI,cAAc,GAAG,IAAI,CAAC,gBAAgB,EAAE,CAAC;gBAC3C,OAAO;oBACL,EAAE,EAAE,KAAK;oBACT,KAAK,EAAE;wBACL,IAAI,EAAE,oBAAoB;wBAC1B,OAAO,EAAE,GAAG,IAAI,CAAC,IAAI,4BAA4B,cAAc,uBAAuB,IAAI,CAAC,gBAAgB,WAAW,IAAI,CAAC,WAAW,IAAI;wBAC1I,SAAS,EAAE,IAAI;wBACf,QAAQ,EAAE,IAAI,CAAC,QAAQ;wBACvB,IAAI,EAAE,IAAI,CAAC,IAAI;qBAChB;iBACF,CAAC;YACJ,CAAC;YAED,MAAM,QAAQ,GAAG,WAAW,CAAC,KAAK,CAAC,MAAM,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;YAC1D,MAAM,cAAc,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC;YACxC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,cAAc,CAAC,IAAI,cAAc,IAAI,CAAC,EAAE,CAAC;gBAC5D,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,2DAA2D,QAAQ,GAAG,CAAC,CAAC;YACpG,CAAC;YAED,MAAM,UAAU,GAAoB;gBAClC,KAAK,EAAE,MAAM,CAAC,SAAS;gBACvB,eAAe,EAAE,MAAM,CAAC,SAAS;gBACjC,IAAI,EAAE,IAAI,CAAC,IAAI;gBACf,QAAQ;gBACR,cAAc;gBACd,QAAQ,EAAE,IAAI,CAAC,QAAQ;gBACvB,MAAM,EAAE,QAAQ,CAAC,KAAK;gBACtB,YAAY,EAAE,IAAI;gBAClB,UAAU,EAAE,MAAM;gBAClB,SAAS,EAAE,IAAI,IAAI,CAAC,KAAK,CAAC,aAAa,GAAG,IAAI,CAAC,CAAC,WAAW,EAAE;gBAC7D,aAAa,EAAE,KAAK,CAAC,aAAa;gBAClC,cAAc;gBACd,SAAS,EAAE,KAAK;gBAChB,MAAM,EAAE,KAAK;gBACb,eAAe,EAAE,IAAI;gBACrB,WAAW,EAAE,IAAI,CAAC,WAAW;gBAC7B,gBAAgB,EAAE,IAAI,CAAC,gBAAgB;gBACvC,OAAO,EAAE,gBAAgB,EAAE,CAAC,IAAI;gBAChC,OAAO,EAAE,QAAQ;aAClB,CAAC;YACF,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,UAAU,EAAE,WAAW,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;YAC7D,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC;QAClC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,UAAU,GAAG,wBAAwB,CAAC,GAAG,CAAC,CAAC;YACjD,IAAI,UAAU,CAAC,SAAS,IAAI,IAAI,EAAE,kBAAkB,KAAK,KAAK,EAAE,CAAC;gBAC/D,MAAM,QAAQ,GAAG,IAAI,CAAC,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,yBAAyB,EAAE,oBAAoB,CAAC,CAAC;gBACnG,IAAI,QAAQ;oBAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,CAAC;YAC1D,CAAC;YACD,OAAO;gBACL,EAAE,EAAE,KAAK;gBACT,KAAK,EAAE;oBACL,IAAI,EAAE,UAAU,CAAC,IAAI;oBACrB,OAAO,EAAE,UAAU,CAAC,OAAO;oBAC3B,SAAS,EAAE,UAAU,CAAC,SAAS;oBAC/B,QAAQ,EAAE,IAAI,CAAC,QAAQ;oBACvB,IAAI,EAAE,IAAI,CAAC,IAAI;iBAChB;aACF,CAAC;QACJ,CAAC;IACH,CAAC;IAEO,OAAO,CAAC,IAAwB,EAAE,MAAc;QACtD,OAAO;YACL,EAAE,EAAE,KAAK;YACT,KAAK,EAAE;gBACL,IAAI,EAAE,sBAAsB;gBAC5B,OAAO,EAAE,GAAG,IAAI,CAAC,IAAI,gCAAgC,MAAM,UAAU,IAAI,CAAC,WAAW,IAAI;gBACzF,SAAS,EAAE,KAAK;gBAChB,QAAQ,EAAE,IAAI,CAAC,QAAQ;gBACvB,IAAI,EAAE,IAAI,CAAC,IAAI;aAChB;SACF,CAAC;IACJ,CAAC;CACF;AAED;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG,IAAI,aAAa,CAAC;IAC7C,gBAAgB,EAAE,IAAI,qBAAqB,EAAE;CAC9C,CAAC,CAAC;AAEH,MAAM,UAAU,eAAe,CAAC,MAAc,EAAE,IAA0B;IACxE,OAAO,aAAa,CAAC,eAAe,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;AACrD,CAAC"}
@@ -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"}
@@ -0,0 +1,67 @@
1
+ import type { Abi } from "viem";
2
+ export type PriceFeedProviderKind = "chainlink-push" | "supra-pull";
3
+ export type PriceErrorCode = "PRICE_SOURCE_UNAVAILABLE" | "PRICE_SOURCE_STALE" | "PRICE_SOURCE_INVALID" | "PRICE_SOURCE_RATE_LIMITED" | "PRICE_FEED_NOT_CONFIGURED";
4
+ export interface PriceFeedConfig {
5
+ pair: string;
6
+ base: string;
7
+ quote: "USD";
8
+ feedAddress: `0x${string}`;
9
+ decimals: number;
10
+ heartbeatSeconds: number;
11
+ provider: PriceFeedProviderKind;
12
+ docsSource: string;
13
+ }
14
+ export interface ProviderQuote {
15
+ answer: bigint;
16
+ updatedAtUnix: number;
17
+ }
18
+ /** Minimal read surface so providers are testable without the global viem client. */
19
+ export interface ContractReader {
20
+ readContract(args: {
21
+ address: `0x${string}`;
22
+ abi: Abi;
23
+ functionName: string;
24
+ }): Promise<unknown>;
25
+ }
26
+ export interface PriceProvider {
27
+ readonly kind: PriceFeedProviderKind;
28
+ readonly label: string;
29
+ /** Fetch one raw quote for one feed. May throw raw errors; the resolver classifies them. */
30
+ fetchQuote(feed: PriceFeedConfig): Promise<ProviderQuote>;
31
+ }
32
+ export interface PriceResolution {
33
+ token: string;
34
+ canonicalSymbol: string;
35
+ pair: string;
36
+ priceUsd: string;
37
+ priceUsdNumber: number;
38
+ provider: PriceFeedProviderKind;
39
+ source: string;
40
+ sourceStatus: "ok" | "rpc_degraded_cache";
41
+ confidence: "high" | "degraded";
42
+ timestamp: string;
43
+ updatedAtUnix: number;
44
+ feedAgeSeconds: number;
45
+ feedStale: boolean;
46
+ cached: boolean;
47
+ cacheAgeSeconds: number | null;
48
+ feedAddress: `0x${string}`;
49
+ heartbeatSeconds: number;
50
+ network: string;
51
+ chainId: number;
52
+ }
53
+ export interface PriceResolverFailure {
54
+ code: PriceErrorCode;
55
+ message: string;
56
+ retryable: boolean;
57
+ provider: PriceFeedProviderKind | "none";
58
+ pair?: string;
59
+ }
60
+ export type PriceResolverResult = {
61
+ ok: true;
62
+ resolution: PriceResolution;
63
+ } | {
64
+ ok: false;
65
+ error: PriceResolverFailure;
66
+ };
67
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/lib/price/types.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,MAAM,CAAC;AAEhC,MAAM,MAAM,qBAAqB,GAAG,gBAAgB,GAAG,YAAY,CAAC;AAEpE,MAAM,MAAM,cAAc,GACtB,0BAA0B,GAC1B,oBAAoB,GACpB,sBAAsB,GACtB,2BAA2B,GAC3B,2BAA2B,CAAC;AAEhC,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,KAAK,CAAC;IACb,WAAW,EAAE,KAAK,MAAM,EAAE,CAAC;IAC3B,QAAQ,EAAE,MAAM,CAAC;IACjB,gBAAgB,EAAE,MAAM,CAAC;IACzB,QAAQ,EAAE,qBAAqB,CAAC;IAChC,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,qFAAqF;AACrF,MAAM,WAAW,cAAc;IAC7B,YAAY,CAAC,IAAI,EAAE;QACjB,OAAO,EAAE,KAAK,MAAM,EAAE,CAAC;QACvB,GAAG,EAAE,GAAG,CAAC;QACT,YAAY,EAAE,MAAM,CAAC;KACtB,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CACtB;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,IAAI,EAAE,qBAAqB,CAAC;IACrC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,4FAA4F;IAC5F,UAAU,CAAC,IAAI,EAAE,eAAe,GAAG,OAAO,CAAC,aAAa,CAAC,CAAC;CAC3D;AAED,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,eAAe,EAAE,MAAM,CAAC;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,cAAc,EAAE,MAAM,CAAC;IACvB,QAAQ,EAAE,qBAAqB,CAAC;IAChC,MAAM,EAAE,MAAM,CAAC;IAGf,YAAY,EAAE,IAAI,GAAG,oBAAoB,CAAC;IAC1C,UAAU,EAAE,MAAM,GAAG,UAAU,CAAC;IAChC,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;IACtB,cAAc,EAAE,MAAM,CAAC;IAIvB,SAAS,EAAE,OAAO,CAAC;IACnB,MAAM,EAAE,OAAO,CAAC;IAChB,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,WAAW,EAAE,KAAK,MAAM,EAAE,CAAC;IAC3B,gBAAgB,EAAE,MAAM,CAAC;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,cAAc,CAAC;IACrB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,OAAO,CAAC;IACnB,QAAQ,EAAE,qBAAqB,GAAG,MAAM,CAAC;IACzC,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,MAAM,mBAAmB,GAC3B;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,UAAU,EAAE,eAAe,CAAA;CAAE,GACzC;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,oBAAoB,CAAA;CAAE,CAAC"}
@@ -0,0 +1,7 @@
1
+ // ─── Price Oracle Types ────────────────────────────────────────────────
2
+ // Contracts for the provider-based PriceResolver. Price oracle/valuation is
3
+ // separate from swap routing (DODO/FaroSwap stays route/execution-quote only).
4
+ // No I/O in this module.
5
+ // ────────────────────────────────────────────────────────────────────────
6
+ export {};
7
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/lib/price/types.ts"],"names":[],"mappings":"AAAA,0EAA0E;AAC1E,4EAA4E;AAC5E,+EAA+E;AAC/E,yBAAyB;AACzB,2EAA2E"}
@@ -0,0 +1,16 @@
1
+ export interface PostureIssue {
2
+ level: "warn" | "fatal";
3
+ code: string;
4
+ message: string;
5
+ }
6
+ /**
7
+ * Evaluate the production posture. Pure (reads env only, no side effects) so it is
8
+ * unit-testable. Returns [] outside production. The caller logs/throws.
9
+ */
10
+ export declare function evaluateProductionPosture(env?: NodeJS.ProcessEnv): PostureIssue[];
11
+ /**
12
+ * Apply the posture at server startup: log every issue, then throw if any are fatal.
13
+ * Warnings never block boot; fatals refuse to start (fail-fast).
14
+ */
15
+ export declare function assertProductionPosture(): void;
16
+ //# sourceMappingURL=productionGuards.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"productionGuards.d.ts","sourceRoot":"","sources":["../../src/lib/productionGuards.ts"],"names":[],"mappings":"AAYA,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;;GAGG;AACH,wBAAgB,yBAAyB,CAAC,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,YAAY,EAAE,CA4E9F;AAED;;;GAGG;AACH,wBAAgB,uBAAuB,IAAI,IAAI,CAY9C"}
@@ -0,0 +1,93 @@
1
+ // ─── Production posture guards ─────────────────────────────────────────────
2
+ // Lightweight startup checks that fail-fast (fatal) or warn on unsafe public-
3
+ // hosting configuration. Active only when NODE_ENV=production, evaluated once at
4
+ // server boot. These NEVER remove capability — they protect the Mainnet Production
5
+ // Profile's zero-custody posture and durable state. Every check has an explicit
6
+ // override so intentional self-hosted setups are never blocked silently.
7
+ // ───────────────────────────────────────────────────────────────────────────
8
+ import { safeHandsStateDir } from "./persistentJsonStore.js";
9
+ /**
10
+ * Evaluate the production posture. Pure (reads env only, no side effects) so it is
11
+ * unit-testable. Returns [] outside production. The caller logs/throws.
12
+ */
13
+ export function evaluateProductionPosture(env = process.env) {
14
+ const issues = [];
15
+ if (env.NODE_ENV !== "production")
16
+ return issues;
17
+ // 1) FATAL — custody landmine: managed execution enabled on a public host.
18
+ const managed = env.WALLET_MODE === "managed-mainnet";
19
+ const writeOn = env.WRITE_TOOLS_ENABLED === "true";
20
+ const allowManagedPublic = env.SAFEHANDS_ALLOW_MANAGED_ON_PUBLIC === "true";
21
+ if (managed && writeOn && !allowManagedPublic) {
22
+ issues.push({
23
+ level: "fatal",
24
+ code: "MANAGED_EXECUTION_ON_PUBLIC",
25
+ message: "Refusing to start: WALLET_MODE=managed-mainnet + WRITE_TOOLS_ENABLED=true in production puts a signing key on the host (custody). The public zero-custody profile requires WALLET_MODE=none + WRITE_TOOLS_ENABLED=false. For an intentional self-hosted single-tenant deployment, set SAFEHANDS_ALLOW_MANAGED_ON_PUBLIC=true.",
26
+ });
27
+ }
28
+ // 1b) FATAL — custody landmine: local x402 facilitator key in production.
29
+ // The standalone x402 server (`npm run start:x402`) signs settlements with
30
+ // X402_FACILITATOR_PRIVATE_KEY — a hot key on the host. The zero-custody
31
+ // production path is the Guardian API `/paid/*` gate with an EXTERNAL
32
+ // facilitator (X402_PAY_TO + X402_FACILITATOR_URL) and no local key.
33
+ const localFacilitatorKey = Boolean(env.X402_FACILITATOR_PRIVATE_KEY);
34
+ const allowLocalFacilitator = env.SAFEHANDS_ALLOW_LOCAL_FACILITATOR === "true";
35
+ if (localFacilitatorKey && !allowLocalFacilitator) {
36
+ issues.push({
37
+ level: "fatal",
38
+ code: "LOCAL_FACILITATOR_KEY_IN_PRODUCTION",
39
+ message: "Refusing to start: X402_FACILITATOR_PRIVATE_KEY is set in production: the local x402 facilitator signs settlements with a hot key on the host (custody). The zero-custody profile serves paid endpoints through the Guardian API /paid/* gate with an external facilitator (X402_PAY_TO + X402_FACILITATOR_URL) and no local key. For an intentional dev/self-hosted single-tenant deployment, set SAFEHANDS_ALLOW_LOCAL_FACILITATOR=true.",
40
+ });
41
+ }
42
+ // 2) WARN — ephemeral state dir → durability loss on restart.
43
+ const stateDirSet = Boolean(env.SAFEHANDS_STATE_DIR || env.STATE_DIR);
44
+ const dir = env.SAFEHANDS_STATE_DIR || env.STATE_DIR || safeHandsStateDir();
45
+ const looksEphemeral = !stateDirSet || dir === ".safehands" || dir === "." || dir.startsWith("./") || dir.startsWith(".safehands");
46
+ if (looksEphemeral) {
47
+ issues.push({
48
+ level: "warn",
49
+ code: "EPHEMERAL_STATE_DIR",
50
+ message: `SAFEHANDS_STATE_DIR resolves to "${dir}"; on an ephemeral host (e.g. Railway without a Volume) prepared transactions, the attestation queue, and the audit trail are LOST on restart. Mount a persistent Volume and set SAFEHANDS_STATE_DIR to its path (e.g. /data).`,
51
+ });
52
+ }
53
+ // 3) WARN — x402 enabled + replay required but Upstash Redis not configured.
54
+ // x402 counts as configured for EITHER profile: the zero-custody API gate
55
+ // (X402_FACILITATOR_URL) or the standalone local facilitator (private key).
56
+ const x402Configured = Boolean(env.X402_PAY_TO && (env.X402_FACILITATOR_URL || env.X402_FACILITATOR_PRIVATE_KEY));
57
+ const replayRequired = env.SAFEHANDS_X402_REPLAY_REDIS_REQUIRED === "true";
58
+ const upstash = Boolean((env.UPSTASH_REDIS_REST_URL || env.SAFEHANDS_REDIS_REST_URL) &&
59
+ (env.UPSTASH_REDIS_REST_TOKEN || env.SAFEHANDS_REDIS_REST_TOKEN));
60
+ if (x402Configured && replayRequired && !upstash) {
61
+ issues.push({
62
+ level: "warn",
63
+ code: "X402_REPLAY_REDIS_MISSING",
64
+ message: "x402 is configured and SAFEHANDS_X402_REPLAY_REDIS_REQUIRED=true, but Upstash Redis env (UPSTASH_REDIS_REST_URL/TOKEN) is missing. x402 replay protection will fail closed at runtime. Provision Upstash Redis or unset SAFEHANDS_X402_REPLAY_REDIS_REQUIRED.",
65
+ });
66
+ }
67
+ // 4) WARN — CORS wildcard in production (advisory; fine for the public read tier).
68
+ const cors = env.SAFEHANDS_CORS_ORIGIN || env.CORS_ORIGIN || env.SAFEHANDS_ALLOWED_ORIGINS;
69
+ if (!cors || cors === "*") {
70
+ issues.push({
71
+ level: "warn",
72
+ code: "CORS_WILDCARD",
73
+ message: "CORS is wildcard (*) in production. Acceptable for the public read tier, but tighten CORS_ORIGIN / SAFEHANDS_CORS_ORIGIN for guarded/paid surfaces.",
74
+ });
75
+ }
76
+ return issues;
77
+ }
78
+ /**
79
+ * Apply the posture at server startup: log every issue, then throw if any are fatal.
80
+ * Warnings never block boot; fatals refuse to start (fail-fast).
81
+ */
82
+ export function assertProductionPosture() {
83
+ const issues = evaluateProductionPosture();
84
+ for (const i of issues) {
85
+ const tag = i.level === "fatal" ? "❌ FATAL" : "⚠️ WARNING";
86
+ console.error(`${tag} [SafeHands posture · ${i.code}] ${i.message}`);
87
+ }
88
+ const fatal = issues.filter((i) => i.level === "fatal");
89
+ if (fatal.length > 0) {
90
+ throw new Error(`SafeHands refused to start: ${fatal.length} fatal production-posture issue(s); see logs above. This protects the zero-custody Mainnet Production Profile.`);
91
+ }
92
+ }
93
+ //# sourceMappingURL=productionGuards.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"productionGuards.js","sourceRoot":"","sources":["../../src/lib/productionGuards.ts"],"names":[],"mappings":"AAAA,8EAA8E;AAC9E,8EAA8E;AAC9E,iFAAiF;AACjF,mFAAmF;AACnF,gFAAgF;AAChF,yEAAyE;AACzE,8EAA8E;AAE9E,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAU7D;;;GAGG;AACH,MAAM,UAAU,yBAAyB,CAAC,MAAyB,OAAO,CAAC,GAAG;IAC5E,MAAM,MAAM,GAAmB,EAAE,CAAC;IAClC,IAAI,GAAG,CAAC,QAAQ,KAAK,YAAY;QAAE,OAAO,MAAM,CAAC;IAEjD,2EAA2E;IAC3E,MAAM,OAAO,GAAG,GAAG,CAAC,WAAW,KAAK,iBAAiB,CAAC;IACtD,MAAM,OAAO,GAAG,GAAG,CAAC,mBAAmB,KAAK,MAAM,CAAC;IACnD,MAAM,kBAAkB,GAAG,GAAG,CAAC,iCAAiC,KAAK,MAAM,CAAC;IAC5E,IAAI,OAAO,IAAI,OAAO,IAAI,CAAC,kBAAkB,EAAE,CAAC;QAC9C,MAAM,CAAC,IAAI,CAAC;YACV,KAAK,EAAE,OAAO;YACd,IAAI,EAAE,6BAA6B;YACnC,OAAO,EACL,+TAA+T;SAClU,CAAC,CAAC;IACL,CAAC;IAED,0EAA0E;IAC1E,2EAA2E;IAC3E,yEAAyE;IACzE,sEAAsE;IACtE,qEAAqE;IACrE,MAAM,mBAAmB,GAAG,OAAO,CAAC,GAAG,CAAC,4BAA4B,CAAC,CAAC;IACtE,MAAM,qBAAqB,GAAG,GAAG,CAAC,iCAAiC,KAAK,MAAM,CAAC;IAC/E,IAAI,mBAAmB,IAAI,CAAC,qBAAqB,EAAE,CAAC;QAClD,MAAM,CAAC,IAAI,CAAC;YACV,KAAK,EAAE,OAAO;YACd,IAAI,EAAE,qCAAqC;YAC3C,OAAO,EACL,4aAA4a;SAC/a,CAAC,CAAC;IACL,CAAC;IAED,8DAA8D;IAC9D,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,mBAAmB,IAAI,GAAG,CAAC,SAAS,CAAC,CAAC;IACtE,MAAM,GAAG,GAAG,GAAG,CAAC,mBAAmB,IAAI,GAAG,CAAC,SAAS,IAAI,iBAAiB,EAAE,CAAC;IAC5E,MAAM,cAAc,GAAG,CAAC,WAAW,IAAI,GAAG,KAAK,YAAY,IAAI,GAAG,KAAK,GAAG,IAAI,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC;IACnI,IAAI,cAAc,EAAE,CAAC;QACnB,MAAM,CAAC,IAAI,CAAC;YACV,KAAK,EAAE,MAAM;YACb,IAAI,EAAE,qBAAqB;YAC3B,OAAO,EACL,oCAAoC,GAAG,gOAAgO;SAC1Q,CAAC,CAAC;IACL,CAAC;IAED,6EAA6E;IAC7E,0EAA0E;IAC1E,4EAA4E;IAC5E,MAAM,cAAc,GAAG,OAAO,CAAC,GAAG,CAAC,WAAW,IAAI,CAAC,GAAG,CAAC,oBAAoB,IAAI,GAAG,CAAC,4BAA4B,CAAC,CAAC,CAAC;IAClH,MAAM,cAAc,GAAG,GAAG,CAAC,oCAAoC,KAAK,MAAM,CAAC;IAC3E,MAAM,OAAO,GAAG,OAAO,CACrB,CAAC,GAAG,CAAC,sBAAsB,IAAI,GAAG,CAAC,wBAAwB,CAAC;QAC1D,CAAC,GAAG,CAAC,wBAAwB,IAAI,GAAG,CAAC,0BAA0B,CAAC,CACnE,CAAC;IACF,IAAI,cAAc,IAAI,cAAc,IAAI,CAAC,OAAO,EAAE,CAAC;QACjD,MAAM,CAAC,IAAI,CAAC;YACV,KAAK,EAAE,MAAM;YACb,IAAI,EAAE,2BAA2B;YACjC,OAAO,EACL,+PAA+P;SAClQ,CAAC,CAAC;IACL,CAAC;IAED,mFAAmF;IACnF,MAAM,IAAI,GAAG,GAAG,CAAC,qBAAqB,IAAI,GAAG,CAAC,WAAW,IAAI,GAAG,CAAC,yBAAyB,CAAC;IAC3F,IAAI,CAAC,IAAI,IAAI,IAAI,KAAK,GAAG,EAAE,CAAC;QAC1B,MAAM,CAAC,IAAI,CAAC;YACV,KAAK,EAAE,MAAM;YACb,IAAI,EAAE,eAAe;YACrB,OAAO,EACL,qJAAqJ;SACxJ,CAAC,CAAC;IACL,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,uBAAuB;IACrC,MAAM,MAAM,GAAG,yBAAyB,EAAE,CAAC;IAC3C,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;QACvB,MAAM,GAAG,GAAG,CAAC,CAAC,KAAK,KAAK,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,aAAa,CAAC;QAC5D,OAAO,CAAC,KAAK,CAAC,GAAG,GAAG,yBAAyB,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;IACvE,CAAC;IACD,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,OAAO,CAAC,CAAC;IACxD,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACrB,MAAM,IAAI,KAAK,CACb,+BAA+B,KAAK,CAAC,MAAM,gHAAgH,CAC5J,CAAC;IACJ,CAAC;AACH,CAAC"}
@@ -0,0 +1,5 @@
1
+ /** Parse the operator-supplied denylist from env (comma-separated). Empty by default. */
2
+ export declare function recipientDenylist(): Set<string>;
3
+ /** True when the address is a valid EVM address present on the operator denylist. */
4
+ export declare function isDenylistedRecipient(address?: string | null): boolean;
5
+ //# sourceMappingURL=recipientSafety.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"recipientSafety.d.ts","sourceRoot":"","sources":["../../src/lib/recipientSafety.ts"],"names":[],"mappings":"AAeA,yFAAyF;AACzF,wBAAgB,iBAAiB,IAAI,GAAG,CAAC,MAAM,CAAC,CAQ/C;AAED,qFAAqF;AACrF,wBAAgB,qBAAqB,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,OAAO,CAGtE"}
@@ -0,0 +1,28 @@
1
+ // ─── Recipient safety — operator-configurable denylist ─────────────────────
2
+ // A sync, keyless, honest guard for the RECIPIENT of a value transfer/approval.
3
+ // The denylist is entirely operator-supplied via env (empty by default) — SafeHands
4
+ // ships NO fabricated scam list, so there is never false "scam protection" confidence.
5
+ // Operators point it at their own known-bad set (drainers, scam addresses, mistyped
6
+ // treasury addresses to hard-block, etc.).
7
+ //
8
+ // NOTE (honest scope): deeper recipient intelligence — address-poisoning detection
9
+ // and first-time-recipient warnings — requires the sender's transfer history, which
10
+ // is too RPC-heavy for the hot path without the Goldsky indexer. That is deferred to
11
+ // the indexer-backed path rather than added as a laggy hot-path scan.
12
+ // ───────────────────────────────────────────────────────────────────────────
13
+ import { isAddress } from "viem";
14
+ /** Parse the operator-supplied denylist from env (comma-separated). Empty by default. */
15
+ export function recipientDenylist() {
16
+ const raw = process.env.SAFEHANDS_RECIPIENT_DENYLIST || "";
17
+ return new Set(raw
18
+ .split(",")
19
+ .map((s) => s.trim().toLowerCase())
20
+ .filter((s) => isAddress(s)));
21
+ }
22
+ /** True when the address is a valid EVM address present on the operator denylist. */
23
+ export function isDenylistedRecipient(address) {
24
+ if (!address || !isAddress(address))
25
+ return false;
26
+ return recipientDenylist().has(address.toLowerCase());
27
+ }
28
+ //# sourceMappingURL=recipientSafety.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"recipientSafety.js","sourceRoot":"","sources":["../../src/lib/recipientSafety.ts"],"names":[],"mappings":"AAAA,8EAA8E;AAC9E,gFAAgF;AAChF,oFAAoF;AACpF,uFAAuF;AACvF,oFAAoF;AACpF,2CAA2C;AAC3C,EAAE;AACF,mFAAmF;AACnF,oFAAoF;AACpF,qFAAqF;AACrF,sEAAsE;AACtE,8EAA8E;AAE9E,OAAO,EAAE,SAAS,EAAE,MAAM,MAAM,CAAC;AAEjC,yFAAyF;AACzF,MAAM,UAAU,iBAAiB;IAC/B,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,4BAA4B,IAAI,EAAE,CAAC;IAC3D,OAAO,IAAI,GAAG,CACZ,GAAG;SACA,KAAK,CAAC,GAAG,CAAC;SACV,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;SAClC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAC/B,CAAC;AACJ,CAAC;AAED,qFAAqF;AACrF,MAAM,UAAU,qBAAqB,CAAC,OAAuB;IAC3D,IAAI,CAAC,OAAO,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC;QAAE,OAAO,KAAK,CAAC;IAClD,OAAO,iBAAiB,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC;AACxD,CAAC"}
@@ -10,10 +10,29 @@ export type RiskRecommendation = "proceed" | "caution" | "block";
10
10
  export interface RiskAssessment {
11
11
  riskScore: number;
12
12
  riskLevel: RiskLevel;
13
+ /**
14
+ * ADVISORY only — never gates execution. The actionPolicyEngine is the sole
15
+ * ALLOW/BLOCK decider on write paths (docs/DECISION_CONTRACT.md); this field
16
+ * exists for reports and the on-chain assessment record.
17
+ */
13
18
  recommendation: RiskRecommendation;
14
19
  breakdown: RiskBreakdown;
15
20
  reasons: string[];
16
21
  suggestion: string;
22
+ /**
23
+ * True when a CRITICAL risk signal could not be evaluated (route/liquidity or
24
+ * balance fetch failed). Callers must fail-closed on this — never silently
25
+ * proceed on degraded data. Market-condition gaps are non-critical and do
26
+ * NOT set this.
27
+ */
28
+ degraded: boolean;
29
+ degradedReasons: string[];
30
+ /**
31
+ * Structural (not transient): the swap liquidity provider is not configured/
32
+ * verified for the active chain (SWAP_LIQUIDITY_NOT_CONFIGURED). Liquidity and
33
+ * slippage dimensions were scored fail-closed without live route data.
34
+ */
35
+ swapProviderNotConfigured?: boolean;
17
36
  }
18
37
  export interface RiskInput {
19
38
  action: "swap" | "transfer";
@@ -1 +1 @@
1
- {"version":3,"file":"riskEngine.d.ts","sourceRoot":"","sources":["../../src/lib/riskEngine.ts"],"names":[],"mappings":"AA4BA,MAAM,WAAW,aAAa;IAC5B,aAAa,EAAE,MAAM,CAAC;IACtB,YAAY,EAAE,MAAM,CAAC;IACrB,gBAAgB,EAAE,MAAM,CAAC;IACzB,WAAW,EAAE,MAAM,CAAC;IACpB,mBAAmB,EAAE,MAAM,CAAC;CAC7B;AAED,MAAM,MAAM,SAAS,GAAG,KAAK,GAAG,QAAQ,GAAG,MAAM,GAAG,UAAU,CAAC;AAC/D,MAAM,MAAM,kBAAkB,GAAG,SAAS,GAAG,SAAS,GAAG,OAAO,CAAC;AAEjE,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,SAAS,CAAC;IACrB,cAAc,EAAE,kBAAkB,CAAC;IACnC,SAAS,EAAE,aAAa,CAAC;IACzB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,SAAS;IACxB,MAAM,EAAE,MAAM,GAAG,UAAU,CAAC;IAC5B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;CACvB;AA+QD,wBAAsB,UAAU,CAAC,KAAK,EAAE,SAAS,GAAG,OAAO,CAAC,cAAc,CAAC,CAoD1E"}
1
+ {"version":3,"file":"riskEngine.d.ts","sourceRoot":"","sources":["../../src/lib/riskEngine.ts"],"names":[],"mappings":"AAoCA,MAAM,WAAW,aAAa;IAC5B,aAAa,EAAE,MAAM,CAAC;IACtB,YAAY,EAAE,MAAM,CAAC;IACrB,gBAAgB,EAAE,MAAM,CAAC;IACzB,WAAW,EAAE,MAAM,CAAC;IACpB,mBAAmB,EAAE,MAAM,CAAC;CAC7B;AAED,MAAM,MAAM,SAAS,GAAG,KAAK,GAAG,QAAQ,GAAG,MAAM,GAAG,UAAU,CAAC;AAC/D,MAAM,MAAM,kBAAkB,GAAG,SAAS,GAAG,SAAS,GAAG,OAAO,CAAC;AAEjE,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,SAAS,CAAC;IACrB;;;;OAIG;IACH,cAAc,EAAE,kBAAkB,CAAC;IACnC,SAAS,EAAE,aAAa,CAAC;IACzB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB;;;;;OAKG;IACH,QAAQ,EAAE,OAAO,CAAC;IAClB,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B;;;;OAIG;IACH,yBAAyB,CAAC,EAAE,OAAO,CAAC;CACrC;AAED,MAAM,WAAW,SAAS;IACxB,MAAM,EAAE,MAAM,GAAG,UAAU,CAAC;IAC5B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;CACvB;AAwTD,wBAAsB,UAAU,CAAC,KAAK,EAAE,SAAS,GAAG,OAAO,CAAC,cAAc,CAAC,CAuF1E"}