@rlajous/sdk-trading 1.0.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 (65) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +160 -0
  3. package/dist/cjs/client.js +139 -0
  4. package/dist/cjs/client.js.map +1 -0
  5. package/dist/cjs/index.js +24 -0
  6. package/dist/cjs/index.js.map +1 -0
  7. package/dist/cjs/package.json +1 -0
  8. package/dist/cjs/resources/holder-analysis.js +102 -0
  9. package/dist/cjs/resources/holder-analysis.js.map +1 -0
  10. package/dist/cjs/resources/index.js +10 -0
  11. package/dist/cjs/resources/index.js.map +1 -0
  12. package/dist/cjs/resources/tokens.js +175 -0
  13. package/dist/cjs/resources/tokens.js.map +1 -0
  14. package/dist/cjs/resources/trading-lite.js +85 -0
  15. package/dist/cjs/resources/trading-lite.js.map +1 -0
  16. package/dist/cjs/types/holder-analysis.js +3 -0
  17. package/dist/cjs/types/holder-analysis.js.map +1 -0
  18. package/dist/cjs/types/index.js +3 -0
  19. package/dist/cjs/types/index.js.map +1 -0
  20. package/dist/cjs/types/tokens.js +3 -0
  21. package/dist/cjs/types/tokens.js.map +1 -0
  22. package/dist/cjs/types/trading-lite.js +3 -0
  23. package/dist/cjs/types/trading-lite.js.map +1 -0
  24. package/dist/esm/client.js +135 -0
  25. package/dist/esm/client.js.map +1 -0
  26. package/dist/esm/index.js +7 -0
  27. package/dist/esm/index.js.map +1 -0
  28. package/dist/esm/package.json +1 -0
  29. package/dist/esm/resources/holder-analysis.js +98 -0
  30. package/dist/esm/resources/holder-analysis.js.map +1 -0
  31. package/dist/esm/resources/index.js +4 -0
  32. package/dist/esm/resources/index.js.map +1 -0
  33. package/dist/esm/resources/tokens.js +171 -0
  34. package/dist/esm/resources/tokens.js.map +1 -0
  35. package/dist/esm/resources/trading-lite.js +81 -0
  36. package/dist/esm/resources/trading-lite.js.map +1 -0
  37. package/dist/esm/types/holder-analysis.js +2 -0
  38. package/dist/esm/types/holder-analysis.js.map +1 -0
  39. package/dist/esm/types/index.js +2 -0
  40. package/dist/esm/types/index.js.map +1 -0
  41. package/dist/esm/types/tokens.js +2 -0
  42. package/dist/esm/types/tokens.js.map +1 -0
  43. package/dist/esm/types/trading-lite.js +2 -0
  44. package/dist/esm/types/trading-lite.js.map +1 -0
  45. package/dist/types/client.d.ts +123 -0
  46. package/dist/types/client.d.ts.map +1 -0
  47. package/dist/types/index.d.ts +5 -0
  48. package/dist/types/index.d.ts.map +1 -0
  49. package/dist/types/resources/holder-analysis.d.ts +73 -0
  50. package/dist/types/resources/holder-analysis.d.ts.map +1 -0
  51. package/dist/types/resources/index.d.ts +4 -0
  52. package/dist/types/resources/index.d.ts.map +1 -0
  53. package/dist/types/resources/tokens.d.ts +117 -0
  54. package/dist/types/resources/tokens.d.ts.map +1 -0
  55. package/dist/types/resources/trading-lite.d.ts +64 -0
  56. package/dist/types/resources/trading-lite.d.ts.map +1 -0
  57. package/dist/types/types/holder-analysis.d.ts +214 -0
  58. package/dist/types/types/holder-analysis.d.ts.map +1 -0
  59. package/dist/types/types/index.d.ts +4 -0
  60. package/dist/types/types/index.d.ts.map +1 -0
  61. package/dist/types/types/tokens.d.ts +148 -0
  62. package/dist/types/types/tokens.d.ts.map +1 -0
  63. package/dist/types/types/trading-lite.d.ts +72 -0
  64. package/dist/types/types/trading-lite.d.ts.map +1 -0
  65. package/package.json +74 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/types/index.ts"],"names":[],"mappings":""}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=tokens.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tokens.js","sourceRoot":"","sources":["../../../src/types/tokens.ts"],"names":[],"mappings":""}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=trading-lite.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"trading-lite.js","sourceRoot":"","sources":["../../../src/types/trading-lite.ts"],"names":[],"mappings":""}
