@shogun-sdk/swap 0.1.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.
package/README.md ADDED
@@ -0,0 +1,274 @@
1
+ # @shogun-sdk/swap
2
+
3
+ A comprehensive swap SDK for the Shogun Network that provides unified quote fetching across multiple chains and protocols with intelligent fallback mechanisms.
4
+
5
+ ## Features
6
+
7
+ - 🔄 **Unified Quote Interface** - Single API for quotes across all supported chains
8
+ - 🎯 **Intelligent Fallback** - Automatically falls back from intents-sdk to one-shot API
9
+ - ⛓️ **Multi-Chain Support** - Ethereum, Arbitrum, Polygon, Solana, Sui, Hyperliquid, and more
10
+ - 🛡️ **Type Safety** - Full TypeScript support with comprehensive type definitions
11
+ - ⚡ **Performance Optimized** - Built for both frontend and backend applications
12
+ - 🔧 **Flexible Configuration** - Customizable timeouts, slippage, and routing options
13
+
14
+ ## Installation
15
+
16
+ ```bash
17
+ npm install @shogun-sdk/swap
18
+ pnpm install @shogun-sdk/swap
19
+ yarn add @shogun-sdk/swap
20
+ ```
21
+
22
+ ## Quick Start
23
+
24
+ ### Basic Usage
25
+
26
+ ```typescript
27
+ import { SwapClient, ChainID } from "@shogun-sdk/swap";
28
+
29
+ // Initialize the client
30
+ const swapClient = new SwapClient({
31
+ apiKey: 'your-api-key',
32
+ apiUrl: 'https://api.shogun.network',
33
+ timeout: 30000
34
+ });
35
+
36
+ // Get a cross-chain quote
37
+ const quote = await swapClient.getQuote({
38
+ sourceChainId: ChainID.Ethereum,
39
+ destChainId: ChainID.Arbitrum,
40
+ tokenIn: '0xA0b86a33E6441b8c4C8C0C4C0C4C0C4C0C4C0C4C', // USDC
41
+ tokenOut: '0x1234567890123456789012345678901234567890', // Target token
42
+ amount: BigInt('1000000'), // 1 USDC (6 decimals)
43
+ senderAddress: '0x...',
44
+ destinationAddress: '0x...',
45
+ slippageBps: 50 // 0.5% slippage
46
+ });
47
+
48
+ console.log('Expected output:', quote.amountOut.toString());
49
+ console.log('Quote source:', quote.source); // 'intents-sdk' or 'one-shot'
50
+ ```
51
+
52
+ ### Single-Chain Swaps
53
+
54
+ ```typescript
55
+ // Get a quote for same-chain swap
56
+ const singleChainQuote = await swapClient.getSingleChainQuote(
57
+ ChainID.Ethereum,
58
+ '0xA0b86a33E6441b8c4C8C0C4C0C4C0C4C0C4C0C4C', // USDC
59
+ '0x1234567890123456789012345678901234567890', // Target token
60
+ BigInt('1000000'), // 1 USDC
61
+ 50 // 0.5% slippage
62
+ );
63
+ ```
64
+
65
+ ### Solana Swaps with Jito Tips
66
+
67
+ ```typescript
68
+ const solanaQuote = await swapClient.getQuote({
69
+ sourceChainId: ChainID.Solana,
70
+ destChainId: ChainID.Solana,
71
+ tokenIn: 'So11111111111111111111111111111111111111112', // SOL
72
+ tokenOut: 'EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v', // USDC
73
+ amount: BigInt('1000000000'), // 1 SOL
74
+ jitoTip: 1000000, // 0.001 SOL tip
75
+ slippageBps: 100 // 1% slippage
76
+ });
77
+ ```
78
+
79
+ ## Advanced Usage
80
+
81
+ ### Error Handling and Fallback
82
+
83
+ ```typescript
84
+ try {
85
+ const quote = await swapClient.getQuote(params);
86
+
87
+ if (quote.error) {
88
+ console.warn('Quote error:', quote.error);
89
+ // Handle error case
90
+ }
91
+
92
+ if (quote.amountOut > 0n) {
93
+ console.log('Valid quote from:', quote.source);
94
+ // Proceed with swap
95
+ }
96
+ } catch (error) {
97
+ console.error('Failed to get quote:', error);
98
+ }
99
+ ```
100
+
101
+ ### Request Timeout Control
102
+
103
+ ```typescript
104
+ const controller = new AbortController();
105
+ const timeoutId = setTimeout(() => controller.abort(), 10000); // 10s timeout
106
+
107
+ try {
108
+ const quote = await swapClient.getQuote(params, controller.signal);
109
+ clearTimeout(timeoutId);
110
+ } catch (error) {
111
+ clearTimeout(timeoutId);
112
+ if (error.name === 'AbortError') {
113
+ console.error('Request timed out');
114
+ }
115
+ }
116
+ ```
117
+
118
+ ### Utility Functions
119
+
120
+ ```typescript
121
+ import {
122
+ validateSwapParams,
123
+ calculatePriceImpact,
124
+ formatTokenAmount,
125
+ type SwapParams
126
+ } from "@shogun-sdk/swap";
127
+
128
+ // Validate swap parameters
129
+ const swapParams: SwapParams = {
130
+ tokenIn: '0x...',
131
+ tokenOut: '0x...',
132
+ amountIn: BigInt(1000000),
133
+ amountOutMin: BigInt(900000),
134
+ to: '0x...',
135
+ deadline: Math.floor(Date.now() / 1000) + 3600
136
+ };
137
+
138
+ validateSwapParams(swapParams);
139
+
140
+ // Calculate price impact
141
+ const priceImpact = calculatePriceImpact(
142
+ BigInt(1000000), // amountIn
143
+ BigInt(990000), // amountOut
144
+ 1.0, // tokenInPrice
145
+ 1.0 // tokenOutPrice
146
+ );
147
+
148
+ // Format token amounts
149
+ const formattedAmount = formatTokenAmount(BigInt(1000000), 6); // "1.0"
150
+ ```
151
+
152
+ ## API Reference
153
+
154
+ ### SwapClient
155
+
156
+ The main client class for fetching quotes.
157
+
158
+ #### Constructor
159
+
160
+ ```typescript
161
+ new SwapClient(config: SwapClientConfig)
162
+ ```
163
+
164
+ **Config Options:**
165
+ - `apiKey: string` - API key for one-shot service
166
+ - `apiUrl: string` - API URL for one-shot service
167
+ - `timeout?: number` - Request timeout in milliseconds (optional)
168
+
169
+ #### Methods
170
+
171
+ ##### `getQuote(params, signal?)`
172
+
173
+ Fetches a quote with intelligent fallback logic.
174
+
175
+ **Parameters:**
176
+ - `params: UnifiedQuoteParams` - Quote parameters
177
+ - `signal?: AbortSignal` - Optional abort signal for cancellation
178
+
179
+ **Returns:** `Promise<UnifiedQuoteResponse>`
180
+
181
+ ##### `getSingleChainQuote(chainId, tokenIn, tokenOut, amount, slippageBps?, signal?)`
182
+
183
+ Gets a quote for same-chain swaps.
184
+
185
+ **Parameters:**
186
+ - `chainId: ChainID` - Chain identifier
187
+ - `tokenIn: string` - Input token address
188
+ - `tokenOut: string` - Output token address
189
+ - `amount: bigint` - Amount to swap
190
+ - `slippageBps?: number` - Slippage in basis points (optional)
191
+ - `signal?: AbortSignal` - Optional abort signal (optional)
192
+
193
+ **Returns:** `Promise<UnifiedQuoteResponse>`
194
+
195
+ ### Types
196
+
197
+ #### `UnifiedQuoteParams`
198
+
199
+ ```typescript
200
+ interface UnifiedQuoteParams {
201
+ sourceChainId: ChainID;
202
+ destChainId: ChainID;
203
+ tokenIn: string;
204
+ tokenOut: string;
205
+ amount: bigint;
206
+ senderAddress?: string;
207
+ destinationAddress?: string;
208
+ slippageBps?: number;
209
+ affiliateWallet?: string;
210
+ affiliateFee?: string;
211
+ jitoTip?: number;
212
+ gasRefuel?: number;
213
+ dynamicSlippage?: boolean;
214
+ externalCall?: string;
215
+ }
216
+ ```
217
+
218
+ #### `UnifiedQuoteResponse`
219
+
220
+ ```typescript
221
+ interface UnifiedQuoteResponse {
222
+ amountOut: bigint;
223
+ amountInUsd: number;
224
+ amountOutUsd: number;
225
+ amountOutReduced?: bigint;
226
+ amountOutUsdReduced?: number;
227
+ estimatedAmountInAsMinStablecoinAmount?: bigint;
228
+ priceImpact: number;
229
+ slippage: number;
230
+ provider: string;
231
+ rawQuote: any;
232
+ source: 'intents-sdk' | 'one-shot';
233
+ error?: string;
234
+ }
235
+ ```
236
+
237
+ ### Utility Functions
238
+
239
+ - `validateSwapParams(params: SwapParams): void` - Validate swap parameters
240
+ - `calculatePriceImpact(amountIn, amountOut, tokenInPrice, tokenOutPrice): number` - Calculate price impact percentage
241
+ - `formatTokenAmount(amount: bigint, decimals: number): string` - Format token amounts for display
242
+
243
+ ## Supported Chains
244
+
245
+ - **Ethereum**
246
+ - **Arbitrum**
247
+ - **Polygon**
248
+ - **Solana**
249
+ - **Sui**
250
+ - **Hyperliquid**
251
+ - **Base**
252
+ - **BSC**
253
+
254
+ ## Quote Sources
255
+
256
+ The SDK uses a two-tier approach for quote fetching:
257
+
258
+ 1. **Primary: Intents SDK** - Fast, local quote calculation using integrated DEX aggregators
259
+ 2. **Fallback: One-Shot API** - Comprehensive quote service with additional routing options
260
+
261
+ This ensures maximum reliability and the best possible quotes for your swaps.
262
+
263
+ ## Error Handling
264
+
265
+ The SDK provides comprehensive error handling:
266
+
267
+ - **Network Errors** - Automatic retry with fallback
268
+ - **Invalid Parameters** - Clear validation error messages
269
+ - **Timeout Handling** - Configurable request timeouts
270
+ - **Quote Errors** - Detailed error information in response
271
+
272
+ ## License
273
+
274
+ ISC
@@ -0,0 +1,351 @@
1
+ /**
2
+ * SwapClient - Unified client for fetching quotes from multiple sources
3
+ *
4
+ * This client combines the QuoteProvider from intents-sdk and the OneShotClient
5
+ * from money-legos to provide a unified interface for quote fetching with fallback logic.
6
+ *
7
+ * Features:
8
+ * - Intelligent fallback from intents-sdk to one-shot API
9
+ * - Comprehensive error handling and retry logic
10
+ * - Support for all major chains and protocols
11
+ * - Built-in validation and type safety
12
+ * - Configurable timeouts and retry policies
13
+ */
14
+ import { QuoteProvider } from '@shogun-sdk/intents-sdk';
15
+ import { compareAddresses, fetchQuote } from '@shogun-sdk/money-legos';
16
+ export class SwapClient {
17
+ constructor(config) {
18
+ Object.defineProperty(this, "config", {
19
+ enumerable: true,
20
+ configurable: true,
21
+ writable: true,
22
+ value: void 0
23
+ });
24
+ this.config = {
25
+ timeout: 30000,
26
+ maxRetries: 3,
27
+ retryDelay: 1000,
28
+ debug: false,
29
+ headers: {},
30
+ preferIntentsSdk: true,
31
+ ...config,
32
+ };
33
+ }
34
+ /**
35
+ * Validates the client configuration
36
+ */
37
+ validateConfig() {
38
+ if (!this.config.apiKey) {
39
+ throw new Error('API key is required');
40
+ }
41
+ if (!this.config.apiUrl) {
42
+ throw new Error('API URL is required');
43
+ }
44
+ if (this.config.timeout <= 0) {
45
+ throw new Error('Timeout must be greater than 0');
46
+ }
47
+ if (this.config.maxRetries < 0) {
48
+ throw new Error('Max retries cannot be negative');
49
+ }
50
+ }
51
+ /**
52
+ * Logs debug messages if debug mode is enabled
53
+ */
54
+ debug(message, data) {
55
+ if (this.config.debug) {
56
+ console.log(`[SwapClient] ${message}`, data || '');
57
+ }
58
+ }
59
+ /**
60
+ * Sleeps for the specified number of milliseconds
61
+ */
62
+ sleep(ms) {
63
+ return new Promise(resolve => setTimeout(resolve, ms));
64
+ }
65
+ /**
66
+ * Validates quote parameters
67
+ */
68
+ validateQuoteParams(params) {
69
+ if (!params.sourceChainId || !params.destChainId) {
70
+ throw new Error('Source and destination chain IDs are required');
71
+ }
72
+ if (!params.tokenIn || !params.tokenOut) {
73
+ throw new Error('Token addresses are required');
74
+ }
75
+ if (params.amount <= 0n) {
76
+ throw new Error('Amount must be greater than 0');
77
+ }
78
+ if (compareAddresses(params.tokenIn, params.tokenOut) && params.sourceChainId === params.destChainId) {
79
+ throw new Error('Input and output tokens cannot be the same');
80
+ }
81
+ }
82
+ /**
83
+ * Fetches a quote using the unified interface
84
+ * First tries intents-sdk QuoteProvider, then falls back to one-shot API
85
+ *
86
+ * @param params Quote parameters
87
+ * @param signal Optional AbortSignal for cancelling the request
88
+ * @returns Promise<UnifiedQuoteResponse>
89
+ */
90
+ async getQuote(params, signal) {
91
+ this.validateConfig();
92
+ this.validateQuoteParams(params);
93
+ this.debug('Fetching quote', { params });
94
+ // Determine quote source order based on configuration
95
+ const sources = this.config.preferIntentsSdk
96
+ ? ['intents-sdk', 'one-shot']
97
+ : ['one-shot', 'intents-sdk'];
98
+ for (const source of sources) {
99
+ for (let attempt = 0; attempt <= this.config.maxRetries; attempt++) {
100
+ try {
101
+ this.debug(`Attempting quote from ${source} (attempt ${attempt + 1})`);
102
+ let quote;
103
+ if (source === 'intents-sdk') {
104
+ quote = await this.getIntentsQuote(params, signal);
105
+ }
106
+ else {
107
+ quote = await this.getOneShotQuote(params, signal);
108
+ }
109
+ if (quote && !quote.error && quote.amountOut > 0n) {
110
+ this.debug(`Successfully got quote from ${source}`, { amountOut: quote.amountOut.toString() });
111
+ return quote;
112
+ }
113
+ if (attempt < this.config.maxRetries) {
114
+ this.debug(`Quote attempt ${attempt + 1} failed, retrying in ${this.config.retryDelay}ms`);
115
+ await this.sleep(this.config.retryDelay);
116
+ }
117
+ }
118
+ catch (error) {
119
+ this.debug(`Quote attempt ${attempt + 1} from ${source} failed`, error);
120
+ if (attempt < this.config.maxRetries) {
121
+ await this.sleep(this.config.retryDelay);
122
+ }
123
+ else if (source === sources[sources.length - 1]) {
124
+ // Last source and last attempt
125
+ return {
126
+ amountOut: 0n,
127
+ amountInUsd: 0,
128
+ amountOutUsd: 0,
129
+ priceImpact: 0,
130
+ slippage: 0,
131
+ provider: 'none',
132
+ rawQuote: null,
133
+ source: source,
134
+ error: error instanceof Error ? error.message : 'Unknown error occurred'
135
+ };
136
+ }
137
+ }
138
+ }
139
+ }
140
+ // This should never be reached, but just in case
141
+ return {
142
+ amountOut: 0n,
143
+ amountInUsd: 0,
144
+ amountOutUsd: 0,
145
+ priceImpact: 0,
146
+ slippage: 0,
147
+ provider: 'none',
148
+ rawQuote: null,
149
+ source: 'one-shot',
150
+ error: 'All quote sources failed'
151
+ };
152
+ }
153
+ /**
154
+ * Gets quote from intents-sdk QuoteProvider
155
+ */
156
+ async getIntentsQuote(params, _signal) {
157
+ const intentsParams = {
158
+ sourceChainId: params.sourceChainId,
159
+ destChainId: params.destChainId,
160
+ amount: params.amount,
161
+ tokenIn: params.tokenIn,
162
+ tokenOut: params.tokenOut,
163
+ };
164
+ const quote = await QuoteProvider.getQuote(intentsParams);
165
+ return {
166
+ amountOut: quote.estimatedAmountOut,
167
+ amountInUsd: quote.amountInUsd,
168
+ amountOutUsd: quote.estimatedAmountOutUsd,
169
+ amountOutReduced: quote.estimatedAmountOutReduced,
170
+ amountOutUsdReduced: quote.estimatedAmountOutUsdReduced,
171
+ estimatedAmountInAsMinStablecoinAmount: quote.estimatedAmountInAsMinStablecoinAmount,
172
+ priceImpact: 0, // QuoteProvider doesn't provide price impact directly
173
+ slippage: 0, // QuoteProvider doesn't provide slippage directly
174
+ provider: 'intents-sdk',
175
+ rawQuote: quote,
176
+ source: 'intents-sdk'
177
+ };
178
+ }
179
+ /**
180
+ * Gets quote from one-shot API
181
+ */
182
+ async getOneShotQuote(params, signal) {
183
+ const oneShotParams = {
184
+ srcChain: params.sourceChainId,
185
+ destChain: params.destChainId,
186
+ srcToken: params.tokenIn,
187
+ destToken: params.tokenOut,
188
+ amount: params.amount.toString(),
189
+ senderAddress: params.senderAddress || '',
190
+ affiliateWallet: params.affiliateWallet || '',
191
+ affiliateFee: params.affiliateFee || '0',
192
+ slippage: params.slippageBps ? params.slippageBps / 100 : 0.5, // Convert bps to percentage
193
+ destinationAddress: params.destinationAddress || '',
194
+ dstChainOrderAuthorityAddress: '',
195
+ jitoTip: params.jitoTip,
196
+ gasRefuel: params.gasRefuel,
197
+ dynamicSlippage: params.dynamicSlippage,
198
+ externalCall: params.externalCall,
199
+ };
200
+ const quote = await fetchQuote({
201
+ key: this.config.apiKey,
202
+ url: this.config.apiUrl,
203
+ }, oneShotParams, signal || new AbortController().signal);
204
+ if (quote.error) {
205
+ throw new Error(quote.error);
206
+ }
207
+ return {
208
+ amountOut: BigInt(quote.outputAmount.value),
209
+ amountInUsd: 0, // One-shot doesn't provide USD values directly
210
+ amountOutUsd: 0,
211
+ priceImpact: 0, // One-shot doesn't provide price impact directly
212
+ slippage: oneShotParams.slippage,
213
+ provider: 'one-shot',
214
+ rawQuote: quote,
215
+ source: 'one-shot'
216
+ };
217
+ }
218
+ /**
219
+ * Gets a single-chain quote from intents-sdk
220
+ * Useful for same-chain swaps
221
+ */
222
+ async getSingleChainQuote(chainId, tokenIn, tokenOut, amount, slippageBps, _signal) {
223
+ this.validateConfig();
224
+ if (!chainId || !tokenIn || !tokenOut || amount <= 0n) {
225
+ throw new Error('Invalid parameters for single-chain quote');
226
+ }
227
+ this.debug('Fetching single-chain quote', { chainId, tokenIn, tokenOut, amount: amount.toString() });
228
+ try {
229
+ const quote = await QuoteProvider.getSingleChainQuote({
230
+ chainId,
231
+ amount,
232
+ tokenIn,
233
+ tokenOut,
234
+ slippageBps,
235
+ });
236
+ this.debug('Single-chain quote successful', { amountOut: quote.amountOut.toString() });
237
+ return {
238
+ amountOut: quote.amountOut,
239
+ amountInUsd: quote.amountInUsd,
240
+ amountOutUsd: quote.amountOutUsd,
241
+ priceImpact: quote.priceImpact,
242
+ slippage: quote.slippage,
243
+ provider: quote.provider,
244
+ rawQuote: quote.rawQuote,
245
+ source: 'intents-sdk'
246
+ };
247
+ }
248
+ catch (error) {
249
+ this.debug('Single-chain quote failed', error);
250
+ return {
251
+ amountOut: 0n,
252
+ amountInUsd: 0,
253
+ amountOutUsd: 0,
254
+ priceImpact: 0,
255
+ slippage: 0,
256
+ provider: 'none',
257
+ rawQuote: null,
258
+ source: 'intents-sdk',
259
+ error: error instanceof Error ? error.message : 'Unknown error occurred'
260
+ };
261
+ }
262
+ }
263
+ /**
264
+ * Gets multiple quotes for comparison
265
+ * Useful for finding the best route
266
+ */
267
+ async getMultipleQuotes(params, signal) {
268
+ this.debug('Fetching multiple quotes', { count: params.length });
269
+ const promises = params.map(param => this.getQuote(param, signal));
270
+ const results = await Promise.allSettled(promises);
271
+ return results.map((result) => {
272
+ if (result.status === 'fulfilled') {
273
+ return result.value;
274
+ }
275
+ else {
276
+ return {
277
+ amountOut: 0n,
278
+ amountInUsd: 0,
279
+ amountOutUsd: 0,
280
+ priceImpact: 0,
281
+ slippage: 0,
282
+ provider: 'none',
283
+ rawQuote: null,
284
+ source: 'one-shot',
285
+ error: result.reason instanceof Error ? result.reason.message : 'Unknown error occurred'
286
+ };
287
+ }
288
+ });
289
+ }
290
+ /**
291
+ * Gets the best quote from multiple options
292
+ */
293
+ async getBestQuote(params, signal) {
294
+ const quotes = await this.getMultipleQuotes(params, signal);
295
+ const validQuotes = quotes.filter(quote => !quote.error && quote.amountOut > 0n);
296
+ if (validQuotes.length === 0) {
297
+ return null;
298
+ }
299
+ // Return the quote with the highest output amount
300
+ return validQuotes.reduce((best, current) => current.amountOut > best.amountOut ? current : best);
301
+ }
302
+ /**
303
+ * Estimates gas costs for a swap (EVM chains only)
304
+ */
305
+ async estimateGas(chainId, tokenIn, tokenOut, amount, _userAddress) {
306
+ this.debug('Estimating gas', { chainId, tokenIn, tokenOut, amount: amount.toString() });
307
+ try {
308
+ // This would need to be implemented based on your specific needs
309
+ // For now, return a placeholder
310
+ return {
311
+ gasEstimate: 200000n, // Typical swap gas limit
312
+ gasPrice: 20000000000n // 20 gwei
313
+ };
314
+ }
315
+ catch (error) {
316
+ this.debug('Gas estimation failed', error);
317
+ return null;
318
+ }
319
+ }
320
+ /**
321
+ * Validates if a token pair is supported for swapping
322
+ */
323
+ async isTokenPairSupported(chainId, tokenIn, tokenOut) {
324
+ try {
325
+ // Try to get a minimal quote to check if the pair is supported
326
+ const quote = await this.getSingleChainQuote(chainId, tokenIn, tokenOut, BigInt('1'), // Minimal amount
327
+ 1000 // 10% slippage for validation
328
+ );
329
+ return !quote.error && quote.amountOut > 0n;
330
+ }
331
+ catch (error) {
332
+ this.debug('Token pair validation failed', error);
333
+ return false;
334
+ }
335
+ }
336
+ /**
337
+ * Updates the client configuration
338
+ */
339
+ updateConfig(newConfig) {
340
+ Object.assign(this.config, newConfig);
341
+ this.validateConfig();
342
+ this.debug('Configuration updated', newConfig);
343
+ }
344
+ /**
345
+ * Gets the current configuration
346
+ */
347
+ getConfig() {
348
+ return { ...this.config };
349
+ }
350
+ }
351
+ //# sourceMappingURL=SwapClient.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SwapClient.js","sourceRoot":"","sources":["../../../src/client/SwapClient.ts"],"names":[],"mappings":"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"}