@snowmonster_defi/sdk 1.0.3

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,133 @@
1
+ /**
2
+ * AVAX Router SDK Types
3
+ */
4
+ interface AvaxRouterConfig {
5
+ /** API base URL (default: https://api.avaxrouter.com) */
6
+ apiUrl?: string;
7
+ /** Partner ID for fee sharing */
8
+ partnerId?: string;
9
+ /** Partner fee in basis points (max 50 = 0.50%) */
10
+ partnerFeeBps?: number;
11
+ /** Partner address to receive fees */
12
+ partnerAddress?: string;
13
+ }
14
+ interface QuoteParams {
15
+ /** Input token address or symbol */
16
+ tokenIn: string;
17
+ /** Output token address or symbol */
18
+ tokenOut: string;
19
+ /** Amount of input tokens (in human-readable format) */
20
+ amountIn: string;
21
+ }
22
+ interface QuoteResult {
23
+ /** Input token address */
24
+ tokenIn: string;
25
+ /** Output token address */
26
+ tokenOut: string;
27
+ /** Amount in (raw) */
28
+ amountIn: bigint;
29
+ /** Expected amount out (raw) */
30
+ amountOut: bigint;
31
+ /** Amount out formatted for display */
32
+ amountOutFormatted: string;
33
+ /** Best DEX for this route */
34
+ bestDex: string;
35
+ /** All quotes from different DEXes */
36
+ allQuotes: DexQuote[];
37
+ /** Price impact */
38
+ priceImpact?: number;
39
+ /** Route path (for multi-hop) */
40
+ route?: string[];
41
+ /** Protocol fee in basis points */
42
+ protocolFeeBps: number;
43
+ /** Partner fee in basis points (if applicable) */
44
+ partnerFeeBps?: number;
45
+ /** Estimated gas cost */
46
+ estimatedGas?: bigint;
47
+ }
48
+ interface DexQuote {
49
+ /** DEX name */
50
+ dex: string;
51
+ /** Output amount (raw) */
52
+ amountOut: bigint;
53
+ /** Output amount formatted */
54
+ amountOutFormatted: string;
55
+ /** Whether this quote is the best */
56
+ isBest: boolean;
57
+ }
58
+ interface SwapParams extends QuoteParams {
59
+ /** Minimum output amount (slippage protection) */
60
+ minAmountOut?: string;
61
+ /** Slippage tolerance in percent (default: 0.5) */
62
+ slippagePercent?: number;
63
+ /** Recipient address (defaults to connected wallet) */
64
+ recipient?: string;
65
+ /** Deadline in seconds (default: 1200 = 20 min) */
66
+ deadline?: number;
67
+ }
68
+ interface SwapResult {
69
+ /** Transaction hash */
70
+ txHash: string;
71
+ /** Amount of tokens swapped */
72
+ amountIn: string;
73
+ /** Amount of tokens received */
74
+ amountOut: string;
75
+ /** DEX used for the swap */
76
+ dexUsed: string;
77
+ /** Protocol fee paid */
78
+ protocolFee: string;
79
+ /** Partner fee paid (if applicable) */
80
+ partnerFee?: string;
81
+ }
82
+
83
+ /**
84
+ * useQuote Hook
85
+ *
86
+ * Fetch the best quote for a token swap
87
+ */
88
+
89
+ interface UseQuoteOptions extends QuoteParams {
90
+ /** SDK configuration */
91
+ config?: AvaxRouterConfig;
92
+ /** Auto-fetch on mount (default: true) */
93
+ autoFetch?: boolean;
94
+ /** Refresh interval in ms (default: 10000) */
95
+ refreshInterval?: number;
96
+ }
97
+ interface UseQuoteResult {
98
+ /** Quote result */
99
+ quote: QuoteResult | null;
100
+ /** Loading state */
101
+ loading: boolean;
102
+ /** Error if any */
103
+ error: Error | null;
104
+ /** Manually refetch */
105
+ refetch: () => Promise<void>;
106
+ }
107
+ declare function useQuote(options: UseQuoteOptions): UseQuoteResult;
108
+
109
+ /**
110
+ * useSwap Hook
111
+ *
112
+ * Execute a token swap
113
+ */
114
+
115
+ interface UseSwapOptions {
116
+ /** SDK configuration */
117
+ config?: AvaxRouterConfig;
118
+ }
119
+ interface UseSwapResult {
120
+ /** Execute the swap */
121
+ swap: (params: SwapParams, signer: any) => Promise<SwapResult>;
122
+ /** Transaction hash after swap */
123
+ txHash: string | null;
124
+ /** Loading state */
125
+ loading: boolean;
126
+ /** Error if any */
127
+ error: Error | null;
128
+ /** Reset state */
129
+ reset: () => void;
130
+ }
131
+ declare function useSwap(options?: UseSwapOptions): UseSwapResult;
132
+
133
+ export { type AvaxRouterConfig, type QuoteParams, type QuoteResult, type SwapParams, type SwapResult, type UseQuoteOptions, type UseQuoteResult, type UseSwapOptions, type UseSwapResult, useQuote, useSwap };
@@ -0,0 +1,270 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+
20
+ // src/react/index.ts
21
+ var react_exports = {};
22
+ __export(react_exports, {
23
+ useQuote: () => useQuote,
24
+ useSwap: () => useSwap
25
+ });
26
+ module.exports = __toCommonJS(react_exports);
27
+
28
+ // src/react/hooks/useQuote.ts
29
+ var import_react = require("react");
30
+
31
+ // src/types.ts
32
+ var API_ENDPOINTS = {
33
+ mainnet: "https://api.avaxrouter.com",
34
+ testnet: "https://api-testnet.avaxrouter.com",
35
+ local: "http://localhost:3000"
36
+ };
37
+
38
+ // src/client.ts
39
+ var AvaxRouter = class {
40
+ constructor(config = {}) {
41
+ this.apiUrl = config.apiUrl || API_ENDPOINTS.mainnet;
42
+ this.partnerId = config.partnerId;
43
+ this.partnerFeeBps = config.partnerFeeBps;
44
+ this.partnerAddress = config.partnerAddress;
45
+ if (this.partnerFeeBps && this.partnerFeeBps > 50) {
46
+ throw new Error("Partner fee cannot exceed 50 basis points (0.50%)");
47
+ }
48
+ if (this.partnerFeeBps && !this.partnerAddress) {
49
+ throw new Error("Partner address required when partner fee is set");
50
+ }
51
+ }
52
+ /**
53
+ * Get the best quote across all DEXes
54
+ */
55
+ async getBestQuote(params) {
56
+ const queryParams = new URLSearchParams({
57
+ tokenIn: params.tokenIn,
58
+ tokenOut: params.tokenOut,
59
+ amountIn: params.amountIn
60
+ });
61
+ if (this.partnerId) {
62
+ queryParams.append("partnerId", this.partnerId);
63
+ }
64
+ const response = await fetch(`${this.apiUrl}/quote?${queryParams}`);
65
+ if (!response.ok) {
66
+ const error = await response.json().catch(() => ({ message: "Unknown error" }));
67
+ throw new Error(error.message || `API error: ${response.status}`);
68
+ }
69
+ const data = await response.json();
70
+ return {
71
+ ...data,
72
+ amountIn: BigInt(data.amountIn),
73
+ amountOut: BigInt(data.amountOut),
74
+ allQuotes: data.allQuotes.map((q) => ({
75
+ ...q,
76
+ amountOut: BigInt(q.amountOut)
77
+ })),
78
+ estimatedGas: data.estimatedGas ? BigInt(data.estimatedGas) : void 0
79
+ };
80
+ }
81
+ /**
82
+ * Get quotes from all DEXes
83
+ */
84
+ async getAllQuotes(params) {
85
+ const queryParams = new URLSearchParams({
86
+ tokenIn: params.tokenIn,
87
+ tokenOut: params.tokenOut,
88
+ amountIn: params.amountIn,
89
+ allDexes: "true"
90
+ });
91
+ const response = await fetch(`${this.apiUrl}/quote?${queryParams}`);
92
+ if (!response.ok) {
93
+ const error = await response.json().catch(() => ({ message: "Unknown error" }));
94
+ throw new Error(error.message || `API error: ${response.status}`);
95
+ }
96
+ return response.json();
97
+ }
98
+ /**
99
+ * Prepare a swap transaction (returns unsigned transaction data)
100
+ */
101
+ async prepareSwap(params) {
102
+ const body = {
103
+ tokenIn: params.tokenIn,
104
+ tokenOut: params.tokenOut,
105
+ amountIn: params.amountIn,
106
+ slippagePercent: params.slippagePercent ?? 0.5,
107
+ recipient: params.recipient
108
+ };
109
+ if (this.partnerAddress && this.partnerFeeBps) {
110
+ body.partner = this.partnerAddress;
111
+ body.partnerFeeBps = this.partnerFeeBps;
112
+ }
113
+ const response = await fetch(`${this.apiUrl}/swap/prepare`, {
114
+ method: "POST",
115
+ headers: { "Content-Type": "application/json" },
116
+ body: JSON.stringify(body)
117
+ });
118
+ if (!response.ok) {
119
+ const error = await response.json().catch(() => ({ message: "Unknown error" }));
120
+ throw new Error(error.message || `API error: ${response.status}`);
121
+ }
122
+ return response.json();
123
+ }
124
+ /**
125
+ * Execute a swap (requires signer - use with ethers.js or viem)
126
+ *
127
+ * @example
128
+ * // With ethers.js
129
+ * const router = new AvaxRouter();
130
+ * const signer = await ethers.getSigner();
131
+ * const result = await router.swap({ tokenIn: 'AVAX', tokenOut: 'USDC', amountIn: '1.0' }, signer);
132
+ */
133
+ async swap(params, signer) {
134
+ const txData = await this.prepareSwap(params);
135
+ const tx = await signer.sendTransaction({
136
+ to: txData.to,
137
+ data: txData.data,
138
+ value: txData.value
139
+ });
140
+ const receipt = await tx.wait();
141
+ return {
142
+ txHash: receipt.hash,
143
+ amountIn: params.amountIn,
144
+ amountOut: "0",
145
+ // Would need to parse from logs
146
+ dexUsed: "unknown",
147
+ // Would need to parse from logs
148
+ protocolFee: "0"
149
+ };
150
+ }
151
+ /**
152
+ * Get the status of a swap transaction
153
+ */
154
+ async getSwapStatus(txHash) {
155
+ const response = await fetch(`${this.apiUrl}/swap/status/${txHash}`);
156
+ if (!response.ok) {
157
+ const error = await response.json().catch(() => ({ message: "Unknown error" }));
158
+ throw new Error(error.message || `API error: ${response.status}`);
159
+ }
160
+ const data = await response.json();
161
+ return {
162
+ ...data,
163
+ gasUsed: data.gasUsed ? BigInt(data.gasUsed) : void 0
164
+ };
165
+ }
166
+ /**
167
+ * Get list of supported tokens
168
+ */
169
+ async getSupportedTokens() {
170
+ const response = await fetch(`${this.apiUrl}/tokens`);
171
+ if (!response.ok) {
172
+ throw new Error(`API error: ${response.status}`);
173
+ }
174
+ return response.json();
175
+ }
176
+ /**
177
+ * Get list of supported DEXes
178
+ */
179
+ async getSupportedDexes() {
180
+ const response = await fetch(`${this.apiUrl}/dexes`);
181
+ if (!response.ok) {
182
+ throw new Error(`API error: ${response.status}`);
183
+ }
184
+ return response.json();
185
+ }
186
+ };
187
+
188
+ // src/react/hooks/useQuote.ts
189
+ function useQuote(options) {
190
+ const { config, autoFetch = true, refreshInterval = 1e4, ...quoteParams } = options;
191
+ const [quote, setQuote] = (0, import_react.useState)(null);
192
+ const [loading, setLoading] = (0, import_react.useState)(false);
193
+ const [error, setError] = (0, import_react.useState)(null);
194
+ const client = new AvaxRouter(config);
195
+ const fetchQuote = (0, import_react.useCallback)(async () => {
196
+ if (!quoteParams.tokenIn || !quoteParams.tokenOut || !quoteParams.amountIn) {
197
+ return;
198
+ }
199
+ setLoading(true);
200
+ setError(null);
201
+ try {
202
+ const result = await client.getBestQuote(quoteParams);
203
+ setQuote(result);
204
+ } catch (err) {
205
+ setError(err instanceof Error ? err : new Error(String(err)));
206
+ } finally {
207
+ setLoading(false);
208
+ }
209
+ }, [quoteParams.tokenIn, quoteParams.tokenOut, quoteParams.amountIn, config]);
210
+ (0, import_react.useEffect)(() => {
211
+ if (autoFetch) {
212
+ fetchQuote();
213
+ }
214
+ }, [fetchQuote, autoFetch]);
215
+ (0, import_react.useEffect)(() => {
216
+ if (!autoFetch || !refreshInterval) return;
217
+ const interval = setInterval(fetchQuote, refreshInterval);
218
+ return () => clearInterval(interval);
219
+ }, [autoFetch, refreshInterval, fetchQuote]);
220
+ return {
221
+ quote,
222
+ loading,
223
+ error,
224
+ refetch: fetchQuote
225
+ };
226
+ }
227
+
228
+ // src/react/hooks/useSwap.ts
229
+ var import_react2 = require("react");
230
+ function useSwap(options = {}) {
231
+ const { config } = options;
232
+ const [txHash, setTxHash] = (0, import_react2.useState)(null);
233
+ const [loading, setLoading] = (0, import_react2.useState)(false);
234
+ const [error, setError] = (0, import_react2.useState)(null);
235
+ const client = new AvaxRouter(config);
236
+ const swap = (0, import_react2.useCallback)(async (params, signer) => {
237
+ setLoading(true);
238
+ setError(null);
239
+ setTxHash(null);
240
+ try {
241
+ const result = await client.swap(params, signer);
242
+ setTxHash(result.txHash);
243
+ return result;
244
+ } catch (err) {
245
+ const error2 = err instanceof Error ? err : new Error(String(err));
246
+ setError(error2);
247
+ throw error2;
248
+ } finally {
249
+ setLoading(false);
250
+ }
251
+ }, [config]);
252
+ const reset = (0, import_react2.useCallback)(() => {
253
+ setTxHash(null);
254
+ setLoading(false);
255
+ setError(null);
256
+ }, []);
257
+ return {
258
+ swap,
259
+ txHash,
260
+ loading,
261
+ error,
262
+ reset
263
+ };
264
+ }
265
+ // Annotate the CommonJS export names for ESM import in node:
266
+ 0 && (module.exports = {
267
+ useQuote,
268
+ useSwap
269
+ });
270
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/react/index.ts","../../src/react/hooks/useQuote.ts","../../src/types.ts","../../src/client.ts","../../src/react/hooks/useSwap.ts"],"sourcesContent":["/**\n * AVAX Router React SDK\n * \n * React hooks and components for AVAX Router\n * \n * @example\n * import { useQuote, useSwap } from '@avax-router/sdk/react';\n * \n * function MySwapComponent() {\n * const { quote, loading } = useQuote({\n * tokenIn: 'AVAX',\n * tokenOut: 'USDC',\n * amountIn: '1.0',\n * });\n * \n * const { swap, loading: swapping } = useSwap();\n * \n * return (\n * // ... your UI\n * );\n * }\n */\n\n// Hooks\nexport { useQuote } from './hooks/useQuote';\nexport type { UseQuoteOptions, UseQuoteResult } from './hooks/useQuote';\n\nexport { useSwap } from './hooks/useSwap';\nexport type { UseSwapOptions, UseSwapResult } from './hooks/useSwap';\n\n// Re-export types from core\nexport type {\n AvaxRouterConfig,\n QuoteParams,\n QuoteResult,\n SwapParams,\n SwapResult,\n} from '..';","/**\n * useQuote Hook\n * \n * Fetch the best quote for a token swap\n */\n\nimport { useState, useEffect, useCallback } from 'react';\nimport { AvaxRouter, QuoteParams, QuoteResult, AvaxRouterConfig } from '../..';\n\nexport interface UseQuoteOptions extends QuoteParams {\n /** SDK configuration */\n config?: AvaxRouterConfig;\n /** Auto-fetch on mount (default: true) */\n autoFetch?: boolean;\n /** Refresh interval in ms (default: 10000) */\n refreshInterval?: number;\n}\n\nexport interface UseQuoteResult {\n /** Quote result */\n quote: QuoteResult | null;\n /** Loading state */\n loading: boolean;\n /** Error if any */\n error: Error | null;\n /** Manually refetch */\n refetch: () => Promise<void>;\n}\n\nexport function useQuote(options: UseQuoteOptions): UseQuoteResult {\n const { config, autoFetch = true, refreshInterval = 10000, ...quoteParams } = options;\n \n const [quote, setQuote] = useState<QuoteResult | null>(null);\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n\n const client = new AvaxRouter(config);\n\n const fetchQuote = useCallback(async () => {\n if (!quoteParams.tokenIn || !quoteParams.tokenOut || !quoteParams.amountIn) {\n return;\n }\n\n setLoading(true);\n setError(null);\n\n try {\n const result = await client.getBestQuote(quoteParams);\n setQuote(result);\n } catch (err) {\n setError(err instanceof Error ? err : new Error(String(err)));\n } finally {\n setLoading(false);\n }\n }, [quoteParams.tokenIn, quoteParams.tokenOut, quoteParams.amountIn, config]);\n\n useEffect(() => {\n if (autoFetch) {\n fetchQuote();\n }\n }, [fetchQuote, autoFetch]);\n\n // Auto-refresh\n useEffect(() => {\n if (!autoFetch || !refreshInterval) return;\n\n const interval = setInterval(fetchQuote, refreshInterval);\n return () => clearInterval(interval);\n }, [autoFetch, refreshInterval, fetchQuote]);\n\n return {\n quote,\n loading,\n error,\n refetch: fetchQuote,\n };\n}","/**\n * AVAX Router SDK Types\n */\n\nexport interface AvaxRouterConfig {\n /** API base URL (default: https://api.avaxrouter.com) */\n apiUrl?: string;\n /** Partner ID for fee sharing */\n partnerId?: string;\n /** Partner fee in basis points (max 50 = 0.50%) */\n partnerFeeBps?: number;\n /** Partner address to receive fees */\n partnerAddress?: string;\n}\n\nexport interface TokenInfo {\n address: string;\n symbol: string;\n name: string;\n decimals: number;\n logoURI?: string;\n}\n\nexport interface QuoteParams {\n /** Input token address or symbol */\n tokenIn: string;\n /** Output token address or symbol */\n tokenOut: string;\n /** Amount of input tokens (in human-readable format) */\n amountIn: string;\n}\n\nexport interface QuoteResult {\n /** Input token address */\n tokenIn: string;\n /** Output token address */\n tokenOut: string;\n /** Amount in (raw) */\n amountIn: bigint;\n /** Expected amount out (raw) */\n amountOut: bigint;\n /** Amount out formatted for display */\n amountOutFormatted: string;\n /** Best DEX for this route */\n bestDex: string;\n /** All quotes from different DEXes */\n allQuotes: DexQuote[];\n /** Price impact */\n priceImpact?: number;\n /** Route path (for multi-hop) */\n route?: string[];\n /** Protocol fee in basis points */\n protocolFeeBps: number;\n /** Partner fee in basis points (if applicable) */\n partnerFeeBps?: number;\n /** Estimated gas cost */\n estimatedGas?: bigint;\n}\n\nexport interface DexQuote {\n /** DEX name */\n dex: string;\n /** Output amount (raw) */\n amountOut: bigint;\n /** Output amount formatted */\n amountOutFormatted: string;\n /** Whether this quote is the best */\n isBest: boolean;\n}\n\nexport interface SwapParams extends QuoteParams {\n /** Minimum output amount (slippage protection) */\n minAmountOut?: string;\n /** Slippage tolerance in percent (default: 0.5) */\n slippagePercent?: number;\n /** Recipient address (defaults to connected wallet) */\n recipient?: string;\n /** Deadline in seconds (default: 1200 = 20 min) */\n deadline?: number;\n}\n\nexport interface SwapResult {\n /** Transaction hash */\n txHash: string;\n /** Amount of tokens swapped */\n amountIn: string;\n /** Amount of tokens received */\n amountOut: string;\n /** DEX used for the swap */\n dexUsed: string;\n /** Protocol fee paid */\n protocolFee: string;\n /** Partner fee paid (if applicable) */\n partnerFee?: string;\n}\n\nexport interface SwapStatus {\n status: 'pending' | 'confirmed' | 'failed';\n txHash?: string;\n blockNumber?: number;\n gasUsed?: bigint;\n amountIn?: string;\n amountOut?: string;\n error?: string;\n}\n\n// Avalanche token addresses\nexport const AVALANCHE_TOKENS = {\n AVAX: '0x0000000000000000000000000000000000000000',\n WAVAX: '0xB31f66AA3C1e785363F0875A1B74E27b85FD66c7',\n USDC: '0xB97EF9Ef8734C71904D8002F8b6Bc66Dd9c48a6E',\n USDT: '0x9702230A8Ea53601f5cD2dc00fDBc13d4dF4A8c7',\n JOE: '0x6e84a6216eA6dACC71eE8E6b0a5B7322EEbC0fDd',\n PNG: '0x60781C2586D68229fde47564546784ab3fACA982',\n} as const;\n\n// DexRouter contract address on Avalanche\nexport const DEX_ROUTER_ADDRESS = '0xYourDeployedContractAddress' as `0x${string}`;\n\n// API endpoints\nexport const API_ENDPOINTS = {\n mainnet: 'https://api.avaxrouter.com',\n testnet: 'https://api-testnet.avaxrouter.com',\n local: 'http://localhost:3000',\n} as const;","/**\n * AVAX Router SDK Client\n * \n * Main entry point for interacting with AVAX Router\n */\n\nimport {\n AvaxRouterConfig,\n QuoteParams,\n QuoteResult,\n SwapParams,\n SwapResult,\n SwapStatus,\n API_ENDPOINTS,\n} from './types';\n\nexport class AvaxRouter {\n private apiUrl: string;\n private partnerId?: string;\n private partnerFeeBps?: number;\n private partnerAddress?: string;\n\n constructor(config: AvaxRouterConfig = {}) {\n this.apiUrl = config.apiUrl || API_ENDPOINTS.mainnet;\n this.partnerId = config.partnerId;\n this.partnerFeeBps = config.partnerFeeBps;\n this.partnerAddress = config.partnerAddress;\n\n // Validate partner config\n if (this.partnerFeeBps && this.partnerFeeBps > 50) {\n throw new Error('Partner fee cannot exceed 50 basis points (0.50%)');\n }\n if (this.partnerFeeBps && !this.partnerAddress) {\n throw new Error('Partner address required when partner fee is set');\n }\n }\n\n /**\n * Get the best quote across all DEXes\n */\n async getBestQuote(params: QuoteParams): Promise<QuoteResult> {\n const queryParams = new URLSearchParams({\n tokenIn: params.tokenIn,\n tokenOut: params.tokenOut,\n amountIn: params.amountIn,\n });\n\n if (this.partnerId) {\n queryParams.append('partnerId', this.partnerId);\n }\n\n const response = await fetch(`${this.apiUrl}/quote?${queryParams}`);\n \n if (!response.ok) {\n const error = await response.json().catch(() => ({ message: 'Unknown error' }));\n throw new Error(error.message || `API error: ${response.status}`);\n }\n\n const data = await response.json();\n \n return {\n ...data,\n amountIn: BigInt(data.amountIn),\n amountOut: BigInt(data.amountOut),\n allQuotes: data.allQuotes.map((q: any) => ({\n ...q,\n amountOut: BigInt(q.amountOut),\n })),\n estimatedGas: data.estimatedGas ? BigInt(data.estimatedGas) : undefined,\n };\n }\n\n /**\n * Get quotes from all DEXes\n */\n async getAllQuotes(params: QuoteParams): Promise<QuoteResult[]> {\n const queryParams = new URLSearchParams({\n tokenIn: params.tokenIn,\n tokenOut: params.tokenOut,\n amountIn: params.amountIn,\n allDexes: 'true',\n });\n\n const response = await fetch(`${this.apiUrl}/quote?${queryParams}`);\n \n if (!response.ok) {\n const error = await response.json().catch(() => ({ message: 'Unknown error' }));\n throw new Error(error.message || `API error: ${response.status}`);\n }\n\n return response.json();\n }\n\n /**\n * Prepare a swap transaction (returns unsigned transaction data)\n */\n async prepareSwap(params: SwapParams): Promise<{\n to: string;\n data: string;\n value: string;\n gasLimit?: string;\n }> {\n const body: any = {\n tokenIn: params.tokenIn,\n tokenOut: params.tokenOut,\n amountIn: params.amountIn,\n slippagePercent: params.slippagePercent ?? 0.5,\n recipient: params.recipient,\n };\n\n if (this.partnerAddress && this.partnerFeeBps) {\n body.partner = this.partnerAddress;\n body.partnerFeeBps = this.partnerFeeBps;\n }\n\n const response = await fetch(`${this.apiUrl}/swap/prepare`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(body),\n });\n\n if (!response.ok) {\n const error = await response.json().catch(() => ({ message: 'Unknown error' }));\n throw new Error(error.message || `API error: ${response.status}`);\n }\n\n return response.json();\n }\n\n /**\n * Execute a swap (requires signer - use with ethers.js or viem)\n * \n * @example\n * // With ethers.js\n * const router = new AvaxRouter();\n * const signer = await ethers.getSigner();\n * const result = await router.swap({ tokenIn: 'AVAX', tokenOut: 'USDC', amountIn: '1.0' }, signer);\n */\n async swap(params: SwapParams, signer: any): Promise<SwapResult> {\n // Prepare the transaction\n const txData = await this.prepareSwap(params);\n \n // Execute via signer\n const tx = await signer.sendTransaction({\n to: txData.to,\n data: txData.data,\n value: txData.value,\n });\n\n // Wait for confirmation\n const receipt = await tx.wait();\n\n return {\n txHash: receipt.hash,\n amountIn: params.amountIn,\n amountOut: '0', // Would need to parse from logs\n dexUsed: 'unknown', // Would need to parse from logs\n protocolFee: '0',\n };\n }\n\n /**\n * Get the status of a swap transaction\n */\n async getSwapStatus(txHash: string): Promise<SwapStatus> {\n const response = await fetch(`${this.apiUrl}/swap/status/${txHash}`);\n \n if (!response.ok) {\n const error = await response.json().catch(() => ({ message: 'Unknown error' }));\n throw new Error(error.message || `API error: ${response.status}`);\n }\n\n const data = await response.json();\n \n return {\n ...data,\n gasUsed: data.gasUsed ? BigInt(data.gasUsed) : undefined,\n };\n }\n\n /**\n * Get list of supported tokens\n */\n async getSupportedTokens(): Promise<Array<{\n address: string;\n symbol: string;\n name: string;\n decimals: number;\n logoURI?: string;\n }>> {\n const response = await fetch(`${this.apiUrl}/tokens`);\n \n if (!response.ok) {\n throw new Error(`API error: ${response.status}`);\n }\n\n return response.json();\n }\n\n /**\n * Get list of supported DEXes\n */\n async getSupportedDexes(): Promise<Array<{\n name: string;\n adapter: string;\n version: string;\n }>> {\n const response = await fetch(`${this.apiUrl}/dexes`);\n \n if (!response.ok) {\n throw new Error(`API error: ${response.status}`);\n }\n\n return response.json();\n }\n}\n\n// Export singleton for convenience\nlet defaultClient: AvaxRouter | null = null;\n\nexport function getClient(config?: AvaxRouterConfig): AvaxRouter {\n if (!defaultClient || config) {\n defaultClient = new AvaxRouter(config);\n }\n return defaultClient;\n}","/**\n * useSwap Hook\n * \n * Execute a token swap\n */\n\nimport { useState, useCallback } from 'react';\nimport { AvaxRouter, SwapParams, SwapResult, AvaxRouterConfig } from '../..';\n\nexport interface UseSwapOptions {\n /** SDK configuration */\n config?: AvaxRouterConfig;\n}\n\nexport interface UseSwapResult {\n /** Execute the swap */\n swap: (params: SwapParams, signer: any) => Promise<SwapResult>;\n /** Transaction hash after swap */\n txHash: string | null;\n /** Loading state */\n loading: boolean;\n /** Error if any */\n error: Error | null;\n /** Reset state */\n reset: () => void;\n}\n\nexport function useSwap(options: UseSwapOptions = {}): UseSwapResult {\n const { config } = options;\n \n const [txHash, setTxHash] = useState<string | null>(null);\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n\n const client = new AvaxRouter(config);\n\n const swap = useCallback(async (params: SwapParams, signer: any): Promise<SwapResult> => {\n setLoading(true);\n setError(null);\n setTxHash(null);\n\n try {\n const result = await client.swap(params, signer);\n setTxHash(result.txHash);\n return result;\n } catch (err) {\n const error = err instanceof Error ? err : new Error(String(err));\n setError(error);\n throw error;\n } finally {\n setLoading(false);\n }\n }, [config]);\n\n const reset = useCallback(() => {\n setTxHash(null);\n setLoading(false);\n setError(null);\n }, []);\n\n return {\n swap,\n txHash,\n loading,\n error,\n reset,\n };\n}"],"mappings":"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","names":["import_react","error"]}
@@ -0,0 +1,242 @@
1
+ // src/react/hooks/useQuote.ts
2
+ import { useState, useEffect, useCallback } from "react";
3
+
4
+ // src/types.ts
5
+ var API_ENDPOINTS = {
6
+ mainnet: "https://api.avaxrouter.com",
7
+ testnet: "https://api-testnet.avaxrouter.com",
8
+ local: "http://localhost:3000"
9
+ };
10
+
11
+ // src/client.ts
12
+ var AvaxRouter = class {
13
+ constructor(config = {}) {
14
+ this.apiUrl = config.apiUrl || API_ENDPOINTS.mainnet;
15
+ this.partnerId = config.partnerId;
16
+ this.partnerFeeBps = config.partnerFeeBps;
17
+ this.partnerAddress = config.partnerAddress;
18
+ if (this.partnerFeeBps && this.partnerFeeBps > 50) {
19
+ throw new Error("Partner fee cannot exceed 50 basis points (0.50%)");
20
+ }
21
+ if (this.partnerFeeBps && !this.partnerAddress) {
22
+ throw new Error("Partner address required when partner fee is set");
23
+ }
24
+ }
25
+ /**
26
+ * Get the best quote across all DEXes
27
+ */
28
+ async getBestQuote(params) {
29
+ const queryParams = new URLSearchParams({
30
+ tokenIn: params.tokenIn,
31
+ tokenOut: params.tokenOut,
32
+ amountIn: params.amountIn
33
+ });
34
+ if (this.partnerId) {
35
+ queryParams.append("partnerId", this.partnerId);
36
+ }
37
+ const response = await fetch(`${this.apiUrl}/quote?${queryParams}`);
38
+ if (!response.ok) {
39
+ const error = await response.json().catch(() => ({ message: "Unknown error" }));
40
+ throw new Error(error.message || `API error: ${response.status}`);
41
+ }
42
+ const data = await response.json();
43
+ return {
44
+ ...data,
45
+ amountIn: BigInt(data.amountIn),
46
+ amountOut: BigInt(data.amountOut),
47
+ allQuotes: data.allQuotes.map((q) => ({
48
+ ...q,
49
+ amountOut: BigInt(q.amountOut)
50
+ })),
51
+ estimatedGas: data.estimatedGas ? BigInt(data.estimatedGas) : void 0
52
+ };
53
+ }
54
+ /**
55
+ * Get quotes from all DEXes
56
+ */
57
+ async getAllQuotes(params) {
58
+ const queryParams = new URLSearchParams({
59
+ tokenIn: params.tokenIn,
60
+ tokenOut: params.tokenOut,
61
+ amountIn: params.amountIn,
62
+ allDexes: "true"
63
+ });
64
+ const response = await fetch(`${this.apiUrl}/quote?${queryParams}`);
65
+ if (!response.ok) {
66
+ const error = await response.json().catch(() => ({ message: "Unknown error" }));
67
+ throw new Error(error.message || `API error: ${response.status}`);
68
+ }
69
+ return response.json();
70
+ }
71
+ /**
72
+ * Prepare a swap transaction (returns unsigned transaction data)
73
+ */
74
+ async prepareSwap(params) {
75
+ const body = {
76
+ tokenIn: params.tokenIn,
77
+ tokenOut: params.tokenOut,
78
+ amountIn: params.amountIn,
79
+ slippagePercent: params.slippagePercent ?? 0.5,
80
+ recipient: params.recipient
81
+ };
82
+ if (this.partnerAddress && this.partnerFeeBps) {
83
+ body.partner = this.partnerAddress;
84
+ body.partnerFeeBps = this.partnerFeeBps;
85
+ }
86
+ const response = await fetch(`${this.apiUrl}/swap/prepare`, {
87
+ method: "POST",
88
+ headers: { "Content-Type": "application/json" },
89
+ body: JSON.stringify(body)
90
+ });
91
+ if (!response.ok) {
92
+ const error = await response.json().catch(() => ({ message: "Unknown error" }));
93
+ throw new Error(error.message || `API error: ${response.status}`);
94
+ }
95
+ return response.json();
96
+ }
97
+ /**
98
+ * Execute a swap (requires signer - use with ethers.js or viem)
99
+ *
100
+ * @example
101
+ * // With ethers.js
102
+ * const router = new AvaxRouter();
103
+ * const signer = await ethers.getSigner();
104
+ * const result = await router.swap({ tokenIn: 'AVAX', tokenOut: 'USDC', amountIn: '1.0' }, signer);
105
+ */
106
+ async swap(params, signer) {
107
+ const txData = await this.prepareSwap(params);
108
+ const tx = await signer.sendTransaction({
109
+ to: txData.to,
110
+ data: txData.data,
111
+ value: txData.value
112
+ });
113
+ const receipt = await tx.wait();
114
+ return {
115
+ txHash: receipt.hash,
116
+ amountIn: params.amountIn,
117
+ amountOut: "0",
118
+ // Would need to parse from logs
119
+ dexUsed: "unknown",
120
+ // Would need to parse from logs
121
+ protocolFee: "0"
122
+ };
123
+ }
124
+ /**
125
+ * Get the status of a swap transaction
126
+ */
127
+ async getSwapStatus(txHash) {
128
+ const response = await fetch(`${this.apiUrl}/swap/status/${txHash}`);
129
+ if (!response.ok) {
130
+ const error = await response.json().catch(() => ({ message: "Unknown error" }));
131
+ throw new Error(error.message || `API error: ${response.status}`);
132
+ }
133
+ const data = await response.json();
134
+ return {
135
+ ...data,
136
+ gasUsed: data.gasUsed ? BigInt(data.gasUsed) : void 0
137
+ };
138
+ }
139
+ /**
140
+ * Get list of supported tokens
141
+ */
142
+ async getSupportedTokens() {
143
+ const response = await fetch(`${this.apiUrl}/tokens`);
144
+ if (!response.ok) {
145
+ throw new Error(`API error: ${response.status}`);
146
+ }
147
+ return response.json();
148
+ }
149
+ /**
150
+ * Get list of supported DEXes
151
+ */
152
+ async getSupportedDexes() {
153
+ const response = await fetch(`${this.apiUrl}/dexes`);
154
+ if (!response.ok) {
155
+ throw new Error(`API error: ${response.status}`);
156
+ }
157
+ return response.json();
158
+ }
159
+ };
160
+
161
+ // src/react/hooks/useQuote.ts
162
+ function useQuote(options) {
163
+ const { config, autoFetch = true, refreshInterval = 1e4, ...quoteParams } = options;
164
+ const [quote, setQuote] = useState(null);
165
+ const [loading, setLoading] = useState(false);
166
+ const [error, setError] = useState(null);
167
+ const client = new AvaxRouter(config);
168
+ const fetchQuote = useCallback(async () => {
169
+ if (!quoteParams.tokenIn || !quoteParams.tokenOut || !quoteParams.amountIn) {
170
+ return;
171
+ }
172
+ setLoading(true);
173
+ setError(null);
174
+ try {
175
+ const result = await client.getBestQuote(quoteParams);
176
+ setQuote(result);
177
+ } catch (err) {
178
+ setError(err instanceof Error ? err : new Error(String(err)));
179
+ } finally {
180
+ setLoading(false);
181
+ }
182
+ }, [quoteParams.tokenIn, quoteParams.tokenOut, quoteParams.amountIn, config]);
183
+ useEffect(() => {
184
+ if (autoFetch) {
185
+ fetchQuote();
186
+ }
187
+ }, [fetchQuote, autoFetch]);
188
+ useEffect(() => {
189
+ if (!autoFetch || !refreshInterval) return;
190
+ const interval = setInterval(fetchQuote, refreshInterval);
191
+ return () => clearInterval(interval);
192
+ }, [autoFetch, refreshInterval, fetchQuote]);
193
+ return {
194
+ quote,
195
+ loading,
196
+ error,
197
+ refetch: fetchQuote
198
+ };
199
+ }
200
+
201
+ // src/react/hooks/useSwap.ts
202
+ import { useState as useState2, useCallback as useCallback2 } from "react";
203
+ function useSwap(options = {}) {
204
+ const { config } = options;
205
+ const [txHash, setTxHash] = useState2(null);
206
+ const [loading, setLoading] = useState2(false);
207
+ const [error, setError] = useState2(null);
208
+ const client = new AvaxRouter(config);
209
+ const swap = useCallback2(async (params, signer) => {
210
+ setLoading(true);
211
+ setError(null);
212
+ setTxHash(null);
213
+ try {
214
+ const result = await client.swap(params, signer);
215
+ setTxHash(result.txHash);
216
+ return result;
217
+ } catch (err) {
218
+ const error2 = err instanceof Error ? err : new Error(String(err));
219
+ setError(error2);
220
+ throw error2;
221
+ } finally {
222
+ setLoading(false);
223
+ }
224
+ }, [config]);
225
+ const reset = useCallback2(() => {
226
+ setTxHash(null);
227
+ setLoading(false);
228
+ setError(null);
229
+ }, []);
230
+ return {
231
+ swap,
232
+ txHash,
233
+ loading,
234
+ error,
235
+ reset
236
+ };
237
+ }
238
+ export {
239
+ useQuote,
240
+ useSwap
241
+ };
242
+ //# sourceMappingURL=index.mjs.map