{"version":3,"file":"CCJJ3dfv.js","sources":["../../../../../../src/lib/stores/tokenStore.ts"],"sourcesContent":["// src/kong_svelte/src/lib/stores/tokenStore.ts\nimport { derived, writable, get } from \"svelte/store\";\nimport BigNumber from \"bignumber.js\";\nimport { userTokens } from \"$lib/stores/userTokens\";\nimport { currentUserPoolsStore } from \"$lib/stores/currentUserPoolsStore\";\nimport { \n currentUserBalancesStore, \n loadBalance, \n loadBalances, \n} from \"$lib/stores/balancesStore\";\nimport { fetchTokensByCanisterId } from \"$lib/api/tokens\";\n\nexport interface TokenState {\n activeSwaps: Record;\n pendingBalanceRequests: Set;\n}\n\n\n// Create a writable store for tracking portfolio update status\nexport const isUpdatingPortfolio = writable(false);\n\n// Re-export important functions for backward compatibility\nexport { \n loadBalance,\n loadBalances,\n currentUserBalancesStore\n};\n\n// Create a fallback empty store for balances in case the imported one is not available\nconst fallbackBalancesStore = writable>({});\nconst fallbackUserTokensStore = writable({ enabledTokens: {}, tokens: [], isAuthenticated: false });\nconst fallbackUserPoolsStore = writable({ processedPools: [] });\n\n// Make sure we have valid stores, especially important for SSR\nconst safeBalancesStore = currentUserBalancesStore || fallbackBalancesStore;\nconst safeUserTokensStore = userTokens || fallbackUserTokensStore;\nconst safeUserPoolsStore = currentUserPoolsStore || fallbackUserPoolsStore;\n\nfunction createTokenStore() {\n const initialState: TokenState = {\n activeSwaps: {},\n pendingBalanceRequests: new Set(),\n };\n const store = writable(initialState);\n\n return {\n subscribe: store.subscribe,\n update: store.update,\n isPendingBalanceRequest: (canisterId: string) => {\n return get(store).pendingBalanceRequests.has(canisterId);\n },\n addPendingRequest: (canisterId: string) => {\n store.update((s) => {\n const pendingBalanceRequests = new Set(s.pendingBalanceRequests);\n pendingBalanceRequests.add(canisterId);\n return { ...s, pendingBalanceRequests };\n });\n },\n removePendingRequest: (canisterId: string) => {\n store.update((s) => {\n const pendingBalanceRequests = new Set(s.pendingBalanceRequests);\n pendingBalanceRequests.delete(canisterId);\n return { ...s, pendingBalanceRequests };\n });\n },\n };\n}\n\n// Update the portfolioValue derived store with safe stores\nexport const portfolioValue = derived(\n [safeUserTokensStore, safeUserPoolsStore, safeBalancesStore],\n ([$userTokens, $currentUserPoolsStore, $storedBalances]) => {\n // Make sure all stores are initialized before accessing properties\n if (!$userTokens || !$storedBalances) {\n return \"0.00\";\n }\n\n // Calculate token values with proper null checking\n const tokenValue = ($userTokens.tokens || []).reduce((acc, token) => {\n if (!token || !token.canister_id) return acc;\n const balance = $storedBalances[token.canister_id]?.in_usd;\n if (balance && balance !== \"0\") {\n return acc + Number(balance);\n }\n return acc;\n }, 0);\n\n // Calculate pool values using processedPools, ensuring the array exists\n const poolValue = ($currentUserPoolsStore?.processedPools || []).reduce((acc, pool) => {\n const value = pool && pool.usd_balance ? Number(pool.usd_balance) : 0;\n return acc + value;\n }, 0);\n\n // Combine values and format\n const totalValue = tokenValue + poolValue;\n return totalValue.toLocaleString(\"en-US\", {\n minimumFractionDigits: 2,\n maximumFractionDigits: 2,\n });\n },\n);\n\nexport const getTokenDecimals = async (canisterId: string) => {\n const token = get(safeUserTokensStore).tokens.find(t => t.canister_id === canisterId) || await fetchTokensByCanisterId([canisterId])[0];\n return token?.decimals || 0;\n};\n\nexport const fromTokenDecimals = (\n amount: BigNumber | string,\n decimals: number,\n): bigint => {\n try {\n const amountBN =\n typeof amount === \"string\" ? new BigNumber(amount || \"0\") : amount;\n if (amountBN.isNaN()) {\n return BigInt(0);\n }\n const multiplier = new BigNumber(10).pow(decimals);\n const result = amountBN.times(multiplier);\n // Remove any decimal places and convert to string for BigInt\n const wholePart = result.integerValue(BigNumber.ROUND_DOWN).toString();\n return BigInt(wholePart);\n } catch (error) {\n console.error(\"Error converting to token decimals:\", error);\n return BigInt(0);\n }\n};\n"],"names":["fallbackBalancesStore","writable","fallbackUserTokensStore","enabledTokens","tokens","isAuthenticated","fallbackUserPoolsStore","processedPools","safeUserTokensStore","userTokens","derived","currentUserPoolsStore","currentUserBalancesStore","$userTokens","$currentUserPoolsStore","$storedBalances","reduce","acc","token","canister_id","balance","_a","in_usd","Number","pool","usd_balance","toLocaleString","minimumFractionDigits","maximumFractionDigits","getTokenDecimals","async","canisterId","get","find","t","fetchTokensByCanisterId","decimals","fromTokenDecimals","amount","amountBN","BigNumber","isNaN","BigInt","multiplier","pow","wholePart","times","integerValue","ROUND_DOWN","toString","error","console"],"mappings":"8GA6BA,MAAMA,EAAwBC,EAA0C,IAClEC,EAA0BD,EAAS,CAAEE,cAAe,CAAA,EAAIC,OAAQ,GAAIC,iBAAiB,IACrFC,EAAyBL,EAAS,CAAEM,eAAgB,KAIpDC,EAAsBC,GAAcP,EAkCZQ,EAC5B,CAACF,EAlCwBG,GAAyBL,EAF1BM,GAA4BZ,IAqCpD,EAAEa,EAAaC,EAAwBC,MAEjC,IAACF,IAAgBE,EACZ,MAAA,OAqBF,QAjBaF,EAAYT,QAAU,IAAIY,QAAO,CAACC,EAAKC,WACzD,IAAKA,IAAUA,EAAMC,YAAoB,OAAAF,EACzC,MAAMG,EAAU,OAAAC,EAAAN,EAAgBG,EAAMC,mBAAc,EAAAE,EAAAC,OAChD,OAAAF,GAAuB,MAAZA,EACNH,EAAMM,OAAOH,GAEfH,CAAA,GACN,WAGgBH,WAAwBP,iBAAkB,IAAIS,QAAO,CAACC,EAAKO,IAErEP,GADOO,GAAQA,EAAKC,YAAcF,OAAOC,EAAKC,aAAe,IAEnE,IAIeC,eAAe,QAAS,CACxCC,sBAAuB,EACvBC,sBAAuB,GACxB,IAIQ,MAAAC,EAAmBC,MAAOC,IACrC,MAAMb,EAAQc,EAAIxB,GAAqBJ,OAAO6B,MAAUC,GAAAA,EAAEf,cAAgBY,WAAqBI,EAAwB,CAACJ,IAAa,GACrI,aAAOb,WAAOkB,WAAY,CAAA,EAGfC,EAAoB,CAC/BC,EACAF,KAEI,IACI,MAAAG,EACc,iBAAXD,EAAsB,IAAIE,EAAUF,GAAU,KAAOA,EAC1D,GAAAC,EAASE,QACX,OAAOC,OAAO,GAEhB,MAAMC,EAAa,IAAIH,EAAU,IAAII,IAAIR,GAGnCS,EAFSN,EAASO,MAAMH,GAELI,aAAaP,EAAUQ,YAAYC,WAC5D,OAAOP,OAAOG,SACPK,GAEP,OADQC,QAAAD,MAAM,sCAAuCA,GAC9CR,OAAO,EAAC"}