@gala-chain/launchpad-sdk 3.27.4 → 3.29.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.
@@ -0,0 +1,95 @@
1
+ /**
2
+ * DEX Pool Discovery Service
3
+ *
4
+ * Service for querying and exploring GalaSwap DEX liquidity pools
5
+ * with pagination, filtering, and sorting capabilities.
6
+ *
7
+ * @packageDocumentation
8
+ */
9
+ import { BaseService } from './BaseService';
10
+ import type { HttpClient } from '../utils/http';
11
+ import type { DexPoolsResult, FetchDexPoolsOptions } from '../types/dex-pool.dto';
12
+ /**
13
+ * Service for fetching and exploring DEX pools on GalaSwap
14
+ *
15
+ * Handles pagination, filtering, and sorting of liquidity pools
16
+ * across all graduated tokens and base tokens.
17
+ *
18
+ * @category GSwap
19
+ * @since 3.28.0
20
+ */
21
+ export declare class DexPoolService extends BaseService {
22
+ /** Base URL for DEX backend API */
23
+ private readonly dexBackendBaseUrl;
24
+ /**
25
+ * Create a new DexPoolService instance
26
+ *
27
+ * @param http HttpClient for making API requests
28
+ * @param dexBackendBaseUrl Base URL for DEX backend API
29
+ * @param debugMode Enable debug logging
30
+ */
31
+ constructor(http: HttpClient, dexBackendBaseUrl: string, debugMode?: boolean);
32
+ /**
33
+ * Fetch DEX pools with pagination and filtering
34
+ *
35
+ * Queries the DEX backend for available liquidity pools with support for:
36
+ * - Pagination (max 20 per page)
37
+ * - Sorting by TVL, 30-day volume, or 1-day volume
38
+ * - Search filtering by token symbols
39
+ *
40
+ * @param options Fetch options (all optional)
41
+ * @returns Promise resolving to paginated pool results
42
+ *
43
+ * @throws {Error} If HTTP request fails
44
+ * @throws {ValidationError} If sort options are invalid
45
+ *
46
+ * @example
47
+ * ```typescript
48
+ * // Fetch top 10 pools by volume
49
+ * const result = await dexPoolService.fetchDexPools({
50
+ * sortBy: 'volume1d',
51
+ * sortOrder: 'desc',
52
+ * limit: 10,
53
+ * page: 1
54
+ * });
55
+ *
56
+ * console.log(`Found ${result.total} total pools`);
57
+ * console.log(`Showing page ${result.page} of ${result.totalPages}`);
58
+ * ```
59
+ *
60
+ * @since 3.28.0
61
+ */
62
+ fetchDexPools(options?: FetchDexPoolsOptions): Promise<DexPoolsResult>;
63
+ /**
64
+ * Fetch ALL DEX pools with automatic pagination
65
+ *
66
+ * Convenience method that automatically handles pagination to retrieve
67
+ * all available DEX pools. Uses maximum page size (20) for efficiency.
68
+ *
69
+ * This is useful when you need complete pool data regardless of result size.
70
+ * For large result sets, consider using fetchDexPools() with explicit pagination.
71
+ *
72
+ * @param options Fetch options (no pagination fields)
73
+ * @returns Promise resolving to all pools with flattened pagination
74
+ *
75
+ * @example
76
+ * ```typescript
77
+ * // Fetch all pools sorted by TVL
78
+ * const allPools = await dexPoolService.fetchAllDexPools({
79
+ * sortBy: 'tvl',
80
+ * sortOrder: 'desc'
81
+ * });
82
+ *
83
+ * console.log(`Total pools: ${allPools.total}`);
84
+ *
85
+ * // Find top GALA pools
86
+ * const galaPools = allPools.pools
87
+ * .filter(p => p.poolName.includes('GALA'))
88
+ * .slice(0, 10);
89
+ * ```
90
+ *
91
+ * @since 3.28.0
92
+ */
93
+ fetchAllDexPools(options?: Omit<FetchDexPoolsOptions, 'page' | 'limit'>): Promise<DexPoolsResult>;
94
+ }
95
+ //# sourceMappingURL=DexPoolService.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DexPoolService.d.ts","sourceRoot":"","sources":["../../src/services/DexPoolService.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,KAAK,EACV,cAAc,EACd,oBAAoB,EACrB,MAAM,uBAAuB,CAAC;AAG/B;;;;;;;;GAQG;AACH,qBAAa,cAAe,SAAQ,WAAW;IAC7C,mCAAmC;IACnC,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAS;IAE3C;;;;;;OAMG;gBAED,IAAI,EAAE,UAAU,EAChB,iBAAiB,EAAE,MAAM,EACzB,SAAS,GAAE,OAAe;IAM5B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OA6BG;IACG,aAAa,CAAC,OAAO,GAAE,oBAAyB,GAAG,OAAO,CAAC,cAAc,CAAC;IAoEhF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OA6BG;IACG,gBAAgB,CACpB,OAAO,GAAE,IAAI,CAAC,oBAAoB,EAAE,MAAM,GAAG,OAAO,CAAM,GACzD,OAAO,CAAC,cAAc,CAAC;CAuC3B"}
@@ -7,6 +7,7 @@
7
7
  * @category Services
