@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,58 +0,0 @@
1
- import { z } from 'zod';
2
- import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
3
- import { executeX402Payment } from '../payments/x402.js';
4
- import { RateLimiter } from '../security/rate-limit.js';
5
- import { Sandbox } from '../security/sandbox.js';
6
- import { AuditLogger } from '../security/audit.js';
7
- import { PriceRegistry } from '../registry/pricing.js';
8
- import { EchoForgeAPI } from '../../lib/sml-api/echo.js';
9
-
10
- const PatternMatchSchema = z.object({
11
- symbol: z.string().min(1).max(10).toUpperCase(),
12
- lookback_days: z.number().int().min(1).max(3650),
13
- top_n: z.number().int().min(1).max(20).default(5),
14
- wallet_address: z.string().optional(),
15
- });
16
-
17
- export function registerEcho(server: McpServer): void {
18
- const audit = AuditLogger.getInstance();
19
-
20
- // ── PAID: echo_pattern_match (0.05 USDC — coming soon) ────────────────────
21
- server.tool(
22
- 'echo_pattern_match',
23
- {
24
- symbol: z.string().describe('Ticker symbol to find historical analogs for (e.g. TSLA, GME).'),
25
- lookback_days: z.number().describe('Days of price history to encode as the query pattern (1-3650).'),
26
- top_n: z.number().describe('Number of closest historical matches to return (1-20, default 5).'),
27
- wallet_address: z.string().describe('Agent wallet for x402 payment.'),
28
- },
29
- async (rawArgs) => {
30
- const args = Sandbox.validate(PatternMatchSchema, rawArgs);
31
-
32
- if (!RateLimiter.getInstance().checkTool('echo_pattern_match')) {
33
- return { content: [{ type: 'text', text: JSON.stringify({ error: 'rate_limit_exceeded', retry_after: 60 }) }], isError: true };
34
- }
35
-
36
- // Service not yet deployed — skip payment and return informative stub
37
- const data = await EchoForgeAPI.patternMatch({
38
- symbol: args.symbol,
39
- lookbackDays: args.lookback_days,
40
- topN: args.top_n,
41
- walletAddress: args.wallet_address ?? 'anonymous',
42
- });
43
-
44
- audit.info('echo_pattern_match_stub', { symbol: args.symbol });
45
-
46
- // Still go through payment flow once the service is live — skeleton already wired:
47
- // const price = await PriceRegistry.getInstance().getPrice('echo_pattern_match');
48
- // payment = await executeX402Payment(...);
49
- // Then call real API
50
-
51
- // Suppress unused import warnings until service goes live
52
- void executeX402Payment;
53
- void PriceRegistry;
54
-
55
- return { content: [{ type: 'text', text: JSON.stringify(data) }] };
56
- },
57
- );
58
- }
@@ -1,87 +0,0 @@
1
- import { z } from 'zod';
2
- import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
3
- import { executeX402Payment } from '../payments/x402.js';
4
- import { RateLimiter } from '../security/rate-limit.js';
5
- import { Sandbox } from '../security/sandbox.js';
6
- import { AuditLogger } from '../security/audit.js';
7
- import { PriceRegistry } from '../registry/pricing.js';
8
- import { ForgeGatewayAPI } from '../../lib/sml-api/forge.js';
9
-
10
- const LLMSchema = z.object({
11
- model: z.string().min(1).max(64),
12
- prompt: z.string().min(1).max(32768),
13
- max_tokens: z.number().int().positive().max(8192).optional(),
14
- wallet_address: z.string().optional(),
15
- });
16
-
17
- export function registerForge(server: McpServer): void {
18
- const audit = AuditLogger.getInstance();
19
-
20
- // ── FREE: forge_status ─────────────────────────────────────────────────────
21
- server.tool(
22
- 'forge_status',
23
- {},
24
- async () => {
25
- try {
26
- const data = await ForgeGatewayAPI.status();
27
- return { content: [{ type: 'text', text: JSON.stringify(data) }] };
28
- } catch (err) {
29
- return { content: [{ type: 'text', text: JSON.stringify({ error: 'api_error', message: String(err) }) }], isError: true };
30
- }
31
- },
32
- );
33
-
34
- // ── PAID: forge_llm (0.02 USDC) ───────────────────────────────────────────
35
- server.tool(
36
- 'forge_llm',
37
- {
38
- model: z.string().describe('Model identifier (e.g. "claude-3-5-haiku-20241022", "gpt-4o-mini").'),
39
- prompt: z.string().describe('Prompt to send to the LLM (max 32768 chars).'),
40
- max_tokens: z.number().describe('Maximum tokens in the response (default: model max). Max: 8192.'),
41
- wallet_address: z.string().describe('Agent wallet for x402 pay-per-token billing.'),
42
- },
43
- async (rawArgs) => {
44
- const args = Sandbox.validate(LLMSchema, rawArgs);
45
-
46
- if (!RateLimiter.getInstance().checkTool('forge_llm')) {
47
- return { content: [{ type: 'text', text: JSON.stringify({ error: 'rate_limit_exceeded', retry_after: 60 }) }], isError: true };
48
- }
49
-
50
- await PriceRegistry.getInstance().seedDefaults();
51
- const price = await PriceRegistry.getInstance().getPrice('forge_llm');
52
- if (!price) {
53
- return { content: [{ type: 'text', text: JSON.stringify({ error: 'price_unavailable' }) }], isError: true };
54
- }
55
-
56
- let payment;
57
- try {
58
- payment = await executeX402Payment({ price, currency: 'USDC', toolName: 'forge_llm', walletAddress: args.wallet_address });
59
- } catch (err) {
60
- audit.warn('forge_llm_payment_fail', { error: String(err) });
61
- return { content: [{ type: 'text', text: JSON.stringify({ error: 'payment_failed', message: String(err) }) }], isError: true };
62
- }
63
-
64
- try {
65
- const data = await ForgeGatewayAPI.llm({
66
- model: args.model,
67
- prompt: args.prompt,
68
- maxTokens: args.max_tokens,
69
- walletAddress: args.wallet_address ?? payment.walletAddress ?? 'anonymous',
70
- });
71
- audit.info('forge_llm_success', { model: args.model, receiptId: payment.receiptId });
72
- return {
73
- content: [{
74
- type: 'text',
75
- text: JSON.stringify({
76
- data,
77
- _meta: { receipt_id: payment.receiptId, tx_hash: payment.txHash, chain: payment.chain, amount_paid: `${payment.amountPaid} ${payment.currency}`, timestamp: payment.timestamp },
78
- }),
79
- }],
80
- };
81
- } catch (err) {
82
- audit.error('forge_llm_api_fail', { error: String(err) });
83
- return { content: [{ type: 'text', text: JSON.stringify({ error: 'api_error', message: String(err) }) }], isError: true };
84
- }
85
- },
86
- );
87
- }
@@ -1,88 +0,0 @@
1
- import { z } from 'zod';
2
- import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
3
- import { executeX402Payment } from '../payments/x402.js';
4
- import { RateLimiter } from '../security/rate-limit.js';
5
- import { Sandbox } from '../security/sandbox.js';
6
- import { AuditLogger } from '../security/audit.js';
7
- import { FtdClient } from '../../lib/sml-api/ftd.js';
8
- import { PriceRegistry } from '../registry/pricing.js';
9
-
10
- const CACHE_TTL_MS = 15 * 60 * 1000; // 15-min cache per spec
11
-
12
- interface CacheEntry {
13
- data: unknown;
14
- ts: number;
15
- }
16
-
17
- const alertCache = new Map<string, CacheEntry>();
18
- const fullCache = new Map<string, CacheEntry>();
19
-
20
- const InputSchema = z.object({
21
- scan_type: z.enum(['alerts', 'full', 'spike_history']),
22
- ticker: z.string().regex(/^[A-Z]{1,5}$/).optional(),
23
- min_spike_multiplier: z.number().min(1).default(2),
24
- wallet_address: z.string().optional(),
25
- });
26
-
27
- export function registerFtd(server: McpServer): void {
28
- server.tool(
29
- 'ftd_threshold_scan',
30
- {
31
- scan_type: z.enum(['alerts', 'full', 'spike_history']).describe('"alerts" is free. "full" and "spike_history" require 0.05 USDC.'),
32
- ticker: z.string().describe('Filter by ticker. Optional.'),
33
- min_spike_multiplier: z.number().describe('Minimum FTD spike multiplier vs baseline. Default: 2x.'),
34
- wallet_address: z.string().describe('Agent wallet for paid scans.'),
35
- },
36
- async (rawArgs) => {
37
- const args = Sandbox.validate(InputSchema, rawArgs);
38
- const audit = AuditLogger.getInstance();
39
-
40
- if (!RateLimiter.getInstance().checkTool('ftd_threshold_scan')) {
41
- return { content: [{ type: 'text', text: JSON.stringify({ error: 'rate_limit_exceeded' }) }], isError: true };
42
- }
43
-
44
- const cacheKey = `${args.scan_type}:${args.ticker ?? 'all'}:${args.min_spike_multiplier}`;
45
- const now = Date.now();
46
-
47
- // Free tier: alerts only
48
- if (args.scan_type === 'alerts') {
49
- const cached = alertCache.get(cacheKey);
50
- if (cached && now - cached.ts < CACHE_TTL_MS) {
51
- return { content: [{ type: 'text', text: JSON.stringify({ data: cached.data, cached: true, tier: 'free' }) }] };
52
- }
53
-
54
- const client = FtdClient.getInstance();
55
- const data = await client.getAlerts({ ticker: args.ticker, minSpikeMultiplier: args.min_spike_multiplier ?? 2 });
56
- alertCache.set(cacheKey, { data, ts: now });
57
- audit.info('ftd_alert_success', { ticker: args.ticker ?? 'all' });
58
- return { content: [{ type: 'text', text: JSON.stringify({ data, tier: 'free' }) }] };
59
- }
60
-
61
- // Paid tier: full data
62
- const cached = fullCache.get(cacheKey);
63
- if (cached && now - cached.ts < CACHE_TTL_MS) {
64
- return { content: [{ type: 'text', text: JSON.stringify({ data: cached.data, cached: true, tier: 'paid' }) }] };
65
- }
66
-
67
- await PriceRegistry.getInstance().seedDefaults();
68
- const price = await PriceRegistry.getInstance().getPrice('ftd_threshold_scan');
69
- if (!price) {
70
- return { content: [{ type: 'text', text: JSON.stringify({ error: 'price_unavailable' }) }], isError: true };
71
- }
72
-
73
- let payment;
74
- try {
75
- payment = await executeX402Payment({ price, currency: 'USDC', toolName: 'ftd_threshold_scan', walletAddress: args.wallet_address });
76
- } catch (err) {
77
- return { content: [{ type: 'text', text: JSON.stringify({ error: 'payment_failed', message: String(err) }) }], isError: true };
78
- }
79
-
80
- const client = FtdClient.getInstance();
81
- const data = await client.getFullScan({ ticker: args.ticker, scanType: args.scan_type, minSpikeMultiplier: args.min_spike_multiplier ?? 2 });
82
- fullCache.set(cacheKey, { data, ts: now });
83
-
84
- audit.info('ftd_paid_success', { ticker: args.ticker ?? 'all', receiptId: payment.receiptId });
85
- return { content: [{ type: 'text', text: JSON.stringify({ data, tier: 'paid', _meta: { receipt_id: payment.receiptId, tx_hash: payment.txHash, chain: payment.chain, amount_paid: `${payment.amountPaid} ${payment.currency}` } }) }] };
86
- },
87
- );
88
- }
@@ -1,93 +0,0 @@
1
- import { z } from 'zod';
2
- import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
3
- import { executeX402Payment } from '../payments/x402.js';
4
- import { RateLimiter } from '../security/rate-limit.js';
5
- import { Sandbox } from '../security/sandbox.js';
6
- import { AuditLogger } from '../security/audit.js';
7
- import { PriceRegistry } from '../registry/pricing.js';
8
- import { GhostLayerAPI } from '../../lib/sml-api/ghost.js';
9
-
10
- const RouteSchema = z.object({
11
- from_chain: z.enum(['xrpl', 'base']),
12
- to_chain: z.enum(['xrpl', 'base']),
13
- amount: z.string().min(1),
14
- currency: z.string().min(1).max(10),
15
- destination_address: z.string().min(10),
16
- wallet_address: z.string().optional(),
17
- });
18
-
19
- export function registerGhost(server: McpServer): void {
20
- const audit = AuditLogger.getInstance();
21
-
22
- // ── FREE: ghost_status ────────────────────────────────────────────────────
23
- server.tool(
24
- 'ghost_status',
25
- {},
26
- async () => {
27
- try {
28
- const data = await GhostLayerAPI.status();
29
- return { content: [{ type: 'text', text: JSON.stringify(data) }] };
30
- } catch (err) {
31
- return { content: [{ type: 'text', text: JSON.stringify({ error: 'api_error', message: String(err) }) }], isError: true };
32
- }
33
- },
34
- );
35
-
36
- // ── PAID: ghost_route (0.01 USDC) ─────────────────────────────────────────
37
- server.tool(
38
- 'ghost_route',
39
- {
40
- from_chain: z.enum(['xrpl', 'base']).describe('Source chain.'),
41
- to_chain: z.enum(['xrpl', 'base']).describe('Destination chain.'),
42
- amount: z.string().describe('Amount to route (as string to preserve precision).'),
43
- currency: z.string().describe('Token/currency symbol (e.g. RLUSD, XRP, ETH).'),
44
- destination_address: z.string().describe('Recipient address on the destination chain.'),
45
- wallet_address: z.string().describe('Agent wallet for x402 payment.'),
46
- },
47
- async (rawArgs) => {
48
- const args = Sandbox.validate(RouteSchema, rawArgs);
49
-
50
- if (!RateLimiter.getInstance().checkTool('ghost_route')) {
51
- return { content: [{ type: 'text', text: JSON.stringify({ error: 'rate_limit_exceeded', retry_after: 60 }) }], isError: true };
52
- }
53
-
54
- await PriceRegistry.getInstance().seedDefaults();
55
- const price = await PriceRegistry.getInstance().getPrice('ghost_route');
56
- if (!price) {
57
- return { content: [{ type: 'text', text: JSON.stringify({ error: 'price_unavailable' }) }], isError: true };
58
- }
59
-
60
- let payment;
61
- try {
62
- payment = await executeX402Payment({ price, currency: 'USDC', toolName: 'ghost_route', walletAddress: args.wallet_address });
63
- } catch (err) {
64
- audit.warn('ghost_route_payment_fail', { error: String(err) });
65
- return { content: [{ type: 'text', text: JSON.stringify({ error: 'payment_failed', message: String(err) }) }], isError: true };
66
- }
67
-
68
- try {
69
- const data = await GhostLayerAPI.route({
70
- fromChain: args.from_chain,
71
- toChain: args.to_chain,
72
- amount: args.amount,
73
- currency: args.currency,
74
- destinationAddress: args.destination_address,
75
- walletAddress: args.wallet_address ?? payment.walletAddress ?? 'anonymous',
76
- });
77
- audit.info('ghost_route_success', { receiptId: payment.receiptId });
78
- return {
79
- content: [{
80
- type: 'text',
81
- text: JSON.stringify({
82
- data,
83
- _meta: { receipt_id: payment.receiptId, tx_hash: payment.txHash, chain: payment.chain, amount_paid: `${payment.amountPaid} ${payment.currency}`, timestamp: payment.timestamp },
84
- }),
85
- }],
86
- };
87
- } catch (err) {
88
- audit.error('ghost_route_api_fail', { error: String(err) });
89
- return { content: [{ type: 'text', text: JSON.stringify({ error: 'api_error', message: String(err) }) }], isError: true };
90
- }
91
- },
92
- );
93
- }
@@ -1,42 +0,0 @@
1
- import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
- import { registerAgentCard } from './agentcard.js';
3
- import { registerBacktest } from './backtest.js';
4
- import { registerBrokers } from './brokers.js';
5
- import { registerCopyTrader } from './copytrader.js';
6
- import { registerCrawl } from './crawl.js';
7
- import { registerDiscovery } from './discovery.js';
8
- import { registerEcho } from './echo.js';
9
- import { registerForge } from './forge.js';
10
- import { registerFtd } from './ftd.js';
11
- import { registerGhost } from './ghost.js';
12
- import { registerLaunchpad } from './launchpad.js';
13
- import { registerLeviathan } from './leviathan.js';
14
- import { registerNexus } from './nexus.js';
15
- import { registerProof402 } from './proof402.js';
16
- import { registerRails } from './rails.js';
17
- import { registerShadow } from './shadow.js';
18
- import { registerSqueezeOS } from './squeezeos.js';
19
- import { registerXdeo } from './xdeo.js';
20
- import { registerXmit } from './xmit.js';
21
-
22
- export async function registerTools(server: McpServer): Promise<void> {
23
- registerDiscovery(server);
24
- registerAgentCard(server);
25
- registerBacktest(server);
26
- registerBrokers(server);
27
- registerCopyTrader(server);
28
- registerCrawl(server);
29
- registerEcho(server);
30
- registerForge(server);
31
- registerFtd(server);
32
- registerGhost(server);
33
- registerLaunchpad(server);
34
- await registerLeviathan(server);
35
- registerNexus(server);
36
- registerProof402(server);
37
- registerRails(server);
38
- registerShadow(server);
39
- registerSqueezeOS(server);
40
- registerXdeo(server);
41
- await registerXmit(server);
42
- }
@@ -1,173 +0,0 @@
1
- import { z } from 'zod';
2
- import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
3
- import { executeX402Payment } from '../payments/x402.js';
4
- import { RateLimiter } from '../security/rate-limit.js';
5
- import { Sandbox } from '../security/sandbox.js';
6
- import { AuditLogger } from '../security/audit.js';
7
- import { PriceRegistry } from '../registry/pricing.js';
8
- import { LaunchpadAPI } from '../../lib/sml-api/launchpad.js';
9
-
10
- const CreateSchema = z.object({
11
- name: z.string().min(1).max(64),
12
- symbol: z.string().min(1).max(10).toUpperCase(),
13
- description: z.string().max(512),
14
- creator_address: z.string().min(10),
15
- initial_supply: z.number().int().positive(),
16
- target_liquidity_xrp: z.number().positive(),
17
- wallet_address: z.string().optional(),
18
- });
19
-
20
- const BuySchema = z.object({
21
- token_address: z.string().min(10),
22
- buyer_address: z.string().min(10),
23
- xrp_amount: z.number().positive(),
24
- wallet_address: z.string().optional(),
25
- });
26
-
27
- export function registerLaunchpad(server: McpServer): void {
28
- const audit = AuditLogger.getInstance();
29
-
30
- // ── FREE: launchpad_status ─────────────────────────────────────────────────
31
- server.tool(
32
- 'launchpad_status',
33
- {},
34
- async () => {
35
- try {
36
- const data = await LaunchpadAPI.status();
37
- return { content: [{ type: 'text', text: JSON.stringify(data) }] };
38
- } catch (err) {
39
- return { content: [{ type: 'text', text: JSON.stringify({ error: 'api_error', message: String(err) }) }], isError: true };
40
- }
41
- },
42
- );
43
-
44
- // ── FREE: launchpad_list ───────────────────────────────────────────────────
45
- server.tool(
46
- 'launchpad_list',
47
- {},
48
- async () => {
49
- if (!RateLimiter.getInstance().checkTool('launchpad_list')) {
50
- return { content: [{ type: 'text', text: JSON.stringify({ error: 'rate_limit_exceeded', retry_after: 60 }) }], isError: true };
51
- }
52
- try {
53
- const data = await LaunchpadAPI.list();
54
- audit.info('launchpad_list', {});
55
- return { content: [{ type: 'text', text: JSON.stringify(data) }] };
56
- } catch (err) {
57
- return { content: [{ type: 'text', text: JSON.stringify({ error: 'api_error', message: String(err) }) }], isError: true };
58
- }
59
- },
60
- );
61
-
62
- // ── PAID: launchpad_create (0.10 USDC) ────────────────────────────────────
63
- server.tool(
64
- 'launchpad_create',
65
- {
66
- name: z.string().describe('Token name (e.g. "Moon Rocket").'),
67
- symbol: z.string().describe('Ticker symbol (e.g. MNRKT, max 10 chars).'),
68
- description: z.string().describe('Token description (max 512 chars).'),
69
- creator_address: z.string().describe('XRPL address of the token creator.'),
70
- initial_supply: z.number().describe('Total token supply (integer).'),
71
- target_liquidity_xrp: z.number().describe('XRP target to graduate from bonding curve to DEX.'),
72
- wallet_address: z.string().describe('Agent wallet for x402 payment.'),
73
- },
74
- async (rawArgs) => {
75
- const args = Sandbox.validate(CreateSchema, rawArgs);
76
-
77
- if (!RateLimiter.getInstance().checkTool('launchpad_create')) {
78
- return { content: [{ type: 'text', text: JSON.stringify({ error: 'rate_limit_exceeded', retry_after: 60 }) }], isError: true };
79
- }
80
-
81
- await PriceRegistry.getInstance().seedDefaults();
82
- const price = await PriceRegistry.getInstance().getPrice('launchpad_create');
83
- if (!price) {
84
- return { content: [{ type: 'text', text: JSON.stringify({ error: 'price_unavailable' }) }], isError: true };
85
- }
86
-
87
- let payment;
88
- try {
89
- payment = await executeX402Payment({ price, currency: 'USDC', toolName: 'launchpad_create', walletAddress: args.wallet_address });
90
- } catch (err) {
91
- audit.warn('launchpad_create_payment_fail', { error: String(err) });
92
- return { content: [{ type: 'text', text: JSON.stringify({ error: 'payment_failed', message: String(err) }) }], isError: true };
93
- }
94
-
95
- try {
96
- const data = await LaunchpadAPI.create({
97
- name: args.name,
98
- symbol: args.symbol,
99
- description: args.description,
100
- creatorAddress: args.creator_address,
101
- initialSupply: args.initial_supply,
102
- targetLiquidityXrp: args.target_liquidity_xrp,
103
- });
104
- audit.info('launchpad_create_success', { symbol: args.symbol, receiptId: payment.receiptId });
105
- return {
106
- content: [{
107
- type: 'text',
108
- text: JSON.stringify({
109
- data,
110
- _meta: { receipt_id: payment.receiptId, tx_hash: payment.txHash, chain: payment.chain, amount_paid: `${payment.amountPaid} ${payment.currency}`, timestamp: payment.timestamp },
111
- }),
112
- }],
113
- };
114
- } catch (err) {
115
- audit.error('launchpad_create_api_fail', { error: String(err) });
116
- return { content: [{ type: 'text', text: JSON.stringify({ error: 'api_error', message: String(err) }) }], isError: true };
117
- }
118
- },
119
- );
120
-
121
- // ── PAID: launchpad_buy (0.01 USDC) ───────────────────────────────────────
122
- server.tool(
123
- 'launchpad_buy',
124
- {
125
- token_address: z.string().describe('Token contract/address on XRPL.'),
126
- buyer_address: z.string().describe('XRPL address of the buyer.'),
127
- xrp_amount: z.number().describe('Amount of XRP to spend on the bonding curve.'),
128
- wallet_address: z.string().describe('Agent wallet for x402 payment.'),
129
- },
130
- async (rawArgs) => {
131
- const args = Sandbox.validate(BuySchema, rawArgs);
132
-
133
- if (!RateLimiter.getInstance().checkTool('launchpad_buy')) {
134
- return { content: [{ type: 'text', text: JSON.stringify({ error: 'rate_limit_exceeded', retry_after: 60 }) }], isError: true };
135
- }
136
-
137
- await PriceRegistry.getInstance().seedDefaults();
138
- const price = await PriceRegistry.getInstance().getPrice('launchpad_buy');
139
- if (!price) {
140
- return { content: [{ type: 'text', text: JSON.stringify({ error: 'price_unavailable' }) }], isError: true };
141
- }
142
-
143
- let payment;
144
- try {
145
- payment = await executeX402Payment({ price, currency: 'USDC', toolName: 'launchpad_buy', walletAddress: args.wallet_address });
146
- } catch (err) {
147
- audit.warn('launchpad_buy_payment_fail', { error: String(err) });
148
- return { content: [{ type: 'text', text: JSON.stringify({ error: 'payment_failed', message: String(err) }) }], isError: true };
149
- }
150
-
151
- try {
152
- const data = await LaunchpadAPI.buy({
153
- tokenAddress: args.token_address,
154
- buyerAddress: args.buyer_address,
155
- xrpAmount: args.xrp_amount,
156
- });
157
- audit.info('launchpad_buy_success', { receiptId: payment.receiptId });
158
- return {
159
- content: [{
160
- type: 'text',
161
- text: JSON.stringify({
162
- data,
163
- _meta: { receipt_id: payment.receiptId, tx_hash: payment.txHash, chain: payment.chain, amount_paid: `${payment.amountPaid} ${payment.currency}`, timestamp: payment.timestamp },
164
- }),
165
- }],
166
- };
167
- } catch (err) {
168
- audit.error('launchpad_buy_api_fail', { error: String(err) });
169
- return { content: [{ type: 'text', text: JSON.stringify({ error: 'api_error', message: String(err) }) }], isError: true };
170
- }
171
- },
172
- );
173
- }
@@ -1,81 +0,0 @@
1
- import { z } from 'zod';
2
- import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
3
- import { executeX402Payment } from '../payments/x402.js';
4
- import { RateLimiter } from '../security/rate-limit.js';
5
- import { Sandbox } from '../security/sandbox.js';
6
- import { AuditLogger } from '../security/audit.js';
7
- import { LeviathanClient } from '../../lib/sml-api/leviathan.js';
8
- import { PriceRegistry } from '../registry/pricing.js';
9
-
10
- const InputSchema = z.object({
11
- ticker: z.string().regex(/^[A-Z]{1,5}$/).optional(),
12
- signal_type: z.enum(['squeeze', 'momentum', 'dark_pool', 'all']),
13
- min_confidence: z.number().min(0).max(100).default(60),
14
- wallet_address: z.string().optional(),
15
- });
16
-
17
- export function registerLeviathan(server: McpServer): void {
18
- server.tool(
19
- 'leviathan_signal',
20
- {
21
- ticker: z.string().describe('Ticker symbol (e.g. TSLA, MSTR). Optional — omit for top signals.'),
22
- signal_type: z.enum(['squeeze', 'momentum', 'dark_pool', 'all']).describe('Signal category.'),
23
- min_confidence: z.number().describe('Minimum confidence score 0-100. Default: 60.'),
24
- wallet_address: z.string().describe('Agent wallet address for payment. Auto-provisioned if omitted.'),
25
- },
26
- async (rawArgs) => {
27
- const args = Sandbox.validate(InputSchema, rawArgs);
28
- const audit = AuditLogger.getInstance();
29
-
30
- if (!RateLimiter.getInstance().checkTool('leviathan_signal')) {
31
- return { content: [{ type: 'text', text: JSON.stringify({ error: 'rate_limit_exceeded', retry_after: 60 }) }], isError: true };
32
- }
33
-
34
- await PriceRegistry.getInstance().seedDefaults();
35
- const price = await PriceRegistry.getInstance().getPrice('leviathan_signal');
36
- if (!price) {
37
- return { content: [{ type: 'text', text: JSON.stringify({ error: 'price_unavailable', message: 'Cannot determine price. Try again shortly.' }) }], isError: true };
38
- }
39
-
40
- let payment;
41
- try {
42
- payment = await executeX402Payment({
43
- price,
44
- currency: 'USDC',
45
- toolName: 'leviathan_signal',
46
- walletAddress: args.wallet_address,
47
- });
48
- } catch (err) {
49
- audit.warn('leviathan_payment_fail', { error: String(err) });
50
- return { content: [{ type: 'text', text: JSON.stringify({ error: 'payment_failed', message: String(err) }) }], isError: true };
51
- }
52
-
53
- const client = LeviathanClient.getInstance();
54
- const data = await client.getSignal({
55
- ticker: args.ticker,
56
- signalType: args.signal_type,
57
- minConfidence: args.min_confidence ?? 60,
58
- });
59
-
60
- audit.info('leviathan_success', { ticker: args.ticker ?? 'all', receiptId: payment.receiptId });
61
-
62
- return {
63
- content: [
64
- {
65
- type: 'text',
66
- text: JSON.stringify({
67
- data,
68
- _meta: {
69
- receipt_id: payment.receiptId,
70
- tx_hash: payment.txHash,
71
- chain: payment.chain,
72
- amount_paid: `${payment.amountPaid} ${payment.currency}`,
73
- timestamp: payment.timestamp,
74
- },
75
- }),
76
- },
77
- ],
78
- };
79
- },
80
- );
81
- }