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,46 @@
1
+ export declare function handleGoldskyStatus(): {
2
+ readOnly: true;
3
+ executionAvailable: boolean;
4
+ service: string;
5
+ status: import("../lib/goldsky.js").GoldskyConfigStatus;
6
+ role: string;
7
+ recommendedEntities: {
8
+ attestations: string;
9
+ riskRoots: string;
10
+ };
11
+ network: import("../lib/networks.js").NetworkName;
12
+ };
13
+ /**
14
+ * Read-only, keyless, composable on-chain reputation for an address: the count of
15
+ * SafeHands-verified safe broadcasts attributed to it (+ recency), plus registry
16
+ * authorization/risk-record context. Any agent can query this as a trust signal.
17
+ * Zero count = NEUTRAL (no track record yet), never negative.
18
+ */
19
+ export declare function handleAgentReputation(address: string): Promise<{
20
+ readOnly: true;
21
+ executionAvailable: boolean;
22
+ address: `0x${string}`;
23
+ reputation: {
24
+ verifiedActionCount: number;
25
+ lastVerifiedActionAt: number;
26
+ configured: boolean;
27
+ source: "onchain" | "unconfigured";
28
+ };
29
+ registry: {
30
+ isAuthorizedAgent: boolean;
31
+ hasRiskRecord: boolean;
32
+ currentMerkleRoot: string | null;
33
+ };
34
+ interpretation: string;
35
+ network: import("../lib/networks.js").NetworkName;
36
+ }>;
37
+ export declare function handleLatestRiskRootIndex(): Promise<{
38
+ readOnly: true;
39
+ executionAvailable: boolean;
40
+ status: string;
41
+ goldsky: import("../lib/goldsky.js").GoldskyLookupResult<import("../lib/goldsky.js").IndexedRiskRootRecord>;
42
+ onchain: Record<string, unknown> | null;
43
+ note: string;
44
+ network: import("../lib/networks.js").NetworkName;
45
+ }>;
46
+ //# sourceMappingURL=indexerRoutes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"indexerRoutes.d.ts","sourceRoot":"","sources":["../../src/api/indexerRoutes.ts"],"names":[],"mappings":"AAOA,wBAAgB,mBAAmB;;;;;;;;;;;EAYlC;AAED;;;;;GAKG;AACH,wBAAsB,qBAAqB,CAAC,OAAO,EAAE,MAAM;;;;;;;;;;;;;;;;;GA4B1D;AAED,wBAAsB,yBAAyB;;;;;;;;GAsB9C"}
@@ -0,0 +1,75 @@
1
+ import { goldskyStatus, lookupLatestRiskRootInGoldsky } from "../lib/goldsky.js";
2
+ import { queryRegistryForTarget } from "../lib/safeHandsRegistry.js";
3
+ import { getAgentReputation } from "../lib/pharos/attestationPublisher.js";
4
+ import { getActiveNetworkName } from "../lib/networks.js";
5
+ import { readOnlyMeta } from "./response.js";
6
+ import { isAddress } from "viem";
7
+ export function handleGoldskyStatus() {
8
+ return {
9
+ service: "safehands-goldsky-indexer",
10
+ status: goldskyStatus(),
11
+ role: "Goldsky indexes SafeHands on-chain Registry and Attestation events for fast user/agent lookup. Contracts remain the source of truth.",
12
+ recommendedEntities: {
13
+ attestations: process.env.GOLDSKY_ATTESTATION_ENTITIES || "safeHandsAttesteds,attestations",
14
+ riskRoots: process.env.GOLDSKY_RISK_ROOT_ENTITIES || "riskRootCommitteds,safeHandsRiskRootCommitteds",
15
+ },
16
+ network: getActiveNetworkName(),
17
+ ...readOnlyMeta(),
18
+ };
19
+ }
20
+ /**
21
+ * Read-only, keyless, composable on-chain reputation for an address: the count of
22
+ * SafeHands-verified safe broadcasts attributed to it (+ recency), plus registry
23
+ * authorization/risk-record context. Any agent can query this as a trust signal.
24
+ * Zero count = NEUTRAL (no track record yet), never negative.
25
+ */
26
+ export async function handleAgentReputation(address) {
27
+ if (!address || !isAddress(address)) {
28
+ throw new Error("A valid 0x address is required (GET /reputation/:address).");
29
+ }
30
+ const [reputation, registry] = await Promise.all([
31
+ getAgentReputation(address),
32
+ queryRegistryForTarget(address),
33
+ ]);
34
+ return {
35
+ address,
36
+ reputation: {
37
+ verifiedActionCount: reputation.verifiedCount,
38
+ lastVerifiedActionAt: reputation.lastAttestationAt,
39
+ configured: reputation.configured,
40
+ source: reputation.source,
41
+ },
42
+ registry: {
43
+ isAuthorizedAgent: registry.authorized,
44
+ hasRiskRecord: registry.hasRiskRecord,
45
+ currentMerkleRoot: registry.currentMerkleRoot,
46
+ },
47
+ interpretation: reputation.verifiedCount > 0
48
+ ? `${reputation.verifiedCount} SafeHands-verified on-chain action(s); positive track record.`
49
+ : "No SafeHands-verified actions yet: NEUTRAL. Absence of record is not negative; this ledger only records verified-safe actions.",
50
+ network: getActiveNetworkName(),
51
+ ...readOnlyMeta(),
52
+ };
53
+ }
54
+ export async function handleLatestRiskRootIndex() {
55
+ const goldsky = await lookupLatestRiskRootInGoldsky();
56
+ // Optional on-chain registry read: queryRegistryForTarget also returns the current root.
57
+ // It needs a wallet address only to include authorization; use zero address-like fallback
58
+ // only when a valid operator address is supplied by env.
59
+ const referenceWallet = process.env.SAFEHANDS_REGISTRY_REFERENCE_WALLET;
60
+ let onchain = null;
61
+ if (referenceWallet && isAddress(referenceWallet)) {
62
+ onchain = { ...(await queryRegistryForTarget(referenceWallet)) };
63
+ }
64
+ return {
65
+ status: goldsky.indexed ? "indexed" : "not_indexed",
66
+ goldsky,
67
+ onchain,
68
+ note: onchain
69
+ ? "onchain.currentMerkleRoot is included from SafeHandsRegistry. Goldsky is the fast query layer."
70
+ : "Set SAFEHANDS_REGISTRY_REFERENCE_WALLET to include an on-chain registry read in this endpoint.",
71
+ network: getActiveNetworkName(),
72
+ ...readOnlyMeta(),
73
+ };
74
+ }
75
+ //# sourceMappingURL=indexerRoutes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"indexerRoutes.js","sourceRoot":"","sources":["../../src/api/indexerRoutes.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,6BAA6B,EAAE,MAAM,mBAAmB,CAAC;AACjF,OAAO,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAC;AACrE,OAAO,EAAE,kBAAkB,EAAE,MAAM,uCAAuC,CAAC;AAC3E,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAC1D,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,EAAE,SAAS,EAAE,MAAM,MAAM,CAAC;AAEjC,MAAM,UAAU,mBAAmB;IACjC,OAAO;QACL,OAAO,EAAE,2BAA2B;QACpC,MAAM,EAAE,aAAa,EAAE;QACvB,IAAI,EAAE,sIAAsI;QAC5I,mBAAmB,EAAE;YACnB,YAAY,EAAE,OAAO,CAAC,GAAG,CAAC,4BAA4B,IAAI,iCAAiC;YAC3F,SAAS,EAAE,OAAO,CAAC,GAAG,CAAC,0BAA0B,IAAI,gDAAgD;SACtG;QACD,OAAO,EAAE,oBAAoB,EAAE;QAC/B,GAAG,YAAY,EAAE;KAClB,CAAC;AACJ,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,qBAAqB,CAAC,OAAe;IACzD,IAAI,CAAC,OAAO,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,CAAC;QACpC,MAAM,IAAI,KAAK,CAAC,4DAA4D,CAAC,CAAC;IAChF,CAAC;IACD,MAAM,CAAC,UAAU,EAAE,QAAQ,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;QAC/C,kBAAkB,CAAC,OAAO,CAAC;QAC3B,sBAAsB,CAAC,OAAwB,CAAC;KACjD,CAAC,CAAC;IACH,OAAO;QACL,OAAO;QACP,UAAU,EAAE;YACV,mBAAmB,EAAE,UAAU,CAAC,aAAa;YAC7C,oBAAoB,EAAE,UAAU,CAAC,iBAAiB;YAClD,UAAU,EAAE,UAAU,CAAC,UAAU;YACjC,MAAM,EAAE,UAAU,CAAC,MAAM;SAC1B;QACD,QAAQ,EAAE;YACR,iBAAiB,EAAE,QAAQ,CAAC,UAAU;YACtC,aAAa,EAAE,QAAQ,CAAC,aAAa;YACrC,iBAAiB,EAAE,QAAQ,CAAC,iBAAiB;SAC9C;QACD,cAAc,EACZ,UAAU,CAAC,aAAa,GAAG,CAAC;YAC1B,CAAC,CAAC,GAAG,UAAU,CAAC,aAAa,gEAAgE;YAC7F,CAAC,CAAC,gIAAgI;QACtI,OAAO,EAAE,oBAAoB,EAAE;QAC/B,GAAG,YAAY,EAAE;KAClB,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,yBAAyB;IAC7C,MAAM,OAAO,GAAG,MAAM,6BAA6B,EAAE,CAAC;IAEtD,yFAAyF;IACzF,0FAA0F;IAC1F,yDAAyD;IACzD,MAAM,eAAe,GAAG,OAAO,CAAC,GAAG,CAAC,mCAAmC,CAAC;IACxE,IAAI,OAAO,GAAmC,IAAI,CAAC;IACnD,IAAI,eAAe,IAAI,SAAS,CAAC,eAAe,CAAC,EAAE,CAAC;QAClD,OAAO,GAAG,EAAE,GAAG,CAAC,MAAM,sBAAsB,CAAC,eAAgC,CAAC,CAAC,EAAE,CAAC;IACpF,CAAC;IAED,OAAO;QACL,MAAM,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,aAAa;QACnD,OAAO;QACP,OAAO;QACP,IAAI,EAAE,OAAO;YACX,CAAC,CAAC,gGAAgG;YAClG,CAAC,CAAC,gGAAgG;QACpG,OAAO,EAAE,oBAAoB,EAAE;QAC/B,GAAG,YAAY,EAAE;KAClB,CAAC;AACJ,CAAC"}
@@ -0,0 +1,8 @@
1
+ import type express from "express";
2
+ /**
3
+ * Register the x402 paid bundle entrypoints. MUST be called AFTER the x402 gate is
4
+ * installed on PAID_ROUTE_PATHS, so a verified (non-replayed) payment is guaranteed
5
+ * before any handler here executes.
6
+ */
7
+ export declare function registerPaidRoutes(app: express.Application): void;
8
+ //# sourceMappingURL=paidRoutes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"paidRoutes.d.ts","sourceRoot":"","sources":["../../src/api/paidRoutes.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,OAAO,MAAM,SAAS,CAAC;AAcnC;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,OAAO,CAAC,WAAW,GAAG,IAAI,CAuJjE"}
@@ -0,0 +1,175 @@
1
+ // ─── SafeHands API — x402 Paid Bundle Entrypoints ─────────────────
2
+ // The additive `/paid/*` routes gated by src/api/x402Gate.ts. Each is a BUNDLE
3
+ // entrypoint: gating/charging happens once at the HTTP boundary (the x402 gate is
4
+ // installed on these paths BEFORE these handlers run), then the handler may fan out
5
+ // to several internal analyzers/tools in-process. Internal helper tools are never
6
+ // individually charged.
7
+ //
8
+ // These are read-only value-added endpoints (risk assessment, token security,
9
+ // simulation, market data, full risk report). They wrap the SAME pure tool handlers
10
+ // used by MCP/Anvita and x402Server — no signer, no wallet, no write path. Registered
11
+ // only after the x402 gate, so by the time a handler executes the payment is verified
12
+ // and non-replayed. Handlers return the standard ToolResponse envelope.
13
+ // ────────────────────────────────────────────────────────────────────────────
14
+ import { handleAssessRisk } from "../tools/assessRisk.js";
15
+ import { handleCheckTokenSecurity } from "../tools/checkTokenSecurity.js";
16
+ import { handleSimulateTransaction } from "../tools/simulateTransaction.js";
17
+ import { handleGetTokenPrice } from "../tools/getTokenPrice.js";
18
+ import { handleGetPoolInfo } from "../tools/getPoolInfo.js";
19
+ import { handleSafeHandsRiskReport } from "../tools/safehandsRiskReport.js";
20
+ import { getDodoRoute } from "../lib/dodoApi.js";
21
+ import { CHAIN_ID, PHAROS_ENVIRONMENT, IS_MAINNET } from "../lib/constants.js";
22
+ import { fail, ok, productionSafeMessage } from "../lib/toolResponse.js";
23
+ const SOURCE = "guardian_api_x402";
24
+ /**
25
+ * Register the x402 paid bundle entrypoints. MUST be called AFTER the x402 gate is
26
+ * installed on PAID_ROUTE_PATHS, so a verified (non-replayed) payment is guaranteed
27
+ * before any handler here executes.
28
+ */
29
+ export function registerPaidRoutes(app) {
30
+ app.get("/paid/assess-risk", async (req, res) => {
31
+ try {
32
+ const { action, tokenIn, tokenOut, amount, toAddress, walletAddress } = req.query;
33
+ const result = await handleAssessRisk({
34
+ action: action,
35
+ tokenIn: tokenIn,
36
+ tokenOut: tokenOut,
37
+ amount: amount,
38
+ toAddress: toAddress,
39
+ walletAddress: walletAddress,
40
+ });
41
+ res.json(result);
42
+ }
43
+ catch (e) {
44
+ res.status(400).json(fail("BAD_REQUEST", productionSafeMessage(e instanceof Error ? e.message : String(e)), false, SOURCE));
45
+ }
46
+ });
47
+ app.get("/paid/check-token-security", async (req, res) => {
48
+ try {
49
+ const { tokenAddress, chainId } = req.query;
50
+ const cid = chainId ? parseInt(chainId, 10) : CHAIN_ID;
51
+ const result = await handleCheckTokenSecurity({ tokenAddress: tokenAddress, chainId: cid });
52
+ res.json(result);
53
+ }
54
+ catch (e) {
55
+ res.status(400).json(fail("BAD_REQUEST", productionSafeMessage(e instanceof Error ? e.message : String(e)), false, SOURCE));
56
+ }
57
+ });
58
+ app.get("/paid/simulate-transaction", async (req, res) => {
59
+ try {
60
+ const { action, tokenIn, tokenOut, amount, toAddress, walletAddress } = req.query;
61
+ const result = await handleSimulateTransaction({
62
+ action: action,
63
+ tokenIn: tokenIn,
64
+ tokenOut: tokenOut,
65
+ amount: amount,
66
+ toAddress: toAddress,
67
+ walletAddress: walletAddress,
68
+ });
69
+ res.json(result);
70
+ }
71
+ catch (e) {
72
+ res.status(400).json(fail("BAD_REQUEST", productionSafeMessage(e instanceof Error ? e.message : String(e)), false, SOURCE));
73
+ }
74
+ });
75
+ app.get("/paid/token-price", async (req, res) => {
76
+ try {
77
+ const { token } = req.query;
78
+ if (!token || typeof token !== "string") {
79
+ return res
80
+ .status(400)
81
+ .json(fail("BAD_REQUEST", "Missing required query parameter: token (PROS, USDC, or USDT)", false, SOURCE));
82
+ }
83
+ const result = await handleGetTokenPrice({ token: token });
84
+ res.json(result);
85
+ }
86
+ catch (e) {
87
+ res.status(400).json(fail("BAD_REQUEST", productionSafeMessage(e instanceof Error ? e.message : String(e)), false, SOURCE));
88
+ }
89
+ });
90
+ app.get("/paid/pool-info", async (req, res) => {
91
+ try {
92
+ const { tokenA, tokenB } = req.query;
93
+ if (!tokenA || !tokenB || typeof tokenA !== "string" || typeof tokenB !== "string") {
94
+ return res
95
+ .status(400)
96
+ .json(fail("BAD_REQUEST", "Missing required query parameters: tokenA and tokenB (PROS, USDC, or USDT)", false, SOURCE));
97
+ }
98
+ const result = await handleGetPoolInfo({ tokenA: tokenA, tokenB: tokenB });
99
+ res.json(result);
100
+ }
101
+ catch (e) {
102
+ res.status(400).json(fail("BAD_REQUEST", productionSafeMessage(e instanceof Error ? e.message : String(e)), false, SOURCE));
103
+ }
104
+ });
105
+ app.get("/paid/swap-route", async (req, res) => {
106
+ try {
107
+ const { tokenIn, tokenOut, amount } = req.query;
108
+ if (!tokenIn ||
109
+ !tokenOut ||
110
+ !amount ||
111
+ typeof tokenIn !== "string" ||
112
+ typeof tokenOut !== "string" ||
113
+ typeof amount !== "string") {
114
+ return res
115
+ .status(400)
116
+ .json(fail("BAD_REQUEST", "Missing required query parameters: tokenIn, tokenOut, amount", false, SOURCE));
117
+ }
118
+ const amountNum = Number(amount);
119
+ if (!Number.isFinite(amountNum) || amountNum <= 0) {
120
+ return res.status(400).json(fail("BAD_REQUEST", "amount must be a positive number", false, SOURCE));
121
+ }
122
+ const quote = await getDodoRoute({
123
+ fromToken: tokenIn,
124
+ toToken: tokenOut,
125
+ amountHuman: amount,
126
+ walletAddress: "0x0000000000000000000000000000000000000001",
127
+ });
128
+ res.json(ok({
129
+ tokenIn,
130
+ tokenOut,
131
+ amountIn: amount,
132
+ estimatedOutput: quote.routeAvailable ? quote.amountOut : null,
133
+ priceImpact: quote.priceImpact,
134
+ routeAvailable: quote.routeAvailable,
135
+ gasEstimate: quote.gasLimit,
136
+ wasSubstituted: quote.wasSubstituted,
137
+ substitutionNote: quote.substitutionNote || null,
138
+ source: "DODO/FaroSwap route API",
139
+ chainId: CHAIN_ID,
140
+ environment: PHAROS_ENVIRONMENT,
141
+ isMainnet: IS_MAINNET,
142
+ }));
143
+ }
144
+ catch (e) {
145
+ const message = e instanceof Error ? e.message : String(e);
146
+ if (message.includes("SWAP_LIQUIDITY_NOT_CONFIGURED")) {
147
+ return res.status(503).json(fail("SWAP_LIQUIDITY_NOT_CONFIGURED", message, false, SOURCE));
148
+ }
149
+ res.status(400).json(fail("BAD_REQUEST", productionSafeMessage(message), false, SOURCE));
150
+ }
151
+ });
152
+ // Flagship bundle: one payment fans out to preflight (multiple analyzers) + registry
153
+ // lookup in-process. Charged exactly once at the /paid/risk-report entrypoint.
154
+ app.get("/paid/risk-report", async (req, res) => {
155
+ try {
156
+ const { actionType, chainId, amount, tokenAddress, spender, approvalAmount, recipient, walletAddress, includeChecks } = req.query;
157
+ const result = await handleSafeHandsRiskReport({
158
+ actionType: actionType,
159
+ chainId: chainId ? parseInt(chainId, 10) : CHAIN_ID,
160
+ amount: amount,
161
+ tokenAddress: tokenAddress,
162
+ spender: spender,
163
+ approvalAmount: approvalAmount,
164
+ recipient: recipient,
165
+ walletAddress: walletAddress,
166
+ includeChecks: includeChecks === undefined ? undefined : includeChecks !== "false",
167
+ });
168
+ res.status(result.success ? 200 : 400).json(result);
169
+ }
170
+ catch (e) {
171
+ res.status(400).json(fail("BAD_REQUEST", productionSafeMessage(e instanceof Error ? e.message : String(e)), false, SOURCE));
172
+ }
173
+ });
174
+ }
175
+ //# sourceMappingURL=paidRoutes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"paidRoutes.js","sourceRoot":"","sources":["../../src/api/paidRoutes.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,58 @@
1
+ import { z } from "zod";
2
+ import type { ReadOnlyChainAccess } from "../lib/analysis/index.js";
3
+ import type { AgentRouteOptions } from "./agentRoutes.js";
4
+ declare const prepareTxSchema: z.ZodObject<{
5
+ to: z.ZodString;
6
+ data: z.ZodOptional<z.ZodString>;
7
+ value: z.ZodOptional<z.ZodString>;
8
+ chainId: z.ZodOptional<z.ZodNumber>;
9
+ }, "passthrough", z.ZodTypeAny, z.objectOutputType<{
10
+ to: z.ZodString;
11
+ data: z.ZodOptional<z.ZodString>;
12
+ value: z.ZodOptional<z.ZodString>;
13
+ chainId: z.ZodOptional<z.ZodNumber>;
14
+ }, z.ZodTypeAny, "passthrough">, z.objectInputType<{
15
+ to: z.ZodString;
16
+ data: z.ZodOptional<z.ZodString>;
17
+ value: z.ZodOptional<z.ZodString>;
18
+ chainId: z.ZodOptional<z.ZodNumber>;
19
+ }, z.ZodTypeAny, "passthrough">>;
20
+ export type PrepareTxInput = z.input<typeof prepareTxSchema>;
21
+ /**
22
+ * POST /prepare/tx — SafeHands-checked, prepare-only unsigned transaction.
23
+ * Returns `preparedTransaction` + `requiresUserSignature: true` (PREPARE_ONLY) when
24
+ * the action is not blocked; `BLOCK` with no prepared tx otherwise.
25
+ */
26
+ export declare function handlePrepareTx(raw: unknown, access?: ReadOnlyChainAccess, opts?: AgentRouteOptions): Promise<{
27
+ readOnly: true;
28
+ executionAvailable: boolean;
29
+ decision: import("../lib/guardian/decision.js").GuardianDecision;
30
+ /** The underlying SafeHands verdict (ALLOW / BLOCK / REQUIRE_CONFIRMATION). */
31
+ guardianDecision: import("../lib/guardian/decision.js").GuardianDecision;
32
+ riskLevel: import("../lib/analysis/types.js").AnalyzerRiskLevel;
33
+ reasons: string[];
34
+ /** True when the underlying verdict needs explicit user confirmation before signing. */
35
+ confirmationRequired: boolean;
36
+ /** True only when an unsigned tx was prepared (never on BLOCK). */
37
+ requiresUserSignature: boolean;
38
+ preparedTransaction: {
39
+ to: `0x${string}`;
40
+ data: string;
41
+ value: string;
42
+ chainId: number;
43
+ from: null;
44
+ unsigned: boolean;
45
+ signature: null;
46
+ } | null;
47
+ network: import("../lib/networks.js").NetworkName;
48
+ chainId: number;
49
+ policyPreset: string | null;
50
+ policyVersion: string;
51
+ /** SafeHands signs nothing and broadcasts nothing — the caller does both externally. */
52
+ signingAvailable: boolean;
53
+ broadcastAvailable: boolean;
54
+ nextStep: string;
55
+ source: string;
56
+ }>;
57
+ export {};
58
+ //# sourceMappingURL=prepareRoutes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prepareRoutes.d.ts","sourceRoot":"","sources":["../../src/api/prepareRoutes.ts"],"names":[],"mappings":"AAYA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AACpE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAM1D,QAAA,MAAM,eAAe;;;;;;;;;;;;;;;gCAOL,CAAC;AAEjB,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,eAAe,CAAC,CAAC;AAE7D;;;;GAIG;AACH,wBAAsB,eAAe,CACnC,GAAG,EAAE,OAAO,EACZ,MAAM,CAAC,EAAE,mBAAmB,EAC5B,IAAI,GAAE,iBAAsB;;;;IAuC1B,+EAA+E;;;;IAI/E,wFAAwF;;IAExF,mEAAmE;;;;;;;;;;;;;;;IAOnE,wFAAwF;;;;;GAS3F"}
@@ -0,0 +1,90 @@
1
+ // ─── SafeHands API — Prepare-Only Transaction Mode ───────
2
+ // Builds an UNSIGNED transaction request object AFTER a SafeHands check. SafeHands
3
+ // holds no keys: it NEVER signs, NEVER broadcasts, NEVER creates/manages a wallet,
4
+ // and NEVER publishes on-chain. The flow:
5
+ // 1. validate the caller's intended call (to / data / value),
6
+ // 2. run the real escalate-only SafeHands check (policy presets apply),
7
+ // 3. if the verdict is BLOCK → prepare NOTHING (a BLOCK is never weakened),
8
+ // otherwise → return the unsigned tx + `requiresUserSignature: true` and a
9
+ // `PREPARE_ONLY` decision (the caller signs + broadcasts externally).
10
+ // Pure + read-only by construction; no signer/wallet/write primitives here.
11
+ // ────────────────────────────────────────────────────────────────────────
12
+ import { z } from "zod";
13
+ import { isAddress } from "viem";
14
+ import { createGuardianAgent } from "../agent/index.js";
15
+ import { getActiveNetwork, getActiveNetworkName } from "../lib/networks.js";
16
+ import { readOnlyMeta } from "./response.js";
17
+ const ZERO_ADDRESS = "0x0000000000000000000000000000000000000000";
18
+ const prepareTxSchema = z
19
+ .object({
20
+ to: z.string(),
21
+ data: z.string().optional(),
22
+ value: z.string().optional(),
23
+ chainId: z.number().optional(),
24
+ })
25
+ .passthrough(); // policyPreset / policy are read by the server (agentPolicyOpts)
26
+ /**
27
+ * POST /prepare/tx — SafeHands-checked, prepare-only unsigned transaction.
28
+ * Returns `preparedTransaction` + `requiresUserSignature: true` (PREPARE_ONLY) when
29
+ * the action is not blocked; `BLOCK` with no prepared tx otherwise.
30
+ */
31
+ export async function handlePrepareTx(raw, access, opts = {}) {
32
+ const input = prepareTxSchema.parse(raw);
33
+ if (!isAddress(input.to))
34
+ throw new Error("`to` must be a valid address.");
35
+ if (input.to === ZERO_ADDRESS)
36
+ throw new Error("`to` must not be the zero address.");
37
+ if (input.data !== undefined && !/^0x[0-9a-fA-F]*$/.test(input.data)) {
38
+ throw new Error("`data` must be 0x-prefixed hex.");
39
+ }
40
+ if (input.value !== undefined) {
41
+ const n = Number(input.value);
42
+ if (!Number.isFinite(n) || n < 0)
43
+ throw new Error("`value` must be a non-negative number.");
44
+ }
45
+ const network = getActiveNetwork();
46
+ const chainId = input.chainId ?? network.chainId;
47
+ // Real escalate-only SafeHands check (policy presets apply via opts) — a BLOCK can
48
+ // never be weakened by any preset/request.
49
+ const agent = createGuardianAgent({ access, policy: opts.policy, policyPreset: opts.policyPreset });
50
+ const verdict = await agent.check({ to: input.to, data: input.data, value: input.value, chainId });
51
+ const blocked = verdict.decision === "BLOCK";
52
+ const confirmationRequired = verdict.decision === "REQUIRE_CONFIRMATION";
53
+ // Unsigned transaction request object — no signer, no signature, no nonce/gas.
54
+ const preparedTransaction = blocked
55
+ ? null
56
+ : {
57
+ to: input.to,
58
+ data: input.data ?? "0x",
59
+ value: input.value ?? "0",
60
+ chainId,
61
+ from: null, // SafeHands holds no keys
62
+ unsigned: true,
63
+ signature: null,
64
+ };
65
+ return {
66
+ decision: verdict.decision,
67
+ /** The underlying SafeHands verdict (ALLOW / BLOCK / REQUIRE_CONFIRMATION). */
68
+ guardianDecision: verdict.decision,
69
+ riskLevel: verdict.riskLevel,
70
+ reasons: verdict.reasons,
71
+ /** True when the underlying verdict needs explicit user confirmation before signing. */
72
+ confirmationRequired,
73
+ /** True only when an unsigned tx was prepared (never on BLOCK). */
74
+ requiresUserSignature: !blocked,
75
+ preparedTransaction,
76
+ network: getActiveNetworkName(),
77
+ chainId,
78
+ policyPreset: verdict.policyPreset,
79
+ policyVersion: verdict.policyVersion,
80
+ /** SafeHands signs nothing and broadcasts nothing — the caller does both externally. */
81
+ signingAvailable: false,
82
+ broadcastAvailable: false,
83
+ nextStep: blocked
84
+ ? "Do not prepare: the action is unsafe. Abort and surface the block reason."
85
+ : "WARNING: This prepared tx is for EXTERNAL broadcast only. SafeHands holds no keys. Do not submit this to /broadcast/signed because no internal record was saved.",
86
+ source: "prepare_tx",
87
+ ...readOnlyMeta(), // readOnly: true, executionAvailable: false
88
+ };
89
+ }
90
+ //# sourceMappingURL=prepareRoutes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prepareRoutes.js","sourceRoot":"","sources":["../../src/api/prepareRoutes.ts"],"names":[],"mappings":"AAAA,4DAA4D;AAC5D,mFAAmF;AACnF,mFAAmF;AACnF,0CAA0C;AAC1C,gEAAgE;AAChE,0EAA0E;AAC1E,8EAA8E;AAC9E,gFAAgF;AAChF,2EAA2E;AAC3E,4EAA4E;AAC5E,2EAA2E;AAE3E,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,SAAS,EAAE,MAAM,MAAM,CAAC;AACjC,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAIxD,OAAO,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAC5E,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAE7C,MAAM,YAAY,GAAG,4CAA4C,CAAC;AAElE,MAAM,eAAe,GAAG,CAAC;KACtB,MAAM,CAAC;IACN,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE;IACd,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC3B,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC5B,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;CAC/B,CAAC;KACD,WAAW,EAAE,CAAC,CAAC,iEAAiE;AAInF;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,GAAY,EACZ,MAA4B,EAC5B,OAA0B,EAAE;IAE5B,MAAM,KAAK,GAAG,eAAe,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACzC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,+BAA+B,CAAC,CAAC;IAC3E,IAAI,KAAK,CAAC,EAAE,KAAK,YAAY;QAAE,MAAM,IAAI,KAAK,CAAC,oCAAoC,CAAC,CAAC;IACrF,IAAI,KAAK,CAAC,IAAI,KAAK,SAAS,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QACrE,MAAM,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAC;IACrD,CAAC;IACD,IAAI,KAAK,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;QAC9B,MAAM,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAC9B,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,wCAAwC,CAAC,CAAC;IAC9F,CAAC;IAED,MAAM,OAAO,GAAG,gBAAgB,EAAE,CAAC;IACnC,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC;IAEjD,mFAAmF;IACnF,2CAA2C;IAC3C,MAAM,KAAK,GAAG,mBAAmB,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,YAAY,EAAE,IAAI,CAAC,YAAY,EAAE,CAAC,CAAC;IACpG,MAAM,OAAO,GAAG,MAAM,KAAK,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,KAAK,CAAC,EAAE,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,OAAO,EAAkB,CAAC,CAAC;IAEnH,MAAM,OAAO,GAAG,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC;IAC7C,MAAM,oBAAoB,GAAG,OAAO,CAAC,QAAQ,KAAK,sBAAsB,CAAC;IAEzE,+EAA+E;IAC/E,MAAM,mBAAmB,GAAG,OAAO;QACjC,CAAC,CAAC,IAAI;QACN,CAAC,CAAC;YACE,EAAE,EAAE,KAAK,CAAC,EAAE;YACZ,IAAI,EAAE,KAAK,CAAC,IAAI,IAAI,IAAI;YACxB,KAAK,EAAE,KAAK,CAAC,KAAK,IAAI,GAAG;YACzB,OAAO;YACP,IAAI,EAAE,IAAI,EAAE,0BAA0B;YACtC,QAAQ,EAAE,IAAI;YACd,SAAS,EAAE,IAAI;SAChB,CAAC;IAEN,OAAO;QACL,QAAQ,EAAE,OAAO,CAAC,QAAQ;QAC1B,+EAA+E;QAC/E,gBAAgB,EAAE,OAAO,CAAC,QAAQ;QAClC,SAAS,EAAE,OAAO,CAAC,SAAS;QAC5B,OAAO,EAAE,OAAO,CAAC,OAAO;QACxB,wFAAwF;QACxF,oBAAoB;QACpB,mEAAmE;QACnE,qBAAqB,EAAE,CAAC,OAAO;QAC/B,mBAAmB;QACnB,OAAO,EAAE,oBAAoB,EAAE;QAC/B,OAAO;QACP,YAAY,EAAE,OAAO,CAAC,YAAY;QAClC,aAAa,EAAE,OAAO,CAAC,aAAa;QACpC,wFAAwF;QACxF,gBAAgB,EAAE,KAAK;QACvB,kBAAkB,EAAE,KAAK;QACzB,QAAQ,EAAE,OAAO;YACf,CAAC,CAAC,2EAA2E;YAC7E,CAAC,CAAC,kKAAkK;QACtK,MAAM,EAAE,YAAY;QACpB,GAAG,YAAY,EAAE,EAAE,4CAA4C;KAChE,CAAC;AACJ,CAAC"}
@@ -0,0 +1,39 @@
1
+ import type { PharosNetwork } from "../lib/networks.js";
2
+ import type { GuardianDecision } from "../lib/guardian/decision.js";
3
+ import { type RpcEvidence, type GasEvidence } from "../lib/pharos/rpcEvidence.js";
4
+ import type { ReadOnlyChainAccess } from "../lib/analysis/types.js";
5
+ export { ok, fail } from "../lib/toolResponse.js";
6
+ export interface ReadOnlyMeta {
7
+ /** Always true — the API never writes, signs, sends, or publishes. */
8
+ readOnly: true;
9
+ /** False by default (mainnet execution disabled + gates off). */
10
+ executionAvailable: boolean;
11
+ }
12
+ /** Stamp a payload as read-only and report whether execution is available. */
13
+ export declare function readOnlyMeta(): ReadOnlyMeta;
14
+ export interface RpcMeta {
15
+ rpcEvidence: RpcEvidence;
16
+ gasEvidence: GasEvidence;
17
+ /** Alias of `rpcEvidence` for spec-compliance (same content). */
18
+ pharosEvidence: RpcEvidence;
19
+ }
20
+ /**
21
+ * Read-only RPC + gas capability evidence for a response. Deterministic, offline,
22
+ * and secret-free (no RPC URL/API key — only the redacted provider name). Evidence
23
+ * is metadata: it never relaxes a SafeHands decision.
24
+ */
25
+ export declare function rpcMeta(network: PharosNetwork, access?: ReadOnlyChainAccess): RpcMeta;
26
+ export interface ExplorerLinks {
27
+ address?: string;
28
+ tx?: string;
29
+ socialScanAddress?: string;
30
+ socialScanTx?: string;
31
+ }
32
+ /** Build read-only explorer links from a network's public explorer URLs. */
33
+ export declare function explorerLinks(network: PharosNetwork, ref: {
34
+ address?: string | null;
35
+ txHash?: string | null;
36
+ }): ExplorerLinks;
37
+ /** Aggregate analyzer decisions to the most severe public decision. */
38
+ export declare function worstDecision(decisions: GuardianDecision[]): GuardianDecision;
39
+ //# sourceMappingURL=response.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"response.d.ts","sourceRoot":"","sources":["../../src/api/response.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AACpE,OAAO,EAA4B,KAAK,WAAW,EAAE,KAAK,WAAW,EAAE,MAAM,8BAA8B,CAAC;AAC5G,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAEpE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,wBAAwB,CAAC;AAElD,MAAM,WAAW,YAAY;IAC3B,sEAAsE;IACtE,QAAQ,EAAE,IAAI,CAAC;IACf,iEAAiE;IACjE,kBAAkB,EAAE,OAAO,CAAC;CAC7B;AAED,8EAA8E;AAC9E,wBAAgB,YAAY,IAAI,YAAY,CAE3C;AAED,MAAM,WAAW,OAAO;IACtB,WAAW,EAAE,WAAW,CAAC;IACzB,WAAW,EAAE,WAAW,CAAC;IACzB,iEAAiE;IACjE,cAAc,EAAE,WAAW,CAAC;CAC7B;AAED;;;;GAIG;AACH,wBAAgB,OAAO,CAAC,OAAO,EAAE,aAAa,EAAE,MAAM,CAAC,EAAE,mBAAmB,GAAG,OAAO,CAGrF;AAED,MAAM,WAAW,aAAa;IAC5B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,4EAA4E;AAC5E,wBAAgB,aAAa,CAC3B,OAAO,EAAE,aAAa,EACtB,GAAG,EAAE;IAAE,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,GACvD,aAAa,CAaf;AAUD,uEAAuE;AACvE,wBAAgB,aAAa,CAAC,SAAS,EAAE,gBAAgB,EAAE,GAAG,gBAAgB,CAG7E"}
@@ -0,0 +1,53 @@
1
+ // ─── SafeHands API — Response Helpers (read-only) ─────────────
2
+ // Shared response shaping for the read-only SafeHands API. `readOnlyMeta()`
3
+ // stamps every payload as read-only and reports executionAvailable (false by
4
+ // default — mainnet executionAllowed=false and all gates default off). No helper
5
+ // here can sign, send, or publish.
6
+ // ────────────────────────────────────────────────────────────────────────
7
+ import { isExecutionAvailable } from "../lib/config.js";
8
+ import { rpcEvidence, gasEvidence } from "../lib/pharos/rpcEvidence.js";
9
+ export { ok, fail } from "../lib/toolResponse.js";
10
+ /** Stamp a payload as read-only and report whether execution is available. */
11
+ export function readOnlyMeta() {
12
+ return { readOnly: true, executionAvailable: isExecutionAvailable() };
13
+ }
14
+ /**
15
+ * Read-only RPC + gas capability evidence for a response. Deterministic, offline,
16
+ * and secret-free (no RPC URL/API key — only the redacted provider name). Evidence
17
+ * is metadata: it never relaxes a SafeHands decision.
18
+ */
19
+ export function rpcMeta(network, access) {
20
+ const evidence = rpcEvidence(network, access);
21
+ return { rpcEvidence: evidence, gasEvidence: gasEvidence(access), pharosEvidence: evidence };
22
+ }
23
+ /** Build read-only explorer links from a network's public explorer URLs. */
24
+ export function explorerLinks(network, ref) {
25
+ const base = network.explorerUrl.replace(/\/+$/, "");
26
+ const social = network.socialScanUrl?.replace(/\/+$/, "");
27
+ const links = {};
28
+ if (ref.address) {
29
+ links.address = `${base}/address/${ref.address}`;
30
+ if (social)
31
+ links.socialScanAddress = `${social}/address/${ref.address}`;
32
+ }
33
+ if (ref.txHash) {
34
+ links.tx = `${base}/tx/${ref.txHash}`;
35
+ if (social)
36
+ links.socialScanTx = `${social}/tx/${ref.txHash}`;
37
+ }
38
+ return links;
39
+ }
40
+ // Severity order: most severe wins when aggregating multiple analyzers.
41
+ const SEVERITY = {
42
+ BLOCK: 3,
43
+ REQUIRE_CONFIRMATION: 2,
44
+ PREPARE_ONLY: 1,
45
+ ALLOW: 0,
46
+ };
47
+ /** Aggregate analyzer decisions to the most severe public decision. */
48
+ export function worstDecision(decisions) {
49
+ if (decisions.length === 0)
50
+ return "REQUIRE_CONFIRMATION";
51
+ return decisions.reduce((worst, d) => (SEVERITY[d] > SEVERITY[worst] ? d : worst), "ALLOW");
52
+ }
53
+ //# sourceMappingURL=response.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"response.js","sourceRoot":"","sources":["../../src/api/response.ts"],"names":[],"mappings":"AAAA,iEAAiE;AACjE,4EAA4E;AAC5E,6EAA6E;AAC7E,iFAAiF;AACjF,mCAAmC;AACnC,2EAA2E;AAE3E,OAAO,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AAGxD,OAAO,EAAE,WAAW,EAAE,WAAW,EAAsC,MAAM,8BAA8B,CAAC;AAG5G,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,wBAAwB,CAAC;AASlD,8EAA8E;AAC9E,MAAM,UAAU,YAAY;IAC1B,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,EAAE,CAAC;AACxE,CAAC;AASD;;;;GAIG;AACH,MAAM,UAAU,OAAO,CAAC,OAAsB,EAAE,MAA4B;IAC1E,MAAM,QAAQ,GAAG,WAAW,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IAC9C,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,WAAW,EAAE,WAAW,CAAC,MAAM,CAAC,EAAE,cAAc,EAAE,QAAQ,EAAE,CAAC;AAC/F,CAAC;AASD,4EAA4E;AAC5E,MAAM,UAAU,aAAa,CAC3B,OAAsB,EACtB,GAAwD;IAExD,MAAM,IAAI,GAAG,OAAO,CAAC,WAAW,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IACrD,MAAM,MAAM,GAAG,OAAO,CAAC,aAAa,EAAE,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IAC1D,MAAM,KAAK,GAAkB,EAAE,CAAC;IAChC,IAAI,GAAG,CAAC,OAAO,EAAE,CAAC;QAChB,KAAK,CAAC,OAAO,GAAG,GAAG,IAAI,YAAY,GAAG,CAAC,OAAO,EAAE,CAAC;QACjD,IAAI,MAAM;YAAE,KAAK,CAAC,iBAAiB,GAAG,GAAG,MAAM,YAAY,GAAG,CAAC,OAAO,EAAE,CAAC;IAC3E,CAAC;IACD,IAAI,GAAG,CAAC,MAAM,EAAE,CAAC;QACf,KAAK,CAAC,EAAE,GAAG,GAAG,IAAI,OAAO,GAAG,CAAC,MAAM,EAAE,CAAC;QACtC,IAAI,MAAM;YAAE,KAAK,CAAC,YAAY,GAAG,GAAG,MAAM,OAAO,GAAG,CAAC,MAAM,EAAE,CAAC;IAChE,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,wEAAwE;AACxE,MAAM,QAAQ,GAAqC;IACjD,KAAK,EAAE,CAAC;IACR,oBAAoB,EAAE,CAAC;IACvB,YAAY,EAAE,CAAC;IACf,KAAK,EAAE,CAAC;CACT,CAAC;AAEF,uEAAuE;AACvE,MAAM,UAAU,aAAa,CAAC,SAA6B;IACzD,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,sBAAsB,CAAC;IAC1D,OAAO,SAAS,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC,CAAC;AAC9F,CAAC"}