8
8
  * @since 2.0.0
9
9
  */
10
+ import { Socket } from 'socket.io-client';
10
11
  import { SDKTransactionStatus } from '../types/websocket.types';
11
12
  export interface TransactionStatus {
12
13
  transactionId: string;
@@ -66,5 +67,19 @@ export declare class WebSocketService {
66
67
  * Check connection status
67
68
  */
68
69
  isConnected(): boolean;
70
+ /**
71
+ * Get the underlying Socket.IO socket instance for custom event subscriptions
72
+ *
73
+ * @returns The Socket.IO socket instance, or null if not connected
74
+ *
75
+ * @example
76
+ * const socket = webSocketService.getSocket();
77
+ * if (socket) {
78
+ * socket.on('custom-event', (data) => {
79
+ * console.log('Event received:', data);
80
+ * });
81
+ * }
82
+ */
83
+ getSocket(): Socket | null;
69
84
  }
70
85
  //# sourceMappingURL=WebSocketService.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"WebSocketService.d.ts","sourceRoot":"","sources":["../../src/services/WebSocketService.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAIH,OAAO,EAEL,oBAAoB,EAErB,MAAM,0BAA0B,CAAC;AAElC,MAAM,WAAW,iBAAiB;IAChC,aAAa,EAAE,MAAM,CAAC;IACtB,MAAM,EAAE,oBAAoB,CAAC;IAC7B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,eAAe;IAC9B,GAAG,EAAE,MAAM,CAAC;IACZ,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,MAAM,CAAuB;IACrC,OAAO,CAAC,MAAM,CAAkB;IAChC,OAAO,CAAC,SAAS,CACL;IACZ,OAAO,CAAC,QAAQ,CAA0C;IAC1D,OAAO,CAAC,cAAc,CAAK;IAC3B,OAAO,CAAC,KAAK,CAAU;IACvB,OAAO,CAAC,mBAAmB,CAAU;IACrC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,gBAAgB,CAAS;gBAErB,MAAM,EAAE,eAAe,EAAE,KAAK,GAAE,OAAe;IAc3D;;;OAGG;IACH,OAAO,CAAC,yBAAyB;IAiBjC;;OAEG;IACG,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAmE9B;;OAEG;IACG,kBAAkB,CACtB,aAAa,EAAE,MAAM,EACrB,QAAQ,EAAE,CAAC,MAAM,EAAE,iBAAiB,KAAK,IAAI,GAC5C,OAAO,CAAC,IAAI,CAAC;IAoIhB;;OAEG;IACG,kBAAkB,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAY3E;;OAEG;IACH,OAAO,CAAC,eAAe;IAKvB;;OAEG;YACW,eAAe;IAmB7B;;OAEG;IACH,UAAU,IAAI,IAAI;IA4BlB;;OAEG;IACH,WAAW,IAAI,OAAO;CAGvB"}
1
+ {"version":3,"file":"WebSocketService.d.ts","sourceRoot":"","sources":["../../src/services/WebSocketService.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAM,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAE9C,OAAO,EAEL,oBAAoB,EAErB,MAAM,0BAA0B,CAAC;AAElC,MAAM,WAAW,iBAAiB;IAChC,aAAa,EAAE,MAAM,CAAC;IACtB,MAAM,EAAE,oBAAoB,CAAC;IAC7B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,eAAe;IAC9B,GAAG,EAAE,MAAM,CAAC;IACZ,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,MAAM,CAAuB;IACrC,OAAO,CAAC,MAAM,CAAkB;IAChC,OAAO,CAAC,SAAS,CACL;IACZ,OAAO,CAAC,QAAQ,CAA0C;IAC1D,OAAO,CAAC,cAAc,CAAK;IAC3B,OAAO,CAAC,KAAK,CAAU;IACvB,OAAO,CAAC,mBAAmB,CAAU;IACrC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,gBAAgB,CAAS;gBAErB,MAAM,EAAE,eAAe,EAAE,KAAK,GAAE,OAAe;IAc3D;;;OAGG;IACH,OAAO,CAAC,yBAAyB;IAiBjC;;OAEG;IACG,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAmE9B;;OAEG;IACG,kBAAkB,CACtB,aAAa,EAAE,MAAM,EACrB,QAAQ,EAAE,CAAC,MAAM,EAAE,iBAAiB,KAAK,IAAI,GAC5C,OAAO,CAAC,IAAI,CAAC;IAoIhB;;OAEG;IACG,kBAAkB,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAY3E;;OAEG;IACH,OAAO,CAAC,eAAe;IAKvB;;OAEG;YACW,eAAe;IAmB7B;;OAEG;IACH,UAAU,IAAI,IAAI;IA4BlB;;OAEG;IACH,WAAW,IAAI,OAAO;IAItB;;;;;;;;;;;;OAYG;IACH,SAAS,IAAI,MAAM,GAAG,IAAI;CAG3B"}
@@ -0,0 +1,174 @@
1
+ /**
2
+ * DEX Pool Discovery Types
3
+ *
4
+ * Types for querying and exploring GalaSwap DEX liquidity pools.
5
+ * Supports pagination, filtering, and sorting across all available pools.
6
+ *
7
+ * @packageDocumentation
8
+ */
9
+ /**
10
+ * Complete DEX pool data structure (19 fields from backend)
11
+ *
12
+ * Represents a single liquidity pool on the GalaSwap DEX with full metrics.
13
+ */
14
+ export interface DexPoolData {
15
+ /** Pool identifier (e.g., "GALA|Unit|none|none/GUSDC|Unit|none|none/10000") */
16
+ poolPair: string;
17
+ /** Unique pool hash identifier */
18
+ poolHash: string;
19
+ /** First token symbol (e.g., "GALA") */
20
+ token0: string;
21
+ /** Second token symbol (e.g., "GUSDC") */
22
+ token1: string;
23
+ /** First token image URL */
24
+ token0Image: string;
25
+ /** Second token image URL */
26
+ token1Image: string;
27
+ /** First token price in terms of second token */
28
+ token0Price: string;
29
+ /** Second token price in terms of first token */
30
+ token1Price: string;
31
+ /** Human-readable pool name (e.g., "GALA/GUSDC") */
32
+ poolName: string;
33
+ /** Fee tier as percentage string (e.g., "0.3", "1") */
34
+ fee: string;
35
+ /** 24-hour fees collected (USD) */
36
+ fee24h: number;
37
+ /** First token TVL (in token units) */
38
+ token0Tvl: number;
39
+ /** Second token TVL (in token units) */
40
+ token1Tvl: number;
41
+ /** First token TVL in USD */
42
+ token0TvlUsd: number;
43
+ /** Second token TVL in USD */
44
+ token1TvlUsd: number;
45
+ /** Total value locked in pool (USD) */
46
+ tvl: number;
47
+ /** 1-day trading volume (USD) */
48
+ volume1d: number;
49
+ /** 30-day trading volume (USD) */
50
+ volume30d: number;
51
+ /** Volume-to-TVL ratio (volume1d / tvl) */
52
+ dayPerTvl: number;
53
+ /** 1-day APR percentage (calculated from fees) */
54
+ apr1d: number;
55
+ }
56
+ /**
57
+ * Backend-validated sort field options
58
+ *
59
+ * Only these three fields can be used for sorting. The backend validates
60
+ * and rejects any other sortBy values.
61
+ *
62
+ * @see {@link FetchDexPoolsOptions}
63
+ */
64
+ export type DexPoolSortBy = 'tvl' | 'volume30d' | 'volume1d';
65
+ /**
66
+ * Sort order direction
67
+ *
68
+ * Lowercase for user-facing SDK (converted to uppercase for backend API)
69
+ */
70
+ export type DexPoolSortOrder = 'asc' | 'desc';
71
+ /**
72
+ * Options for fetching DEX pools with pagination and filtering
73
+ *
74
+ * Follows SDK standard pagination conventions matching other paginated methods
75
+ * like fetchPools(), fetchTrades(), etc.
76
+ *
77
+ * @example
78
+ * ```typescript
79
+ * // Fetch top 10 pools by volume
80
+ * const result = await sdk.fetchDexPools({
81
+ * sortBy: 'volume1d',
82
+ * sortOrder: 'desc',
83
+ * limit: 10,
84
+ * page: 1
85
+ * });
86
+ *
87
+ * // Search for GALA pools
88
+ * const galaPools = await sdk.fetchDexPools({
89
+ * search: 'GALA',
90
+ * limit: 20
91
+ * });
92
+ * ```
93
+ */
94
+ export interface FetchDexPoolsOptions {
95
+ /**
96
+ * Search filter for token symbols in pool pair
97
+ *
98
+ * Performs fuzzy search (case-insensitive) across token symbols
99
+ * and pool names. Example: "GALA", "GUSDC", "GALA/GUSDC"
100
+ *
101
+ * @optional
102
+ */
103
+ search?: string;
104
+ /**
105
+ * Field to sort results by
106
+ *
107
+ * Default: 'tvl' (total value locked)
108
+ * Backend-validated to only allow: 'tvl', 'volume30d', 'volume1d'
109
+ *
110
+ * @optional
111
+ */
112
+ sortBy?: DexPoolSortBy;
113
+ /**
114
+ * Sort order direction
115
+ *
116
+ * Default: 'desc' (highest to lowest)
117
+ *
118
+ * @optional
119
+ */
120
+ sortOrder?: DexPoolSortOrder;
121
+ /**
122
+ * Page number (1-based pagination)
123
+ *
124
+ * Default: 1
125
+ *
126
+ * @optional
127
+ */
128
+ page?: number;
129
+ /**
130
+ * Number of results per page
131
+ *
132
+ * Default: 10
133
+ * Maximum enforced by backend: 20
134
+ *
135
+ * @optional
136
+ */
137
+ limit?: number;
138
+ }
139
+ /**
140
+ * Clean result for paginated DEX pool queries
141
+ *
142
+ * Follows SDK standard pagination result structure with 7 metadata fields
143
+ * matching fetchPools(), fetchTrades(), fetchComments(), etc.
144
+ *
145
+ * @example
146
+ * ```typescript
147
+ * const result = await sdk.fetchDexPools({ limit: 20 });
148
+ *
149
+ * console.log(`Page ${result.page} of ${result.totalPages}`);
150
+ * console.log(`Total pools: ${result.total}`);
151
+ * console.log(`Pools in this page: ${result.pools.length}`);
152
+ *
153
+ * result.pools.forEach(pool => {
154
+ * console.log(`${pool.poolName}: $${pool.tvl.toFixed(2)} TVL`);
155
+ * });
156
+ * ```
157
+ */
158
+ export interface DexPoolsResult {
159
+ /** Array of DEX pool data */
160
+ pools: DexPoolData[];
161
+ /** Current page number (1-based) */
162
+ page: number;
163
+ /** Number of items per page */
164
+ limit: number;
165
+ /** Total number of pools */
166
+ total: number;
167
+ /** Total number of pages */
168
+ totalPages: number;
169
+ /** Whether there are additional pages after current */
170
+ hasNext: boolean;
171
+ /** Whether there are pages before current */
172
+ hasPrevious: boolean;
173
+ }
174
+ //# sourceMappingURL=dex-pool.dto.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dex-pool.dto.d.ts","sourceRoot":"","sources":["../../src/types/dex-pool.dto.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH;;;;GAIG;AACH,MAAM,WAAW,WAAW;IAC1B,+EAA+E;IAC/E,QAAQ,EAAE,MAAM,CAAC;IAEjB,kCAAkC;IAClC,QAAQ,EAAE,MAAM,CAAC;IAEjB,wCAAwC;IACxC,MAAM,EAAE,MAAM,CAAC;IAEf,0CAA0C;IAC1C,MAAM,EAAE,MAAM,CAAC;IAEf,4BAA4B;IAC5B,WAAW,EAAE,MAAM,CAAC;IAEpB,6BAA6B;IAC7B,WAAW,EAAE,MAAM,CAAC;IAEpB,iDAAiD;IACjD,WAAW,EAAE,MAAM,CAAC;IAEpB,iDAAiD;IACjD,WAAW,EAAE,MAAM,CAAC;IAEpB,oDAAoD;IACpD,QAAQ,EAAE,MAAM,CAAC;IAEjB,uDAAuD;IACvD,GAAG,EAAE,MAAM,CAAC;IAEZ,mCAAmC;IACnC,MAAM,EAAE,MAAM,CAAC;IAEf,uCAAuC;IACvC,SAAS,EAAE,MAAM,CAAC;IAElB,wCAAwC;IACxC,SAAS,EAAE,MAAM,CAAC;IAElB,6BAA6B;IAC7B,YAAY,EAAE,MAAM,CAAC;IAErB,8BAA8B;IAC9B,YAAY,EAAE,MAAM,CAAC;IAErB,uCAAuC;IACvC,GAAG,EAAE,MAAM,CAAC;IAEZ,iCAAiC;IACjC,QAAQ,EAAE,MAAM,CAAC;IAEjB,kCAAkC;IAClC,SAAS,EAAE,MAAM,CAAC;IAElB,2CAA2C;IAC3C,SAAS,EAAE,MAAM,CAAC;IAElB,kDAAkD;IAClD,KAAK,EAAE,MAAM,CAAC;CACf;AAED;;;;;;;GAOG;AACH,MAAM,MAAM,aAAa,GAAG,KAAK,GAAG,WAAW,GAAG,UAAU,CAAC;AAE7D;;;;GAIG;AACH,MAAM,MAAM,gBAAgB,GAAG,KAAK,GAAG,MAAM,CAAC;AAE9C;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,MAAM,WAAW,oBAAoB;IACnC;;;;;;;OAOG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAEhB;;;;;;;OAOG;IACH,MAAM,CAAC,EAAE,aAAa,CAAC;IAEvB;;;;;;OAMG;IACH,SAAS,CAAC,EAAE,gBAAgB,CAAC;IAE7B;;;;;;OAMG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;IAEd;;;;;;;OAOG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,WAAW,cAAc;IAC7B,6BAA6B;IAC7B,KAAK,EAAE,WAAW,EAAE,CAAC;IAErB,oCAAoC;IACpC,IAAI,EAAE,MAAM,CAAC;IAEb,+BAA+B;IAC/B,KAAK,EAAE,MAAM,CAAC;IAEd,4BAA4B;IAC5B,KAAK,EAAE,MAAM,CAAC;IAEd,4BAA4B;IAC5B,UAAU,EAAE,MAAM,CAAC;IAEnB,uDAAuD;IACvD,OAAO,EAAE,OAAO,CAAC;IAEjB,6CAA6C;IAC7C,WAAW,EAAE,OAAO,CAAC;CACtB"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@gala-chain/launchpad-sdk",
3
- "version": "3.27.4",
4
- "description": "TypeScript SDK for Gala Launchpad Backend API - 64 methods supporting optional wallet (read-only and full-access modes). Production-ready DeFi token launchpad integration with AgentConfig setup, GalaChain trading, GSwap DEX integration, price history, token creation, and comprehensive user operations. Multi-format output (ESM, CJS, UMD).",
3
+ "version": "3.29.0",
4
+ "description": "TypeScript SDK for Gala Launchpad Backend API - 66 methods supporting optional wallet (read-only and full-access modes). Production-ready DeFi token launchpad integration with AgentConfig setup, GalaChain trading, GSwap DEX integration, price history, token creation, DEX pool discovery, and comprehensive user operations. Multi-format output (ESM, CJS, UMD).",
5
5
  "main": "dist/index.js",
6
6
  "module": "dist/index.esm.js",
7
7
  "types": "dist/index.d.ts",
@@ -47,6 +47,10 @@
47
47
  "demo:liquidity:detailed": "tsx examples/demo-liquidity-detailed.ts",
48
48
  "demo:cache": "tsx examples/demo-cache.ts",
49
49
  "demo:fetch-all-pools": "tsx examples/demo-fetch-all-pools.ts",
50
+ "demo:dex-trades": "tsx examples/demo-dex-trades.ts",
51
+ "demo:dex-pool-discovery": "tsx examples/demo-dex-pool-discovery.ts",
52
+ "demo:watch-pools": "tsx examples/demo-watch-pools.ts",
53
+ "demo:watch-tokens": "tsx examples/demo-watch-tokens.ts",
50
54
  "lint": "eslint src tests scripts --ext .ts,.tsx --fix",
51
55
  "lint:check": "eslint src tests scripts --ext .ts,.tsx",
52
56
  "typecheck": "tsc --noEmit",