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
@@ -1,38 +1,53 @@
1
1
  // ─── Tool: token_registry_status ───────────────────────────────────────
2
- // Classify exact token addresses without silently replacing user input.
3
- // The official Pharos Skill Engine (pharos-skill-engine-0.1.0)
4
- // assets/tokens.json lists 0xE0BE... as USDC for atlantic-testnet.
2
+ // Classify exact token inputs against the active network token registry.
3
+ // Pacific Mainnet uses PACIFIC_MAINNET_TOKEN_REGISTRY; Atlantic Testnet keeps
4
+ // the legacy testnet registry for compatibility.
5
5
  // ───────────────────────────────────────────────────────────────────────
6
6
  import { z } from "zod";
7
7
  import { getAddress, isAddress } from "viem";
8
8
  import { ok } from "../lib/toolResponse.js";
9
- import { TOKEN_REGISTRY, CIRCLE_USDC_ADDRESS, CHAIN_ID, PHAROS_ENVIRONMENT } from "../lib/constants.js";
9
+ import { TOKEN_REGISTRY, CIRCLE_USDC_ADDRESS, CHAIN_ID, PHAROS_ENVIRONMENT, IS_MAINNET, PACIFIC_MAINNET_TOKEN_REGISTRY, } from "../lib/constants.js";
10
+ import { getActiveNetwork } from "../lib/networks.js";
11
+ import { fetchGoplusTokenIdentity } from "./checkTokenSecurity.js";
10
12
  export const tokenRegistryStatusSchema = z.object({
11
13
  token: z.string().optional().describe("Token symbol or exact contract address to classify"),
12
14
  tokenAddress: z.string().optional().describe("Exact token contract address to classify"),
13
15
  });
16
+ function activeRegistry() {
17
+ return getActiveNetwork().isMainnet
18
+ ? PACIFIC_MAINNET_TOKEN_REGISTRY
19
+ : TOKEN_REGISTRY;
20
+ }
14
21
  function deriveStatus(match) {
22
+ if (getActiveNetwork().isMainnet || match.isMainnet)
23
+ return "CANONICAL_MAINNET_TOKEN";
15
24
  if (match.verificationStatus === "DOCS_VERIFIED_FROM_PHAROS_SKILL_ENGINE")
16
25
  return "SKILL_ENGINE_CANONICAL_TOKEN";
17
26
  if (match.verificationStatus === "CIRCLE_REFERENCED_USDC")
18
27
  return "ALTERNATE_SOURCE_TOKEN";
19
- return "CANONICAL_TESTNET_TOKEN";
28
+ return "CANONICAL_MAINNET_TOKEN";
29
+ }
30
+ function responseBase() {
31
+ return {
32
+ chainId: CHAIN_ID,
33
+ environment: PHAROS_ENVIRONMENT,
34
+ isMainnet: IS_MAINNET,
35
+ };
20
36
  }
