@diviswap/sdk 1.7.24 → 1.7.26
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/dist/cli/index.js +1 -1
- package/dist/cli/templates/nextjs-app/kyc-wizard.tsx.hbs +4 -3
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +1 -1
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
- package/src/cli/templates/nextjs-app/kyc-wizard.tsx.hbs +4 -3
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/errors.ts","../src/modules/auth.ts","../src/modules/payees.ts","../src/constants/addresses.ts","../src/modules/transactions.ts","../src/modules/kyc.ts","../src/modules/fees.ts","../src/types/addresses.ts","../src/modules/addresses.ts","../src/modules/webhooks.ts","../src/api/token-manager.ts","../src/auth/partner-auth.ts","../src/api/unified-client.ts","../src/client.ts","../src/integrations/wallet.ts","../src/utils/web3.ts"],"names":["crypto"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Custom error classes for Diviswap SDK\n */\n\nexport class DiviswapError extends Error {\n constructor(\n message: string,\n public code?: string,\n public statusCode?: number,\n public details?: any\n ) {\n super(message);\n this.name = 'DiviswapError';\n Object.setPrototypeOf(this, DiviswapError.prototype);\n }\n}\n\nexport class AuthenticationError extends DiviswapError {\n constructor(message: string, details?: any) {\n super(message, 'AUTHENTICATION_ERROR', 401, details);\n this.name = 'AuthenticationError';\n }\n}\n\nexport class ValidationError extends DiviswapError {\n constructor(message: string, details?: any) {\n super(message, 'VALIDATION_ERROR', 400, details);\n this.name = 'ValidationError';\n }\n}\n\nexport class NetworkError extends DiviswapError {\n constructor(message: string, details?: any) {\n super(message, 'NETWORK_ERROR', undefined, details);\n this.name = 'NetworkError';\n }\n}\n\nexport class ConfigurationError extends DiviswapError {\n constructor(message: string, details?: any) {\n super(message, 'CONFIGURATION_ERROR', undefined, details);\n this.name = 'ConfigurationError';\n }\n}\n\n// Legacy alias for backward compatibility\n/** @deprecated Use DiviswapError instead */\nexport const LiberExError = DiviswapError;\n","/**\n * Authentication module for Diviswap SDK\n */\n\nimport { UnifiedApiClient } from '../api/unified-client';\nimport { AuthCredentials, RegisterRequest, AuthResponse, User, ApiResponse } from '../types';\nimport { TokenData } from '../api/token-manager';\n\nexport class AuthModule {\n constructor(private client: UnifiedApiClient) {\n // Set up refresh callback for user auth mode\n this.client.setRefreshCallback(this.refreshToken.bind(this));\n }\n\n /**\n * Register a new user\n * \n * @example\n * ```typescript\n * const { user, accessToken } = await diviswap.auth.register({\n * email: 'user@example.com',\n * password: 'secure-password',\n * firstName: 'John',\n * lastName: 'Doe'\n * });\n * ```\n */\n async register(data: RegisterRequest): Promise<AuthResponse> {\n // The backend expects snake_case fields and REQUIRES individual object\n const requestData: any = {\n email: data.email,\n password: data.password,\n first_name: data.firstName || 'Test',\n last_name: data.lastName || 'User',\n // Individual object is REQUIRED by the backend\n individual: {\n // Use 'USA' (3-letter code) as seen in working lbx-landing implementation\n residential_country_code: 'USA',\n residential_address_line_one: '123 Main Street',\n residential_address_line_two: '',\n residential_city: 'Anytown', \n residential_state: 'CA',\n residential_postal_code: '12345',\n id_type: 'ssn', // Add id_type field as seen in lbx-landing\n id_country_code: 'USA',\n dob: '1990-01-01',\n id_number: '123456789' // Remove dashes from SSN like lbx-landing does\n }\n };\n\n // Allow override of individual data if provided\n if (data.individual) {\n requestData.individual = data.individual;\n }\n\n if (data.phone) requestData.phone = data.phone;\n if (data.referralCode) requestData.referral_code = data.referralCode;\n\n const response = await this.client.post<any>(\n '/api/v1/register',\n requestData,\n { useApiKey: true }\n );\n\n // Map backend response to SDK format\n const authResponse: AuthResponse = {\n accessToken: response.access_token || response.accessToken,\n refreshToken: response.refresh_token || response.refreshToken,\n user: response.user || { id: response.user_id || response.id, email: data.email }\n };\n\n // Store tokens\n if (authResponse.accessToken) {\n this.client.setTokens(authResponse.accessToken, authResponse.refreshToken);\n }\n\n return authResponse;\n }\n\n /**\n * Login an existing user\n * \n * @example\n * ```typescript\n * const { user, accessToken } = await diviswap.auth.login({\n * email: 'user@example.com',\n * password: 'secure-password'\n * });\n * ```\n */\n async login(credentials: AuthCredentials): Promise<AuthResponse> {\n const response = await this.client.post<any>(\n '/api/v1/login',\n credentials,\n { useApiKey: true } // useApiKey: true means use API key auth, not JWT\n );\n\n // Map backend response to SDK format\n const authResponse: AuthResponse = {\n accessToken: response.access_token || response.accessToken,\n refreshToken: response.refresh_token || response.refreshToken,\n user: response.user || { id: response.user_id || response.id, email: credentials.email }\n };\n\n // Store tokens\n if (authResponse.accessToken) {\n this.client.setTokens(authResponse.accessToken, authResponse.refreshToken);\n }\n\n return authResponse;\n }\n\n /**\n * Get current user profile\n * \n * @example\n * ```typescript\n * const user = await diviswap.auth.getProfile();\n * console.log(user.email, user.kycStatus);\n * ```\n * \n * Note: This endpoint is not yet available in the v1 API\n */\n async getProfile(): Promise<User> {\n throw new Error('User profile endpoint not available in v1 API yet');\n }\n\n /**\n * Update user profile\n * \n * @example\n * ```typescript\n * const updatedUser = await diviswap.auth.updateProfile({\n * firstName: 'Jane',\n * lastName: 'Smith'\n * });\n * ```\n * \n * Note: This endpoint is not yet available in the v1 API\n */\n async updateProfile(_data: Partial<User>): Promise<User> {\n throw new Error('Update profile endpoint not available in v1 API yet');\n }\n\n /**\n * Request password reset\n * \n * @example\n * ```typescript\n * await diviswap.auth.requestPasswordReset('user@example.com');\n * ```\n * \n * Note: This endpoint is not yet available in the v1 API\n */\n async requestPasswordReset(_email: string): Promise<ApiResponse> {\n throw new Error('Password reset endpoint not available in v1 API yet');\n }\n\n /**\n * Set new password with reset token\n * \n * @example\n * ```typescript\n * await diviswap.auth.setPassword('reset-token', 'new-secure-password');\n * ```\n * \n * Note: This endpoint is not yet available in the v1 API\n */\n async setPassword(_token: string, _password: string): Promise<ApiResponse> {\n throw new Error('Set password endpoint not available in v1 API yet');\n }\n\n /**\n * Logout current user\n * \n * @example\n * ```typescript\n * await diviswap.auth.logout();\n * ```\n */\n async logout(): Promise<void> {\n // Clear stored tokens\n this.client.clearTokens();\n }\n\n /**\n * Get compliance status\n * @deprecated Use diviswap.kyc.getComplianceStatus() instead\n */\n async getComplianceStatus(): Promise<any> {\n console.warn('auth.getComplianceStatus() is deprecated. Use kyc.getComplianceStatus() instead.');\n throw new Error('Compliance status endpoint not available in v1 API yet');\n }\n\n /**\n * Check if user is authenticated\n */\n isAuthenticated(): boolean {\n return !!this.client.tokenManager.getAccessToken();\n }\n\n /**\n * Refresh access token (internal)\n * \n * Note: This endpoint is not yet available in the v1 API\n */\n private async refreshToken(_refreshToken: string): Promise<TokenData> {\n throw new Error('Token refresh endpoint not available in v1 API yet');\n }\n}","/**\n * Payees module for managing bank accounts\n */\n\nimport { UnifiedApiClient } from '../api/unified-client';\nimport { Payee, CreatePayeeRequest, ApiResponse } from '../types';\n\nexport interface VerifyPayeeRequest {\n amount1: number;\n amount2: number;\n}\n\nexport class PayeesModule {\n constructor(private client: UnifiedApiClient) {}\n\n\n /**\n * Create a new payee (bank account)\n * \n * @example\n * ```typescript\n * // Bank account\n * const bankAccount = await diviswap.payees.create({\n * nickname: 'My Checking',\n * accountNumber: '123456789',\n * routingNumber: '021000021',\n * accountType: 'checking',\n * setAsDefault: true\n * });\n * \n * // Debit card\n * const debitCard = await diviswap.payees.create({\n * nickname: 'My Debit Card',\n * accountType: 'debit_card',\n * debitCard: {\n * number: '4111111111111111',\n * expirationMonth: '12',\n * expirationYear: '2025',\n * cvv: '123'\n * },\n * setAsDefault: false\n * });\n * ```\n */\n async create(data: CreatePayeeRequest): Promise<Payee> {\n try {\n let response: any;\n\n // Build request payload based on account type\n if (data.accountType === 'debit_card') {\n // Debit card structure\n if (!data.debitCard) {\n throw new Error('Debit card information is required for debit_card account type');\n }\n\n response = await this.client.post<any>('/api/v1/payees', {\n name: data.nickname,\n debit_card: {\n number: data.debitCard.number,\n expiration_month: data.debitCard.expirationMonth,\n expiration_year: data.debitCard.expirationYear,\n cvv: data.debitCard.cvv\n },\n set_as_default: data.setAsDefault || false\n });\n } else {\n // Bank account structure (checking/savings)\n if (!data.accountNumber || !data.routingNumber) {\n throw new Error('Account number and routing number are required for bank accounts');\n }\n\n response = await this.client.post<any>('/api/v1/payees', {\n name: data.nickname,\n account_number: data.accountNumber,\n routing_number: data.routingNumber,\n type: (data.accountType || 'checking').toUpperCase(),\n set_as_default: data.setAsDefault || false\n });\n }\n\n // Transform response from snake_case to camelCase\n return this.transformPayee(response);\n } catch (error: any) {\n throw new Error(`Failed to create payee: ${error.message}`);\n }\n }\n\n /**\n * List all payees\n * \n * @example\n * ```typescript\n * const payees = await diviswap.payees.list();\n * const defaultPayee = payees.find(p => p.isDefault);\n * ```\n */\n async list(): Promise<Payee[]> {\n // This endpoint requires both API key and JWT authentication\n const response = await this.client.get<any>('/api/v1/users/payees', { useApiKey: false });\n return this.parsePayeesResponse(response);\n }\n\n private parsePayeesResponse(response: any): Payee[] {\n let payeesArray: any[] = [];\n\n // Handle different response formats\n if (Array.isArray(response)) {\n payeesArray = response;\n } else if (response && typeof response === 'object') {\n // Check common response wrapper patterns\n if (response.data && Array.isArray(response.data)) {\n payeesArray = response.data;\n } else if (response.payees && Array.isArray(response.payees)) {\n payeesArray = response.payees;\n } else if (response.results && Array.isArray(response.results)) {\n payeesArray = response.results;\n }\n }\n\n return payeesArray.map(p => this.transformPayee(p));\n }\n\n private transformPayee(p: any): Payee {\n // Transform backend snake_case to SDK camelCase\n return {\n id: p.id,\n nickname: p.nickname || p.name,\n accountNumber: p.accountNumber || p.account_number || '',\n routingNumber: p.routingNumber || p.routing_number || '',\n accountType: (p.accountType || p.account_type || p.type || 'checking').toLowerCase(),\n isDefault: p.isDefault ?? p.is_default ?? p.set_as_default ?? false,\n verified: p.verified ?? false,\n createdAt: p.createdAt || p.created_at || '',\n updatedAt: p.updatedAt || p.updated_at || ''\n };\n }\n\n /**\n * Get a specific payee\n * \n * @example\n * ```typescript\n * const payee = await diviswap.payees.get('payee-id');\n * ```\n */\n async get(payeeId: string): Promise<Payee> {\n const payees = await this.list();\n const payee = payees.find(p => p.id === payeeId);\n \n if (!payee) {\n throw new Error(`Payee ${payeeId} not found`);\n }\n \n return payee;\n }\n\n /**\n * Set a payee as default\n * \n * @example\n * ```typescript\n * await diviswap.payees.setDefault('payee-id');\n * ```\n */\n async setDefault(payeeId: string): Promise<Payee> {\n const response = await this.client.put<any>('/api/v1/users/payees', {\n payeeId,\n setAsDefault: true\n }, { useApiKey: false });\n return this.transformPayee(response);\n }\n\n /**\n * Delete a payee\n * \n * @example\n * ```typescript\n * await diviswap.payees.delete('payee-id');\n * ```\n */\n async delete(payeeId: string): Promise<ApiResponse> {\n return this.client.delete<ApiResponse>(\n `/api/v1/users/payees/${payeeId}`,\n { useApiKey: false }\n );\n }\n\n /**\n * Get verification status of a payee\n * \n * @example\n * ```typescript\n * const status = await diviswap.payees.getVerificationStatus('payee-id');\n * console.log(status.verified, status.microDepositsStatus);\n * ```\n */\n async getVerificationStatus(_payeeId: string): Promise<any> {\n // Note: This endpoint doesn't have a v1 equivalent yet\n throw new Error('Payee verification status endpoint not available in v1 API yet');\n }\n\n /**\n * Verify a payee with micro-deposit amounts\n * \n * @example\n * ```typescript\n * const result = await diviswap.payees.verify('payee-id', {\n * amount1: 0.32,\n * amount2: 0.45\n * });\n * ```\n */\n async verify(_payeeId: string, _data: VerifyPayeeRequest): Promise<ApiResponse> {\n // Note: This endpoint doesn't have a v1 equivalent yet\n throw new Error('Payee verification endpoint not available in v1 API yet');\n }\n\n /**\n * Get the default payee\n * \n * @example\n * ```typescript\n * const defaultPayee = await diviswap.payees.getDefault();\n * if (!defaultPayee) {\n * console.log('No default payee set');\n * }\n * ```\n */\n async getDefault(): Promise<Payee | null> {\n const payees = await this.list();\n return payees.find(p => p.isDefault) || null;\n }\n}","/**\n * Diviswap deposit addresses for different chains\n * These addresses are where users send crypto for offramp transactions\n */\n\nexport interface DepositAddresses {\n ethereum: string;\n base: string;\n polygon: string;\n [key: string]: string; // Allow additional chains\n}\n\n// Production deposit addresses\nexport const PRODUCTION_DEPOSIT_ADDRESSES: DepositAddresses = {\n ethereum: '0xa3da8ffC1D131F917f9D0Ac078D82914e75d9651',\n base: '0xa3da8ffC1D131F917f9D0Ac078D82914e75d9651',\n polygon: '0xa3da8ffC1D131F917f9D0Ac078D82914e75d9651',\n solana: 'EokHeEoZpGtBNeuJKRPvtxzXqaXz6bM5zsVB5TVPtNee'\n};\n\n// Sandbox/testnet deposit addresses\nexport const SANDBOX_DEPOSIT_ADDRESSES: DepositAddresses = {\n ethereum: '0xa3da8ffC1D131F917f9D0Ac078D82914e75d9651', // Same address for all environments\n base: '0xa3da8ffC1D131F917f9D0Ac078D82914e75d9651',\n polygon: '0xa3da8ffC1D131F917f9D0Ac078D82914e75d9651',\n solana: 'EokHeEoZpGtBNeuJKRPvtxzXqaXz6bM5zsVB5TVPtNee'\n};\n\n// Development/local deposit addresses\nexport const DEVELOPMENT_DEPOSIT_ADDRESSES: DepositAddresses = {\n ethereum: '0xa3da8ffC1D131F917f9D0Ac078D82914e75d9651', // Same unified address\n base: '0xa3da8ffC1D131F917f9D0Ac078D82914e75d9651',\n polygon: '0xa3da8ffC1D131F917f9D0Ac078D82914e75d9651',\n solana: 'EokHeEoZpGtBNeuJKRPvtxzXqaXz6bM5zsVB5TVPtNee'\n};\n\n/**\n * Get deposit addresses for the current environment\n */\nexport function getDepositAddresses(environment: 'production' | 'sandbox' | 'development'): DepositAddresses {\n switch (environment) {\n case 'production':\n return PRODUCTION_DEPOSIT_ADDRESSES;\n case 'sandbox':\n return SANDBOX_DEPOSIT_ADDRESSES;\n case 'development':\n return DEVELOPMENT_DEPOSIT_ADDRESSES;\n default:\n return SANDBOX_DEPOSIT_ADDRESSES;\n }\n}\n\n/**\n * Chain ID to chain name mapping\n */\nexport const CHAIN_ID_TO_NAME: Record<number, string> = {\n 1: 'ethereum',\n 5: 'goerli',\n 11155111: 'sepolia',\n 137: 'polygon',\n 80001: 'mumbai',\n 8453: 'base',\n 84531: 'base-goerli',\n 84532: 'base-sepolia'\n};\n\n/**\n * Chain name to chain ID mapping\n */\nexport const CHAIN_NAME_TO_ID: Record<string, number> = {\n 'ethereum': 1,\n 'eth': 1,\n 'goerli': 5,\n 'sepolia': 11155111,\n 'polygon': 137,\n 'matic': 137,\n 'mumbai': 80001,\n 'base': 8453,\n 'base-goerli': 84531,\n 'base-sepolia': 84532,\n 'solana': 999999, // Solana mainnet (custom ID for database compatibility)\n 'sol': 999999\n};\n\n/**\n * Supported stablecoin addresses by chain\n */\nexport const STABLECOIN_ADDRESSES: Record<string, Record<string, string>> = {\n ethereum: {\n USDT: '0xdac17f958d2ee523a2206206994597c13d831ec7',\n USDC: '0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48',\n DAI: '0x6b175474e89094c44da98b954eedeac495271d0f'\n },\n base: {\n USDC: '0x833589fcd6edb6e08f4c7c32d4f71b54bda02913',\n USDbC: '0xd9aaec86b65d86f6a7b5b1b0c42ffa531710b6ca' // Bridged USDC\n },\n polygon: {\n USDT: '0xc2132d05d31c914a87c6611c10748aeb04b58e8f',\n USDC: '0x2791bca1f2de4661ed88a30c99a7a9449aa84174',\n DAI: '0x8f3cf7ad23cd3cadbd9735aff958023239c6a063'\n },\n solana: {\n USDC: 'EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v', // USDC SPL token\n USDT: 'Es9vMFrzaCERmJfrF4H2FYD4KCoNkY11McCe8BenwNYB', // USDT SPL token\n SOL: 'So11111111111111111111111111111111111111112' // Wrapped SOL\n }\n};","/**\n * Transactions module for crypto on/off ramps\n */\n\nimport { UnifiedApiClient } from '../api/unified-client';\nimport { Transaction, OnrampRequest, OfframpRequest } from '../types';\nimport { getDepositAddresses, CHAIN_NAME_TO_ID, STABLECOIN_ADDRESSES } from '../constants/addresses';\n\nexport interface TransactionFilters {\n type?: 'onramp' | 'offramp';\n status?: 'pending' | 'processing' | 'completed' | 'failed';\n startDate?: string;\n endDate?: string;\n limit?: number;\n offset?: number;\n}\n\nexport interface FeeEstimate {\n amount: number;\n currency: string;\n fee: number;\n total: number;\n}\n\nexport class TransactionsModule {\n private depositAddresses: Record<string, string>;\n \n constructor(private client: UnifiedApiClient, environment: 'production' | 'sandbox' | 'development' = 'sandbox') {\n // Load deposit addresses based on environment\n this.depositAddresses = getDepositAddresses(environment);\n }\n \n \n /**\n * Map chain name to chain ID\n * @private\n */\n private getChainId(chain: string): string {\n const chainId = CHAIN_NAME_TO_ID[chain.toLowerCase()];\n return chainId ? chainId.toString() : chain;\n }\n \n /**\n * Get deposit address for a given chain\n * @private\n */\n private getDepositAddress(chain: string): string {\n // Normalize chain name\n const normalizedChain = chain.toLowerCase();\n \n // Handle aliases\n const chainName = normalizedChain === 'eth' ? 'ethereum' : \n normalizedChain === 'matic' ? 'polygon' : \n normalizedChain;\n \n const address = this.depositAddresses[chainName];\n \n if (!address || address === '0x...' || address.includes('TODO')) {\n throw new Error(`Deposit address not configured for chain: ${chain}. Please contact support.`);\n }\n \n return address;\n }\n \n /**\n * Get all configured deposit addresses\n * @returns Object mapping chain names to deposit addresses\n */\n getDepositAddresses(): Record<string, string> {\n return { ...this.depositAddresses };\n }\n \n /**\n * Get deposit address for a specific chain\n * @param chain - Chain name (e.g., 'ethereum', 'base', 'polygon')\n * @returns The deposit address for the specified chain\n * @throws Error if chain is not supported\n */\n getDepositAddressForChain(chain: string): string {\n return this.getDepositAddress(chain);\n }\n\n /**\n * Create an onramp transaction (fiat to crypto)\n * \n * @example\n * ```typescript\n * const transaction = await diviswap.transactions.onramp({\n * amount: 100,\n * currency: 'USD',\n * payeeId: 'payee-id',\n * toAddress: '0xa3da8ffC1D131F917f9D0Ac078D82914e75d9651',\n * chain: 'ethereum'\n * });\n * ```\n * \n * @throws {Error} If user is not KYC approved\n */\n async onramp(_data: OnrampRequest): Promise<Transaction> {\n // Note: The onramp endpoint is not yet available in the v1 API\n throw new Error('Onramp endpoint not available in v1 API yet');\n }\n\n /**\n * Create an offramp transaction (crypto to fiat)\n *\n * ⚠️ IMPORTANT: Follow the production pattern:\n * 1. Send crypto transaction on blockchain FIRST\n * 2. Get the transaction hash\n * 3. Call this method with the hash\n *\n * @example\n * ```typescript\n * import { extractTransactionHash } from '@diviswap/sdk';\n *\n * // 1. Send crypto transaction first and get tx hash\n * const txResult = await sendTransactionAsync({\n * to: depositAddress,\n * value: parseEther('0.5')\n * });\n *\n * // 2. Extract hash (handles different wallet return types)\n * const txHash = extractTransactionHash(txResult);\n *\n * // 3. Record the transaction\n * const transaction = await diviswap.transactions.offramp({\n * amount: 0.5,\n * currency: 'ETH',\n * fromAddress: '0xa3da8ffC1D131F917f9D0Ac078D82914e75d9651',\n * payeeId: 'payee-id',\n * chain: 'ethereum',\n * txHash: txHash\n * });\n * ```\n *\n * @throws {Error} If user is not KYC approved\n */\n async offramp(data: OfframpRequest & { txHash: string }): Promise<Transaction> {\n // Runtime validation: txHash is REQUIRED for security\n if (!data.txHash || data.txHash.trim() === '') {\n throw new Error(\n 'txHash is required for offramp transactions.'\n );\n }\n\n // Build payload with proper defaults and sanitization\n const payload: any = {\n payee_id: data.payeeId,\n tx_hash: data.txHash, // Required: must send crypto first\n from_address: data.fromAddress,\n to_address: data.toAddress || this.getDepositAddress(data.chain || 'ethereum'),\n amount: data.amount,\n currency: data.currency,\n chain_id: this.getChainId(data.chain || 'ethereum'),\n };\n\n // Only add memo if provided\n if (data.memo) {\n payload.memo = data.memo;\n }\n\n return this.client.post<Transaction>(\n `/api/v1/transactions/offramp`,\n payload,\n { useApiKey: false }\n );\n }\n\n /**\n * Create a test offramp transaction using the same production flow.\n * Requires a transaction hash - send crypto first, then call this method.\n *\n * ⚠️ IMPORTANT: Follow the production pattern:\n * 1. Send crypto transaction on blockchain FIRST\n * 2. Get the transaction hash\n * 3. Call this method with the hash\n *\n * @example\n * ```typescript\n * // 1. Send crypto transaction first and get tx hash\n * const txHash = await sendCryptoTransaction({...});\n *\n * // 2. Record the transaction using production endpoint\n * const transaction = await diviswap.transactions.offrampTest({\n * amount: 0.1,\n * currency: 'USDC',\n * fromAddress: '0x...',\n * toAddress: '0x...',\n * payeeId: 'payee-id',\n * chain: 'base',\n * txHash: txHash\n * });\n * ```\n */\n async offrampTest(data: OfframpRequest & { txHash: string }): Promise<Transaction> {\n // Runtime validation: txHash is REQUIRED for security\n if (!data.txHash || data.txHash.trim() === '') {\n throw new Error(\n 'txHash is required for offramp transactions.'\n );\n }\n\n // Build payload with proper defaults and sanitization\n const payload: any = {\n payee_id: data.payeeId,\n tx_hash: data.txHash,\n from_address: data.fromAddress,\n to_address: data.toAddress || this.getDepositAddress(data.chain || 'ethereum'),\n amount: data.amount,\n currency: data.currency,\n chain_id: this.getChainId(data.chain || 'ethereum'),\n };\n\n // Only add memo if provided\n if (data.memo) {\n payload.memo = data.memo;\n }\n\n // Use unified auth production endpoint with txHash\n return this.client.post<Transaction>(\n `/api/v1/transactions/offramp`,\n payload,\n { useApiKey: false }\n );\n }\n\n /**\n * List transactions with optional filters\n * \n * @example\n * ```typescript\n * // Get all transactions\n * const allTransactions = await diviswap.transactions.list();\n * \n * // Get only completed onramp transactions\n * const completedOnramps = await diviswap.transactions.list({\n * type: 'onramp',\n * status: 'completed'\n * });\n * ```\n */\n async list(filters?: TransactionFilters): Promise<Transaction[]> {\n const params = new URLSearchParams();\n\n if (filters) {\n Object.entries(filters).forEach(([key, value]) => {\n if (value !== undefined && value !== null) {\n params.append(key, value.toString());\n }\n });\n }\n\n const queryString = params.toString();\n const path = `/api/v1/users/transactions${queryString ? `?${queryString}` : ''}`;\n\n const response = await this.client.get<any>(path, { useApiKey: false });\n \n // Handle different response formats\n if (Array.isArray(response)) {\n return response;\n }\n \n if (response && typeof response === 'object') {\n // Check common response wrapper patterns\n if (response.data && Array.isArray(response.data)) {\n return response.data;\n }\n if (response.transactions && Array.isArray(response.transactions)) {\n return response.transactions;\n }\n if (response.results && Array.isArray(response.results)) {\n return response.results;\n }\n }\n \n return [];\n }\n\n /**\n * Get a specific transaction by ID\n * \n * @example\n * ```typescript\n * const transaction = await diviswap.transactions.get('transaction-id');\n * console.log(transaction.status, transaction.amount);\n * ```\n */\n async get(transactionId: string): Promise<Transaction> {\n const transactions = await this.list();\n const transaction = transactions.find(t => t.id === transactionId);\n \n if (!transaction) {\n throw new Error(`Transaction ${transactionId} not found`);\n }\n \n return transaction;\n }\n\n /**\n * Get fee estimate for a transaction\n * \n * @example\n * ```typescript\n * const estimate = await diviswap.transactions.estimateFees({\n * amount: 100,\n * currency: 'USD',\n * type: 'onramp'\n * });\n * console.log(`Fee: $${estimate.fee}, Total: $${estimate.total}`);\n * ```\n */\n async estimateFees(params: {\n amount: number;\n currency: string;\n type: 'onramp' | 'offramp';\n }): Promise<FeeEstimate> {\n return this.client.post<FeeEstimate>('/api/v1/fees', params);\n }\n\n /**\n * Get recent transactions (convenience method)\n * \n * @example\n * ```typescript\n * const recentTransactions = await diviswap.transactions.getRecent(10);\n * ```\n */\n async getRecent(limit = 10): Promise<Transaction[]> {\n return this.list({ limit });\n }\n\n /**\n * Get transaction statistics\n * \n * @example\n * ```typescript\n * const stats = await diviswap.transactions.getStats();\n * console.log(`Total volume: $${stats.totalVolume}`);\n * ```\n */\n async getStats(): Promise<{\n totalTransactions: number;\n totalVolume: number;\n pendingTransactions: number;\n completedTransactions: number;\n }> {\n const transactions = await this.list();\n \n const stats = transactions.reduce((acc, tx) => {\n acc.totalTransactions++;\n acc.totalVolume += tx.amount || 0;\n \n if (tx.status === 'pending' || tx.status === 'processing') {\n acc.pendingTransactions++;\n } else if (tx.status === 'completed') {\n acc.completedTransactions++;\n }\n \n return acc;\n }, {\n totalTransactions: 0,\n totalVolume: 0,\n pendingTransactions: 0,\n completedTransactions: 0,\n });\n \n return stats;\n }\n \n /**\n * Get stablecoin addresses for a specific chain\n * @param chain - Chain name (e.g., 'ethereum', 'base', 'polygon')\n * @returns Object mapping stablecoin symbols to contract addresses\n */\n getStablecoinAddresses(chain: string): Record<string, string> {\n const normalizedChain = chain.toLowerCase();\n const chainName = normalizedChain === 'eth' ? 'ethereum' : \n normalizedChain === 'matic' ? 'polygon' : \n normalizedChain;\n \n return STABLECOIN_ADDRESSES[chainName] || {};\n }\n}","/**\n * KYC/KYB module for identity verification\n */\n\nimport { UnifiedApiClient } from '../api/unified-client';\nimport { \n ComplianceStatus, \n KycSessionResponse, \n KycDocumentRequest, \n KycPersonalInfo,\n ApiResponse \n} from '../types';\nimport { ValidationError } from '../errors';\n\nexport class KycModule {\n constructor(private readonly client: UnifiedApiClient) {}\n\n /**\n * Get current compliance status including KYC and KYB\n * \n * @example\n * ```typescript\n * const status = await diviswap.kyc.getComplianceStatus();\n * \n * if (!status.canTransact) {\n * if (status.nextStep === 'COMPLETE_KYC') {\n * // Redirect to KYC flow\n * }\n * }\n * ```\n */\n async getComplianceStatus(): Promise<ComplianceStatus> {\n try {\n const profile = await this.client.get<{\n is_verified: boolean;\n onramp_verified: boolean;\n kyc?: {\n status: string;\n is_verified: boolean;\n onramp_verified: boolean;\n metadata?: any;\n };\n }>('/api/v1/users/profile');\n \n // Use KYC data from profile if available, otherwise fall back to top-level fields\n const kycData = profile.kyc;\n const kycStatus = kycData?.status || (profile.is_verified ? 'APPROVED' : 'PENDING');\n const canTransact = kycData?.onramp_verified || profile.onramp_verified || false;\n const isVerified = kycData?.is_verified || profile.is_verified || false;\n \n return {\n kycStatus: kycStatus.toUpperCase() as any,\n kybStatus: 'NOT_REQUIRED' as any,\n canTransact,\n requiresAction: !canTransact,\n verificationLevel: canTransact ? 'full' : isVerified ? 'basic' : 'none',\n nextStep: !canTransact ? 'COMPLETE_KYC' : undefined,\n kycMetadata: kycData?.metadata\n };\n } catch (error: any) {\n throw new Error(`Failed to get compliance status: ${error.message}`);\n }\n }\n\n /**\n * Start KYC verification session (opens Sumsub widget)\n * \n * @example\n * ```typescript\n * const session = await diviswap.kyc.startKycSession();\n * \n * // Redirect user to session URL\n * window.location.href = session.sessionUrl;\n * \n * // Or embed in iframe\n * const iframe = document.createElement('iframe');\n * iframe.src = session.sessionUrl;\n * ```\n */\n async startKycSession(): Promise<KycSessionResponse> {\n // Note: This endpoint is not yet available in the v1 API\n throw new Error('KYC session endpoint not available in v1 API yet');\n }\n\n /**\n * Submit KYC documents programmatically\n * \n * @example\n * ```typescript\n * // Convert file to base64\n * const toBase64 = (file: File) => new Promise<string>((resolve, reject) => {\n * const reader = new FileReader();\n * reader.readAsDataURL(file);\n * reader.onload = () => resolve(reader.result as string);\n * reader.onerror = reject;\n * });\n * \n * const frontImage = await toBase64(frontFile);\n * const backImage = await toBase64(backFile);\n * \n * await diviswap.kyc.submitDocuments({\n * type: 'DRIVERS_LICENSE',\n * frontImage,\n * backImage\n * });\n * ```\n */\n async submitDocuments(documents: KycDocumentRequest): Promise<ApiResponse> {\n // Validate document data\n if (!documents.frontImage) {\n throw new ValidationError('Front image is required');\n }\n \n if (['DRIVERS_LICENSE', 'ID_CARD'].includes(documents.type) && !documents.backImage) {\n throw new ValidationError(`Back image is required for ${documents.type}`);\n }\n \n // Note: This endpoint is not yet available in the v1 API\n throw new Error('KYC documents endpoint not available in v1 API yet');\n }\n\n /**\n * Submit personal information for KYC\n * \n * @example\n * ```typescript\n * await diviswap.kyc.submitPersonalInfo({\n * firstName: 'John',\n * lastName: 'Doe',\n * dateOfBirth: '1990-01-01',\n * ssn: '123-45-6789',\n * address: {\n * street: '123 Main St',\n * city: 'New York',\n * state: 'NY',\n * postalCode: '10001',\n * country: 'US'\n * }\n * });\n * ```\n */\n async submitPersonalInfo(info: KycPersonalInfo): Promise<ApiResponse> {\n // Validate required fields\n const requiredFields = ['firstName', 'lastName', 'dateOfBirth'];\n for (const field of requiredFields) {\n if (!info[field as keyof KycPersonalInfo]) {\n throw new ValidationError(`${field} is required`);\n }\n }\n \n if (!info.address || !info.address.street || !info.address.city || \n !info.address.state || !info.address.postalCode || !info.address.country) {\n throw new ValidationError('Complete address is required');\n }\n \n try {\n const response = await this.client.post<ApiResponse>('/api/v1/kyc/personal-info', {\n first_name: info.firstName,\n last_name: info.lastName,\n dob: info.dateOfBirth,\n country: info.address.country,\n ...(info.phone && { phone: info.phone }),\n ...(info.address.street && { address: info.address.street }),\n ...(info.address.city && { city: info.address.city }),\n ...(info.address.state && { state: info.address.state }),\n ...(info.address.postalCode && { postal_code: info.address.postalCode }),\n ...(info.ssn && { ssn: info.ssn })\n });\n \n return response;\n } catch (error: any) {\n throw new Error(`Failed to submit KYC info: ${error.message}`);\n }\n }\n\n /**\n * Check if user can transact (convenience method)\n * \n * @example\n * ```typescript\n * const canTransact = await diviswap.kyc.canTransact();\n * if (!canTransact) {\n * // Show KYC prompt\n * }\n * ```\n */\n async canTransact(): Promise<boolean> {\n const status = await this.getComplianceStatus();\n return status.canTransact;\n }\n\n /**\n * Check if KYC is approved\n * \n * @example\n * ```typescript\n * const isApproved = await diviswap.kyc.isKycApproved();\n * ```\n */\n async isKycApproved(): Promise<boolean> {\n const status = await this.getComplianceStatus();\n return status.kycStatus === 'APPROVED';\n }\n\n /**\n * Check if KYB is approved (for business accounts)\n * \n * @example\n * ```typescript\n * const isBusinessApproved = await diviswap.kyc.isKybApproved();\n * ```\n */\n async isKybApproved(): Promise<boolean> {\n const status = await this.getComplianceStatus();\n return status.kybStatus === 'APPROVED';\n }\n\n /**\n * Get rejection reasons if KYC/KYB was rejected\n * \n * @example\n * ```typescript\n * const reasons = await diviswap.kyc.getRejectionReasons();\n * if (reasons.length > 0) {\n * console.log('Rejected because:', reasons.join(', '));\n * }\n * ```\n */\n async getRejectionReasons(): Promise<string[]> {\n const status = await this.getComplianceStatus();\n const reasons: string[] = [];\n \n if (status.kycStatus === 'REJECTED' && status.kycMetadata?.rejectLabels) {\n reasons.push(...status.kycMetadata.rejectLabels);\n }\n \n return reasons;\n }\n\n /**\n * Wait for KYC approval (polling)\n * \n * @example\n * ```typescript\n * // Start KYC session\n * const session = await diviswap.kyc.startKycSession();\n * window.open(session.sessionUrl);\n * \n * // Wait for approval (polls every 5 seconds for up to 10 minutes)\n * try {\n * await diviswap.kyc.waitForApproval();\n * console.log('KYC approved!');\n * } catch (error) {\n * console.log('KYC not approved:', error.message);\n * }\n * ```\n */\n async waitForApproval(options?: {\n pollInterval?: number;\n maxAttempts?: number;\n }): Promise<ComplianceStatus> {\n const pollInterval = options?.pollInterval || 5000; // 5 seconds\n const maxAttempts = options?.maxAttempts || 120; // 10 minutes total\n \n let attempts = 0;\n \n while (attempts < maxAttempts) {\n const status = await this.getComplianceStatus();\n \n if (status.kycStatus === 'APPROVED') {\n return status;\n }\n \n if (status.kycStatus === 'REJECTED') {\n throw new Error(`KYC rejected: ${status.kycMetadata?.rejectLabels?.join(', ') || 'Unknown reason'}`);\n }\n \n attempts++;\n await new Promise(resolve => setTimeout(resolve, pollInterval));\n }\n \n throw new Error('KYC approval timeout');\n }\n}","/**\n * Fees module for managing integrator fees\n *\n * This module allows integrators to:\n * - Set a custom fee percentage on top of Diviswap's base 1.5% fee\n * - Configure fees globally or per-user\n * - Retrieve current fee settings\n * - Calculate total fees for transactions\n */\n\nimport { UnifiedApiClient } from '../api/unified-client';\n\nexport interface FeeSettings {\n integratorFeePercentage: number; // Your custom fee (e.g., 0.5%)\n baseFeePercentage: number; // Diviswap base fee (1.5%)\n totalFeePercentage: number; // Combined fee\n userId?: string; // Optional: for per-user fee settings\n}\n\nexport interface SetFeeRequest {\n percentage: number; // Fee percentage (e.g., 0.5 for 0.5%)\n userId?: number; // Optional: set fee for specific user\n}\n\nexport interface FeeCalculation {\n amount: number;\n baseFee: number;\n integratorFee: number;\n totalFee: number;\n netAmount: number; // Amount after all fees\n}\n\nexport class FeesModule {\n private client: UnifiedApiClient;\n\n constructor(client: UnifiedApiClient) {\n this.client = client;\n }\n\n /**\n * Set integrator fee percentage\n *\n * @example\n * ```typescript\n * // Set global integrator fee to 0.75% (applies to all your users)\n * await diviswap.fees.setFee({ percentage: 0.75 });\n *\n * // Set fee for specific user (overrides global)\n * await diviswap.fees.setFee({\n * percentage: 1.0,\n * userId: 123\n * });\n * ```\n */\n async setFee(data: SetFeeRequest): Promise<FeeSettings> {\n // If userId specified, set user-specific fee override\n if (data.userId) {\n await this.client.put<any>(`/api/v1/partner/users/${data.userId}/fee`, {\n percentage: data.percentage\n });\n\n return {\n integratorFeePercentage: data.percentage,\n baseFeePercentage: 1.5,\n totalFeePercentage: 1.5 + data.percentage,\n userId: data.userId.toString()\n };\n }\n\n // Otherwise, set global default for all users\n const response = await this.client.put<any>('/api/v1/partner/fee', {\n percentage: data.percentage\n });\n\n return {\n integratorFeePercentage: response.integrator_fee_percentage,\n baseFeePercentage: response.base_fee_percentage,\n totalFeePercentage: response.total_fee_percentage\n };\n }\n\n /**\n * Get current fee settings\n *\n * @example\n * ```typescript\n * // Get global fee settings (your default)\n * const fees = await diviswap.fees.getFees();\n * console.log(`Total fee: ${fees.totalFeePercentage}%`);\n * ```\n */\n async getFees(): Promise<FeeSettings> {\n // Get partner's default fee settings\n const response = await this.client.get<any>('/api/v1/partner/fee');\n\n return {\n integratorFeePercentage: response.integrator_fee_percentage,\n baseFeePercentage: response.base_fee_percentage,\n totalFeePercentage: response.total_fee_percentage\n };\n }\n\n\n /**\n * Calculate fees for a transaction amount\n *\n * @example\n * ```typescript\n * const calc = await diviswap.fees.calculateFees({\n * amount: 100,\n * userId: 123 // Optional: checks for user-specific override\n * });\n *\n * console.log(`Base fee: $${calc.baseFee}`);\n * console.log(`Your fee: $${calc.integratorFee}`);\n * console.log(`Total fee: $${calc.totalFee}`);\n * console.log(`User receives: $${calc.netAmount}`);\n * ```\n */\n async calculateFees(params: {\n amount: number;\n userId?: number;\n }): Promise<FeeCalculation> {\n const response = await this.client.post<any>('/api/v1/partner/fees/calculate', {\n amount: params.amount,\n user_id: params.userId\n });\n\n return {\n amount: response.amount,\n baseFee: response.base_fee,\n integratorFee: response.integrator_fee,\n totalFee: response.total_fee,\n netAmount: response.net_amount\n };\n }\n\n /**\n * Remove custom fee for a user (reverts to partner default)\n *\n * @example\n * ```typescript\n * // Remove VIP user's custom fee, they'll use your default fee again\n * await diviswap.fees.removeFee(123);\n * ```\n */\n async removeFee(userId: number): Promise<void> {\n await this.client.delete<any>(`/api/v1/partner/users/${userId}/fee`);\n }\n}","/**\n * Address-related type definitions\n */\n\nexport interface Address {\n id: number;\n uuid: string;\n uuid_history: string[];\n chain_id: number;\n address: string;\n is_default: boolean;\n user_id?: number;\n organization_id?: number;\n created_at: string;\n updated_at: string;\n}\n\nexport interface CreateAddressRequest {\n chain_id: number;\n address: string;\n is_default?: boolean;\n}\n\nexport interface SetDefaultAddressRequest {\n chain_id: number;\n address: string;\n}\n\nexport interface DeleteAddressRequest {\n chain_id: number;\n address: string;\n}\n\n/**\n * Chain ID mappings\n */\nexport const CHAIN_IDS = {\n // Mainnets\n ethereum: 1,\n optimism: 10,\n base: 8453,\n polygon: 137,\n arbitrum: 42161,\n \n // Testnets\n sepolia: 11155111,\n optimism_sepolia: 11155420,\n base_sepolia: 84532,\n polygon_mumbai: 80001,\n arbitrum_sepolia: 421614\n} as const;\n\nexport type ChainName = keyof typeof CHAIN_IDS;\n\n/**\n * Wallet connection info for automatic tracking\n */\nexport interface WalletConnection {\n address: string;\n chainId: number;\n chainName?: string;\n}","/**\n * Addresses module for managing crypto addresses\n */\n\nimport { UnifiedApiClient } from '../api/unified-client';\nimport { \n Address, \n CreateAddressRequest, \n SetDefaultAddressRequest, \n DeleteAddressRequest,\n WalletConnection,\n CHAIN_IDS,\n ChainName \n} from '../types/addresses';\n\nexport class AddressesModule {\n constructor(private client: UnifiedApiClient) {}\n\n /**\n * Get all addresses for the authenticated user\n * \n * @example\n * ```typescript\n * const addresses = await diviswap.addresses.list();\n * console.log('User addresses:', addresses);\n * ```\n */\n async list(): Promise<Address[]> {\n const response = await this.client.get<Address[]>('/api/v1/addresses');\n return Array.isArray(response) ? response : [];\n }\n\n /**\n * Create a new crypto address for the user\n * \n * @example\n * ```typescript\n * const address = await diviswap.addresses.create({\n * chain_id: 1, // Ethereum mainnet\n * address: '0x742d35Cc6647C9532c9fc77C68076aFb1e5AAc05',\n * is_default: true\n * });\n * ```\n */\n async create(data: CreateAddressRequest): Promise<Address> {\n const response = await this.client.post<{ status: string; message: string; id: number }>('/api/v1/addresses', data);\n \n // After creating, fetch the updated list to return the full address object\n const addresses = await this.list();\n const newAddress = addresses.find(addr => addr.id === response.id);\n \n if (!newAddress) {\n throw new Error('Failed to retrieve created address');\n }\n \n return newAddress;\n }\n\n /**\n * Set a specific address as the default for its chain\n * \n * @example\n * ```typescript\n * await diviswap.addresses.setDefault({\n * chain_id: 1,\n * address: '0x742d35Cc6647C9532c9fc77C68076aFb1e5AAc05'\n * });\n * ```\n */\n async setDefault(data: SetDefaultAddressRequest): Promise<void> {\n await this.client.put('/api/v1/addresses/default', data);\n }\n\n /**\n * Delete a crypto address\n * \n * @example\n * ```typescript\n * await diviswap.addresses.delete({\n * chain_id: 1,\n * address: '0x742d35Cc6647C9532c9fc77C68076aFb1e5AAc05'\n * });\n * ```\n */\n async delete(data: DeleteAddressRequest): Promise<void> {\n await this.client.delete('/api/v1/addresses', { body: data });\n }\n\n /**\n * Get addresses for a specific chain\n * \n * @example\n * ```typescript\n * const ethAddresses = await diviswap.addresses.getByChain(1);\n * const baseAddresses = await diviswap.addresses.getByChain('base');\n * ```\n */\n async getByChain(chainIdOrName: number | ChainName): Promise<Address[]> {\n const chainId = typeof chainIdOrName === 'string' ? CHAIN_IDS[chainIdOrName] : chainIdOrName;\n const addresses = await this.list();\n return addresses.filter(addr => addr.chain_id === chainId);\n }\n\n /**\n * Get the default address for a specific chain\n * \n * @example\n * ```typescript\n * const defaultEthAddress = await diviswap.addresses.getDefault(1);\n * const defaultBaseAddress = await diviswap.addresses.getDefault('base');\n * ```\n */\n async getDefault(chainIdOrName: number | ChainName): Promise<Address | null> {\n const chainId = typeof chainIdOrName === 'string' ? CHAIN_IDS[chainIdOrName] : chainIdOrName;\n const addresses = await this.list();\n return addresses.find(addr => addr.chain_id === chainId && addr.is_default) || null;\n }\n\n /**\n * Check if an address exists for the user\n * \n * @example\n * ```typescript\n * const exists = await diviswap.addresses.exists({\n * chain_id: 1,\n * address: '0x742d35Cc6647C9532c9fc77C68076aFb1e5AAc05'\n * });\n * ```\n */\n async exists(data: { chain_id: number; address: string }): Promise<boolean> {\n const addresses = await this.list();\n return addresses.some(addr => \n addr.chain_id === data.chain_id && \n addr.address.toLowerCase() === data.address.toLowerCase()\n );\n }\n\n /**\n * Automatically track a wallet connection\n * This is the main method for automatic address tracking\n * \n * @example\n * ```typescript\n * // When user connects wallet\n * const connection = await diviswap.addresses.trackWallet({\n * address: account,\n * chainId: chainId,\n * chainName: 'ethereum' // optional\n * });\n * ```\n */\n async trackWallet(connection: WalletConnection): Promise<Address> {\n // Check if address already exists\n const existsAlready = await this.exists({\n chain_id: connection.chainId,\n address: connection.address\n });\n\n if (existsAlready) {\n // Return existing address\n const addresses = await this.list();\n const existingAddress = addresses.find(addr => \n addr.chain_id === connection.chainId && \n addr.address.toLowerCase() === connection.address.toLowerCase()\n );\n \n if (!existingAddress) {\n throw new Error('Address exists but could not be retrieved');\n }\n \n return existingAddress;\n }\n\n // Create new address - set as default if it's the first for this chain\n const existingOnChain = await this.getByChain(connection.chainId);\n const isDefault = existingOnChain.length === 0;\n\n return await this.create({\n chain_id: connection.chainId,\n address: connection.address,\n is_default: isDefault\n });\n }\n\n /**\n * Auto-track multiple wallet connections (useful for multi-chain wallets)\n * \n * @example\n * ```typescript\n * // When user connects a multi-chain wallet\n * const addresses = await diviswap.addresses.trackMultipleWallets([\n * { address: account, chainId: 1 }, // Ethereum\n * { address: account, chainId: 8453 }, // Base\n * { address: account, chainId: 10 } // Optimism\n * ]);\n * ```\n */\n async trackMultipleWallets(connections: WalletConnection[]): Promise<Address[]> {\n const results: Address[] = [];\n \n for (const connection of connections) {\n try {\n const address = await this.trackWallet(connection);\n results.push(address);\n } catch (error) {\n console.error(`Failed to track wallet for chain ${connection.chainId}:`, error);\n // Continue with other chains even if one fails\n }\n }\n \n return results;\n }\n\n /**\n * Helper to get chain name from chain ID\n */\n getChainName(chainId: number): string | undefined {\n return Object.entries(CHAIN_IDS).find(([_, id]) => id === chainId)?.[0];\n }\n\n /**\n * Helper to get chain ID from chain name\n */\n getChainId(chainName: ChainName): number {\n return CHAIN_IDS[chainName];\n }\n\n /**\n * Get all supported chains\n */\n getSupportedChains(): Record<string, number> {\n return { ...CHAIN_IDS };\n }\n}","/**\n * Webhooks module for managing partner webhook configurations\n */\n\nimport { UnifiedApiClient } from '../api/unified-client';\n\nexport interface WebhookConfig {\n webhook_url: string | null;\n has_webhook_secret: boolean;\n enabled: boolean;\n}\n\nexport interface WebhookEvent {\n id: number;\n partner_id: number;\n user_id: number | null;\n event_type: string;\n payload: any;\n status: 'pending' | 'delivered' | 'failed';\n response_code: number | null;\n attempts: number;\n max_attempts: number;\n created_at: string;\n delivered_at: string | null;\n next_retry_at: string | null;\n}\n\nexport interface SetWebhookRequest {\n webhook_url: string;\n webhook_secret?: string;\n}\n\nexport class WebhooksModule {\n constructor(private client: UnifiedApiClient) {}\n\n /**\n * Set webhook URL and secret for your partner account\n *\n * @example\n * ```typescript\n * await diviswap.webhooks.setConfig({\n * webhook_url: 'https://myapp.com/api/webhooks/diviswap',\n * webhook_secret: 'whsec_...' // Optional, auto-generated if not provided\n * });\n * ```\n */\n async setConfig(data: SetWebhookRequest): Promise<{\n success: boolean;\n webhook_url: string;\n webhook_secret: string;\n }> {\n // For partner HMAC auth, use partner-specific endpoint\n // For user JWT auth (dashboard), need partner_id\n const response = await this.client.put<any>('/api/v1/partner/webhook', {\n webhook_url: data.webhook_url,\n webhook_secret: data.webhook_secret\n });\n\n return response;\n }\n\n /**\n * Set webhook for a specific partner (user-owned partner)\n *\n * @example\n * ```typescript\n * await diviswap.webhooks.setConfigForPartner(4, {\n * webhook_url: 'https://myapp.com/webhooks'\n * });\n * ```\n */\n async setConfigForPartner(partnerId: number, data: SetWebhookRequest): Promise<{\n success: boolean;\n webhook_url: string;\n webhook_secret: string;\n }> {\n const response = await this.client.put<any>(`/api/v1/partners/${partnerId}/webhook`, {\n webhook_url: data.webhook_url,\n webhook_secret: data.webhook_secret\n });\n\n return response;\n }\n\n /**\n * Get current webhook configuration\n *\n * @example\n * ```typescript\n * const config = await diviswap.webhooks.getConfig();\n * console.log(`Webhook enabled: ${config.enabled}`);\n * console.log(`URL: ${config.webhook_url}`);\n * ```\n */\n async getConfig(): Promise<WebhookConfig> {\n const response = await this.client.get<WebhookConfig>('/api/v1/partner/webhook');\n return response;\n }\n\n /**\n * Get webhook config for a specific partner (user-owned)\n */\n async getConfigForPartner(partnerId: number): Promise<WebhookConfig> {\n const response = await this.client.get<WebhookConfig>(`/api/v1/partners/${partnerId}/webhook`);\n return response;\n }\n\n /**\n * List webhook delivery events\n *\n * @example\n * ```typescript\n * const events = await diviswap.webhooks.listEvents({\n * limit: 100,\n * status: 'failed'\n * });\n *\n * events.forEach(event => {\n * console.log(`${event.event_type}: ${event.status}`);\n * });\n * ```\n */\n async listEvents(options?: {\n partnerId?: number;\n limit?: number;\n status?: 'pending' | 'delivered' | 'failed';\n }): Promise<{ success: boolean; events: WebhookEvent[] }> {\n const params = new URLSearchParams();\n\n if (options?.limit) params.append('limit', options.limit.toString());\n if (options?.status) params.append('status', options.status);\n\n const path = options?.partnerId\n ? `/api/v1/partners/${options.partnerId}/webhook/events?${params}`\n : `/api/v1/partner/webhook/events?${params}`;\n\n const response = await this.client.get<any>(path);\n return response;\n }\n\n /**\n * Send a test webhook to verify your endpoint is working\n *\n * @example\n * ```typescript\n * const result = await diviswap.webhooks.test();\n * if (result.success) {\n * console.log('Webhook endpoint is working!');\n * }\n * ```\n */\n async test(partnerId?: number): Promise<any> {\n const path = partnerId\n ? `/api/v1/partners/${partnerId}/webhook/test`\n : '/api/v1/partner/webhook/test';\n\n return await this.client.post<any>(path);\n }\n\n /**\n * Verify a webhook signature (static helper for your webhook endpoint)\n *\n * @example\n * ```typescript\n * import crypto from 'crypto';\n *\n * const isValid = WebhooksModule.verifySignature(\n * rawBody,\n * request.headers['x-signature'],\n * process.env.WEBHOOK_SECRET\n * );\n * ```\n */\n static verifySignature(\n payload: string,\n signature: string,\n secret: string\n ): boolean {\n // This is a client-side helper, actual implementation in template\n const crypto = require('crypto');\n const expectedSignature = crypto\n .createHmac('sha256', secret)\n .update(payload)\n .digest('hex');\n\n return crypto.timingSafeEqual(\n Buffer.from(signature),\n Buffer.from(expectedSignature)\n );\n }\n}\n","/**\n * JWT Token management with auto-refresh\n */\n\nexport interface TokenData {\n accessToken: string;\n refreshToken?: string;\n expiresAt?: number;\n}\n\nexport interface TokenStorage {\n get(): TokenData | null;\n set(data: TokenData): void;\n clear(): void;\n}\n\n/**\n * In-memory token storage (default)\n */\nclass MemoryTokenStorage implements TokenStorage {\n private data: TokenData | null = null;\n\n get(): TokenData | null {\n return this.data;\n }\n\n set(data: TokenData): void {\n this.data = data;\n }\n\n clear(): void {\n this.data = null;\n }\n}\n\n/**\n * Browser localStorage token storage\n */\nclass LocalStorageTokenStorage implements TokenStorage {\n private key = 'liberex_tokens';\n\n get(): TokenData | null {\n if (typeof globalThis.window === 'undefined') return null;\n \n const data = globalThis.localStorage.getItem(this.key);\n if (!data) return null;\n \n try {\n return JSON.parse(data);\n } catch {\n return null;\n }\n }\n\n set(data: TokenData): void {\n if (typeof globalThis.window === 'undefined') return;\n globalThis.localStorage.setItem(this.key, JSON.stringify(data));\n }\n\n clear(): void {\n if (typeof globalThis.window === 'undefined') return;\n globalThis.localStorage.removeItem(this.key);\n }\n}\n\n/**\n * Token Manager handles JWT token lifecycle\n */\nexport class TokenManager {\n private storage: TokenStorage;\n private refreshPromise: Promise<TokenData> | null = null;\n\n constructor(useLocalStorage = false) {\n this.storage = useLocalStorage && typeof globalThis.window !== 'undefined' \n ? new LocalStorageTokenStorage()\n : new MemoryTokenStorage();\n }\n\n /**\n * Parse JWT token to extract expiration\n */\n private parseToken(token: string): { exp?: number } {\n try {\n const payload = token.split('.')[1];\n const decoded = atob(payload.replace(/-/g, '+').replace(/_/g, '/'));\n return JSON.parse(decoded);\n } catch {\n return {};\n }\n }\n\n /**\n * Store tokens\n */\n setTokens(accessToken: string, refreshToken?: string): void {\n const parsed = this.parseToken(accessToken);\n const expiresAt = parsed.exp ? parsed.exp * 1000 : undefined;\n \n this.storage.set({\n accessToken,\n refreshToken,\n expiresAt,\n });\n }\n\n /**\n * Get current access token\n */\n getAccessToken(): string | null {\n const data = this.storage.get();\n return data?.accessToken || null;\n }\n\n /**\n * Get refresh token\n */\n getRefreshToken(): string | null {\n const data = this.storage.get();\n return data?.refreshToken || null;\n }\n\n /**\n * Check if token is expired or about to expire (5 min buffer)\n */\n isTokenExpired(): boolean {\n const data = this.storage.get();\n if (!data?.expiresAt) return true;\n \n const bufferTime = 5 * 60 * 1000; // 5 minutes\n return Date.now() >= (data.expiresAt - bufferTime);\n }\n\n /**\n * Clear all tokens\n */\n clearTokens(): void {\n this.storage.clear();\n this.refreshPromise = null;\n }\n\n /**\n * Refresh access token\n */\n async refreshAccessToken(refreshCallback: (refreshToken: string) => Promise<TokenData>): Promise<string> {\n // Prevent multiple simultaneous refresh attempts\n if (this.refreshPromise) {\n const result = await this.refreshPromise;\n return result.accessToken;\n }\n\n const refreshToken = this.getRefreshToken();\n if (!refreshToken) {\n throw new Error('No refresh token available');\n }\n\n this.refreshPromise = refreshCallback(refreshToken);\n\n try {\n const newTokenData = await this.refreshPromise;\n this.setTokens(newTokenData.accessToken, newTokenData.refreshToken || refreshToken);\n return newTokenData.accessToken;\n } finally {\n this.refreshPromise = null;\n }\n }\n\n /**\n * Get valid access token (refresh if needed)\n */\n async getValidAccessToken(refreshCallback?: (refreshToken: string) => Promise<TokenData>): Promise<string | null> {\n const token = this.getAccessToken();\n if (!token) return null;\n\n if (this.isTokenExpired() && refreshCallback) {\n try {\n return await this.refreshAccessToken(refreshCallback);\n } catch {\n this.clearTokens();\n return null;\n }\n }\n\n return token;\n }\n}","/**\n * Partner authentication for the Diviswap SDK\n * Supports HMAC and JWT authentication methods for partners\n */\n\nimport crypto from 'crypto';\n\nexport interface PartnerCredentials {\n keyId: string; // Partner key ID (pk_...)\n secretKey: string; // Partner secret key (sk_...)\n customerId?: string; // Partner's user identifier (for shadow user linking)\n customerEmail?: string; // Partner's user email\n}\n\nexport interface HMACAuthHeaders {\n 'Authorization': string; // HMAC keyId:signature:timestamp:nonce\n 'X-Client-Id': string; // Partner key ID\n 'X-Customer-Id'?: string; // Optional: partner's user ID\n 'X-Customer-Email'?: string; // Optional: partner's user email\n}\n\nexport class PartnerAuth {\n private credentials: PartnerCredentials;\n\n constructor(credentials: PartnerCredentials) {\n this.credentials = credentials;\n }\n\n /**\n * Generate HMAC authentication headers for a request\n */\n generateHMACHeaders(\n method: string,\n path: string, \n queryString: string = '',\n body: string = ''\n ): HMACAuthHeaders {\n const timestamp = Math.floor(new Date().getTime() / 1000);\n const nonce = this.generateNonce();\n \n // 1. Build canonical request string\n const bodyHash = crypto.createHash('sha256').update(body).digest('hex');\n // Use explicit array join to ensure proper newlines\n const canonical = [\n method,\n path,\n queryString,\n bodyHash,\n timestamp,\n nonce\n ].join('\\n');\n \n \n // 2. Sign with HMAC-SHA256\n const signature = crypto\n .createHmac('sha256', this.credentials.secretKey)\n .update(canonical)\n .digest('base64');\n \n \n // 3. Build headers\n const headers: HMACAuthHeaders = {\n 'Authorization': `HMAC ${this.credentials.keyId}:${signature}:${timestamp}:${nonce}`,\n 'X-Client-Id': this.credentials.keyId,\n };\n\n // Add optional customer headers\n if (this.credentials.customerId) {\n headers['X-Customer-Id'] = this.credentials.customerId;\n }\n if (this.credentials.customerEmail) {\n headers['X-Customer-Email'] = this.credentials.customerEmail;\n }\n\n return headers;\n }\n\n /**\n * Generate a unique nonce for replay protection\n */\n private generateNonce(): string {\n return crypto.randomBytes(32).toString('base64url');\n }\n\n /**\n * Generate a JWT token for partner authentication\n */\n generateJWT(options: {\n audience?: string;\n expiresIn?: number; // seconds (max 300)\n scopes?: string[];\n } = {}): string {\n const {\n audience = 'api.liberex.sv',\n expiresIn = 300, // 5 minutes max\n scopes = []\n } = options;\n\n const now = Math.floor(Date.now() / 1000);\n const payload = {\n iss: this.credentials.keyId, // Issuer: partner key ID\n aud: audience, // Audience: API domain\n exp: now + Math.min(expiresIn, 300), // Expiration (max 5 minutes)\n iat: now, // Issued at\n ...(this.credentials.customerId && { sub: this.credentials.customerId }),\n ...(this.credentials.customerEmail && { email: this.credentials.customerEmail }),\n ...(scopes.length > 0 && { scope: scopes })\n };\n\n // Sign with HMAC using secret key\n const header = { alg: 'HS256', typ: 'JWT' };\n const encodedHeader = Buffer.from(JSON.stringify(header)).toString('base64url');\n const encodedPayload = Buffer.from(JSON.stringify(payload)).toString('base64url');\n \n const signature = crypto\n .createHmac('sha256', this.credentials.secretKey)\n .update(`${encodedHeader}.${encodedPayload}`)\n .digest('base64url');\n\n return `${encodedHeader}.${encodedPayload}.${signature}`;\n }\n\n /**\n * Set customer context for shadow user linking\n */\n setCustomer(customerId: string, customerEmail?: string): void {\n this.credentials.customerId = customerId;\n this.credentials.customerEmail = customerEmail;\n }\n\n /**\n * Clear customer context\n */\n clearCustomer(): void {\n delete this.credentials.customerId;\n delete this.credentials.customerEmail;\n }\n}","/**\n * Unified API Client supporting both user and partner authentication\n */\n\nimport { AuthenticationError, NetworkError, ValidationError, DiviswapError } from '../errors';\nimport { TokenManager, TokenData } from './token-manager';\nimport { PartnerAuth } from '../auth/partner-auth';\nimport { UserDiviswapConfig, PartnerDiviswapConfig, DiviswapConfig, AuthMode } from '../types';\n\nexport interface UnifiedApiClientConfig {\n baseUrl: string;\n timeout: number;\n debug: boolean;\n mode: AuthMode;\n\n // User auth fields (legacy)\n apiKey?: string;\n clientId?: string;\n\n // Partner auth fields (new)\n keyId?: string;\n secretKey?: string;\n authMethod?: 'hmac' | 'jwt';\n customerId?: string;\n customerEmail?: string;\n}\n\nexport interface RequestOptions {\n method: 'GET' | 'POST' | 'PUT' | 'DELETE';\n path: string;\n body?: any;\n headers?: Record<string, string>;\n useApiKey?: boolean;\n skipAuth?: boolean;\n}\n\n/**\n * Unified API client supporting both user and partner authentication modes\n */\nexport class UnifiedApiClient {\n private config: UnifiedApiClientConfig;\n public tokenManager: TokenManager;\n private partnerAuth?: PartnerAuth;\n private refreshCallback?: (refreshToken: string) => Promise<TokenData>;\n\n constructor(config: UnifiedApiClientConfig, useLocalStorage = true) {\n this.config = config;\n this.tokenManager = new TokenManager(useLocalStorage);\n \n // Initialize partner auth if in partner mode\n if (config.mode === 'partner' && config.keyId && config.secretKey) {\n this.partnerAuth = new PartnerAuth({\n keyId: config.keyId,\n secretKey: config.secretKey,\n customerId: config.customerId,\n customerEmail: config.customerEmail\n });\n }\n }\n\n /**\n * Create client from legacy user config (backward compatibility)\n */\n static fromUserConfig(config: UserDiviswapConfig, useLocalStorage = true): UnifiedApiClient {\n const baseUrl = config.apiUrl || this.getDefaultApiUrl(config.environment || 'production');\n\n return new UnifiedApiClient({\n baseUrl,\n timeout: config.timeout || 30000,\n debug: config.debug || false,\n mode: 'user',\n apiKey: config.apiKey,\n clientId: config.clientId\n }, useLocalStorage);\n }\n\n /**\n * Create client from partner config\n */\n static fromPartnerConfig(config: PartnerDiviswapConfig, useLocalStorage = true): UnifiedApiClient {\n const baseUrl = config.apiUrl || this.getDefaultApiUrl(config.environment || 'production');\n\n return new UnifiedApiClient({\n baseUrl,\n timeout: config.timeout || 30000,\n debug: config.debug || false,\n mode: 'partner',\n keyId: config.keyId,\n secretKey: config.secretKey,\n authMethod: config.authMethod || 'hmac',\n customerId: config.customerId,\n customerEmail: config.customerEmail\n }, useLocalStorage);\n }\n\n /**\n * Create client from any config (auto-detect mode)\n */\n static fromConfig(config: DiviswapConfig, useLocalStorage = true): UnifiedApiClient {\n // Auto-detect partner mode by checking for partner credentials\n if (('mode' in config && config.mode === 'partner') ||\n ('keyId' in config && 'secretKey' in config)) {\n return this.fromPartnerConfig(config as PartnerDiviswapConfig, useLocalStorage);\n } else {\n // Assume user config (backward compatibility)\n return this.fromUserConfig(config as UserDiviswapConfig, useLocalStorage);\n }\n }\n\n private static getDefaultApiUrl(environment: string): string {\n // Sandbox mode is now credential-based (partner.is_sandbox), not server-based.\n // Both 'production' and 'sandbox' environments use the same API server.\n // The 'development' environment is reserved for internal Liberex development.\n switch (environment) {\n case 'production':\n case 'sandbox':\n return 'https://api.liberex.sv';\n case 'development':\n return 'https://dev-api.liberex.sv';\n default:\n return 'https://api.liberex.sv';\n }\n }\n\n /**\n * Update customer context for partner auth\n */\n setCustomer(customerId: string, customerEmail?: string): void {\n if (this.partnerAuth) {\n this.partnerAuth.setCustomer(customerId, customerEmail);\n }\n this.config.customerId = customerId;\n this.config.customerEmail = customerEmail;\n }\n\n /**\n * Clear customer context\n */\n clearCustomer(): void {\n if (this.partnerAuth) {\n this.partnerAuth.clearCustomer();\n }\n delete this.config.customerId;\n delete this.config.customerEmail;\n }\n\n /**\n * Get authentication mode\n */\n getAuthMode(): 'user' | 'partner' {\n return this.config.mode || 'user';\n }\n\n /**\n * Get current customer ID (partner mode only)\n */\n getCustomerId(): string | undefined {\n return this.config.customerId;\n }\n\n /**\n * Set refresh callback for automatic token refresh (user mode only)\n */\n setRefreshCallback(callback: (refreshToken: string) => Promise<TokenData>): void {\n this.refreshCallback = callback;\n }\n\n /**\n * Set access token directly (user mode only)\n */\n setTokens(accessToken: string, refreshToken?: string): void {\n this.tokenManager.setTokens(accessToken, refreshToken);\n }\n\n /**\n * Get current access token (user mode only)\n */\n async getAccessToken(): Promise<string | null> {\n if (this.config.mode === 'partner') {\n return null; // Partner mode doesn't use stored tokens\n }\n return this.tokenManager.getValidAccessToken(this.refreshCallback);\n }\n\n /**\n * Clear stored tokens (user mode only)\n */\n clearTokens(): void {\n this.tokenManager.clearTokens();\n }\n\n /**\n * Make authenticated API request\n */\n async request<T>(options: RequestOptions): Promise<T> {\n const { method, path, body, headers = {}, useApiKey = false, skipAuth = false } = options;\n \n const url = `${this.config.baseUrl}${path}`;\n const requestHeaders: Record<string, string> = {\n 'Content-Type': 'application/json',\n 'User-Agent': 'Diviswap-SDK/2.0',\n ...headers\n };\n\n // Add authentication headers based on mode\n if (!skipAuth) {\n if (this.config.mode === 'partner') {\n await this.addPartnerAuth(method, path, body, requestHeaders);\n } else {\n await this.addUserAuth(useApiKey, requestHeaders);\n }\n }\n\n\n try {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.config.timeout);\n\n if (this.config.debug) {\n console.log(`[Diviswap SDK] ${method} ${url}`);\n }\n\n const response = await fetch(url, {\n method,\n headers: requestHeaders,\n body: body ? JSON.stringify(body) : undefined,\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n const responseText = await response.text();\n let responseData: any;\n\n try {\n responseData = responseText ? JSON.parse(responseText) : null;\n } catch {\n responseData = responseText;\n }\n\n if (this.config.debug) {\n console.log(`[Diviswap SDK] Response ${response.status}: ${responseText.substring(0, 500)}`);\n }\n\n if (!response.ok) {\n await this.handleErrorResponse(response, responseData);\n }\n\n return responseData;\n } catch (error) {\n if (error instanceof Error && error.name === 'AbortError') {\n throw new NetworkError('Request timeout');\n }\n if (error instanceof DiviswapError) {\n throw error;\n }\n throw new NetworkError(`Network request failed: ${error}`);\n }\n }\n\n /**\n * Add partner authentication headers\n */\n private async addPartnerAuth(\n method: string, \n path: string, \n body: any, \n headers: Record<string, string>\n ): Promise<void> {\n if (!this.partnerAuth) {\n throw new AuthenticationError('Partner authentication not configured');\n }\n\n const bodyString = body ? JSON.stringify(body) : '';\n const urlParts = path.split('?');\n const pathOnly = urlParts[0];\n const queryString = urlParts.length > 1 ? urlParts[1] : '';\n\n if (this.config.authMethod === 'jwt') {\n // Use JWT authentication\n const jwt = this.partnerAuth.generateJWT({\n audience: 'api.liberex.sv',\n expiresIn: 300\n });\n headers['Authorization'] = `Bearer ${jwt}`;\n } else {\n // Use HMAC authentication (default)\n const hmacHeaders = this.partnerAuth.generateHMACHeaders(\n method,\n pathOnly,\n queryString,\n bodyString\n );\n \n Object.assign(headers, hmacHeaders);\n }\n\n }\n\n /**\n * Add user authentication headers (legacy)\n */\n private async addUserAuth(useApiKey: boolean, headers: Record<string, string>): Promise<void> {\n if (!this.config.apiKey || !this.config.clientId) {\n throw new AuthenticationError('User authentication not configured');\n }\n\n // Always add API key headers\n headers['X-CLIENT-ID'] = this.config.clientId;\n headers['X-TIMESTAMP'] = Math.floor(Date.now() / 1000).toString();\n headers['X-API-Key'] = this.config.apiKey;\n\n // Add JWT token if not using API key only\n if (!useApiKey) {\n const accessToken = await this.tokenManager.getValidAccessToken(this.refreshCallback);\n if (accessToken) {\n headers['Authorization'] = `Bearer ${accessToken}`;\n }\n }\n\n }\n\n\n private async handleErrorResponse(response: Response, data: any): Promise<never> {\n const status = response.status;\n const message = data?.error || data?.message || `HTTP ${status}`;\n\n // Handle KYC step-up flow\n if (status === 403 && data?.kyc_uri) {\n const error = new AuthenticationError(message) as any;\n error.kycUri = data.kyc_uri;\n error.requiredLevel = data.required_level;\n throw error;\n }\n\n switch (status) {\n case 400:\n throw new ValidationError(message);\n case 401:\n case 403:\n throw new AuthenticationError(message);\n case 404:\n throw new DiviswapError(`Resource not found: ${message}`);\n case 429:\n throw new DiviswapError(`Rate limit exceeded: ${message}`);\n case 500:\n case 502:\n case 503:\n case 504:\n throw new NetworkError(`Server error: ${message}`);\n default:\n throw new DiviswapError(`API error: ${message}`);\n }\n }\n\n // Convenience methods\n async get<T>(path: string, options: Omit<RequestOptions, 'method' | 'path'> = {}): Promise<T> {\n return this.request<T>({ method: 'GET', path, ...options });\n }\n\n async post<T>(path: string, body?: any, options: Omit<RequestOptions, 'method' | 'path' | 'body'> = {}): Promise<T> {\n return this.request<T>({ method: 'POST', path, body, ...options });\n }\n\n async put<T>(path: string, body?: any, options: Omit<RequestOptions, 'method' | 'path' | 'body'> = {}): Promise<T> {\n return this.request<T>({ method: 'PUT', path, body, ...options });\n }\n\n async delete<T>(path: string, options: Omit<RequestOptions, 'method' | 'path'> = {}): Promise<T> {\n return this.request<T>({ method: 'DELETE', path, ...options });\n }\n}","/**\n * Main Diviswap SDK Client\n */\n\nimport { DiviswapConfig, UserDiviswapConfig, PartnerDiviswapConfig } from './types';\nimport { ConfigurationError } from './errors';\nimport { AuthModule } from './modules/auth';\nimport { PayeesModule } from './modules/payees';\nimport { TransactionsModule } from './modules/transactions';\nimport { KycModule } from './modules/kyc';\nimport { FeesModule } from './modules/fees';\nimport { AddressesModule } from './modules/addresses';\nimport { WebhooksModule } from './modules/webhooks';\nimport { UnifiedApiClient } from './api/unified-client';\n\n\n/**\n * Diviswap SDK Client\n *\n * @example\n * User Authentication (existing):\n * ```typescript\n * const diviswap = Diviswap.init({\n * apiKey: 'your-api-key',\n * clientId: 'your-client-id',\n * environment: 'sandbox'\n * });\n * ```\n *\n * Partner Authentication (new):\n * ```typescript\n * const diviswap = Diviswap.init({\n * mode: 'partner',\n * keyId: 'pk_...',\n * secretKey: 'sk_...',\n * authMethod: 'hmac', // or 'jwt'\n * environment: 'sandbox'\n * });\n * ```\n */\nexport class Diviswap {\n private static instance: Diviswap | null = null;\n private apiClient: UnifiedApiClient;\n\n public auth: AuthModule;\n public payees: PayeesModule;\n public transactions: TransactionsModule;\n public kyc: KycModule;\n public fees: FeesModule;\n public addresses: AddressesModule;\n public webhooks: WebhooksModule;\n\n private constructor(private config: DiviswapConfig) {\n this.validateConfig(config);\n\n // Log initialization for debugging\n\n // Determine if we should use localStorage based on the config\n const useLocalStorage = config.tokenStorage === 'localStorage' || !config.tokenStorage;\n\n // Create unified API client that supports both auth modes\n this.apiClient = UnifiedApiClient.fromConfig(config, useLocalStorage);\n\n // Initialize modules\n this.auth = new AuthModule(this.apiClient);\n this.payees = new PayeesModule(this.apiClient);\n this.transactions = new TransactionsModule(this.apiClient, config.environment || 'sandbox');\n this.kyc = new KycModule(this.apiClient);\n this.fees = new FeesModule(this.apiClient);\n this.addresses = new AddressesModule(this.apiClient);\n this.webhooks = new WebhooksModule(this.apiClient);\n }\n\n /**\n * Initialize the Diviswap SDK\n *\n * @param config - SDK configuration\n * @returns Diviswap SDK instance\n *\n * @example\n * ```typescript\n * const diviswap = Diviswap.init({\n * apiKey: 'your-api-key',\n * clientId: 'your-client-id'\n * });\n * ```\n */\n static init(config: DiviswapConfig): Diviswap {\n if (!Diviswap.instance) {\n Diviswap.instance = new Diviswap(config);\n }\n return Diviswap.instance;\n }\n\n /**\n * Get the current SDK instance\n * @throws {ConfigurationError} If SDK hasn't been initialized\n */\n static getInstance(): Diviswap {\n if (!Diviswap.instance) {\n throw new ConfigurationError('Diviswap SDK not initialized. Call Diviswap.init() first.');\n }\n return Diviswap.instance;\n }\n\n /**\n * Reset the SDK instance (useful for testing)\n */\n static reset(): void {\n Diviswap.instance = null;\n }\n\n /**\n * Update SDK configuration\n * @deprecated Configuration updates require re-initialization. Call Diviswap.reset() then Diviswap.init() with new config.\n */\n updateConfig(_config: Partial<DiviswapConfig>): void {\n // For configuration updates, we'd need to recreate the client\n // This is a breaking change that requires re-initialization\n throw new ConfigurationError('Configuration updates require re-initialization. Call Diviswap.reset() then Diviswap.init() with new config.');\n }\n\n /**\n * Get current configuration (excluding sensitive data)\n */\n getConfig(): Partial<DiviswapConfig> {\n return {\n environment: this.config.environment,\n apiUrl: this.config.apiUrl,\n debug: this.config.debug,\n timeout: this.config.timeout,\n };\n }\n\n /**\n * Get current access token (for developers who need it for custom API calls)\n * Only available in user authentication mode.\n *\n * @example\n * ```typescript\n * const token = await diviswap.getAccessToken();\n * if (token) {\n * // Use token for custom API calls\n * fetch('https://api.liberex.sv/custom-endpoint', {\n * headers: { 'Authorization': `Bearer ${token}` }\n * });\n * }\n * ```\n */\n async getAccessToken(): Promise<string | null> {\n return this.apiClient.getAccessToken();\n }\n\n /**\n * Set access token (for server-side usage where tokens are stored externally)\n * Only available in user authentication mode.\n *\n * @example\n * ```typescript\n * // In a Next.js API route where token is stored in cookies\n * const token = cookies().get('diviswap_session')?.value;\n * if (token) {\n * diviswap.setAccessToken(token);\n * }\n * ```\n */\n setAccessToken(accessToken: string, refreshToken?: string): void {\n this.apiClient.setTokens(accessToken, refreshToken);\n }\n\n /**\n * Set customer context for partner authentication mode\n *\n * @example\n * ```typescript\n * // For partner auth mode - link requests to a specific customer\n * diviswap.setCustomer('user-123', 'user@example.com');\n *\n * // Now all API calls will be made on behalf of this customer\n * const payees = await diviswap.payees.getAll();\n * ```\n */\n setCustomer(customerId: string, customerEmail?: string): void {\n this.apiClient.setCustomer(customerId, customerEmail);\n }\n\n /**\n * Clear customer context for partner authentication mode\n */\n clearCustomer(): void {\n this.apiClient.clearCustomer();\n }\n\n private validateConfig(config: DiviswapConfig): void {\n // Auto-detect partner mode by checking for partner credentials\n const isPartnerMode = ('mode' in config && config.mode === 'partner') ||\n ('keyId' in config && 'secretKey' in config);\n\n if (isPartnerMode) {\n // Partner mode validation\n const partnerConfig = config as PartnerDiviswapConfig;\n if (!partnerConfig.keyId) {\n throw new ConfigurationError('Partner keyId is required for partner authentication');\n }\n if (!partnerConfig.secretKey) {\n throw new ConfigurationError('Partner secretKey is required for partner authentication');\n }\n if (partnerConfig.authMethod && !['hmac', 'jwt'].includes(partnerConfig.authMethod)) {\n throw new ConfigurationError('Invalid authMethod. Must be either \"hmac\" or \"jwt\"');\n }\n } else {\n // User mode validation (backward compatibility)\n const userConfig = config as UserDiviswapConfig;\n if (!userConfig.apiKey) {\n throw new ConfigurationError('API Key is required for user authentication');\n }\n if (!userConfig.clientId) {\n throw new ConfigurationError('Client ID is required for user authentication');\n }\n }\n \n if (config.environment && !['production', 'sandbox', 'development'].includes(config.environment)) {\n throw new ConfigurationError('Invalid environment. Must be one of: production, sandbox, development');\n }\n }\n}","/**\n * Wallet integration helpers for automatic address tracking\n */\n\nimport { Diviswap } from '../client';\nimport { WalletConnection, CHAIN_IDS } from '../types/addresses';\n\n/**\n * Ethereum-like wallet interface (compatible with MetaMask, WalletConnect, etc.)\n */\nexport interface EthereumWallet {\n request: (args: { method: string; params?: any[] }) => Promise<any>;\n on?: (event: string, handler: (...args: any[]) => void) => void;\n removeListener?: (event: string, handler: (...args: any[]) => void) => void;\n}\n\n/**\n * Automatic wallet tracking configuration\n */\nexport interface WalletTrackingConfig {\n /** Automatically track when accounts change */\n trackAccountChanges?: boolean;\n /** Automatically track when chain changes */\n trackChainChanges?: boolean;\n /** Set newly connected addresses as default for their chain */\n setAsDefault?: boolean;\n /** Custom chain mappings for unsupported chains */\n customChains?: Record<number, string>;\n}\n\n/**\n * Wallet tracking manager for automatic address management\n */\nexport class WalletTracker {\n private static instance: WalletTracker | null = null;\n private wallet: EthereumWallet | null = null;\n private diviswap: Diviswap | null = null;\n private config: WalletTrackingConfig;\n private listeners: Map<string, (...args: any[]) => void> = new Map();\n\n private constructor(config: WalletTrackingConfig = {}) {\n this.config = {\n trackAccountChanges: true,\n trackChainChanges: true,\n setAsDefault: true,\n ...config\n };\n }\n\n /**\n * Get or create the wallet tracker instance\n */\n static getInstance(config?: WalletTrackingConfig): WalletTracker {\n if (!WalletTracker.instance) {\n WalletTracker.instance = new WalletTracker(config);\n }\n return WalletTracker.instance;\n }\n\n /**\n * Initialize wallet tracking with Diviswap SDK instance\n */\n init(diviswap: Diviswap, wallet?: EthereumWallet): void {\n this.diviswap = diviswap;\n\n if (wallet) {\n this.wallet = wallet;\n } else if (typeof window !== 'undefined' && (window as any).ethereum) {\n this.wallet = (window as any).ethereum;\n }\n\n if (this.wallet && this.config.trackAccountChanges) {\n this.setupAccountChangeListener();\n }\n\n if (this.wallet && this.config.trackChainChanges) {\n this.setupChainChangeListener();\n }\n }\n\n /**\n * Connect and track a wallet\n */\n async connect(): Promise<WalletConnection[]> {\n if (!this.wallet) {\n throw new Error('No wallet provider available');\n }\n\n if (!this.diviswap) {\n throw new Error('Diviswap SDK not initialized. Call init() first.');\n }\n\n try {\n // Request account access\n const accounts = await this.wallet.request({\n method: 'eth_requestAccounts'\n });\n\n // Get current chain\n const chainId = await this.wallet.request({\n method: 'eth_chainId'\n });\n\n const numericChainId = parseInt(chainId, 16);\n const connections: WalletConnection[] = [];\n\n // Track all connected accounts\n for (const account of accounts) {\n const connection: WalletConnection = {\n address: account,\n chainId: numericChainId,\n chainName: this.getChainName(numericChainId)\n };\n\n await this.diviswap.addresses.trackWallet(connection);\n connections.push(connection);\n }\n\n return connections;\n } catch (error) {\n console.error('Failed to connect wallet:', error);\n throw error;\n }\n }\n\n /**\n * Track current wallet state without requesting connection\n */\n async trackCurrent(): Promise<WalletConnection[]> {\n if (!this.wallet) {\n throw new Error('No wallet provider available');\n }\n\n if (!this.diviswap) {\n throw new Error('Diviswap SDK not initialized. Call init() first.');\n }\n\n try {\n // Get current accounts (may be empty if not connected)\n const accounts = await this.wallet.request({\n method: 'eth_accounts'\n });\n\n if (accounts.length === 0) {\n return [];\n }\n\n // Get current chain\n const chainId = await this.wallet.request({\n method: 'eth_chainId'\n });\n\n const numericChainId = parseInt(chainId, 16);\n const connections: WalletConnection[] = [];\n\n // Track all current accounts\n for (const account of accounts) {\n const connection: WalletConnection = {\n address: account,\n chainId: numericChainId,\n chainName: this.getChainName(numericChainId)\n };\n\n await this.diviswap.addresses.trackWallet(connection);\n connections.push(connection);\n }\n\n return connections;\n } catch (error) {\n console.error('Failed to track current wallet state:', error);\n throw error;\n }\n }\n\n /**\n * Setup listener for account changes\n */\n private setupAccountChangeListener(): void {\n if (!this.wallet?.on) return;\n\n const handler = async (accounts: string[]) => {\n if (!this.diviswap) return;\n\n try {\n // Get current chain\n const chainId = await this.wallet!.request({\n method: 'eth_chainId'\n });\n\n const numericChainId = parseInt(chainId, 16);\n\n // Track new accounts\n for (const account of accounts) {\n const connection: WalletConnection = {\n address: account,\n chainId: numericChainId,\n chainName: this.getChainName(numericChainId)\n };\n\n await this.diviswap.addresses.trackWallet(connection);\n }\n } catch (error) {\n console.error('Failed to handle account change:', error);\n }\n };\n\n this.wallet.on('accountsChanged', handler);\n this.listeners.set('accountsChanged', handler);\n }\n\n /**\n * Setup listener for chain changes\n */\n private setupChainChangeListener(): void {\n if (!this.wallet?.on) return;\n\n const handler = async (chainId: string) => {\n if (!this.diviswap) return;\n\n try {\n // Get current accounts\n const accounts = await this.wallet!.request({\n method: 'eth_accounts'\n });\n\n const numericChainId = parseInt(chainId, 16);\n\n // Track accounts on new chain\n for (const account of accounts) {\n const connection: WalletConnection = {\n address: account,\n chainId: numericChainId,\n chainName: this.getChainName(numericChainId)\n };\n\n await this.diviswap.addresses.trackWallet(connection);\n }\n } catch (error) {\n console.error('Failed to handle chain change:', error);\n }\n };\n\n this.wallet.on('chainChanged', handler);\n this.listeners.set('chainChanged', handler);\n }\n\n /**\n * Get chain name from chain ID\n */\n private getChainName(chainId: number): string | undefined {\n // Check built-in chains first\n const builtInChain = Object.entries(CHAIN_IDS).find(([_, id]) => id === chainId)?.[0];\n if (builtInChain) return builtInChain;\n\n // Check custom chains\n return this.config.customChains?.[chainId];\n }\n\n /**\n * Cleanup listeners\n */\n cleanup(): void {\n if (this.wallet?.removeListener) {\n for (const [event, handler] of this.listeners) {\n this.wallet.removeListener(event, handler);\n }\n }\n this.listeners.clear();\n }\n\n /**\n * Update configuration\n */\n updateConfig(config: Partial<WalletTrackingConfig>): void {\n this.config = { ...this.config, ...config };\n }\n}\n\n/**\n * Convenience functions for easy integration\n */\n\n/**\n * Connect wallet and automatically track addresses\n *\n * @example\n * ```typescript\n * import { Diviswap, connectWallet } from '@diviswap/sdk';\n *\n * const diviswap = Diviswap.init(config);\n *\n * // Connect and track wallet automatically\n * const connections = await connectWallet(diviswap);\n * console.log('Tracked addresses:', connections);\n * ```\n */\nexport async function connectWallet(\n diviswap: Diviswap,\n wallet?: EthereumWallet,\n config?: WalletTrackingConfig\n): Promise<WalletConnection[]> {\n const tracker = WalletTracker.getInstance(config);\n tracker.init(diviswap, wallet);\n return tracker.connect();\n}\n\n/**\n * Track current wallet state without requesting connection\n *\n * @example\n * ```typescript\n * import { Diviswap, trackCurrentWallet } from '@diviswap/sdk';\n *\n * const diviswap = Diviswap.init(config);\n *\n * // Track currently connected accounts\n * const connections = await trackCurrentWallet(diviswap);\n * ```\n */\nexport async function trackCurrentWallet(\n diviswap: Diviswap,\n wallet?: EthereumWallet,\n config?: WalletTrackingConfig\n): Promise<WalletConnection[]> {\n const tracker = WalletTracker.getInstance(config);\n tracker.init(diviswap, wallet);\n return tracker.trackCurrent();\n}\n\n/**\n * Setup automatic wallet tracking (listens for account/chain changes)\n *\n * @example\n * ```typescript\n * import { Diviswap, setupWalletTracking } from '@diviswap/sdk';\n *\n * const diviswap = Diviswap.init(config);\n *\n * // Setup automatic tracking\n * setupWalletTracking(diviswap, {\n * trackAccountChanges: true,\n * trackChainChanges: true,\n * setAsDefault: true\n * });\n * ```\n */\nexport function setupWalletTracking(\n diviswap: Diviswap,\n wallet?: EthereumWallet,\n config?: WalletTrackingConfig\n): WalletTracker {\n const tracker = WalletTracker.getInstance(config);\n tracker.init(diviswap, wallet);\n return tracker;\n}","/**\n * Web3 utilities for handling transaction results\n */\n\n/**\n * Type representing the various formats that sendTransaction can return\n * - Direct hash string: '0x...'\n * - Object with hash property: {hash: '0x...'}\n * - Template literal type from viem: `0x${string}`\n */\nexport type SendTransactionResult = string | { hash: string } | `0x${string}`;\n\n/**\n * Safely extract transaction hash from various sendTransaction result formats\n *\n * Different Web3 libraries and wallet connectors return transaction hashes in different formats:\n * - wagmi's sendTransactionAsync: typically returns the hash directly as a string\n * - Some wallets: return an object with a hash property\n * - viem: uses template literal types `0x${string}`\n *\n * This utility handles all these cases and extracts the hash string reliably.\n *\n * @param result - The result from sendTransaction/sendTransactionAsync\n * @returns The transaction hash as a string\n *\n * @example\n * ```typescript\n * const result = await sendTransactionAsync({...});\n * const hash = extractTransactionHash(result);\n * // hash is now guaranteed to be a string like '0x...'\n * ```\n */\nexport function extractTransactionHash(result: SendTransactionResult): string {\n // Handle string results (most common)\n if (typeof result === 'string') {\n return result;\n }\n\n // Handle object with hash property (some wallets)\n if (typeof result === 'object' && result !== null && 'hash' in result) {\n return result.hash;\n }\n\n // Fallback: coerce to string\n return result as string;\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/errors.ts","../src/modules/auth.ts","../src/modules/payees.ts","../src/constants/addresses.ts","../src/modules/transactions.ts","../src/modules/kyc.ts","../src/modules/fees.ts","../src/types/addresses.ts","../src/modules/addresses.ts","../src/modules/webhooks.ts","../src/api/token-manager.ts","../src/auth/partner-auth.ts","../src/api/unified-client.ts","../src/client.ts","../src/integrations/wallet.ts","../src/utils/web3.ts"],"names":["crypto"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Custom error classes for Diviswap SDK\n */\n\nexport class DiviswapError extends Error {\n constructor(\n message: string,\n public code?: string,\n public statusCode?: number,\n public details?: any\n ) {\n super(message);\n this.name = 'DiviswapError';\n Object.setPrototypeOf(this, DiviswapError.prototype);\n }\n}\n\nexport class AuthenticationError extends DiviswapError {\n constructor(message: string, details?: any) {\n super(message, 'AUTHENTICATION_ERROR', 401, details);\n this.name = 'AuthenticationError';\n }\n}\n\nexport class ValidationError extends DiviswapError {\n constructor(message: string, details?: any) {\n super(message, 'VALIDATION_ERROR', 400, details);\n this.name = 'ValidationError';\n }\n}\n\nexport class NetworkError extends DiviswapError {\n constructor(message: string, details?: any) {\n super(message, 'NETWORK_ERROR', undefined, details);\n this.name = 'NetworkError';\n }\n}\n\nexport class ConfigurationError extends DiviswapError {\n constructor(message: string, details?: any) {\n super(message, 'CONFIGURATION_ERROR', undefined, details);\n this.name = 'ConfigurationError';\n }\n}\n\n// Legacy alias for backward compatibility\n/** @deprecated Use DiviswapError instead */\nexport const LiberExError = DiviswapError;\n","/**\n * Authentication module for Diviswap SDK\n */\n\nimport { UnifiedApiClient } from '../api/unified-client';\nimport { AuthCredentials, RegisterRequest, AuthResponse, User, ApiResponse } from '../types';\nimport { TokenData } from '../api/token-manager';\n\nexport class AuthModule {\n constructor(private client: UnifiedApiClient) {\n // Set up refresh callback for user auth mode\n this.client.setRefreshCallback(this.refreshToken.bind(this));\n }\n\n /**\n * Register a new user\n * \n * @example\n * ```typescript\n * const { user, accessToken } = await diviswap.auth.register({\n * email: 'user@example.com',\n * password: 'secure-password',\n * firstName: 'John',\n * lastName: 'Doe'\n * });\n * ```\n */\n async register(data: RegisterRequest): Promise<AuthResponse> {\n // The backend expects snake_case fields and REQUIRES individual object\n const requestData: any = {\n email: data.email,\n password: data.password,\n first_name: data.firstName || 'Test',\n last_name: data.lastName || 'User',\n // Individual object is REQUIRED by the backend\n individual: {\n // Use 'USA' (3-letter code) as seen in working lbx-landing implementation\n residential_country_code: 'USA',\n residential_address_line_one: '123 Main Street',\n residential_address_line_two: '',\n residential_city: 'Anytown', \n residential_state: 'CA',\n residential_postal_code: '12345',\n id_type: 'ssn', // Add id_type field as seen in lbx-landing\n id_country_code: 'USA',\n dob: '1990-01-01',\n id_number: '123456789' // Remove dashes from SSN like lbx-landing does\n }\n };\n\n // Allow override of individual data if provided\n if (data.individual) {\n requestData.individual = data.individual;\n }\n\n if (data.phone) requestData.phone = data.phone;\n if (data.referralCode) requestData.referral_code = data.referralCode;\n\n const response = await this.client.post<any>(\n '/api/v1/register',\n requestData,\n { useApiKey: true }\n );\n\n // Map backend response to SDK format\n const authResponse: AuthResponse = {\n accessToken: response.access_token || response.accessToken,\n refreshToken: response.refresh_token || response.refreshToken,\n user: response.user || { id: response.user_id || response.id, email: data.email }\n };\n\n // Store tokens\n if (authResponse.accessToken) {\n this.client.setTokens(authResponse.accessToken, authResponse.refreshToken);\n }\n\n return authResponse;\n }\n\n /**\n * Login an existing user\n * \n * @example\n * ```typescript\n * const { user, accessToken } = await diviswap.auth.login({\n * email: 'user@example.com',\n * password: 'secure-password'\n * });\n * ```\n */\n async login(credentials: AuthCredentials): Promise<AuthResponse> {\n const response = await this.client.post<any>(\n '/api/v1/login',\n credentials,\n { useApiKey: true } // useApiKey: true means use API key auth, not JWT\n );\n\n // Map backend response to SDK format\n const authResponse: AuthResponse = {\n accessToken: response.access_token || response.accessToken,\n refreshToken: response.refresh_token || response.refreshToken,\n user: response.user || { id: response.user_id || response.id, email: credentials.email }\n };\n\n // Store tokens\n if (authResponse.accessToken) {\n this.client.setTokens(authResponse.accessToken, authResponse.refreshToken);\n }\n\n return authResponse;\n }\n\n /**\n * Get current user profile\n * \n * @example\n * ```typescript\n * const user = await diviswap.auth.getProfile();\n * console.log(user.email, user.kycStatus);\n * ```\n * \n * Note: This endpoint is not yet available in the v1 API\n */\n async getProfile(): Promise<User> {\n throw new Error('User profile endpoint not available in v1 API yet');\n }\n\n /**\n * Update user profile\n * \n * @example\n * ```typescript\n * const updatedUser = await diviswap.auth.updateProfile({\n * firstName: 'Jane',\n * lastName: 'Smith'\n * });\n * ```\n * \n * Note: This endpoint is not yet available in the v1 API\n */\n async updateProfile(_data: Partial<User>): Promise<User> {\n throw new Error('Update profile endpoint not available in v1 API yet');\n }\n\n /**\n * Request password reset\n * \n * @example\n * ```typescript\n * await diviswap.auth.requestPasswordReset('user@example.com');\n * ```\n * \n * Note: This endpoint is not yet available in the v1 API\n */\n async requestPasswordReset(_email: string): Promise<ApiResponse> {\n throw new Error('Password reset endpoint not available in v1 API yet');\n }\n\n /**\n * Set new password with reset token\n * \n * @example\n * ```typescript\n * await diviswap.auth.setPassword('reset-token', 'new-secure-password');\n * ```\n * \n * Note: This endpoint is not yet available in the v1 API\n */\n async setPassword(_token: string, _password: string): Promise<ApiResponse> {\n throw new Error('Set password endpoint not available in v1 API yet');\n }\n\n /**\n * Logout current user\n * \n * @example\n * ```typescript\n * await diviswap.auth.logout();\n * ```\n */\n async logout(): Promise<void> {\n // Clear stored tokens\n this.client.clearTokens();\n }\n\n /**\n * Get compliance status\n * @deprecated Use diviswap.kyc.getComplianceStatus() instead\n */\n async getComplianceStatus(): Promise<any> {\n console.warn('auth.getComplianceStatus() is deprecated. Use kyc.getComplianceStatus() instead.');\n throw new Error('Compliance status endpoint not available in v1 API yet');\n }\n\n /**\n * Check if user is authenticated\n */\n isAuthenticated(): boolean {\n return !!this.client.tokenManager.getAccessToken();\n }\n\n /**\n * Refresh access token (internal)\n * \n * Note: This endpoint is not yet available in the v1 API\n */\n private async refreshToken(_refreshToken: string): Promise<TokenData> {\n throw new Error('Token refresh endpoint not available in v1 API yet');\n }\n}","/**\n * Payees module for managing bank accounts\n */\n\nimport { UnifiedApiClient } from '../api/unified-client';\nimport { Payee, CreatePayeeRequest, ApiResponse } from '../types';\n\nexport interface VerifyPayeeRequest {\n amount1: number;\n amount2: number;\n}\n\nexport class PayeesModule {\n constructor(private client: UnifiedApiClient) {}\n\n\n /**\n * Create a new payee (bank account)\n * \n * @example\n * ```typescript\n * // Bank account\n * const bankAccount = await diviswap.payees.create({\n * nickname: 'My Checking',\n * accountNumber: '123456789',\n * routingNumber: '021000021',\n * accountType: 'checking',\n * setAsDefault: true\n * });\n * \n * // Debit card\n * const debitCard = await diviswap.payees.create({\n * nickname: 'My Debit Card',\n * accountType: 'debit_card',\n * debitCard: {\n * number: '4111111111111111',\n * expirationMonth: '12',\n * expirationYear: '2025',\n * cvv: '123'\n * },\n * setAsDefault: false\n * });\n * ```\n */\n async create(data: CreatePayeeRequest): Promise<Payee> {\n try {\n let response: any;\n\n // Build request payload based on account type\n if (data.accountType === 'debit_card') {\n // Debit card structure\n if (!data.debitCard) {\n throw new Error('Debit card information is required for debit_card account type');\n }\n\n response = await this.client.post<any>('/api/v1/payees', {\n name: data.nickname,\n debit_card: {\n number: data.debitCard.number,\n expiration_month: data.debitCard.expirationMonth,\n expiration_year: data.debitCard.expirationYear,\n cvv: data.debitCard.cvv\n },\n set_as_default: data.setAsDefault || false\n });\n } else {\n // Bank account structure (checking/savings)\n if (!data.accountNumber || !data.routingNumber) {\n throw new Error('Account number and routing number are required for bank accounts');\n }\n\n response = await this.client.post<any>('/api/v1/payees', {\n name: data.nickname,\n account_number: data.accountNumber,\n routing_number: data.routingNumber,\n type: (data.accountType || 'checking').toUpperCase(),\n set_as_default: data.setAsDefault || false\n });\n }\n\n // Transform response from snake_case to camelCase\n return this.transformPayee(response);\n } catch (error: any) {\n throw new Error(`Failed to create payee: ${error.message}`);\n }\n }\n\n /**\n * List all payees\n * \n * @example\n * ```typescript\n * const payees = await diviswap.payees.list();\n * const defaultPayee = payees.find(p => p.isDefault);\n * ```\n */\n async list(): Promise<Payee[]> {\n // This endpoint requires both API key and JWT authentication\n const response = await this.client.get<any>('/api/v1/users/payees', { useApiKey: false });\n return this.parsePayeesResponse(response);\n }\n\n private parsePayeesResponse(response: any): Payee[] {\n let payeesArray: any[] = [];\n\n // Handle different response formats\n if (Array.isArray(response)) {\n payeesArray = response;\n } else if (response && typeof response === 'object') {\n // Check common response wrapper patterns\n if (response.data && Array.isArray(response.data)) {\n payeesArray = response.data;\n } else if (response.payees && Array.isArray(response.payees)) {\n payeesArray = response.payees;\n } else if (response.results && Array.isArray(response.results)) {\n payeesArray = response.results;\n }\n }\n\n return payeesArray.map(p => this.transformPayee(p));\n }\n\n private transformPayee(p: any): Payee {\n // Transform backend snake_case to SDK camelCase\n // Backend may return 'id' or 'payee_id' depending on the endpoint\n return {\n id: p.id || p.payee_id,\n nickname: p.nickname || p.name,\n accountNumber: p.accountNumber || p.account_number || '',\n routingNumber: p.routingNumber || p.routing_number || '',\n accountType: (p.accountType || p.account_type || p.type || 'checking').toLowerCase(),\n isDefault: p.isDefault ?? p.is_default ?? p.set_as_default ?? false,\n verified: p.verified ?? false,\n createdAt: p.createdAt || p.created_at || '',\n updatedAt: p.updatedAt || p.updated_at || ''\n };\n }\n\n /**\n * Get a specific payee\n * \n * @example\n * ```typescript\n * const payee = await diviswap.payees.get('payee-id');\n * ```\n */\n async get(payeeId: string): Promise<Payee> {\n const payees = await this.list();\n const payee = payees.find(p => p.id === payeeId);\n \n if (!payee) {\n throw new Error(`Payee ${payeeId} not found`);\n }\n \n return payee;\n }\n\n /**\n * Set a payee as default\n * \n * @example\n * ```typescript\n * await diviswap.payees.setDefault('payee-id');\n * ```\n */\n async setDefault(payeeId: string): Promise<Payee> {\n const response = await this.client.put<any>('/api/v1/users/payees', {\n payeeId,\n setAsDefault: true\n }, { useApiKey: false });\n return this.transformPayee(response);\n }\n\n /**\n * Delete a payee\n * \n * @example\n * ```typescript\n * await diviswap.payees.delete('payee-id');\n * ```\n */\n async delete(payeeId: string): Promise<ApiResponse> {\n return this.client.delete<ApiResponse>(\n `/api/v1/users/payees/${payeeId}`,\n { useApiKey: false }\n );\n }\n\n /**\n * Get verification status of a payee\n * \n * @example\n * ```typescript\n * const status = await diviswap.payees.getVerificationStatus('payee-id');\n * console.log(status.verified, status.microDepositsStatus);\n * ```\n */\n async getVerificationStatus(_payeeId: string): Promise<any> {\n // Note: This endpoint doesn't have a v1 equivalent yet\n throw new Error('Payee verification status endpoint not available in v1 API yet');\n }\n\n /**\n * Verify a payee with micro-deposit amounts\n * \n * @example\n * ```typescript\n * const result = await diviswap.payees.verify('payee-id', {\n * amount1: 0.32,\n * amount2: 0.45\n * });\n * ```\n */\n async verify(_payeeId: string, _data: VerifyPayeeRequest): Promise<ApiResponse> {\n // Note: This endpoint doesn't have a v1 equivalent yet\n throw new Error('Payee verification endpoint not available in v1 API yet');\n }\n\n /**\n * Get the default payee\n * \n * @example\n * ```typescript\n * const defaultPayee = await diviswap.payees.getDefault();\n * if (!defaultPayee) {\n * console.log('No default payee set');\n * }\n * ```\n */\n async getDefault(): Promise<Payee | null> {\n const payees = await this.list();\n return payees.find(p => p.isDefault) || null;\n }\n}","/**\n * Diviswap deposit addresses for different chains\n * These addresses are where users send crypto for offramp transactions\n */\n\nexport interface DepositAddresses {\n ethereum: string;\n base: string;\n polygon: string;\n [key: string]: string; // Allow additional chains\n}\n\n// Production deposit addresses\nexport const PRODUCTION_DEPOSIT_ADDRESSES: DepositAddresses = {\n ethereum: '0xa3da8ffC1D131F917f9D0Ac078D82914e75d9651',\n base: '0xa3da8ffC1D131F917f9D0Ac078D82914e75d9651',\n polygon: '0xa3da8ffC1D131F917f9D0Ac078D82914e75d9651',\n solana: 'EokHeEoZpGtBNeuJKRPvtxzXqaXz6bM5zsVB5TVPtNee'\n};\n\n// Sandbox/testnet deposit addresses\nexport const SANDBOX_DEPOSIT_ADDRESSES: DepositAddresses = {\n ethereum: '0xa3da8ffC1D131F917f9D0Ac078D82914e75d9651', // Same address for all environments\n base: '0xa3da8ffC1D131F917f9D0Ac078D82914e75d9651',\n polygon: '0xa3da8ffC1D131F917f9D0Ac078D82914e75d9651',\n solana: 'EokHeEoZpGtBNeuJKRPvtxzXqaXz6bM5zsVB5TVPtNee'\n};\n\n// Development/local deposit addresses\nexport const DEVELOPMENT_DEPOSIT_ADDRESSES: DepositAddresses = {\n ethereum: '0xa3da8ffC1D131F917f9D0Ac078D82914e75d9651', // Same unified address\n base: '0xa3da8ffC1D131F917f9D0Ac078D82914e75d9651',\n polygon: '0xa3da8ffC1D131F917f9D0Ac078D82914e75d9651',\n solana: 'EokHeEoZpGtBNeuJKRPvtxzXqaXz6bM5zsVB5TVPtNee'\n};\n\n/**\n * Get deposit addresses for the current environment\n */\nexport function getDepositAddresses(environment: 'production' | 'sandbox' | 'development'): DepositAddresses {\n switch (environment) {\n case 'production':\n return PRODUCTION_DEPOSIT_ADDRESSES;\n case 'sandbox':\n return SANDBOX_DEPOSIT_ADDRESSES;\n case 'development':\n return DEVELOPMENT_DEPOSIT_ADDRESSES;\n default:\n return SANDBOX_DEPOSIT_ADDRESSES;\n }\n}\n\n/**\n * Chain ID to chain name mapping\n */\nexport const CHAIN_ID_TO_NAME: Record<number, string> = {\n 1: 'ethereum',\n 5: 'goerli',\n 11155111: 'sepolia',\n 137: 'polygon',\n 80001: 'mumbai',\n 8453: 'base',\n 84531: 'base-goerli',\n 84532: 'base-sepolia'\n};\n\n/**\n * Chain name to chain ID mapping\n */\nexport const CHAIN_NAME_TO_ID: Record<string, number> = {\n 'ethereum': 1,\n 'eth': 1,\n 'goerli': 5,\n 'sepolia': 11155111,\n 'polygon': 137,\n 'matic': 137,\n 'mumbai': 80001,\n 'base': 8453,\n 'base-goerli': 84531,\n 'base-sepolia': 84532,\n 'solana': 999999, // Solana mainnet (custom ID for database compatibility)\n 'sol': 999999\n};\n\n/**\n * Supported stablecoin addresses by chain\n */\nexport const STABLECOIN_ADDRESSES: Record<string, Record<string, string>> = {\n ethereum: {\n USDT: '0xdac17f958d2ee523a2206206994597c13d831ec7',\n USDC: '0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48',\n DAI: '0x6b175474e89094c44da98b954eedeac495271d0f'\n },\n base: {\n USDC: '0x833589fcd6edb6e08f4c7c32d4f71b54bda02913',\n USDbC: '0xd9aaec86b65d86f6a7b5b1b0c42ffa531710b6ca' // Bridged USDC\n },\n polygon: {\n USDT: '0xc2132d05d31c914a87c6611c10748aeb04b58e8f',\n USDC: '0x2791bca1f2de4661ed88a30c99a7a9449aa84174',\n DAI: '0x8f3cf7ad23cd3cadbd9735aff958023239c6a063'\n },\n solana: {\n USDC: 'EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v', // USDC SPL token\n USDT: 'Es9vMFrzaCERmJfrF4H2FYD4KCoNkY11McCe8BenwNYB', // USDT SPL token\n SOL: 'So11111111111111111111111111111111111111112' // Wrapped SOL\n }\n};","/**\n * Transactions module for crypto on/off ramps\n */\n\nimport { UnifiedApiClient } from '../api/unified-client';\nimport { Transaction, OnrampRequest, OfframpRequest } from '../types';\nimport { getDepositAddresses, CHAIN_NAME_TO_ID, STABLECOIN_ADDRESSES } from '../constants/addresses';\n\nexport interface TransactionFilters {\n type?: 'onramp' | 'offramp';\n status?: 'pending' | 'processing' | 'completed' | 'failed';\n startDate?: string;\n endDate?: string;\n limit?: number;\n offset?: number;\n}\n\nexport interface FeeEstimate {\n amount: number;\n currency: string;\n fee: number;\n total: number;\n}\n\nexport class TransactionsModule {\n private depositAddresses: Record<string, string>;\n \n constructor(private client: UnifiedApiClient, environment: 'production' | 'sandbox' | 'development' = 'sandbox') {\n // Load deposit addresses based on environment\n this.depositAddresses = getDepositAddresses(environment);\n }\n \n \n /**\n * Map chain name to chain ID\n * @private\n */\n private getChainId(chain: string): string {\n const chainId = CHAIN_NAME_TO_ID[chain.toLowerCase()];\n return chainId ? chainId.toString() : chain;\n }\n \n /**\n * Get deposit address for a given chain\n * @private\n */\n private getDepositAddress(chain: string): string {\n // Normalize chain name\n const normalizedChain = chain.toLowerCase();\n \n // Handle aliases\n const chainName = normalizedChain === 'eth' ? 'ethereum' : \n normalizedChain === 'matic' ? 'polygon' : \n normalizedChain;\n \n const address = this.depositAddresses[chainName];\n \n if (!address || address === '0x...' || address.includes('TODO')) {\n throw new Error(`Deposit address not configured for chain: ${chain}. Please contact support.`);\n }\n \n return address;\n }\n \n /**\n * Get all configured deposit addresses\n * @returns Object mapping chain names to deposit addresses\n */\n getDepositAddresses(): Record<string, string> {\n return { ...this.depositAddresses };\n }\n \n /**\n * Get deposit address for a specific chain\n * @param chain - Chain name (e.g., 'ethereum', 'base', 'polygon')\n * @returns The deposit address for the specified chain\n * @throws Error if chain is not supported\n */\n getDepositAddressForChain(chain: string): string {\n return this.getDepositAddress(chain);\n }\n\n /**\n * Create an onramp transaction (fiat to crypto)\n * \n * @example\n * ```typescript\n * const transaction = await diviswap.transactions.onramp({\n * amount: 100,\n * currency: 'USD',\n * payeeId: 'payee-id',\n * toAddress: '0xa3da8ffC1D131F917f9D0Ac078D82914e75d9651',\n * chain: 'ethereum'\n * });\n * ```\n * \n * @throws {Error} If user is not KYC approved\n */\n async onramp(_data: OnrampRequest): Promise<Transaction> {\n // Note: The onramp endpoint is not yet available in the v1 API\n throw new Error('Onramp endpoint not available in v1 API yet');\n }\n\n /**\n * Create an offramp transaction (crypto to fiat)\n *\n * ⚠️ IMPORTANT: Follow the production pattern:\n * 1. Send crypto transaction on blockchain FIRST\n * 2. Get the transaction hash\n * 3. Call this method with the hash\n *\n * @example\n * ```typescript\n * import { extractTransactionHash } from '@diviswap/sdk';\n *\n * // 1. Send crypto transaction first and get tx hash\n * const txResult = await sendTransactionAsync({\n * to: depositAddress,\n * value: parseEther('0.5')\n * });\n *\n * // 2. Extract hash (handles different wallet return types)\n * const txHash = extractTransactionHash(txResult);\n *\n * // 3. Record the transaction\n * const transaction = await diviswap.transactions.offramp({\n * amount: 0.5,\n * currency: 'ETH',\n * fromAddress: '0xa3da8ffC1D131F917f9D0Ac078D82914e75d9651',\n * payeeId: 'payee-id',\n * chain: 'ethereum',\n * txHash: txHash\n * });\n * ```\n *\n * @throws {Error} If user is not KYC approved\n */\n async offramp(data: OfframpRequest & { txHash: string }): Promise<Transaction> {\n // Runtime validation: txHash is REQUIRED for security\n if (!data.txHash || data.txHash.trim() === '') {\n throw new Error(\n 'txHash is required for offramp transactions.'\n );\n }\n\n // Build payload with proper defaults and sanitization\n const payload: any = {\n payee_id: data.payeeId,\n tx_hash: data.txHash, // Required: must send crypto first\n from_address: data.fromAddress,\n to_address: data.toAddress || this.getDepositAddress(data.chain || 'ethereum'),\n amount: data.amount,\n currency: data.currency,\n chain_id: this.getChainId(data.chain || 'ethereum'),\n };\n\n // Only add memo if provided\n if (data.memo) {\n payload.memo = data.memo;\n }\n\n return this.client.post<Transaction>(\n `/api/v1/transactions/offramp`,\n payload,\n { useApiKey: false }\n );\n }\n\n /**\n * Create a test offramp transaction using the same production flow.\n * Requires a transaction hash - send crypto first, then call this method.\n *\n * ⚠️ IMPORTANT: Follow the production pattern:\n * 1. Send crypto transaction on blockchain FIRST\n * 2. Get the transaction hash\n * 3. Call this method with the hash\n *\n * @example\n * ```typescript\n * // 1. Send crypto transaction first and get tx hash\n * const txHash = await sendCryptoTransaction({...});\n *\n * // 2. Record the transaction using production endpoint\n * const transaction = await diviswap.transactions.offrampTest({\n * amount: 0.1,\n * currency: 'USDC',\n * fromAddress: '0x...',\n * toAddress: '0x...',\n * payeeId: 'payee-id',\n * chain: 'base',\n * txHash: txHash\n * });\n * ```\n */\n async offrampTest(data: OfframpRequest & { txHash: string }): Promise<Transaction> {\n // Runtime validation: txHash is REQUIRED for security\n if (!data.txHash || data.txHash.trim() === '') {\n throw new Error(\n 'txHash is required for offramp transactions.'\n );\n }\n\n // Build payload with proper defaults and sanitization\n const payload: any = {\n payee_id: data.payeeId,\n tx_hash: data.txHash,\n from_address: data.fromAddress,\n to_address: data.toAddress || this.getDepositAddress(data.chain || 'ethereum'),\n amount: data.amount,\n currency: data.currency,\n chain_id: this.getChainId(data.chain || 'ethereum'),\n };\n\n // Only add memo if provided\n if (data.memo) {\n payload.memo = data.memo;\n }\n\n // Use unified auth production endpoint with txHash\n return this.client.post<Transaction>(\n `/api/v1/transactions/offramp`,\n payload,\n { useApiKey: false }\n );\n }\n\n /**\n * List transactions with optional filters\n * \n * @example\n * ```typescript\n * // Get all transactions\n * const allTransactions = await diviswap.transactions.list();\n * \n * // Get only completed onramp transactions\n * const completedOnramps = await diviswap.transactions.list({\n * type: 'onramp',\n * status: 'completed'\n * });\n * ```\n */\n async list(filters?: TransactionFilters): Promise<Transaction[]> {\n const params = new URLSearchParams();\n\n if (filters) {\n Object.entries(filters).forEach(([key, value]) => {\n if (value !== undefined && value !== null) {\n params.append(key, value.toString());\n }\n });\n }\n\n const queryString = params.toString();\n const path = `/api/v1/users/transactions${queryString ? `?${queryString}` : ''}`;\n\n const response = await this.client.get<any>(path, { useApiKey: false });\n \n // Handle different response formats\n if (Array.isArray(response)) {\n return response;\n }\n \n if (response && typeof response === 'object') {\n // Check common response wrapper patterns\n if (response.data && Array.isArray(response.data)) {\n return response.data;\n }\n if (response.transactions && Array.isArray(response.transactions)) {\n return response.transactions;\n }\n if (response.results && Array.isArray(response.results)) {\n return response.results;\n }\n }\n \n return [];\n }\n\n /**\n * Get a specific transaction by ID\n * \n * @example\n * ```typescript\n * const transaction = await diviswap.transactions.get('transaction-id');\n * console.log(transaction.status, transaction.amount);\n * ```\n */\n async get(transactionId: string): Promise<Transaction> {\n const transactions = await this.list();\n const transaction = transactions.find(t => t.id === transactionId);\n \n if (!transaction) {\n throw new Error(`Transaction ${transactionId} not found`);\n }\n \n return transaction;\n }\n\n /**\n * Get fee estimate for a transaction\n * \n * @example\n * ```typescript\n * const estimate = await diviswap.transactions.estimateFees({\n * amount: 100,\n * currency: 'USD',\n * type: 'onramp'\n * });\n * console.log(`Fee: $${estimate.fee}, Total: $${estimate.total}`);\n * ```\n */\n async estimateFees(params: {\n amount: number;\n currency: string;\n type: 'onramp' | 'offramp';\n }): Promise<FeeEstimate> {\n return this.client.post<FeeEstimate>('/api/v1/fees', params);\n }\n\n /**\n * Get recent transactions (convenience method)\n * \n * @example\n * ```typescript\n * const recentTransactions = await diviswap.transactions.getRecent(10);\n * ```\n */\n async getRecent(limit = 10): Promise<Transaction[]> {\n return this.list({ limit });\n }\n\n /**\n * Get transaction statistics\n * \n * @example\n * ```typescript\n * const stats = await diviswap.transactions.getStats();\n * console.log(`Total volume: $${stats.totalVolume}`);\n * ```\n */\n async getStats(): Promise<{\n totalTransactions: number;\n totalVolume: number;\n pendingTransactions: number;\n completedTransactions: number;\n }> {\n const transactions = await this.list();\n \n const stats = transactions.reduce((acc, tx) => {\n acc.totalTransactions++;\n acc.totalVolume += tx.amount || 0;\n \n if (tx.status === 'pending' || tx.status === 'processing') {\n acc.pendingTransactions++;\n } else if (tx.status === 'completed') {\n acc.completedTransactions++;\n }\n \n return acc;\n }, {\n totalTransactions: 0,\n totalVolume: 0,\n pendingTransactions: 0,\n completedTransactions: 0,\n });\n \n return stats;\n }\n \n /**\n * Get stablecoin addresses for a specific chain\n * @param chain - Chain name (e.g., 'ethereum', 'base', 'polygon')\n * @returns Object mapping stablecoin symbols to contract addresses\n */\n getStablecoinAddresses(chain: string): Record<string, string> {\n const normalizedChain = chain.toLowerCase();\n const chainName = normalizedChain === 'eth' ? 'ethereum' : \n normalizedChain === 'matic' ? 'polygon' : \n normalizedChain;\n \n return STABLECOIN_ADDRESSES[chainName] || {};\n }\n}","/**\n * KYC/KYB module for identity verification\n */\n\nimport { UnifiedApiClient } from '../api/unified-client';\nimport { \n ComplianceStatus, \n KycSessionResponse, \n KycDocumentRequest, \n KycPersonalInfo,\n ApiResponse \n} from '../types';\nimport { ValidationError } from '../errors';\n\nexport class KycModule {\n constructor(private readonly client: UnifiedApiClient) {}\n\n /**\n * Get current compliance status including KYC and KYB\n * \n * @example\n * ```typescript\n * const status = await diviswap.kyc.getComplianceStatus();\n * \n * if (!status.canTransact) {\n * if (status.nextStep === 'COMPLETE_KYC') {\n * // Redirect to KYC flow\n * }\n * }\n * ```\n */\n async getComplianceStatus(): Promise<ComplianceStatus> {\n try {\n const profile = await this.client.get<{\n is_verified: boolean;\n onramp_verified: boolean;\n kyc?: {\n status: string;\n is_verified: boolean;\n onramp_verified: boolean;\n metadata?: any;\n };\n }>('/api/v1/users/profile');\n \n // Use KYC data from profile if available, otherwise fall back to top-level fields\n const kycData = profile.kyc;\n const kycStatus = kycData?.status || (profile.is_verified ? 'APPROVED' : 'PENDING');\n const canTransact = kycData?.onramp_verified || profile.onramp_verified || false;\n const isVerified = kycData?.is_verified || profile.is_verified || false;\n \n return {\n kycStatus: kycStatus.toUpperCase() as any,\n kybStatus: 'NOT_REQUIRED' as any,\n canTransact,\n requiresAction: !canTransact,\n verificationLevel: canTransact ? 'full' : isVerified ? 'basic' : 'none',\n nextStep: !canTransact ? 'COMPLETE_KYC' : undefined,\n kycMetadata: kycData?.metadata\n };\n } catch (error: any) {\n throw new Error(`Failed to get compliance status: ${error.message}`);\n }\n }\n\n /**\n * Start KYC verification session (opens Sumsub widget)\n * \n * @example\n * ```typescript\n * const session = await diviswap.kyc.startKycSession();\n * \n * // Redirect user to session URL\n * window.location.href = session.sessionUrl;\n * \n * // Or embed in iframe\n * const iframe = document.createElement('iframe');\n * iframe.src = session.sessionUrl;\n * ```\n */\n async startKycSession(): Promise<KycSessionResponse> {\n // Note: This endpoint is not yet available in the v1 API\n throw new Error('KYC session endpoint not available in v1 API yet');\n }\n\n /**\n * Submit KYC documents programmatically\n * \n * @example\n * ```typescript\n * // Convert file to base64\n * const toBase64 = (file: File) => new Promise<string>((resolve, reject) => {\n * const reader = new FileReader();\n * reader.readAsDataURL(file);\n * reader.onload = () => resolve(reader.result as string);\n * reader.onerror = reject;\n * });\n * \n * const frontImage = await toBase64(frontFile);\n * const backImage = await toBase64(backFile);\n * \n * await diviswap.kyc.submitDocuments({\n * type: 'DRIVERS_LICENSE',\n * frontImage,\n * backImage\n * });\n * ```\n */\n async submitDocuments(documents: KycDocumentRequest): Promise<ApiResponse> {\n // Validate document data\n if (!documents.frontImage) {\n throw new ValidationError('Front image is required');\n }\n \n if (['DRIVERS_LICENSE', 'ID_CARD'].includes(documents.type) && !documents.backImage) {\n throw new ValidationError(`Back image is required for ${documents.type}`);\n }\n \n // Note: This endpoint is not yet available in the v1 API\n throw new Error('KYC documents endpoint not available in v1 API yet');\n }\n\n /**\n * Submit personal information for KYC\n * \n * @example\n * ```typescript\n * await diviswap.kyc.submitPersonalInfo({\n * firstName: 'John',\n * lastName: 'Doe',\n * dateOfBirth: '1990-01-01',\n * ssn: '123-45-6789',\n * address: {\n * street: '123 Main St',\n * city: 'New York',\n * state: 'NY',\n * postalCode: '10001',\n * country: 'US'\n * }\n * });\n * ```\n */\n async submitPersonalInfo(info: KycPersonalInfo): Promise<ApiResponse> {\n // Validate required fields\n const requiredFields = ['firstName', 'lastName', 'dateOfBirth'];\n for (const field of requiredFields) {\n if (!info[field as keyof KycPersonalInfo]) {\n throw new ValidationError(`${field} is required`);\n }\n }\n \n if (!info.address || !info.address.street || !info.address.city || \n !info.address.state || !info.address.postalCode || !info.address.country) {\n throw new ValidationError('Complete address is required');\n }\n \n try {\n const response = await this.client.post<ApiResponse>('/api/v1/kyc/personal-info', {\n first_name: info.firstName,\n last_name: info.lastName,\n dob: info.dateOfBirth,\n country: info.address.country,\n ...(info.phone && { phone: info.phone }),\n ...(info.address.street && { address: info.address.street }),\n ...(info.address.city && { city: info.address.city }),\n ...(info.address.state && { state: info.address.state }),\n ...(info.address.postalCode && { postal_code: info.address.postalCode }),\n ...(info.ssn && { ssn: info.ssn })\n });\n \n return response;\n } catch (error: any) {\n throw new Error(`Failed to submit KYC info: ${error.message}`);\n }\n }\n\n /**\n * Check if user can transact (convenience method)\n * \n * @example\n * ```typescript\n * const canTransact = await diviswap.kyc.canTransact();\n * if (!canTransact) {\n * // Show KYC prompt\n * }\n * ```\n */\n async canTransact(): Promise<boolean> {\n const status = await this.getComplianceStatus();\n return status.canTransact;\n }\n\n /**\n * Check if KYC is approved\n * \n * @example\n * ```typescript\n * const isApproved = await diviswap.kyc.isKycApproved();\n * ```\n */\n async isKycApproved(): Promise<boolean> {\n const status = await this.getComplianceStatus();\n return status.kycStatus === 'APPROVED';\n }\n\n /**\n * Check if KYB is approved (for business accounts)\n * \n * @example\n * ```typescript\n * const isBusinessApproved = await diviswap.kyc.isKybApproved();\n * ```\n */\n async isKybApproved(): Promise<boolean> {\n const status = await this.getComplianceStatus();\n return status.kybStatus === 'APPROVED';\n }\n\n /**\n * Get rejection reasons if KYC/KYB was rejected\n * \n * @example\n * ```typescript\n * const reasons = await diviswap.kyc.getRejectionReasons();\n * if (reasons.length > 0) {\n * console.log('Rejected because:', reasons.join(', '));\n * }\n * ```\n */\n async getRejectionReasons(): Promise<string[]> {\n const status = await this.getComplianceStatus();\n const reasons: string[] = [];\n \n if (status.kycStatus === 'REJECTED' && status.kycMetadata?.rejectLabels) {\n reasons.push(...status.kycMetadata.rejectLabels);\n }\n \n return reasons;\n }\n\n /**\n * Wait for KYC approval (polling)\n * \n * @example\n * ```typescript\n * // Start KYC session\n * const session = await diviswap.kyc.startKycSession();\n * window.open(session.sessionUrl);\n * \n * // Wait for approval (polls every 5 seconds for up to 10 minutes)\n * try {\n * await diviswap.kyc.waitForApproval();\n * console.log('KYC approved!');\n * } catch (error) {\n * console.log('KYC not approved:', error.message);\n * }\n * ```\n */\n async waitForApproval(options?: {\n pollInterval?: number;\n maxAttempts?: number;\n }): Promise<ComplianceStatus> {\n const pollInterval = options?.pollInterval || 5000; // 5 seconds\n const maxAttempts = options?.maxAttempts || 120; // 10 minutes total\n \n let attempts = 0;\n \n while (attempts < maxAttempts) {\n const status = await this.getComplianceStatus();\n \n if (status.kycStatus === 'APPROVED') {\n return status;\n }\n \n if (status.kycStatus === 'REJECTED') {\n throw new Error(`KYC rejected: ${status.kycMetadata?.rejectLabels?.join(', ') || 'Unknown reason'}`);\n }\n \n attempts++;\n await new Promise(resolve => setTimeout(resolve, pollInterval));\n }\n \n throw new Error('KYC approval timeout');\n }\n}","/**\n * Fees module for managing integrator fees\n *\n * This module allows integrators to:\n * - Set a custom fee percentage on top of Diviswap's base 1.5% fee\n * - Configure fees globally or per-user\n * - Retrieve current fee settings\n * - Calculate total fees for transactions\n */\n\nimport { UnifiedApiClient } from '../api/unified-client';\n\nexport interface FeeSettings {\n integratorFeePercentage: number; // Your custom fee (e.g., 0.5%)\n baseFeePercentage: number; // Diviswap base fee (1.5%)\n totalFeePercentage: number; // Combined fee\n userId?: string; // Optional: for per-user fee settings\n}\n\nexport interface SetFeeRequest {\n percentage: number; // Fee percentage (e.g., 0.5 for 0.5%)\n userId?: number; // Optional: set fee for specific user\n}\n\nexport interface FeeCalculation {\n amount: number;\n baseFee: number;\n integratorFee: number;\n totalFee: number;\n netAmount: number; // Amount after all fees\n}\n\nexport class FeesModule {\n private client: UnifiedApiClient;\n\n constructor(client: UnifiedApiClient) {\n this.client = client;\n }\n\n /**\n * Set integrator fee percentage\n *\n * @example\n * ```typescript\n * // Set global integrator fee to 0.75% (applies to all your users)\n * await diviswap.fees.setFee({ percentage: 0.75 });\n *\n * // Set fee for specific user (overrides global)\n * await diviswap.fees.setFee({\n * percentage: 1.0,\n * userId: 123\n * });\n * ```\n */\n async setFee(data: SetFeeRequest): Promise<FeeSettings> {\n // If userId specified, set user-specific fee override\n if (data.userId) {\n await this.client.put<any>(`/api/v1/partner/users/${data.userId}/fee`, {\n percentage: data.percentage\n });\n\n return {\n integratorFeePercentage: data.percentage,\n baseFeePercentage: 1.5,\n totalFeePercentage: 1.5 + data.percentage,\n userId: data.userId.toString()\n };\n }\n\n // Otherwise, set global default for all users\n const response = await this.client.put<any>('/api/v1/partner/fee', {\n percentage: data.percentage\n });\n\n return {\n integratorFeePercentage: response.integrator_fee_percentage,\n baseFeePercentage: response.base_fee_percentage,\n totalFeePercentage: response.total_fee_percentage\n };\n }\n\n /**\n * Get current fee settings\n *\n * @example\n * ```typescript\n * // Get global fee settings (your default)\n * const fees = await diviswap.fees.getFees();\n * console.log(`Total fee: ${fees.totalFeePercentage}%`);\n * ```\n */\n async getFees(): Promise<FeeSettings> {\n // Get partner's default fee settings\n const response = await this.client.get<any>('/api/v1/partner/fee');\n\n return {\n integratorFeePercentage: response.integrator_fee_percentage,\n baseFeePercentage: response.base_fee_percentage,\n totalFeePercentage: response.total_fee_percentage\n };\n }\n\n\n /**\n * Calculate fees for a transaction amount\n *\n * @example\n * ```typescript\n * const calc = await diviswap.fees.calculateFees({\n * amount: 100,\n * userId: 123 // Optional: checks for user-specific override\n * });\n *\n * console.log(`Base fee: $${calc.baseFee}`);\n * console.log(`Your fee: $${calc.integratorFee}`);\n * console.log(`Total fee: $${calc.totalFee}`);\n * console.log(`User receives: $${calc.netAmount}`);\n * ```\n */\n async calculateFees(params: {\n amount: number;\n userId?: number;\n }): Promise<FeeCalculation> {\n const response = await this.client.post<any>('/api/v1/partner/fees/calculate', {\n amount: params.amount,\n user_id: params.userId\n });\n\n return {\n amount: response.amount,\n baseFee: response.base_fee,\n integratorFee: response.integrator_fee,\n totalFee: response.total_fee,\n netAmount: response.net_amount\n };\n }\n\n /**\n * Remove custom fee for a user (reverts to partner default)\n *\n * @example\n * ```typescript\n * // Remove VIP user's custom fee, they'll use your default fee again\n * await diviswap.fees.removeFee(123);\n * ```\n */\n async removeFee(userId: number): Promise<void> {\n await this.client.delete<any>(`/api/v1/partner/users/${userId}/fee`);\n }\n}","/**\n * Address-related type definitions\n */\n\nexport interface Address {\n id: number;\n uuid: string;\n uuid_history: string[];\n chain_id: number;\n address: string;\n is_default: boolean;\n user_id?: number;\n organization_id?: number;\n created_at: string;\n updated_at: string;\n}\n\nexport interface CreateAddressRequest {\n chain_id: number;\n address: string;\n is_default?: boolean;\n}\n\nexport interface SetDefaultAddressRequest {\n chain_id: number;\n address: string;\n}\n\nexport interface DeleteAddressRequest {\n chain_id: number;\n address: string;\n}\n\n/**\n * Chain ID mappings\n */\nexport const CHAIN_IDS = {\n // Mainnets\n ethereum: 1,\n optimism: 10,\n base: 8453,\n polygon: 137,\n arbitrum: 42161,\n \n // Testnets\n sepolia: 11155111,\n optimism_sepolia: 11155420,\n base_sepolia: 84532,\n polygon_mumbai: 80001,\n arbitrum_sepolia: 421614\n} as const;\n\nexport type ChainName = keyof typeof CHAIN_IDS;\n\n/**\n * Wallet connection info for automatic tracking\n */\nexport interface WalletConnection {\n address: string;\n chainId: number;\n chainName?: string;\n}","/**\n * Addresses module for managing crypto addresses\n */\n\nimport { UnifiedApiClient } from '../api/unified-client';\nimport { \n Address, \n CreateAddressRequest, \n SetDefaultAddressRequest, \n DeleteAddressRequest,\n WalletConnection,\n CHAIN_IDS,\n ChainName \n} from '../types/addresses';\n\nexport class AddressesModule {\n constructor(private client: UnifiedApiClient) {}\n\n /**\n * Get all addresses for the authenticated user\n * \n * @example\n * ```typescript\n * const addresses = await diviswap.addresses.list();\n * console.log('User addresses:', addresses);\n * ```\n */\n async list(): Promise<Address[]> {\n const response = await this.client.get<Address[]>('/api/v1/addresses');\n return Array.isArray(response) ? response : [];\n }\n\n /**\n * Create a new crypto address for the user\n * \n * @example\n * ```typescript\n * const address = await diviswap.addresses.create({\n * chain_id: 1, // Ethereum mainnet\n * address: '0x742d35Cc6647C9532c9fc77C68076aFb1e5AAc05',\n * is_default: true\n * });\n * ```\n */\n async create(data: CreateAddressRequest): Promise<Address> {\n const response = await this.client.post<{ status: string; message: string; id: number }>('/api/v1/addresses', data);\n \n // After creating, fetch the updated list to return the full address object\n const addresses = await this.list();\n const newAddress = addresses.find(addr => addr.id === response.id);\n \n if (!newAddress) {\n throw new Error('Failed to retrieve created address');\n }\n \n return newAddress;\n }\n\n /**\n * Set a specific address as the default for its chain\n * \n * @example\n * ```typescript\n * await diviswap.addresses.setDefault({\n * chain_id: 1,\n * address: '0x742d35Cc6647C9532c9fc77C68076aFb1e5AAc05'\n * });\n * ```\n */\n async setDefault(data: SetDefaultAddressRequest): Promise<void> {\n await this.client.put('/api/v1/addresses/default', data);\n }\n\n /**\n * Delete a crypto address\n * \n * @example\n * ```typescript\n * await diviswap.addresses.delete({\n * chain_id: 1,\n * address: '0x742d35Cc6647C9532c9fc77C68076aFb1e5AAc05'\n * });\n * ```\n */\n async delete(data: DeleteAddressRequest): Promise<void> {\n await this.client.delete('/api/v1/addresses', { body: data });\n }\n\n /**\n * Get addresses for a specific chain\n * \n * @example\n * ```typescript\n * const ethAddresses = await diviswap.addresses.getByChain(1);\n * const baseAddresses = await diviswap.addresses.getByChain('base');\n * ```\n */\n async getByChain(chainIdOrName: number | ChainName): Promise<Address[]> {\n const chainId = typeof chainIdOrName === 'string' ? CHAIN_IDS[chainIdOrName] : chainIdOrName;\n const addresses = await this.list();\n return addresses.filter(addr => addr.chain_id === chainId);\n }\n\n /**\n * Get the default address for a specific chain\n * \n * @example\n * ```typescript\n * const defaultEthAddress = await diviswap.addresses.getDefault(1);\n * const defaultBaseAddress = await diviswap.addresses.getDefault('base');\n * ```\n */\n async getDefault(chainIdOrName: number | ChainName): Promise<Address | null> {\n const chainId = typeof chainIdOrName === 'string' ? CHAIN_IDS[chainIdOrName] : chainIdOrName;\n const addresses = await this.list();\n return addresses.find(addr => addr.chain_id === chainId && addr.is_default) || null;\n }\n\n /**\n * Check if an address exists for the user\n * \n * @example\n * ```typescript\n * const exists = await diviswap.addresses.exists({\n * chain_id: 1,\n * address: '0x742d35Cc6647C9532c9fc77C68076aFb1e5AAc05'\n * });\n * ```\n */\n async exists(data: { chain_id: number; address: string }): Promise<boolean> {\n const addresses = await this.list();\n return addresses.some(addr => \n addr.chain_id === data.chain_id && \n addr.address.toLowerCase() === data.address.toLowerCase()\n );\n }\n\n /**\n * Automatically track a wallet connection\n * This is the main method for automatic address tracking\n * \n * @example\n * ```typescript\n * // When user connects wallet\n * const connection = await diviswap.addresses.trackWallet({\n * address: account,\n * chainId: chainId,\n * chainName: 'ethereum' // optional\n * });\n * ```\n */\n async trackWallet(connection: WalletConnection): Promise<Address> {\n // Check if address already exists\n const existsAlready = await this.exists({\n chain_id: connection.chainId,\n address: connection.address\n });\n\n if (existsAlready) {\n // Return existing address\n const addresses = await this.list();\n const existingAddress = addresses.find(addr => \n addr.chain_id === connection.chainId && \n addr.address.toLowerCase() === connection.address.toLowerCase()\n );\n \n if (!existingAddress) {\n throw new Error('Address exists but could not be retrieved');\n }\n \n return existingAddress;\n }\n\n // Create new address - set as default if it's the first for this chain\n const existingOnChain = await this.getByChain(connection.chainId);\n const isDefault = existingOnChain.length === 0;\n\n return await this.create({\n chain_id: connection.chainId,\n address: connection.address,\n is_default: isDefault\n });\n }\n\n /**\n * Auto-track multiple wallet connections (useful for multi-chain wallets)\n * \n * @example\n * ```typescript\n * // When user connects a multi-chain wallet\n * const addresses = await diviswap.addresses.trackMultipleWallets([\n * { address: account, chainId: 1 }, // Ethereum\n * { address: account, chainId: 8453 }, // Base\n * { address: account, chainId: 10 } // Optimism\n * ]);\n * ```\n */\n async trackMultipleWallets(connections: WalletConnection[]): Promise<Address[]> {\n const results: Address[] = [];\n \n for (const connection of connections) {\n try {\n const address = await this.trackWallet(connection);\n results.push(address);\n } catch (error) {\n console.error(`Failed to track wallet for chain ${connection.chainId}:`, error);\n // Continue with other chains even if one fails\n }\n }\n \n return results;\n }\n\n /**\n * Helper to get chain name from chain ID\n */\n getChainName(chainId: number): string | undefined {\n return Object.entries(CHAIN_IDS).find(([_, id]) => id === chainId)?.[0];\n }\n\n /**\n * Helper to get chain ID from chain name\n */\n getChainId(chainName: ChainName): number {\n return CHAIN_IDS[chainName];\n }\n\n /**\n * Get all supported chains\n */\n getSupportedChains(): Record<string, number> {\n return { ...CHAIN_IDS };\n }\n}","/**\n * Webhooks module for managing partner webhook configurations\n */\n\nimport { UnifiedApiClient } from '../api/unified-client';\n\nexport interface WebhookConfig {\n webhook_url: string | null;\n has_webhook_secret: boolean;\n enabled: boolean;\n}\n\nexport interface WebhookEvent {\n id: number;\n partner_id: number;\n user_id: number | null;\n event_type: string;\n payload: any;\n status: 'pending' | 'delivered' | 'failed';\n response_code: number | null;\n attempts: number;\n max_attempts: number;\n created_at: string;\n delivered_at: string | null;\n next_retry_at: string | null;\n}\n\nexport interface SetWebhookRequest {\n webhook_url: string;\n webhook_secret?: string;\n}\n\nexport class WebhooksModule {\n constructor(private client: UnifiedApiClient) {}\n\n /**\n * Set webhook URL and secret for your partner account\n *\n * @example\n * ```typescript\n * await diviswap.webhooks.setConfig({\n * webhook_url: 'https://myapp.com/api/webhooks/diviswap',\n * webhook_secret: 'whsec_...' // Optional, auto-generated if not provided\n * });\n * ```\n */\n async setConfig(data: SetWebhookRequest): Promise<{\n success: boolean;\n webhook_url: string;\n webhook_secret: string;\n }> {\n // For partner HMAC auth, use partner-specific endpoint\n // For user JWT auth (dashboard), need partner_id\n const response = await this.client.put<any>('/api/v1/partner/webhook', {\n webhook_url: data.webhook_url,\n webhook_secret: data.webhook_secret\n });\n\n return response;\n }\n\n /**\n * Set webhook for a specific partner (user-owned partner)\n *\n * @example\n * ```typescript\n * await diviswap.webhooks.setConfigForPartner(4, {\n * webhook_url: 'https://myapp.com/webhooks'\n * });\n * ```\n */\n async setConfigForPartner(partnerId: number, data: SetWebhookRequest): Promise<{\n success: boolean;\n webhook_url: string;\n webhook_secret: string;\n }> {\n const response = await this.client.put<any>(`/api/v1/partners/${partnerId}/webhook`, {\n webhook_url: data.webhook_url,\n webhook_secret: data.webhook_secret\n });\n\n return response;\n }\n\n /**\n * Get current webhook configuration\n *\n * @example\n * ```typescript\n * const config = await diviswap.webhooks.getConfig();\n * console.log(`Webhook enabled: ${config.enabled}`);\n * console.log(`URL: ${config.webhook_url}`);\n * ```\n */\n async getConfig(): Promise<WebhookConfig> {\n const response = await this.client.get<WebhookConfig>('/api/v1/partner/webhook');\n return response;\n }\n\n /**\n * Get webhook config for a specific partner (user-owned)\n */\n async getConfigForPartner(partnerId: number): Promise<WebhookConfig> {\n const response = await this.client.get<WebhookConfig>(`/api/v1/partners/${partnerId}/webhook`);\n return response;\n }\n\n /**\n * List webhook delivery events\n *\n * @example\n * ```typescript\n * const events = await diviswap.webhooks.listEvents({\n * limit: 100,\n * status: 'failed'\n * });\n *\n * events.forEach(event => {\n * console.log(`${event.event_type}: ${event.status}`);\n * });\n * ```\n */\n async listEvents(options?: {\n partnerId?: number;\n limit?: number;\n status?: 'pending' | 'delivered' | 'failed';\n }): Promise<{ success: boolean; events: WebhookEvent[] }> {\n const params = new URLSearchParams();\n\n if (options?.limit) params.append('limit', options.limit.toString());\n if (options?.status) params.append('status', options.status);\n\n const path = options?.partnerId\n ? `/api/v1/partners/${options.partnerId}/webhook/events?${params}`\n : `/api/v1/partner/webhook/events?${params}`;\n\n const response = await this.client.get<any>(path);\n return response;\n }\n\n /**\n * Send a test webhook to verify your endpoint is working\n *\n * @example\n * ```typescript\n * const result = await diviswap.webhooks.test();\n * if (result.success) {\n * console.log('Webhook endpoint is working!');\n * }\n * ```\n */\n async test(partnerId?: number): Promise<any> {\n const path = partnerId\n ? `/api/v1/partners/${partnerId}/webhook/test`\n : '/api/v1/partner/webhook/test';\n\n return await this.client.post<any>(path);\n }\n\n /**\n * Verify a webhook signature (static helper for your webhook endpoint)\n *\n * @example\n * ```typescript\n * import crypto from 'crypto';\n *\n * const isValid = WebhooksModule.verifySignature(\n * rawBody,\n * request.headers['x-signature'],\n * process.env.WEBHOOK_SECRET\n * );\n * ```\n */\n static verifySignature(\n payload: string,\n signature: string,\n secret: string\n ): boolean {\n // This is a client-side helper, actual implementation in template\n const crypto = require('crypto');\n const expectedSignature = crypto\n .createHmac('sha256', secret)\n .update(payload)\n .digest('hex');\n\n return crypto.timingSafeEqual(\n Buffer.from(signature),\n Buffer.from(expectedSignature)\n );\n }\n}\n","/**\n * JWT Token management with auto-refresh\n */\n\nexport interface TokenData {\n accessToken: string;\n refreshToken?: string;\n expiresAt?: number;\n}\n\nexport interface TokenStorage {\n get(): TokenData | null;\n set(data: TokenData): void;\n clear(): void;\n}\n\n/**\n * In-memory token storage (default)\n */\nclass MemoryTokenStorage implements TokenStorage {\n private data: TokenData | null = null;\n\n get(): TokenData | null {\n return this.data;\n }\n\n set(data: TokenData): void {\n this.data = data;\n }\n\n clear(): void {\n this.data = null;\n }\n}\n\n/**\n * Browser localStorage token storage\n */\nclass LocalStorageTokenStorage implements TokenStorage {\n private key = 'liberex_tokens';\n\n get(): TokenData | null {\n if (typeof globalThis.window === 'undefined') return null;\n \n const data = globalThis.localStorage.getItem(this.key);\n if (!data) return null;\n \n try {\n return JSON.parse(data);\n } catch {\n return null;\n }\n }\n\n set(data: TokenData): void {\n if (typeof globalThis.window === 'undefined') return;\n globalThis.localStorage.setItem(this.key, JSON.stringify(data));\n }\n\n clear(): void {\n if (typeof globalThis.window === 'undefined') return;\n globalThis.localStorage.removeItem(this.key);\n }\n}\n\n/**\n * Token Manager handles JWT token lifecycle\n */\nexport class TokenManager {\n private storage: TokenStorage;\n private refreshPromise: Promise<TokenData> | null = null;\n\n constructor(useLocalStorage = false) {\n this.storage = useLocalStorage && typeof globalThis.window !== 'undefined' \n ? new LocalStorageTokenStorage()\n : new MemoryTokenStorage();\n }\n\n /**\n * Parse JWT token to extract expiration\n */\n private parseToken(token: string): { exp?: number } {\n try {\n const payload = token.split('.')[1];\n const decoded = atob(payload.replace(/-/g, '+').replace(/_/g, '/'));\n return JSON.parse(decoded);\n } catch {\n return {};\n }\n }\n\n /**\n * Store tokens\n */\n setTokens(accessToken: string, refreshToken?: string): void {\n const parsed = this.parseToken(accessToken);\n const expiresAt = parsed.exp ? parsed.exp * 1000 : undefined;\n \n this.storage.set({\n accessToken,\n refreshToken,\n expiresAt,\n });\n }\n\n /**\n * Get current access token\n */\n getAccessToken(): string | null {\n const data = this.storage.get();\n return data?.accessToken || null;\n }\n\n /**\n * Get refresh token\n */\n getRefreshToken(): string | null {\n const data = this.storage.get();\n return data?.refreshToken || null;\n }\n\n /**\n * Check if token is expired or about to expire (5 min buffer)\n */\n isTokenExpired(): boolean {\n const data = this.storage.get();\n if (!data?.expiresAt) return true;\n \n const bufferTime = 5 * 60 * 1000; // 5 minutes\n return Date.now() >= (data.expiresAt - bufferTime);\n }\n\n /**\n * Clear all tokens\n */\n clearTokens(): void {\n this.storage.clear();\n this.refreshPromise = null;\n }\n\n /**\n * Refresh access token\n */\n async refreshAccessToken(refreshCallback: (refreshToken: string) => Promise<TokenData>): Promise<string> {\n // Prevent multiple simultaneous refresh attempts\n if (this.refreshPromise) {\n const result = await this.refreshPromise;\n return result.accessToken;\n }\n\n const refreshToken = this.getRefreshToken();\n if (!refreshToken) {\n throw new Error('No refresh token available');\n }\n\n this.refreshPromise = refreshCallback(refreshToken);\n\n try {\n const newTokenData = await this.refreshPromise;\n this.setTokens(newTokenData.accessToken, newTokenData.refreshToken || refreshToken);\n return newTokenData.accessToken;\n } finally {\n this.refreshPromise = null;\n }\n }\n\n /**\n * Get valid access token (refresh if needed)\n */\n async getValidAccessToken(refreshCallback?: (refreshToken: string) => Promise<TokenData>): Promise<string | null> {\n const token = this.getAccessToken();\n if (!token) return null;\n\n if (this.isTokenExpired() && refreshCallback) {\n try {\n return await this.refreshAccessToken(refreshCallback);\n } catch {\n this.clearTokens();\n return null;\n }\n }\n\n return token;\n }\n}","/**\n * Partner authentication for the Diviswap SDK\n * Supports HMAC and JWT authentication methods for partners\n */\n\nimport crypto from 'crypto';\n\nexport interface PartnerCredentials {\n keyId: string; // Partner key ID (pk_...)\n secretKey: string; // Partner secret key (sk_...)\n customerId?: string; // Partner's user identifier (for shadow user linking)\n customerEmail?: string; // Partner's user email\n}\n\nexport interface HMACAuthHeaders {\n 'Authorization': string; // HMAC keyId:signature:timestamp:nonce\n 'X-Client-Id': string; // Partner key ID\n 'X-Customer-Id'?: string; // Optional: partner's user ID\n 'X-Customer-Email'?: string; // Optional: partner's user email\n}\n\nexport class PartnerAuth {\n private credentials: PartnerCredentials;\n\n constructor(credentials: PartnerCredentials) {\n this.credentials = credentials;\n }\n\n /**\n * Generate HMAC authentication headers for a request\n */\n generateHMACHeaders(\n method: string,\n path: string, \n queryString: string = '',\n body: string = ''\n ): HMACAuthHeaders {\n const timestamp = Math.floor(new Date().getTime() / 1000);\n const nonce = this.generateNonce();\n \n // 1. Build canonical request string\n const bodyHash = crypto.createHash('sha256').update(body).digest('hex');\n // Use explicit array join to ensure proper newlines\n const canonical = [\n method,\n path,\n queryString,\n bodyHash,\n timestamp,\n nonce\n ].join('\\n');\n \n \n // 2. Sign with HMAC-SHA256\n const signature = crypto\n .createHmac('sha256', this.credentials.secretKey)\n .update(canonical)\n .digest('base64');\n \n \n // 3. Build headers\n const headers: HMACAuthHeaders = {\n 'Authorization': `HMAC ${this.credentials.keyId}:${signature}:${timestamp}:${nonce}`,\n 'X-Client-Id': this.credentials.keyId,\n };\n\n // Add optional customer headers\n if (this.credentials.customerId) {\n headers['X-Customer-Id'] = this.credentials.customerId;\n }\n if (this.credentials.customerEmail) {\n headers['X-Customer-Email'] = this.credentials.customerEmail;\n }\n\n return headers;\n }\n\n /**\n * Generate a unique nonce for replay protection\n */\n private generateNonce(): string {\n return crypto.randomBytes(32).toString('base64url');\n }\n\n /**\n * Generate a JWT token for partner authentication\n */\n generateJWT(options: {\n audience?: string;\n expiresIn?: number; // seconds (max 300)\n scopes?: string[];\n } = {}): string {\n const {\n audience = 'api.liberex.sv',\n expiresIn = 300, // 5 minutes max\n scopes = []\n } = options;\n\n const now = Math.floor(Date.now() / 1000);\n const payload = {\n iss: this.credentials.keyId, // Issuer: partner key ID\n aud: audience, // Audience: API domain\n exp: now + Math.min(expiresIn, 300), // Expiration (max 5 minutes)\n iat: now, // Issued at\n ...(this.credentials.customerId && { sub: this.credentials.customerId }),\n ...(this.credentials.customerEmail && { email: this.credentials.customerEmail }),\n ...(scopes.length > 0 && { scope: scopes })\n };\n\n // Sign with HMAC using secret key\n const header = { alg: 'HS256', typ: 'JWT' };\n const encodedHeader = Buffer.from(JSON.stringify(header)).toString('base64url');\n const encodedPayload = Buffer.from(JSON.stringify(payload)).toString('base64url');\n \n const signature = crypto\n .createHmac('sha256', this.credentials.secretKey)\n .update(`${encodedHeader}.${encodedPayload}`)\n .digest('base64url');\n\n return `${encodedHeader}.${encodedPayload}.${signature}`;\n }\n\n /**\n * Set customer context for shadow user linking\n */\n setCustomer(customerId: string, customerEmail?: string): void {\n this.credentials.customerId = customerId;\n this.credentials.customerEmail = customerEmail;\n }\n\n /**\n * Clear customer context\n */\n clearCustomer(): void {\n delete this.credentials.customerId;\n delete this.credentials.customerEmail;\n }\n}","/**\n * Unified API Client supporting both user and partner authentication\n */\n\nimport { AuthenticationError, NetworkError, ValidationError, DiviswapError } from '../errors';\nimport { TokenManager, TokenData } from './token-manager';\nimport { PartnerAuth } from '../auth/partner-auth';\nimport { UserDiviswapConfig, PartnerDiviswapConfig, DiviswapConfig, AuthMode } from '../types';\n\nexport interface UnifiedApiClientConfig {\n baseUrl: string;\n timeout: number;\n debug: boolean;\n mode: AuthMode;\n\n // User auth fields (legacy)\n apiKey?: string;\n clientId?: string;\n\n // Partner auth fields (new)\n keyId?: string;\n secretKey?: string;\n authMethod?: 'hmac' | 'jwt';\n customerId?: string;\n customerEmail?: string;\n}\n\nexport interface RequestOptions {\n method: 'GET' | 'POST' | 'PUT' | 'DELETE';\n path: string;\n body?: any;\n headers?: Record<string, string>;\n useApiKey?: boolean;\n skipAuth?: boolean;\n}\n\n/**\n * Unified API client supporting both user and partner authentication modes\n */\nexport class UnifiedApiClient {\n private config: UnifiedApiClientConfig;\n public tokenManager: TokenManager;\n private partnerAuth?: PartnerAuth;\n private refreshCallback?: (refreshToken: string) => Promise<TokenData>;\n\n constructor(config: UnifiedApiClientConfig, useLocalStorage = true) {\n this.config = config;\n this.tokenManager = new TokenManager(useLocalStorage);\n \n // Initialize partner auth if in partner mode\n if (config.mode === 'partner' && config.keyId && config.secretKey) {\n this.partnerAuth = new PartnerAuth({\n keyId: config.keyId,\n secretKey: config.secretKey,\n customerId: config.customerId,\n customerEmail: config.customerEmail\n });\n }\n }\n\n /**\n * Create client from legacy user config (backward compatibility)\n */\n static fromUserConfig(config: UserDiviswapConfig, useLocalStorage = true): UnifiedApiClient {\n const baseUrl = config.apiUrl || this.getDefaultApiUrl(config.environment || 'production');\n\n return new UnifiedApiClient({\n baseUrl,\n timeout: config.timeout || 30000,\n debug: config.debug || false,\n mode: 'user',\n apiKey: config.apiKey,\n clientId: config.clientId\n }, useLocalStorage);\n }\n\n /**\n * Create client from partner config\n */\n static fromPartnerConfig(config: PartnerDiviswapConfig, useLocalStorage = true): UnifiedApiClient {\n const baseUrl = config.apiUrl || this.getDefaultApiUrl(config.environment || 'production');\n\n return new UnifiedApiClient({\n baseUrl,\n timeout: config.timeout || 30000,\n debug: config.debug || false,\n mode: 'partner',\n keyId: config.keyId,\n secretKey: config.secretKey,\n authMethod: config.authMethod || 'hmac',\n customerId: config.customerId,\n customerEmail: config.customerEmail\n }, useLocalStorage);\n }\n\n /**\n * Create client from any config (auto-detect mode)\n */\n static fromConfig(config: DiviswapConfig, useLocalStorage = true): UnifiedApiClient {\n // Auto-detect partner mode by checking for partner credentials\n if (('mode' in config && config.mode === 'partner') ||\n ('keyId' in config && 'secretKey' in config)) {\n return this.fromPartnerConfig(config as PartnerDiviswapConfig, useLocalStorage);\n } else {\n // Assume user config (backward compatibility)\n return this.fromUserConfig(config as UserDiviswapConfig, useLocalStorage);\n }\n }\n\n private static getDefaultApiUrl(environment: string): string {\n // Sandbox mode is now credential-based (partner.is_sandbox), not server-based.\n // Both 'production' and 'sandbox' environments use the same API server.\n // The 'development' environment is reserved for internal Liberex development.\n switch (environment) {\n case 'production':\n case 'sandbox':\n return 'https://api.liberex.sv';\n case 'development':\n return 'https://dev-api.liberex.sv';\n default:\n return 'https://api.liberex.sv';\n }\n }\n\n /**\n * Update customer context for partner auth\n */\n setCustomer(customerId: string, customerEmail?: string): void {\n if (this.partnerAuth) {\n this.partnerAuth.setCustomer(customerId, customerEmail);\n }\n this.config.customerId = customerId;\n this.config.customerEmail = customerEmail;\n }\n\n /**\n * Clear customer context\n */\n clearCustomer(): void {\n if (this.partnerAuth) {\n this.partnerAuth.clearCustomer();\n }\n delete this.config.customerId;\n delete this.config.customerEmail;\n }\n\n /**\n * Get authentication mode\n */\n getAuthMode(): 'user' | 'partner' {\n return this.config.mode || 'user';\n }\n\n /**\n * Get current customer ID (partner mode only)\n */\n getCustomerId(): string | undefined {\n return this.config.customerId;\n }\n\n /**\n * Set refresh callback for automatic token refresh (user mode only)\n */\n setRefreshCallback(callback: (refreshToken: string) => Promise<TokenData>): void {\n this.refreshCallback = callback;\n }\n\n /**\n * Set access token directly (user mode only)\n */\n setTokens(accessToken: string, refreshToken?: string): void {\n this.tokenManager.setTokens(accessToken, refreshToken);\n }\n\n /**\n * Get current access token (user mode only)\n */\n async getAccessToken(): Promise<string | null> {\n if (this.config.mode === 'partner') {\n return null; // Partner mode doesn't use stored tokens\n }\n return this.tokenManager.getValidAccessToken(this.refreshCallback);\n }\n\n /**\n * Clear stored tokens (user mode only)\n */\n clearTokens(): void {\n this.tokenManager.clearTokens();\n }\n\n /**\n * Make authenticated API request\n */\n async request<T>(options: RequestOptions): Promise<T> {\n const { method, path, body, headers = {}, useApiKey = false, skipAuth = false } = options;\n \n const url = `${this.config.baseUrl}${path}`;\n const requestHeaders: Record<string, string> = {\n 'Content-Type': 'application/json',\n 'User-Agent': 'Diviswap-SDK/2.0',\n ...headers\n };\n\n // Add authentication headers based on mode\n if (!skipAuth) {\n if (this.config.mode === 'partner') {\n await this.addPartnerAuth(method, path, body, requestHeaders);\n } else {\n await this.addUserAuth(useApiKey, requestHeaders);\n }\n }\n\n\n try {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.config.timeout);\n\n if (this.config.debug) {\n console.log(`[Diviswap SDK] ${method} ${url}`);\n }\n\n const response = await fetch(url, {\n method,\n headers: requestHeaders,\n body: body ? JSON.stringify(body) : undefined,\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n const responseText = await response.text();\n let responseData: any;\n\n try {\n responseData = responseText ? JSON.parse(responseText) : null;\n } catch {\n responseData = responseText;\n }\n\n if (this.config.debug) {\n console.log(`[Diviswap SDK] Response ${response.status}: ${responseText.substring(0, 500)}`);\n }\n\n if (!response.ok) {\n await this.handleErrorResponse(response, responseData);\n }\n\n return responseData;\n } catch (error) {\n if (error instanceof Error && error.name === 'AbortError') {\n throw new NetworkError('Request timeout');\n }\n if (error instanceof DiviswapError) {\n throw error;\n }\n throw new NetworkError(`Network request failed: ${error}`);\n }\n }\n\n /**\n * Add partner authentication headers\n */\n private async addPartnerAuth(\n method: string, \n path: string, \n body: any, \n headers: Record<string, string>\n ): Promise<void> {\n if (!this.partnerAuth) {\n throw new AuthenticationError('Partner authentication not configured');\n }\n\n const bodyString = body ? JSON.stringify(body) : '';\n const urlParts = path.split('?');\n const pathOnly = urlParts[0];\n const queryString = urlParts.length > 1 ? urlParts[1] : '';\n\n if (this.config.authMethod === 'jwt') {\n // Use JWT authentication\n const jwt = this.partnerAuth.generateJWT({\n audience: 'api.liberex.sv',\n expiresIn: 300\n });\n headers['Authorization'] = `Bearer ${jwt}`;\n } else {\n // Use HMAC authentication (default)\n const hmacHeaders = this.partnerAuth.generateHMACHeaders(\n method,\n pathOnly,\n queryString,\n bodyString\n );\n \n Object.assign(headers, hmacHeaders);\n }\n\n }\n\n /**\n * Add user authentication headers (legacy)\n */\n private async addUserAuth(useApiKey: boolean, headers: Record<string, string>): Promise<void> {\n if (!this.config.apiKey || !this.config.clientId) {\n throw new AuthenticationError('User authentication not configured');\n }\n\n // Always add API key headers\n headers['X-CLIENT-ID'] = this.config.clientId;\n headers['X-TIMESTAMP'] = Math.floor(Date.now() / 1000).toString();\n headers['X-API-Key'] = this.config.apiKey;\n\n // Add JWT token if not using API key only\n if (!useApiKey) {\n const accessToken = await this.tokenManager.getValidAccessToken(this.refreshCallback);\n if (accessToken) {\n headers['Authorization'] = `Bearer ${accessToken}`;\n }\n }\n\n }\n\n\n private async handleErrorResponse(response: Response, data: any): Promise<never> {\n const status = response.status;\n const message = data?.error || data?.message || `HTTP ${status}`;\n\n // Handle KYC step-up flow\n if (status === 403 && data?.kyc_uri) {\n const error = new AuthenticationError(message) as any;\n error.kycUri = data.kyc_uri;\n error.requiredLevel = data.required_level;\n throw error;\n }\n\n switch (status) {\n case 400:\n throw new ValidationError(message);\n case 401:\n case 403:\n throw new AuthenticationError(message);\n case 404:\n throw new DiviswapError(`Resource not found: ${message}`);\n case 429:\n throw new DiviswapError(`Rate limit exceeded: ${message}`);\n case 500:\n case 502:\n case 503:\n case 504:\n throw new NetworkError(`Server error: ${message}`);\n default:\n throw new DiviswapError(`API error: ${message}`);\n }\n }\n\n // Convenience methods\n async get<T>(path: string, options: Omit<RequestOptions, 'method' | 'path'> = {}): Promise<T> {\n return this.request<T>({ method: 'GET', path, ...options });\n }\n\n async post<T>(path: string, body?: any, options: Omit<RequestOptions, 'method' | 'path' | 'body'> = {}): Promise<T> {\n return this.request<T>({ method: 'POST', path, body, ...options });\n }\n\n async put<T>(path: string, body?: any, options: Omit<RequestOptions, 'method' | 'path' | 'body'> = {}): Promise<T> {\n return this.request<T>({ method: 'PUT', path, body, ...options });\n }\n\n async delete<T>(path: string, options: Omit<RequestOptions, 'method' | 'path'> = {}): Promise<T> {\n return this.request<T>({ method: 'DELETE', path, ...options });\n }\n}","/**\n * Main Diviswap SDK Client\n */\n\nimport { DiviswapConfig, UserDiviswapConfig, PartnerDiviswapConfig } from './types';\nimport { ConfigurationError } from './errors';\nimport { AuthModule } from './modules/auth';\nimport { PayeesModule } from './modules/payees';\nimport { TransactionsModule } from './modules/transactions';\nimport { KycModule } from './modules/kyc';\nimport { FeesModule } from './modules/fees';\nimport { AddressesModule } from './modules/addresses';\nimport { WebhooksModule } from './modules/webhooks';\nimport { UnifiedApiClient } from './api/unified-client';\n\n\n/**\n * Diviswap SDK Client\n *\n * @example\n * User Authentication (existing):\n * ```typescript\n * const diviswap = Diviswap.init({\n * apiKey: 'your-api-key',\n * clientId: 'your-client-id',\n * environment: 'sandbox'\n * });\n * ```\n *\n * Partner Authentication (new):\n * ```typescript\n * const diviswap = Diviswap.init({\n * mode: 'partner',\n * keyId: 'pk_...',\n * secretKey: 'sk_...',\n * authMethod: 'hmac', // or 'jwt'\n * environment: 'sandbox'\n * });\n * ```\n */\nexport class Diviswap {\n private static instance: Diviswap | null = null;\n private apiClient: UnifiedApiClient;\n\n public auth: AuthModule;\n public payees: PayeesModule;\n public transactions: TransactionsModule;\n public kyc: KycModule;\n public fees: FeesModule;\n public addresses: AddressesModule;\n public webhooks: WebhooksModule;\n\n private constructor(private config: DiviswapConfig) {\n this.validateConfig(config);\n\n // Log initialization for debugging\n\n // Determine if we should use localStorage based on the config\n const useLocalStorage = config.tokenStorage === 'localStorage' || !config.tokenStorage;\n\n // Create unified API client that supports both auth modes\n this.apiClient = UnifiedApiClient.fromConfig(config, useLocalStorage);\n\n // Initialize modules\n this.auth = new AuthModule(this.apiClient);\n this.payees = new PayeesModule(this.apiClient);\n this.transactions = new TransactionsModule(this.apiClient, config.environment || 'sandbox');\n this.kyc = new KycModule(this.apiClient);\n this.fees = new FeesModule(this.apiClient);\n this.addresses = new AddressesModule(this.apiClient);\n this.webhooks = new WebhooksModule(this.apiClient);\n }\n\n /**\n * Initialize the Diviswap SDK\n *\n * @param config - SDK configuration\n * @returns Diviswap SDK instance\n *\n * @example\n * ```typescript\n * const diviswap = Diviswap.init({\n * apiKey: 'your-api-key',\n * clientId: 'your-client-id'\n * });\n * ```\n */\n static init(config: DiviswapConfig): Diviswap {\n if (!Diviswap.instance) {\n Diviswap.instance = new Diviswap(config);\n }\n return Diviswap.instance;\n }\n\n /**\n * Get the current SDK instance\n * @throws {ConfigurationError} If SDK hasn't been initialized\n */\n static getInstance(): Diviswap {\n if (!Diviswap.instance) {\n throw new ConfigurationError('Diviswap SDK not initialized. Call Diviswap.init() first.');\n }\n return Diviswap.instance;\n }\n\n /**\n * Reset the SDK instance (useful for testing)\n */\n static reset(): void {\n Diviswap.instance = null;\n }\n\n /**\n * Update SDK configuration\n * @deprecated Configuration updates require re-initialization. Call Diviswap.reset() then Diviswap.init() with new config.\n */\n updateConfig(_config: Partial<DiviswapConfig>): void {\n // For configuration updates, we'd need to recreate the client\n // This is a breaking change that requires re-initialization\n throw new ConfigurationError('Configuration updates require re-initialization. Call Diviswap.reset() then Diviswap.init() with new config.');\n }\n\n /**\n * Get current configuration (excluding sensitive data)\n */\n getConfig(): Partial<DiviswapConfig> {\n return {\n environment: this.config.environment,\n apiUrl: this.config.apiUrl,\n debug: this.config.debug,\n timeout: this.config.timeout,\n };\n }\n\n /**\n * Get current access token (for developers who need it for custom API calls)\n * Only available in user authentication mode.\n *\n * @example\n * ```typescript\n * const token = await diviswap.getAccessToken();\n * if (token) {\n * // Use token for custom API calls\n * fetch('https://api.liberex.sv/custom-endpoint', {\n * headers: { 'Authorization': `Bearer ${token}` }\n * });\n * }\n * ```\n */\n async getAccessToken(): Promise<string | null> {\n return this.apiClient.getAccessToken();\n }\n\n /**\n * Set access token (for server-side usage where tokens are stored externally)\n * Only available in user authentication mode.\n *\n * @example\n * ```typescript\n * // In a Next.js API route where token is stored in cookies\n * const token = cookies().get('diviswap_session')?.value;\n * if (token) {\n * diviswap.setAccessToken(token);\n * }\n * ```\n */\n setAccessToken(accessToken: string, refreshToken?: string): void {\n this.apiClient.setTokens(accessToken, refreshToken);\n }\n\n /**\n * Set customer context for partner authentication mode\n *\n * @example\n * ```typescript\n * // For partner auth mode - link requests to a specific customer\n * diviswap.setCustomer('user-123', 'user@example.com');\n *\n * // Now all API calls will be made on behalf of this customer\n * const payees = await diviswap.payees.getAll();\n * ```\n */\n setCustomer(customerId: string, customerEmail?: string): void {\n this.apiClient.setCustomer(customerId, customerEmail);\n }\n\n /**\n * Clear customer context for partner authentication mode\n */\n clearCustomer(): void {\n this.apiClient.clearCustomer();\n }\n\n private validateConfig(config: DiviswapConfig): void {\n // Auto-detect partner mode by checking for partner credentials\n const isPartnerMode = ('mode' in config && config.mode === 'partner') ||\n ('keyId' in config && 'secretKey' in config);\n\n if (isPartnerMode) {\n // Partner mode validation\n const partnerConfig = config as PartnerDiviswapConfig;\n if (!partnerConfig.keyId) {\n throw new ConfigurationError('Partner keyId is required for partner authentication');\n }\n if (!partnerConfig.secretKey) {\n throw new ConfigurationError('Partner secretKey is required for partner authentication');\n }\n if (partnerConfig.authMethod && !['hmac', 'jwt'].includes(partnerConfig.authMethod)) {\n throw new ConfigurationError('Invalid authMethod. Must be either \"hmac\" or \"jwt\"');\n }\n } else {\n // User mode validation (backward compatibility)\n const userConfig = config as UserDiviswapConfig;\n if (!userConfig.apiKey) {\n throw new ConfigurationError('API Key is required for user authentication');\n }\n if (!userConfig.clientId) {\n throw new ConfigurationError('Client ID is required for user authentication');\n }\n }\n \n if (config.environment && !['production', 'sandbox', 'development'].includes(config.environment)) {\n throw new ConfigurationError('Invalid environment. Must be one of: production, sandbox, development');\n }\n }\n}","/**\n * Wallet integration helpers for automatic address tracking\n */\n\nimport { Diviswap } from '../client';\nimport { WalletConnection, CHAIN_IDS } from '../types/addresses';\n\n/**\n * Ethereum-like wallet interface (compatible with MetaMask, WalletConnect, etc.)\n */\nexport interface EthereumWallet {\n request: (args: { method: string; params?: any[] }) => Promise<any>;\n on?: (event: string, handler: (...args: any[]) => void) => void;\n removeListener?: (event: string, handler: (...args: any[]) => void) => void;\n}\n\n/**\n * Automatic wallet tracking configuration\n */\nexport interface WalletTrackingConfig {\n /** Automatically track when accounts change */\n trackAccountChanges?: boolean;\n /** Automatically track when chain changes */\n trackChainChanges?: boolean;\n /** Set newly connected addresses as default for their chain */\n setAsDefault?: boolean;\n /** Custom chain mappings for unsupported chains */\n customChains?: Record<number, string>;\n}\n\n/**\n * Wallet tracking manager for automatic address management\n */\nexport class WalletTracker {\n private static instance: WalletTracker | null = null;\n private wallet: EthereumWallet | null = null;\n private diviswap: Diviswap | null = null;\n private config: WalletTrackingConfig;\n private listeners: Map<string, (...args: any[]) => void> = new Map();\n\n private constructor(config: WalletTrackingConfig = {}) {\n this.config = {\n trackAccountChanges: true,\n trackChainChanges: true,\n setAsDefault: true,\n ...config\n };\n }\n\n /**\n * Get or create the wallet tracker instance\n */\n static getInstance(config?: WalletTrackingConfig): WalletTracker {\n if (!WalletTracker.instance) {\n WalletTracker.instance = new WalletTracker(config);\n }\n return WalletTracker.instance;\n }\n\n /**\n * Initialize wallet tracking with Diviswap SDK instance\n */\n init(diviswap: Diviswap, wallet?: EthereumWallet): void {\n this.diviswap = diviswap;\n\n if (wallet) {\n this.wallet = wallet;\n } else if (typeof window !== 'undefined' && (window as any).ethereum) {\n this.wallet = (window as any).ethereum;\n }\n\n if (this.wallet && this.config.trackAccountChanges) {\n this.setupAccountChangeListener();\n }\n\n if (this.wallet && this.config.trackChainChanges) {\n this.setupChainChangeListener();\n }\n }\n\n /**\n * Connect and track a wallet\n */\n async connect(): Promise<WalletConnection[]> {\n if (!this.wallet) {\n throw new Error('No wallet provider available');\n }\n\n if (!this.diviswap) {\n throw new Error('Diviswap SDK not initialized. Call init() first.');\n }\n\n try {\n // Request account access\n const accounts = await this.wallet.request({\n method: 'eth_requestAccounts'\n });\n\n // Get current chain\n const chainId = await this.wallet.request({\n method: 'eth_chainId'\n });\n\n const numericChainId = parseInt(chainId, 16);\n const connections: WalletConnection[] = [];\n\n // Track all connected accounts\n for (const account of accounts) {\n const connection: WalletConnection = {\n address: account,\n chainId: numericChainId,\n chainName: this.getChainName(numericChainId)\n };\n\n await this.diviswap.addresses.trackWallet(connection);\n connections.push(connection);\n }\n\n return connections;\n } catch (error) {\n console.error('Failed to connect wallet:', error);\n throw error;\n }\n }\n\n /**\n * Track current wallet state without requesting connection\n */\n async trackCurrent(): Promise<WalletConnection[]> {\n if (!this.wallet) {\n throw new Error('No wallet provider available');\n }\n\n if (!this.diviswap) {\n throw new Error('Diviswap SDK not initialized. Call init() first.');\n }\n\n try {\n // Get current accounts (may be empty if not connected)\n const accounts = await this.wallet.request({\n method: 'eth_accounts'\n });\n\n if (accounts.length === 0) {\n return [];\n }\n\n // Get current chain\n const chainId = await this.wallet.request({\n method: 'eth_chainId'\n });\n\n const numericChainId = parseInt(chainId, 16);\n const connections: WalletConnection[] = [];\n\n // Track all current accounts\n for (const account of accounts) {\n const connection: WalletConnection = {\n address: account,\n chainId: numericChainId,\n chainName: this.getChainName(numericChainId)\n };\n\n await this.diviswap.addresses.trackWallet(connection);\n connections.push(connection);\n }\n\n return connections;\n } catch (error) {\n console.error('Failed to track current wallet state:', error);\n throw error;\n }\n }\n\n /**\n * Setup listener for account changes\n */\n private setupAccountChangeListener(): void {\n if (!this.wallet?.on) return;\n\n const handler = async (accounts: string[]) => {\n if (!this.diviswap) return;\n\n try {\n // Get current chain\n const chainId = await this.wallet!.request({\n method: 'eth_chainId'\n });\n\n const numericChainId = parseInt(chainId, 16);\n\n // Track new accounts\n for (const account of accounts) {\n const connection: WalletConnection = {\n address: account,\n chainId: numericChainId,\n chainName: this.getChainName(numericChainId)\n };\n\n await this.diviswap.addresses.trackWallet(connection);\n }\n } catch (error) {\n console.error('Failed to handle account change:', error);\n }\n };\n\n this.wallet.on('accountsChanged', handler);\n this.listeners.set('accountsChanged', handler);\n }\n\n /**\n * Setup listener for chain changes\n */\n private setupChainChangeListener(): void {\n if (!this.wallet?.on) return;\n\n const handler = async (chainId: string) => {\n if (!this.diviswap) return;\n\n try {\n // Get current accounts\n const accounts = await this.wallet!.request({\n method: 'eth_accounts'\n });\n\n const numericChainId = parseInt(chainId, 16);\n\n // Track accounts on new chain\n for (const account of accounts) {\n const connection: WalletConnection = {\n address: account,\n chainId: numericChainId,\n chainName: this.getChainName(numericChainId)\n };\n\n await this.diviswap.addresses.trackWallet(connection);\n }\n } catch (error) {\n console.error('Failed to handle chain change:', error);\n }\n };\n\n this.wallet.on('chainChanged', handler);\n this.listeners.set('chainChanged', handler);\n }\n\n /**\n * Get chain name from chain ID\n */\n private getChainName(chainId: number): string | undefined {\n // Check built-in chains first\n const builtInChain = Object.entries(CHAIN_IDS).find(([_, id]) => id === chainId)?.[0];\n if (builtInChain) return builtInChain;\n\n // Check custom chains\n return this.config.customChains?.[chainId];\n }\n\n /**\n * Cleanup listeners\n */\n cleanup(): void {\n if (this.wallet?.removeListener) {\n for (const [event, handler] of this.listeners) {\n this.wallet.removeListener(event, handler);\n }\n }\n this.listeners.clear();\n }\n\n /**\n * Update configuration\n */\n updateConfig(config: Partial<WalletTrackingConfig>): void {\n this.config = { ...this.config, ...config };\n }\n}\n\n/**\n * Convenience functions for easy integration\n */\n\n/**\n * Connect wallet and automatically track addresses\n *\n * @example\n * ```typescript\n * import { Diviswap, connectWallet } from '@diviswap/sdk';\n *\n * const diviswap = Diviswap.init(config);\n *\n * // Connect and track wallet automatically\n * const connections = await connectWallet(diviswap);\n * console.log('Tracked addresses:', connections);\n * ```\n */\nexport async function connectWallet(\n diviswap: Diviswap,\n wallet?: EthereumWallet,\n config?: WalletTrackingConfig\n): Promise<WalletConnection[]> {\n const tracker = WalletTracker.getInstance(config);\n tracker.init(diviswap, wallet);\n return tracker.connect();\n}\n\n/**\n * Track current wallet state without requesting connection\n *\n * @example\n * ```typescript\n * import { Diviswap, trackCurrentWallet } from '@diviswap/sdk';\n *\n * const diviswap = Diviswap.init(config);\n *\n * // Track currently connected accounts\n * const connections = await trackCurrentWallet(diviswap);\n * ```\n */\nexport async function trackCurrentWallet(\n diviswap: Diviswap,\n wallet?: EthereumWallet,\n config?: WalletTrackingConfig\n): Promise<WalletConnection[]> {\n const tracker = WalletTracker.getInstance(config);\n tracker.init(diviswap, wallet);\n return tracker.trackCurrent();\n}\n\n/**\n * Setup automatic wallet tracking (listens for account/chain changes)\n *\n * @example\n * ```typescript\n * import { Diviswap, setupWalletTracking } from '@diviswap/sdk';\n *\n * const diviswap = Diviswap.init(config);\n *\n * // Setup automatic tracking\n * setupWalletTracking(diviswap, {\n * trackAccountChanges: true,\n * trackChainChanges: true,\n * setAsDefault: true\n * });\n * ```\n */\nexport function setupWalletTracking(\n diviswap: Diviswap,\n wallet?: EthereumWallet,\n config?: WalletTrackingConfig\n): WalletTracker {\n const tracker = WalletTracker.getInstance(config);\n tracker.init(diviswap, wallet);\n return tracker;\n}","/**\n * Web3 utilities for handling transaction results\n */\n\n/**\n * Type representing the various formats that sendTransaction can return\n * - Direct hash string: '0x...'\n * - Object with hash property: {hash: '0x...'}\n * - Template literal type from viem: `0x${string}`\n */\nexport type SendTransactionResult = string | { hash: string } | `0x${string}`;\n\n/**\n * Safely extract transaction hash from various sendTransaction result formats\n *\n * Different Web3 libraries and wallet connectors return transaction hashes in different formats:\n * - wagmi's sendTransactionAsync: typically returns the hash directly as a string\n * - Some wallets: return an object with a hash property\n * - viem: uses template literal types `0x${string}`\n *\n * This utility handles all these cases and extracts the hash string reliably.\n *\n * @param result - The result from sendTransaction/sendTransactionAsync\n * @returns The transaction hash as a string\n *\n * @example\n * ```typescript\n * const result = await sendTransactionAsync({...});\n * const hash = extractTransactionHash(result);\n * // hash is now guaranteed to be a string like '0x...'\n * ```\n */\nexport function extractTransactionHash(result: SendTransactionResult): string {\n // Handle string results (most common)\n if (typeof result === 'string') {\n return result;\n }\n\n // Handle object with hash property (some wallets)\n if (typeof result === 'object' && result !== null && 'hash' in result) {\n return result.hash;\n }\n\n // Fallback: coerce to string\n return result as string;\n}\n"]}
|