safehands-pharos 1.5.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 (561) 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/index.d.ts +0 -0
  117. package/dist/index.d.ts.map +0 -0
  118. package/dist/index.js +212 -135
  119. package/dist/index.js.map +1 -1
  120. package/dist/init.d.ts +0 -0
  121. package/dist/init.d.ts.map +1 -1
  122. package/dist/init.js +72 -10
  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 +246 -97
  177. package/dist/lib/constants.d.ts.map +1 -1
  178. package/dist/lib/constants.js +334 -127
  179. package/dist/lib/constants.js.map +1 -1
  180. package/dist/lib/dodoApi.d.ts +26 -3
  181. package/dist/lib/dodoApi.d.ts.map +1 -1
  182. package/dist/lib/dodoApi.js +80 -17
  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 +0 -0
  189. package/dist/lib/envLoader.d.ts.map +0 -0
  190. package/dist/lib/envLoader.js +39 -18
  191. package/dist/lib/envLoader.js.map +1 -1
  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 +0 -1
  201. package/dist/lib/http.d.ts.map +1 -1
  202. package/dist/lib/http.js +297 -32
  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 +5 -10
  289. package/dist/lib/pharosClient.d.ts.map +1 -1
  290. package/dist/lib/pharosClient.js +9 -16
  291. package/dist/lib/pharosClient.js.map +1 -1
  292. package/dist/lib/policy/actionPolicyEngine.d.ts +37 -1
  293. package/dist/lib/policy/actionPolicyEngine.d.ts.map +1 -1
  294. package/dist/lib/policy/actionPolicyEngine.js +213 -52
  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 +19 -0
  341. package/dist/lib/riskEngine.d.ts.map +1 -1
  342. package/dist/lib/riskEngine.js +94 -36
  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 +3 -3
  353. package/dist/lib/signer/index.d.ts.map +1 -1
  354. package/dist/lib/signer/index.js +33 -11
  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 +6 -1
  361. package/dist/lib/toolResponse.d.ts.map +1 -1
  362. package/dist/lib/toolResponse.js +13 -9
  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 +8 -12
  369. package/dist/lib/wallet/index.d.ts.map +1 -1
  370. package/dist/lib/wallet/index.js +48 -35
  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 +31 -10
  382. package/dist/tools/approveToken.d.ts.map +1 -1
  383. package/dist/tools/approveToken.js +91 -24
  384. package/dist/tools/approveToken.js.map +1 -1
  385. package/dist/tools/assessRisk.d.ts +13 -26
  386. package/dist/tools/assessRisk.d.ts.map +1 -1
  387. package/dist/tools/assessRisk.js +34 -75
  388. package/dist/tools/assessRisk.js.map +1 -1
  389. package/dist/tools/checkAllowance.d.ts +9 -3
  390. package/dist/tools/checkAllowance.d.ts.map +1 -1
  391. package/dist/tools/checkAllowance.js +27 -5
  392. package/dist/tools/checkAllowance.js.map +1 -1
  393. package/dist/tools/checkTokenSecurity.d.ts +62 -5
  394. package/dist/tools/checkTokenSecurity.d.ts.map +1 -1
  395. package/dist/tools/checkTokenSecurity.js +166 -21
  396. package/dist/tools/checkTokenSecurity.js.map +1 -1
  397. package/dist/tools/createAgentWallet.d.ts +4 -2
  398. package/dist/tools/createAgentWallet.d.ts.map +1 -1
  399. package/dist/tools/createAgentWallet.js +36 -31
  400. package/dist/tools/createAgentWallet.js.map +1 -1
  401. package/dist/tools/estimateGas.d.ts +7 -2
  402. package/dist/tools/estimateGas.d.ts.map +1 -1
  403. package/dist/tools/estimateGas.js +16 -10
  404. package/dist/tools/estimateGas.js.map +1 -1
  405. package/dist/tools/executeSwap.d.ts +56 -8
  406. package/dist/tools/executeSwap.d.ts.map +1 -1
  407. package/dist/tools/executeSwap.js +194 -46
  408. package/dist/tools/executeSwap.js.map +1 -1
  409. package/dist/tools/explainRisk.d.ts +9 -9
  410. package/dist/tools/explainRisk.d.ts.map +1 -1
  411. package/dist/tools/explainRisk.js +5 -4
  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 +1 -1
  422. package/dist/tools/getAgentWallet.d.ts.map +1 -1
  423. package/dist/tools/getAgentWallet.js +11 -1
  424. package/dist/tools/getAgentWallet.js.map +1 -1
  425. package/dist/tools/getAgentWalletBalance.d.ts +1 -1
  426. package/dist/tools/getAgentWalletBalance.d.ts.map +1 -1
  427. package/dist/tools/getAgentWalletBalance.js +58 -26
  428. package/dist/tools/getAgentWalletBalance.js.map +1 -1
  429. package/dist/tools/getExecutionHistory.d.ts +1 -1
  430. package/dist/tools/getExecutionHistory.d.ts.map +1 -1
  431. package/dist/tools/getExecutionHistory.js +13 -19
  432. package/dist/tools/getExecutionHistory.js.map +1 -1
  433. package/dist/tools/getGasPrice.d.ts +3 -3
  434. package/dist/tools/getGasPrice.d.ts.map +0 -0
  435. package/dist/tools/getGasPrice.js +7 -7
  436. package/dist/tools/getGasPrice.js.map +1 -1
  437. package/dist/tools/getPoolInfo.d.ts +17 -17
  438. package/dist/tools/getPoolInfo.d.ts.map +1 -1
  439. package/dist/tools/getPoolInfo.js +14 -9
  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 +28 -85
  446. package/dist/tools/getTokenPrice.d.ts.map +1 -1
  447. package/dist/tools/getTokenPrice.js +87 -94
  448. package/dist/tools/getTokenPrice.js.map +1 -1
  449. package/dist/tools/getTransactionStatus.d.ts +2 -2
  450. package/dist/tools/getTransactionStatus.d.ts.map +0 -0
  451. package/dist/tools/getTransactionStatus.js +0 -0
  452. package/dist/tools/getTransactionStatus.js.map +0 -0
  453. package/dist/tools/getWalletBalance.d.ts +38 -3
  454. package/dist/tools/getWalletBalance.d.ts.map +1 -1
  455. package/dist/tools/getWalletBalance.js +92 -52
  456. package/dist/tools/getWalletBalance.js.map +1 -1
  457. package/dist/tools/publishRiskScore.d.ts +36 -14
  458. package/dist/tools/publishRiskScore.d.ts.map +1 -1
  459. package/dist/tools/publishRiskScore.js +80 -32
  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 +14 -14
  466. package/dist/tools/queryRiskRegistry.d.ts.map +1 -1
  467. package/dist/tools/queryRiskRegistry.js +34 -30
  468. package/dist/tools/queryRiskRegistry.js.map +1 -1
  469. package/dist/tools/safehandsPreflightCheck.d.ts +29 -14
  470. package/dist/tools/safehandsPreflightCheck.d.ts.map +1 -1
  471. package/dist/tools/safehandsPreflightCheck.js +133 -6
  472. package/dist/tools/safehandsPreflightCheck.js.map +1 -1
  473. package/dist/tools/safehandsRiskReport.d.ts +29 -14
  474. package/dist/tools/safehandsRiskReport.d.ts.map +1 -1
  475. package/dist/tools/safehandsRiskReport.js +23 -3
  476. package/dist/tools/safehandsRiskReport.js.map +1 -1
  477. package/dist/tools/safehandsSafeExecute.d.ts +1 -1
  478. package/dist/tools/safehandsSafeExecute.d.ts.map +1 -1
  479. package/dist/tools/safehandsSafeExecute.js +100 -17
  480. package/dist/tools/safehandsSafeExecute.js.map +1 -1
  481. package/dist/tools/safehandsWalletHealth.d.ts +15 -1
  482. package/dist/tools/safehandsWalletHealth.d.ts.map +1 -1
  483. package/dist/tools/safehandsWalletHealth.js +67 -25
  484. package/dist/tools/safehandsWalletHealth.js.map +1 -1
  485. package/dist/tools/safehandsX402Preflight.d.ts +3 -3
  486. package/dist/tools/safehandsX402Preflight.d.ts.map +1 -1
  487. package/dist/tools/safehandsX402Preflight.js +24 -3
  488. package/dist/tools/safehandsX402Preflight.js.map +1 -1
  489. package/dist/tools/sendPayment.d.ts +10 -4
  490. package/dist/tools/sendPayment.d.ts.map +1 -1
  491. package/dist/tools/sendPayment.js +63 -36
  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 +7 -3
  498. package/dist/tools/simulateTransaction.d.ts.map +1 -1
  499. package/dist/tools/simulateTransaction.js +42 -9
  500. package/dist/tools/simulateTransaction.js.map +1 -1
  501. package/dist/tools/tokenRegistryStatus.d.ts +25 -5
  502. package/dist/tools/tokenRegistryStatus.d.ts.map +1 -1
  503. package/dist/tools/tokenRegistryStatus.js +61 -31
  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 +15 -9
  510. package/dist/tools/x402PayAndFetch.d.ts.map +1 -1
  511. package/dist/tools/x402PayAndFetch.js +163 -20
  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 +144 -35
  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 -73
  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 -397
  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
