safehands-pharos 1.5.0 → 2.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (561) hide show
  1. package/.agents/policies/default.json +15 -0
  2. package/.env.example +81 -64
  3. package/README.md +301 -444
  4. package/SECURITY.md +112 -0
  5. package/SKILL.md +59 -0
  6. package/contracts/SafeHandsAttestation.sol +182 -0
  7. package/contracts/SafeHandsRegistry.sol +149 -0
  8. package/dist/agent/SafeHandsGuardianAgent.d.ts +39 -0
  9. package/dist/agent/SafeHandsGuardianAgent.d.ts.map +1 -0
  10. package/dist/agent/SafeHandsGuardianAgent.js +98 -0
  11. package/dist/agent/SafeHandsGuardianAgent.js.map +1 -0
  12. package/dist/agent/agentDecisionFormatter.d.ts +43 -0
  13. package/dist/agent/agentDecisionFormatter.d.ts.map +1 -0
  14. package/dist/agent/agentDecisionFormatter.js +96 -0
  15. package/dist/agent/agentDecisionFormatter.js.map +1 -0
  16. package/dist/agent/agentEnrich.d.ts +28 -0
  17. package/dist/agent/agentEnrich.d.ts.map +1 -0
  18. package/dist/agent/agentEnrich.js +99 -0
  19. package/dist/agent/agentEnrich.js.map +1 -0
  20. package/dist/agent/agentIntentClassifier.d.ts +44 -0
  21. package/dist/agent/agentIntentClassifier.d.ts.map +1 -0
  22. package/dist/agent/agentIntentClassifier.js +77 -0
  23. package/dist/agent/agentIntentClassifier.js.map +1 -0
  24. package/dist/agent/agentPolicyResolver.d.ts +44 -0
  25. package/dist/agent/agentPolicyResolver.d.ts.map +1 -0
  26. package/dist/agent/agentPolicyResolver.js +94 -0
  27. package/dist/agent/agentPolicyResolver.js.map +1 -0
  28. package/dist/agent/agentRuntime.d.ts +12 -0
  29. package/dist/agent/agentRuntime.d.ts.map +1 -0
  30. package/dist/agent/agentRuntime.js +31 -0
  31. package/dist/agent/agentRuntime.js.map +1 -0
  32. package/dist/agent/agentToolRouter.d.ts +24 -0
  33. package/dist/agent/agentToolRouter.d.ts.map +1 -0
  34. package/dist/agent/agentToolRouter.js +89 -0
  35. package/dist/agent/agentToolRouter.js.map +1 -0
  36. package/dist/agent/guardianOperator.d.ts +35 -0
  37. package/dist/agent/guardianOperator.d.ts.map +1 -0
  38. package/dist/agent/guardianOperator.js +65 -0
  39. package/dist/agent/guardianOperator.js.map +1 -0
  40. package/dist/agent/index.d.ts +8 -0
  41. package/dist/agent/index.d.ts.map +1 -0
  42. package/dist/agent/index.js +14 -0
  43. package/dist/agent/index.js.map +1 -0
  44. package/dist/api/activityRoutes.d.ts +70 -0
  45. package/dist/api/activityRoutes.d.ts.map +1 -0
  46. package/dist/api/activityRoutes.js +100 -0
  47. package/dist/api/activityRoutes.js.map +1 -0
  48. package/dist/api/agentRoutes.d.ts +16 -0
  49. package/dist/api/agentRoutes.d.ts.map +1 -0
  50. package/dist/api/agentRoutes.js +37 -0
  51. package/dist/api/agentRoutes.js.map +1 -0
  52. package/dist/api/broadcastRoutes.d.ts +34 -0
  53. package/dist/api/broadcastRoutes.d.ts.map +1 -0
  54. package/dist/api/broadcastRoutes.js +147 -0
  55. package/dist/api/broadcastRoutes.js.map +1 -0
  56. package/dist/api/consolePage.d.ts +2 -0
  57. package/dist/api/consolePage.d.ts.map +1 -0
  58. package/dist/api/consolePage.js +206 -0
  59. package/dist/api/consolePage.js.map +1 -0
  60. package/dist/api/httpHardening.d.ts +75 -0
  61. package/dist/api/httpHardening.d.ts.map +1 -0
  62. package/dist/api/httpHardening.js +122 -0
  63. package/dist/api/httpHardening.js.map +1 -0
  64. package/dist/api/indexerRoutes.d.ts +46 -0
  65. package/dist/api/indexerRoutes.d.ts.map +1 -0
  66. package/dist/api/indexerRoutes.js +75 -0
  67. package/dist/api/indexerRoutes.js.map +1 -0
  68. package/dist/api/paidRoutes.d.ts +8 -0
  69. package/dist/api/paidRoutes.d.ts.map +1 -0
  70. package/dist/api/paidRoutes.js +175 -0
  71. package/dist/api/paidRoutes.js.map +1 -0
  72. package/dist/api/prepareRoutes.d.ts +58 -0
  73. package/dist/api/prepareRoutes.d.ts.map +1 -0
  74. package/dist/api/prepareRoutes.js +90 -0
  75. package/dist/api/prepareRoutes.js.map +1 -0
  76. package/dist/api/response.d.ts +39 -0
  77. package/dist/api/response.d.ts.map +1 -0
  78. package/dist/api/response.js +53 -0
  79. package/dist/api/response.js.map +1 -0
  80. package/dist/api/routes.d.ts +175 -0
  81. package/dist/api/routes.d.ts.map +1 -0
  82. package/dist/api/routes.js +276 -0
  83. package/dist/api/routes.js.map +1 -0
  84. package/dist/api/schemas.d.ts +147 -0
  85. package/dist/api/schemas.d.ts.map +1 -0
  86. package/dist/api/schemas.js +81 -0
  87. package/dist/api/schemas.js.map +1 -0
  88. package/dist/api/server.d.ts +11 -0
  89. package/dist/api/server.d.ts.map +1 -0
  90. package/dist/api/server.js +505 -0
  91. package/dist/api/server.js.map +1 -0
  92. package/dist/api/toolRoutes.d.ts +14 -0
  93. package/dist/api/toolRoutes.d.ts.map +1 -0
  94. package/dist/api/toolRoutes.js +138 -0
  95. package/dist/api/toolRoutes.js.map +1 -0
  96. package/dist/api/walletPrepareRoutes.d.ts +74 -0
  97. package/dist/api/walletPrepareRoutes.d.ts.map +1 -0
  98. package/dist/api/walletPrepareRoutes.js +127 -0
  99. package/dist/api/walletPrepareRoutes.js.map +1 -0
  100. package/dist/api/x402Gate.d.ts +51 -0
  101. package/dist/api/x402Gate.d.ts.map +1 -0
  102. package/dist/api/x402Gate.js +184 -0
  103. package/dist/api/x402Gate.js.map +1 -0
  104. package/dist/cli.d.ts +1 -1
  105. package/dist/cli.d.ts.map +1 -1
  106. package/dist/cli.js +29 -1
  107. package/dist/cli.js.map +1 -1
  108. package/dist/data/ecosystemRegistry.data.d.ts +3 -0
  109. package/dist/data/ecosystemRegistry.data.d.ts.map +1 -0
  110. package/dist/data/ecosystemRegistry.data.js +582 -0
  111. package/dist/data/ecosystemRegistry.data.js.map +1 -0
  112. package/dist/demo.d.ts +0 -0
  113. package/dist/demo.d.ts.map +1 -1
  114. package/dist/demo.js +43 -8
  115. package/dist/demo.js.map +1 -1
  116. package/dist/index.d.ts +0 -0
  117. package/dist/index.d.ts.map +0 -0
  118. package/dist/index.js +212 -135
  119. package/dist/index.js.map +1 -1
  120. package/dist/init.d.ts +0 -0
  121. package/dist/init.d.ts.map +1 -1
  122. package/dist/init.js +72 -10
  123. package/dist/init.js.map +1 -1
  124. package/dist/lib/analysis/approval.d.ts +29 -0
  125. package/dist/lib/analysis/approval.d.ts.map +1 -0
  126. package/dist/lib/analysis/approval.js +162 -0
  127. package/dist/lib/analysis/approval.js.map +1 -0
  128. package/dist/lib/analysis/calldata.d.ts +60 -0
  129. package/dist/lib/analysis/calldata.d.ts.map +1 -0
  130. package/dist/lib/analysis/calldata.js +349 -0
  131. package/dist/lib/analysis/calldata.js.map +1 -0
  132. package/dist/lib/analysis/contractIntel.d.ts +65 -0
  133. package/dist/lib/analysis/contractIntel.d.ts.map +1 -0
  134. package/dist/lib/analysis/contractIntel.js +320 -0
  135. package/dist/lib/analysis/contractIntel.js.map +1 -0
  136. package/dist/lib/analysis/evm.d.ts +42 -0
  137. package/dist/lib/analysis/evm.d.ts.map +1 -0
  138. package/dist/lib/analysis/evm.js +185 -0
  139. package/dist/lib/analysis/evm.js.map +1 -0
  140. package/dist/lib/analysis/gas.d.ts +4 -0
  141. package/dist/lib/analysis/gas.d.ts.map +1 -0
  142. package/dist/lib/analysis/gas.js +13 -0
  143. package/dist/lib/analysis/gas.js.map +1 -0
  144. package/dist/lib/analysis/index.d.ts +11 -0
  145. package/dist/lib/analysis/index.d.ts.map +1 -0
  146. package/dist/lib/analysis/index.js +16 -0
  147. package/dist/lib/analysis/index.js.map +1 -0
  148. package/dist/lib/analysis/pharosTokens.d.ts +31 -0
  149. package/dist/lib/analysis/pharosTokens.d.ts.map +1 -0
  150. package/dist/lib/analysis/pharosTokens.js +78 -0
  151. package/dist/lib/analysis/pharosTokens.js.map +1 -0
  152. package/dist/lib/analysis/safeTx.d.ts +27 -0
  153. package/dist/lib/analysis/safeTx.d.ts.map +1 -0
  154. package/dist/lib/analysis/safeTx.js +118 -0
  155. package/dist/lib/analysis/safeTx.js.map +1 -0
  156. package/dist/lib/analysis/token.d.ts +21 -0
  157. package/dist/lib/analysis/token.d.ts.map +1 -0
  158. package/dist/lib/analysis/token.js +151 -0
  159. package/dist/lib/analysis/token.js.map +1 -0
  160. package/dist/lib/analysis/types.d.ts +49 -0
  161. package/dist/lib/analysis/types.d.ts.map +1 -0
  162. package/dist/lib/analysis/types.js +10 -0
  163. package/dist/lib/analysis/types.js.map +1 -0
  164. package/dist/lib/analysis/x402.d.ts +24 -0
  165. package/dist/lib/analysis/x402.d.ts.map +1 -0
  166. package/dist/lib/analysis/x402.js +60 -0
  167. package/dist/lib/analysis/x402.js.map +1 -0
  168. package/dist/lib/auditLog.d.ts +1 -0
  169. package/dist/lib/auditLog.d.ts.map +1 -1
  170. package/dist/lib/auditLog.js +0 -0
  171. package/dist/lib/auditLog.js.map +1 -1
  172. package/dist/lib/config.d.ts +77 -0
  173. package/dist/lib/config.d.ts.map +1 -0
  174. package/dist/lib/config.js +120 -0
  175. package/dist/lib/config.js.map +1 -0
  176. package/dist/lib/constants.d.ts +246 -97
  177. package/dist/lib/constants.d.ts.map +1 -1
  178. package/dist/lib/constants.js +334 -127
  179. package/dist/lib/constants.js.map +1 -1
  180. package/dist/lib/dodoApi.d.ts +26 -3
  181. package/dist/lib/dodoApi.d.ts.map +1 -1
  182. package/dist/lib/dodoApi.js +80 -17
  183. package/dist/lib/dodoApi.js.map +1 -1
  184. package/dist/lib/ecosystemRegistry.d.ts +116 -0
  185. package/dist/lib/ecosystemRegistry.d.ts.map +1 -0
  186. package/dist/lib/ecosystemRegistry.js +178 -0
  187. package/dist/lib/ecosystemRegistry.js.map +1 -0
  188. package/dist/lib/envLoader.d.ts +0 -0
  189. package/dist/lib/envLoader.d.ts.map +0 -0
  190. package/dist/lib/envLoader.js +39 -18
  191. package/dist/lib/envLoader.js.map +1 -1
  192. package/dist/lib/goldsky.d.ts +58 -0
  193. package/dist/lib/goldsky.d.ts.map +1 -0
  194. package/dist/lib/goldsky.js +275 -0
  195. package/dist/lib/goldsky.js.map +1 -0
  196. package/dist/lib/guardian/decision.d.ts +23 -0
  197. package/dist/lib/guardian/decision.d.ts.map +1 -0
  198. package/dist/lib/guardian/decision.js +40 -0
  199. package/dist/lib/guardian/decision.js.map +1 -0
  200. package/dist/lib/http.d.ts +0 -1
  201. package/dist/lib/http.d.ts.map +1 -1
  202. package/dist/lib/http.js +297 -32
  203. package/dist/lib/http.js.map +1 -1
  204. package/dist/lib/managedExecution.d.ts +19 -0
  205. package/dist/lib/managedExecution.d.ts.map +1 -0
  206. package/dist/lib/managedExecution.js +64 -0
  207. package/dist/lib/managedExecution.js.map +1 -0
  208. package/dist/lib/merkleBatcher.d.ts +23 -0
  209. package/dist/lib/merkleBatcher.d.ts.map +1 -0
  210. package/dist/lib/merkleBatcher.js +62 -0
  211. package/dist/lib/merkleBatcher.js.map +1 -0
  212. package/dist/lib/networks.d.ts +48 -0
  213. package/dist/lib/networks.d.ts.map +1 -0
  214. package/dist/lib/networks.js +103 -0
  215. package/dist/lib/networks.js.map +1 -0
  216. package/dist/lib/observability/accessContext.d.ts +29 -0
  217. package/dist/lib/observability/accessContext.d.ts.map +1 -0
  218. package/dist/lib/observability/accessContext.js +50 -0
  219. package/dist/lib/observability/accessContext.js.map +1 -0
  220. package/dist/lib/observability/activityStore.d.ts +70 -0
  221. package/dist/lib/observability/activityStore.d.ts.map +1 -0
  222. package/dist/lib/observability/activityStore.js +149 -0
  223. package/dist/lib/observability/activityStore.js.map +1 -0
  224. package/dist/lib/observability/apiKey.d.ts +55 -0
  225. package/dist/lib/observability/apiKey.d.ts.map +1 -0
  226. package/dist/lib/observability/apiKey.js +141 -0
  227. package/dist/lib/observability/apiKey.js.map +1 -0
  228. package/dist/lib/observability/logger.d.ts +30 -0
  229. package/dist/lib/observability/logger.d.ts.map +1 -0
  230. package/dist/lib/observability/logger.js +30 -0
  231. package/dist/lib/observability/logger.js.map +1 -0
  232. package/dist/lib/observability/quota.d.ts +33 -0
  233. package/dist/lib/observability/quota.d.ts.map +1 -0
  234. package/dist/lib/observability/quota.js +49 -0
  235. package/dist/lib/observability/quota.js.map +1 -0
  236. package/dist/lib/observability/requestId.d.ts +8 -0
  237. package/dist/lib/observability/requestId.d.ts.map +1 -0
  238. package/dist/lib/observability/requestId.js +24 -0
  239. package/dist/lib/observability/requestId.js.map +1 -0
  240. package/dist/lib/observability/sanitize.d.ts +77 -0
  241. package/dist/lib/observability/sanitize.d.ts.map +1 -0
  242. package/dist/lib/observability/sanitize.js +228 -0
  243. package/dist/lib/observability/sanitize.js.map +1 -0
  244. package/dist/lib/observability/scopes.d.ts +20 -0
  245. package/dist/lib/observability/scopes.d.ts.map +1 -0
  246. package/dist/lib/observability/scopes.js +77 -0
  247. package/dist/lib/observability/scopes.js.map +1 -0
  248. package/dist/lib/okxDexApi.d.ts +106 -0
  249. package/dist/lib/okxDexApi.d.ts.map +1 -0
  250. package/dist/lib/okxDexApi.js +221 -0
  251. package/dist/lib/okxDexApi.js.map +1 -0
  252. package/dist/lib/persistentJsonStore.d.ts +5 -0
  253. package/dist/lib/persistentJsonStore.d.ts.map +1 -0
  254. package/dist/lib/persistentJsonStore.js +39 -0
  255. package/dist/lib/persistentJsonStore.js.map +1 -0
  256. package/dist/lib/pharos/attestationPublisher.d.ts +50 -0
  257. package/dist/lib/pharos/attestationPublisher.d.ts.map +1 -0
  258. package/dist/lib/pharos/attestationPublisher.js +262 -0
  259. package/dist/lib/pharos/attestationPublisher.js.map +1 -0
  260. package/dist/lib/pharos/ecosystem.d.ts +52 -0
  261. package/dist/lib/pharos/ecosystem.d.ts.map +1 -0
  262. package/dist/lib/pharos/ecosystem.js +431 -0
  263. package/dist/lib/pharos/ecosystem.js.map +1 -0
  264. package/dist/lib/pharos/ecosystemEvidence.d.ts +53 -0
  265. package/dist/lib/pharos/ecosystemEvidence.d.ts.map +1 -0
  266. package/dist/lib/pharos/ecosystemEvidence.js +133 -0
  267. package/dist/lib/pharos/ecosystemEvidence.js.map +1 -0
  268. package/dist/lib/pharos/rpc.d.ts +44 -0
  269. package/dist/lib/pharos/rpc.d.ts.map +1 -0
  270. package/dist/lib/pharos/rpc.js +90 -0
  271. package/dist/lib/pharos/rpc.js.map +1 -0
  272. package/dist/lib/pharos/rpcEvidence.d.ts +49 -0
  273. package/dist/lib/pharos/rpcEvidence.d.ts.map +1 -0
  274. package/dist/lib/pharos/rpcEvidence.js +46 -0
  275. package/dist/lib/pharos/rpcEvidence.js.map +1 -0
  276. package/dist/lib/pharos/rpcMethods.d.ts +46 -0
  277. package/dist/lib/pharos/rpcMethods.d.ts.map +1 -0
  278. package/dist/lib/pharos/rpcMethods.js +176 -0
  279. package/dist/lib/pharos/rpcMethods.js.map +1 -0
  280. package/dist/lib/pharos/spvVerifier.d.ts +47 -0
  281. package/dist/lib/pharos/spvVerifier.d.ts.map +1 -0
  282. package/dist/lib/pharos/spvVerifier.js +105 -0
  283. package/dist/lib/pharos/spvVerifier.js.map +1 -0
  284. package/dist/lib/pharos/userSignedBroadcaster.d.ts +10 -0
  285. package/dist/lib/pharos/userSignedBroadcaster.d.ts.map +1 -0
  286. package/dist/lib/pharos/userSignedBroadcaster.js +50 -0
  287. package/dist/lib/pharos/userSignedBroadcaster.js.map +1 -0
  288. package/dist/lib/pharosClient.d.ts +5 -10
  289. package/dist/lib/pharosClient.d.ts.map +1 -1
  290. package/dist/lib/pharosClient.js +9 -16
  291. package/dist/lib/pharosClient.js.map +1 -1
  292. package/dist/lib/policy/actionPolicyEngine.d.ts +37 -1
  293. package/dist/lib/policy/actionPolicyEngine.d.ts.map +1 -1
  294. package/dist/lib/policy/actionPolicyEngine.js +213 -52
  295. package/dist/lib/policy/actionPolicyEngine.js.map +1 -1
  296. package/dist/lib/policy/agentPolicy.d.ts +29 -0
  297. package/dist/lib/policy/agentPolicy.d.ts.map +1 -0
  298. package/dist/lib/policy/agentPolicy.js +154 -0
  299. package/dist/lib/policy/agentPolicy.js.map +1 -0
  300. package/dist/lib/policy/policyPresets.d.ts +30 -0
  301. package/dist/lib/policy/policyPresets.d.ts.map +1 -0
  302. package/dist/lib/policy/policyPresets.js +124 -0
  303. package/dist/lib/policy/policyPresets.js.map +1 -0
  304. package/dist/lib/policy/writeExecutionGate.d.ts +23 -0
  305. package/dist/lib/policy/writeExecutionGate.d.ts.map +1 -0
  306. package/dist/lib/policy/writeExecutionGate.js +65 -0
  307. package/dist/lib/policy/writeExecutionGate.js.map +1 -0
  308. package/dist/lib/preparedTxStore.d.ts +21 -0
  309. package/dist/lib/preparedTxStore.d.ts.map +1 -0
  310. package/dist/lib/preparedTxStore.js +90 -0
  311. package/dist/lib/preparedTxStore.js.map +1 -0
  312. package/dist/lib/price/chainlinkPushProvider.d.ts +34 -0
  313. package/dist/lib/price/chainlinkPushProvider.d.ts.map +1 -0
  314. package/dist/lib/price/chainlinkPushProvider.js +36 -0
  315. package/dist/lib/price/chainlinkPushProvider.js.map +1 -0
  316. package/dist/lib/price/feedRegistry.d.ts +26 -0
  317. package/dist/lib/price/feedRegistry.d.ts.map +1 -0
  318. package/dist/lib/price/feedRegistry.js +67 -0
  319. package/dist/lib/price/feedRegistry.js.map +1 -0
  320. package/dist/lib/price/priceResolver.d.ts +35 -0
  321. package/dist/lib/price/priceResolver.d.ts.map +1 -0
  322. package/dist/lib/price/priceResolver.js +246 -0
  323. package/dist/lib/price/priceResolver.js.map +1 -0
  324. package/dist/lib/price/supraProvider.d.ts +9 -0
  325. package/dist/lib/price/supraProvider.d.ts.map +1 -0
  326. package/dist/lib/price/supraProvider.js +17 -0
  327. package/dist/lib/price/supraProvider.js.map +1 -0
  328. package/dist/lib/price/types.d.ts +67 -0
  329. package/dist/lib/price/types.d.ts.map +1 -0
  330. package/dist/lib/price/types.js +7 -0
  331. package/dist/lib/price/types.js.map +1 -0
  332. package/dist/lib/productionGuards.d.ts +16 -0
  333. package/dist/lib/productionGuards.d.ts.map +1 -0
  334. package/dist/lib/productionGuards.js +93 -0
  335. package/dist/lib/productionGuards.js.map +1 -0
  336. package/dist/lib/recipientSafety.d.ts +5 -0
  337. package/dist/lib/recipientSafety.d.ts.map +1 -0
  338. package/dist/lib/recipientSafety.js +28 -0
  339. package/dist/lib/recipientSafety.js.map +1 -0
  340. package/dist/lib/riskEngine.d.ts +19 -0
  341. package/dist/lib/riskEngine.d.ts.map +1 -1
  342. package/dist/lib/riskEngine.js +94 -36
  343. package/dist/lib/riskEngine.js.map +1 -1
  344. package/dist/lib/riskInclusion.d.ts +72 -0
  345. package/dist/lib/riskInclusion.d.ts.map +1 -0
  346. package/dist/lib/riskInclusion.js +252 -0
  347. package/dist/lib/riskInclusion.js.map +1 -0
  348. package/dist/lib/safeHandsRegistry.d.ts +32 -0
  349. package/dist/lib/safeHandsRegistry.d.ts.map +1 -0
  350. package/dist/lib/safeHandsRegistry.js +151 -0
  351. package/dist/lib/safeHandsRegistry.js.map +1 -0
  352. package/dist/lib/signer/index.d.ts +3 -3
  353. package/dist/lib/signer/index.d.ts.map +1 -1
  354. package/dist/lib/signer/index.js +33 -11
  355. package/dist/lib/signer/index.js.map +1 -1
  356. package/dist/lib/spendAccumulator.d.ts +24 -1
  357. package/dist/lib/spendAccumulator.d.ts.map +1 -1
  358. package/dist/lib/spendAccumulator.js +76 -6
  359. package/dist/lib/spendAccumulator.js.map +1 -1
  360. package/dist/lib/toolResponse.d.ts +6 -1
  361. package/dist/lib/toolResponse.d.ts.map +1 -1
  362. package/dist/lib/toolResponse.js +13 -9
  363. package/dist/lib/toolResponse.js.map +1 -1
  364. package/dist/lib/validation.d.ts +7 -0
  365. package/dist/lib/validation.d.ts.map +1 -0
  366. package/dist/lib/validation.js +62 -0
  367. package/dist/lib/validation.js.map +1 -0
  368. package/dist/lib/wallet/index.d.ts +8 -12
  369. package/dist/lib/wallet/index.d.ts.map +1 -1
  370. package/dist/lib/wallet/index.js +48 -35
  371. package/dist/lib/wallet/index.js.map +1 -1
  372. package/dist/lib/x402ReplayStore.d.ts +6 -0
  373. package/dist/lib/x402ReplayStore.d.ts.map +1 -0
  374. package/dist/lib/x402ReplayStore.js +79 -0
  375. package/dist/lib/x402ReplayStore.js.map +1 -0
  376. package/dist/safehands.zip +0 -0
  377. package/dist/sdk.d.ts +14 -0
  378. package/dist/sdk.d.ts.map +1 -0
  379. package/dist/sdk.js +25 -0
  380. package/dist/sdk.js.map +1 -0
  381. package/dist/tools/approveToken.d.ts +31 -10
  382. package/dist/tools/approveToken.d.ts.map +1 -1
  383. package/dist/tools/approveToken.js +91 -24
  384. package/dist/tools/approveToken.js.map +1 -1
  385. package/dist/tools/assessRisk.d.ts +13 -26
  386. package/dist/tools/assessRisk.d.ts.map +1 -1
  387. package/dist/tools/assessRisk.js +34 -75
  388. package/dist/tools/assessRisk.js.map +1 -1
  389. package/dist/tools/checkAllowance.d.ts +9 -3
  390. package/dist/tools/checkAllowance.d.ts.map +1 -1
  391. package/dist/tools/checkAllowance.js +27 -5
  392. package/dist/tools/checkAllowance.js.map +1 -1
  393. package/dist/tools/checkTokenSecurity.d.ts +62 -5
  394. package/dist/tools/checkTokenSecurity.d.ts.map +1 -1
  395. package/dist/tools/checkTokenSecurity.js +166 -21
  396. package/dist/tools/checkTokenSecurity.js.map +1 -1
  397. package/dist/tools/createAgentWallet.d.ts +4 -2
  398. package/dist/tools/createAgentWallet.d.ts.map +1 -1
  399. package/dist/tools/createAgentWallet.js +36 -31
  400. package/dist/tools/createAgentWallet.js.map +1 -1
  401. package/dist/tools/estimateGas.d.ts +7 -2
  402. package/dist/tools/estimateGas.d.ts.map +1 -1
  403. package/dist/tools/estimateGas.js +16 -10
  404. package/dist/tools/estimateGas.js.map +1 -1
  405. package/dist/tools/executeSwap.d.ts +56 -8
  406. package/dist/tools/executeSwap.d.ts.map +1 -1
  407. package/dist/tools/executeSwap.js +194 -46
  408. package/dist/tools/executeSwap.js.map +1 -1
  409. package/dist/tools/explainRisk.d.ts +9 -9
  410. package/dist/tools/explainRisk.d.ts.map +1 -1
  411. package/dist/tools/explainRisk.js +5 -4
  412. package/dist/tools/explainRisk.js.map +1 -1
  413. package/dist/tools/getAgentPolicy.d.ts +15 -0
  414. package/dist/tools/getAgentPolicy.d.ts.map +1 -0
  415. package/dist/tools/getAgentPolicy.js +16 -0
  416. package/dist/tools/getAgentPolicy.js.map +1 -0
  417. package/dist/tools/getAgentReputation.d.ts +31 -0
  418. package/dist/tools/getAgentReputation.d.ts.map +1 -0
  419. package/dist/tools/getAgentReputation.js +44 -0
  420. package/dist/tools/getAgentReputation.js.map +1 -0
  421. package/dist/tools/getAgentWallet.d.ts +1 -1
  422. package/dist/tools/getAgentWallet.d.ts.map +1 -1
  423. package/dist/tools/getAgentWallet.js +11 -1
  424. package/dist/tools/getAgentWallet.js.map +1 -1
  425. package/dist/tools/getAgentWalletBalance.d.ts +1 -1
  426. package/dist/tools/getAgentWalletBalance.d.ts.map +1 -1
  427. package/dist/tools/getAgentWalletBalance.js +58 -26
  428. package/dist/tools/getAgentWalletBalance.js.map +1 -1
  429. package/dist/tools/getExecutionHistory.d.ts +1 -1
  430. package/dist/tools/getExecutionHistory.d.ts.map +1 -1
  431. package/dist/tools/getExecutionHistory.js +13 -19
  432. package/dist/tools/getExecutionHistory.js.map +1 -1
  433. package/dist/tools/getGasPrice.d.ts +3 -3
  434. package/dist/tools/getGasPrice.d.ts.map +0 -0
  435. package/dist/tools/getGasPrice.js +7 -7
  436. package/dist/tools/getGasPrice.js.map +1 -1
  437. package/dist/tools/getPoolInfo.d.ts +17 -17
  438. package/dist/tools/getPoolInfo.d.ts.map +1 -1
  439. package/dist/tools/getPoolInfo.js +14 -9
  440. package/dist/tools/getPoolInfo.js.map +1 -1
  441. package/dist/tools/getSpvProof.d.ts +24 -0
  442. package/dist/tools/getSpvProof.d.ts.map +1 -0
  443. package/dist/tools/getSpvProof.js +64 -0
  444. package/dist/tools/getSpvProof.js.map +1 -0
  445. package/dist/tools/getTokenPrice.d.ts +28 -85
  446. package/dist/tools/getTokenPrice.d.ts.map +1 -1
  447. package/dist/tools/getTokenPrice.js +87 -94
  448. package/dist/tools/getTokenPrice.js.map +1 -1
  449. package/dist/tools/getTransactionStatus.d.ts +2 -2
  450. package/dist/tools/getTransactionStatus.d.ts.map +0 -0
  451. package/dist/tools/getTransactionStatus.js +0 -0
  452. package/dist/tools/getTransactionStatus.js.map +0 -0
  453. package/dist/tools/getWalletBalance.d.ts +38 -3
  454. package/dist/tools/getWalletBalance.d.ts.map +1 -1
  455. package/dist/tools/getWalletBalance.js +92 -52
  456. package/dist/tools/getWalletBalance.js.map +1 -1
  457. package/dist/tools/publishRiskScore.d.ts +36 -14
  458. package/dist/tools/publishRiskScore.d.ts.map +1 -1
  459. package/dist/tools/publishRiskScore.js +80 -32
  460. package/dist/tools/publishRiskScore.js.map +1 -1
  461. package/dist/tools/queryGoldsky.d.ts +20 -0
  462. package/dist/tools/queryGoldsky.d.ts.map +1 -0
  463. package/dist/tools/queryGoldsky.js +29 -0
  464. package/dist/tools/queryGoldsky.js.map +1 -0
  465. package/dist/tools/queryRiskRegistry.d.ts +14 -14
  466. package/dist/tools/queryRiskRegistry.d.ts.map +1 -1
  467. package/dist/tools/queryRiskRegistry.js +34 -30
  468. package/dist/tools/queryRiskRegistry.js.map +1 -1
  469. package/dist/tools/safehandsPreflightCheck.d.ts +29 -14
  470. package/dist/tools/safehandsPreflightCheck.d.ts.map +1 -1
  471. package/dist/tools/safehandsPreflightCheck.js +133 -6
  472. package/dist/tools/safehandsPreflightCheck.js.map +1 -1
  473. package/dist/tools/safehandsRiskReport.d.ts +29 -14
  474. package/dist/tools/safehandsRiskReport.d.ts.map +1 -1
  475. package/dist/tools/safehandsRiskReport.js +23 -3
  476. package/dist/tools/safehandsRiskReport.js.map +1 -1
  477. package/dist/tools/safehandsSafeExecute.d.ts +1 -1
  478. package/dist/tools/safehandsSafeExecute.d.ts.map +1 -1
  479. package/dist/tools/safehandsSafeExecute.js +100 -17
  480. package/dist/tools/safehandsSafeExecute.js.map +1 -1
  481. package/dist/tools/safehandsWalletHealth.d.ts +15 -1
  482. package/dist/tools/safehandsWalletHealth.d.ts.map +1 -1
  483. package/dist/tools/safehandsWalletHealth.js +67 -25
  484. package/dist/tools/safehandsWalletHealth.js.map +1 -1
  485. package/dist/tools/safehandsX402Preflight.d.ts +3 -3
  486. package/dist/tools/safehandsX402Preflight.d.ts.map +1 -1
  487. package/dist/tools/safehandsX402Preflight.js +24 -3
  488. package/dist/tools/safehandsX402Preflight.js.map +1 -1
  489. package/dist/tools/sendPayment.d.ts +10 -4
  490. package/dist/tools/sendPayment.d.ts.map +1 -1
  491. package/dist/tools/sendPayment.js +63 -36
  492. package/dist/tools/sendPayment.js.map +1 -1
  493. package/dist/tools/setAgentPolicy.d.ts +75 -0
  494. package/dist/tools/setAgentPolicy.d.ts.map +1 -0
  495. package/dist/tools/setAgentPolicy.js +80 -0
  496. package/dist/tools/setAgentPolicy.js.map +1 -0
  497. package/dist/tools/simulateTransaction.d.ts +7 -3
  498. package/dist/tools/simulateTransaction.d.ts.map +1 -1
  499. package/dist/tools/simulateTransaction.js +42 -9
  500. package/dist/tools/simulateTransaction.js.map +1 -1
  501. package/dist/tools/tokenRegistryStatus.d.ts +25 -5
  502. package/dist/tools/tokenRegistryStatus.d.ts.map +1 -1
  503. package/dist/tools/tokenRegistryStatus.js +61 -31
  504. package/dist/tools/tokenRegistryStatus.js.map +1 -1
  505. package/dist/tools/verifyRiskInclusion.d.ts +59 -0
  506. package/dist/tools/verifyRiskInclusion.d.ts.map +1 -0
  507. package/dist/tools/verifyRiskInclusion.js +40 -0
  508. package/dist/tools/verifyRiskInclusion.js.map +1 -0
  509. package/dist/tools/x402PayAndFetch.d.ts +15 -9
  510. package/dist/tools/x402PayAndFetch.d.ts.map +1 -1
  511. package/dist/tools/x402PayAndFetch.js +163 -20
  512. package/dist/tools/x402PayAndFetch.js.map +1 -1
  513. package/dist/worker.d.ts +3 -0
  514. package/dist/worker.d.ts.map +1 -0
  515. package/dist/worker.js +39 -0
  516. package/dist/worker.js.map +1 -0
  517. package/dist/x402Server.d.ts +1 -1
  518. package/dist/x402Server.d.ts.map +1 -1
  519. package/dist/x402Server.js +144 -35
  520. package/dist/x402Server.js.map +1 -1
  521. package/docs/REVIEWER_QUICKSTART.md +113 -0
  522. package/docs/SAFEHANDS_REVIEWER_DEMO_SCRIPT.md +228 -0
  523. package/package.json +130 -73
  524. package/contracts/RiskRegistry.json +0 -223
  525. package/contracts/RiskRegistry.sol +0 -58
  526. package/dist/lib/testDodoLive.d.ts +0 -2
  527. package/dist/lib/testDodoLive.d.ts.map +0 -1
  528. package/dist/lib/testDodoLive.js +0 -105
  529. package/dist/lib/testDodoLive.js.map +0 -1
  530. package/dist/lib/testLiveSafehands.d.ts +0 -2
  531. package/dist/lib/testLiveSafehands.d.ts.map +0 -1
  532. package/dist/lib/testLiveSafehands.js +0 -93
  533. package/dist/lib/testLiveSafehands.js.map +0 -1
  534. package/dist/lib/testRpc.d.ts +0 -2
  535. package/dist/lib/testRpc.d.ts.map +0 -1
  536. package/dist/lib/testRpc.js +0 -30
  537. package/dist/lib/testRpc.js.map +0 -1
  538. package/dist/lib/testRpcLive.d.ts +0 -2
  539. package/dist/lib/testRpcLive.d.ts.map +0 -1
  540. package/dist/lib/testRpcLive.js +0 -89
  541. package/dist/lib/testRpcLive.js.map +0 -1
  542. package/dist/lib/testTools.d.ts +0 -2
  543. package/dist/lib/testTools.d.ts.map +0 -1
  544. package/dist/lib/testTools.js +0 -397
  545. package/dist/lib/testTools.js.map +0 -1
  546. package/dist/lib/testX402Live.d.ts +0 -2
  547. package/dist/lib/testX402Live.d.ts.map +0 -1
  548. package/dist/lib/testX402Live.js +0 -160
  549. package/dist/lib/testX402Live.js.map +0 -1
  550. package/dist/scripts/checkDeploy.d.ts +0 -2
  551. package/dist/scripts/checkDeploy.d.ts.map +0 -1
  552. package/dist/scripts/checkDeploy.js +0 -25
  553. package/dist/scripts/checkDeploy.js.map +0 -1
  554. package/dist/scripts/deployRegistry.d.ts +0 -2
  555. package/dist/scripts/deployRegistry.d.ts.map +0 -1
  556. package/dist/scripts/deployRegistry.js +0 -101
  557. package/dist/scripts/deployRegistry.js.map +0 -1
  558. package/dist/scripts/testRegistry.d.ts +0 -2
  559. package/dist/scripts/testRegistry.d.ts.map +0 -1
  560. package/dist/scripts/testRegistry.js +0 -44
  561. package/dist/scripts/testRegistry.js.map +0 -1
