{"version":3,"file":"CIW9PfPl.js","sources":["../../../../../../src/lib/api/pools.ts"],"sourcesContent":["import { API_URL } from \"$lib/api/index\";\nimport { KONG_BACKEND_CANISTER_ID } from \"$lib/constants/canisterConstants\";\nimport { createAnonymousActorHelper } from \"$lib/utils/actorUtils\";\nimport { auth, requireWalletConnection, canisterIDLs } from \"$lib/stores/auth\";\nimport { IcrcService } from \"$lib/services/icrc/IcrcService\";\nimport { toastStore } from \"$lib/stores/toastStore\";\n\nexport const fetchPools = async (params?: any): Promise<{pools: BE.Pool[], total_count: number, total_pages: number, page: number, limit: number}> => {\n try {\n const { page = 1, limit = 50, canisterIds, search = '' } = params || {};\n \n // Build query string for pagination and filters\n const queryParams: Record = {\n page: page.toString(),\n limit: limit.toString(),\n t: Date.now().toString() // Cache busting\n };\n \n // Add search if provided\n if (search) {\n queryParams.search = search;\n }\n \n // Add canister_id if provided\n if (canisterIds && canisterIds.length > 0) {\n queryParams.canister_id = canisterIds[0];\n }\n \n const queryString = new URLSearchParams(queryParams).toString();\n \n const response = await fetch(\n `${API_URL}/api/pools?${queryString}`,\n {\n method: 'GET',\n headers: {\n 'Accept': 'application/json',\n }\n }\n );\n \n if (!response.ok) {\n const errorText = await response.text();\n console.error(`API error response: ${errorText}`);\n throw new Error(`Failed to fetch pools: ${response.status} ${response.statusText}`);\n }\n\n const data = await response.json();\n console.log(\"data\", data);\n if (!data || !data.items) {\n throw new Error(\"Invalid API response\");\n }\n\n // Helper function: Remove underscores and convert to a numeric value.\n const parseNumericString = (value: string | number): number => {\n if (typeof value === 'number') {\n return value;\n }\n return parseFloat(value.replace(/_/g, ''));\n };\n\n // Helper function: Parse a single pool data item.\n const parsePoolData = (item: any): BE.Pool => {\n const pool = item.pool;\n\n // If a StablePool raw_json exists, then parse its numeric fields.\n if (pool.raw_json && pool.raw_json.StablePool) {\n const stablePool = pool.raw_json.StablePool;\n const numericFields = [\n 'balance_0',\n 'balance_1',\n 'lp_fee_0',\n 'lp_fee_1',\n 'lp_token_id',\n 'rolling_24h_volume',\n 'rolling_24h_lp_fee',\n 'rolling_24h_num_swaps',\n 'tvl',\n 'kong_fee_0',\n 'kong_fee_1'\n ];\n numericFields.forEach(field => {\n if (stablePool[field] !== undefined && typeof stablePool[field] === 'string') {\n stablePool[field] = parseNumericString(stablePool[field]);\n }\n });\n pool.raw_json.StablePool = stablePool;\n }\n\n // Return a flat structure combining pool data with token details.\n return {\n ...pool,\n lp_token_id: item.pool.lp_token_id,\n symbol_0: item.token0?.symbol,\n address_0: item.token0?.canister_id,\n symbol_1: item.token1?.symbol,\n address_1: item.token1?.canister_id,\n token0: item.token0,\n token1: item.token1\n } as BE.Pool;\n };\n\n const transformedItems = data.items.map(parsePoolData);\n\n // Compute pagination info\n const currentPage = page;\n const currentLimit = limit;\n const total_count = data.total_count || transformedItems.length;\n const total_pages = data.total_pages || Math.ceil(total_count / currentLimit);\n\n return {\n pools: transformedItems,\n total_count,\n total_pages,\n page: currentPage,\n limit: currentLimit\n };\n } catch (error) {\n console.error('Error fetching pools:', error);\n throw error;\n }\n};\n\nexport const fetchPoolBalanceHistory = async (poolId: string | number): Promise => {\n try {\n // Use the exact endpoint without any query parameters\n const endpoint = `${API_URL}/api/pools/${poolId}/balance-history`;\n console.log('Calling pool balance history endpoint:', endpoint);\n \n const response = await fetch(endpoint, {\n method: 'GET',\n headers: {\n 'Accept': 'application/json'\n }\n });\n \n if (!response.ok) {\n // Try to get more information about the error\n let errorInfo = '';\n try {\n const errorData = await response.text();\n errorInfo = errorData ? ` - ${errorData}` : '';\n } catch (e) {\n // Ignore error parsing error\n }\n \n throw new Error(`Failed to fetch pool balance history: ${response.status} ${response.statusText}${errorInfo}`);\n }\n \n const data = await response.json();\n \n // Log the first item to help debug\n if (Array.isArray(data) && data.length > 0) {\n console.log('Sample balance history item:', data[0]);\n } else {\n console.log('Empty or unexpected response format:', data);\n }\n \n return data;\n } catch (error) {\n console.error('Error fetching pool balance history:', error);\n throw error;\n }\n};\n\nexport const fetchPoolTotals = async (): Promise<{total_volume_24h: number, total_tvl: number, total_fees_24h: number}> => {\n try {\n const response = await fetch(`${API_URL}/api/pools/totals`);\n const data = await response.json();\n return data;\n } catch (error) {\n console.error('Error fetching pool totals:', error);\n throw error;\n }\n}\n\n/**\n * Calculate required amounts for adding liquidity\n */\nexport async function calculateLiquidityAmounts(\n token0Symbol: string,\n amount0: bigint,\n token1Symbol: string,\n): Promise {\n try {\n const actor = createAnonymousActorHelper(\n KONG_BACKEND_CANISTER_ID,\n canisterIDLs.kong_backend,\n );\n const result = await actor.add_liquidity_amounts(\n \"IC.\" + token0Symbol,\n amount0,\n \"IC.\" + token1Symbol,\n );\n\n if (!result.Ok) {\n throw new Error(result.Err || \"Failed to calculate liquidity amounts\");\n }\n\n return result;\n } catch (error) {\n console.error(\"Error calculating liquidity amounts:\", error);\n throw error;\n }\n}\n\n/**\n * Calculate amounts that would be received when removing liquidity\n */\nexport async function calculateRemoveLiquidityAmounts(\n token0CanisterId: string,\n token1CanisterId: string,\n lpTokenAmount: number | bigint,\n): Promise<[bigint, bigint]> {\n try {\n const lpTokenBigInt =\n typeof lpTokenAmount === \"number\"\n ? BigInt(Math.floor(lpTokenAmount * 1e8))\n : lpTokenAmount;\n\n const actor = await auth.pnp.getActor(\n KONG_BACKEND_CANISTER_ID,\n canisterIDLs.kong_backend,\n { anon: true, requiresSigning: false },\n );\n\n const result = await actor.remove_liquidity_amounts(\n \"IC.\" + token0CanisterId,\n \"IC.\" + token1CanisterId,\n lpTokenBigInt,\n );\n\n if (!result.Ok) {\n throw new Error(result.Err || \"Failed to calculate removal amounts\");\n }\n\n // Handle the correct response format based on .did file\n const reply = result.Ok;\n return [BigInt(reply.amount_0), BigInt(reply.amount_1)];\n } catch (error) {\n console.error(\"Error calculating removal amounts:\", error);\n throw error;\n }\n}\n\n/**\n * Add liquidity to a pool with ICRC2 approval\n */\nexport async function addLiquidity(params: {\n token_0: FE.Token;\n amount_0: bigint;\n token_1: FE.Token;\n amount_1: bigint;\n}): Promise {\n requireWalletConnection();\n try {\n if (!params.token_0 || !params.token_1) {\n throw new Error(\"Invalid token configuration\");\n }\n\n let tx_id_0: Array<{ BlockIndex: bigint }> = [];\n let tx_id_1: Array<{ BlockIndex: bigint }> = [];\n let actor;\n\n // Handle ICRC2 tokens\n if (params.token_0.icrc2 && params.token_1.icrc2) {\n const [_approval0, _approval1, actorResult] = await Promise.all([\n IcrcService.checkAndRequestIcrc2Allowances(\n params.token_0,\n params.amount_0,\n ),\n IcrcService.checkAndRequestIcrc2Allowances(\n params.token_1,\n params.amount_1,\n ),\n auth.pnp.getActor(KONG_BACKEND_CANISTER_ID, canisterIDLs.kong_backend, {\n anon: false,\n requiresSigning: false,\n }),\n ]);\n\n // For ICRC2 tokens, we don't need to pass transfer block indexes\n tx_id_0 = [];\n tx_id_1 = [];\n actor = actorResult;\n\n\n } else {\n // Handle ICRC1 tokens\n const [transfer0Result, transfer1Result, actorResult] = await Promise.all([\n IcrcService.transfer(\n params.token_0,\n KONG_BACKEND_CANISTER_ID,\n params.amount_0,\n ),\n IcrcService.transfer(\n params.token_1,\n KONG_BACKEND_CANISTER_ID,\n params.amount_1,\n ),\n auth.pnp.getActor(KONG_BACKEND_CANISTER_ID, canisterIDLs.kong_backend, {\n anon: false,\n requiresSigning: false,\n }),\n ]);\n\n // Keep block IDs as BigInt\n tx_id_0 = transfer0Result?.Ok ? [{ BlockIndex: transfer0Result.Ok }] : [];\n tx_id_1 = transfer1Result?.Ok ? [{ BlockIndex: transfer1Result.Ok }] : [];\n actor = actorResult;\n }\n\n const addLiquidityArgs = {\n token_0: \"IC.\" + params.token_0.canister_id,\n amount_0: params.amount_0,\n token_1: \"IC.\" + params.token_1.canister_id,\n amount_1: params.amount_1,\n tx_id_0,\n tx_id_1,\n };\n\n let result = await actor.add_liquidity_async(addLiquidityArgs);\n\n if (\"Err\" in result) {\n throw new Error(result.Err);\n }\n\n return result.Ok;\n } catch (error) {\n console.error(\"Error adding liquidity:\", error);\n throw error;\n }\n}\n\n/**\n * Poll for request status\n */\nexport async function pollRequestStatus(requestId: bigint): Promise {\n let attempts = 0;\n const MAX_ATTEMPTS = 20;\n let lastStatus = '';\n \n const toastId = toastStore.info(\n \"Processing liquidity operation...\",\n );\n\n try {\n while (attempts < MAX_ATTEMPTS) {\n const actor = await auth.pnp.getActor(\n KONG_BACKEND_CANISTER_ID,\n canisterIDLs.kong_backend,\n { anon: true }\n );\n const result = await actor.requests([requestId]);\n\n if (!result.Ok || result.Ok.length === 0) {\n toastStore.dismiss(toastId);\n throw new Error(\"Failed to get request status\");\n }\n\n const status = result.Ok[0];\n \n // Show status updates in toast\n if (status.statuses && status.statuses.length > 0) {\n const currentStatus = status.statuses[status.statuses.length - 1];\n if (currentStatus !== lastStatus) {\n lastStatus = currentStatus;\n if(currentStatus.includes(\"Success\")) {\n toastStore.success(\"Successfully added liquidity\");\n } else {\n toastStore.info(currentStatus);\n }\n }\n }\n\n // Check for success\n if (status.statuses.includes(\"Success\")) {\n toastStore.dismiss(toastId);\n return status;\n }\n\n // Check for failure\n if (status.statuses.find(s => s.includes(\"Failed\"))) {\n const failureMessage = status.statuses.find(s => s.includes(\"Failed\"));\n toastStore.dismiss(toastId);\n toastStore.error(failureMessage || \"Operation failed\");\n return status;\n }\n\n attempts++;\n await new Promise(resolve => setTimeout(resolve, 500)); // .5 second delay between polls\n }\n\n // If we exit the loop without success/failure\n toastStore.dismiss(toastId);\n toastStore.error(\"Operation timed out\");\n throw new Error(\"Polling timed out\");\n } catch (error) {\n toastStore.dismiss(toastId);\n toastStore.error(error.message || \"Error polling request status\");\n console.error(\"Error polling request status:\", error);\n throw error;\n }\n}\n\nexport async function removeLiquidity(params: {\n token0: string;\n token1: string;\n lpTokenAmount: number | bigint;\n}): Promise {\n requireWalletConnection();\n try {\n // Ensure we're using BigInt for the amount\n const lpTokenBigInt =\n typeof params.lpTokenAmount === \"number\"\n ? BigInt(Math.floor(params.lpTokenAmount * 1e8))\n : params.lpTokenAmount;\n\n const actor = await auth.pnp.getActor(\n KONG_BACKEND_CANISTER_ID,\n canisterIDLs.kong_backend,\n { anon: false, requiresSigning: false },\n );\n const result = await actor.remove_liquidity_async({\n token_0: \"IC.\" + params.token0,\n token_1: \"IC.\" + params.token1,\n remove_lp_token_amount: lpTokenBigInt,\n });\n\n if (!result.Ok) {\n throw new Error(result.Err || \"Failed to remove liquidity\");\n }\n return result.Ok.toString();\n } catch (error) {\n console.error(\"Error removing liquidity:\", error);\n throw new Error(error.message || \"Failed to remove liquidity\");\n }\n}\n\nexport async function approveTokens(token: FE.Token, amount: bigint) {\n try {\n await IcrcService.checkAndRequestIcrc2Allowances(token, amount);\n } catch (error) {\n console.error(\"Error approving tokens:\", error);\n throw new Error(`Failed to approve ${token.symbol}: ${error.message}`);\n }\n}\n\nexport async function createPool(params: {\n token_0: FE.Token;\n amount_0: bigint;\n token_1: FE.Token;\n amount_1: bigint;\n initial_price: number;\n}) {\n requireWalletConnection();\n \n try {\n let tx_id_0: Array<{ BlockIndex: bigint }> = [];\n let tx_id_1: Array<{ BlockIndex: bigint }> = [];\n let actor;\n\n // Handle ICRC2 tokens\n if (params.token_0.icrc2 && params.token_1.icrc2) {\n const [approval0, approval1, actorResult] = await Promise.all([\n IcrcService.checkAndRequestIcrc2Allowances(\n params.token_0,\n params.amount_0,\n ),\n IcrcService.checkAndRequestIcrc2Allowances(\n params.token_1,\n params.amount_1,\n ),\n auth.pnp.getActor(KONG_BACKEND_CANISTER_ID, canisterIDLs.kong_backend, {\n anon: false,\n requiresSigning: false,\n }),\n ]);\n\n // For ICRC2 tokens, we don't need to pass transfer block indexes\n tx_id_0 = [];\n tx_id_1 = [];\n actor = actorResult;\n } else {\n // Handle ICRC1 tokens\n const [transfer0Result, transfer1Result, actorResult] = await Promise.all([\n IcrcService.transfer(\n params.token_0,\n KONG_BACKEND_CANISTER_ID,\n params.amount_0,\n ),\n IcrcService.transfer(\n params.token_1,\n KONG_BACKEND_CANISTER_ID,\n params.amount_1,\n ),\n auth.pnp.getActor(KONG_BACKEND_CANISTER_ID, canisterIDLs.kong_backend, {\n anon: false,\n requiresSigning: false,\n }),\n ]);\n\n // Keep block IDs as BigInt\n tx_id_0 = transfer0Result?.Ok ? [{ BlockIndex: transfer0Result.Ok }] : [];\n tx_id_1 = transfer1Result?.Ok ? [{ BlockIndex: transfer1Result.Ok }] : [];\n actor = actorResult;\n }\n\n const result = await actor.add_pool({\n token_0: \"IC.\" + params.token_0.canister_id,\n amount_0: params.amount_0,\n token_1: \"IC.\" + params.token_1.canister_id,\n amount_1: params.amount_1,\n tx_id_0: tx_id_0,\n tx_id_1: tx_id_1,\n lp_fee_bps: [30] // Hardcoded LP fee basis points\n });\n\n if ('Err' in result) {\n throw new Error(result.Err);\n }\n\n return result.Ok;\n } catch (error) {\n console.error(\"Error creating pool:\", error);\n throw new Error(error.message || \"Failed to create pool\");\n }\n}\n\n/**\n * Send LP tokens to another address\n */\nexport async function sendLpTokens(params: {\n token: string; // LP token ID\n toAddress: string;\n amount: number | bigint;\n}): Promise {\n requireWalletConnection();\n try {\n // Ensure we're using BigInt for the amount\n const amountBigInt = typeof params.amount === \"number\"\n ? BigInt(Math.floor(params.amount * 1e8))\n : params.amount;\n\n const actor = await auth.pnp.getActor(\n KONG_BACKEND_CANISTER_ID,\n canisterIDLs.kong_backend,\n { anon: false, requiresSigning: false },\n );\n\n const result = await actor.send({\n token: params.token,\n to_address: params.toAddress,\n amount: amountBigInt,\n });\n\n if (!result.OK) {\n throw new Error(result.Err || \"Failed to send LP tokens\");\n }\n\n toastStore.success(`Successfully sent ${params.amount} LP tokens`);\n return result.OK;\n } catch (error) {\n console.error(\"Error sending LP tokens:\", error);\n toastStore.error(error.message || \"Failed to send LP tokens\");\n throw error;\n }\n}\n"],"names":["fetchPools","async","params","page","limit","canisterIds","search","queryParams","toString","t","Date","now","length","canister_id","queryString","URLSearchParams","response","fetch","API_URL","method","headers","Accept","ok","errorText","text","console","error","Error","status","statusText","data","json","log","items","parseNumericString","value","parseFloat","replace","parsePoolData","item","pool","raw_json","StablePool","stablePool","forEach","field","lp_token_id","symbol_0","_a","token0","symbol","address_0","_b","symbol_1","_c","token1","address_1","_d","transformedItems","map","currentPage","currentLimit","total_count","pools","total_pages","Math","ceil","fetchPoolBalanceHistory","poolId","endpoint","errorInfo","errorData","e","Array","isArray","fetchPoolTotals","calculateLiquidityAmounts","token0Symbol","amount0","token1Symbol","actor","createAnonymousActorHelper","KONG_BACKEND_CANISTER_ID","canisterIDLs","kong_backend","result","add_liquidity_amounts","Ok","Err","calculateRemoveLiquidityAmounts","token0CanisterId","token1CanisterId","lpTokenAmount","lpTokenBigInt","BigInt","floor","auth","pnp","getActor","anon","requiresSigning","remove_liquidity_amounts","reply","amount_0","amount_1","addLiquidity","requireWalletConnection","token_0","token_1","tx_id_0","tx_id_1","icrc2","_approval0","_approval1","actorResult","Promise","all","IcrcService","checkAndRequestIcrc2Allowances","transfer0Result","transfer1Result","transfer","BlockIndex","addLiquidityArgs","add_liquidity_async","pollRequestStatus","requestId","attempts","lastStatus","toastId","toastStore","info","requests","dismiss","statuses","currentStatus","includes","success","find","s","failureMessage","resolve","setTimeout","message","removeLiquidity","remove_liquidity_async","remove_lp_token_amount","createPool","approval0","approval1","add_pool","lp_fee_bps","sendLpTokens","amountBigInt","amount","send","token","to_address","toAddress","OK"],"mappings":"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"}