@@ -0,0 +1,14 @@
1
+ import { type ToolResponse } from "../lib/toolResponse.js";
2
+ /** True for state-changing tools (execution / disk-writing). Used by the HTTP
3
+ * layer to require authentication before a write tool can run over an open origin. */
4
+ export declare function isWriteTool(name: string): boolean;
5
+ export declare function listHostedTools(): {
6
+ count: number;
7
+ tools: {
8
+ name: string;
9
+ write: boolean;
10
+ enabled: boolean;
11
+ }[];
12
+ };
13
+ export declare function invokeHostedTool(toolName: string, params: unknown): Promise<ToolResponse<unknown>>;
14
+ //# sourceMappingURL=toolRoutes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"toolRoutes.d.ts","sourceRoot":"","sources":["../../src/api/toolRoutes.ts"],"names":[],"mappings":"AAOA,OAAO,EAAmC,KAAK,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAsF5F;sFACsF;AACtF,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAEjD;AAMD,wBAAgB,eAAe;;;;;;;EAU9B;AAED,wBAAsB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,GAAG,OAAO,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,CAqCxG"}
@@ -0,0 +1,138 @@
1
+ // ─── SafeHands Tool Gateway API ────────────────────────────────────────
2
+ // Optional HTTP bridge for the same 33 tools exposed through MCP/Anvita.
3
+ // This does not replace MCP; it lets a hosted deployment expose every tool at
4
+ // POST /tools/:toolName when the operator intentionally enables the API.
5
+ // Write tools remain protected by the same env gates used by MCP handlers.
6
+ // ────────────────────────────────────────────────────────────────────────
7
+ import { fail, ok, productionSafeMessage } from "../lib/toolResponse.js";
8
+ import { handleAssessRisk } from "../tools/assessRisk.js";
9
+ import { handleSimulateTransaction } from "../tools/simulateTransaction.js";
10
+ import { handleGetExecutionHistory } from "../tools/getExecutionHistory.js";
11
+ import { handleGetTokenPrice } from "../tools/getTokenPrice.js";
12
+ import { handleGetWalletBalance } from "../tools/getWalletBalance.js";
13
+ import { handleCheckAllowance } from "../tools/checkAllowance.js";
14
+ import { handleGetTransactionStatus } from "../tools/getTransactionStatus.js";
15
+ import { handleEstimateGas } from "../tools/estimateGas.js";
16
+ import { handlePublishRiskScore } from "../tools/publishRiskScore.js";
17
+ import { handleQueryRiskRegistry } from "../tools/queryRiskRegistry.js";
18
+ import { handleVerifyRiskInclusion } from "../tools/verifyRiskInclusion.js";
19
+ import { handleGetAgentReputation } from "../tools/getAgentReputation.js";
20
+ import { handleGetGasPrice } from "../tools/getGasPrice.js";
21
+ import { handleGetPoolInfo } from "../tools/getPoolInfo.js";
22
+ import { handleQueryGoldsky } from "../tools/queryGoldsky.js";
23
+ import { handleGetSpvProof } from "../tools/getSpvProof.js";
24
+ import { handleCheckTokenSecurity } from "../tools/checkTokenSecurity.js";
25
+ import { handleCreateAgentWallet } from "../tools/createAgentWallet.js";
26
+ import { handleSafeHandsPreflightCheck } from "../tools/safehandsPreflightCheck.js";
27
+ import { handleSafeHandsSafeExecute } from "../tools/safehandsSafeExecute.js";
28
+ import { handleSafeHandsWalletHealth } from "../tools/safehandsWalletHealth.js";
29
+ import { handleSafeHandsX402Preflight } from "../tools/safehandsX402Preflight.js";
30
+ import { handleSafeHandsRiskReport } from "../tools/safehandsRiskReport.js";
31
+ import { handleExplainRisk } from "../tools/explainRisk.js";
32
+ import { handleTokenRegistryStatus } from "../tools/tokenRegistryStatus.js";
33
+ import { handleGetAgentWallet } from "../tools/getAgentWallet.js";
34
+ import { handleGetAgentWalletBalance } from "../tools/getAgentWalletBalance.js";
35
+ import { handleGetAgentPolicy } from "../tools/getAgentPolicy.js";
36
+ import { handleSetAgentPolicy } from "../tools/setAgentPolicy.js";
37
+ import { handleExecuteSwap } from "../tools/executeSwap.js";
38
+ import { handleSendPayment } from "../tools/sendPayment.js";
39
+ import { handleApproveToken } from "../tools/approveToken.js";
40
+ import { handleX402PayAndFetch } from "../tools/x402PayAndFetch.js";
41
+ import { auditLog } from "../lib/auditLog.js";
42
+ const TOOL_HANDLERS = {
43
+ safehands_preflight_check: handleSafeHandsPreflightCheck,
44
+ safehands_safe_execute: handleSafeHandsSafeExecute,
45
+ execute_swap: handleExecuteSwap,
46
+ send_payment: handleSendPayment,
47
+ approve_token: handleApproveToken,
48
+ x402_pay_and_fetch: handleX402PayAndFetch,
49
+ safehands_wallet_health: handleSafeHandsWalletHealth,
50
+ safehands_x402_preflight: handleSafeHandsX402Preflight,
51
+ safehands_risk_report: handleSafeHandsRiskReport,
52
+ explain_risk: handleExplainRisk,
53
+ token_registry_status: handleTokenRegistryStatus,
54
+ assess_risk: handleAssessRisk,
55
+ simulate_transaction: handleSimulateTransaction,
56
+ get_execution_history: handleGetExecutionHistory,
57
+ get_token_price: handleGetTokenPrice,
58
+ get_wallet_balance: handleGetWalletBalance,
59
+ check_allowance: handleCheckAllowance,
60
+ get_transaction_status: handleGetTransactionStatus,
61
+ estimate_gas: handleEstimateGas,
62
+ publish_risk_score: handlePublishRiskScore,
63
+ query_risk_registry: handleQueryRiskRegistry,
64
+ verify_risk_inclusion: handleVerifyRiskInclusion,
65
+ get_agent_reputation: handleGetAgentReputation,
66
+ get_gas_price: handleGetGasPrice,
67
+ get_pool_info: handleGetPoolInfo,
68
+ query_goldsky_subgraph: handleQueryGoldsky,
69
+ get_spv_proof: handleGetSpvProof,
70
+ check_token_security: handleCheckTokenSecurity,
71
+ get_agent_policy: handleGetAgentPolicy,
72
+ set_agent_policy: handleSetAgentPolicy,
73
+ create_agent_wallet: handleCreateAgentWallet,
74
+ get_agent_wallet: handleGetAgentWallet,
75
+ get_agent_wallet_balance: handleGetAgentWalletBalance,
76
+ };
77
+ const WRITE_TOOLS = new Set([
78
+ "safehands_safe_execute",
79
+ "execute_swap",
80
+ "send_payment",
81
+ "approve_token",
82
+ "x402_pay_and_fetch",
83
+ "publish_risk_score",
84
+ "set_agent_policy",
85
+ "create_agent_wallet",
86
+ ]);
87
+ /** True for state-changing tools (execution / disk-writing). Used by the HTTP
88
+ * layer to require authentication before a write tool can run over an open origin. */
89
+ export function isWriteTool(name) {
90
+ return WRITE_TOOLS.has(name);
91
+ }
92
+ function isToolResponse(value) {
93
+ return !!value && typeof value === "object" && "success" in value && "timestamp" in value && "error" in value;
94
+ }
95
+ export function listHostedTools() {
96
+ const names = Object.keys(TOOL_HANDLERS).sort();
97
+ return {
98
+ count: names.length,
99
+ tools: names.map((name) => ({
100
+ name,
101
+ write: WRITE_TOOLS.has(name),
102
+ enabled: !WRITE_TOOLS.has(name) || process.env.WRITE_TOOLS_ENABLED === "true",
103
+ })),
104
+ };
105
+ }
106
+ export async function invokeHostedTool(toolName, params) {
107
+ const handler = TOOL_HANDLERS[toolName];
108
+ if (!handler) {
109
+ return fail("UNKNOWN_TOOL", `Unknown SafeHands tool '${toolName}'.`, false, "tool_gateway");
110
+ }
111
+ if (WRITE_TOOLS.has(toolName) && process.env.WRITE_TOOLS_ENABLED !== "true") {
112
+ return fail("WRITE_TOOLS_DISABLED", `${toolName} is disabled by default. Set WRITE_TOOLS_ENABLED=true only for trusted full-enabled deployments.`, false, "tool_gateway");
113
+ }
114
+ const start = Date.now();
115
+ try {
116
+ const result = await handler(params ?? {});
117
+ auditLog({
118
+ ts: new Date().toISOString(),
119
+ tool: `http:${toolName}`,
120
+ success: isToolResponse(result) ? result.success : true,
121
+ errorCode: isToolResponse(result) && !result.success ? result.error.code : undefined,
122
+ durationMs: Date.now() - start,
123
+ });
124
+ return isToolResponse(result) ? result : ok(result);
125
+ }
126
+ catch (err) {
127
+ const message = err instanceof Error ? err.message : String(err);
128
+ auditLog({
129
+ ts: new Date().toISOString(),
130
+ tool: `http:${toolName}`,
131
+ success: false,
132
+ errorCode: "TOOL_EXECUTION_FAILED",
133
+ durationMs: Date.now() - start,
134
+ });
135
+ return fail("TOOL_EXECUTION_FAILED", productionSafeMessage(message, "Tool execution failed."), false, toolName);
136
+ }
137
+ }
138
+ //# sourceMappingURL=toolRoutes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"toolRoutes.js","sourceRoot":"","sources":["../../src/api/toolRoutes.ts"],"names":[],"mappings":"AAAA,0EAA0E;AAC1E,yEAAyE;AACzE,8EAA8E;AAC9E,yEAAyE;AACzE,2EAA2E;AAC3E,2EAA2E;AAE3E,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,qBAAqB,EAAqB,MAAM,wBAAwB,CAAC;AAE5F,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,EAAE,yBAAyB,EAAE,MAAM,iCAAiC,CAAC;AAC5E,OAAO,EAAE,yBAAyB,EAAE,MAAM,iCAAiC,CAAC;AAC5E,OAAO,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AAChE,OAAO,EAAE,sBAAsB,EAAE,MAAM,8BAA8B,CAAC;AACtE,OAAO,EAAE,oBAAoB,EAAE,MAAM,4BAA4B,CAAC;AAClE,OAAO,EAAE,0BAA0B,EAAE,MAAM,kCAAkC,CAAC;AAC9E,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,EAAE,sBAAsB,EAAE,MAAM,8BAA8B,CAAC;AACtE,OAAO,EAAE,uBAAuB,EAAE,MAAM,+BAA+B,CAAC;AACxE,OAAO,EAAE,yBAAyB,EAAE,MAAM,iCAAiC,CAAC;AAC5E,OAAO,EAAE,wBAAwB,EAAE,MAAM,gCAAgC,CAAC;AAC1E,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAC9D,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,EAAE,wBAAwB,EAAE,MAAM,gCAAgC,CAAC;AAC1E,OAAO,EAAE,uBAAuB,EAAE,MAAM,+BAA+B,CAAC;AACxE,OAAO,EAAE,6BAA6B,EAAE,MAAM,qCAAqC,CAAC;AACpF,OAAO,EAAE,0BAA0B,EAAE,MAAM,kCAAkC,CAAC;AAC9E,OAAO,EAAE,2BAA2B,EAAE,MAAM,mCAAmC,CAAC;AAChF,OAAO,EAAE,4BAA4B,EAAE,MAAM,oCAAoC,CAAC;AAClF,OAAO,EAAE,yBAAyB,EAAE,MAAM,iCAAiC,CAAC;AAC5E,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,EAAE,yBAAyB,EAAE,MAAM,iCAAiC,CAAC;AAC5E,OAAO,EAAE,oBAAoB,EAAE,MAAM,4BAA4B,CAAC;AAClE,OAAO,EAAE,2BAA2B,EAAE,MAAM,mCAAmC,CAAC;AAChF,OAAO,EAAE,oBAAoB,EAAE,MAAM,4BAA4B,CAAC;AAClE,OAAO,EAAE,oBAAoB,EAAE,MAAM,4BAA4B,CAAC;AAClE,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAC9D,OAAO,EAAE,qBAAqB,EAAE,MAAM,6BAA6B,CAAC;AACpE,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAI9C,MAAM,aAAa,GAAgC;IACjD,yBAAyB,EAAE,6BAA6B;IACxD,sBAAsB,EAAE,0BAA0B;IAClD,YAAY,EAAE,iBAAiB;IAC/B,YAAY,EAAE,iBAAiB;IAC/B,aAAa,EAAE,kBAAkB;IACjC,kBAAkB,EAAE,qBAAqB;IACzC,uBAAuB,EAAE,2BAA2B;IACpD,wBAAwB,EAAE,4BAA4B;IACtD,qBAAqB,EAAE,yBAAyB;IAChD,YAAY,EAAE,iBAAiB;IAC/B,qBAAqB,EAAE,yBAAyB;IAChD,WAAW,EAAE,gBAAgB;IAC7B,oBAAoB,EAAE,yBAAyB;IAC/C,qBAAqB,EAAE,yBAAyB;IAChD,eAAe,EAAE,mBAAmB;IACpC,kBAAkB,EAAE,sBAAsB;IAC1C,eAAe,EAAE,oBAAoB;IACrC,sBAAsB,EAAE,0BAA0B;IAClD,YAAY,EAAE,iBAAiB;IAC/B,kBAAkB,EAAE,sBAAsB;IAC1C,mBAAmB,EAAE,uBAAuB;IAC5C,qBAAqB,EAAE,yBAAyB;IAChD,oBAAoB,EAAE,wBAAwB;IAC9C,aAAa,EAAE,iBAAiB;IAChC,aAAa,EAAE,iBAAiB;IAChC,sBAAsB,EAAE,kBAAkB;IAC1C,aAAa,EAAE,iBAAiB;IAChC,oBAAoB,EAAE,wBAAwB;IAC9C,gBAAgB,EAAE,oBAAoB;IACtC,gBAAgB,EAAE,oBAAoB;IACtC,mBAAmB,EAAE,uBAAuB;IAC5C,gBAAgB,EAAE,oBAAoB;IACtC,wBAAwB,EAAE,2BAA2B;CACtD,CAAC;AAEF,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC;IAC1B,wBAAwB;IACxB,cAAc;IACd,cAAc;IACd,eAAe;IACf,oBAAoB;IACpB,oBAAoB;IACpB,kBAAkB;IAClB,qBAAqB;CACtB,CAAC,CAAC;AAEH;sFACsF;AACtF,MAAM,UAAU,WAAW,CAAC,IAAY;IACtC,OAAO,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;AAC/B,CAAC;AAED,SAAS,cAAc,CAAC,KAAc;IACpC,OAAO,CAAC,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,SAAS,IAAI,KAAK,IAAI,WAAW,IAAI,KAAK,IAAI,OAAO,IAAI,KAAK,CAAC;AAChH,CAAC;AAED,MAAM,UAAU,eAAe;IAC7B,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,IAAI,EAAE,CAAC;IAChD,OAAO;QACL,KAAK,EAAE,KAAK,CAAC,MAAM;QACnB,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;YAC1B,IAAI;YACJ,KAAK,EAAE,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC;YAC5B,OAAO,EAAE,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,OAAO,CAAC,GAAG,CAAC,mBAAmB,KAAK,MAAM;SAC9E,CAAC,CAAC;KACJ,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,QAAgB,EAAE,MAAe;IACtE,MAAM,OAAO,GAAG,aAAa,CAAC,QAAQ,CAAC,CAAC;IACxC,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,IAAI,CAAC,cAAc,EAAE,2BAA2B,QAAQ,IAAI,EAAE,KAAK,EAAE,cAAc,CAAC,CAAC;IAC9F,CAAC;IAED,IAAI,WAAW,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,OAAO,CAAC,GAAG,CAAC,mBAAmB,KAAK,MAAM,EAAE,CAAC;QAC5E,OAAO,IAAI,CACT,sBAAsB,EACtB,GAAG,QAAQ,kGAAkG,EAC7G,KAAK,EACL,cAAc,CACf,CAAC;IACJ,CAAC;IAED,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACzB,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC;QAC3C,QAAQ,CAAC;YACP,EAAE,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YAC5B,IAAI,EAAE,QAAQ,QAAQ,EAAE;YACxB,OAAO,EAAE,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI;YACvD,SAAS,EAAE,cAAc,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS;YACpF,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK;SAC/B,CAAC,CAAC;QACH,OAAO,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC;IACtD,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACjE,QAAQ,CAAC;YACP,EAAE,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YAC5B,IAAI,EAAE,QAAQ,QAAQ,EAAE;YACxB,OAAO,EAAE,KAAK;YACd,SAAS,EAAE,uBAAuB;YAClC,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK;SAC/B,CAAC,CAAC;QACH,OAAO,IAAI,CAAC,uBAAuB,EAAE,qBAAqB,CAAC,OAAO,EAAE,wBAAwB,CAAC,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC;IAClH,CAAC;AACH,CAAC"}
@@ -0,0 +1,74 @@
1
+ import { z } from "zod";
2
+ import type { ReadOnlyChainAccess } from "../lib/analysis/index.js";
3
+ import type { AgentRouteOptions } from "./agentRoutes.js";
4
+ declare const walletPrepareSchema: 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
+ /** Wallet context read from the request — provided by the frontend/SDK/CLI/agent host. */
10
+ userAddress: z.ZodOptional<z.ZodString>;
11
+ from: z.ZodOptional<z.ZodString>;
12
+ }, "passthrough", z.ZodTypeAny, z.objectOutputType<{
13
+ to: z.ZodString;
14
+ data: z.ZodOptional<z.ZodString>;
15
+ value: z.ZodOptional<z.ZodString>;
16
+ chainId: z.ZodOptional<z.ZodNumber>;
17
+ /** Wallet context read from the request — provided by the frontend/SDK/CLI/agent host. */
18
+ userAddress: z.ZodOptional<z.ZodString>;
19
+ from: z.ZodOptional<z.ZodString>;
20
+ }, z.ZodTypeAny, "passthrough">, z.objectInputType<{
21
+ to: z.ZodString;
22
+ data: z.ZodOptional<z.ZodString>;
23
+ value: z.ZodOptional<z.ZodString>;
24
+ chainId: z.ZodOptional<z.ZodNumber>;
25
+ /** Wallet context read from the request — provided by the frontend/SDK/CLI/agent host. */
26
+ userAddress: z.ZodOptional<z.ZodString>;
27
+ from: z.ZodOptional<z.ZodString>;
28
+ }, z.ZodTypeAny, "passthrough">>;
29
+ export type WalletPrepareInput = z.input<typeof walletPrepareSchema>;
30
+ /** UX hint for the caller/host — never a substitute for the public decision. */
31
+ export type WalletNextAction = "CONNECT_WALLET_OR_PROVIDE_ADDRESS" | "SIGN_IN_EXTERNAL_WALLET" | "REVIEW_FIRST" | "STOP";
32
+ /**
33
+ * POST /wallet/prepare — SafeHands-checked, wallet-ready transaction handoff.
34
+ * - Missing wallet context → `requiresWalletConnection: true`,
35
+ * `nextAction: CONNECT_WALLET_OR_PROVIDE_ADDRESS`, no `walletRequest`.
36
+ * - Provided wallet + not blocked → `walletRequest` {from,to,data,value,chainId}.
37
+ * - BLOCK → no `walletRequest`, `nextAction: STOP`.
38
+ * - REQUIRE_CONFIRMATION → `confirmationRequired: true`, `nextAction: REVIEW_FIRST`.
39
+ */
40
+ export declare function handleWalletPrepare(raw: unknown, access?: ReadOnlyChainAccess, opts?: AgentRouteOptions): Promise<{
41
+ readOnly: true;
42
+ executionAvailable: boolean;
43
+ decision: import("../lib/guardian/decision.js").GuardianDecision;
44
+ guardianDecision: import("../lib/guardian/decision.js").GuardianDecision;
45
+ riskLevel: import("../lib/analysis/types.js").AnalyzerRiskLevel;
46
+ reasons: string[];
47
+ /** True when no wallet context was provided and the action is not blocked. */
48
+ requiresWalletConnection: boolean;
49
+ /** True when the underlying verdict needs explicit user review before signing. */
50
+ confirmationRequired: boolean;
51
+ /** UX hint for the host/client. */
52
+ nextAction: WalletNextAction;
53
+ /** Wallet-ready request for an EXTERNAL wallet (null when blocked or no wallet). */
54
+ walletRequest: {
55
+ from: string;
56
+ to: `0x${string}`;
57
+ data: string;
58
+ value: string;
59
+ chainId: number;
60
+ } | null;
61
+ preparedTransactionId: string | undefined;
62
+ preparedTransactionHash: string | undefined;
63
+ network: import("../lib/networks.js").NetworkName;
64
+ chainId: number;
65
+ policyPreset: string | null;
66
+ policyVersion: string;
67
+ /** SafeHands signs nothing and broadcasts nothing — the external wallet does both. */
68
+ signingAvailable: boolean;
69
+ broadcastAvailable: boolean;
70
+ nextStep: string;
71
+ source: string;
72
+ }>;
73
+ export {};
74
+ //# sourceMappingURL=walletPrepareRoutes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"walletPrepareRoutes.d.ts","sourceRoot":"","sources":["../../src/api/walletPrepareRoutes.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;AAO1D,QAAA,MAAM,mBAAmB;;;;;IAMrB,0FAA0F;;;;;;;;IAA1F,0FAA0F;;;;;;;;IAA1F,0FAA0F;;;gCAI9E,CAAC;AAEjB,MAAM,MAAM,kBAAkB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAC;AAErE,gFAAgF;AAChF,MAAM,MAAM,gBAAgB,GACxB,mCAAmC,GACnC,yBAAyB,GACzB,cAAc,GACd,MAAM,CAAC;AAEX;;;;;;;GAOG;AACH,wBAAsB,mBAAmB,CACvC,GAAG,EAAE,OAAO,EACZ,MAAM,CAAC,EAAE,mBAAmB,EAC5B,IAAI,GAAE,iBAAsB;;;;;;;IAqF1B,8EAA8E;;IAE9E,kFAAkF;;IAElF,mCAAmC;;IAEnC,oFAAoF;;cA1DvD,MAAM;;;;;;;;;;;;IAkEnC,sFAAsF;;;;;GAOzF"}
@@ -0,0 +1,127 @@
1
+ // ─── SafeHands API — Wallet-Ready Transaction Handoff ──
2
+ // Prepares a WALLET-READY transaction request for an EXTERNAL wallet to sign and
3
+ // send. Wallet connection happens OUTSIDE SafeHands (frontend/dApp, SDK userAddress,
4
+ // CLI --from, or MCP/agent host) — SafeHands only READS the wallet context from the
5
+ // request. It runs the SafeHands check on the intent and, when the caller supplied a
6
+ // wallet address and the action is not blocked, returns a `walletRequest`
7
+ // {from,to,data,value,chainId} for external signing/sending.
8
+ //
9
+ // SafeHands NEVER signs, NEVER broadcasts, NEVER creates or manages a wallet, and
10
+ // holds NO key. Read-only by construction: no signer/wallet/send primitive 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
+ import { savePreparedTx } from "../lib/preparedTxStore.js";
18
+ const ZERO_ADDRESS = "0x0000000000000000000000000000000000000000";
19
+ const walletPrepareSchema = z
20
+ .object({
21
+ to: z.string(),
22
+ data: z.string().optional(),
23
+ value: z.string().optional(),
24
+ chainId: z.number().optional(),
25
+ /** Wallet context read from the request — provided by the frontend/SDK/CLI/agent host. */
26
+ userAddress: z.string().optional(),
27
+ from: z.string().optional(),
28
+ })
29
+ .passthrough(); // policyPreset / policy are read by the server (agentPolicyOpts)
30
+ /**
31
+ * POST /wallet/prepare — SafeHands-checked, wallet-ready transaction handoff.
32
+ * - Missing wallet context → `requiresWalletConnection: true`,
33
+ * `nextAction: CONNECT_WALLET_OR_PROVIDE_ADDRESS`, no `walletRequest`.
34
+ * - Provided wallet + not blocked → `walletRequest` {from,to,data,value,chainId}.
35
+ * - BLOCK → no `walletRequest`, `nextAction: STOP`.
36
+ * - REQUIRE_CONFIRMATION → `confirmationRequired: true`, `nextAction: REVIEW_FIRST`.
37
+ */
38
+ export async function handleWalletPrepare(raw, access, opts = {}) {
39
+ const input = walletPrepareSchema.parse(raw);
40
+ if (!isAddress(input.to))
41
+ throw new Error("`to` must be a valid address.");
42
+ if (input.to === ZERO_ADDRESS)
43
+ throw new Error("`to` must not be the zero address.");
44
+ if (input.data !== undefined && !/^0x[0-9a-fA-F]*$/.test(input.data)) {
45
+ throw new Error("`data` must be 0x-prefixed hex.");
46
+ }
47
+ if (input.value !== undefined) {
48
+ const n = Number(input.value);
49
+ if (!Number.isFinite(n) || n < 0)
50
+ throw new Error("`value` must be a non-negative number.");
51
+ }
52
+ // Wallet context is read-only: SafeHands echoes it, never derives or stores a key.
53
+ const walletAddress = (input.userAddress ?? input.from)?.trim();
54
+ const hasWallet = typeof walletAddress === "string" && walletAddress.length > 0;
55
+ if (hasWallet && !isAddress(walletAddress)) {
56
+ throw new Error("`userAddress`/`from` must be a valid address.");
57
+ }
58
+ const network = getActiveNetwork();
59
+ const chainId = input.chainId ?? network.chainId;
60
+ // Real escalate-only SafeHands check on the intent — a BLOCK is never weakened.
61
+ const agent = createGuardianAgent({ access, policy: opts.policy, policyPreset: opts.policyPreset });
62
+ const verdict = await agent.check({ to: input.to, data: input.data, value: input.value, chainId });
63
+ const blocked = verdict.decision === "BLOCK";
64
+ const confirmationRequired = verdict.decision === "REQUIRE_CONFIRMATION";
65
+ // A wallet-ready request is produced ONLY when not blocked AND a wallet address is present.
66
+ const walletRequest = !blocked && hasWallet
67
+ ? {
68
+ from: walletAddress,
69
+ to: input.to,
70
+ data: input.data ?? "0x",
71
+ value: input.value ?? "0",
72
+ chainId,
73
+ }
74
+ : null;
75
+ let preparedTransactionId;
76
+ let preparedTransactionHash;
77
+ if (walletRequest) {
78
+ const record = savePreparedTx(walletRequest.from, walletRequest.to, walletRequest.data, walletRequest.value, walletRequest.chainId, verdict.decision, verdict.policyVersion ?? null, verdict.policyPreset ?? null);
79
+ preparedTransactionId = record.id;
80
+ preparedTransactionHash = record.hash;
81
+ }
82
+ // requiresWalletConnection only matters when the action could proceed (not blocked).
83
+ const requiresWalletConnection = !blocked && !hasWallet;
84
+ // nextAction priority: STOP (block) > CONNECT (no wallet) > REVIEW (confirm) > SIGN.
85
+ const nextAction = blocked
86
+ ? "STOP"
87
+ : !hasWallet
88
+ ? "CONNECT_WALLET_OR_PROVIDE_ADDRESS"
89
+ : confirmationRequired
90
+ ? "REVIEW_FIRST"
91
+ : "SIGN_IN_EXTERNAL_WALLET";
92
+ const nextStep = blocked
93
+ ? "Do not proceed: the action is unsafe. Surface the block reason; no wallet request is produced."
94
+ : !hasWallet
95
+ ? "Connect a wallet (or provide userAddress/from), then call again to receive a wallet-ready request."
96
+ : confirmationRequired
97
+ ? "Review the request, then sign and send it from your own external wallet. SafeHands does not sign or broadcast."
98
+ : "Sign and send the wallet request from your own external wallet. SafeHands holds no keys and does not broadcast.";
99
+ return {
100
+ // Public four-value decision contract.
101
+ decision: verdict.decision,
102
+ guardianDecision: verdict.decision,
103
+ riskLevel: verdict.riskLevel,
104
+ reasons: verdict.reasons,
105
+ /** True when no wallet context was provided and the action is not blocked. */
106
+ requiresWalletConnection,
107
+ /** True when the underlying verdict needs explicit user review before signing. */
108
+ confirmationRequired,
109
+ /** UX hint for the host/client. */
110
+ nextAction,
111
+ /** Wallet-ready request for an EXTERNAL wallet (null when blocked or no wallet). */
112
+ walletRequest,
113
+ preparedTransactionId,
114
+ preparedTransactionHash,
115
+ network: getActiveNetworkName(),
116
+ chainId,
117
+ policyPreset: verdict.policyPreset ?? null,
118
+ policyVersion: verdict.policyVersion ?? null,
119
+ /** SafeHands signs nothing and broadcasts nothing — the external wallet does both. */
120
+ signingAvailable: false,
121
+ broadcastAvailable: false,
122
+ nextStep,
123
+ source: "wallet_prepare",
124
+ ...readOnlyMeta(), // readOnly: true, executionAvailable: false
125
+ };
126
+ }
127
+ //# sourceMappingURL=walletPrepareRoutes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"walletPrepareRoutes.js","sourceRoot":"","sources":["../../src/api/walletPrepareRoutes.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,51 @@
1
+ import type express from "express";
2
+ /** The additive paid bundle entrypoints. Existing free routes are never listed here. */
3
+ export declare const PAID_ROUTE_PATHS: readonly ["/paid/assess-risk", "/paid/check-token-security", "/paid/simulate-transaction", "/paid/token-price", "/paid/pool-info", "/paid/swap-route", "/paid/risk-report"];
4
+ type Env = Record<string, string | undefined>;
5
+ export interface X402GateConfig {
6
+ /** True only when BOTH a receiver (payTo) and an external facilitator URL are set. */
7
+ configured: boolean;
8
+ /** Receive-only address for earned fees (X402_PAY_TO / WALLET_ADDRESS). */
9
+ payTo: string;
10
+ /** External facilitator (relayer) base URL — verification/settlement happen off-host. */
11
+ facilitatorUrl: string | null;
12
+ /** Price per paid call, in USDC-equivalent human units (default 0.01). */
13
+ priceUsdc: string;
14
+ /** x402 network id, e.g. eip155:688689. */
15
+ network: `${string}:${string}`;
16
+ /** ERC-20 used for payment (mirrors X402_PAYMENT_TOKEN_ADDRESS). */
17
+ paymentTokenAddress: string;
18
+ /** Replay-protection window in ms (mirrors x402Server default: 10 minutes). */
19
+ replayWindowMs: number;
20
+ }
21
+ /**
22
+ * Resolve the x402 gate config from env. REMOTE facilitator only — the single service
23
+ * never holds a key. `configured` requires payTo AND facilitatorUrl; anything else leaves
24
+ * the gate unconfigured so `/paid/*` fails closed. Pure + offline (tests pass synthetic env).
25
+ */
26
+ export declare function resolveX402GateConfig(env?: Env): X402GateConfig;
27
+ /**
28
+ * Client-facing message for a replay-store failure. Raw store errors can
29
+ * carry internals — Upstash REST error strings, the Redis hostname from a DNS
30
+ * failure, or state-dir filesystem paths — so production gets a generic
31
+ * message; the detail stays in server-side logs (and in dev responses).
32
+ * Exported for offline tests.
33
+ */
34
+ export declare function replayStoreUnavailableMessage(err: unknown, production?: boolean): string;
35
+ export interface X402Gate {
36
+ configured: boolean;
37
+ /**
38
+ * Install the gate on the app. When configured: replay → x402 paymentMiddleware on
39
+ * `/paid/*` (so the handler runs ONLY after a verified, non-replayed payment). When
40
+ * unconfigured: a fail-closed 503 guard on `/paid/*`. Must be installed BEFORE the
41
+ * paid route handlers so payment is verified first.
42
+ */
43
+ install(app: express.Application): void;
44
+ }
45
+ /**
46
+ * Build the x402 gate for the single service. Zero-custody: uses a remote facilitator
47
+ * client (X402_FACILITATOR_URL) for verify/settle; no local signer, no key, no wallet.
48
+ */
49
+ export declare function buildX402Gate(cfg?: X402GateConfig): X402Gate;
50
+ export {};
51
+ //# sourceMappingURL=x402Gate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"x402Gate.d.ts","sourceRoot":"","sources":["../../src/api/x402Gate.ts"],"names":[],"mappings":"AAsBA,OAAO,KAAK,OAAO,MAAM,SAAS,CAAC;AAiBnC,wFAAwF;AACxF,eAAO,MAAM,gBAAgB,6KAQnB,CAAC;AAEX,KAAK,GAAG,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC;AAE9C,MAAM,WAAW,cAAc;IAC7B,sFAAsF;IACtF,UAAU,EAAE,OAAO,CAAC;IACpB,2EAA2E;IAC3E,KAAK,EAAE,MAAM,CAAC;IACd,yFAAyF;IACzF,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,0EAA0E;IAC1E,SAAS,EAAE,MAAM,CAAC;IAClB,2CAA2C;IAC3C,OAAO,EAAE,GAAG,MAAM,IAAI,MAAM,EAAE,CAAC;IAC/B,oEAAoE;IACpE,mBAAmB,EAAE,MAAM,CAAC;IAC5B,+EAA+E;IAC/E,cAAc,EAAE,MAAM,CAAC;CACxB;AAED;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,GAAG,GAAE,GAAiB,GAAG,cAAc,CAe5E;AAgCD;;;;;;GAMG;AACH,wBAAgB,6BAA6B,CAC3C,GAAG,EAAE,OAAO,EACZ,UAAU,GAAE,OAA+C,GAC1D,MAAM,CAIR;AAyED,MAAM,WAAW,QAAQ;IACvB,UAAU,EAAE,OAAO,CAAC;IACpB;;;;;OAKG;IACH,OAAO,CAAC,GAAG,EAAE,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC;CACzC;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,GAAG,GAAE,cAAwC,GAAG,QAAQ,CAsBrF"}
@@ -0,0 +1,184 @@
1
+ // ─── SafeHands API — x402 Payment Gate (zero-custody) ─────────────
2
+ // Adds real x402 gating to the SINGLE deployed service (dist/api/server.js) for
3
+ // the additive `/paid/*` bundle entrypoints — WITHOUT breaking the free public
4
+ // read API and WITHOUT putting a signing/facilitator key on the host.
5
+ //
6
+ // Zero-custody posture (WALLET_MODE=none):
7
+ // • The service holds NO private key. Verification + settlement are delegated to
8
+ // an EXTERNAL facilitator via X402_FACILITATOR_URL (a relayer that runs off-host).
9
+ // • X402_PAY_TO is a RECEIVE-only address for earned fees — not custody of user funds.
10
+ // • When receiver + facilitator config is absent, `/paid/*` is FAIL-CLOSED (503):
11
+ // the paid handler NEVER runs before payment is verified.
12
+ //
13
+ // Charge-once model: gating happens at the HTTP entrypoint only. A `/paid/*` route
14
+ // may fan out to several internal analyzers/tools in-process (e.g. /paid/risk-report),
15
+ // but the single verified X-PAYMENT settles exactly once. Internal helper tools are
16
+ // never individually gated. Replay protection (checkAndRecordX402Replay) guarantees the
17
+ // same payment authorization cannot buy a second call.
18
+ //
19
+ // Pure/env-driven config resolver (resolveX402GateConfig) is offline-testable; the gate
20
+ // installer only touches the Express app. Nothing here signs, sends, or creates a wallet.
21
+ // ────────────────────────────────────────────────────────────────────────────
22
+ import { ExactEvmScheme as ServerExactEvmScheme } from "@x402/evm/exact/server";
23
+ import { HTTPFacilitatorClient } from "@x402/core/server";
24
+ import { paymentMiddleware, x402ResourceServer } from "@x402/express";
25
+ import { CHAIN_ID, X402_PAYMENT_TOKEN_ADDRESS, PACIFIC_WPROS_ADDRESS, WPROS_ADDRESS, activeTokenDecimals, } from "../lib/constants.js";
26
+ import { fail } from "../lib/toolResponse.js";
27
+ import { checkAndRecordX402Replay } from "../lib/x402ReplayStore.js";
28
+ const SOURCE = "guardian_api_x402";
29
+ /** The additive paid bundle entrypoints. Existing free routes are never listed here. */
30
+ export const PAID_ROUTE_PATHS = [
31
+ "/paid/assess-risk",
32
+ "/paid/check-token-security",
33
+ "/paid/simulate-transaction",
34
+ "/paid/token-price",
35
+ "/paid/pool-info",
36
+ "/paid/swap-route",
37
+ "/paid/risk-report",
38
+ ];
39
+ /**
40
+ * Resolve the x402 gate config from env. REMOTE facilitator only — the single service
41
+ * never holds a key. `configured` requires payTo AND facilitatorUrl; anything else leaves
42
+ * the gate unconfigured so `/paid/*` fails closed. Pure + offline (tests pass synthetic env).
43
+ */
44
+ export function resolveX402GateConfig(env = process.env) {
45
+ const payTo = (env.X402_PAY_TO || env.WALLET_ADDRESS || "").trim();
46
+ const facilitatorUrl = (env.X402_FACILITATOR_URL || "").trim() || null;
47
+ const priceUsdc = (env.X402_PRICE_USDC || "0.01").trim();
48
+ const replayWindowMs = Number(env.SAFEHANDS_X402_REPLAY_WINDOW_MS || 10 * 60 * 1000);
49
+ const configured = Boolean(payTo && facilitatorUrl);
50
+ return {
51
+ configured,
52
+ payTo,
53
+ facilitatorUrl,
54
+ priceUsdc,
55
+ network: `eip155:${CHAIN_ID}`,
56
+ paymentTokenAddress: X402_PAYMENT_TOKEN_ADDRESS,
57
+ replayWindowMs: Number.isFinite(replayWindowMs) && replayWindowMs > 0 ? replayWindowMs : 10 * 60 * 1000,
58
+ };
59
+ }
60
+ /** Fail-closed guard: paid routes return 503 (handler never runs) when x402 is unconfigured. */
61
+ function unconfiguredGuard(_req, res) {
62
+ res.status(503).json(fail("X402_SERVER_RECEIVER_CONFIG_MISSING", "Paid endpoints require an x402 receiver (X402_PAY_TO) plus an external facilitator (X402_FACILITATOR_URL). " +
63
+ "Free endpoints remain available. The zero-custody service holds no signing key.", false, SOURCE));
64
+ }
65
+ /**
66
+ * x402 X-PAYMENT is base64-encoded JSON. Reject obvious junk BEFORE recording it in
67
+ * the replay store: each store write is an O(n) full-file rewrite, so without
68
+ * this an attacker could flood `/paid/*` with unique random headers and grow the
69
+ * store / burn CPU+disk. A malformed header would fail downstream verification
70
+ * anyway; dropping it here just avoids the write. Legitimate payments decode fine.
71
+ */
72
+ function looksLikeX402Payment(header) {
73
+ if (header.length > 8192)
74
+ return false;
75
+ try {
76
+ const parsed = JSON.parse(Buffer.from(header, "base64").toString("utf-8"));
77
+ return !!parsed && typeof parsed === "object";
78
+ }
79
+ catch {
80
+ return false;
81
+ }
82
+ }
83
+ /**
84
+ * Client-facing message for a replay-store failure. Raw store errors can
85
+ * carry internals — Upstash REST error strings, the Redis hostname from a DNS
86
+ * failure, or state-dir filesystem paths — so production gets a generic
87
+ * message; the detail stays in server-side logs (and in dev responses).
88
+ * Exported for offline tests.
89
+ */
90
+ export function replayStoreUnavailableMessage(err, production = process.env.NODE_ENV === "production") {
91
+ if (production)
92
+ return "x402 replay store is temporarily unavailable.";
93
+ const message = err instanceof Error ? err.message : String(err);
94
+ return `x402 replay store unavailable: ${message}`;
95
+ }
96
+ /** Durable replay protection: reject a reused X-PAYMENT authorization before settlement. */
97
+ function buildReplayMiddleware(cfg) {
98
+ return function replayProtectionMiddleware(req, res, next) {
99
+ const paymentHeader = req.headers["x-payment"];
100
+ if (typeof paymentHeader !== "string" || paymentHeader.length <= 10)
101
+ return next();
102
+ // Pre-filter malformed headers so junk floods can't grow the O(n) replay store.
103
+ if (!looksLikeX402Payment(paymentHeader)) {
104
+ res
105
+ .status(400)
106
+ .json(fail("X402_PAYMENT_MALFORMED", "X-PAYMENT header is not a valid x402 payment payload.", false, SOURCE));
107
+ return;
108
+ }
109
+ checkAndRecordX402Replay(paymentHeader, cfg.replayWindowMs)
110
+ .then((result) => {
111
+ res.setHeader("X-SafeHands-X402-Replay-Store", result.backend);
112
+ if (!result.allowed) {
113
+ res
114
+ .status(402)
115
+ .json(fail("REPLAY_ATTACK_DETECTED", "This x402 payment signature has already been used.", false, SOURCE));
116
+ return;
117
+ }
118
+ next();
119
+ })
120
+ .catch((err) => {
121
+ console.error("[SafeHands x402] replay store unavailable:", err instanceof Error ? err.message : String(err));
122
+ res
123
+ .status(503)
124
+ .json(fail("X402_REPLAY_STORE_UNAVAILABLE", replayStoreUnavailableMessage(err), true, SOURCE));
125
+ });
126
+ };
127
+ }
128
+ /** Money parser: convert the human price into the atomic amount + asset for the exact scheme. */
129
+ function buildMoneyParser(cfg) {
130
+ return async (amount, network) => {
131
+ if (network !== cfg.network)
132
+ return null;
133
+ const decimals = activeTokenDecimals()[cfg.paymentTokenAddress.toLowerCase()] || 6;
134
+ const multiplier = Math.pow(10, decimals);
135
+ const isWpros = cfg.paymentTokenAddress.toLowerCase() === PACIFIC_WPROS_ADDRESS.toLowerCase() ||
136
+ cfg.paymentTokenAddress.toLowerCase() === WPROS_ADDRESS.toLowerCase();
137
+ const symbol = isWpros ? "WPROS" : "USDC";
138
+ return {
139
+ amount: Math.round(amount * multiplier).toString(),
140
+ asset: cfg.paymentTokenAddress,
141
+ extra: { token: symbol, name: symbol, version: "2" },
142
+ };
143
+ };
144
+ }
145
+ /** paymentMiddleware route map: each paid entrypoint priced independently, settled once. */
146
+ function buildRouteConfig(cfg) {
147
+ const accepts = { scheme: "exact", price: cfg.priceUsdc, network: cfg.network, payTo: cfg.payTo };
148
+ const entry = (description) => ({ accepts, description, mimeType: "application/json" });
149
+ return {
150
+ "GET /paid/assess-risk": entry(`Assess transaction risk (USDC ${cfg.priceUsdc})`),
151
+ "GET /paid/check-token-security": entry(`Verify contract token security profile (USDC ${cfg.priceUsdc})`),
152
+ "GET /paid/simulate-transaction": entry(`Simulate EVM execution before broadcast (USDC ${cfg.priceUsdc})`),
153
+ "GET /paid/token-price": entry(`Real-time token price via DODO/FaroSwap (USDC ${cfg.priceUsdc})`),
154
+ "GET /paid/pool-info": entry(`DODO/FaroSwap pool data: ratio, impact, fees (USDC ${cfg.priceUsdc})`),
155
+ "GET /paid/swap-route": entry(`Swap route with estimated output via DODO (USDC ${cfg.priceUsdc})`),
156
+ "GET /paid/risk-report": entry(`Full SafeHands risk report bundle (USDC ${cfg.priceUsdc})`),
157
+ };
158
+ }
159
+ /**
160
+ * Build the x402 gate for the single service. Zero-custody: uses a remote facilitator
161
+ * client (X402_FACILITATOR_URL) for verify/settle; no local signer, no key, no wallet.
162
+ */
163
+ export function buildX402Gate(cfg = resolveX402GateConfig()) {
164
+ return {
165
+ configured: cfg.configured,
166
+ install(app) {
167
+ const paths = PAID_ROUTE_PATHS;
168
+ if (!cfg.configured) {
169
+ app.use(paths, unconfiguredGuard);
170
+ return;
171
+ }
172
+ // 1) Replay protection first — a reused authorization is rejected before settlement.
173
+ app.use(paths, buildReplayMiddleware(cfg));
174
+ // 2) x402 gate via an EXTERNAL facilitator (relayer runs off-host; service holds no key).
175
+ const facilitatorClient = new HTTPFacilitatorClient({ url: cfg.facilitatorUrl });
176
+ const resourceServer = new x402ResourceServer(facilitatorClient);
177
+ const evmScheme = new ServerExactEvmScheme();
178
+ evmScheme.registerMoneyParser(buildMoneyParser(cfg));
179
+ resourceServer.register(cfg.network, evmScheme);
180
+ app.use(paymentMiddleware(buildRouteConfig(cfg), resourceServer));
181
+ },
182
+ };
183
+ }
184
+ //# sourceMappingURL=x402Gate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"x402Gate.js","sourceRoot":"","sources":["../../src/api/x402Gate.ts"],"names":[],"mappings":"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"}