safehands-pharos 1.4.0 → 2.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (571) hide show
  1. package/.agents/policies/default.json +15 -0
  2. package/.env.example +81 -64
  3. package/README.md +301 -333
  4. package/SECURITY.md +112 -0
  5. package/SKILL.md +59 -0
  6. package/contracts/SafeHandsAttestation.sol +182 -0
  7. package/contracts/SafeHandsRegistry.sol +149 -0
  8. package/dist/agent/SafeHandsGuardianAgent.d.ts +39 -0
  9. package/dist/agent/SafeHandsGuardianAgent.d.ts.map +1 -0
  10. package/dist/agent/SafeHandsGuardianAgent.js +98 -0
  11. package/dist/agent/SafeHandsGuardianAgent.js.map +1 -0
  12. package/dist/agent/agentDecisionFormatter.d.ts +43 -0
  13. package/dist/agent/agentDecisionFormatter.d.ts.map +1 -0
  14. package/dist/agent/agentDecisionFormatter.js +96 -0
  15. package/dist/agent/agentDecisionFormatter.js.map +1 -0
  16. package/dist/agent/agentEnrich.d.ts +28 -0
  17. package/dist/agent/agentEnrich.d.ts.map +1 -0
  18. package/dist/agent/agentEnrich.js +99 -0
  19. package/dist/agent/agentEnrich.js.map +1 -0
  20. package/dist/agent/agentIntentClassifier.d.ts +44 -0
  21. package/dist/agent/agentIntentClassifier.d.ts.map +1 -0
  22. package/dist/agent/agentIntentClassifier.js +77 -0
  23. package/dist/agent/agentIntentClassifier.js.map +1 -0
  24. package/dist/agent/agentPolicyResolver.d.ts +44 -0
  25. package/dist/agent/agentPolicyResolver.d.ts.map +1 -0
  26. package/dist/agent/agentPolicyResolver.js +94 -0
  27. package/dist/agent/agentPolicyResolver.js.map +1 -0
  28. package/dist/agent/agentRuntime.d.ts +12 -0
  29. package/dist/agent/agentRuntime.d.ts.map +1 -0
  30. package/dist/agent/agentRuntime.js +31 -0
  31. package/dist/agent/agentRuntime.js.map +1 -0
  32. package/dist/agent/agentToolRouter.d.ts +24 -0
  33. package/dist/agent/agentToolRouter.d.ts.map +1 -0
  34. package/dist/agent/agentToolRouter.js +89 -0
  35. package/dist/agent/agentToolRouter.js.map +1 -0
  36. package/dist/agent/guardianOperator.d.ts +35 -0
  37. package/dist/agent/guardianOperator.d.ts.map +1 -0
  38. package/dist/agent/guardianOperator.js +65 -0
  39. package/dist/agent/guardianOperator.js.map +1 -0
  40. package/dist/agent/index.d.ts +8 -0
  41. package/dist/agent/index.d.ts.map +1 -0
  42. package/dist/agent/index.js +14 -0
  43. package/dist/agent/index.js.map +1 -0
  44. package/dist/api/activityRoutes.d.ts +70 -0
  45. package/dist/api/activityRoutes.d.ts.map +1 -0
  46. package/dist/api/activityRoutes.js +100 -0
  47. package/dist/api/activityRoutes.js.map +1 -0
  48. package/dist/api/agentRoutes.d.ts +16 -0
  49. package/dist/api/agentRoutes.d.ts.map +1 -0
  50. package/dist/api/agentRoutes.js +37 -0
  51. package/dist/api/agentRoutes.js.map +1 -0
  52. package/dist/api/broadcastRoutes.d.ts +34 -0
  53. package/dist/api/broadcastRoutes.d.ts.map +1 -0
  54. package/dist/api/broadcastRoutes.js +147 -0
  55. package/dist/api/broadcastRoutes.js.map +1 -0
  56. package/dist/api/consolePage.d.ts +2 -0
  57. package/dist/api/consolePage.d.ts.map +1 -0
  58. package/dist/api/consolePage.js +206 -0
  59. package/dist/api/consolePage.js.map +1 -0
  60. package/dist/api/httpHardening.d.ts +75 -0
  61. package/dist/api/httpHardening.d.ts.map +1 -0
  62. package/dist/api/httpHardening.js +122 -0
  63. package/dist/api/httpHardening.js.map +1 -0
  64. package/dist/api/indexerRoutes.d.ts +46 -0
  65. package/dist/api/indexerRoutes.d.ts.map +1 -0
  66. package/dist/api/indexerRoutes.js +75 -0
  67. package/dist/api/indexerRoutes.js.map +1 -0
  68. package/dist/api/paidRoutes.d.ts +8 -0
  69. package/dist/api/paidRoutes.d.ts.map +1 -0
  70. package/dist/api/paidRoutes.js +175 -0
  71. package/dist/api/paidRoutes.js.map +1 -0
  72. package/dist/api/prepareRoutes.d.ts +58 -0
  73. package/dist/api/prepareRoutes.d.ts.map +1 -0
  74. package/dist/api/prepareRoutes.js +90 -0
  75. package/dist/api/prepareRoutes.js.map +1 -0
  76. package/dist/api/response.d.ts +39 -0
  77. package/dist/api/response.d.ts.map +1 -0
  78. package/dist/api/response.js +53 -0
  79. package/dist/api/response.js.map +1 -0
  80. package/dist/api/routes.d.ts +175 -0
  81. package/dist/api/routes.d.ts.map +1 -0
  82. package/dist/api/routes.js +276 -0
  83. package/dist/api/routes.js.map +1 -0
  84. package/dist/api/schemas.d.ts +147 -0
  85. package/dist/api/schemas.d.ts.map +1 -0
  86. package/dist/api/schemas.js +81 -0
  87. package/dist/api/schemas.js.map +1 -0
  88. package/dist/api/server.d.ts +11 -0
  89. package/dist/api/server.d.ts.map +1 -0
  90. package/dist/api/server.js +505 -0
  91. package/dist/api/server.js.map +1 -0
  92. package/dist/api/toolRoutes.d.ts +14 -0
  93. package/dist/api/toolRoutes.d.ts.map +1 -0
  94. package/dist/api/toolRoutes.js +138 -0
  95. package/dist/api/toolRoutes.js.map +1 -0
  96. package/dist/api/walletPrepareRoutes.d.ts +74 -0
  97. package/dist/api/walletPrepareRoutes.d.ts.map +1 -0
  98. package/dist/api/walletPrepareRoutes.js +127 -0
  99. package/dist/api/walletPrepareRoutes.js.map +1 -0
  100. package/dist/api/x402Gate.d.ts +51 -0
  101. package/dist/api/x402Gate.d.ts.map +1 -0
  102. package/dist/api/x402Gate.js +184 -0
  103. package/dist/api/x402Gate.js.map +1 -0
  104. package/dist/cli.d.ts +5 -5
  105. package/dist/cli.d.ts.map +1 -1
  106. package/dist/cli.js +154 -124
  107. package/dist/cli.js.map +1 -1
  108. package/dist/data/ecosystemRegistry.data.d.ts +3 -0
  109. package/dist/data/ecosystemRegistry.data.d.ts.map +1 -0
  110. package/dist/data/ecosystemRegistry.data.js +582 -0
  111. package/dist/data/ecosystemRegistry.data.js.map +1 -0
  112. package/dist/demo.d.ts +1 -1
  113. package/dist/demo.d.ts.map +1 -1
  114. package/dist/demo.js +206 -171
  115. package/dist/demo.js.map +1 -1
  116. package/dist/index.d.ts +2 -2
  117. package/dist/index.d.ts.map +1 -1
  118. package/dist/index.js +249 -164
  119. package/dist/index.js.map +1 -1
  120. package/dist/init.d.ts +1 -1
  121. package/dist/init.d.ts.map +1 -1
  122. package/dist/init.js +127 -65
  123. package/dist/init.js.map +1 -1
  124. package/dist/lib/analysis/approval.d.ts +29 -0
  125. package/dist/lib/analysis/approval.d.ts.map +1 -0
  126. package/dist/lib/analysis/approval.js +162 -0
  127. package/dist/lib/analysis/approval.js.map +1 -0
  128. package/dist/lib/analysis/calldata.d.ts +60 -0
  129. package/dist/lib/analysis/calldata.d.ts.map +1 -0
  130. package/dist/lib/analysis/calldata.js +349 -0
  131. package/dist/lib/analysis/calldata.js.map +1 -0
  132. package/dist/lib/analysis/contractIntel.d.ts +65 -0
  133. package/dist/lib/analysis/contractIntel.d.ts.map +1 -0
  134. package/dist/lib/analysis/contractIntel.js +320 -0
  135. package/dist/lib/analysis/contractIntel.js.map +1 -0
  136. package/dist/lib/analysis/evm.d.ts +42 -0
  137. package/dist/lib/analysis/evm.d.ts.map +1 -0
  138. package/dist/lib/analysis/evm.js +185 -0
  139. package/dist/lib/analysis/evm.js.map +1 -0
  140. package/dist/lib/analysis/gas.d.ts +4 -0
  141. package/dist/lib/analysis/gas.d.ts.map +1 -0
  142. package/dist/lib/analysis/gas.js +13 -0
  143. package/dist/lib/analysis/gas.js.map +1 -0
  144. package/dist/lib/analysis/index.d.ts +11 -0
  145. package/dist/lib/analysis/index.d.ts.map +1 -0
  146. package/dist/lib/analysis/index.js +16 -0
  147. package/dist/lib/analysis/index.js.map +1 -0
  148. package/dist/lib/analysis/pharosTokens.d.ts +31 -0
  149. package/dist/lib/analysis/pharosTokens.d.ts.map +1 -0
  150. package/dist/lib/analysis/pharosTokens.js +78 -0
  151. package/dist/lib/analysis/pharosTokens.js.map +1 -0
  152. package/dist/lib/analysis/safeTx.d.ts +27 -0
  153. package/dist/lib/analysis/safeTx.d.ts.map +1 -0
  154. package/dist/lib/analysis/safeTx.js +118 -0
  155. package/dist/lib/analysis/safeTx.js.map +1 -0
  156. package/dist/lib/analysis/token.d.ts +21 -0
  157. package/dist/lib/analysis/token.d.ts.map +1 -0
  158. package/dist/lib/analysis/token.js +151 -0
  159. package/dist/lib/analysis/token.js.map +1 -0
  160. package/dist/lib/analysis/types.d.ts +49 -0
  161. package/dist/lib/analysis/types.d.ts.map +1 -0
  162. package/dist/lib/analysis/types.js +10 -0
  163. package/dist/lib/analysis/types.js.map +1 -0
  164. package/dist/lib/analysis/x402.d.ts +24 -0
  165. package/dist/lib/analysis/x402.d.ts.map +1 -0
  166. package/dist/lib/analysis/x402.js +60 -0
  167. package/dist/lib/analysis/x402.js.map +1 -0
  168. package/dist/lib/auditLog.d.ts +1 -0
  169. package/dist/lib/auditLog.d.ts.map +1 -1
  170. package/dist/lib/auditLog.js +0 -0
  171. package/dist/lib/auditLog.js.map +1 -1
  172. package/dist/lib/config.d.ts +77 -0
  173. package/dist/lib/config.d.ts.map +1 -0
  174. package/dist/lib/config.js +120 -0
  175. package/dist/lib/config.js.map +1 -0
  176. package/dist/lib/constants.d.ts +452 -291
  177. package/dist/lib/constants.d.ts.map +1 -1
  178. package/dist/lib/constants.js +509 -292
  179. package/dist/lib/constants.js.map +1 -1
  180. package/dist/lib/dodoApi.d.ts +101 -78
  181. package/dist/lib/dodoApi.d.ts.map +1 -1
  182. package/dist/lib/dodoApi.js +259 -196
  183. package/dist/lib/dodoApi.js.map +1 -1
  184. package/dist/lib/ecosystemRegistry.d.ts +116 -0
  185. package/dist/lib/ecosystemRegistry.d.ts.map +1 -0
  186. package/dist/lib/ecosystemRegistry.js +178 -0
  187. package/dist/lib/ecosystemRegistry.js.map +1 -0
  188. package/dist/lib/envLoader.d.ts +2 -0
  189. package/dist/lib/envLoader.d.ts.map +1 -0
  190. package/dist/lib/envLoader.js +65 -0
  191. package/dist/lib/envLoader.js.map +1 -0
  192. package/dist/lib/goldsky.d.ts +58 -0
  193. package/dist/lib/goldsky.d.ts.map +1 -0
  194. package/dist/lib/goldsky.js +275 -0
  195. package/dist/lib/goldsky.js.map +1 -0
  196. package/dist/lib/guardian/decision.d.ts +23 -0
  197. package/dist/lib/guardian/decision.d.ts.map +1 -0
  198. package/dist/lib/guardian/decision.js +40 -0
  199. package/dist/lib/guardian/decision.js.map +1 -0
  200. package/dist/lib/http.d.ts +13 -14
  201. package/dist/lib/http.d.ts.map +1 -1
  202. package/dist/lib/http.js +383 -118
  203. package/dist/lib/http.js.map +1 -1
  204. package/dist/lib/managedExecution.d.ts +19 -0
  205. package/dist/lib/managedExecution.d.ts.map +1 -0
  206. package/dist/lib/managedExecution.js +64 -0
  207. package/dist/lib/managedExecution.js.map +1 -0
  208. package/dist/lib/merkleBatcher.d.ts +23 -0
  209. package/dist/lib/merkleBatcher.d.ts.map +1 -0
  210. package/dist/lib/merkleBatcher.js +62 -0
  211. package/dist/lib/merkleBatcher.js.map +1 -0
  212. package/dist/lib/networks.d.ts +48 -0
  213. package/dist/lib/networks.d.ts.map +1 -0
  214. package/dist/lib/networks.js +103 -0
  215. package/dist/lib/networks.js.map +1 -0
  216. package/dist/lib/observability/accessContext.d.ts +29 -0
  217. package/dist/lib/observability/accessContext.d.ts.map +1 -0
  218. package/dist/lib/observability/accessContext.js +50 -0
  219. package/dist/lib/observability/accessContext.js.map +1 -0
  220. package/dist/lib/observability/activityStore.d.ts +70 -0
  221. package/dist/lib/observability/activityStore.d.ts.map +1 -0
  222. package/dist/lib/observability/activityStore.js +149 -0
  223. package/dist/lib/observability/activityStore.js.map +1 -0
  224. package/dist/lib/observability/apiKey.d.ts +55 -0
  225. package/dist/lib/observability/apiKey.d.ts.map +1 -0
  226. package/dist/lib/observability/apiKey.js +141 -0
  227. package/dist/lib/observability/apiKey.js.map +1 -0
  228. package/dist/lib/observability/logger.d.ts +30 -0
  229. package/dist/lib/observability/logger.d.ts.map +1 -0
  230. package/dist/lib/observability/logger.js +30 -0
  231. package/dist/lib/observability/logger.js.map +1 -0
  232. package/dist/lib/observability/quota.d.ts +33 -0
  233. package/dist/lib/observability/quota.d.ts.map +1 -0
  234. package/dist/lib/observability/quota.js +49 -0
  235. package/dist/lib/observability/quota.js.map +1 -0
  236. package/dist/lib/observability/requestId.d.ts +8 -0
  237. package/dist/lib/observability/requestId.d.ts.map +1 -0
  238. package/dist/lib/observability/requestId.js +24 -0
  239. package/dist/lib/observability/requestId.js.map +1 -0
  240. package/dist/lib/observability/sanitize.d.ts +77 -0
  241. package/dist/lib/observability/sanitize.d.ts.map +1 -0
  242. package/dist/lib/observability/sanitize.js +228 -0
  243. package/dist/lib/observability/sanitize.js.map +1 -0
  244. package/dist/lib/observability/scopes.d.ts +20 -0
  245. package/dist/lib/observability/scopes.d.ts.map +1 -0
  246. package/dist/lib/observability/scopes.js +77 -0
  247. package/dist/lib/observability/scopes.js.map +1 -0
  248. package/dist/lib/okxDexApi.d.ts +106 -0
  249. package/dist/lib/okxDexApi.d.ts.map +1 -0
  250. package/dist/lib/okxDexApi.js +221 -0
  251. package/dist/lib/okxDexApi.js.map +1 -0
  252. package/dist/lib/persistentJsonStore.d.ts +5 -0
  253. package/dist/lib/persistentJsonStore.d.ts.map +1 -0
  254. package/dist/lib/persistentJsonStore.js +39 -0
  255. package/dist/lib/persistentJsonStore.js.map +1 -0
  256. package/dist/lib/pharos/attestationPublisher.d.ts +50 -0
  257. package/dist/lib/pharos/attestationPublisher.d.ts.map +1 -0
  258. package/dist/lib/pharos/attestationPublisher.js +262 -0
  259. package/dist/lib/pharos/attestationPublisher.js.map +1 -0
  260. package/dist/lib/pharos/ecosystem.d.ts +52 -0
  261. package/dist/lib/pharos/ecosystem.d.ts.map +1 -0
  262. package/dist/lib/pharos/ecosystem.js +431 -0
  263. package/dist/lib/pharos/ecosystem.js.map +1 -0
  264. package/dist/lib/pharos/ecosystemEvidence.d.ts +53 -0
  265. package/dist/lib/pharos/ecosystemEvidence.d.ts.map +1 -0
  266. package/dist/lib/pharos/ecosystemEvidence.js +133 -0
  267. package/dist/lib/pharos/ecosystemEvidence.js.map +1 -0
  268. package/dist/lib/pharos/rpc.d.ts +44 -0
  269. package/dist/lib/pharos/rpc.d.ts.map +1 -0
  270. package/dist/lib/pharos/rpc.js +90 -0
  271. package/dist/lib/pharos/rpc.js.map +1 -0
  272. package/dist/lib/pharos/rpcEvidence.d.ts +49 -0
  273. package/dist/lib/pharos/rpcEvidence.d.ts.map +1 -0
  274. package/dist/lib/pharos/rpcEvidence.js +46 -0
  275. package/dist/lib/pharos/rpcEvidence.js.map +1 -0
  276. package/dist/lib/pharos/rpcMethods.d.ts +46 -0
  277. package/dist/lib/pharos/rpcMethods.d.ts.map +1 -0
  278. package/dist/lib/pharos/rpcMethods.js +176 -0
  279. package/dist/lib/pharos/rpcMethods.js.map +1 -0
  280. package/dist/lib/pharos/spvVerifier.d.ts +47 -0
  281. package/dist/lib/pharos/spvVerifier.d.ts.map +1 -0
  282. package/dist/lib/pharos/spvVerifier.js +105 -0
  283. package/dist/lib/pharos/spvVerifier.js.map +1 -0
  284. package/dist/lib/pharos/userSignedBroadcaster.d.ts +10 -0
  285. package/dist/lib/pharos/userSignedBroadcaster.d.ts.map +1 -0
  286. package/dist/lib/pharos/userSignedBroadcaster.js +50 -0
  287. package/dist/lib/pharos/userSignedBroadcaster.js.map +1 -0
  288. package/dist/lib/pharosClient.d.ts +53 -58
  289. package/dist/lib/pharosClient.d.ts.map +1 -1
  290. package/dist/lib/pharosClient.js +56 -63
  291. package/dist/lib/pharosClient.js.map +1 -1
  292. package/dist/lib/policy/actionPolicyEngine.d.ts +89 -53
  293. package/dist/lib/policy/actionPolicyEngine.d.ts.map +1 -1
  294. package/dist/lib/policy/actionPolicyEngine.js +373 -212
  295. package/dist/lib/policy/actionPolicyEngine.js.map +1 -1
  296. package/dist/lib/policy/agentPolicy.d.ts +29 -0
  297. package/dist/lib/policy/agentPolicy.d.ts.map +1 -0
  298. package/dist/lib/policy/agentPolicy.js +154 -0
  299. package/dist/lib/policy/agentPolicy.js.map +1 -0
  300. package/dist/lib/policy/policyPresets.d.ts +30 -0
  301. package/dist/lib/policy/policyPresets.d.ts.map +1 -0
  302. package/dist/lib/policy/policyPresets.js +124 -0
  303. package/dist/lib/policy/policyPresets.js.map +1 -0
  304. package/dist/lib/policy/writeExecutionGate.d.ts +23 -0
  305. package/dist/lib/policy/writeExecutionGate.d.ts.map +1 -0
  306. package/dist/lib/policy/writeExecutionGate.js +65 -0
  307. package/dist/lib/policy/writeExecutionGate.js.map +1 -0
  308. package/dist/lib/preparedTxStore.d.ts +21 -0
  309. package/dist/lib/preparedTxStore.d.ts.map +1 -0
  310. package/dist/lib/preparedTxStore.js +90 -0
  311. package/dist/lib/preparedTxStore.js.map +1 -0
  312. package/dist/lib/price/chainlinkPushProvider.d.ts +34 -0
  313. package/dist/lib/price/chainlinkPushProvider.d.ts.map +1 -0
  314. package/dist/lib/price/chainlinkPushProvider.js +36 -0
  315. package/dist/lib/price/chainlinkPushProvider.js.map +1 -0
  316. package/dist/lib/price/feedRegistry.d.ts +26 -0
  317. package/dist/lib/price/feedRegistry.d.ts.map +1 -0
  318. package/dist/lib/price/feedRegistry.js +67 -0
  319. package/dist/lib/price/feedRegistry.js.map +1 -0
  320. package/dist/lib/price/priceResolver.d.ts +35 -0
  321. package/dist/lib/price/priceResolver.d.ts.map +1 -0
  322. package/dist/lib/price/priceResolver.js +246 -0
  323. package/dist/lib/price/priceResolver.js.map +1 -0
  324. package/dist/lib/price/supraProvider.d.ts +9 -0
  325. package/dist/lib/price/supraProvider.d.ts.map +1 -0
  326. package/dist/lib/price/supraProvider.js +17 -0
  327. package/dist/lib/price/supraProvider.js.map +1 -0
  328. package/dist/lib/price/types.d.ts +67 -0
  329. package/dist/lib/price/types.d.ts.map +1 -0
  330. package/dist/lib/price/types.js +7 -0
  331. package/dist/lib/price/types.js.map +1 -0
  332. package/dist/lib/productionGuards.d.ts +16 -0
  333. package/dist/lib/productionGuards.d.ts.map +1 -0
  334. package/dist/lib/productionGuards.js +93 -0
  335. package/dist/lib/productionGuards.js.map +1 -0
  336. package/dist/lib/recipientSafety.d.ts +5 -0
  337. package/dist/lib/recipientSafety.d.ts.map +1 -0
  338. package/dist/lib/recipientSafety.js +28 -0
  339. package/dist/lib/recipientSafety.js.map +1 -0
  340. package/dist/lib/riskEngine.d.ts +45 -26
  341. package/dist/lib/riskEngine.d.ts.map +1 -1
  342. package/dist/lib/riskEngine.js +346 -283
  343. package/dist/lib/riskEngine.js.map +1 -1
  344. package/dist/lib/riskInclusion.d.ts +72 -0
  345. package/dist/lib/riskInclusion.d.ts.map +1 -0
  346. package/dist/lib/riskInclusion.js +252 -0
  347. package/dist/lib/riskInclusion.js.map +1 -0
  348. package/dist/lib/safeHandsRegistry.d.ts +32 -0
  349. package/dist/lib/safeHandsRegistry.d.ts.map +1 -0
  350. package/dist/lib/safeHandsRegistry.js +151 -0
  351. package/dist/lib/safeHandsRegistry.js.map +1 -0
  352. package/dist/lib/signer/index.d.ts +24 -24
  353. package/dist/lib/signer/index.d.ts.map +1 -1
  354. package/dist/lib/signer/index.js +110 -88
  355. package/dist/lib/signer/index.js.map +1 -1
  356. package/dist/lib/spendAccumulator.d.ts +24 -1
  357. package/dist/lib/spendAccumulator.d.ts.map +1 -1
  358. package/dist/lib/spendAccumulator.js +76 -6
  359. package/dist/lib/spendAccumulator.js.map +1 -1
  360. package/dist/lib/toolResponse.d.ts +30 -25
  361. package/dist/lib/toolResponse.d.ts.map +1 -1
  362. package/dist/lib/toolResponse.js +57 -53
  363. package/dist/lib/toolResponse.js.map +1 -1
  364. package/dist/lib/validation.d.ts +7 -0
  365. package/dist/lib/validation.d.ts.map +1 -0
  366. package/dist/lib/validation.js +62 -0
  367. package/dist/lib/validation.js.map +1 -0
  368. package/dist/lib/wallet/index.d.ts +33 -37
  369. package/dist/lib/wallet/index.d.ts.map +1 -1
  370. package/dist/lib/wallet/index.js +141 -128
  371. package/dist/lib/wallet/index.js.map +1 -1
  372. package/dist/lib/x402ReplayStore.d.ts +6 -0
  373. package/dist/lib/x402ReplayStore.d.ts.map +1 -0
  374. package/dist/lib/x402ReplayStore.js +79 -0
  375. package/dist/lib/x402ReplayStore.js.map +1 -0
  376. package/dist/safehands.zip +0 -0
  377. package/dist/sdk.d.ts +14 -0
  378. package/dist/sdk.d.ts.map +1 -0
  379. package/dist/sdk.js +25 -0
  380. package/dist/sdk.js.map +1 -0
  381. package/dist/tools/approveToken.d.ts +66 -45
  382. package/dist/tools/approveToken.d.ts.map +1 -1
  383. package/dist/tools/approveToken.js +152 -85
  384. package/dist/tools/approveToken.js.map +1 -1
  385. package/dist/tools/assessRisk.d.ts +66 -79
  386. package/dist/tools/assessRisk.d.ts.map +1 -1
  387. package/dist/tools/assessRisk.js +63 -104
  388. package/dist/tools/assessRisk.js.map +1 -1
  389. package/dist/tools/checkAllowance.d.ts +49 -43
  390. package/dist/tools/checkAllowance.d.ts.map +1 -1
  391. package/dist/tools/checkAllowance.js +78 -56
  392. package/dist/tools/checkAllowance.js.map +1 -1
  393. package/dist/tools/checkTokenSecurity.d.ts +103 -46
  394. package/dist/tools/checkTokenSecurity.d.ts.map +1 -1
  395. package/dist/tools/checkTokenSecurity.js +240 -95
  396. package/dist/tools/checkTokenSecurity.js.map +1 -1
  397. package/dist/tools/createAgentWallet.d.ts +30 -26
  398. package/dist/tools/createAgentWallet.d.ts.map +1 -1
  399. package/dist/tools/createAgentWallet.js +87 -58
  400. package/dist/tools/createAgentWallet.js.map +1 -1
  401. package/dist/tools/estimateGas.d.ts +84 -79
  402. package/dist/tools/estimateGas.d.ts.map +1 -1
  403. package/dist/tools/estimateGas.js +130 -124
  404. package/dist/tools/estimateGas.js.map +1 -1
  405. package/dist/tools/executeSwap.d.ts +109 -61
  406. package/dist/tools/executeSwap.d.ts.map +1 -1
  407. package/dist/tools/executeSwap.js +289 -141
  408. package/dist/tools/executeSwap.js.map +1 -1
  409. package/dist/tools/explainRisk.d.ts +29 -29
  410. package/dist/tools/explainRisk.d.ts.map +1 -1
  411. package/dist/tools/explainRisk.js +33 -32
  412. package/dist/tools/explainRisk.js.map +1 -1
  413. package/dist/tools/getAgentPolicy.d.ts +15 -0
  414. package/dist/tools/getAgentPolicy.d.ts.map +1 -0
  415. package/dist/tools/getAgentPolicy.js +16 -0
  416. package/dist/tools/getAgentPolicy.js.map +1 -0
  417. package/dist/tools/getAgentReputation.d.ts +31 -0
  418. package/dist/tools/getAgentReputation.d.ts.map +1 -0
  419. package/dist/tools/getAgentReputation.js +44 -0
  420. package/dist/tools/getAgentReputation.js.map +1 -0
  421. package/dist/tools/getAgentWallet.d.ts +21 -21
  422. package/dist/tools/getAgentWallet.d.ts.map +1 -1
  423. package/dist/tools/getAgentWallet.js +37 -27
  424. package/dist/tools/getAgentWallet.js.map +1 -1
  425. package/dist/tools/getAgentWalletBalance.d.ts +11 -11
  426. package/dist/tools/getAgentWalletBalance.d.ts.map +1 -1
  427. package/dist/tools/getAgentWalletBalance.js +102 -70
  428. package/dist/tools/getAgentWalletBalance.js.map +1 -1
  429. package/dist/tools/getExecutionHistory.d.ts +49 -49
  430. package/dist/tools/getExecutionHistory.d.ts.map +1 -1
  431. package/dist/tools/getExecutionHistory.js +148 -154
  432. package/dist/tools/getExecutionHistory.js.map +1 -1
  433. package/dist/tools/getGasPrice.d.ts +43 -43
  434. package/dist/tools/getGasPrice.d.ts.map +0 -0
  435. package/dist/tools/getGasPrice.js +59 -59
  436. package/dist/tools/getGasPrice.js.map +1 -1
  437. package/dist/tools/getPoolInfo.d.ts +75 -75
  438. package/dist/tools/getPoolInfo.d.ts.map +1 -1
  439. package/dist/tools/getPoolInfo.js +142 -137
  440. package/dist/tools/getPoolInfo.js.map +1 -1
  441. package/dist/tools/getSpvProof.d.ts +24 -0
  442. package/dist/tools/getSpvProof.d.ts.map +1 -0
  443. package/dist/tools/getSpvProof.js +64 -0
  444. package/dist/tools/getSpvProof.js.map +1 -0
  445. package/dist/tools/getTokenPrice.d.ts +56 -113
  446. package/dist/tools/getTokenPrice.d.ts.map +1 -1
  447. package/dist/tools/getTokenPrice.js +110 -117
  448. package/dist/tools/getTokenPrice.js.map +1 -1
  449. package/dist/tools/getTransactionStatus.d.ts +43 -43
  450. package/dist/tools/getTransactionStatus.d.ts.map +0 -0
  451. package/dist/tools/getTransactionStatus.js +59 -59
  452. package/dist/tools/getTransactionStatus.js.map +0 -0
  453. package/dist/tools/getWalletBalance.d.ts +103 -68
  454. package/dist/tools/getWalletBalance.d.ts.map +1 -1
  455. package/dist/tools/getWalletBalance.js +127 -87
  456. package/dist/tools/getWalletBalance.js.map +1 -1
  457. package/dist/tools/publishRiskScore.d.ts +85 -63
  458. package/dist/tools/publishRiskScore.d.ts.map +1 -1
  459. package/dist/tools/publishRiskScore.js +136 -88
  460. package/dist/tools/publishRiskScore.js.map +1 -1
  461. package/dist/tools/queryGoldsky.d.ts +20 -0
  462. package/dist/tools/queryGoldsky.d.ts.map +1 -0
  463. package/dist/tools/queryGoldsky.js +29 -0
  464. package/dist/tools/queryGoldsky.js.map +1 -0
  465. package/dist/tools/queryRiskRegistry.d.ts +38 -38
  466. package/dist/tools/queryRiskRegistry.d.ts.map +1 -1
  467. package/dist/tools/queryRiskRegistry.js +59 -55
  468. package/dist/tools/queryRiskRegistry.js.map +1 -1
  469. package/dist/tools/safehandsPreflightCheck.d.ts +92 -77
  470. package/dist/tools/safehandsPreflightCheck.d.ts.map +1 -1
  471. package/dist/tools/safehandsPreflightCheck.js +174 -47
  472. package/dist/tools/safehandsPreflightCheck.js.map +1 -1
  473. package/dist/tools/safehandsRiskReport.d.ts +96 -81
  474. package/dist/tools/safehandsRiskReport.d.ts.map +1 -1
  475. package/dist/tools/safehandsRiskReport.js +48 -28
  476. package/dist/tools/safehandsRiskReport.js.map +1 -1
  477. package/dist/tools/safehandsSafeExecute.d.ts +20 -20
  478. package/dist/tools/safehandsSafeExecute.d.ts.map +1 -1
  479. package/dist/tools/safehandsSafeExecute.js +164 -81
  480. package/dist/tools/safehandsSafeExecute.js.map +1 -1
  481. package/dist/tools/safehandsWalletHealth.d.ts +28 -14
  482. package/dist/tools/safehandsWalletHealth.d.ts.map +1 -1
  483. package/dist/tools/safehandsWalletHealth.js +145 -103
  484. package/dist/tools/safehandsWalletHealth.js.map +1 -1
  485. package/dist/tools/safehandsX402Preflight.d.ts +26 -26
  486. package/dist/tools/safehandsX402Preflight.d.ts.map +1 -1
  487. package/dist/tools/safehandsX402Preflight.js +86 -65
  488. package/dist/tools/safehandsX402Preflight.js.map +1 -1
  489. package/dist/tools/sendPayment.d.ts +63 -57
  490. package/dist/tools/sendPayment.d.ts.map +1 -1
  491. package/dist/tools/sendPayment.js +144 -117
  492. package/dist/tools/sendPayment.js.map +1 -1
  493. package/dist/tools/setAgentPolicy.d.ts +75 -0
  494. package/dist/tools/setAgentPolicy.d.ts.map +1 -0
  495. package/dist/tools/setAgentPolicy.js +80 -0
  496. package/dist/tools/setAgentPolicy.js.map +1 -0
  497. package/dist/tools/simulateTransaction.d.ts +64 -60
  498. package/dist/tools/simulateTransaction.d.ts.map +1 -1
  499. package/dist/tools/simulateTransaction.js +116 -83
  500. package/dist/tools/simulateTransaction.js.map +1 -1
  501. package/dist/tools/tokenRegistryStatus.d.ts +46 -26
  502. package/dist/tools/tokenRegistryStatus.d.ts.map +1 -1
  503. package/dist/tools/tokenRegistryStatus.js +126 -96
  504. package/dist/tools/tokenRegistryStatus.js.map +1 -1
  505. package/dist/tools/verifyRiskInclusion.d.ts +59 -0
  506. package/dist/tools/verifyRiskInclusion.d.ts.map +1 -0
  507. package/dist/tools/verifyRiskInclusion.js +40 -0
  508. package/dist/tools/verifyRiskInclusion.js.map +1 -0
  509. package/dist/tools/x402PayAndFetch.d.ts +87 -81
  510. package/dist/tools/x402PayAndFetch.d.ts.map +1 -1
  511. package/dist/tools/x402PayAndFetch.js +295 -152
  512. package/dist/tools/x402PayAndFetch.js.map +1 -1
  513. package/dist/worker.d.ts +3 -0
  514. package/dist/worker.d.ts.map +1 -0
  515. package/dist/worker.js +39 -0
  516. package/dist/worker.js.map +1 -0
  517. package/dist/x402Server.d.ts +1 -1
  518. package/dist/x402Server.d.ts.map +1 -1
  519. package/dist/x402Server.js +409 -252
  520. package/dist/x402Server.js.map +1 -1
  521. package/docs/REVIEWER_QUICKSTART.md +113 -0
  522. package/docs/SAFEHANDS_REVIEWER_DEMO_SCRIPT.md +228 -0
  523. package/package.json +130 -83
  524. package/contracts/RiskRegistry.json +0 -223
  525. package/contracts/RiskRegistry.sol +0 -58
  526. package/dist/lib/testDodoLive.d.ts +0 -2
  527. package/dist/lib/testDodoLive.d.ts.map +0 -1
  528. package/dist/lib/testDodoLive.js +0 -105
  529. package/dist/lib/testDodoLive.js.map +0 -1
  530. package/dist/lib/testLiveSafehands.d.ts +0 -2
  531. package/dist/lib/testLiveSafehands.d.ts.map +0 -1
  532. package/dist/lib/testLiveSafehands.js +0 -93
  533. package/dist/lib/testLiveSafehands.js.map +0 -1
  534. package/dist/lib/testRpc.d.ts +0 -2
  535. package/dist/lib/testRpc.d.ts.map +0 -1
  536. package/dist/lib/testRpc.js +0 -30
  537. package/dist/lib/testRpc.js.map +0 -1
  538. package/dist/lib/testRpcLive.d.ts +0 -2
  539. package/dist/lib/testRpcLive.d.ts.map +0 -1
  540. package/dist/lib/testRpcLive.js +0 -89
  541. package/dist/lib/testRpcLive.js.map +0 -1
  542. package/dist/lib/testTools.d.ts +0 -2
  543. package/dist/lib/testTools.d.ts.map +0 -1
  544. package/dist/lib/testTools.js +0 -398
  545. package/dist/lib/testTools.js.map +0 -1
  546. package/dist/lib/testX402Live.d.ts +0 -2
  547. package/dist/lib/testX402Live.d.ts.map +0 -1
  548. package/dist/lib/testX402Live.js +0 -160
  549. package/dist/lib/testX402Live.js.map +0 -1
  550. package/dist/scripts/checkDeploy.d.ts +0 -2
  551. package/dist/scripts/checkDeploy.d.ts.map +0 -1
  552. package/dist/scripts/checkDeploy.js +0 -25
  553. package/dist/scripts/checkDeploy.js.map +0 -1
  554. package/dist/scripts/deployRegistry.d.ts +0 -2
  555. package/dist/scripts/deployRegistry.d.ts.map +0 -1
  556. package/dist/scripts/deployRegistry.js +0 -101
  557. package/dist/scripts/deployRegistry.js.map +0 -1
  558. package/dist/scripts/testRegistry.d.ts +0 -2
  559. package/dist/scripts/testRegistry.d.ts.map +0 -1
  560. package/dist/scripts/testRegistry.js +0 -44
  561. package/dist/scripts/testRegistry.js.map +0 -1
  562. package/examples/dashboard/index.html +0 -337
  563. package/examples/pharos-skill-engine/SKILL.safehands.md +0 -85
  564. package/examples/pharos-skill-engine/assets/safehands/example-actions.json +0 -49
  565. package/examples/pharos-skill-engine/assets/safehands/policy-defaults.json +0 -11
  566. package/examples/pharos-skill-engine/references/safehands.md +0 -345
  567. package/examples/scenario-hack.ts +0 -38
  568. package/skill/SKILL.md +0 -133
  569. package/skill/assets/safehands/example-actions.json +0 -49
  570. package/skill/assets/safehands/policy-defaults.json +0 -11
  571. package/skill/references/safehands.md +0 -345
