clodds 1.2.8 → 1.3.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 (232) hide show
  1. package/dist/skills/bundled/acp/SKILL.md +188 -0
  2. package/dist/skills/bundled/acp/index.d.ts +0 -3
  3. package/dist/skills/bundled/acp/index.js +1 -1
  4. package/dist/skills/bundled/acp/index.js.map +1 -1
  5. package/dist/skills/bundled/agentbets/SKILL.md +19 -0
  6. package/dist/skills/bundled/ai-strategy/SKILL.md +111 -0
  7. package/dist/skills/bundled/ai-strategy/index.js +1 -1
  8. package/dist/skills/bundled/ai-strategy/index.js.map +1 -1
  9. package/dist/skills/bundled/alerts/SKILL.md +87 -0
  10. package/dist/skills/bundled/analytics/SKILL.md +252 -0
  11. package/dist/skills/bundled/analytics/index.js +2 -2
  12. package/dist/skills/bundled/analytics/index.js.map +1 -1
  13. package/dist/skills/bundled/arbitrage/SKILL.md +287 -0
  14. package/dist/skills/bundled/auto-reply/SKILL.md +285 -0
  15. package/dist/skills/bundled/auto-reply/index.js +2 -2
  16. package/dist/skills/bundled/auto-reply/index.js.map +1 -1
  17. package/dist/skills/bundled/automation/SKILL.md +242 -0
  18. package/dist/skills/bundled/automation/index.js +2 -2
  19. package/dist/skills/bundled/automation/index.js.map +1 -1
  20. package/dist/skills/bundled/backtest/SKILL.md +225 -0
  21. package/dist/skills/bundled/bags/SKILL.md +131 -0
  22. package/dist/skills/bundled/bankr/SKILL.md +114 -0
  23. package/dist/skills/bundled/betfair/SKILL.md +113 -0
  24. package/dist/skills/bundled/binance-futures/SKILL.md +84 -0
  25. package/dist/skills/bundled/binance-futures/index.d.ts +0 -3
  26. package/dist/skills/bundled/binance-futures/index.js +1 -2
  27. package/dist/skills/bundled/binance-futures/index.js.map +1 -1
  28. package/dist/skills/bundled/botchan/SKILL.md +66 -0
  29. package/dist/skills/bundled/botchan/index.d.ts +0 -3
  30. package/dist/skills/bundled/botchan/index.js +0 -1
  31. package/dist/skills/bundled/botchan/index.js.map +1 -1
  32. package/dist/skills/bundled/bridge/SKILL.md +215 -0
  33. package/dist/skills/bundled/bybit-futures/SKILL.md +84 -0
  34. package/dist/skills/bundled/bybit-futures/index.d.ts +0 -3
  35. package/dist/skills/bundled/bybit-futures/index.js +0 -1
  36. package/dist/skills/bundled/bybit-futures/index.js.map +1 -1
  37. package/dist/skills/bundled/clanker/SKILL.md +125 -0
  38. package/dist/skills/bundled/clanker/index.d.ts +0 -3
  39. package/dist/skills/bundled/clanker/index.js +0 -1
  40. package/dist/skills/bundled/clanker/index.js.map +1 -1
  41. package/dist/skills/bundled/copy-trading/SKILL.md +285 -0
  42. package/dist/skills/bundled/copy-trading/index.js +2 -2
  43. package/dist/skills/bundled/copy-trading/index.js.map +1 -1
  44. package/dist/skills/bundled/copy-trading-solana/SKILL.md +66 -0
  45. package/dist/skills/bundled/credentials/SKILL.md +261 -0
  46. package/dist/skills/bundled/crypto-hft/SKILL.md +121 -0
  47. package/dist/skills/bundled/dca/SKILL.md +27 -0
  48. package/dist/skills/bundled/dex/SKILL.md +87 -0
  49. package/dist/skills/bundled/dex/index.d.ts +36 -0
  50. package/dist/skills/bundled/dex/index.js +537 -0
  51. package/dist/skills/bundled/dex/index.js.map +1 -0
  52. package/dist/skills/bundled/divergence/SKILL.md +83 -0
  53. package/dist/skills/bundled/doctor/SKILL.md +267 -0
  54. package/dist/skills/bundled/doctor/index.js +2 -8
  55. package/dist/skills/bundled/doctor/index.js.map +1 -1
  56. package/dist/skills/bundled/drift/SKILL.md +53 -0
  57. package/dist/skills/bundled/drift-sdk/SKILL.md +103 -0
  58. package/dist/skills/bundled/drift-sdk/index.d.ts +0 -3
  59. package/dist/skills/bundled/drift-sdk/index.js +0 -1
  60. package/dist/skills/bundled/drift-sdk/index.js.map +1 -1
  61. package/dist/skills/bundled/edge/SKILL.md +84 -0
  62. package/dist/skills/bundled/embeddings/SKILL.md +244 -0
  63. package/dist/skills/bundled/endaoment/SKILL.md +65 -0
  64. package/dist/skills/bundled/endaoment/index.d.ts +0 -3
  65. package/dist/skills/bundled/endaoment/index.js +0 -1
  66. package/dist/skills/bundled/endaoment/index.js.map +1 -1
  67. package/dist/skills/bundled/ens/SKILL.md +63 -0
  68. package/dist/skills/bundled/ens/index.d.ts +0 -3
  69. package/dist/skills/bundled/ens/index.js +0 -1
  70. package/dist/skills/bundled/ens/index.js.map +1 -1
  71. package/dist/skills/bundled/erc8004/SKILL.md +79 -0
  72. package/dist/skills/bundled/erc8004/index.d.ts +0 -3
  73. package/dist/skills/bundled/erc8004/index.js +0 -1
  74. package/dist/skills/bundled/erc8004/index.js.map +1 -1
  75. package/dist/skills/bundled/execution/SKILL.md +278 -0
  76. package/dist/skills/bundled/farcaster/SKILL.md +80 -0
  77. package/dist/skills/bundled/features/SKILL.md +20 -0
  78. package/dist/skills/bundled/feeds/SKILL.md +288 -0
  79. package/dist/skills/bundled/harden/SKILL.md +74 -0
  80. package/dist/skills/bundled/history/SKILL.md +257 -0
  81. package/dist/skills/bundled/hyperliquid/SKILL.md +200 -0
  82. package/dist/skills/bundled/hyperliquid/index.d.ts +0 -3
  83. package/dist/skills/bundled/hyperliquid/index.js +0 -1
  84. package/dist/skills/bundled/hyperliquid/index.js.map +1 -1
  85. package/dist/skills/bundled/identity/SKILL.md +228 -0
  86. package/dist/skills/bundled/identity/index.js +2 -2
  87. package/dist/skills/bundled/identity/index.js.map +1 -1
  88. package/dist/skills/bundled/integrations/SKILL.md +321 -0
  89. package/dist/skills/bundled/integrations/index.js +2 -2
  90. package/dist/skills/bundled/integrations/index.js.map +1 -1
  91. package/dist/skills/bundled/jupiter/SKILL.md +163 -0
  92. package/dist/skills/bundled/kamino/SKILL.md +69 -0
  93. package/dist/skills/bundled/ledger/SKILL.md +20 -0
  94. package/dist/skills/bundled/lighter/SKILL.md +83 -0
  95. package/dist/skills/bundled/lighter/index.d.ts +0 -3
  96. package/dist/skills/bundled/lighter/index.js +0 -1
  97. package/dist/skills/bundled/lighter/index.js.map +1 -1
  98. package/dist/skills/bundled/marginfi/SKILL.md +62 -0
  99. package/dist/skills/bundled/market-index/SKILL.md +242 -0
  100. package/dist/skills/bundled/market-index/index.js +1 -3
  101. package/dist/skills/bundled/market-index/index.js.map +1 -1
  102. package/dist/skills/bundled/markets/SKILL.md +49 -0
  103. package/dist/skills/bundled/mcp/SKILL.md +235 -0
  104. package/dist/skills/bundled/mcp/index.js +1 -3
  105. package/dist/skills/bundled/mcp/index.js.map +1 -1
  106. package/dist/skills/bundled/memory/SKILL.md +209 -0
  107. package/dist/skills/bundled/metaculus/SKILL.md +62 -0
  108. package/dist/skills/bundled/meteora/SKILL.md +28 -0
  109. package/dist/skills/bundled/meteora-dbc/SKILL.md +25 -0
  110. package/dist/skills/bundled/metrics/SKILL.md +338 -0
  111. package/dist/skills/bundled/mev/SKILL.md +239 -0
  112. package/dist/skills/bundled/mev/index.js +2 -2
  113. package/dist/skills/bundled/mev/index.js.map +1 -1
  114. package/dist/skills/bundled/mexc-futures/SKILL.md +86 -0
  115. package/dist/skills/bundled/mexc-futures/index.d.ts +0 -3
  116. package/dist/skills/bundled/mexc-futures/index.js +0 -1
  117. package/dist/skills/bundled/mexc-futures/index.js.map +1 -1
  118. package/dist/skills/bundled/mm/SKILL.md +142 -0
  119. package/dist/skills/bundled/monitoring/SKILL.md +249 -0
  120. package/dist/skills/bundled/news/SKILL.md +95 -0
  121. package/dist/skills/bundled/onchainkit/SKILL.md +83 -0
  122. package/dist/skills/bundled/opinion/SKILL.md +87 -0
  123. package/dist/skills/bundled/opportunity/SKILL.md +308 -0
  124. package/dist/skills/bundled/orca/SKILL.md +28 -0
  125. package/dist/skills/bundled/pairing/SKILL.md +275 -0
  126. package/dist/skills/bundled/pancakeswap/SKILL.md +93 -0
  127. package/dist/skills/bundled/pancakeswap/index.d.ts +0 -3
  128. package/dist/skills/bundled/pancakeswap/index.js +0 -1
  129. package/dist/skills/bundled/pancakeswap/index.js.map +1 -1
  130. package/dist/skills/bundled/percolator/SKILL.md +22 -0
  131. package/dist/skills/bundled/permissions/SKILL.md +269 -0
  132. package/dist/skills/bundled/permissions/index.js +2 -2
  133. package/dist/skills/bundled/permissions/index.js.map +1 -1
  134. package/dist/skills/bundled/plugins/SKILL.md +263 -0
  135. package/dist/skills/bundled/plugins/index.js +2 -2
  136. package/dist/skills/bundled/plugins/index.js.map +1 -1
  137. package/dist/skills/bundled/portfolio/SKILL.md +161 -0
  138. package/dist/skills/bundled/portfolio/index.js +1 -1
  139. package/dist/skills/bundled/portfolio/index.js.map +1 -1
  140. package/dist/skills/bundled/portfolio-sync/SKILL.md +466 -0
  141. package/dist/skills/bundled/positions/SKILL.md +262 -0
  142. package/dist/skills/bundled/predictfun/SKILL.md +109 -0
  143. package/dist/skills/bundled/predictfun/index.js +1 -1
  144. package/dist/skills/bundled/predictfun/index.js.map +1 -1
  145. package/dist/skills/bundled/predictit/SKILL.md +66 -0
  146. package/dist/skills/bundled/presence/SKILL.md +217 -0
  147. package/dist/skills/bundled/presence/index.js +2 -2
  148. package/dist/skills/bundled/presence/index.js.map +1 -1
  149. package/dist/skills/bundled/processes/SKILL.md +254 -0
  150. package/dist/skills/bundled/pump-swarm/SKILL.md +309 -0
  151. package/dist/skills/bundled/pumpfun/SKILL.md +145 -0
  152. package/dist/skills/bundled/pumpfun/index.d.ts +8 -1
  153. package/dist/skills/bundled/pumpfun/index.js +221 -11
  154. package/dist/skills/bundled/pumpfun/index.js.map +1 -1
  155. package/dist/skills/bundled/qmd/SKILL.md +129 -0
  156. package/dist/skills/bundled/qrcoin/SKILL.md +60 -0
  157. package/dist/skills/bundled/qrcoin/index.d.ts +0 -3
  158. package/dist/skills/bundled/qrcoin/index.js +0 -1
  159. package/dist/skills/bundled/qrcoin/index.js.map +1 -1
  160. package/dist/skills/bundled/raydium/SKILL.md +198 -0
  161. package/dist/skills/bundled/remote/SKILL.md +201 -0
  162. package/dist/skills/bundled/research/SKILL.md +83 -0
  163. package/dist/skills/bundled/research/index.js +2 -2
  164. package/dist/skills/bundled/research/index.js.map +1 -1
  165. package/dist/skills/bundled/risk/SKILL.md +323 -0
  166. package/dist/skills/bundled/router/SKILL.md +233 -0
  167. package/dist/skills/bundled/routing/SKILL.md +258 -0
  168. package/dist/skills/bundled/sandbox/SKILL.md +257 -0
  169. package/dist/skills/bundled/search-config/SKILL.md +257 -0
  170. package/dist/skills/bundled/search-config/index.js +2 -2
  171. package/dist/skills/bundled/search-config/index.js.map +1 -1
  172. package/dist/skills/bundled/sessions/SKILL.md +251 -0
  173. package/dist/skills/bundled/sessions/index.js +1 -1
  174. package/dist/skills/bundled/sessions/index.js.map +1 -1
  175. package/dist/skills/bundled/setup/SKILL.md +53 -0
  176. package/dist/skills/bundled/shield/SKILL.md +21 -0
  177. package/dist/skills/bundled/signals/SKILL.md +106 -0
  178. package/dist/skills/bundled/signals/index.d.ts +0 -3
  179. package/dist/skills/bundled/signals/index.js +3 -4
  180. package/dist/skills/bundled/signals/index.js.map +1 -1
  181. package/dist/skills/bundled/sizing/SKILL.md +238 -0
  182. package/dist/skills/bundled/slippage/SKILL.md +306 -0
  183. package/dist/skills/bundled/smarkets/SKILL.md +107 -0
  184. package/dist/skills/bundled/solend/SKILL.md +63 -0
  185. package/dist/skills/bundled/strategy/SKILL.md +266 -0
  186. package/dist/skills/bundled/streaming/SKILL.md +150 -0
  187. package/dist/skills/bundled/streaming/index.js +2 -2
  188. package/dist/skills/bundled/streaming/index.js.map +1 -1
  189. package/dist/skills/bundled/tailscale/SKILL.md +249 -0
  190. package/dist/skills/bundled/tailscale/index.js +2 -2
  191. package/dist/skills/bundled/tailscale/index.js.map +1 -1
  192. package/dist/skills/bundled/ticks/SKILL.md +61 -0
  193. package/dist/skills/bundled/token-security/SKILL.md +18 -0
  194. package/dist/skills/bundled/trading-evm/SKILL.md +329 -0
  195. package/dist/skills/bundled/trading-futures/SKILL.md +865 -0
  196. package/dist/skills/bundled/trading-kalshi/SKILL.md +629 -0
  197. package/dist/skills/bundled/trading-manifold/SKILL.md +387 -0
  198. package/dist/skills/bundled/trading-polymarket/SKILL.md +1080 -0
  199. package/dist/skills/bundled/trading-solana/SKILL.md +418 -0
  200. package/dist/skills/bundled/trading-system/SKILL.md +290 -0
  201. package/dist/skills/bundled/triggers/SKILL.md +433 -0
  202. package/dist/skills/bundled/tts/SKILL.md +220 -0
  203. package/dist/skills/bundled/tweet-ideas/SKILL.md +77 -0
  204. package/dist/skills/bundled/usage/SKILL.md +239 -0
  205. package/dist/skills/bundled/usage/index.js +2 -2
  206. package/dist/skills/bundled/usage/index.js.map +1 -1
  207. package/dist/skills/bundled/veil/SKILL.md +76 -0
  208. package/dist/skills/bundled/veil/index.d.ts +0 -3
  209. package/dist/skills/bundled/veil/index.js +0 -1
  210. package/dist/skills/bundled/veil/index.js.map +1 -1
  211. package/dist/skills/bundled/verify/SKILL.md +199 -0
  212. package/dist/skills/bundled/verify/index.d.ts +0 -3
  213. package/dist/skills/bundled/verify/index.js +0 -1
  214. package/dist/skills/bundled/verify/index.js.map +1 -1
  215. package/dist/skills/bundled/virtuals/SKILL.md +82 -0
  216. package/dist/skills/bundled/voice/SKILL.md +217 -0
  217. package/dist/skills/bundled/voice/index.js +2 -2
  218. package/dist/skills/bundled/voice/index.js.map +1 -1
  219. package/dist/skills/bundled/weather/SKILL.md +80 -0
  220. package/dist/skills/bundled/webhooks/SKILL.md +297 -0
  221. package/dist/skills/bundled/webhooks/index.js +2 -2
  222. package/dist/skills/bundled/webhooks/index.js.map +1 -1
  223. package/dist/skills/bundled/whale-tracking/SKILL.md +287 -0
  224. package/dist/skills/bundled/whale-tracking/index.js +2 -2
  225. package/dist/skills/bundled/whale-tracking/index.js.map +1 -1
  226. package/dist/skills/bundled/yoink/SKILL.md +54 -0
  227. package/dist/skills/bundled/yoink/index.d.ts +0 -3
  228. package/dist/skills/bundled/yoink/index.js +0 -1
  229. package/dist/skills/bundled/yoink/index.js.map +1 -1
  230. package/dist/skills/executor.js +5 -3
  231. package/dist/skills/executor.js.map +1 -1
  232. package/package.json +2 -2
