@scriptmasterlabs/mcp-x402 2.0.2 → 2.1.1

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 (323) hide show
  1. package/.well-known/x402.json +37 -0
  2. package/LICENSE +57 -21
  3. package/README.md +262 -304
  4. package/dist/index.d.ts +12 -0
  5. package/dist/index.d.ts.map +1 -0
  6. package/dist/index.js +9 -0
  7. package/dist/index.js.map +1 -0
  8. package/dist/mcp-wrapper.d.ts +71 -0
  9. package/dist/mcp-wrapper.d.ts.map +1 -0
  10. package/dist/mcp-wrapper.js +104 -0
  11. package/dist/mcp-wrapper.js.map +1 -0
  12. package/dist/x402-middleware.d.ts +76 -0
  13. package/dist/x402-middleware.d.ts.map +1 -0
  14. package/dist/x402-middleware.js +113 -0
  15. package/dist/x402-middleware.js.map +1 -0
  16. package/dist/xrpl-facilitator.d.ts +77 -0
  17. package/dist/xrpl-facilitator.d.ts.map +1 -0
  18. package/dist/xrpl-facilitator.js +156 -0
  19. package/dist/xrpl-facilitator.js.map +1 -0
  20. package/llms.txt +108 -70
  21. package/package.json +65 -78
  22. package/schema.jsonld +97 -0
  23. package/.env.example +0 -35
  24. package/.github/workflows/ci.yml +0 -59
  25. package/.github/workflows/keepalive.yml +0 -31
  26. package/.well-known/agentcard.json +0 -34
  27. package/CONTRIBUTING.md +0 -76
  28. package/Dockerfile +0 -19
  29. package/agents.json +0 -67
  30. package/dist/lib/chains/base.d.ts +0 -10
  31. package/dist/lib/chains/base.d.ts.map +0 -1
  32. package/dist/lib/chains/base.js +0 -73
  33. package/dist/lib/chains/base.js.map +0 -1
  34. package/dist/lib/chains/solana.d.ts +0 -10
  35. package/dist/lib/chains/solana.d.ts.map +0 -1
  36. package/dist/lib/chains/solana.js +0 -49
  37. package/dist/lib/chains/solana.js.map +0 -1
  38. package/dist/lib/chains/xrpl.d.ts +0 -10
  39. package/dist/lib/chains/xrpl.d.ts.map +0 -1
  40. package/dist/lib/chains/xrpl.js +0 -55
  41. package/dist/lib/chains/xrpl.js.map +0 -1
  42. package/dist/lib/credit/bureau.d.ts +0 -10
  43. package/dist/lib/credit/bureau.d.ts.map +0 -1
  44. package/dist/lib/credit/bureau.js +0 -58
  45. package/dist/lib/credit/bureau.js.map +0 -1
  46. package/dist/lib/sml-api/agentcard.d.ts +0 -17
  47. package/dist/lib/sml-api/agentcard.d.ts.map +0 -1
  48. package/dist/lib/sml-api/agentcard.js +0 -30
  49. package/dist/lib/sml-api/agentcard.js.map +0 -1
  50. package/dist/lib/sml-api/backtest.d.ts +0 -22
  51. package/dist/lib/sml-api/backtest.d.ts.map +0 -1
  52. package/dist/lib/sml-api/backtest.js +0 -28
  53. package/dist/lib/sml-api/backtest.js.map +0 -1
  54. package/dist/lib/sml-api/brokers.d.ts +0 -40
  55. package/dist/lib/sml-api/brokers.d.ts.map +0 -1
  56. package/dist/lib/sml-api/brokers.js +0 -128
  57. package/dist/lib/sml-api/brokers.js.map +0 -1
  58. package/dist/lib/sml-api/copytrader.d.ts +0 -11
  59. package/dist/lib/sml-api/copytrader.d.ts.map +0 -1
  60. package/dist/lib/sml-api/copytrader.js +0 -30
  61. package/dist/lib/sml-api/copytrader.js.map +0 -1
  62. package/dist/lib/sml-api/crawl.d.ts +0 -20
  63. package/dist/lib/sml-api/crawl.d.ts.map +0 -1
  64. package/dist/lib/sml-api/crawl.js +0 -32
  65. package/dist/lib/sml-api/crawl.js.map +0 -1
  66. package/dist/lib/sml-api/echo.d.ts +0 -10
  67. package/dist/lib/sml-api/echo.d.ts.map +0 -1
  68. package/dist/lib/sml-api/echo.js +0 -23
  69. package/dist/lib/sml-api/echo.js.map +0 -1
  70. package/dist/lib/sml-api/forge.d.ts +0 -11
  71. package/dist/lib/sml-api/forge.d.ts.map +0 -1
  72. package/dist/lib/sml-api/forge.js +0 -29
  73. package/dist/lib/sml-api/forge.js.map +0 -1
  74. package/dist/lib/sml-api/ftd.d.ts +0 -18
  75. package/dist/lib/sml-api/ftd.d.ts.map +0 -1
  76. package/dist/lib/sml-api/ftd.js +0 -43
  77. package/dist/lib/sml-api/ftd.js.map +0 -1
  78. package/dist/lib/sml-api/ghost.d.ts +0 -13
  79. package/dist/lib/sml-api/ghost.d.ts.map +0 -1
  80. package/dist/lib/sml-api/ghost.js +0 -29
  81. package/dist/lib/sml-api/ghost.js.map +0 -1
  82. package/dist/lib/sml-api/launchpad.d.ts +0 -20
  83. package/dist/lib/sml-api/launchpad.d.ts.map +0 -1
  84. package/dist/lib/sml-api/launchpad.js +0 -31
  85. package/dist/lib/sml-api/launchpad.js.map +0 -1
  86. package/dist/lib/sml-api/leviathan.d.ts +0 -22
  87. package/dist/lib/sml-api/leviathan.d.ts.map +0 -1
  88. package/dist/lib/sml-api/leviathan.js +0 -33
  89. package/dist/lib/sml-api/leviathan.js.map +0 -1
  90. package/dist/lib/sml-api/nexus.d.ts +0 -18
  91. package/dist/lib/sml-api/nexus.d.ts.map +0 -1
  92. package/dist/lib/sml-api/nexus.js +0 -40
  93. package/dist/lib/sml-api/nexus.js.map +0 -1
  94. package/dist/lib/sml-api/proof402.d.ts +0 -6
  95. package/dist/lib/sml-api/proof402.d.ts.map +0 -1
  96. package/dist/lib/sml-api/proof402.js +0 -30
  97. package/dist/lib/sml-api/proof402.js.map +0 -1
  98. package/dist/lib/sml-api/rails.d.ts +0 -12
  99. package/dist/lib/sml-api/rails.d.ts.map +0 -1
  100. package/dist/lib/sml-api/rails.js +0 -29
  101. package/dist/lib/sml-api/rails.js.map +0 -1
  102. package/dist/lib/sml-api/shadow.d.ts +0 -15
  103. package/dist/lib/sml-api/shadow.d.ts.map +0 -1
  104. package/dist/lib/sml-api/shadow.js +0 -27
  105. package/dist/lib/sml-api/shadow.js.map +0 -1
  106. package/dist/lib/sml-api/squeezeos.d.ts +0 -21
  107. package/dist/lib/sml-api/squeezeos.d.ts.map +0 -1
  108. package/dist/lib/sml-api/squeezeos.js +0 -97
  109. package/dist/lib/sml-api/squeezeos.js.map +0 -1
  110. package/dist/lib/sml-api/xdeo.d.ts +0 -13
  111. package/dist/lib/sml-api/xdeo.d.ts.map +0 -1
  112. package/dist/lib/sml-api/xdeo.js +0 -34
  113. package/dist/lib/sml-api/xdeo.js.map +0 -1
  114. package/dist/lib/sml-api/xmit.d.ts +0 -13
  115. package/dist/lib/sml-api/xmit.d.ts.map +0 -1
  116. package/dist/lib/sml-api/xmit.js +0 -34
  117. package/dist/lib/sml-api/xmit.js.map +0 -1
  118. package/dist/server/health.d.ts +0 -16
  119. package/dist/server/health.d.ts.map +0 -1
  120. package/dist/server/health.js +0 -39
  121. package/dist/server/health.js.map +0 -1
  122. package/dist/server/index.d.ts +0 -3
  123. package/dist/server/index.d.ts.map +0 -1
  124. package/dist/server/index.js +0 -199
  125. package/dist/server/index.js.map +0 -1
  126. package/dist/server/payments/ap2.d.ts +0 -17
  127. package/dist/server/payments/ap2.d.ts.map +0 -1
  128. package/dist/server/payments/ap2.js +0 -77
  129. package/dist/server/payments/ap2.js.map +0 -1
  130. package/dist/server/payments/receipt.d.ts +0 -28
  131. package/dist/server/payments/receipt.d.ts.map +0 -1
  132. package/dist/server/payments/receipt.js +0 -60
  133. package/dist/server/payments/receipt.js.map +0 -1
  134. package/dist/server/payments/router.d.ts +0 -23
  135. package/dist/server/payments/router.d.ts.map +0 -1
  136. package/dist/server/payments/router.js +0 -69
  137. package/dist/server/payments/router.js.map +0 -1
  138. package/dist/server/payments/wallet.d.ts +0 -18
  139. package/dist/server/payments/wallet.d.ts.map +0 -1
  140. package/dist/server/payments/wallet.js +0 -107
  141. package/dist/server/payments/wallet.js.map +0 -1
  142. package/dist/server/payments/x402.d.ts +0 -29
  143. package/dist/server/payments/x402.d.ts.map +0 -1
  144. package/dist/server/payments/x402.js +0 -138
  145. package/dist/server/payments/x402.js.map +0 -1
  146. package/dist/server/registry/catalog.d.ts +0 -12
  147. package/dist/server/registry/catalog.d.ts.map +0 -1
  148. package/dist/server/registry/catalog.js +0 -55
  149. package/dist/server/registry/catalog.js.map +0 -1
  150. package/dist/server/registry/discovery.d.ts +0 -16
  151. package/dist/server/registry/discovery.d.ts.map +0 -1
  152. package/dist/server/registry/discovery.js +0 -33
  153. package/dist/server/registry/discovery.js.map +0 -1
  154. package/dist/server/registry/pricing.d.ts +0 -10
  155. package/dist/server/registry/pricing.d.ts.map +0 -1
  156. package/dist/server/registry/pricing.js +0 -123
  157. package/dist/server/registry/pricing.js.map +0 -1
  158. package/dist/server/security/acl.d.ts +0 -28
  159. package/dist/server/security/acl.d.ts.map +0 -1
  160. package/dist/server/security/acl.js +0 -36
  161. package/dist/server/security/acl.js.map +0 -1
  162. package/dist/server/security/audit.d.ts +0 -15
  163. package/dist/server/security/audit.d.ts.map +0 -1
  164. package/dist/server/security/audit.js +0 -77
  165. package/dist/server/security/audit.js.map +0 -1
  166. package/dist/server/security/rate-limit.d.ts +0 -12
  167. package/dist/server/security/rate-limit.d.ts.map +0 -1
  168. package/dist/server/security/rate-limit.js +0 -72
  169. package/dist/server/security/rate-limit.js.map +0 -1
  170. package/dist/server/security/sandbox.d.ts +0 -7
  171. package/dist/server/security/sandbox.d.ts.map +0 -1
  172. package/dist/server/security/sandbox.js +0 -42
  173. package/dist/server/security/sandbox.js.map +0 -1
  174. package/dist/server/tools/agentcard.d.ts +0 -3
  175. package/dist/server/tools/agentcard.d.ts.map +0 -1
  176. package/dist/server/tools/agentcard.js +0 -118
  177. package/dist/server/tools/agentcard.js.map +0 -1
  178. package/dist/server/tools/backtest.d.ts +0 -3
  179. package/dist/server/tools/backtest.d.ts.map +0 -1
  180. package/dist/server/tools/backtest.js +0 -112
  181. package/dist/server/tools/backtest.js.map +0 -1
  182. package/dist/server/tools/brokers.d.ts +0 -3
  183. package/dist/server/tools/brokers.d.ts.map +0 -1
  184. package/dist/server/tools/brokers.js +0 -223
  185. package/dist/server/tools/brokers.js.map +0 -1
  186. package/dist/server/tools/copytrader.d.ts +0 -3
  187. package/dist/server/tools/copytrader.d.ts.map +0 -1
  188. package/dist/server/tools/copytrader.js +0 -90
  189. package/dist/server/tools/copytrader.js.map +0 -1
  190. package/dist/server/tools/crawl.d.ts +0 -3
  191. package/dist/server/tools/crawl.d.ts.map +0 -1
  192. package/dist/server/tools/crawl.js +0 -60
  193. package/dist/server/tools/crawl.js.map +0 -1
  194. package/dist/server/tools/discovery.d.ts +0 -3
  195. package/dist/server/tools/discovery.d.ts.map +0 -1
  196. package/dist/server/tools/discovery.js +0 -188
  197. package/dist/server/tools/discovery.js.map +0 -1
  198. package/dist/server/tools/echo.d.ts +0 -3
  199. package/dist/server/tools/echo.d.ts.map +0 -1
  200. package/dist/server/tools/echo.js +0 -48
  201. package/dist/server/tools/echo.js.map +0 -1
  202. package/dist/server/tools/forge.d.ts +0 -3
  203. package/dist/server/tools/forge.d.ts.map +0 -1
  204. package/dist/server/tools/forge.js +0 -77
  205. package/dist/server/tools/forge.js.map +0 -1
  206. package/dist/server/tools/ftd.d.ts +0 -3
  207. package/dist/server/tools/ftd.d.ts.map +0 -1
  208. package/dist/server/tools/ftd.js +0 -70
  209. package/dist/server/tools/ftd.js.map +0 -1
  210. package/dist/server/tools/ghost.d.ts +0 -3
  211. package/dist/server/tools/ghost.d.ts.map +0 -1
  212. package/dist/server/tools/ghost.js +0 -83
  213. package/dist/server/tools/ghost.js.map +0 -1
  214. package/dist/server/tools/index.d.ts +0 -3
  215. package/dist/server/tools/index.d.ts.map +0 -1
  216. package/dist/server/tools/index.js +0 -44
  217. package/dist/server/tools/index.js.map +0 -1
  218. package/dist/server/tools/launchpad.d.ts +0 -3
  219. package/dist/server/tools/launchpad.d.ts.map +0 -1
  220. package/dist/server/tools/launchpad.js +0 -151
  221. package/dist/server/tools/launchpad.js.map +0 -1
  222. package/dist/server/tools/leviathan.d.ts +0 -3
  223. package/dist/server/tools/leviathan.d.ts.map +0 -1
  224. package/dist/server/tools/leviathan.js +0 -73
  225. package/dist/server/tools/leviathan.js.map +0 -1
  226. package/dist/server/tools/nexus.d.ts +0 -3
  227. package/dist/server/tools/nexus.d.ts.map +0 -1
  228. package/dist/server/tools/nexus.js +0 -65
  229. package/dist/server/tools/nexus.js.map +0 -1
  230. package/dist/server/tools/proof402.d.ts +0 -3
  231. package/dist/server/tools/proof402.d.ts.map +0 -1
  232. package/dist/server/tools/proof402.js +0 -74
  233. package/dist/server/tools/proof402.js.map +0 -1
  234. package/dist/server/tools/rails.d.ts +0 -3
  235. package/dist/server/tools/rails.d.ts.map +0 -1
  236. package/dist/server/tools/rails.js +0 -82
  237. package/dist/server/tools/rails.js.map +0 -1
  238. package/dist/server/tools/shadow.d.ts +0 -3
  239. package/dist/server/tools/shadow.d.ts.map +0 -1
  240. package/dist/server/tools/shadow.js +0 -114
  241. package/dist/server/tools/shadow.js.map +0 -1
  242. package/dist/server/tools/squeezeos.d.ts +0 -3
  243. package/dist/server/tools/squeezeos.d.ts.map +0 -1
  244. package/dist/server/tools/squeezeos.js +0 -231
  245. package/dist/server/tools/squeezeos.js.map +0 -1
  246. package/dist/server/tools/xdeo.d.ts +0 -3
  247. package/dist/server/tools/xdeo.d.ts.map +0 -1
  248. package/dist/server/tools/xdeo.js +0 -58
  249. package/dist/server/tools/xdeo.js.map +0 -1
  250. package/dist/server/tools/xmit.d.ts +0 -3
  251. package/dist/server/tools/xmit.d.ts.map +0 -1
  252. package/dist/server/tools/xmit.js +0 -59
  253. package/dist/server/tools/xmit.js.map +0 -1
  254. package/docker-compose.yml +0 -50
  255. package/mcp-publisher.exe +0 -0
  256. package/render.yaml +0 -39
  257. package/sdk/mcp-x402-sdk/package.json +0 -18
  258. package/sdk/mcp-x402-sdk/src/index.ts +0 -118
  259. package/sdk/mcp-x402-sdk/tsconfig.json +0 -14
  260. package/server.json +0 -48
  261. package/services/backtest_service.py +0 -176
  262. package/src/lib/chains/base.ts +0 -77
  263. package/src/lib/chains/solana.ts +0 -59
  264. package/src/lib/chains/xrpl.ts +0 -63
  265. package/src/lib/credit/bureau.ts +0 -65
  266. package/src/lib/sml-api/agentcard.ts +0 -40
  267. package/src/lib/sml-api/backtest.ts +0 -47
  268. package/src/lib/sml-api/brokers.ts +0 -160
  269. package/src/lib/sml-api/copytrader.ts +0 -33
  270. package/src/lib/sml-api/crawl.ts +0 -44
  271. package/src/lib/sml-api/echo.ts +0 -28
  272. package/src/lib/sml-api/forge.ts +0 -33
  273. package/src/lib/sml-api/ftd.ts +0 -53
  274. package/src/lib/sml-api/ghost.ts +0 -35
  275. package/src/lib/sml-api/launchpad.ts +0 -43
  276. package/src/lib/sml-api/leviathan.ts +0 -49
  277. package/src/lib/sml-api/nexus.ts +0 -50
  278. package/src/lib/sml-api/proof402.ts +0 -27
  279. package/src/lib/sml-api/rails.ts +0 -34
  280. package/src/lib/sml-api/shadow.ts +0 -35
  281. package/src/lib/sml-api/squeezeos.ts +0 -95
  282. package/src/lib/sml-api/xdeo.ts +0 -40
  283. package/src/lib/sml-api/xmit.ts +0 -40
  284. package/src/server/health.ts +0 -52
  285. package/src/server/index.ts +0 -213
  286. package/src/server/payments/ap2.ts +0 -101
  287. package/src/server/payments/receipt.ts +0 -85
  288. package/src/server/payments/router.ts +0 -110
  289. package/src/server/payments/wallet.ts +0 -123
  290. package/src/server/payments/x402.ts +0 -177
  291. package/src/server/registry/catalog.ts +0 -61
  292. package/src/server/registry/discovery.ts +0 -39
  293. package/src/server/registry/pricing.ts +0 -133
  294. package/src/server/security/acl.ts +0 -42
  295. package/src/server/security/audit.ts +0 -94
  296. package/src/server/security/rate-limit.ts +0 -84
  297. package/src/server/security/sandbox.ts +0 -40
  298. package/src/server/tools/agentcard.ts +0 -134
  299. package/src/server/tools/backtest.ts +0 -119
  300. package/src/server/tools/brokers.ts +0 -250
  301. package/src/server/tools/copytrader.ts +0 -104
  302. package/src/server/tools/crawl.ts +0 -70
  303. package/src/server/tools/discovery.ts +0 -202
  304. package/src/server/tools/echo.ts +0 -58
  305. package/src/server/tools/forge.ts +0 -87
  306. package/src/server/tools/ftd.ts +0 -88
  307. package/src/server/tools/ghost.ts +0 -93
  308. package/src/server/tools/index.ts +0 -42
  309. package/src/server/tools/launchpad.ts +0 -173
  310. package/src/server/tools/leviathan.ts +0 -81
  311. package/src/server/tools/nexus.ts +0 -76
  312. package/src/server/tools/proof402.ts +0 -87
  313. package/src/server/tools/rails.ts +0 -92
  314. package/src/server/tools/shadow.ts +0 -128
  315. package/src/server/tools/squeezeos.ts +0 -312
  316. package/src/server/tools/xdeo.ts +0 -67
  317. package/src/server/tools/xmit.ts +0 -68
  318. package/tests/integration/e2e.test.ts +0 -51
  319. package/tests/unit/payments.test.ts +0 -49
  320. package/tests/unit/security.test.ts +0 -92
  321. package/tests/unit/tools.test.ts +0 -42
  322. package/tsconfig.json +0 -21
  323. package/vitest.config.ts +0 -20