package/dist/init.js CHANGED
@@ -1,66 +1,128 @@
1
- import * as readline from "readline/promises";
2
- import { writeFileSync, existsSync, readFileSync } from "fs";
3
- import { resolve } from "path";
4
- export async function runInit() {
5
- console.log("\n🛡️ Welcome to SafeHands-Pharos Setup Wizard\n");
6
- const rl = readline.createInterface({
7
- input: process.stdin,
8
- output: process.stdout
9
- });
10
- const envPath = resolve(process.cwd(), ".env");
11
- let existingEnv = "";
12
- if (existsSync(envPath)) {
13
- existingEnv = readFileSync(envPath, "utf-8");
14
- }
15
- const ansWrite = await rl.question("1. Do you want your AI Agent to execute write operations (Swap, Transfer, Approve)? (y/N): ");
16
- const enableWrite = ansWrite.trim().toLowerCase() === "y";
17
- let pk = "";
18
- if (enableWrite) {
19
- pk = await rl.question("2. Enter your Pharos Testnet Private Key (leave blank to auto-generate a managed agent wallet instead): ");
20
- }
21
- const ansBackup = await rl.question("3. Do you want to enable persistent local backups for auto-generated agent wallets? (y/N): ");
22
- const enableBackup = ansBackup.trim().toLowerCase() === "y";
23
- const dodoKey = await rl.question("4. (Optional) Enter your DODO API Key for live testnet routing (press Enter to skip): ");
24
- rl.close();
25
- // Build .env content
26
- let newEnv = "";
27
- newEnv += `WRITE_TOOLS_ENABLED=${enableWrite ? "true" : "false"}\n`;
28
- if (pk.trim()) {
29
- newEnv += `WALLET_MODE=env\n`;
30
- newEnv += `PRIVATE_KEY=${pk.trim()}\n`;
31
- }
32
- else if (enableWrite) {
33
- newEnv += `WALLET_MODE=managed-testnet\n`;
34
- }
35
- else {
36
- newEnv += `WALLET_MODE=none\n`;
37
- }
38
- if (enableBackup) {
39
- newEnv += `WALLET_STORE_PATH=./.agents/wallets.json\n`;
40
- }
41
- if (dodoKey.trim()) {
42
- newEnv += `DODO_API_KEY=${dodoKey.trim()}\n`;
43
- }
44
- // Preserve existing lines if they don't conflict (basic merge)
45
- const finalEnvLines = [];
46
- const generatedKeys = ["WRITE_TOOLS_ENABLED", "WALLET_MODE", "PRIVATE_KEY", "WALLET_STORE_PATH", "DODO_API_KEY"];
47
- if (existingEnv) {
48
- const lines = existingEnv.split("\n");
49
- for (const line of lines) {
50
- const key = line.split("=")[0];
51
- if (key && !generatedKeys.includes(key)) {
52
- finalEnvLines.push(line);
53
- }
54
- }
55
- }
56
- const finalContent = finalEnvLines.join("\n") + "\n" + newEnv;
57
- writeFileSync(envPath, finalContent.trim() + "\n");
58
- console.log("\n✅ Configuration saved to .env!");
59
- if (!pk.trim() && enableWrite) {
60
- console.log(" Since you enabled write tools without providing a Private Key,");
61
- console.log(" SafeHands will use 'managed-testnet' mode.");
62
- console.log(" Run 'npx safehands-pharos skill create_agent_wallet --input-json \"{}\"' to generate one.");
63
- }
64
- console.log("🚀 SafeHands is ready to protect your AI Agent!\n");
65
- }
1
+ import * as readline from "readline/promises";
2
+ import { writeFileSync, existsSync, readFileSync, mkdirSync } from "fs";
3
+ import { resolve, join, dirname } from "path";
4
+ import { randomBytes } from "crypto";
5
+ import { generatePrivateKey, privateKeyToAccount } from "viem/accounts";
6
+ import { encryptKey } from "./lib/wallet/index.js";
7
+ export async function runInit() {
8
+ console.log("\n🛡️ Welcome to SafeHands-Pharos Setup Wizard\n");
9
+ const rl = readline.createInterface({
10
+ input: process.stdin,
11
+ output: process.stdout
12
+ });
13
+ const envPath = resolve(process.cwd(), ".env");
14
+ let existingEnv = "";
15
+ if (existsSync(envPath)) {
16
+ existingEnv = readFileSync(envPath, "utf-8");
17
+ }
18
+ const ansWrite = await rl.question("1. Do you want your AI Agent to execute write operations (Swap, Transfer, Approve)? (y/N): ");
19
+ const enableWrite = ansWrite.trim().toLowerCase() === "y";
20
+ let pk = "";
21
+ if (enableWrite) {
22
+ pk = await rl.question("2. Enter your Pharos Mainnet Private Key (leave blank to auto-generate a managed agent wallet instead): ");
23
+ }
24
+ const ansBackup = await rl.question("3. Do you want to enable persistent local backups for auto-generated agent wallets? (y/N): ");
25
+ const enableBackup = ansBackup.trim().toLowerCase() === "y";
26
+ const dodoKey = await rl.question("4. (Optional) Enter your DODO API Key for live mainnet routing (press Enter to skip): ");
27
+ const goldskyUrl = await rl.question("5. (Optional) Enter your Goldsky Subgraph URL for historical data (press Enter to skip): ");
28
+ rl.close();
29
+ // Build .env content
30
+ let newEnv = "";
31
+ newEnv += `WRITE_TOOLS_ENABLED=${enableWrite ? "true" : "false"}\n`;
32
+ if (pk.trim()) {
33
+ newEnv += `WALLET_MODE=env\n`;
34
+ newEnv += `PRIVATE_KEY=${pk.trim()}\n`;
35
+ }
36
+ else if (enableWrite) {
37
+ newEnv += `WALLET_MODE=managed-mainnet\n`;
38
+ }
39
+ else {
40
+ newEnv += `WALLET_MODE=none\n`;
41
+ }
42
+ if (enableBackup) {
43
+ newEnv += `WALLET_STORE_PATH=./.agents/wallets.json\n`;
44
+ }
45
+ if (dodoKey.trim()) {
46
+ newEnv += `DODO_API_KEY=${dodoKey.trim()}\n`;
47
+ }
48
+ if (goldskyUrl.trim()) {
49
+ newEnv += `GOLDSKY_SUBGRAPH_URL=${goldskyUrl.trim()}\n`;
50
+ }
51
+ // Inject canonical mainnet contract addresses
52
+ newEnv += `SAFEHANDS_REGISTRY_ADDRESS=0x428e02bf85412e7242d991cd6725ec59e8b06c8d\n`;
53
+ newEnv += `SAFEHANDS_ATTESTATION_ADDRESS=0x71a7a87b3b1ab6d86204cad691bb32fd75b4588c\n`;
54
+ // Preserve existing lines if they don't conflict (basic merge)
55
+ const finalEnvLines = [];
56
+ const generatedKeys = ["WRITE_TOOLS_ENABLED", "WALLET_MODE", "PRIVATE_KEY", "WALLET_STORE_PATH", "DODO_API_KEY", "GOLDSKY_SUBGRAPH_URL", "SAFEHANDS_REGISTRY_ADDRESS", "SAFEHANDS_ATTESTATION_ADDRESS"];
57
+ if (existingEnv) {
58
+ const lines = existingEnv.split("\n");
59
+ for (const line of lines) {
60
+ const key = line.split("=")[0];
61
+ if (key && !generatedKeys.includes(key)) {
62
+ finalEnvLines.push(line);
63
+ }
64
+ }
65
+ }
66
+ const finalContent = finalEnvLines.join("\n") + "\n" + newEnv;
67
+ writeFileSync(envPath, finalContent.trim() + "\n");
68
+ console.log("\n✅ Configuration saved to .env!");
69
+ if (!pk.trim() && enableWrite) {
70
+ // Auto-create wallet + encryption key + store path
71
+ const storePath = resolve(process.cwd(), "./.agents/wallets.json");
72
+ const keyPath = join(dirname(storePath), ".key");
73
+ // Ensure .agents/ directory exists
74
+ mkdirSync(dirname(storePath), { recursive: true });
75
+ // Generate or load encryption key
76
+ let encKey;
77
+ if (existsSync(keyPath)) {
78
+ encKey = readFileSync(keyPath, "utf-8").trim();
79
+ }
80
+ else {
81
+ encKey = randomBytes(32).toString("hex");
82
+ writeFileSync(keyPath, encKey, { mode: 0o600 });
83
+ }
84
+ // Auto-create wallet
85
+ const privateKey = generatePrivateKey();
86
+ const account = privateKeyToAccount(privateKey);
87
+ const encrypted = encryptKey(privateKey, encKey);
88
+ const walletData = {};
89
+ if (existsSync(storePath)) {
90
+ try {
91
+ Object.assign(walletData, JSON.parse(readFileSync(storePath, "utf-8")));
92
+ }
93
+ catch { }
94
+ }
95
+ walletData["default"] = {
96
+ agentId: "default",
97
+ address: account.address,
98
+ encryptedKey: encrypted,
99
+ environment: "pacific-mainnet",
100
+ chainId: 1672,
101
+ isMainnet: true,
102
+ createdAt: new Date().toISOString(),
103
+ };
104
+ writeFileSync(storePath, JSON.stringify(walletData, null, 2), "utf-8");
105
+ // Append auto-generated config to .env
106
+ const appendLines = [
107
+ `WALLET_STORE_PATH=./.agents/wallets.json`,
108
+ ];
109
+ const currentEnv = readFileSync(envPath, "utf-8");
110
+ if (!currentEnv.includes("WALLET_STORE_PATH")) {
111
+ writeFileSync(envPath, currentEnv.trimEnd() + "\n" + appendLines.join("\n") + "\n");
112
+ }
113
+ console.log("");
114
+ console.log(` 🛡️ Agent wallet created automatically!`);
115
+ console.log(` Address: ${account.address}`);
116
+ console.log("");
117
+ console.log(` Next step: fund your wallet with PROS on Mainnet for gas:`);
118
+ console.log(` (No faucet available on mainnet. Transfer PROS to your wallet address.)`);
119
+ console.log("");
120
+ console.log(` Wallet is encrypted (AES-256-GCM) and stored at .agents/wallets.json`);
121
+ console.log(` Encryption key saved to .agents/.key; do not share or delete this file.`);
122
+ }
123
+ else if (pk.trim() && enableWrite) {
124
+ console.log(" Wallet mode: env (using your private key)");
125
+ }
126
+ console.log("\n🚀 SafeHands is ready to protect your AI Agent!\n");
127
+ }
66
128
  //# sourceMappingURL=init.js.map