@@ -0,0 +1,537 @@
1
+ "use strict";
2
+ /**
3
+ * DEX Market Intelligence Skill - Cross-chain, cross-DEX market data
4
+ *
5
+ * Powered by DexScreener (free, no API key required).
6
+ * Works across all chains: Solana, Ethereum, BSC, Base, Arbitrum, etc.
7
+ *
8
+ * Commands:
9
+ *
10
+ * DISCOVERY:
11
+ * /dex trending [chain] - Top tokens by 24h volume
12
+ * /dex gainers [chain] - Top 24h price gainers
13
+ * /dex losers [chain] - Top 24h price losers
14
+ * /dex hot [chain] - Most active right now (1h transactions)
15
+ * /dex new [chain] - Newest token profiles
16
+ * /dex boosted - DexScreener trending/boosted tokens
17
+ *
18
+ * TOKEN DATA:
19
+ * /dex token <address> [chain] - Full token stats (price, vol, liq, txns)
20
+ * /dex pairs <address> [chain] - All trading pairs for a token
21
+ * /dex search <query> - Search any token across all chains
22
+ *
23
+ * FILTERS (chain OR protocol):
24
+ * Chains: solana, ethereum, bsc, base, arbitrum, polygon, avalanche, optimism, sui, aptos, ton
25
+ * Solana DEXes: pumpfun, pumpswap, raydium, orca, meteora
26
+ * Base protocols: virtuals, clanker, aerodrome
27
+ * Ethereum: uniswap, sushiswap, curve
28
+ * BSC: pancakeswap
29
+ */
30
+ Object.defineProperty(exports, "__esModule", { value: true });
31
+ exports.execute = execute;
32
+ const DEXSCREENER_API = 'https://api.dexscreener.com';
33
+ // ============================================================================
34
+ // Helpers
35
+ // ============================================================================
36
+ const CHAIN_ALIASES = {
37
+ sol: 'solana', solana: 'solana',
38
+ eth: 'ethereum', ethereum: 'ethereum',
39
+ bsc: 'bsc', bnb: 'bsc',
40
+ base: 'base',
41
+ arb: 'arbitrum', arbitrum: 'arbitrum',
42
+ polygon: 'polygon', matic: 'polygon',
43
+ avax: 'avalanche', avalanche: 'avalanche',
44
+ op: 'optimism', optimism: 'optimism',
45
+ sui: 'sui',
46
+ aptos: 'aptos',
47
+ ton: 'ton',
48
+ near: 'near',
49
+ sei: 'seiv2',
50
+ cronos: 'cronos',
51
+ tron: 'tron',
52
+ pulsechain: 'pulsechain',
53
+ linea: 'linea',
54
+ zksync: 'zksync',
55
+ manta: 'manta',
56
+ ink: 'ink',
57
+ };
58
+ // DEX/Protocol aliases → { chain, dexId } or search term
59
+ // When a user says "/dex trending pumpfun", we filter by dexId
60
+ const DEX_ALIASES = {
61
+ // Solana DEXes
62
+ pumpfun: { chain: 'solana', dexId: 'pumpfun' },
63
+ 'pump.fun': { chain: 'solana', dexId: 'pumpfun' },
64
+ pump: { chain: 'solana', dexId: 'pumpfun' },
65
+ pumpswap: { chain: 'solana', dexId: 'pumpswap' },
66
+ raydium: { chain: 'solana', dexId: 'raydium' },
67
+ orca: { chain: 'solana', dexId: 'orca' },
68
+ meteora: { chain: 'solana', dexId: 'meteora' },
69
+ jupiter: { chain: 'solana', dexId: 'raydium' }, // Jupiter routes through raydium
70
+ // Base DEXes
71
+ aerodrome: { chain: 'base', dexId: 'aerodrome' },
72
+ virtuals: { chain: 'base', search: 'virtuals' },
73
+ clanker: { chain: 'base', search: 'clanker' },
74
+ // Ethereum DEXes
75
+ uniswap: { chain: 'ethereum', dexId: 'uniswap' },
76
+ sushiswap: { chain: 'ethereum', dexId: 'sushiswap' },
77
+ curve: { chain: 'ethereum', dexId: 'curve' },
78
+ // BSC DEXes
79
+ pancakeswap: { chain: 'bsc', dexId: 'pancakeswap' },
80
+ pancake: { chain: 'bsc', dexId: 'pancakeswap' },
81
+ // Other
82
+ velodrome: { chain: 'optimism', dexId: 'velodrome' },
83
+ traderjoe: { chain: 'avalanche', dexId: 'traderjoe' },
84
+ };
85
+ function resolveFilter(input) {
86
+ if (!input)
87
+ return { label: 'All Chains' };
88
+ const lower = input.toLowerCase();
89
+ // Check DEX aliases first (more specific)
90
+ const dex = DEX_ALIASES[lower];
91
+ if (dex) {
92
+ return {
93
+ chain: dex.chain,
94
+ dexId: dex.dexId,
95
+ search: dex.search,
96
+ label: input.charAt(0).toUpperCase() + input.slice(1),
97
+ };
98
+ }
99
+ // Then chain aliases
100
+ const chain = CHAIN_ALIASES[lower] || lower;
101
+ return { chain, label: chainEmoji(chain) };
102
+ }
103
+ function formatUsd(n) {
104
+ if (n >= 1_000_000_000)
105
+ return `$${(n / 1_000_000_000).toFixed(2)}B`;
106
+ if (n >= 1_000_000)
107
+ return `$${(n / 1_000_000).toFixed(2)}M`;
108
+ if (n >= 1_000)
109
+ return `$${(n / 1_000).toFixed(1)}K`;
110
+ return `$${n.toFixed(0)}`;
111
+ }
112
+ function formatPrice(price) {
113
+ const p = typeof price === 'string' ? parseFloat(price) : price;
114
+ if (p === 0)
115
+ return '$0';
116
+ if (p < 0.000001)
117
+ return `$${p.toExponential(2)}`;
118
+ if (p < 0.01)
119
+ return `$${p.toFixed(8)}`;
120
+ if (p < 1)
121
+ return `$${p.toFixed(6)}`;
122
+ if (p < 1000)
123
+ return `$${p.toFixed(4)}`;
124
+ return `$${p.toFixed(2)}`;
125
+ }
126
+ function chainEmoji(chain) {
127
+ const emojis = {
128
+ solana: 'SOL', ethereum: 'ETH', bsc: 'BSC', base: 'BASE',
129
+ arbitrum: 'ARB', polygon: 'POLY', avalanche: 'AVAX',
130
+ optimism: 'OP', sui: 'SUI', aptos: 'APT', ton: 'TON',
131
+ };
132
+ return emojis[chain] || chain.toUpperCase();
133
+ }
134
+ async function dexRequest(endpoint) {
135
+ const resp = await fetch(`${DEXSCREENER_API}${endpoint}`);
136
+ if (!resp.ok)
137
+ throw new Error(`DexScreener error: ${resp.status}`);
138
+ return resp.json();
139
+ }
140
+ // Deduplicate pairs — keep highest volume pair per base token
141
+ function dedupeByToken(pairs) {
142
+ const map = new Map();
143
+ for (const p of pairs) {
144
+ const key = `${p.chainId}:${p.baseToken.address}`;
145
+ const existing = map.get(key);
146
+ if (!existing || (p.volume?.h24 || 0) > (existing.volume?.h24 || 0)) {
147
+ map.set(key, p);
148
+ }
149
+ }
150
+ return [...map.values()];
151
+ }
152
+ // ============================================================================
153
+ // Discovery Handlers
154
+ // ============================================================================
155
+ // Fetch enriched pairs for a filter — either from boosted tokens or search
156
+ async function fetchFilteredPairs(filter) {
157
+ // If filter has a search term (e.g. "virtuals", "clanker"), use DexScreener search
158
+ if (filter.search) {
159
+ const data = await dexRequest(`/latest/dex/search?q=${encodeURIComponent(filter.search)}`);
160
+ let pairs = data.pairs || [];
161
+ if (filter.chain)
162
+ pairs = pairs.filter(p => p.chainId === filter.chain);
163
+ if (filter.dexId)
164
+ pairs = pairs.filter(p => p.dexId === filter.dexId);
165
+ return dedupeByToken(pairs);
166
+ }
167
+ // Otherwise use boosted tokens as the source, then enrich
168
+ const boosts = await dexRequest('/token-boosts/top/v1');
169
+ let filtered = boosts || [];
170
+ if (filter.chain)
171
+ filtered = filtered.filter(b => b.chainId === filter.chain);
172
+ if (!filtered.length)
173
+ return [];
174
+ const topTokens = filtered.slice(0, 15);
175
+ const pairsByChain = new Map();
176
+ for (const t of topTokens) {
177
+ const list = pairsByChain.get(t.chainId) || [];
178
+ list.push(t.tokenAddress);
179
+ pairsByChain.set(t.chainId, list);
180
+ }
181
+ const allPairs = [];
182
+ for (const [c, addrs] of pairsByChain) {
183
+ try {
184
+ const pairs = await dexRequest(`/tokens/v1/${c}/${addrs.join(',')}`);
185
+ if (Array.isArray(pairs))
186
+ allPairs.push(...pairs);
187
+ }
188
+ catch { /* skip chain errors */ }
189
+ }
190
+ let result = allPairs;
191
+ if (filter.dexId)
192
+ result = result.filter(p => p.dexId === filter.dexId);
193
+ return dedupeByToken(result);
194
+ }
195
+ async function handleTrending(args) {
196
+ const filter = resolveFilter(args[0]);
197
+ try {
198
+ const deduped = await fetchFilteredPairs(filter);
199
+ deduped.sort((a, b) => (b.volume?.h24 || 0) - (a.volume?.h24 || 0));
200
+ if (!deduped.length)
201
+ return `No trending tokens found on ${filter.label}. Try: /dex trending`;
202
+ let output = `**Trending on ${filter.label} (24h Volume)**\n\n`;
203
+ for (let i = 0; i < Math.min(deduped.length, 15); i++) {
204
+ const p = deduped[i];
205
+ const change = p.priceChange?.h24 || 0;
206
+ const changeStr = `${change >= 0 ? '+' : ''}${change.toFixed(1)}%`;
207
+ output += `${i + 1}. **${p.baseToken.symbol}** [${chainEmoji(p.chainId)}]\n`;
208
+ output += ` ${formatPrice(p.priceUsd)} | MCap: ${formatUsd(p.marketCap || p.fdv || 0)}`;
209
+ output += ` | Vol: ${formatUsd(p.volume?.h24 || 0)} | ${changeStr}\n`;
210
+ output += ` ${p.dexId} | \`${p.baseToken.address.slice(0, 20)}...\`\n\n`;
211
+ }
212
+ return output;
213
+ }
214
+ catch (error) {
215
+ return `Error: ${error instanceof Error ? error.message : String(error)}`;
216
+ }
217
+ }
218
+ async function handleGainers(args) {
219
+ const filter = resolveFilter(args[0]);
220
+ try {
221
+ const deduped = await fetchFilteredPairs(filter);
222
+ deduped.sort((a, b) => (b.priceChange?.h24 || 0) - (a.priceChange?.h24 || 0));
223
+ if (!deduped.length)
224
+ return `No gainer data on ${filter.label}.`;
225
+ let output = `**Top Gainers on ${filter.label} (24h)**\n\n`;
226
+ for (let i = 0; i < Math.min(deduped.length, 15); i++) {
227
+ const p = deduped[i];
228
+ const change = p.priceChange?.h24 || 0;
229
+ const arrow = change >= 0 ? '📈' : '📉';
230
+ output += `${i + 1}. ${arrow} **${p.baseToken.symbol}** [${chainEmoji(p.chainId)}] ${change >= 0 ? '+' : ''}${change.toFixed(1)}%\n`;
231
+ output += ` ${formatPrice(p.priceUsd)} | MCap: ${formatUsd(p.marketCap || p.fdv || 0)} | Vol: ${formatUsd(p.volume?.h24 || 0)}\n`;
232
+ output += ` ${p.dexId} | \`${p.baseToken.address.slice(0, 20)}...\`\n\n`;
233
+ }
234
+ return output;
235
+ }
236
+ catch (error) {
237
+ return `Error: ${error instanceof Error ? error.message : String(error)}`;
238
+ }
239
+ }
240
+ async function handleLosers(args) {
241
+ const filter = resolveFilter(args[0]);
242
+ try {
243
+ const deduped = await fetchFilteredPairs(filter);
244
+ deduped.sort((a, b) => (a.priceChange?.h24 || 0) - (b.priceChange?.h24 || 0));
245
+ if (!deduped.length)
246
+ return `No loser data on ${filter.label}.`;
247
+ let output = `**Top Losers on ${filter.label} (24h)**\n\n`;
248
+ for (let i = 0; i < Math.min(deduped.length, 15); i++) {
249
+ const p = deduped[i];
250
+ const change = p.priceChange?.h24 || 0;
251
+ output += `${i + 1}. 📉 **${p.baseToken.symbol}** [${chainEmoji(p.chainId)}] ${change.toFixed(1)}%\n`;
252
+ output += ` ${formatPrice(p.priceUsd)} | MCap: ${formatUsd(p.marketCap || p.fdv || 0)} | Vol: ${formatUsd(p.volume?.h24 || 0)}\n`;
253
+ output += ` ${p.dexId} | \`${p.baseToken.address.slice(0, 20)}...\`\n\n`;
254
+ }
255
+ return output;
256
+ }
257
+ catch (error) {
258
+ return `Error: ${error instanceof Error ? error.message : String(error)}`;
259
+ }
260
+ }
261
+ async function handleHot(args) {
262
+ const filter = resolveFilter(args[0]);
263
+ try {
264
+ const deduped = await fetchFilteredPairs(filter);
265
+ deduped.sort((a, b) => {
266
+ const aTxns = (a.txns?.h1?.buys || 0) + (a.txns?.h1?.sells || 0);
267
+ const bTxns = (b.txns?.h1?.buys || 0) + (b.txns?.h1?.sells || 0);
268
+ return bTxns - aTxns;
269
+ });
270
+ if (!deduped.length)
271
+ return `No activity data on ${filter.label}.`;
272
+ let output = `**Hottest Right Now on ${filter.label} (1h Activity)**\n\n`;
273
+ for (let i = 0; i < Math.min(deduped.length, 15); i++) {
274
+ const p = deduped[i];
275
+ const txns1h = (p.txns?.h1?.buys || 0) + (p.txns?.h1?.sells || 0);
276
+ const change1h = p.priceChange?.h1 || 0;
277
+ output += `${i + 1}. **${p.baseToken.symbol}** [${chainEmoji(p.chainId)}] - ${txns1h.toLocaleString()} txns/1h\n`;
278
+ output += ` ${formatPrice(p.priceUsd)} | 1h Vol: ${formatUsd(p.volume?.h1 || 0)}`;
279
+ output += ` | 1h: ${change1h >= 0 ? '+' : ''}${change1h.toFixed(1)}%\n`;
280
+ output += ` ${p.dexId} | \`${p.baseToken.address.slice(0, 20)}...\`\n\n`;
281
+ }
282
+ return output;
283
+ }
284
+ catch (error) {
285
+ return `Error: ${error instanceof Error ? error.message : String(error)}`;
286
+ }
287
+ }
288
+ async function handleNew(args) {
289
+ const filter = resolveFilter(args[0]);
290
+ const chain = filter.chain;
291
+ try {
292
+ const profiles = await dexRequest('/token-profiles/latest/v1');
293
+ let filtered = profiles || [];
294
+ if (chain) {
295
+ filtered = filtered.filter(p => p.chainId === chain);
296
+ }
297
+ if (!filtered.length) {
298
+ return chain
299
+ ? `No new token profiles on ${chain}.`
300
+ : 'No new token profiles found.';
301
+ }
302
+ // Get pair data for enrichment
303
+ const topTokens = filtered.slice(0, 12);
304
+ const pairsByChain = new Map();
305
+ for (const t of topTokens) {
306
+ const list = pairsByChain.get(t.chainId) || [];
307
+ list.push(t.tokenAddress);
308
+ pairsByChain.set(t.chainId, list);
309
+ }
310
+ const allPairs = [];
311
+ for (const [c, addrs] of pairsByChain) {
312
+ try {
313
+ const pairs = await dexRequest(`/tokens/v1/${c}/${addrs.join(',')}`);
314
+ if (Array.isArray(pairs))
315
+ allPairs.push(...pairs);
316
+ }
317
+ catch { /* skip */ }
318
+ }
319
+ const pairMap = new Map();
320
+ for (const p of allPairs) {
321
+ const key = `${p.chainId}:${p.baseToken.address}`;
322
+ const existing = pairMap.get(key);
323
+ if (!existing || (p.volume?.h24 || 0) > (existing.volume?.h24 || 0)) {
324
+ pairMap.set(key, p);
325
+ }
326
+ }
327
+ const title = chain ? `New Tokens on ${chainEmoji(chain)}` : 'Newest Token Profiles (All Chains)';
328
+ let output = `**${title}**\n\n`;
329
+ for (let i = 0; i < Math.min(topTokens.length, 15); i++) {
330
+ const t = topTokens[i];
331
+ const pair = pairMap.get(`${t.chainId}:${t.tokenAddress}`);
332
+ output += `${i + 1}. **${pair?.baseToken.symbol || '???'}** [${chainEmoji(t.chainId)}]`;
333
+ if (pair) {
334
+ output += ` - ${formatPrice(pair.priceUsd)}`;
335
+ output += `\n MCap: ${formatUsd(pair.marketCap || pair.fdv || 0)} | Vol: ${formatUsd(pair.volume?.h24 || 0)}`;
336
+ const change = pair.priceChange?.h24 || 0;
337
+ output += ` | 24h: ${change >= 0 ? '+' : ''}${change.toFixed(1)}%`;
338
+ }
339
+ if (t.description)
340
+ output += `\n ${t.description.slice(0, 80)}${t.description.length > 80 ? '...' : ''}`;
341
+ output += `\n \`${t.tokenAddress.slice(0, 20)}...\`\n\n`;
342
+ }
343
+ return output;
344
+ }
345
+ catch (error) {
346
+ return `Error: ${error instanceof Error ? error.message : String(error)}`;
347
+ }
348
+ }
349
+ async function handleBoosted() {
350
+ try {
351
+ const boosts = await dexRequest('/token-boosts/top/v1');
352
+ if (!boosts?.length)
353
+ return 'No boosted tokens found.';
354
+ let output = '**DexScreener Boosted/Trending**\n\n';
355
+ for (let i = 0; i < Math.min(boosts.length, 15); i++) {
356
+ const b = boosts[i];
357
+ output += `${i + 1}. [${chainEmoji(b.chainId)}] \`${b.tokenAddress.slice(0, 20)}...\`\n`;
358
+ output += ` Boost: ${b.totalAmount}`;
359
+ if (b.description)
360
+ output += ` | ${b.description.slice(0, 60)}${b.description.length > 60 ? '...' : ''}`;
361
+ output += '\n\n';
362
+ }
363
+ return output;
364
+ }
365
+ catch (error) {
366
+ return `Error: ${error instanceof Error ? error.message : String(error)}`;
367
+ }
368
+ }
369
+ // ============================================================================
370
+ // Token Data Handlers
371
+ // ============================================================================
372
+ async function handleToken(args) {
373
+ if (!args[0])
374
+ return 'Usage: /dex token <address> [chain]';
375
+ const address = args[0];
376
+ const filter = resolveFilter(args[1]);
377
+ const chain = filter.chain || 'solana';
378
+ try {
379
+ const pairs = await dexRequest(`/tokens/v1/${chain}/${address}`);
380
+ if (!Array.isArray(pairs) || !pairs.length) {
381
+ return `No data found for \`${address.slice(0, 20)}...\` on ${chain}.`;
382
+ }
383
+ // Use highest volume pair
384
+ pairs.sort((a, b) => (b.volume?.h24 || 0) - (a.volume?.h24 || 0));
385
+ const p = pairs[0];
386
+ const txns24h = (p.txns?.h24?.buys || 0) + (p.txns?.h24?.sells || 0);
387
+ const txns1h = (p.txns?.h1?.buys || 0) + (p.txns?.h1?.sells || 0);
388
+ let output = `**${p.baseToken.symbol} / ${p.quoteToken.symbol}** [${chainEmoji(p.chainId)}]\n\n`;
389
+ output += `**Price:** ${formatPrice(p.priceUsd)}\n`;
390
+ output += `**Market Cap:** ${formatUsd(p.marketCap || p.fdv || 0)}\n`;
391
+ output += `**Liquidity:** ${formatUsd(p.liquidity?.usd || 0)}\n`;
392
+ output += `**DEX:** ${p.dexId}\n\n`;
393
+ output += '**Volume:**\n';
394
+ output += ` 24h: ${formatUsd(p.volume?.h24 || 0)}\n`;
395
+ output += ` 6h: ${formatUsd(p.volume?.h6 || 0)}\n`;
396
+ output += ` 1h: ${formatUsd(p.volume?.h1 || 0)}\n`;
397
+ output += ` 5m: ${formatUsd(p.volume?.m5 || 0)}\n\n`;
398
+ output += '**Price Change:**\n';
399
+ output += ` 24h: ${(p.priceChange?.h24 || 0) >= 0 ? '+' : ''}${(p.priceChange?.h24 || 0).toFixed(2)}%\n`;
400
+ output += ` 6h: ${(p.priceChange?.h6 || 0) >= 0 ? '+' : ''}${(p.priceChange?.h6 || 0).toFixed(2)}%\n`;
401
+ output += ` 1h: ${(p.priceChange?.h1 || 0) >= 0 ? '+' : ''}${(p.priceChange?.h1 || 0).toFixed(2)}%\n`;
402
+ output += ` 5m: ${(p.priceChange?.m5 || 0) >= 0 ? '+' : ''}${(p.priceChange?.m5 || 0).toFixed(2)}%\n\n`;
403
+ output += '**Transactions:**\n';
404
+ output += ` 24h: ${txns24h.toLocaleString()} (${p.txns?.h24?.buys || 0} buys / ${p.txns?.h24?.sells || 0} sells)\n`;
405
+ output += ` 1h: ${txns1h.toLocaleString()} (${p.txns?.h1?.buys || 0} buys / ${p.txns?.h1?.sells || 0} sells)\n\n`;
406
+ if (pairs.length > 1) {
407
+ output += `**Other Pairs:** ${pairs.length - 1} more on ${[...new Set(pairs.map(pp => pp.dexId))].join(', ')}\n\n`;
408
+ }
409
+ output += `Pair: \`${p.pairAddress}\`\nToken: \`${address}\``;
410
+ return output;
411
+ }
412
+ catch (error) {
413
+ return `Error: ${error instanceof Error ? error.message : String(error)}`;
414
+ }
415
+ }
416
+ async function handlePairs(args) {
417
+ if (!args[0])
418
+ return 'Usage: /dex pairs <address> [chain]';
419
+ const address = args[0];
420
+ const filter = resolveFilter(args[1]);
421
+ const chain = filter.chain || 'solana';
422
+ try {
423
+ const pairs = await dexRequest(`/tokens/v1/${chain}/${address}`);
424
+ if (!Array.isArray(pairs) || !pairs.length) {
425
+ return `No pairs found for \`${address.slice(0, 20)}...\` on ${chain}.`;
426
+ }
427
+ pairs.sort((a, b) => (b.volume?.h24 || 0) - (a.volume?.h24 || 0));
428
+ let output = `**${pairs[0].baseToken.symbol} Trading Pairs** [${chainEmoji(chain)}]\n\n`;
429
+ output += `Total: ${pairs.length} pairs\n\n`;
430
+ for (let i = 0; i < Math.min(pairs.length, 10); i++) {
431
+ const p = pairs[i];
432
+ output += `${i + 1}. **${p.baseToken.symbol}/${p.quoteToken.symbol}** on ${p.dexId}\n`;
433
+ output += ` ${formatPrice(p.priceUsd)} | Vol: ${formatUsd(p.volume?.h24 || 0)} | Liq: ${formatUsd(p.liquidity?.usd || 0)}\n`;
434
+ output += ` \`${p.pairAddress.slice(0, 20)}...\`\n\n`;
435
+ }
436
+ return output;
437
+ }
438
+ catch (error) {
439
+ return `Error: ${error instanceof Error ? error.message : String(error)}`;
440
+ }
441
+ }
442
+ async function handleSearch(query) {
443
+ if (!query)
444
+ return 'Usage: /dex search <query>';
445
+ try {
446
+ const data = await dexRequest(`/latest/dex/search?q=${encodeURIComponent(query)}`);
447
+ if (!data.pairs?.length)
448
+ return `No results for "${query}".`;
449
+ const deduped = dedupeByToken(data.pairs);
450
+ deduped.sort((a, b) => (b.volume?.h24 || 0) - (a.volume?.h24 || 0));
451
+ let output = `**Search: "${query}"**\n\n`;
452
+ for (let i = 0; i < Math.min(deduped.length, 15); i++) {
453
+ const p = deduped[i];
454
+ const change = p.priceChange?.h24 || 0;
455
+ output += `${i + 1}. **${p.baseToken.symbol}** - ${p.baseToken.name} [${chainEmoji(p.chainId)}]\n`;
456
+ output += ` ${formatPrice(p.priceUsd)} | MCap: ${formatUsd(p.marketCap || p.fdv || 0)}`;
457
+ output += ` | Vol: ${formatUsd(p.volume?.h24 || 0)} | ${change >= 0 ? '+' : ''}${change.toFixed(1)}%\n`;
458
+ output += ` DEX: ${p.dexId} | \`${p.baseToken.address.slice(0, 20)}...\`\n\n`;
459
+ }
460
+ return output;
461
+ }
462
+ catch (error) {
463
+ return `Error: ${error instanceof Error ? error.message : String(error)}`;
464
+ }
465
+ }
466
+ // ============================================================================
467
+ // Main Execute Function
468
+ // ============================================================================
469
+ async function execute(args) {
470
+ const parts = args.trim().split(/\s+/);
471
+ const command = parts[0]?.toLowerCase() || 'help';
472
+ const rest = parts.slice(1);
473
+ switch (command) {
474
+ // Discovery
475
+ case 'trending':
476
+ return handleTrending(rest);
477
+ case 'gainers':
478
+ return handleGainers(rest);
479
+ case 'losers':
480
+ return handleLosers(rest);
481
+ case 'hot':
482
+ return handleHot(rest);
483
+ case 'new':
484
+ return handleNew(rest);
485
+ case 'boosted':
486
+ return handleBoosted();
487
+ // Token Data
488
+ case 'token':
489
+ case 'info':
490
+ return handleToken(rest);
491
+ case 'pairs':
492
+ return handlePairs(rest);
493
+ case 'search':
494
+ return handleSearch(rest.join(' '));
495
+ case 'help':
496
+ default:
497
+ return `**DEX Market Intelligence (9 Commands)**
498
+
499
+ Powered by DexScreener - works across all chains and DEXes, no API key.
500
+
501
+ **Discovery:**
502
+ /dex trending [filter] Top tokens by 24h volume
503
+ /dex gainers [filter] Top 24h price gainers
504
+ /dex losers [filter] Top 24h price losers
505
+ /dex hot [filter] Most active right now (1h txns)
506
+ /dex new [filter] Newest token profiles
507
+ /dex boosted DexScreener trending tokens
508
+
509
+ **Token Data:**
510
+ /dex token <address> [chain] Full stats (price, vol, liq, txns)
511
+ /dex pairs <address> [chain] All trading pairs for a token
512
+ /dex search <query> Search any token across all chains
513
+
514
+ **Filter = chain OR protocol:**
515
+ Chains: solana, ethereum, bsc, base, arbitrum, polygon, avalanche, optimism, sui, aptos, ton
516
+ Solana DEXes: pumpfun, pumpswap, raydium, orca, meteora, jupiter
517
+ Base: virtuals, clanker, aerodrome
518
+ Ethereum: uniswap, sushiswap, curve
519
+ BSC: pancakeswap
520
+
521
+ **Examples:**
522
+ /dex trending solana
523
+ /dex trending pumpfun
524
+ /dex gainers virtuals
525
+ /dex hot base
526
+ /dex losers ethereum
527
+ /dex token <address> eth
528
+ /dex search PEPE`;
529
+ }
530
+ }
531
+ exports.default = {
532
+ name: 'dex',
533
+ description: 'Cross-chain DEX market intelligence - trending, gainers, losers, volume, stats via DexScreener',
534
+ commands: ['/dex', '/dexscreener'],
535
+ handle: execute,
536
+ };
537
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/skills/bundled/dex/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,83 @@
1
+ ---
2
+ name: divergence
3
+ description: "Spot vs Polymarket divergence trading on 15-minute crypto markets"
4
+ commands:
5
+ - /divergence
6
+ - /div
7
+ gates:
8
+ envs:
9
+ - POLY_PRIVATE_KEY
10
+ - POLY_FUNDER_ADDRESS
11
+ - POLY_API_KEY
12
+ - POLY_API_SECRET
13
+ - POLY_API_PASSPHRASE
14
+ ---
15
+
16
+ # Divergence Trading - Spot vs Poly Price Lag
17
+
18
+ Detects when Binance spot prices move but Polymarket 15-minute binary markets haven't caught up yet. Buys the lagging side and sells when it corrects.
19
+
20
+ Strategy tags match the CLAUDE.md encoding: `BTC_DOWN_s12-14_w15` (0.12-0.14% move in 15s window).
21
+
22
+ Starts in **dry-run mode** by default (no real orders).
23
+
24
+ ## Quick Start
25
+
26
+ ```
27
+ /div start # Dry-run on BTC,ETH,SOL,XRP
28
+ /div start BTC,ETH --size 30 # Specific assets + size
29
+ /div status # Stats, open positions
30
+ /div stop # Stop and show summary
31
+ ```
32
+
33
+ ## Commands
34
+
35
+ ### Start / Stop
36
+ ```
37
+ /div start [ASSETS] [--size N] [--dry-run]
38
+ /div stop
39
+ ```
40
+
41
+ ### Monitor
42
+ ```
43
+ /div status Stats + open positions + round info
44
+ /div positions Last 20 closed trades with strategy tags
45
+ /div markets Active 15-min markets from Gamma API
46
+ ```
47
+
48
+ ### Configure
49
+ ```
50
+ /div config Show current config
51
+ /div config --tp 20 --sl 30 Set TP/SL %
52
+ /div config --size 50 Set trade size
53
+ /div config --windows 5,10,30 Set detection windows
54
+ ```
55
+
56
+ ## Detection Algorithm
57
+
58
+ For each spot tick, across all configured windows (5s, 10s, 15s, 30s, 60s, 90s, 120s):
59
+
60
+ 1. Look up spot price N seconds ago via binary search
61
+ 2. Calculate `spotMovePct = (now - then) / then * 100`
62
+ 3. If move >= threshold AND poly is fresh (< 5s stale):
63
+ - Generate signal with strategy tag: `{ASSET}_{DIR}_s{bucket}_w{window}`
64
+ - e.g., `BTC_DOWN_s12-14_w15` = 0.12-0.14% spot drop over 15s
65
+
66
+ ## Threshold Buckets
67
+
68
+ | Bucket | Spot Move Range |
69
+ |--------|----------------|
70
+ | s08-10 | 0.08% - 0.10% |
71
+ | s10-12 | 0.10% - 0.12% |
72
+ | s12-14 | 0.12% - 0.14% |
73
+ | s14-16 | 0.14% - 0.16% |
74
+ | s16-20 | 0.16% - 0.20% |
75
+ | s20+ | 0.20%+ |
76
+
77
+ ## Exit Logic
78
+
79
+ 1. **Force exit** — < 30s before market expiry
80
+ 2. **Take profit** — PnL >= 15% (configurable)
81
+ 3. **Stop loss** — PnL <= -25% (configurable)
82
+ 4. **Trailing stop** — Activated at +10%, exits if drops 8% from HWM
83
+ 5. **Time exit** — < 2min before expiry