@@ -1,110 +0,0 @@
1
- import { AuditLogger } from '../security/audit.js';
2
- import { BaseChain } from '../../lib/chains/base.js';
3
- import { XRPLChain } from '../../lib/chains/xrpl.js';
4
- import { SolanaChain } from '../../lib/chains/solana.js';
5
-
6
- export interface RouteParams {
7
- amount: string;
8
- currency: 'USDC' | 'RLUSD';
9
- from: string;
10
- to: string;
11
- timeoutMs?: number;
12
- }
13
-
14
- export interface RouteResult {
15
- txHash: string;
16
- chain: string;
17
- latencyMs: number;
18
- }
19
-
20
- // Chain preference order: cheapest/fastest first (N13)
21
- const CHAIN_PREFERENCE = ['base', 'xrpl', 'solana'] as const;
22
-
23
- export class ChainRouter {
24
- private static instance: ChainRouter;
25
-
26
- private constructor(
27
- private readonly base = BaseChain.getInstance(),
28
- private readonly xrpl = XRPLChain.getInstance(),
29
- private readonly solana = SolanaChain.getInstance(),
30
- ) {}
31
-
32
- static getInstance(): ChainRouter {
33
- if (!ChainRouter.instance) {
34
- ChainRouter.instance = new ChainRouter();
35
- }
36
- return ChainRouter.instance;
37
- }
38
-
39
- async route(params: RouteParams): Promise<RouteResult> {
40
- const audit = AuditLogger.getInstance();
41
- const timeout = params.timeoutMs ?? 3000;
42
-
43
- // For RLUSD, prefer XRPL
44
- const ordered =
45
- params.currency === 'RLUSD'
46
- ? (['xrpl', 'base', 'solana'] as const)
47
- : CHAIN_PREFERENCE;
48
-
49
- const errors: string[] = [];
50
-
51
- for (const chain of ordered) {
52
- try {
53
- const start = Date.now();
54
- let txHash: string;
55
-
56
- switch (chain) {
57
- case 'base':
58
- txHash = await this.withTimeout(
59
- this.base.sendPayment(params),
60
- timeout,
61
- 'base',
62
- );
63
- break;
64
- case 'xrpl':
65
- txHash = await this.withTimeout(
66
- this.xrpl.sendPayment(params),
67
- timeout,
68
- 'xrpl',
69
- );
70
- break;
71
- case 'solana':
72
- txHash = await this.withTimeout(
73
- this.solana.sendPayment(params),
74
- timeout,
75
- 'solana',
76
- );
77
- break;
78
- }
79
-
80
- const latencyMs = Date.now() - start;
81
- audit.info('chain_route_success', { chain, latencyMs, tx: txHash });
82
-
83
- return { txHash, chain, latencyMs };
84
- } catch (err) {
85
- const msg = String(err);
86
- errors.push(`${chain}: ${msg}`);
87
- audit.warn('chain_route_fail', { chain, error: msg });
88
- }
89
- }
90
-
91
- throw new Error(`All chains failed.\n${errors.join('\n')}`);
92
- }
93
-
94
- private withTimeout<T>(
95
- promise: Promise<T>,
96
- ms: number,
97
- chain: string,
98
- ): Promise<T> {
99
- return new Promise((resolve, reject) => {
100
- const t = setTimeout(
101
- () => reject(new Error(`${chain} timeout after ${ms}ms`)),
102
- ms,
103
- );
104
- promise.then(
105
- (v) => { clearTimeout(t); resolve(v); },
106
- (e) => { clearTimeout(t); reject(e); },
107
- );
108
- });
109
- }
110
- }
@@ -1,123 +0,0 @@
1
- import { AuditLogger } from '../security/audit.js';
2
-
3
- const KEYCHAIN_SERVICE = 'mcp-x402';
4
- const KEYCHAIN_ACCOUNT = 'master-seed';
5
-
6
- export interface WalletInfo {
7
- address: string;
8
- chain: 'base' | 'xrpl' | 'solana';
9
- }
10
-
11
- export class WalletManager {
12
- private static instance: WalletManager;
13
- private cachedAddress: string | null = null;
14
- private cachedSeed: string | null = null;
15
-
16
- private constructor() {}
17
-
18
- static getInstance(): WalletManager {
19
- if (!WalletManager.instance) {
20
- WalletManager.instance = new WalletManager();
21
- }
22
- return WalletManager.instance;
23
- }
24
-
25
- // Try OS keychain; returns null if keytar is unavailable (Docker/cloud) or no entry exists.
26
- private async keytarGet(): Promise<string | null> {
27
- try {
28
- const kt = await import('keytar');
29
- return await kt.getPassword(KEYCHAIN_SERVICE, KEYCHAIN_ACCOUNT);
30
- } catch {
31
- return null;
32
- }
33
- }
34
-
35
- private async keytarSet(value: string): Promise<void> {
36
- try {
37
- const kt = await import('keytar');
38
- await kt.setPassword(KEYCHAIN_SERVICE, KEYCHAIN_ACCOUNT, value);
39
- } catch {
40
- // Silently skip — keytar unavailable in this environment
41
- }
42
- }
43
-
44
- // Seed resolution priority:
45
- // 1. OS keychain (local desktop — most secure)
46
- // 2. WALLET_SEED env var (Render secret — cloud/Docker deployment)
47
- // 3. CI_WALLET_SEED env var (CI only, never production)
48
- // 4. Generate fresh and try to persist in keychain
49
- async getSeed(): Promise<string> {
50
- if (this.cachedSeed) return this.cachedSeed;
51
-
52
- const audit = AuditLogger.getInstance();
53
-
54
- let seed = await this.keytarGet();
55
-
56
- if (!seed) {
57
- const envSeed = process.env['WALLET_SEED'];
58
- if (envSeed) {
59
- seed = envSeed;
60
- audit.warn('wallet_env_seed', { note: 'Using WALLET_SEED env var (cloud deployment).' });
61
- } else if (process.env['CI_WALLET_SEED'] && process.env['NODE_ENV'] !== 'production') {
62
- seed = process.env['CI_WALLET_SEED'];
63
- audit.warn('wallet_ci_fallback', { note: 'Using CI_WALLET_SEED. NEVER do this in production.' });
64
- } else {
65
- const { generateMnemonic } = await import('bip39');
66
- seed = generateMnemonic(256);
67
- await this.keytarSet(seed);
68
- audit.info('wallet_created', { note: 'New BIP-39 seed generated.' });
69
- }
70
- }
71
-
72
- this.cachedSeed = seed;
73
- return seed;
74
- }
75
-
76
- async getOrCreateWallet(): Promise<WalletInfo> {
77
- if (this.cachedAddress) {
78
- return { address: this.cachedAddress, chain: 'base' };
79
- }
80
-
81
- const audit = AuditLogger.getInstance();
82
- const seed = await this.getSeed();
83
- const address = await this.deriveAddress(seed);
84
- this.cachedAddress = address;
85
- audit.info('wallet_loaded', { address });
86
- return { address, chain: 'base' };
87
- }
88
-
89
- private async deriveAddress(mnemonic: string): Promise<string> {
90
- // BIP-44 deterministic derivation: m/44'/60'/0'/0/0 (Base = EVM)
91
- const { mnemonicToSeedSync } = await import('bip39');
92
- const { default: HDKey } = await import('hdkey');
93
- const { privateKeyToAccount } = await import('viem/accounts');
94
-
95
- const seed = mnemonicToSeedSync(mnemonic);
96
- const hdkey = HDKey.fromMasterSeed(seed);
97
- const child = hdkey.derive("m/44'/60'/0'/0/0");
98
-
99
- if (!child.privateKey) {
100
- throw new Error('Failed to derive private key from HD path');
101
- }
102
-
103
- const account = privateKeyToAccount(`0x${child.privateKey.toString('hex')}`);
104
- return account.address;
105
- }
106
-
107
- async signPayload(payload: string): Promise<string> {
108
- const mnemonic = await this.getSeed();
109
-
110
- const { mnemonicToSeedSync } = await import('bip39');
111
- const { default: HDKey } = await import('hdkey');
112
- const { privateKeyToAccount } = await import('viem/accounts');
113
-
114
- const seed = mnemonicToSeedSync(mnemonic);
115
- const hdkey = HDKey.fromMasterSeed(seed);
116
- const child = hdkey.derive("m/44'/60'/0'/0/0");
117
-
118
- if (!child.privateKey) throw new Error('Key derivation failed');
119
-
120
- const account = privateKeyToAccount(`0x${child.privateKey.toString('hex')}`);
121
- return account.signMessage({ message: payload });
122
- }
123
- }
@@ -1,177 +0,0 @@
1
- import { z } from 'zod';
2
- import { AuditLogger } from '../security/audit.js';
3
- import { AP2Client } from './ap2.js';
4
- import { WalletManager } from './wallet.js';
5
- import { ChainRouter } from './router.js';
6
- import { ReceiptStore } from './receipt.js';
7
- import { CreditBureau } from '../../lib/credit/bureau.js';
8
- import { PriceRegistry } from '../registry/pricing.js';
9
-
10
- export const PaymentConfigSchema = z.object({
11
- price: z.string().regex(/^\d+(\.\d+)?$/),
12
- currency: z.enum(['USDC', 'RLUSD']),
13
- toolName: z.string(),
14
- walletAddress: z.string().optional(),
15
- });
16
-
17
- export type PaymentConfig = z.infer<typeof PaymentConfigSchema>;
18
-
19
- export interface PaymentResult {
20
- receiptId: string;
21
- txHash: string;
22
- chain: string;
23
- amountPaid: string;
24
- currency: string;
25
- timestamp: number;
26
- walletAddress: string;
27
- }
28
-
29
- const AUTO_APPROVE_THRESHOLD = parseFloat(
30
- process.env['AUTO_APPROVE_THRESHOLD_USD'] ?? '1.0',
31
- );
32
-
33
- const DAILY_SPEND_CAP = parseFloat(
34
- process.env['DAILY_SPEND_CAP_USD'] ?? '50.0',
35
- );
36
-
37
- const dailySpend = new Map<string, { amount: number; date: string }>();
38
-
39
- function getTodayKey(): string {
40
- return new Date().toISOString().slice(0, 10);
41
- }
42
-
43
- function getDailySpend(wallet: string): number {
44
- const today = getTodayKey();
45
- const entry = dailySpend.get(wallet);
46
- if (!entry || entry.date !== today) return 0;
47
- return entry.amount;
48
- }
49
-
50
- function addDailySpend(wallet: string, amount: number): void {
51
- const today = getTodayKey();
52
- const current = getDailySpend(wallet);
53
- dailySpend.set(wallet, { amount: current + amount, date: today });
54
- }
55
-
56
- export async function executeX402Payment(
57
- config: PaymentConfig,
58
- ): Promise<PaymentResult> {
59
- const audit = AuditLogger.getInstance();
60
- const wallet = await WalletManager.getInstance().getOrCreateWallet();
61
- const walletAddress = wallet.address;
62
-
63
- // Enforce daily spend cap (N9)
64
- const priceNum = parseFloat(config.price);
65
- const currentSpend = getDailySpend(walletAddress);
66
- if (currentSpend + priceNum > DAILY_SPEND_CAP) {
67
- audit.warn('spend_cap_exceeded', {
68
- wallet: walletAddress,
69
- current: currentSpend,
70
- requested: priceNum,
71
- cap: DAILY_SPEND_CAP,
72
- });
73
- throw new Error(
74
- `Daily spend cap of $${DAILY_SPEND_CAP} exceeded. Current: $${currentSpend.toFixed(4)}`,
75
- );
76
- }
77
-
78
- // Verify price cache freshness (N12)
79
- const cachedPrice = await PriceRegistry.getInstance().getPrice(config.toolName);
80
- if (!cachedPrice) {
81
- throw new Error('Price data stale or unavailable. Rejecting payment.');
82
- }
83
- if (cachedPrice !== config.price) {
84
- throw new Error(
85
- `Price mismatch: expected ${cachedPrice}, got ${config.price}. Cache may be stale.`,
86
- );
87
- }
88
-
89
- // Credit Bureau check (N8)
90
- const score = await CreditBureau.getInstance().getScore(walletAddress);
91
- const autoApprove = priceNum <= AUTO_APPROVE_THRESHOLD && score >= 300;
92
-
93
- audit.info('payment_attempt', {
94
- tool: config.toolName,
95
- price: config.price,
96
- currency: config.currency,
97
- wallet: walletAddress,
98
- bureauScore: score,
99
- autoApprove,
100
- });
101
-
102
- if (!autoApprove && score < 300) {
103
- throw new Error(
104
- `Credit Bureau score ${score} below minimum 300. Payment requires manual approval.`,
105
- );
106
- }
107
-
108
- // AP2 mandate verification (N6)
109
- const ap2 = AP2Client.getInstance();
110
- const mandateValid = await ap2.verifyMandate(walletAddress, {
111
- maxAmount: config.price,
112
- currency: config.currency,
113
- toolName: config.toolName,
114
- });
115
-
116
- if (!mandateValid) {
117
- audit.warn('ap2_mandate_rejected', { wallet: walletAddress, tool: config.toolName });
118
- throw new Error(
119
- 'AP2 mandate verification failed. Agent not authorized for this payment.',
120
- );
121
- }
122
-
123
- // Route payment to cheapest/fastest chain (N13)
124
- // If SML_PAYMENT_RECEIVER is not configured, log the intended payment and continue
125
- const receiver = process.env['SML_PAYMENT_RECEIVER'] ?? '';
126
- let txResult: { txHash: string; chain: string; latencyMs: number };
127
-
128
- if (!receiver) {
129
- audit.warn('payment_receiver_unset', { tool: config.toolName, amount: config.price, note: 'SML_PAYMENT_RECEIVER not configured — logging only' });
130
- txResult = { txHash: `pending-${Date.now()}`, chain: 'none', latencyMs: 0 };
131
- } else {
132
- try {
133
- const router = ChainRouter.getInstance();
134
- txResult = await router.route({
135
- amount: config.price,
136
- currency: config.currency,
137
- from: walletAddress,
138
- to: receiver,
139
- timeoutMs: 500,
140
- });
141
- } catch (err) {
142
- // Log payment failure but don't block tool execution
143
- audit.warn('payment_tx_failed', { tool: config.toolName, amount: config.price, error: String(err), note: 'Server wallet may be unfunded — tool served anyway' });
144
- txResult = { txHash: `failed-${Date.now()}`, chain: 'none', latencyMs: 0 };
145
- }
146
- }
147
-
148
- addDailySpend(walletAddress, priceNum);
149
-
150
- // Generate 402Proof receipt (N7)
151
- const receipt = await ReceiptStore.getInstance().create({
152
- txHash: txResult.txHash,
153
- chain: txResult.chain,
154
- amount: config.price,
155
- currency: config.currency,
156
- tool: config.toolName,
157
- wallet: walletAddress,
158
- });
159
-
160
- audit.info('payment_success', {
161
- receiptId: receipt.id,
162
- txHash: txResult.txHash,
163
- chain: txResult.chain,
164
- tool: config.toolName,
165
- wallet: walletAddress,
166
- });
167
-
168
- return {
169
- receiptId: receipt.id,
170
- txHash: txResult.txHash,
171
- chain: txResult.chain,
172
- amountPaid: config.price,
173
- currency: config.currency,
174
- timestamp: Date.now(),
175
- walletAddress,
176
- };
177
- }
@@ -1,61 +0,0 @@
1
- export interface ToolMeta {
2
- name: string;
3
- description: string;
4
- price: string;
5
- currency: 'USDC' | 'RLUSD';
6
- freeTier?: string;
7
- ap2Required: boolean;
8
- cacheTtl?: number;
9
- }
10
-
11
- export const CATALOG: ToolMeta[] = [
12
- {
13
- name: 'leviathan_signal',
14
- description: 'Institutional-grade squeeze signals. Multi-engine verdict for any ticker.',
15
- price: '0.05',
16
- currency: 'USDC',
17
- ap2Required: true,
18
- },
19
- {
20
- name: 'xmit_edgar_decode',
21
- description: 'Parse SEC DEF 14A / 13F / 13D filings. Raw text never leaves SML servers.',
22
- price: '0.02',
23
- currency: 'USDC',
24
- ap2Required: true,
25
- },
26
- {
27
- name: 'xdeo_earnings_estimate',
28
- description: 'Decentralized earnings oracle. +2 bureau_score on success.',
29
- price: '0.02',
30
- currency: 'USDC',
31
- ap2Required: true,
32
- },
33
- {
34
- name: 'ftd_threshold_scan',
35
- description: 'SEC Reg SHO FTD data. Alerts free; full data 0.05 USDC. 15-min cache.',
36
- price: '0.05',
37
- currency: 'USDC',
38
- ap2Required: false,
39
- freeTier: 'alerts_only',
40
- cacheTtl: 900,
41
- },
42
- {
43
- name: 'nexus_agent_hire',
44
- description: 'Agent marketplace. Query free; hire charges 5% commission.',
45
- price: '0.00',
46
- currency: 'USDC',
47
- ap2Required: false,
48
- freeTier: 'query_only',
49
- },
50
- {
51
- name: 'crawl_paid_fetch',
52
- description: 'Pay-per-fetch scraping. Humans bypass free.',
53
- price: '0.005',
54
- currency: 'USDC',
55
- ap2Required: false,
56
- },
57
- ];
58
-
59
- export function getToolMeta(name: string): ToolMeta | undefined {
60
- return CATALOG.find((t) => t.name === name);
61
- }
@@ -1,39 +0,0 @@
1
- import { readFileSync } from 'fs';
2
- import { join } from 'path';
3
-
4
- interface AgentsJson {
5
- schema_version: string;
6
- name: string;
7
- tools: unknown[];
8
- }
9
-
10
- export class Discovery {
11
- private static instance: Discovery;
12
- private agentsJson: AgentsJson | null = null;
13
- private llmsTxt: string | null = null;
14
-
15
- private constructor() {}
16
-
17
- static getInstance(): Discovery {
18
- if (!Discovery.instance) {
19
- Discovery.instance = new Discovery();
20
- }
21
- return Discovery.instance;
22
- }
23
-
24
- getAgentsJson(): AgentsJson {
25
- if (!this.agentsJson) {
26
- const path = join(process.cwd(), 'agents.json');
27
- this.agentsJson = JSON.parse(readFileSync(path, 'utf8')) as AgentsJson;
28
- }
29
- return this.agentsJson;
30
- }
31
-
32
- getLlmsTxt(): string {
33
- if (!this.llmsTxt) {
34
- const path = join(process.cwd(), 'llms.txt');
35
- this.llmsTxt = readFileSync(path, 'utf8');
36
- }
37
- return this.llmsTxt;
38
- }
39
- }
@@ -1,133 +0,0 @@
1
- const PRICE_CACHE_TTL = parseInt(process.env['PRICE_CACHE_TTL_MS'] ?? '60000', 10);
2
-
3
- const BASE_PRICES: Record<string, string> = {
4
- // Discovery (free)
5
- sml_discover: '0.00',
6
- sml_status: '0.00',
7
- // SqueezeOS signals
8
- leviathan_signal: '0.05',
9
- squeezeos_council: '0.10',
10
- squeezeos_scan: '0.05',
11
- squeezeos_options: '0.05',
12
- squeezeos_iwm: '0.03',
13
- squeezeos_preview: '0.00',
14
- squeezeos_status: '0.00',
15
- // SEC / Earnings
16
- xmit_edgar_decode: '0.02',
17
- xdeo_earnings_estimate: '0.02',
18
- // FTD
19
- ftd_threshold_scan: '0.05',
20
- // Crawl
21
- crawl_paid_fetch: '0.005',
22
- // Agent marketplace
23
- nexus_agent_hire: '0.00',
24
- nexus_agent_list: '0.00',
25
- nexus_agent_status: '0.00',
26
- // Ghost Layer (cross-chain)
27
- ghost_transfer: '0.02',
28
- ghost_status: '0.00',
29
- ghost_routes: '0.00',
30
- // RLUSD Rails
31
- rails_send: '0.01',
32
- rails_status: '0.00',
33
- // Launchpad
34
- launchpad_create_token: '0.10',
35
- launchpad_buy_token: '0.02',
36
- launchpad_list: '0.00',
37
- launchpad_status: '0.00',
38
- // Copy-Trader
39
- copytrader_subscribe: '0.05',
40
- copytrader_status: '0.00',
41
- // Backtest
42
- backtest_run: '0.05',
43
- backtest_validate: '0.05',
44
- backtest_status: '0.00',
45
- // Brokers (Tradier)
46
- brokers_quote: '0.00',
47
- brokers_options_chain: '0.01',
48
- brokers_place_order: '0.05',
49
- brokers_account: '0.01',
50
- // Shadow Desk
51
- shadow_query: '0.05',
52
- shadow_ingest: '0.02',
53
- shadow_status: '0.00',
54
- // Forge (LLM gateway)
55
- forge_complete: '0.02',
56
- forge_status: '0.00',
57
- // Proof402
58
- proof402_get_invoice: '0.00',
59
- proof402_verify: '0.00',
60
- proof402_credit_score: '0.00',
61
- // Echo (pattern matching)
62
- echo_analogs: '0.05',
63
- // Agent card / identity
64
- agentcard_verify: '0.00',
65
- agentcard_register: '0.01',
66
- agentcard_lookup: '0.00',
67
- };
68
-
69
- interface CachedPrice {
70
- price: string;
71
- fetchedAt: number;
72
- }
73
-
74
- export class PriceRegistry {
75
- private static instance: PriceRegistry;
76
- private readonly cache = new Map<string, CachedPrice>();
77
- private readonly baseUrl: string;
78
-
79
- private constructor() {
80
- this.baseUrl = process.env['SML_API_BASE'] ?? 'https://squeezeos-api.onrender.com';
81
- }
82
-
83
- static getInstance(): PriceRegistry {
84
- if (!PriceRegistry.instance) {
85
- PriceRegistry.instance = new PriceRegistry();
86
- }
87
- return PriceRegistry.instance;
88
- }
89
-
90
- async getPrice(toolName: string): Promise<string | null> {
91
- const cached = this.cache.get(toolName);
92
- const now = Date.now();
93
-
94
- if (cached && now - cached.fetchedAt < PRICE_CACHE_TTL) {
95
- return cached.price;
96
- }
97
-
98
- // Fetch live price from SML pricing API
99
- try {
100
- const res = await fetch(`${this.baseUrl}/pricing/v1/tool/${toolName}`, {
101
- signal: AbortSignal.timeout(3000),
102
- });
103
-
104
- if (res.ok) {
105
- const body = (await res.json()) as { price: string };
106
- this.cache.set(toolName, { price: body.price, fetchedAt: now });
107
- return body.price;
108
- }
109
- } catch {
110
- // Fall through to hardcoded baseline
111
- }
112
-
113
- // Use hardcoded baseline if API unavailable
114
- const fallback = BASE_PRICES[toolName];
115
- if (fallback !== undefined) {
116
- this.cache.set(toolName, { price: fallback, fetchedAt: now - PRICE_CACHE_TTL / 2 });
117
- return fallback;
118
- }
119
-
120
- // Unknown tool — default to free rather than reject
121
- this.cache.set(toolName, { price: '0.00', fetchedAt: now });
122
- return '0.00';
123
- }
124
-
125
- seedDefaults(): void {
126
- const now = Date.now();
127
- for (const [tool, price] of Object.entries(BASE_PRICES)) {
128
- if (!this.cache.has(tool)) {
129
- this.cache.set(tool, { price, fetchedAt: now });
130
- }
131
- }
132
- }
133
- }
@@ -1,42 +0,0 @@
1
- import { z } from 'zod';
2
-
3
- export const ToolACLSchema = z.object({
4
- toolName: z.string(),
5
- walletAddress: z.string().optional(),
6
- creditScore: z.number().optional(),
7
- paidTier: z.boolean().default(false),
8
- });
9
-
10
- export type ToolACL = z.infer<typeof ToolACLSchema>;
11
-
12
- const FREE_TOOLS = new Set(['ftd_threshold_scan_alerts', 'nexus_agent_hire_query']);
13
-
14
- export class ACL {
15
- private static instance: ACL;
16
-
17
- private constructor() {}
18
-
19
- static getInstance(): ACL {
20
- if (!ACL.instance) {
21
- ACL.instance = new ACL();
22
- }
23
- return ACL.instance;
24
- }
25
-
26
- isFree(toolName: string): boolean {
27
- return FREE_TOOLS.has(toolName);
28
- }
29
-
30
- requiresPayment(toolName: string): boolean {
31
- return !this.isFree(toolName);
32
- }
33
-
34
- requiresAP2(toolName: string): boolean {
35
- // leviathan, xmit, xdeo require AP2 per spec
36
- return ['leviathan_signal', 'xmit_edgar_decode', 'xdeo_earnings_estimate'].includes(toolName);
37
- }
38
-
39
- minCreditScore(_toolName: string): number {
40
- return 300;
41
- }
42
- }