@@ -0,0 +1,62 @@
1
+ // ─── Shared Validation Helpers ─────────────────────────────────────────
2
+ // Reusable validators for amount, address, and field presence.
3
+ // Used by preflight, handlers, and smoke tests.
4
+ // ────────────────────────────────────────────────────────────────────────
5
+ import { isAddress } from "viem";
6
+ export function isValidPositiveAmount(value) {
7
+ if (value === null || value === undefined)
8
+ return false;
9
+ const str = String(value).trim();
10
+ if (str === "")
11
+ return false;
12
+ const n = Number(str);
13
+ return Number.isFinite(n) && n > 0;
14
+ }
15
+ export function validatePositiveAmount(value, fieldName) {
16
+ if (value === null || value === undefined) {
17
+ return `${fieldName} is required and must be a positive number.`;
18
+ }
19
+ const str = String(value).trim();
20
+ if (str === "")
21
+ return `${fieldName} must not be empty.`;
22
+ const n = Number(str);
23
+ if (!Number.isFinite(n))
24
+ return `${fieldName} must be a valid finite number (got "${str}").`;
25
+ if (n <= 0)
26
+ return `${fieldName} must be positive (got ${n}).`;
27
+ return null;
28
+ }
29
+ export function validateAddress(value, fieldName) {
30
+ if (value === null || value === undefined || value === "") {
31
+ return `${fieldName} is required.`;
32
+ }
33
+ const str = String(value).trim();
34
+ if (!isAddress(str))
35
+ return `${fieldName} is not a valid EVM address (got "${str}").`;
36
+ return null;
37
+ }
38
+ export function validateNonZeroAddress(value, fieldName) {
39
+ const addrError = validateAddress(value, fieldName);
40
+ if (addrError)
41
+ return addrError;
42
+ if (String(value).trim().toLowerCase() === "0x0000000000000000000000000000000000000000") {
43
+ return `${fieldName} must not be the zero address.`;
44
+ }
45
+ return null;
46
+ }
47
+ const KNOWN_TOKEN_SYMBOLS = new Set(["PROS", "USDC", "USDT", "WBTC", "WETH", "WPROS", "CIRCLE_USDC"]);
48
+ export function validateTokenIdentifier(value, fieldName) {
49
+ if (value === null || value === undefined || value === "") {
50
+ return `${fieldName} is required.`;
51
+ }
52
+ const str = String(value).trim();
53
+ if (KNOWN_TOKEN_SYMBOLS.has(str.toUpperCase()))
54
+ return null;
55
+ if (isAddress(str))
56
+ return null;
57
+ return `${fieldName} must be a known token symbol (PROS, USDC, USDT, etc.) or a valid EVM address (got "${str}").`;
58
+ }
59
+ export function collectErrors(errors) {
60
+ return errors.filter((e) => e !== null);
61
+ }
62
+ //# sourceMappingURL=validation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validation.js","sourceRoot":"","sources":["../../src/lib/validation.ts"],"names":[],"mappings":"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"}
@@ -2,9 +2,9 @@ export interface StoredWallet {
2
2
  agentId: string;
3
3
  address: string;
4
4
  encryptedKey: string;
5
- environment: "atlantic-testnet";
6
- chainId: 688689;
7
- isMainnet: false;
5
+ environment: "pacific-mainnet" | "pacific-mainnet";
6
+ chainId: 1672 | 688689;
7
+ isMainnet: boolean;
8
8
  createdAt: string;
9
9
  }