@@ -0,0 +1,123 @@
1
+ import { BaseClient, WebacyClientConfig, RequestInterceptor, ResponseInterceptor, ErrorInterceptor } from '@rlajous/sdk-core';
2
+ import { HolderAnalysisResource } from './resources/holder-analysis';
3
+ import { TradingLiteResource } from './resources/trading-lite';
4
+ import { TokensResource } from './resources/tokens';
5
+ /**
6
+ * Webacy Trading SDK Client
7
+ *
8
+ * Provides access to token trading analysis including holder analysis,
9
+ * sniper/bundler detection, and trending tokens.
10
+ *
11
+ * @example
12
+ * ```typescript
13
+ * import { TradingClient, Chain } from '@rlajous/sdk-trading';
14
+ *
15
+ * const client = new TradingClient({
16
+ * apiKey: process.env.WEBACY_API_KEY!,
17
+ * });
18
+ *
19
+ * // Comprehensive holder analysis
20
+ * const holders = await client.holderAnalysis.get('token_address', {
21
+ * chain: 'sol',
22
+ * });
23
+ *
24
+ * // Quick trading analysis (Solana)
25
+ * const trading = await client.tradingLite.analyze('pump_token');
26
+ *
27
+ * // Token pools and trending
28
+ * const pools = await client.tokens.getPools('token_address', { chain: 'eth' });
29
+ * ```
30
+ */
31
+ export declare class TradingClient extends BaseClient {
32
+ /**
33
+ * Holder analysis resource
34
+ *
35
+ * Provides comprehensive analysis of token holder distribution including:
36
+ * - Top holders and concentration metrics
37
+ * - First buyers analysis
38
+ * - Sniper detection with confidence scoring
39
+ * - Bundler detection
40
+ * - Developer wallet tracking
41
+ */
42
+ readonly holderAnalysis: HolderAnalysisResource;
43
+ /**
44
+ * Trading lite resource
45
+ *
46
+ * Provides quick, simplified token analysis optimized for trading decisions.
47
+ * Currently supports Solana only.
48
+ */
49
+ readonly tradingLite: TradingLiteResource;
50
+ /**
51
+ * Tokens resource
52
+ *
53
+ * Provides access to token pools and trending data.
54
+ */
55
+ readonly tokens: TokensResource;
56
+ /**
57
+ * Create a new TradingClient instance
58
+ *
59
+ * @param config - Client configuration
60
+ * @throws AuthenticationError if API key is not provided
61
+ *
62
+ * @example
63
+ * ```typescript
64
+ * // Basic setup
65
+ * const client = new TradingClient({
66
+ * apiKey: 'your-api-key',
67
+ * });
68
+ *
69
+ * // With default chain (omit chain in API calls)
70
+ * const client = new TradingClient({
71
+ * apiKey: 'your-api-key',
72
+ * defaultChain: Chain.SOL,
73
+ * });
74
+ *
75
+ * // With custom configuration
76
+ * const client = new TradingClient({
77
+ * apiKey: 'your-api-key',
78
+ * timeout: 60000,
79
+ * retry: {
80
+ * maxRetries: 5,
81
+ * },
82
+ * });
83
+ * ```
84
+ */
85
+ constructor(config: WebacyClientConfig);
86
+ /**
87
+ * Add a request interceptor
88
+ *
89
+ * @example
90
+ * ```typescript
91
+ * client.addRequestInterceptor((url, config) => {
92
+ * console.log(`Making request to ${url}`);
93
+ * return config;
94
+ * });
95
+ * ```
96
+ */
97
+ addRequestInterceptor(interceptor: RequestInterceptor): void;
98
+ /**
99
+ * Add a response interceptor
100
+ *
101
+ * @example
102
+ * ```typescript
103
+ * client.addResponseInterceptor((response) => {
104
+ * console.log(`Received ${response.status} response`);
105
+ * return response;
106
+ * });
107
+ * ```
108
+ */
109
+ addResponseInterceptor(interceptor: ResponseInterceptor): void;
110
+ /**
111
+ * Add an error interceptor
112
+ *
113
+ * @example
114
+ * ```typescript
115
+ * client.addErrorInterceptor((error) => {
116
+ * console.error(`Request failed: ${error.message}`);
117
+ * return error;
118
+ * });
119
+ * ```
120
+ */
121
+ addErrorInterceptor(interceptor: ErrorInterceptor): void;
122
+ }
123
+ //# sourceMappingURL=client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/client.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,UAAU,EACV,kBAAkB,EAClB,kBAAkB,EAClB,mBAAmB,EACnB,gBAAgB,EACjB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAC;AACrE,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAC/D,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAEpD;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,qBAAa,aAAc,SAAQ,UAAU;IAC3C;;;;;;;;;OASG;IACH,SAAgB,cAAc,EAAE,sBAAsB,CAAC;IAEvD;;;;;OAKG;IACH,SAAgB,WAAW,EAAE,mBAAmB,CAAC;IAEjD;;;;OAIG;IACH,SAAgB,MAAM,EAAE,cAAc,CAAC;IAEvC;;;;;;;;;;;;;;;;;;;;;;;;;;;;OA4BG;gBACS,MAAM,EAAE,kBAAkB;IAStC;;;;;;;;;;OAUG;IACM,qBAAqB,CAAC,WAAW,EAAE,kBAAkB,GAAG,IAAI;IAIrE;;;;;;;;;;OAUG;IACM,sBAAsB,CAAC,WAAW,EAAE,mBAAmB,GAAG,IAAI;IAIvE;;;;;;;;;;OAUG;IACM,mBAAmB,CAAC,WAAW,EAAE,gBAAgB,GAAG,IAAI;CAGlE"}
@@ -0,0 +1,5 @@
1
+ export { TradingClient } from './client';
2
+ export { HolderAnalysisResource, TradingLiteResource, TokensResource } from './resources';
3
+ export type { TokenHolder, TokenHolderActivity, BuyerHolding, FirstBuyersAnalysis, BlockRangeAnalysis, TimeSinceMintAnalysis, SniperAnalysis, ActivityPatterns, HolderAnalysisResult, HolderAnalysisOptions, AddressHolding, TradingLiteAnalysis, TradingLiteOptions, VolumeData, PoolData, TokenWithRisk, TokenRiskSummary, PoolsResponse, TrendingToken, TrendingTokensResponse, TrendingPoolsResponse, TokenPoolsOptions, TrendingOptions, } from './types';
4
+ export { Chain, ChainCompatibility, isEvmChain, CHAIN_NAMES, WebacyError, AuthenticationError, RateLimitError, ValidationError, NotFoundError, NetworkError, type WebacyClientConfig, type TokenMetadata, type OwnershipDistribution, type TopHolder, } from '@rlajous/sdk-core';
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAGzC,OAAO,EAAE,sBAAsB,EAAE,mBAAmB,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAG1F,YAAY,EAEV,WAAW,EACX,mBAAmB,EACnB,YAAY,EACZ,mBAAmB,EACnB,kBAAkB,EAClB,qBAAqB,EACrB,cAAc,EACd,gBAAgB,EAChB,oBAAoB,EACpB,qBAAqB,EAErB,cAAc,EACd,mBAAmB,EACnB,kBAAkB,EAElB,UAAU,EACV,QAAQ,EACR,aAAa,EACb,gBAAgB,EAChB,aAAa,EACb,aAAa,EACb,sBAAsB,EACtB,qBAAqB,EACrB,iBAAiB,EACjB,eAAe,GAChB,MAAM,SAAS,CAAC;AAGjB,OAAO,EACL,KAAK,EACL,kBAAkB,EAClB,UAAU,EACV,WAAW,EACX,WAAW,EACX,mBAAmB,EACnB,cAAc,EACd,eAAe,EACf,aAAa,EACb,YAAY,EACZ,KAAK,kBAAkB,EACvB,KAAK,aAAa,EAClB,KAAK,qBAAqB,EAC1B,KAAK,SAAS,GACf,MAAM,mBAAmB,CAAC"}
@@ -0,0 +1,73 @@
1
+ import { HttpClient, Chain } from '@rlajous/sdk-core';
2
+ import { HolderAnalysisResult, HolderAnalysisOptions } from '../types';
3
+ /**
4
+ * Resource for token holder analysis
5
+ *
6
+ * Provides comprehensive analysis of token holder distribution including:
7
+ * - Top holders and concentration metrics
8
+ * - First buyers analysis
9
+ * - Sniper detection with confidence scoring
10
+ * - Bundler detection
11
+ * - Developer wallet tracking
12
+ *
13
+ * @example
14
+ * ```typescript
15
+ * const analysis = await client.holderAnalysis.get('token_address', {
16
+ * chain: Chain.SOL,
17
+ * });
18
+ * console.log(`Sniper count: ${analysis.sniper_analysis?.sniper_count}`);
19
+ *
20
+ * // With default chain configured, chain can be omitted
21
+ * const client = new TradingClient({ apiKey: '...', defaultChain: Chain.SOL });
22
+ * const analysis = await client.holderAnalysis.get('token_address'); // Uses SOL
23
+ * ```
24
+ */
25
+ export declare class HolderAnalysisResource {
26
+ private readonly httpClient;
27
+ private readonly defaultChain?;
28
+ constructor(httpClient: HttpClient, defaultChain?: Chain | undefined);
29
+ /**
30
+ * Resolve the chain to use for a request
31
+ * @throws ValidationError if no chain is specified and no default is set
32
+ */
33
+ private resolveChain;
34
+ /**
35
+ * Get comprehensive holder analysis for a token
36
+ *
37
+ * Returns detailed analysis including:
38
+ * - Token holder distribution
39
+ * - First buyers analysis with bundler detection
40
+ * - Sniper detection with confidence scoring
41
+ * - Top 10 holders concentration
42
+ * - Developer activity metrics
43
+ *
44
+ * @param address - Token address to analyze
45
+ * @param options - Request options (chain is optional if defaultChain is set)
46
+ * @returns Complete holder analysis result
47
+ *
48
+ * @example
49
+ * ```typescript
50
+ * // Solana token analysis
51
+ * const result = await client.holderAnalysis.get('pump_token_address', {
52
+ * chain: Chain.SOL,
53
+ * });
54
+ *
55
+ * // With default chain configured
56
+ * const result = await client.holderAnalysis.get('pump_token_address');
57
+ *
58
+ * // Check sniper activity
59
+ * if (result.sniper_analysis?.sniper_count > 0) {
60
+ * console.log(`Found ${result.sniper_analysis.sniper_count} snipers`);
61
+ * console.log(`Sniper confidence: ${result.sniper_analysis.sniper_confidence_score}`);
62
+ * }
63
+ *
64
+ * // Check bundler activity
65
+ * const bundledBuyers = result.first_buyers_analysis.bundled_buyers_count;
66
+ * if (bundledBuyers && bundledBuyers > 0) {
67
+ * console.log(`Found ${bundledBuyers} bundled buyers`);
68
+ * }
69
+ * ```
70
+ */
71
+ get(address: string, options?: HolderAnalysisOptions): Promise<HolderAnalysisResult>;
72
+ }
73
+ //# sourceMappingURL=holder-analysis.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"holder-analysis.d.ts","sourceRoot":"","sources":["../../../src/resources/holder-analysis.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,UAAU,EAKV,KAAK,EACN,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,oBAAoB,EAAE,qBAAqB,EAAE,MAAM,UAAU,CAAC;AAEvE;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,qBAAa,sBAAsB;IAE/B,OAAO,CAAC,QAAQ,CAAC,UAAU;IAC3B,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAC;gBADb,UAAU,EAAE,UAAU,EACtB,YAAY,CAAC,EAAE,KAAK,YAAA;IAGvC;;;OAGG;IACH,OAAO,CAAC,YAAY;IAUpB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAoCG;IACG,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,GAAE,qBAA0B,GAAG,OAAO,CAAC,oBAAoB,CAAC;CA4B/F"}
@@ -0,0 +1,4 @@
1
+ export { HolderAnalysisResource } from './holder-analysis';
2
+ export { TradingLiteResource } from './trading-lite';
3
+ export { TokensResource } from './tokens';
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/resources/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,MAAM,mBAAmB,CAAC;AAC3D,OAAO,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AACrD,OAAO,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC"}
@@ -0,0 +1,117 @@
1
+ import { HttpClient, Chain } from '@rlajous/sdk-core';
2
+ import { PoolsResponse, TrendingTokensResponse, TrendingPoolsResponse, TokenPoolsOptions, TrendingOptions } from '../types';
3
+ /**
4
+ * Resource for token pools and trending data
5
+ *
6
+ * Provides access to:
7
+ * - Token liquidity pools with risk analysis
8
+ * - Trending tokens across chains
9
+ * - Trending liquidity pools
10
+ *
11
+ * @example
12
+ * ```typescript
13
+ * // Get trending tokens
14
+ * const trending = await client.tokens.getTrending({ chain: Chain.SOL });
15
+ *
16
+ * // Get pools for a specific token
17
+ * const pools = await client.tokens.getPools('token_address', { chain: Chain.ETH });
18
+ *
19
+ * // With default chain configured, chain can be omitted
20
+ * const client = new TradingClient({ apiKey: '...', defaultChain: Chain.SOL });
21
+ * const pools = await client.tokens.getPools('token_address'); // Uses SOL
22
+ * ```
23
+ */
24
+ export declare class TokensResource {
25
+ private readonly httpClient;
26
+ private readonly defaultChain?;
27
+ constructor(httpClient: HttpClient, defaultChain?: Chain | undefined);
28
+ /**
29
+ * Resolve the chain to use for a request
30
+ * @throws ValidationError if no chain is specified and no default is set
31
+ */
32
+ private resolveChain;
33
+ /**
34
+ * Get liquidity pools for a token with risk analysis
35
+ *
36
+ * Returns all liquidity pools where the token is traded,
37
+ * along with risk analysis for the tokens in each pool.
38
+ *
39
+ * @param address - Token address
40
+ * @param options - Request options (chain is optional if defaultChain is set)
41
+ * @returns Pools with token risk analysis
42
+ *
43
+ * @example
44
+ * ```typescript
45
+ * const result = await client.tokens.getPools('0x...', { chain: Chain.ETH });
46
+ *
47
+ * // With default chain configured
48
+ * const result = await client.tokens.getPools('0x...');
49
+ *
50
+ * for (const pool of result.pools) {
51
+ * console.log(`Pool: ${pool.name}`);
52
+ * console.log(`Liquidity: ${pool.reserve}`);
53
+ * console.log(`24h Volume: ${pool.volume.h24}`);
54
+ * }
55
+ *
56
+ * // Check risk for tokens in pools
57
+ * for (const token of result.tokens) {
58
+ * if (token.risk.overallRisk && token.risk.overallRisk > 70) {
59
+ * console.warn(`High risk token: ${token.address}`);
60
+ * }
61
+ * }
62
+ * ```
63
+ */
64
+ getPools(address: string, options?: TokenPoolsOptions): Promise<PoolsResponse>;
65
+ /**
66
+ * Get trending tokens
67
+ *
68
+ * Returns currently trending tokens based on trading activity
69
+ * and community interest.
70
+ *
71
+ * @param options - Request options (chain is optional)
72
+ * @returns List of trending tokens with risk analysis
73
+ *
74
+ * @example
75
+ * ```typescript
76
+ * const trending = await client.tokens.getTrending({ chain: Chain.SOL, limit: 20 });
77
+ *
78
+ * // Or with default chain configured
79
+ * const trending = await client.tokens.getTrending();
80
+ *
81
+ * for (const token of trending.tokens) {
82
+ * console.log(`${token.symbol}: $${token.price_usd}`);
83
+ * console.log(`24h change: ${token.price_change_24h}%`);
84
+ *
85
+ * if (token.risk?.overallRisk && token.risk.overallRisk > 50) {
86
+ * console.warn(' Warning: Elevated risk');
87
+ * }
88
+ * }
89
+ * ```
90
+ */
91
+ getTrending(options?: TrendingOptions): Promise<TrendingTokensResponse>;
92
+ /**
93
+ * Get trending liquidity pools
94
+ *
95
+ * Returns currently trending liquidity pools based on
96
+ * trading volume and activity.
97
+ *
98
+ * @param options - Request options (chain is optional)
99
+ * @returns List of trending pools
100
+ *
101
+ * @example
102
+ * ```typescript
103
+ * const trending = await client.tokens.getTrendingPools({ chain: Chain.ETH });
104
+ *
105
+ * // Or with default chain configured
106
+ * const trending = await client.tokens.getTrendingPools();
107
+ *
108
+ * for (const pool of trending.pools) {
109
+ * console.log(`${pool.name}`);
110
+ * console.log(`FDV: ${pool.fdv}`);
111
+ * console.log(`24h Volume: ${pool.volume.h24}`);
112
+ * }
113
+ * ```
114
+ */
115
+ getTrendingPools(options?: TrendingOptions): Promise<TrendingPoolsResponse>;
116
+ }
117
+ //# sourceMappingURL=tokens.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tokens.d.ts","sourceRoot":"","sources":["../../../src/resources/tokens.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,UAAU,EAKV,KAAK,EACN,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EACL,aAAa,EACb,sBAAsB,EACtB,qBAAqB,EACrB,iBAAiB,EACjB,eAAe,EAChB,MAAM,UAAU,CAAC;AAElB;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,qBAAa,cAAc;IAEvB,OAAO,CAAC,QAAQ,CAAC,UAAU;IAC3B,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAC;gBADb,UAAU,EAAE,UAAU,EACtB,YAAY,CAAC,EAAE,KAAK,YAAA;IAGvC;;;OAGG;IACH,OAAO,CAAC,YAAY;IAUpB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OA8BG;IACG,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,GAAE,iBAAsB,GAAG,OAAO,CAAC,aAAa,CAAC;IAyBxF;;;;;;;;;;;;;;;;;;;;;;;;;OAyBG;IACG,WAAW,CAAC,OAAO,GAAE,eAAoB,GAAG,OAAO,CAAC,sBAAsB,CAAC;IAsBjF;;;;;;;;;;;;;;;;;;;;;;OAsBG;IACG,gBAAgB,CAAC,OAAO,GAAE,eAAoB,GAAG,OAAO,CAAC,qBAAqB,CAAC;CAqBtF"}
@@ -0,0 +1,64 @@
1
+ import { HttpClient, Chain } from '@rlajous/sdk-core';
2
+ import { TradingLiteAnalysis, TradingLiteOptions } from '../types';
3
+ /**
4
+ * Resource for simplified trading analysis
5
+ *
6
+ * Provides quick, simplified token analysis optimized for trading decisions.
7
+ * Returns only the most critical fields needed to assess token safety.
8
+ *
9
+ * Currently supports Solana only.
10
+ *
11
+ * @example
12
+ * ```typescript
13
+ * const analysis = await client.tradingLite.analyze('token_address');
14
+ * console.log(`Sniper % on launch: ${analysis.SniperPercentageOnLaunch}`);
15
+ * console.log(`Bundler % holding: ${analysis.BundlerPercentageHolding}`);
16
+ * ```
17
+ */
18
+ export declare class TradingLiteResource {
19
+ private readonly httpClient;
20
+ constructor(httpClient: HttpClient, _defaultChain?: Chain);
21
+ /**
22
+ * Get simplified bundling and sniper analysis for a token
23
+ *
24
+ * Returns critical trading metrics including:
25
+ * - Sniper and bundler detection with percentages
26
+ * - Top 10 holder concentration
27
+ * - Developer activity (holdings, 24h launches)
28
+ * - Token security flags (mintable, freezable)
29
+ * - DexScreener paid status
30
+ *
31
+ * Optimized for performance with caching:
32
+ * - First call: Runs full analysis and persists data
33
+ * - Subsequent calls: Returns cached static data with real-time holdings
34
+ *
35
+ * @param address - Token address to analyze (Solana only)
36
+ * @param options - Request options
37
+ * @returns Simplified bundling analysis
38
+ *
39
+ * @example
40
+ * ```typescript
41
+ * const analysis = await client.tradingLite.analyze('pump_token_address');
42
+ *
43
+ * // Quick safety check
44
+ * const isRisky =
45
+ * analysis.SniperPercentageOnLaunch > 20 ||
46
+ * analysis.BundlerPercentageOnLaunch > 30 ||
47
+ * analysis.DevLaunched24Hours > 5;
48
+ *
49
+ * if (isRisky) {
50
+ * console.warn('Token shows high-risk indicators');
51
+ * }
52
+ *
53
+ * // Check token permissions
54
+ * if (analysis.mintable) {
55
+ * console.warn('Token supply can still be increased');
56
+ * }
57
+ * if (analysis.freezable) {
58
+ * console.warn('Token accounts can be frozen');
59
+ * }
60
+ * ```
61
+ */
62
+ analyze(address: string, options?: TradingLiteOptions): Promise<TradingLiteAnalysis>;
63
+ }
64
+ //# sourceMappingURL=trading-lite.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"trading-lite.d.ts","sourceRoot":"","sources":["../../../src/resources/trading-lite.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,UAAU,EAIV,KAAK,EACN,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAC;AAEnE;;;;;;;;;;;;;;GAcG;AACH,qBAAa,mBAAmB;IAI5B,OAAO,CAAC,QAAQ,CAAC,UAAU;gBAAV,UAAU,EAAE,UAAU,EACvC,aAAa,CAAC,EAAE,KAAK;IAGvB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAwCG;IACG,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,GAAE,kBAAuB,GAAG,OAAO,CAAC,mBAAmB,CAAC;CAwB/F"}
@@ -0,0 +1,214 @@
1
+ import { Chain, OwnershipDistribution, TokenMetadata } from '@rlajous/sdk-core';
2
+ /**
3
+ * Token holder information
4
+ */
5
+ export interface TokenHolder {
6
+ /** Holder wallet address */
7
+ address: string;
8
+ /** Token balance */
9
+ balance: number;
10
+ /** Percentage of total supply */
11
+ supply_percentage: number;
12
+ /** Raw balance as string for large numbers */
13
+ rawBalance?: string;
14
+ /** Enhanced activity data (EVM chains) */
15
+ activity?: TokenHolderActivity;
16
+ }
17
+ /**
18
+ * Enhanced holder activity data (available for EVM chains)
19
+ */
20
+ export interface TokenHolderActivity {
21
+ firstTransactionDate?: Date;
22
+ lastTransactionDate?: Date;
23
+ totalIncomingTransactions?: number;
24
+ totalIncomingAmount?: number;
25
+ totalOutgoingTransactions?: number;
26
+ totalOutgoingAmount?: number;
27
+ netFlow?: number;
28
+ tradingFrequency?: number;
29
+ isActiveTrader?: boolean;
30
+ retentionDays?: number;
31
+ avgIncomingSize?: number;
32
+ avgOutgoingSize?: number;
33
+ daysSinceLastActivity?: number;
34
+ holderClassification?: string;
35
+ balanceDiscrepancy?: boolean;
36
+ reportedBalance?: number;
37
+ calculatedBalance?: number;
38
+ }
39
+ /**
40
+ * Current holding information for a buyer
41
+ */
42
+ export interface BuyerHolding {
43
+ /** Wallet address */
44
+ address: string;
45
+ /** Current token balance */
46
+ balance: number;
47
+ /** Current percentage of total supply */
48
+ supply_percentage: number;
49
+ /** Whether this buyer is a bundler */
50
+ is_bundler?: boolean;
51
+ /** Whether this buyer is a sniper */
52
+ is_sniper?: boolean;
53
+ /** Whether this is a developer wallet */
54
+ is_developer?: boolean;
55
+ }
56
+ /**
57
+ * First buyers analysis result
58
+ */
59
+ export interface FirstBuyersAnalysis {
60
+ /** Percentage of supply initially acquired by first buyers */
61
+ initially_acquired_percentage: number;
62
+ /** Total number of first traders analyzed */
63
+ buyers_analyzed_count: number;
64
+ /** Actual number of unique buyers */
65
+ unique_buyers_count?: number;
66
+ /** True when unique_buyers_count < 20 */
67
+ buyer_segmentation_limited?: boolean;
68
+ /** Percentage bought by top 10 buyers */
69
+ top_10_buyers_bought_percentage: number;
70
+ /** Percentage bought by top 5 buyers */
71
+ top_5_buyers_bought_percentage: number;
72
+ /** Percentage bought by top 20 buyers */
73
+ top_20_buyers_bought_percentage: number;
74
+ /** Percentage bought in the same block */
75
+ bundled_percentage_supply_bought?: number;
76
+ /** Number of buys in the same block */
77
+ buys_in_same_block_count?: number;
78
+ /** Current holding percentage of first buyers */
79
+ current_holding_percentage: number | null;
80
+ /** Current holding percentage of bundled buyers */
81
+ bundled_current_holding_percentage?: number | null;
82
+ /** Number of first buyers still holding */
83
+ buyers_still_holding_count: number | null;
84
+ /** Number of bundled buyers still holding */
85
+ bundled_buyers_still_holding_count: number | null;
86
+ /** Average percentage held by bundler buyers */
87
+ average_percentage_bundler_buyer: number | null;
88
+ /** Count of first buyers who transferred out */
89
+ buyers_transferred_out_count: number | null;
90
+ /** Distinct addresses that received supply */
91
+ distributed_to_distinct_addresses_count: number;
92
+ /** Percentage transferred out by first buyers */
93
+ transferred_out_from_initially_acquired_percentage: number | null;
94
+ /** Number of buyers in the same block */
95
+ bundled_buyers_count: number | null;
96
+ /** Complete list of ALL bundled addresses (including sold out) */
97
+ all_bundled_addresses: string[];
98
+ /** Timestamp of analysis */
99
+ timestamp: string;
100
+ /** Current percentage per initial buyer */
101
+ current_percentage_per_buyer: BuyerHolding[];
102
+ /** Percentage currently held by snipers */
103
+ snipers_current_holding_percentage: number | null;
104
+ /** Number of snipers still holding */
105
+ snipers_still_holding_count: number | null;
106
+ /** Percentage held by snipers still holding */
107
+ snipers_still_holding_percentage: number | null;
108
+ /** Percentage held by development team */
109
+ dev_holdings_percentage?: number | null;
110
+ }
111
+ /**
112
+ * Block range analysis for sniper detection
113
+ */
114
+ export interface BlockRangeAnalysis {
115
+ block_hash: string;
116
+ timestamp: string;
117
+ buy_count: number;
118
+ block_number: number;
119
+ addresses: string[];
120
+ supply_percentage: number;
121
+ }
122
+ /**
123
+ * Time since mint analysis
124
+ */
125
+ export interface TimeSinceMintAnalysis {
126
+ time_range_seconds: number;
127
+ buy_count: number;
128
+ addresses: string[];
129
+ supply_percentage: number;
130
+ }
131
+ /**
132
+ * Sniper detection analysis result
133
+ */
134
+ export interface SniperAnalysis {
135
+ /** List of identified sniper addresses */
136
+ sniper_addresses: string[];
137
+ /** Total number of snipers detected */
138
+ sniper_count: number;
139
+ /** Total percentage held by snipers */
140
+ sniper_total_percentage: number;
141
+ /** Analysis by block range */
142
+ block_range_analysis: BlockRangeAnalysis[];
143
+ /** Analysis by time since mint */
144
+ time_since_mint_analysis: TimeSinceMintAnalysis[];
145
+ /** Average time since mint in seconds */
146
+ average_time_since_mint: number;
147
+ /** Median time since mint in seconds */
148
+ median_time_since_mint: number;
149
+ /** Whether frontrunning was detected */
150
+ potential_frontrunning_detected: boolean;
151
+ /** Confidence score (0-100) */
152
+ sniper_confidence_score: number;
153
+ }
154
+ /**
155
+ * Activity patterns analysis (EVM chains)
156
+ */
157
+ export interface ActivityPatterns {
158
+ earlyAdopters: TokenHolder[];
159
+ activeTraders: TokenHolder[];
160
+ longTermHolders: TokenHolder[];
161
+ recentBuyers: TokenHolder[];
162
+ suspiciousPatterns: {
163
+ highFrequencyTraders: TokenHolder[];
164
+ sameTimeBuyers: TokenHolder[];
165
+ unusualFlow: TokenHolder[];
166
+ };
167
+ }
168
+ /**
169
+ * Complete holder analysis result
170
+ */
171
+ export interface HolderAnalysisResult {
172
+ /** Token address */
173
+ token_address: string;
174
+ /** Total number of holders */
175
+ total_holders_count?: number;
176
+ /** Token mint transaction hash */
177
+ token_mint_tx?: string;
178
+ /** Token mint timestamp */
179
+ token_mint_time?: string;
180
+ /** Minter/deployer address */
181
+ minter?: string;
182
+ /** Total supply used for calculations */
183
+ total_supply?: number;
184
+ /** Token metadata */
185
+ metadata?: TokenMetadata;
186
+ /** First buyers analysis */
187
+ first_buyers_analysis: FirstBuyersAnalysis;
188
+ /** Top 10 holders analysis */
189
+ top_10_holders_analysis?: OwnershipDistribution;
190
+ /** Tokens launched by developer in 24h */
191
+ dev_launched_tokens_in_24_hours?: number | null;
192
+ /** Sniper detection analysis */
193
+ sniper_analysis?: SniperAnalysis;
194
+ /** Activity patterns (EVM chains) */
195
+ activity_patterns?: ActivityPatterns;
196
+ }
197
+ /**
198
+ * Options for holder analysis requests
199
+ */
200
+ export interface HolderAnalysisOptions {
201
+ /**
202
+ * Target blockchain
203
+ *
204
+ * Optional if `defaultChain` was set in the client configuration.
205
+ */
206
+ chain?: Chain;
207
+ /** Skip cache and force fresh fetch */
208
+ disableRefetch?: boolean;
209
+ /** Request timeout in milliseconds */
210
+ timeout?: number;
211
+ /** Abort signal */
212
+ signal?: AbortSignal;
213
+ }
214
+ //# sourceMappingURL=holder-analysis.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"holder-analysis.d.ts","sourceRoot":"","sources":["../../../src/types/holder-analysis.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ export type { TokenHolder, TokenHolderActivity, BuyerHolding, FirstBuyersAnalysis, BlockRangeAnalysis, TimeSinceMintAnalysis, SniperAnalysis, ActivityPatterns, HolderAnalysisResult, HolderAnalysisOptions, } from './holder-analysis';
2
+ export type { AddressHolding, TradingLiteAnalysis, TradingLiteOptions } from './trading-lite';
3
+ export type { VolumeData, PoolData, TokenWithRisk, TokenRiskSummary, PoolsResponse, TrendingToken, TrendingTokensResponse, TrendingPoolsResponse, TokenPoolsOptions, TrendingOptions, } from './tokens';
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/types/index.ts"],"names":[],"mappings":"AAAA,YAAY,EACV,WAAW,EACX,mBAAmB,EACnB,YAAY,EACZ,mBAAmB,EACnB,kBAAkB,EAClB,qBAAqB,EACrB,cAAc,EACd,gBAAgB,EAChB,oBAAoB,EACpB,qBAAqB,GACtB,MAAM,mBAAmB,CAAC;AAE3B,YAAY,EAAE,cAAc,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AAE9F,YAAY,EACV,UAAU,EACV,QAAQ,EACR,aAAa,EACb,gBAAgB,EAChB,aAAa,EACb,aAAa,EACb,sBAAsB,EACtB,qBAAqB,EACrB,iBAAiB,EACjB,eAAe,GAChB,MAAM,UAAU,CAAC"}