21
37
  export function classifyTokenRegistryStatus(token) {
22
38
  const raw = token.trim();
23
39
  const upper = raw.toUpperCase();
24
- const bySymbol = TOKEN_REGISTRY[upper];
40
+ const registry = activeRegistry();
41
+ const bySymbol = registry[upper];
25
42
  if (bySymbol) {
26
43
  return {
27
44
  input: token,
28
45
  normalizedAddress: bySymbol.address,
29
46
  symbol: bySymbol.symbol,
30
47
  status: deriveStatus(bySymbol),
31
- verificationStatus: bySymbol.verificationStatus || (bySymbol.isCanonical ? "PROJECT_CONFIGURED" : "UNVERIFIED_CONFIG_VALUE"),
32
- docsSource: bySymbol.docsSource || "project constants",
33
- chainId: CHAIN_ID,
34
- environment: PHAROS_ENVIRONMENT,
35
- isMainnet: false,
48
+ verificationStatus: bySymbol.verificationStatus || (bySymbol.isCanonical ? "DOCS_VERIFIED" : "UNVERIFIED_CONFIG_VALUE"),
49
+ docsSource: bySymbol.docsSource || "active network token registry",
50
+ ...responseBase(),
36
51
  };
37
52
  }
38
53
  if (!isAddress(raw)) {
@@ -40,16 +55,14 @@ export function classifyTokenRegistryStatus(token) {
40
55
  input: token,
41
56
  normalizedAddress: null,
42
57
  symbol: null,
43
- status: "INVALID_ADDRESS",
44
- verificationStatus: "INVALID_ADDRESS",
58
+ status: (raw ? "UNKNOWN" : "INVALID_ADDRESS"),
59
+ verificationStatus: raw ? "UNKNOWN_SYMBOL" : "INVALID_ADDRESS",
45
60
  docsSource: null,
46
- chainId: CHAIN_ID,
47
- environment: PHAROS_ENVIRONMENT,
48
- isMainnet: false,
61
+ ...responseBase(),
49
62
  };
50
63
  }
51
64
  const checksum = getAddress(raw);
52
- const entries = Object.values(TOKEN_REGISTRY);
65
+ const entries = Object.values(registry);
53
66
  const match = entries.find((t) => t.address.toLowerCase() === checksum.toLowerCase());
54
67
  if (match) {
55
68
  return {
@@ -57,15 +70,14 @@ export function classifyTokenRegistryStatus(token) {
57
70
  normalizedAddress: checksum,
58
71
  symbol: match.symbol,
59
72
  status: deriveStatus(match),
60
- verificationStatus: match.verificationStatus || "PROJECT_CONFIGURED",
61
- docsSource: match.docsSource || "project constants",
62
- chainId: CHAIN_ID,
63
- environment: PHAROS_ENVIRONMENT,
64
- isMainnet: false,
73
+ verificationStatus: match.verificationStatus || (getActiveNetwork().isMainnet ? "DOCS_VERIFIED" : "PROJECT_CONFIGURED"),
74
+ docsSource: match.docsSource || "active network token registry",
75
+ ...responseBase(),
65
76
  };
66
77
  }
67
- // Check if it's the Circle USDC address directly (even if not primary)
68
- if (checksum.toLowerCase() === CIRCLE_USDC_ADDRESS.toLowerCase()) {
78
+ // Atlantic-only alternate USDC recognition. On Pacific Mainnet this old
79
+ // address is intentionally treated as custom/non-registry.
80
+ if (!getActiveNetwork().isMainnet && checksum.toLowerCase() === CIRCLE_USDC_ADDRESS.toLowerCase()) {
69
81
  return {
70
82
  input: token,
71
83
  normalizedAddress: checksum,
@@ -73,9 +85,7 @@ export function classifyTokenRegistryStatus(token) {
73
85
  status: "ALTERNATE_SOURCE_TOKEN",
74
86
  verificationStatus: "CIRCLE_REFERENCED_USDC",
75
87
  docsSource: "https://developers.circle.com/stablecoins/usdc-contract-addresses",
76
- chainId: CHAIN_ID,
77
- environment: PHAROS_ENVIRONMENT,
78
- isMainnet: false,
88
+ ...responseBase(),
79
89
  };
80
90
  }
81
91
  return {
@@ -85,13 +95,33 @@ export function classifyTokenRegistryStatus(token) {
85
95
  status: "CUSTOM_NON_REGISTRY",
86
96
  verificationStatus: "UNVERIFIED_CUSTOM_TOKEN",
87
97
  docsSource: null,
88
- chainId: CHAIN_ID,
89
- environment: PHAROS_ENVIRONMENT,
90
- isMainnet: false,
98
+ ...responseBase(),
91
99
  };
92
100
  }
93
101
  export async function handleTokenRegistryStatus(raw) {
94
102
  const input = tokenRegistryStatusSchema.parse(raw);
95
- return ok(classifyTokenRegistryStatus(input.tokenAddress || input.token || ""));
103
+ const classification = classifyTokenRegistryStatus(input.tokenAddress || input.token || "");
104
+ // For custom/non-registry tokens, best-effort DISPLAY-ONLY identity enrichment.
105
+ // Purely additive: status/verificationStatus/symbol are never altered, metadata
106
+ // is never fed into policy or gates (those consume classifyTokenRegistryStatus
107
+ // directly), and a fetch failure leaves the response identical to before.
108
+ if (classification.status !== "CUSTOM_NON_REGISTRY" || !classification.normalizedAddress) {
109
+ return ok(classification);
110
+ }
111
+ const identity = await fetchGoplusTokenIdentity(classification.normalizedAddress);
112
+ if (!identity.tokenName && !identity.tokenSymbol) {
113
+ return ok(classification);
114
+ }
115
+ return ok({
116
+ ...classification,
117
+ tokenMetadata: {
118
+ tokenName: identity.tokenName,
119
+ tokenSymbol: identity.tokenSymbol,
120
+ source: "goplus_metadata",
121
+ verified: false,
122
+ displayOnly: true,
123
+ warning: "Untrusted display-only metadata reported by a third-party API. It does NOT verify this token's identity and does NOT imply the token is safe. The token remains UNVERIFIED_CUSTOM_TOKEN; anyone can deploy a token with any name/symbol.",
124
+ },
125
+ });
96
126
  }
97
127
  //# sourceMappingURL=tokenRegistryStatus.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"tokenRegistryStatus.js","sourceRoot":"","sources":["../../src/tools/tokenRegistryStatus.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"tokenRegistryStatus.js","sourceRoot":"","sources":["../../src/tools/tokenRegistryStatus.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,59 @@
1
+ import { z } from "zod";
2
+ export declare const verifyRiskInclusionSchema: z.ZodObject<{
3
+ target: z.ZodString;
4
+ actionHash: z.ZodOptional<z.ZodString>;
5
+ verifyOnchain: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
6
+ }, "strip", z.ZodTypeAny, {
7
+ target: string;
8
+ verifyOnchain: boolean;
9
+ actionHash?: string | undefined;
10
+ }, {
11
+ target: string;
12
+ actionHash?: string | undefined;
13
+ verifyOnchain?: boolean | undefined;
14
+ }>;
15
+ export type VerifyRiskInclusionInput = z.input<typeof verifyRiskInclusionSchema>;
16
+ export declare const verifyRiskInclusionTool: {
17
+ name: string;
18
+ description: string;
19
+ inputSchema: z.ZodObject<{
20
+ target: z.ZodString;
21
+ actionHash: z.ZodOptional<z.ZodString>;
22
+ verifyOnchain: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
23
+ }, "strip", z.ZodTypeAny, {
24
+ target: string;
25
+ verifyOnchain: boolean;
26
+ actionHash?: string | undefined;
27
+ }, {
28
+ target: string;
29
+ actionHash?: string | undefined;
30
+ verifyOnchain?: boolean | undefined;
31
+ }>;
32
+ };
33
+ export declare function handleVerifyRiskInclusion(raw: VerifyRiskInclusionInput): Promise<import("../sdk.js").ToolFailure | import("../sdk.js").ToolSuccess<{
34
+ registryContract: string | null;
35
+ included: boolean;
36
+ configured: boolean;
37
+ committed: boolean;
38
+ onchainMerkleRoot: string | null;
39
+ dataURI: string | null;
40
+ found: boolean;
41
+ rootMatches: boolean;
42
+ verifiedLocal: boolean;
43
+ verifiedOnchain: boolean | null;
44
+ expired: boolean;
45
+ proof: string[] | null;
46
+ record: {
47
+ target: string;
48
+ actionHash: string;
49
+ score: number;
50
+ level: number;
51
+ recommendation: number;
52
+ policyVersionHash: string;
53
+ evidenceHash: string;
54
+ expiresAt: string;
55
+ } | null;
56
+ source: "onchain-view" | "local-only" | "unconfigured" | "not-committed" | "not-found" | "root-mismatch" | "error";
57
+ error?: string;
58
+ }>>;
59
+ //# sourceMappingURL=verifyRiskInclusion.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verifyRiskInclusion.d.ts","sourceRoot":"","sources":["../../src/tools/verifyRiskInclusion.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAMxB,eAAO,MAAM,yBAAyB;;;;;;;;;;;;EAIpC,CAAC;AAEH,MAAM,MAAM,wBAAwB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,yBAAyB,CAAC,CAAC;AAEjF,eAAO,MAAM,uBAAuB;;;;;;;;;;;;;;;;CAOnC,CAAC;AAEF,wBAAsB,yBAAyB,CAAC,GAAG,EAAE,wBAAwB;;;;;;;;;;;;;;;;;;;;;;;;;IA4B5E"}
@@ -0,0 +1,40 @@
1
+ import { z } from "zod";
2
+ import { isAddress } from "viem";
3
+ import { ok, fail } from "../lib/toolResponse.js";
4
+ import { SAFEHANDS_REGISTRY_ADDRESS } from "../lib/constants.js";
5
+ import { verifyRiskInclusion } from "../lib/riskInclusion.js";
6
+ export const verifyRiskInclusionSchema = z.object({
7
+ target: z.string().describe("The address whose risk record you want to prove is included in the committed on-chain Merkle root."),
8
+ actionHash: z.string().optional().describe("Optional 32-byte action hash to disambiguate when a target has multiple records in the batch."),
9
+ verifyOnchain: z.boolean().optional().default(true).describe("If true (default), also verify the Merkle proof through the contract's verifyRiskRecord view for a trustless result."),
10
+ });
11
+ export const verifyRiskInclusionTool = {
12
+ name: "verify_risk_inclusion",
13
+ description: "Prove a target's SafeHands risk record is included in the currently committed on-chain Merkle root. " +
14
+ "Fetches the committed root + data-availability batch, rebuilds the Merkle proof, and verifies it both " +
15
+ "locally and (by default) through the SafeHandsRegistry.verifyRiskRecord view. Read-only, keyless, composable.",
16
+ inputSchema: verifyRiskInclusionSchema,
17
+ };
18
+ export async function handleVerifyRiskInclusion(raw) {
19
+ const input = verifyRiskInclusionSchema.parse(raw);
20
+ if (!isAddress(input.target)) {
21
+ return fail("VALIDATION_ERROR", "target is not a valid EVM address.", false, "verify_risk_inclusion");
22
+ }
23
+ try {
24
+ const result = await verifyRiskInclusion({ target: input.target, actionHash: input.actionHash }, { verifyOnchain: input.verifyOnchain });
25
+ return ok({
26
+ ...result,
27
+ registryContract: SAFEHANDS_REGISTRY_ADDRESS || null,
28
+ // A single, unambiguous verdict for callers that don't want to interpret the flags themselves.
29
+ included: Boolean(result.found &&
30
+ result.rootMatches &&
31
+ result.verifiedLocal &&
32
+ (result.verifiedOnchain === null || result.verifiedOnchain === true) &&
33
+ !result.expired),
34
+ });
35
+ }
36
+ catch (err) {
37
+ return fail("RISK_INCLUSION_FAILED", `Failed to verify risk inclusion: ${err.message}`, true, "verify_risk_inclusion");
38
+ }
39
+ }
40
+ //# sourceMappingURL=verifyRiskInclusion.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verifyRiskInclusion.js","sourceRoot":"","sources":["../../src/tools/verifyRiskInclusion.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,SAAS,EAAE,MAAM,MAAM,CAAC;AACjC,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,wBAAwB,CAAC;AAClD,OAAO,EAAE,0BAA0B,EAAE,MAAM,qBAAqB,CAAC;AACjE,OAAO,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAE9D,MAAM,CAAC,MAAM,yBAAyB,GAAG,CAAC,CAAC,MAAM,CAAC;IAChD,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,oGAAoG,CAAC;IACjI,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,+FAA+F,CAAC;IAC3I,aAAa,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,sHAAsH,CAAC;CACrL,CAAC,CAAC;AAIH,MAAM,CAAC,MAAM,uBAAuB,GAAG;IACrC,IAAI,EAAE,uBAAuB;IAC7B,WAAW,EACT,sGAAsG;QACtG,wGAAwG;QACxG,+GAA+G;IACjH,WAAW,EAAE,yBAAyB;CACvC,CAAC;AAEF,MAAM,CAAC,KAAK,UAAU,yBAAyB,CAAC,GAA6B;IAC3E,MAAM,KAAK,GAAG,yBAAyB,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAEnD,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC;QAC7B,OAAO,IAAI,CAAC,kBAAkB,EAAE,oCAAoC,EAAE,KAAK,EAAE,uBAAuB,CAAC,CAAC;IACxG,CAAC;IAED,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,mBAAmB,CACtC,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,UAAU,EAAE,KAAK,CAAC,UAAU,EAAE,EACtD,EAAE,aAAa,EAAE,KAAK,CAAC,aAAa,EAAE,CACvC,CAAC;QAEF,OAAO,EAAE,CAAC;YACR,GAAG,MAAM;YACT,gBAAgB,EAAE,0BAA0B,IAAI,IAAI;YACpD,+FAA+F;YAC/F,QAAQ,EAAE,OAAO,CACf,MAAM,CAAC,KAAK;gBACV,MAAM,CAAC,WAAW;gBAClB,MAAM,CAAC,aAAa;gBACpB,CAAC,MAAM,CAAC,eAAe,KAAK,IAAI,IAAI,MAAM,CAAC,eAAe,KAAK,IAAI,CAAC;gBACpE,CAAC,MAAM,CAAC,OAAO,CAClB;SACF,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,IAAI,CAAC,uBAAuB,EAAE,oCAAqC,GAAa,CAAC,OAAO,EAAE,EAAE,IAAI,EAAE,uBAAuB,CAAC,CAAC;IACpI,CAAC;AACH,CAAC"}
@@ -6,9 +6,11 @@ export declare const x402PayAndFetchSchema: z.ZodObject<{
6
6
  rpcUrl: z.ZodOptional<z.ZodString>;
7
7
  agentId: z.ZodOptional<z.ZodString>;
8
8
  maxPaymentUsdc: z.ZodDefault<z.ZodOptional<z.ZodString>>;
9
- }, "strip", z.ZodTypeAny, {
10
- url: string;
9
+ confirm: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
10
+ }, "strict", z.ZodTypeAny, {
11
11
  method: "GET" | "POST" | "PUT" | "DELETE";
12
+ url: string;
13
+ confirm: boolean;
12
14
  maxPaymentUsdc: string;
13
15
  body?: string | undefined;
14
16
  agentId?: string | undefined;
@@ -18,6 +20,7 @@ export declare const x402PayAndFetchSchema: z.ZodObject<{
18
20
  body?: string | undefined;
19
21
  method?: "GET" | "POST" | "PUT" | "DELETE" | undefined;
20
22
  agentId?: string | undefined;
23
+ confirm?: boolean | undefined;
21
24
  rpcUrl?: string | undefined;
22
25
  maxPaymentUsdc?: string | undefined;
23
26
  }>;
@@ -32,9 +35,11 @@ export declare const x402PayAndFetchTool: {
32
35
  rpcUrl: z.ZodOptional<z.ZodString>;
33
36
  agentId: z.ZodOptional<z.ZodString>;
34
37
  maxPaymentUsdc: z.ZodDefault<z.ZodOptional<z.ZodString>>;
35
- }, "strip", z.ZodTypeAny, {
36
- url: string;
38
+ confirm: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
39
+ }, "strict", z.ZodTypeAny, {
37
40
  method: "GET" | "POST" | "PUT" | "DELETE";
41
+ url: string;
42
+ confirm: boolean;
38
43
  maxPaymentUsdc: string;
39
44
  body?: string | undefined;
40
45
  agentId?: string | undefined;
@@ -44,11 +49,12 @@ export declare const x402PayAndFetchTool: {
44
49
  body?: string | undefined;
45
50
  method?: "GET" | "POST" | "PUT" | "DELETE" | undefined;
46
51
  agentId?: string | undefined;
52
+ confirm?: boolean | undefined;
47
53
  rpcUrl?: string | undefined;
48
54
  maxPaymentUsdc?: string | undefined;
49
55
  }>;
50
56
  };
51
- export declare function handleX402PayAndFetch(raw: X402PayAndFetchInput): Promise<import("../lib/toolResponse.js").ToolFailure | import("../lib/toolResponse.js").ToolSuccess<{
57
+ export declare function handleX402PayAndFetch(raw: X402PayAndFetchInput): Promise<import("../sdk.js").ToolFailure | import("../sdk.js").ToolSuccess<{
52
58
  status: number;
53
59
  statusText: string;
54
60
  data: unknown;
@@ -57,9 +63,9 @@ export declare function handleX402PayAndFetch(raw: X402PayAndFetchInput): Promis
57
63
  chainId: number;
58
64
  environment: string;
59
65
  isMainnet: boolean;
60
- policy: import("../lib/policy/actionPolicyEngine.js").ActionPolicyResult;
66
+ policy: import("../sdk.js").ActionPolicyResult;
61
67
  source: string;
62
- }> | import("../lib/toolResponse.js").ToolSuccess<{
68
+ }> | import("../sdk.js").ToolSuccess<{
63
69
  status: number;
64
70
  statusText: string;
65
71
  data: unknown;
@@ -75,8 +81,8 @@ export declare function handleX402PayAndFetch(raw: X402PayAndFetchInput): Promis
75
81
  chainId: number;
76
82
  environment: string;
77
83
  isMainnet: boolean;
78
- policy: import("../lib/policy/actionPolicyEngine.js").ActionPolicyResult;
79
- testnetPayment: boolean;
84
+ policy: import("../sdk.js").ActionPolicyResult;
85
+ mainnetPayment: boolean;
80
86
  source: string;
81
87
  }>>;
82
88
  //# sourceMappingURL=x402PayAndFetch.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"x402PayAndFetch.d.ts","sourceRoot":"","sources":["../../src/tools/x402PayAndFetch.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AASxB,eAAO,MAAM,qBAAqB;;;;;;;;;;;;;;;;;;;;;EAOhC,CAAC;AAEH,MAAM,MAAM,oBAAoB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,qBAAqB,CAAC,CAAC;AAEzE,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;;;;;;;;;;;;;CAM/B,CAAC;AA0BF,wBAAsB,qBAAqB,CAAC,GAAG,EAAE,oBAAoB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IA6HpE"}
1
+ {"version":3,"file":"x402PayAndFetch.d.ts","sourceRoot":"","sources":["../../src/tools/x402PayAndFetch.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAcxB,eAAO,MAAM,qBAAqB;;;;;;;;;;;;;;;;;;;;;;;;EAQvB,CAAC;AAEZ,MAAM,MAAM,oBAAoB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,qBAAqB,CAAC,CAAC;AAEzE,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAM/B,CAAC;AA+DF,wBAAsB,qBAAqB,CAAC,GAAG,EAAE,oBAAoB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAkPpE"}
@@ -5,23 +5,29 @@
5
5
  import { z } from "zod";
6
6
  import { wrapFetchWithPayment, x402Client } from "@x402/fetch";
7
7
  import { registerExactEvmScheme } from "@x402/evm/exact/client";
8
- import { CHAIN_ID, PHAROS_ENVIRONMENT, RPC_URL, MAX_X402_PAYMENT_USDC, X402_PAYMENT_TOKEN_ADDRESS } from "../lib/constants.js";
8
+ import { CHAIN_ID, PHAROS_ENVIRONMENT, RPC_URL, MAX_X402_PAYMENT_USDC, X402_PAYMENT_TOKEN_ADDRESS, IS_MAINNET, activeX402AllowedTokenAddresses } from "../lib/constants.js";
9
9
  import { assertSafeFetchUrl, fetchWithTimeoutAndRetry } from "../lib/http.js";
10
10
  import { fail, ok, requireWriteToolsEnabled } from "../lib/toolResponse.js";
11
11
  import { getSigner, isSignerFailure } from "../lib/signer/index.js";
12
+ import { checkManagedWalletAuthorization } from "../lib/safeHandsRegistry.js";
13
+ import { REQUIRE_AUTHORIZED_AGENT_FOR_X402 } from "../lib/constants.js";
12
14
  import { evaluateActionPolicy } from "../lib/policy/actionPolicyEngine.js";
15
+ import { enforceWriteDecision } from "../lib/policy/writeExecutionGate.js";
16
+ import { validatePositiveAmount } from "../lib/validation.js";
17
+ import { reserveDailyLimit, releaseReservation, estimateUsd } from "../lib/spendAccumulator.js";
13
18
  export const x402PayAndFetchSchema = z.object({
14
19
  url: z.string().describe("Target URL of the protected resource requiring x402 payment"),
15
20
  method: z.enum(["GET", "POST", "PUT", "DELETE"]).optional().default("GET").describe("HTTP method to use"),
16
21
  body: z.string().optional().describe("Optional stringified JSON request body"),
17
- rpcUrl: z.string().optional().describe("Custom RPC URL for payment verification (defaults to Atlantic Testnet RPC)"),
18
- agentId: z.string().optional().describe("Managed testnet wallet agentId when WALLET_MODE=managed-testnet"),
22
+ rpcUrl: z.string().optional().describe("Custom RPC URL for payment verification"),
23
+ agentId: z.string().optional().describe("Managed wallet agentId when WALLET_MODE=managed-mainnet"),
19
24
  maxPaymentUsdc: z.string().optional().default(MAX_X402_PAYMENT_USDC),
20
- });
25
+ confirm: z.boolean().optional().default(false).describe("Explicit acknowledgement to proceed when SafeHands returns REQUIRE_CONFIRMATION for the payment. Hard BLOCK / SSRF / over-limit / unsupported-token are never overridable."),
26
+ }).strict();
21
27
  export const x402PayAndFetchTool = {
22
28
  name: "x402_pay_and_fetch",
23
29
  description: "Fetch resources from an HTTP x402 payment-gated server. " +
24
- "If the server challenges with HTTP 402, this tool signs the required testnet payment payload and completes the fetch.",
30
+ "If the server challenges with HTTP 402, this tool signs the required mainnet payment payload and completes the fetch.",
25
31
  inputSchema: x402PayAndFetchSchema,
26
32
  };
27
33
  async function readResponseBody(res) {
@@ -47,8 +53,56 @@ function buildFetchOptions(input) {
47
53
  fetchOptions.body = input.body;
48
54
  return fetchOptions;
49
55
  }
56
+ function x402AllowedTokenSet() {
57
+ return new Set(activeX402AllowedTokenAddresses().map((a) => a.toLowerCase()));
58
+ }
59
+ function validateX402Challenge(challengeHeader, maxPaymentUsdc) {
60
+ if (!challengeHeader)
61
+ return null;
62
+ try {
63
+ const decoded = JSON.parse(Buffer.from(challengeHeader, "base64").toString("utf-8"));
64
+ if (decoded.maxAmountRequired) {
65
+ const challengeAmount = Number(decoded.maxAmountRequired) / 1e6;
66
+ if (challengeAmount > Number(maxPaymentUsdc)) {
67
+ return `x402 challenge amount (${challengeAmount} USDC) exceeds maxPaymentUsdc (${maxPaymentUsdc}).`;
68
+ }
69
+ }
70
+ if (decoded.network) {
71
+ const parts = String(decoded.network).split(":");
72
+ const challengeChainId = parts.length === 2 ? Number(parts[1]) : Number(decoded.network);
73
+ if (Number.isFinite(challengeChainId) && challengeChainId !== CHAIN_ID) {
74
+ return `x402 challenge targets chain ${challengeChainId}, expected ${PHAROS_ENVIRONMENT} (${CHAIN_ID}).`;
75
+ }
76
+ }
77
+ if (decoded.asset) {
78
+ const asset = String(decoded.asset).toLowerCase();
79
+ if (!x402AllowedTokenSet().has(asset)) {
80
+ const allowed = activeX402AllowedTokenAddresses().join(", ");
81
+ return `x402 challenge requests payment in unsupported token ${decoded.asset}. Supported for ${PHAROS_ENVIRONMENT}: ${allowed}.`;
82
+ }
83
+ }
84
+ }
85
+ catch {
86
+ // Challenge header not parseable — proceed with caution but don't block
87
+ }
88
+ return null;
89
+ }
50
90
  export async function handleX402PayAndFetch(raw) {
51
- const input = x402PayAndFetchSchema.parse(raw);
91
+ let input;
92
+ try {
93
+ input = x402PayAndFetchSchema.parse(raw);
94
+ }
95
+ catch (err) {
96
+ const msg = err instanceof z.ZodError
97
+ ? err.issues.map((i) => `${i.path.join(".")}: ${i.message}`).join("; ")
98
+ : String(err);
99
+ return fail("VALIDATION_ERROR", `x402_pay_and_fetch input validation failed: ${msg}`, false, "x402_pay_and_fetch");
100
+ }
101
+ if (input.maxPaymentUsdc) {
102
+ const amtErr = validatePositiveAmount(input.maxPaymentUsdc, "maxPaymentUsdc");
103
+ if (amtErr)
104
+ return fail("VALIDATION_ERROR", amtErr, false, "x402_pay_and_fetch");
105
+ }
52
106
  try {
53
107
  await assertSafeFetchUrl(input.url);
54
108
  }
@@ -57,24 +111,43 @@ export async function handleX402PayAndFetch(raw) {
57
111
  }
58
112
  const staticPolicy = evaluateActionPolicy({
59
113
  actionType: "x402_pay_and_fetch",
114
+ agentId: input.agentId,
60
115
  url: input.url,
61
116
  paymentAmountUsdc: input.maxPaymentUsdc,
62
117
  paymentTokenAddress: X402_PAYMENT_TOKEN_ADDRESS,
63
118
  chainId: CHAIN_ID,
64
119
  environment: PHAROS_ENVIRONMENT,
65
- isMainnet: false,
120
+ isMainnet: IS_MAINNET,
66
121
  });
67
122
  if (staticPolicy.decision === "BLOCK") {
68
123
  return fail("POLICY_BLOCKED", staticPolicy.reasons.join(" ") || "x402 request blocked by SafeHands policy.", false, "x402_pay_and_fetch");
69
124
  }
70
125
  const fetchOptions = buildFetchOptions(input);
126
+ // Daily-cap reservation state, hoisted above the try so the catch block can
127
+ // return the budget if the paying fetch throws after the reserve.
128
+ let reservedUsd = 0;
129
+ let reservedWallet = null;
71
130
  try {
72
- const initial = await fetchWithTimeoutAndRetry(input.url, {
73
- ...fetchOptions,
74
- timeoutMs: 10_000,
75
- retries: 1,
76
- retryDelayMs: 250,
77
- });
131
+ let initial;
132
+ try {
133
+ initial = await fetchWithTimeoutAndRetry(input.url, {
134
+ ...fetchOptions,
135
+ timeoutMs: 10_000,
136
+ retries: 1,
137
+ retryDelayMs: 250,
138
+ });
139
+ }
140
+ catch (err) {
141
+ // fetchWithTimeoutAndRetry follows redirects internally and re-validates
142
+ // SSRF on every hop (initial URL and every redirect target). Surface
143
+ // that as the same clean SSRF_BLOCKED error code used for the upfront
144
+ // check, instead of falling through to the generic X402_PAYMENT_FAILED.
145
+ const msg = err instanceof Error ? err.message : String(err);
146
+ if (msg.includes("SSRF_BLOCKED")) {
147
+ return fail("SSRF_BLOCKED", msg.replace(/^SSRF_BLOCKED:\s*/, ""), false, "x402_pay_and_fetch");
148
+ }
149
+ throw err;
150
+ }
78
151
  if (initial.status !== 402) {
79
152
  const data = await readResponseBody(initial);
80
153
  return ok({
@@ -85,11 +158,16 @@ export async function handleX402PayAndFetch(raw) {
85
158
  paymentDetails: null,
86
159
  chainId: CHAIN_ID,
87
160
  environment: PHAROS_ENVIRONMENT,
88
- isMainnet: false,
161
+ isMainnet: IS_MAINNET,
89
162
  policy: staticPolicy,
90
163
  source: "x402_fetch",
91
164
  });
92
165
  }
166
+ const challengeHeader = initial.headers.get("PAYMENT-REQUIRED");
167
+ const challengeError = validateX402Challenge(challengeHeader, input.maxPaymentUsdc);
168
+ if (challengeError) {
169
+ return fail("X402_CHALLENGE_INVALID", challengeError, false, "x402_pay_and_fetch");
170
+ }
93
171
  const writeGuard = requireWriteToolsEnabled("x402_pay_and_fetch");
94
172
  if (writeGuard)
95
173
  return writeGuard;
@@ -97,20 +175,42 @@ export async function handleX402PayAndFetch(raw) {
97
175
  if (isSignerFailure(signer)) {
98
176
  return fail("X402_PAYMENT_REQUIRED", `The resource returned HTTP 402, but no safe x402 signer is available: ${signer.error.message}`, false, "x402_pay_and_fetch");
99
177
  }
178
+ // x402 is permissionless-first: self-signed x402 (mode "x402-env") never needs
179
+ // registry authorization. A managed/custodial x402 payment is allowlist-gated
180
+ // ONLY when explicitly opted in via REQUIRE_AUTHORIZED_AGENT_FOR_X402=true.
181
+ if (signer.mode === "managed-mainnet" && REQUIRE_AUTHORIZED_AGENT_FOR_X402) {
182
+ const authCheck = await checkManagedWalletAuthorization(signer.address);
183
+ if (!authCheck.authorized) {
184
+ return fail("REQUIRE_AUTHORIZATION", authCheck.errorMessage || "Managed wallet is not authorized in SafeHandsRegistry.", false, "x402_pay_and_fetch");
185
+ }
186
+ }
100
187
  const paymentPolicy = evaluateActionPolicy({
101
188
  actionType: "x402_pay_and_fetch",
189
+ agentId: input.agentId,
102
190
  url: input.url,
103
191
  paymentAmountUsdc: input.maxPaymentUsdc,
104
192
  paymentTokenAddress: X402_PAYMENT_TOKEN_ADDRESS,
105
193
  chainId: CHAIN_ID,
106
194
  environment: PHAROS_ENVIRONMENT,
107
- isMainnet: false,
195
+ isMainnet: IS_MAINNET,
108
196
  signerAvailable: true,
109
197
  requiresSigner: true,
110
198
  });
111
- if (paymentPolicy.decision === "BLOCK") {
112
- return fail("POLICY_BLOCKED", paymentPolicy.reasons.join(" ") || "x402 payment blocked by SafeHands policy.", false, "x402_pay_and_fetch");
199
+ const paymentGate = enforceWriteDecision(paymentPolicy, { confirmed: input.confirm === true, toolName: "x402_pay_and_fetch" });
200
+ if (paymentGate)
201
+ return paymentGate;
202
+ // x402 payments count toward the same per-wallet daily USD cap as
203
+ // send_payment / execute_swap — otherwise a looping agent could drain the
204
+ // wallet in per-call-cap increments. Reserve the payment BOUND
205
+ // (maxPaymentUsdc; the 402 challenge amount is validated to be ≤ this)
206
+ // atomically before the paying fetch, and release it if no payment settles.
207
+ const reserveUsd = estimateUsd(input.maxPaymentUsdc, "USDC");
208
+ const reservation = reserveDailyLimit(signer.address, reserveUsd);
209
+ if (!reservation.allowed) {
210
+ return fail("DAILY_SPEND_LIMIT_EXCEEDED", `Daily spend limit reached. Spent $${reservation.currentUsd.toFixed(2)} of $${reservation.limitUsd.toFixed(2)} USD today. Remaining: $${reservation.remainingUsd.toFixed(2)}. Resets at UTC midnight.`, false, "x402_pay_and_fetch");
113
211
  }
212
+ reservedUsd = reserveUsd;
213
+ reservedWallet = signer.address;
114
214
  const rpc = input.rpcUrl || process.env.PHAROS_RPC_URL || RPC_URL;
115
215
  const client = new x402Client();
116
216
  registerExactEvmScheme(client, {
@@ -119,10 +219,46 @@ export async function handleX402PayAndFetch(raw) {
119
219
  [CHAIN_ID]: { rpcUrl: rpc },
120
220
  },
121
221
  });
122
- const fetchWithPayment = wrapFetchWithPayment(fetch, client);
222
+ // wrapFetchWithPayment always invokes the supplied fetch with a single
223
+ // Request object (it builds one internally via `new Request(input, init)`
224
+ // and clones it for retries/hooks). This guard re-derives the URL/method/
225
+ // headers/body from that Request and routes the actual network call
226
+ // through fetchWithTimeoutAndRetry, so the payment-carrying request — the
227
+ // most sensitive call in this flow — gets the same DNS-pinned SSRF
228
+ // protection as the initial request instead of bypassing it via the raw
229
+ // global fetch.
230
+ const guardedFetch = async (requestInput, requestInit) => {
231
+ const req = requestInput instanceof Request ? requestInput : new Request(requestInput, requestInit);
232
+ const method = req.method || "GET";
233
+ const headersInit = {};
234
+ req.headers.forEach((value, key) => {
235
+ headersInit[key] = value;
236
+ });
237
+ let body;
238
+ if (method !== "GET" && method !== "HEAD") {
239
+ const buf = await req.arrayBuffer();
240
+ if (buf.byteLength > 0)
241
+ body = new Uint8Array(buf);
242
+ }
243
+ return fetchWithTimeoutAndRetry(req.url, {
244
+ method,
245
+ headers: headersInit,
246
+ body,
247
+ timeoutMs: 10_000,
248
+ retries: 0, // avoid duplicate payment submission on a transient error
249
+ });
250
+ };
251
+ const fetchWithPayment = wrapFetchWithPayment(guardedFetch, client);
123
252
  const paidResponse = await fetchWithPayment(input.url, fetchOptions);
124
253
  const data = await readResponseBody(paidResponse);
125
254
  const paymentResponseHeader = paidResponse.headers.get("PAYMENT-RESPONSE");
255
+ if (!paymentResponseHeader) {
256
+ // No payment actually settled (e.g. the resource stopped charging) —
257
+ // return the reserved budget so unpaid fetches never consume the cap.
258
+ releaseReservation(signer.address, reservedUsd);
259
+ reservedUsd = 0;
260
+ reservedWallet = null;
261
+ }
126
262
  return ok({
127
263
  status: paidResponse.status,
128
264
  statusText: paidResponse.statusText,
@@ -140,13 +276,20 @@ export async function handleX402PayAndFetch(raw) {
140
276
  maxPaymentUsdc: input.maxPaymentUsdc,
141
277
  chainId: CHAIN_ID,
142
278
  environment: PHAROS_ENVIRONMENT,
143
- isMainnet: false,
279
+ isMainnet: IS_MAINNET,
144
280
  policy: paymentPolicy,
145
- testnetPayment: true,
281
+ mainnetPayment: true,
146
282
  source: "x402_fetch",
147
283
  });
148
284
  }
149
285
  catch (err) {
286
+ // A payment that failed in flight is ambiguous (it MAY have settled), but
287
+ // the x402 replay store makes a re-submission of the same authorization
288
+ // safe — release the reservation so a transient fetch error does not
289
+ // permanently consume the daily budget.
290
+ if (reservedWallet && reservedUsd > 0) {
291
+ releaseReservation(reservedWallet, reservedUsd);
292
+ }
150
293
  return fail("X402_PAYMENT_FAILED", err instanceof Error ? err.message : String(err), true, "x402_pay_and_fetch");
151
294
  }
152
295
  }