package/dist/init.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"init.js","sourceRoot":"","sources":["../src/init.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../src/init.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ import { type AddressTrustEvidence } from "../ecosystemRegistry.js";
2
+ import { type CanonicalContractEvidence } from "./contractIntel.js";
3
+ import { type TokenRegistryEvidence } from "./pharosTokens.js";
4
+ import { type AnalyzerResult } from "./types.js";
5
+ export declare const APPROVE_SELECTOR = "0x095ea7b3";
6
+ export interface ApprovalAnalysisDetails {
7
+ isApproval: boolean;
8
+ selector: string | null;
9
+ token: string | null;
10
+ spender: string | null;
11
+ spenderKnown: boolean;
12
+ spenderLabel: string | null;
13
+ isPermit2Spender: boolean;
14
+ amountRaw: string | null;
15
+ unlimited: boolean;
16
+ isRevoke: boolean;
17
+ /** Per-network canonical recognition of the spender (null when not canonical). */
18
+ canonicalContractEvidence: CanonicalContractEvidence | null;
19
+ /** Per-network token-registry evidence for the approved token (null when unknown). */
20
+ tokenRegistryEvidence: TokenRegistryEvidence | null;
21
+ /** Ecosystem-registry match for the spender — recognition only unless verifiedCanonical. */
22
+ spenderRegistryRecognition: AddressTrustEvidence | null;
23
+ }
24
+ /**
25
+ * @param data ERC-20 calldata (expected approve(address,uint256))
26
+ * @param token optional token contract address the approval targets
27
+ */
28
+ export declare function analyzeApproval(data: string, token?: string): AnalyzerResult<ApprovalAnalysisDetails>;
29
+ //# sourceMappingURL=approval.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"approval.d.ts","sourceRoot":"","sources":["../../../src/lib/analysis/approval.ts"],"names":[],"mappings":"AASA,OAAO,EAAwB,KAAK,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AAC1F,OAAO,EAA6B,KAAK,yBAAyB,EAAE,MAAM,oBAAoB,CAAC;AAC/F,OAAO,EAAyB,KAAK,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AACtF,OAAO,EAAc,KAAK,cAAc,EAAE,MAAM,YAAY,CAAC;AAE7D,eAAO,MAAM,gBAAgB,eAAe,CAAC;AA6C7C,MAAM,WAAW,uBAAuB;IACtC,UAAU,EAAE,OAAO,CAAC;IACpB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,YAAY,EAAE,OAAO,CAAC;IACtB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,gBAAgB,EAAE,OAAO,CAAC;IAC1B,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,SAAS,EAAE,OAAO,CAAC;IACnB,QAAQ,EAAE,OAAO,CAAC;IAClB,kFAAkF;IAClF,yBAAyB,EAAE,yBAAyB,GAAG,IAAI,CAAC;IAC5D,sFAAsF;IACtF,qBAAqB,EAAE,qBAAqB,GAAG,IAAI,CAAC;IACpD,4FAA4F;IAC5F,0BAA0B,EAAE,oBAAoB,GAAG,IAAI,CAAC;CACzD;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,cAAc,CAAC,uBAAuB,CAAC,CA6GrG"}
@@ -0,0 +1,162 @@
1
+ // ─── Approval Analyzer (read-only) ─────────────────────────────────────
2
+ // Decodes ERC-20 approve(address,uint256) calldata and classifies risk. Permit2
3
+ // is recognized; deep Permit2 (PermitSingle/PermitBatch) decode is Experimental.
4
+ // Never approves, signs, or sends.
5
+ // ────────────────────────────────────────────────────────────────────────
6
+ import { decodeFunctionData, getAddress, isAddress } from "viem";
7
+ import { isUnlimitedApprovalAmount } from "../policy/actionPolicyEngine.js";
8
+ import { CHAIN_ID } from "../constants.js";
9
+ import { addressTrustEvidence } from "../ecosystemRegistry.js";
10
+ import { canonicalContractEvidence } from "./contractIntel.js";
11
+ import { tokenRegistryEvidence } from "./pharosTokens.js";
12
+ import { makeResult } from "./types.js";
13
+ export const APPROVE_SELECTOR = "0x095ea7b3";
14
+ const PERMIT2_ADDRESS = "0x000000000022d473030f116ddee9f6b43ac78ba3";
15
+ const APPROVE_ABI = [
16
+ {
17
+ name: "approve",
18
+ type: "function",
19
+ stateMutability: "nonpayable",
20
+ inputs: [
21
+ { name: "spender", type: "address" },
22
+ { name: "amount", type: "uint256" },
23
+ ],
24
+ outputs: [{ name: "", type: "bool" }],
25
+ },
26
+ ];
27
+ /**
28
+ * Spender trust, registry-driven only. "known" (risk-relaxing) requires either
29
+ * per-network canonical-infrastructure metadata or a VERIFIED allow_eligible
30
+ * registry contract on the active chain. Any other registry match is
31
+ * recognition-only and NEVER relaxes risk (truth-model rule: recognition is not
32
+ * proof). The former hardcoded DODO/FaroSwap "known spender" entries are gone —
33
+ * those addresses are testnet-provenance, absent from the registry, and were an
34
+ * unearned trust signal on mainnet.
35
+ */
36
+ function classifySpender(spender) {
37
+ const valid = isAddress(spender);
38
+ const canonical = valid ? canonicalContractEvidence(spender) : null;
39
+ const lower = spender.toLowerCase();
40
+ const isPermit2 = lower === PERMIT2_ADDRESS;
41
+ const registry = valid ? addressTrustEvidence(spender, CHAIN_ID) : null;
42
+ const registryRecognition = registry && (registry.recognized || registry.note) ? registry : null;
43
+ if (canonical)
44
+ return { known: true, label: canonical.name, isPermit2, canonical, registryRecognition };
45
+ if (registry?.verifiedCanonical) {
46
+ return { known: true, label: registry.contractLabel ?? registry.itemName, isPermit2, canonical: null, registryRecognition };
47
+ }
48
+ return { known: false, label: registryRecognition?.contractLabel ?? null, isPermit2, canonical: null, registryRecognition };
49
+ }
50
+ /**
51
+ * @param data ERC-20 calldata (expected approve(address,uint256))
52
+ * @param token optional token contract address the approval targets
53
+ */
54
+ export function analyzeApproval(data, token) {
55
+ const reasons = [];
56
+ const warnings = [];
57
+ const hex = (data?.startsWith("0x") ? data : `0x${data ?? ""}`).toLowerCase();
58
+ const selector = hex.length >= 10 ? hex.slice(0, 10) : null;
59
+ // Read-only metadata only — a known token NEVER makes a risky approval safe.
60
+ const tokenEvidence = token ? tokenRegistryEvidence(token) : null;
61
+ const notApproval = (msg) => makeResult({
62
+ analyzer: "approval",
63
+ decision: "REQUIRE_CONFIRMATION",
64
+ internalDecision: "REQUIRE_CONFIRMATION",
65
+ riskLevel: "UNKNOWN",
66
+ reasons: [msg],
67
+ warnings: [],
68
+ analyzerStatus: "unavailable",
69
+ details: { isApproval: false, selector, token: token ?? null, spender: null, spenderKnown: false, spenderLabel: null, isPermit2Spender: false, amountRaw: null, unlimited: false, isRevoke: false, canonicalContractEvidence: null, tokenRegistryEvidence: tokenEvidence, spenderRegistryRecognition: null },
70
+ });
71
+ if (selector !== APPROVE_SELECTOR) {
72
+ return notApproval(`Calldata is not an ERC-20 approve (selector ${selector ?? "n/a"}).`);
73
+ }
74
+ let spender;
75
+ let amount;
76
+ try {
77
+ const decoded = decodeFunctionData({ abi: APPROVE_ABI, data: hex });
78
+ spender = getAddress(decoded.args[0]);
79
+ amount = decoded.args[1];
80
+ }
81
+ catch {
82
+ return makeResult({
83
+ analyzer: "approval",
84
+ decision: "REQUIRE_CONFIRMATION",
85
+ internalDecision: "REQUIRE_CONFIRMATION",
86
+ riskLevel: "MEDIUM",
87
+ reasons: ["approve() calldata could not be decoded: malformed approval."],
88
+ warnings: ["Malformed approval calldata."],
89
+ analyzerStatus: "partial",
90
+ details: { isApproval: true, selector, token: token ?? null, spender: null, spenderKnown: false, spenderLabel: null, isPermit2Spender: false, amountRaw: null, unlimited: false, isRevoke: false, canonicalContractEvidence: null, tokenRegistryEvidence: tokenEvidence, spenderRegistryRecognition: null },
91
+ });
92
+ }
93
+ const unlimited = isUnlimitedApprovalAmount(amount.toString());
94
+ const isRevoke = amount === 0n;
95
+ const { known, label, isPermit2, canonical, registryRecognition } = classifySpender(spender);
96
+ if (isPermit2)
97
+ warnings.push("Spender is Permit2: Permit2-based approvals can later authorize transfers via signatures (deep Permit2 decode is Experimental).");
98
+ if (!known && registryRecognition?.recognized) {
99
+ warnings.push(`Spender matches ecosystem-registry entry "${registryRecognition.contractLabel}" (${registryRecognition.verificationStatus}); recognition only, not a safety signal.`);
100
+ }
101
+ else if (!known && registryRecognition?.note) {
102
+ warnings.push(registryRecognition.note);
103
+ }
104
+ let internalDecision;
105
+ let riskLevel;
106
+ if (!isAddress(spender)) {
107
+ internalDecision = "BLOCK";
108
+ riskLevel = "CRITICAL";
109
+ reasons.push("Spender address is invalid.");
110
+ }
111
+ else if (isRevoke) {
112
+ internalDecision = "ALLOW";
113
+ riskLevel = "LOW";
114
+ reasons.push(`Zero approval: revoking the allowance for ${spender}${label ? ` (${label})` : ""}.`);
115
+ }
116
+ else if (unlimited && !known) {
117
+ internalDecision = "BLOCK";
118
+ riskLevel = "CRITICAL";
119
+ reasons.push(`Unlimited approval to an unknown spender (${spender}); blocked.`);
120
+ }
121
+ else if (unlimited && known) {
122
+ internalDecision = "REQUIRE_CONFIRMATION";
123
+ riskLevel = "HIGH";
124
+ reasons.push(`Unlimited approval to a known spender (${label}); high risk, confirm intent.`);
125
+ }
126
+ else if (!known) {
127
+ internalDecision = "REQUIRE_CONFIRMATION";
128
+ riskLevel = "MEDIUM";
129
+ reasons.push(`Approval (amount ${amount.toString()}) to an unknown spender (${spender}); confirm before approving.`);
130
+ }
131
+ else {
132
+ internalDecision = "ALLOW";
133
+ riskLevel = "LOW";
134
+ reasons.push(`Limited approval (amount ${amount.toString()}) to a known spender (${label}).`);
135
+ }
136
+ return makeResult({
137
+ analyzer: "approval",
138
+ decision: internalDecision,
139
+ internalDecision,
140
+ riskLevel,
141
+ reasons,
142
+ warnings,
143
+ analyzerStatus: "ok",
144
+ experimental: isPermit2 || undefined,
145
+ details: {
146
+ isApproval: true,
147
+ selector,
148
+ token: token ?? null,
149
+ spender,
150
+ spenderKnown: known,
151
+ spenderLabel: label,
152
+ isPermit2Spender: isPermit2,
153
+ amountRaw: amount.toString(),
154
+ unlimited,
155
+ isRevoke,
156
+ canonicalContractEvidence: canonical,
157
+ tokenRegistryEvidence: tokenEvidence,
158
+ spenderRegistryRecognition: registryRecognition,
159
+ },
160
+ });
161
+ }
162
+ //# sourceMappingURL=approval.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"approval.js","sourceRoot":"","sources":["../../../src/lib/analysis/approval.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,60 @@
1
+ import { type CanonicalContractEvidence } from "./contractIntel.js";
2
+ import { type TokenRegistryEvidence } from "./pharosTokens.js";
3
+ import { type AnalyzerResult } from "./types.js";
4
+ export declare const PERMIT_SELECTOR = "0xd505accf";
5
+ export declare const PERMIT2_APPROVE_SELECTOR = "0x87517c45";
6
+ export declare const SET_APPROVAL_FOR_ALL_SELECTOR = "0xa22cb465";
7
+ export declare const TRANSFER_FROM_SELECTOR = "0x23b872dd";
8
+ export declare const TRANSFER_SELECTOR = "0xa9059cbb";
9
+ export declare const INCREASE_ALLOWANCE_SELECTOR = "0x39509351";
10
+ export declare const DECREASE_ALLOWANCE_SELECTOR = "0xa457c2d7";
11
+ export declare const TRANSFER_OWNERSHIP_SELECTOR = "0xf2fde38b";
12
+ export declare const RENOUNCE_OWNERSHIP_SELECTOR = "0x715018a6";
13
+ export declare const UPGRADE_TO_SELECTOR = "0x3659cfe6";
14
+ export declare const UPGRADE_TO_AND_CALL_SELECTOR = "0x4f1ef286";
15
+ export declare const CHANGE_ADMIN_SELECTOR = "0x8f283970";
16
+ /**
17
+ * Selectors this analyzer decodes on its own (i.e. everything EXCEPT approve,
18
+ * which analyzeApproval owns, and MultiSend, which analyzeSafeTx owns). The
19
+ * guardian dispatch uses this to decide when to add the calldata analyzer.
20
+ */
21
+ export declare const DECODABLE_CALLDATA_SELECTORS: ReadonlySet<string>;
22
+ /** True when `analyzeCalldata` can decode this selector (approve delegates in-analyzer). */
23
+ export declare function isDecodableCalldataSelector(selector: string | null): boolean;
24
+ export type CalldataCategory = "approval" | "transfer" | "admin" | "unknown";
25
+ export interface CalldataAnalysisDetails {
26
+ method: string | null;
27
+ selector: string | null;
28
+ category: CalldataCategory;
29
+ /** Token contract the call targets (Permit2 approve carries it inline; else the passed `token`). */
30
+ token: string | null;
31
+ /** Approval/permit spender (approve/permit/permit2/increase/decrease). */
32
+ spender: string | null;
33
+ /** setApprovalForAll operator. */
34
+ operator: string | null;
35
+ /** transfer/transferFrom recipient. */
36
+ recipient: string | null;
37
+ /** transferFrom source. */
38
+ from: string | null;
39
+ amountRaw: string | null;
40
+ unlimited: boolean;
41
+ isRevoke: boolean;
42
+ /** setApprovalForAll approved flag (null for other methods). */
43
+ approved: boolean | null;
44
+ /** Whether the spender/operator is a recognized canonical/configured address. */
45
+ counterpartyKnown: boolean;
46
+ counterpartyLabel: string | null;
47
+ /** Whether the recipient is on the operator denylist. */
48
+ recipientDenylisted: boolean;
49
+ /** True for the non-exhaustive dangerous-admin dictionary. */
50
+ dangerous: boolean;
51
+ canonicalContractEvidence: CanonicalContractEvidence | null;
52
+ tokenRegistryEvidence: TokenRegistryEvidence | null;
53
+ }
54
+ /**
55
+ * Decode and risk-classify a single calldata payload.
56
+ * @param data 0x-prefixed calldata
57
+ * @param token optional token contract address the call targets (for metadata + Permit2 token)
58
+ */
59
+ export declare function analyzeCalldata(data: string, token?: string): AnalyzerResult<CalldataAnalysisDetails>;
60
+ //# sourceMappingURL=calldata.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"calldata.d.ts","sourceRoot":"","sources":["../../../src/lib/analysis/calldata.ts"],"names":[],"mappings":"AAkBA,OAAO,EAA6B,KAAK,yBAAyB,EAAE,MAAM,oBAAoB,CAAC;AAC/F,OAAO,EAAyB,KAAK,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AACtF,OAAO,EAAc,KAAK,cAAc,EAAE,MAAM,YAAY,CAAC;AAG7D,eAAO,MAAM,eAAe,eAAe,CAAC;AAC5C,eAAO,MAAM,wBAAwB,eAAe,CAAC;AACrD,eAAO,MAAM,6BAA6B,eAAe,CAAC;AAC1D,eAAO,MAAM,sBAAsB,eAAe,CAAC;AACnD,eAAO,MAAM,iBAAiB,eAAe,CAAC;AAC9C,eAAO,MAAM,2BAA2B,eAAe,CAAC;AACxD,eAAO,MAAM,2BAA2B,eAAe,CAAC;AAGxD,eAAO,MAAM,2BAA2B,eAAe,CAAC;AACxD,eAAO,MAAM,2BAA2B,eAAe,CAAC;AACxD,eAAO,MAAM,mBAAmB,eAAe,CAAC;AAChD,eAAO,MAAM,4BAA4B,eAAe,CAAC;AACzD,eAAO,MAAM,qBAAqB,eAAe,CAAC;AAOlD;;;;GAIG;AACH,eAAO,MAAM,4BAA4B,EAAE,WAAW,CAAC,MAAM,CAa3D,CAAC;AAEH,4FAA4F;AAC5F,wBAAgB,2BAA2B,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,GAAG,OAAO,CAG5E;AAkCD,MAAM,MAAM,gBAAgB,GAAG,UAAU,GAAG,UAAU,GAAG,OAAO,GAAG,SAAS,CAAC;AAE7E,MAAM,WAAW,uBAAuB;IACtC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,QAAQ,EAAE,gBAAgB,CAAC;IAC3B,oGAAoG;IACpG,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,0EAA0E;IAC1E,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,kCAAkC;IAClC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,uCAAuC;IACvC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,2BAA2B;IAC3B,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,SAAS,EAAE,OAAO,CAAC;IACnB,QAAQ,EAAE,OAAO,CAAC;IAClB,gEAAgE;IAChE,QAAQ,EAAE,OAAO,GAAG,IAAI,CAAC;IACzB,iFAAiF;IACjF,iBAAiB,EAAE,OAAO,CAAC;IAC3B,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,yDAAyD;IACzD,mBAAmB,EAAE,OAAO,CAAC;IAC7B,8DAA8D;IAC9D,SAAS,EAAE,OAAO,CAAC;IACnB,yBAAyB,EAAE,yBAAyB,GAAG,IAAI,CAAC;IAC5D,qBAAqB,EAAE,qBAAqB,GAAG,IAAI,CAAC;CACrD;AA6DD;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,cAAc,CAAC,uBAAuB,CAAC,CAqIrG"}