10
10
  export interface WalletStoreInterface {
@@ -13,20 +13,16 @@ export interface WalletStoreInterface {
13
13
  has(agentId: string): Promise<boolean>;
14
14
  }
15
15
  /**
16
- * Encrypts a private key with AES-256-GCM.
17
- * Output format: <iv(12B)><tag(16B)><ciphertext> as hex string (no 0x prefix).
16
+ * Encrypts a private key with AES-256-GCM under a scrypt-derived key.
17
+ * Output: "sh2:" + hex(salt(16) || iv(12) || tag(16) || ciphertext).
18
18
  */
19
19
  export declare function encryptKey(privateKey: string, encryptionKey: string): string;
20
20
  /**
21
- * Decrypts a private key. Handles both:
22
- * - New AES-256-GCM format (pure hex, no 0x prefix)
23
- * - Legacy XOR format (starts with "0x") — transparently supported for migration
21
+ * Decrypts a private key. Supports the current "sh2:" scrypt format and the
22
+ * legacy pure-hex SHA-256 AES-256-GCM format (read-only, for migration). The
23
+ * removed XOR path ("0x"-prefixed) is rejected those wallets must be recreated.
24
24
  */
25
25
  export declare function decryptKey(encrypted: string, encryptionKey: string): string;
26
- /** @deprecated Use encryptKey / decryptKey. Kept for callers that haven't migrated yet. */
27
- export declare function obfuscateKey(privateKey: string, encryptionKey: string): string;
28
- /** @deprecated Use decryptKey. */
29
- export declare function deobfuscateKey(obfuscated: string, encryptionKey: string): string;
30
26
  /**
31
27
  * Returns the effective encryption key.
32
28
  * - Persistent store: WALLET_ENCRYPTION_KEY must be set (wallets won't survive restarts otherwise).
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/lib/wallet/index.ts"],"names":[],"mappings":"AAUA,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,kBAAkB,CAAC;IAChC,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,KAAK,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,oBAAoB;IACnC,GAAG,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,CAAC;IACnD,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1D,GAAG,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CACxC;AA4DD;;;GAGG;AACH,wBAAgB,UAAU,CAAC,UAAU,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,MAAM,CAQ5E;AAED;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,SAAS,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,MAAM,CAc3E;AAcD,2FAA2F;AAC3F,wBAAgB,YAAY,CAAC,UAAU,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,MAAM,CAE9E;AAED,kCAAkC;AAClC,wBAAgB,cAAc,CAAC,UAAU,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,MAAM,CAEhF;AAOD;;;;GAIG;AACH,wBAAgB,yBAAyB,IAAI,MAAM,CAElD;AAYD,wBAAgB,yBAAyB,IAAI,OAAO,CAEnD;AAED,eAAO,MAAM,WAAW,sBAAsB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/lib/wallet/index.ts"],"names":[],"mappings":"AAYA,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,iBAAiB,GAAG,iBAAiB,CAAC;IACnD,OAAO,EAAE,IAAI,GAAG,MAAM,CAAC;IACvB,SAAS,EAAE,OAAO,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,oBAAoB;IACnC,GAAG,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,CAAC;IACnD,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1D,GAAG,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CACxC;AA6ED;;;GAGG;AACH,wBAAgB,UAAU,CAAC,UAAU,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,MAAM,CAS5E;AAED;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,SAAS,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,MAAM,CA+B3E;AAOD;;;;GAIG;AACH,wBAAgB,yBAAyB,IAAI,MAAM,CAElD;AAYD,wBAAgB,yBAAyB,IAAI,OAAO,CAEnD;AAED,eAAO,MAAM,WAAW,sBAAsB,CAAC"}
@@ -1,11 +1,13 @@
1
1
  // ─── WalletStore ────────────────────────────────────────────────────────
2
- // Abstraction for storing managed testnet agent wallets.
3
- // Private keys are AES-256-GCM encrypted before storage.
4
- // Legacy XOR-obfuscated keys (starting with "0x") are transparently migrated
5
- // on first read. NOT mainnet-grade KMStestnet only.
2
+ // Abstraction for storing managed agent wallets (Pharos Pacific Mainnet).
3
+ // Private keys are AES-256-GCM encrypted under a memory-hard scrypt KDF before
4
+ // storage (versioned "sh2:" format). Pre-scrypt AES records (SHA-256-derived key)
5
+ // are still read for migration. The old XOR-obfuscation path is REMOVED it was
6
+ // not encryption. Local AES-256-GCM is NOT KMS/HSM-grade — use a DEDICATED,
7
+ // low-value operator wallet for managed execution, never a primary wallet.
6
8
  // ────────────────────────────────────────────────────────────────────────
7
9
  import { readFileSync, writeFileSync, renameSync, existsSync } from "fs";
8
- import { randomBytes, createCipheriv, createDecipheriv, createHash } from "node:crypto";
10
+ import { randomBytes, createCipheriv, createDecipheriv, createHash, scryptSync } from "node:crypto";
9
11
  // ─── In-Memory Store (tests + default) ─────────────────────────────────
10
12
  class InMemoryWalletStore {
11
13
  store = new Map();
@@ -48,35 +50,64 @@ class FileWalletStore {
48
50
  return agentId in this.data;
49
51
  }
50
52
  }
51
- // ─── AES-256-GCM Encryption ────────────────────────────────────────────
52
- function deriveKey(encryptionKey) {
53
+ // ─── AES-256-GCM Encryption (scrypt KDF) ───────────────────────────────
54
+ // New wallets derive the AES key with a memory-hard scrypt KDF and a per-record
55
+ // random salt, so a leaked WALLET_ENCRYPTION_KEY is far costlier to brute-force
56
+ // than the old single-pass SHA-256 derivation. Ciphertext is versioned:
57
+ // "sh2:" + hex(salt[16] || iv[12] || tag[16] || ciphertext) ← current (scrypt)
58
+ // <pure-hex> iv[12] || tag[16] || ciphertext ← legacy read-only
59
+ // (SHA-256-derived key; still decryptable for migration)
60
+ // The old XOR path ("0x"-prefixed) is REMOVED — it was obfuscation, not encryption.
61
+ const SCRYPT_VERSION_PREFIX = "sh2:";
62
+ const SCRYPT_SALT_BYTES = 16;
63
+ // N=16384,r=8,p=1 → ~16 MB, ~10-30 ms per derivation (once per managed signer resolve).
64
+ const SCRYPT_PARAMS = { N: 16384, r: 8, p: 1, maxmem: 64 * 1024 * 1024 };
65
+ function deriveKeyScrypt(encryptionKey, salt) {
66
+ return scryptSync(encryptionKey, salt, 32, SCRYPT_PARAMS);
67
+ }
68
+ /** Legacy single-pass SHA-256 KDF — read-only, for decrypting pre-scrypt wallets. */
69
+ function deriveKeyLegacySha256(encryptionKey) {
53
70
  return createHash("sha256").update(encryptionKey).digest();
54
71
  }
55
72
  /**
56
- * Encrypts a private key with AES-256-GCM.
57
- * Output format: <iv(12B)><tag(16B)><ciphertext> as hex string (no 0x prefix).
73
+ * Encrypts a private key with AES-256-GCM under a scrypt-derived key.
74
+ * Output: "sh2:" + hex(salt(16) || iv(12) || tag(16) || ciphertext).
58
75
  */
59
76
  export function encryptKey(privateKey, encryptionKey) {
60
- const key = deriveKey(encryptionKey);
77
+ const salt = randomBytes(SCRYPT_SALT_BYTES);
78
+ const key = deriveKeyScrypt(encryptionKey, salt);
61
79
  const iv = randomBytes(12);
62
80
  const cipher = createCipheriv("aes-256-gcm", key, iv);
63
81
  const plain = Buffer.from(privateKey.replace(/^0x/, ""), "hex");
64
82
  const encrypted = Buffer.concat([cipher.update(plain), cipher.final()]);
65
83
  const tag = cipher.getAuthTag();
66
- return Buffer.concat([iv, tag, encrypted]).toString("hex");
84
+ return SCRYPT_VERSION_PREFIX + Buffer.concat([salt, iv, tag, encrypted]).toString("hex");
67
85
  }
68
86
  /**
69
- * Decrypts a private key. Handles both:
70
- * - New AES-256-GCM format (pure hex, no 0x prefix)
71
- * - Legacy XOR format (starts with "0x") — transparently supported for migration
87
+ * Decrypts a private key. Supports the current "sh2:" scrypt format and the
88
+ * legacy pure-hex SHA-256 AES-256-GCM format (read-only, for migration). The
89
+ * removed XOR path ("0x"-prefixed) is rejected those wallets must be recreated.
72
90
  */
73
91
  export function decryptKey(encrypted, encryptionKey) {
74
92
  if (encrypted.startsWith("0x")) {
75
- // Legacy XOR path symmetric, same operation
76
- return _xorObfuscate(encrypted, encryptionKey);
93
+ throw new Error("Legacy XOR-obfuscated wallet is no longer supported (it was not real encryption). " +
94
+ "Re-create the managed wallet so it is stored under AES-256-GCM + scrypt.");
95
+ }
96
+ if (encrypted.startsWith(SCRYPT_VERSION_PREFIX)) {
97
+ const data = Buffer.from(encrypted.slice(SCRYPT_VERSION_PREFIX.length), "hex");
98
+ const salt = data.subarray(0, SCRYPT_SALT_BYTES);
99
+ const iv = data.subarray(SCRYPT_SALT_BYTES, SCRYPT_SALT_BYTES + 12);
100
+ const tag = data.subarray(SCRYPT_SALT_BYTES + 12, SCRYPT_SALT_BYTES + 28);
101
+ const ciphertext = data.subarray(SCRYPT_SALT_BYTES + 28);
102
+ const key = deriveKeyScrypt(encryptionKey, salt);
103
+ const decipher = createDecipheriv("aes-256-gcm", key, iv);
104
+ decipher.setAuthTag(tag);
105
+ const decrypted = Buffer.concat([decipher.update(ciphertext), decipher.final()]);
106
+ return "0x" + decrypted.toString("hex");
77
107
  }
78
- const key = deriveKey(encryptionKey);
108
+ // Legacy pure-hex AES-256-GCM (SHA-256-derived key) — decrypt for migration only.
79
109
  const data = Buffer.from(encrypted, "hex");
110
+ const key = deriveKeyLegacySha256(encryptionKey);
80
111
  const iv = data.subarray(0, 12);
81
112
  const tag = data.subarray(12, 28);
82
113
  const ciphertext = data.subarray(28);
@@ -85,24 +116,6 @@ export function decryptKey(encrypted, encryptionKey) {
85
116
  const decrypted = Buffer.concat([decipher.update(ciphertext), decipher.final()]);
86
117
  return "0x" + decrypted.toString("hex");
87
118
  }
88
- // ─── Legacy XOR helpers (kept for migration read path only) ────────────
89
- function _xorObfuscate(privateKey, encryptionKey) {
90
- const keyBytes = Buffer.from(encryptionKey.padEnd(32, "0").slice(0, 32));
91
- const pkBytes = Buffer.from(privateKey.replace("0x", ""), "hex");
92
- const result = Buffer.alloc(pkBytes.length);
93
- for (let i = 0; i < pkBytes.length; i++) {
94
- result[i] = pkBytes[i] ^ keyBytes[i % keyBytes.length];
95
- }
96
- return "0x" + result.toString("hex");
97
- }
98
- /** @deprecated Use encryptKey / decryptKey. Kept for callers that haven't migrated yet. */
99
- export function obfuscateKey(privateKey, encryptionKey) {
100
- return _xorObfuscate(privateKey, encryptionKey);
101
- }
102
- /** @deprecated Use decryptKey. */
103
- export function deobfuscateKey(obfuscated, encryptionKey) {
104
- return _xorObfuscate(obfuscated, encryptionKey);
105
- }
106
119
  // ─── Encryption key resolution ─────────────────────────────────────────
107
120
  // Random per-process fallback key — never hardcoded, never reused across restarts
108
121
  const IN_MEMORY_FALLBACK_KEY = randomBytes(32).toString("hex");
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/lib/wallet/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/lib/wallet/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ export interface ReplayRecordResult {
2
+ allowed: boolean;
3
+ backend: "upstash" | "file";
4
+ }
5
+ export declare function checkAndRecordX402Replay(paymentHeader: string, windowMs: number): Promise<ReplayRecordResult>;
6
+ //# sourceMappingURL=x402ReplayStore.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"x402ReplayStore.d.ts","sourceRoot":"","sources":["../../src/lib/x402ReplayStore.ts"],"names":[],"mappings":"AAcA,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,SAAS,GAAG,MAAM,CAAC;CAC7B;AA0DD,wBAAsB,wBAAwB,CAAC,aAAa,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAUnH"}
@@ -0,0 +1,79 @@
1
+ // ─── x402 Replay Store ─────────────────────────────────────────────────
2
+ // Durable replay protection. Uses Upstash Redis REST when configured, falling
3
+ // back to an atomic local JSON file so a Single-Instance Production Deployment does
4
+ // not lose replay state on process restart.
5
+ // ────────────────────────────────────────────────────────────────────────
6
+ import { createHash } from "crypto";
7
+ import { fetchWithTimeoutAndRetry } from "./http.js";
8
+ import { readJsonFile, stateFile, writeJsonFileAtomic } from "./persistentJsonStore.js";
9
+ const FILE_PATH = stateFile("x402_replay.json", "SAFEHANDS_X402_REPLAY_STORE_PATH");
10
+ function replayKey(paymentHeader) {
11
+ return `x402:${createHash("sha256").update(paymentHeader).digest("hex")}`;
12
+ }
13
+ async function upstashCommand(args) {
14
+ const url = process.env.UPSTASH_REDIS_REST_URL || process.env.SAFEHANDS_REDIS_REST_URL;
15
+ const token = process.env.UPSTASH_REDIS_REST_TOKEN || process.env.SAFEHANDS_REDIS_REST_TOKEN;
16
+ if (!url || !token)
17
+ throw new Error("Upstash Redis REST is not configured");
18
+ // The URL is operator-controlled env, so it goes through the SSRF-safe layer.
19
+ // A failed call falls back to the file store (or throws when
20
+ // SAFEHANDS_X402_REPLAY_REDIS_REQUIRED=true), so the retry budget stays small.
21
+ const res = await fetchWithTimeoutAndRetry(url, {
22
+ method: "POST",
23
+ headers: {
24
+ Authorization: `Bearer ${token}`,
25
+ "Content-Type": "application/json",
26
+ },
27
+ body: JSON.stringify(args),
28
+ timeoutMs: 5_000,
29
+ retries: 1,
30
+ });
31
+ if (!res.ok)
32
+ throw new Error(`Upstash Redis REST returned ${res.status}`);
33
+ const body = await res.json();
34
+ if (body.error)
35
+ throw new Error(body.error);
36
+ return body.result;
37
+ }
38
+ async function checkAndRecordUpstash(paymentHeader, windowMs) {
39
+ const key = replayKey(paymentHeader);
40
+ const exists = await upstashCommand(["GET", key]);
41
+ if (exists !== null && exists !== undefined)
42
+ return { allowed: false, backend: "upstash" };
43
+ const ttlSeconds = Math.max(1, Math.ceil(windowMs / 1000));
44
+ const setResult = await upstashCommand(["SET", key, String(Date.now()), "EX", String(ttlSeconds), "NX"]);
45
+ if (setResult === null)
46
+ return { allowed: false, backend: "upstash" };
47
+ return { allowed: true, backend: "upstash" };
48
+ }
49
+ function checkAndRecordFile(paymentHeader, windowMs) {
50
+ const now = Date.now();
51
+ const key = replayKey(paymentHeader);
52
+ const state = readJsonFile(FILE_PATH, { seen: {} });
53
+ for (const [k, ts] of Object.entries(state.seen)) {
54
+ if (now - ts >= windowMs)
55
+ delete state.seen[k];
56
+ }
57
+ const previous = state.seen[key];
58
+ if (previous !== undefined && now - previous < windowMs) {
59
+ writeJsonFileAtomic(FILE_PATH, state);
60
+ return { allowed: false, backend: "file" };
61
+ }
62
+ state.seen[key] = now;
63
+ writeJsonFileAtomic(FILE_PATH, state);
64
+ return { allowed: true, backend: "file" };
65
+ }
66
+ export async function checkAndRecordX402Replay(paymentHeader, windowMs) {
67
+ const hasUpstash = Boolean((process.env.UPSTASH_REDIS_REST_URL || process.env.SAFEHANDS_REDIS_REST_URL) && (process.env.UPSTASH_REDIS_REST_TOKEN || process.env.SAFEHANDS_REDIS_REST_TOKEN));
68
+ if (hasUpstash) {
69
+ try {
70
+ return await checkAndRecordUpstash(paymentHeader, windowMs);
71
+ }
72
+ catch (err) {
73
+ if (process.env.SAFEHANDS_X402_REPLAY_REDIS_REQUIRED === "true")
74
+ throw err;
75
+ }
76
+ }
77
+ return checkAndRecordFile(paymentHeader, windowMs);
78
+ }
79
+ //# sourceMappingURL=x402ReplayStore.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"x402ReplayStore.js","sourceRoot":"","sources":["../../src/lib/x402ReplayStore.ts"],"names":[],"mappings":"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"}
Binary file
package/dist/sdk.d.ts ADDED
@@ -0,0 +1,14 @@
1
+ export { evaluateActionPolicy, explainPolicyResult, isUnlimitedApprovalAmount, parseTokenAmountToUnits, } from "./lib/policy/actionPolicyEngine.js";
2
+ export type { ActionPolicyInput, ActionPolicyResult, PolicyDecision, PolicyRiskLevel, PolicyCheck, SafeHandsActionType, } from "./lib/policy/actionPolicyEngine.js";
3
+ export { enforceWriteDecision } from "./lib/policy/writeExecutionGate.js";
4
+ export type { EnforceWriteDecisionOptions } from "./lib/policy/writeExecutionGate.js";
5
+ export { assessRisk } from "./lib/riskEngine.js";
6
+ export type { RiskAssessment, RiskInput, RiskBreakdown, RiskLevel, RiskRecommendation, } from "./lib/riskEngine.js";
7
+ export { evaluateTokenSecurityGate } from "./tools/checkTokenSecurity.js";
8
+ export type { TokenSecurityGateResult, TokenSecurityVerdict } from "./tools/checkTokenSecurity.js";
9
+ export { ok, fail, errorMessage } from "./lib/toolResponse.js";
10
+ export type { ToolResponse, ToolSuccess, ToolFailure, ToolError } from "./lib/toolResponse.js";
11
+ export { getCapabilityFlags, getActiveNetworkConfig, getGates, isReadOnlyMode, isExecutionAvailable, writeToolsEnabled, } from "./lib/config.js";
12
+ export type { CapabilityFlags, SafetyGates, ActiveNetworkConfig } from "./lib/config.js";
13
+ export { CHAIN_ID, PHAROS_ENVIRONMENT, IS_MAINNET } from "./lib/constants.js";
14
+ //# sourceMappingURL=sdk.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sdk.d.ts","sourceRoot":"","sources":["../src/sdk.ts"],"names":[],"mappings":"AAYA,OAAO,EACL,oBAAoB,EACpB,mBAAmB,EACnB,yBAAyB,EACzB,uBAAuB,GACxB,MAAM,oCAAoC,CAAC;AAC5C,YAAY,EACV,iBAAiB,EACjB,kBAAkB,EAClB,cAAc,EACd,eAAe,EACf,WAAW,EACX,mBAAmB,GACpB,MAAM,oCAAoC,CAAC;AAG5C,OAAO,EAAE,oBAAoB,EAAE,MAAM,oCAAoC,CAAC;AAC1E,YAAY,EAAE,2BAA2B,EAAE,MAAM,oCAAoC,CAAC;AAGtF,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACjD,YAAY,EACV,cAAc,EACd,SAAS,EACT,aAAa,EACb,SAAS,EACT,kBAAkB,GACnB,MAAM,qBAAqB,CAAC;AAG7B,OAAO,EAAE,yBAAyB,EAAE,MAAM,+BAA+B,CAAC;AAC1E,YAAY,EAAE,uBAAuB,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAC;AAGnG,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAC/D,YAAY,EAAE,YAAY,EAAE,WAAW,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAG/F,OAAO,EACL,kBAAkB,EAClB,sBAAsB,EACtB,QAAQ,EACR,cAAc,EACd,oBAAoB,EACpB,iBAAiB,GAClB,MAAM,iBAAiB,CAAC;AACzB,YAAY,EAAE,eAAe,EAAE,WAAW,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AAGzF,OAAO,EAAE,QAAQ,EAAE,kBAAkB,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC"}
package/dist/sdk.js ADDED
@@ -0,0 +1,25 @@
1
+ // ─── SafeHands SDK — programmatic entrypoint ───────────────────────────────
2
+ // Side-effect-free barrel for embedding SafeHands' deterministic policy/risk
3
+ // engine in your own code. Importing this module NEVER starts the MCP server and
4
+ // NEVER reads a wallet/key — that behaviour lives only in the `safehands` CLI bin
5
+ // (dist/index.js). package.json `main`/`types`/`exports` point HERE so that
6
+ // import { evaluateActionPolicy } from "safehands-pharos"
7
+ // resolves to real, callable exports (previously it resolved to the MCP bootstrap,
8
+ // which has no named exports and would have started a stdio server on import).
9
+ // ───────────────────────────────────────────────────────────────────────────
10
+ // Deterministic action-policy engine — ALLOW / BLOCK / REQUIRE_CONFIRMATION /
11
+ // REQUIRE_FUNDING / REQUIRE_TOKEN_REVIEW before any agent action.
12
+ export { evaluateActionPolicy, explainPolicyResult, isUnlimitedApprovalAmount, parseTokenAmountToUnits, } from "./lib/policy/actionPolicyEngine.js";
13
+ // Write-execution gate — halts a direct write tool on ANY non-ALLOW decision.
14
+ export { enforceWriteDecision } from "./lib/policy/writeExecutionGate.js";
15
+ // 5-dimension risk engine (liquidity / slippage / counterparty / balance / market).
16
+ export { assessRisk } from "./lib/riskEngine.js";
17
+ // Token-security (GoPlus) fail-closed gate used on the execute path.
18
+ export { evaluateTokenSecurityGate } from "./tools/checkTokenSecurity.js";
19
+ // Structured tool-response envelope shared by every SafeHands surface.
20
+ export { ok, fail, errorMessage } from "./lib/toolResponse.js";
21
+ // Honest capability flags + network / safety-gate posture (read-only by default).
22
+ export { getCapabilityFlags, getActiveNetworkConfig, getGates, isReadOnlyMode, isExecutionAvailable, writeToolsEnabled, } from "./lib/config.js";
23
+ // Network identity constants (Pharos Pacific Mainnet, chain 1672).
24
+ export { CHAIN_ID, PHAROS_ENVIRONMENT, IS_MAINNET } from "./lib/constants.js";
25
+ //# sourceMappingURL=sdk.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sdk.js","sourceRoot":"","sources":["../src/sdk.ts"],"names":[],"mappings":"AAAA,8EAA8E;AAC9E,6EAA6E;AAC7E,iFAAiF;AACjF,kFAAkF;AAClF,4EAA4E;AAC5E,4DAA4D;AAC5D,mFAAmF;AACnF,+EAA+E;AAC/E,8EAA8E;AAE9E,8EAA8E;AAC9E,kEAAkE;AAClE,OAAO,EACL,oBAAoB,EACpB,mBAAmB,EACnB,yBAAyB,EACzB,uBAAuB,GACxB,MAAM,oCAAoC,CAAC;AAU5C,8EAA8E;AAC9E,OAAO,EAAE,oBAAoB,EAAE,MAAM,oCAAoC,CAAC;AAG1E,oFAAoF;AACpF,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AASjD,qEAAqE;AACrE,OAAO,EAAE,yBAAyB,EAAE,MAAM,+BAA+B,CAAC;AAG1E,uEAAuE;AACvE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAG/D,kFAAkF;AAClF,OAAO,EACL,kBAAkB,EAClB,sBAAsB,EACtB,QAAQ,EACR,cAAc,EACd,oBAAoB,EACpB,iBAAiB,GAClB,MAAM,iBAAiB,CAAC;AAGzB,mEAAmE;AACnE,OAAO,EAAE,QAAQ,EAAE,kBAAkB,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC"}
@@ -2,15 +2,21 @@ import { z } from "zod";
2
2
  export declare const approveTokenSchema: z.ZodObject<{
3
3
  token: z.ZodEnum<["USDC", "USDT"]>;
4
4
  amount: z.ZodString;
5
+ spender: z.ZodString;
5
6
  agentId: z.ZodOptional<z.ZodString>;
6
- }, "strip", z.ZodTypeAny, {
7
- amount: string;
7
+ confirm: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
8
+ }, "strict", z.ZodTypeAny, {
8
9
  token: "USDC" | "USDT";
10
+ spender: string;
11
+ amount: string;
12
+ confirm: boolean;
9
13
  agentId?: string | undefined;
10
14
  }, {
11
- amount: string;
12
15
  token: "USDC" | "USDT";
16
+ spender: string;
17
+ amount: string;
13
18
  agentId?: string | undefined;
19
+ confirm?: boolean | undefined;
14
20
  }>;
15
21
  export type ApproveTokenInput = z.input<typeof approveTokenSchema>;
16
22
  export declare const approveTokenTool: {
@@ -19,28 +25,43 @@ export declare const approveTokenTool: {
19
25
  inputSchema: z.ZodObject<{
20
26
  token: z.ZodEnum<["USDC", "USDT"]>;
21
27
  amount: z.ZodString;
28
+ spender: z.ZodString;
22
29
  agentId: z.ZodOptional<z.ZodString>;
23
- }, "strip", z.ZodTypeAny, {
24
- amount: string;
30
+ confirm: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
31
+ }, "strict", z.ZodTypeAny, {
25
32
  token: "USDC" | "USDT";
33
+ spender: string;
34
+ amount: string;
35
+ confirm: boolean;
26
36
  agentId?: string | undefined;
27
37
  }, {
28
- amount: string;
29
38
  token: "USDC" | "USDT";
39
+ spender: string;
40
+ amount: string;
30
41
  agentId?: string | undefined;
42
+ confirm?: boolean | undefined;
31
43
  }>;
32
44
  };
33
- export declare function handleApproveToken(raw: ApproveTokenInput): Promise<import("../lib/toolResponse.js").ToolFailure | import("../lib/toolResponse.js").ToolSuccess<{
45
+ export declare function handleApproveToken(raw: ApproveTokenInput): Promise<import("../sdk.js").ToolFailure | import("../sdk.js").ToolSuccess<{
34
46
  txHash: `0x${string}`;
35
47
  explorerUrl: string;
36
48
  token: "USDC" | "USDT";
37
- tokenAddress: "0xE7E84B8B4f39C507499c40B4ac199B050e2882d5" | "0xE0BE08c77f415F577A1B3A9aD7a1Df1479564ec8";
49
+ tokenAddress: `0x${string}`;
38
50
  approvedAmount: string;
39
- spender: "0x4Cf317b8918FbE8A890c01eDAb7d548555Ac2cE9";
51
+ spender: `0x${string}`;
52
+ spenderVerified: boolean;
53
+ spenderRegistryEvidence: {
54
+ recognized: boolean;
55
+ verifiedCanonical: boolean;
56
+ label: string | null;
57
+ item: string | null;
58
+ verificationStatus: import("../lib/ecosystemRegistry.js").RegistryVerificationStatus | null;
59
+ note: string | null;
60
+ } | null;
40
61
  signerMode: import("../lib/signer/index.js").SignerMode;
41
62
  walletAddress: `0x${string}`;
42
63
  gasUsed: string;
43
- policy: import("../lib/policy/actionPolicyEngine.js").ActionPolicyResult;
64
+ policy: import("../sdk.js").ActionPolicyResult;
44
65
  source: string;
45
66
  }>>;
46
67
  //# sourceMappingURL=approveToken.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"approveToken.d.ts","sourceRoot":"","sources":["../../src/tools/approveToken.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAQxB,eAAO,MAAM,kBAAkB;;;;;;;;;;;;EAI7B,CAAC;AAEH,MAAM,MAAM,iBAAiB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAEnE,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;;CAK5B,CAAC;AAEF,wBAAsB,kBAAkB,CAAC,GAAG,EAAE,iBAAiB;;;;;;;;;;;;IA+E9D"}
1
+ {"version":3,"file":"approveToken.d.ts","sourceRoot":"","sources":["../../src/tools/approveToken.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAaxB,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;EAMpB,CAAC;AAEZ,MAAM,MAAM,iBAAiB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAEnE,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;;;;;CAK5B,CAAC;AAeF,wBAAsB,kBAAkB,CAAC,GAAG,EAAE,iBAAiB;;;;;;;;;;;;;;;;;;;;;IAyH9D"}