diff --git a/packages/wallets/CHANGELOG.md b/packages/wallets/CHANGELOG.md index 15beb08e2d..fb8f0325db 100644 --- a/packages/wallets/CHANGELOG.md +++ b/packages/wallets/CHANGELOG.md @@ -4,6 +4,7 @@ ### Patch Changes +- fix(wallets): saving chain addresses no longer deletes engine tokens (#1408) - Updated dependencies []: - @ecency/sdk@2.3.82 diff --git a/packages/wallets/dist/browser/index.d.ts b/packages/wallets/dist/browser/index.d.ts index 7aa8c132f1..d18213ee3f 100644 --- a/packages/wallets/dist/browser/index.d.ts +++ b/packages/wallets/dist/browser/index.d.ts @@ -1,6 +1,6 @@ import * as _tanstack_react_query from '@tanstack/react-query'; import { UseMutationOptions } from '@tanstack/react-query'; -import { AuthContext, HiveEngineTokenMetadataResponse, AssetOperation } from '@ecency/sdk'; +import { AccountProfile, AuthContext, HiveEngineTokenMetadataResponse, AssetOperation } from '@ecency/sdk'; export { Asset, AssetOperation, AuthorReward, CancelTransferFromSavings, ClaimRewardBalance, CollateralizedConvert, CommentBenefactor, CommentPayoutUpdate, CommentReward, CurationReward, DelegateVestingShares, DelegatedVestingShare, EffectiveCommentVote, FillCollateralizedConvertRequest, FillConvertRequest, FillOrder, FillRecurrentTransfers, FillVestingWithdraw, GeneralAssetInfo, GeneralAssetTransaction, HIVE_ACCOUNT_OPERATION_GROUPS, HIVE_OPERATION_LIST, HIVE_OPERATION_NAME_BY_ID, HIVE_OPERATION_ORDERS, HiveBasedAssetSignType, HiveEngineMarketResponse, HiveEngineMetric, HiveEngineOpenOrder, HiveEngineOrderBookEntry, HiveEngineToken, HiveEngineTokenBalance, HiveEngineTokenInfo, HiveEngineTokenMetadataResponse, HiveEngineTokenStatus, HiveEngineTransaction, HiveMarketMetric, HiveOperationFilter, HiveOperationFilterKey, HiveOperationFilterValue, HiveOperationGroup, HiveOperationName, HiveTransaction, WithdrawRoute as HiveWithdrawRoute, Interest, LimitOrderCancel, LimitOrderCreate, NaiMap, PointTransaction, PointTransactionType, Points, PointsResponse, ProducerReward, ProposalPay, ReceivedVestingShare, RecurrentTransfers, ReturnVestingDelegation, SetWithdrawRoute, Symbol, Token, TokenMetadata, Transfer, TransferToSavings, TransferToVesting, UpdateProposalVotes, VoteProxy, WalletOperationPayload, WithdrawVesting, formattedNumber, getAccountWalletAssetInfoQueryOptions, getAllHiveEngineTokensQueryOptions, getHbdAssetGeneralInfoQueryOptions, getHbdAssetTransactionsQueryOptions, getHiveAssetGeneralInfoQueryOptions, getHiveAssetMetricQueryOptions, getHiveAssetTransactionsQueryOptions, getHiveAssetWithdrawalRoutesQueryOptions, getHiveEngineBalancesWithUsdQueryOptions, getHiveEngineTokenGeneralInfoQueryOptions, getHiveEngineTokenTransactionsQueryOptions, getHiveEngineTokensBalancesQueryOptions, getHiveEngineTokensMarketQueryOptions, getHiveEngineTokensMetadataQueryOptions, getHiveEngineTokensMetricsQueryOptions, getHiveEngineUnclaimedRewardsQueryOptions, getHivePowerAssetGeneralInfoQueryOptions, getHivePowerAssetTransactionsQueryOptions, getHivePowerDelegatesInfiniteQueryOptions, getHivePowerDelegatingsQueryOptions, getPointsAssetGeneralInfoQueryOptions, getPointsAssetTransactionsQueryOptions, getPointsQueryOptions, isEmptyDate, parseAsset, resolveHiveOperationFilters, useClaimPoints, useWalletOperation, vestsToHp } from '@ecency/sdk'; declare enum EcencyWalletCurrency { @@ -87,6 +87,33 @@ interface AccountPointsResponse { unclaimed_points: string; } +/** + * Assemble the `profile.tokens` array to broadcast. + * + * `profile.tokens` is written wholesale, so whatever this returns IS the user's + * new on-chain token list — anything omitted is deleted, and since no app other + * than Ecency writes this field, the deletion is unrecoverable. + * + * Which entries survive depends on what the caller manages, inferred from the + * payload itself: + * + * - A payload carrying non-chain entries comes from the wallet token picker, + * which owns the COMPLETE list — it always sends the basic Hive assets plus + * every selected engine token, and deselecting one means omitting it. Unlisted + * entries are therefore dropped, which is what the user asked for. + * - A CHAIN-only payload comes from the external-wallet screens, which know + * nothing about engine tokens. Their unlisted entries are carried forward. + * + * Inferring rather than taking a flag keeps this fix inside the package (the + * apps resolve it through the committed dist, so a new public option could not + * be used by a caller until the next release). It is also safe in the degenerate + * case: if the picker somehow submits before its token list has loaded, the + * payload is chain-only and we preserve — the non-destructive outcome. + * + * @param existingTokens the account's current on-chain `profile.tokens` + * @param tokens the caller's payload + */ +declare function buildTokensPayload(existingTokens: AccountProfile["tokens"], tokens: EcencyTokenMetadata[]): AccountProfile["tokens"]; /** * Saving of token(s) metadata to Hive profile * It may contain: external wallets(see EcencyWalletCurrency), Hive tokens arrangement @@ -284,4 +311,4 @@ declare function installHiveSnap(): Promise; */ declare function getHivePublicKeys(): Promise; -export { type AccountPointsResponse, type EcencyHiveKeys, type EcencyTokenMetadata, EcencyWalletBasicTokens, EcencyWalletCurrency, index as EcencyWalletsPrivateApi, type ExternalWalletBalance, type HiveKeyDerivation, type HivePublicKey, type HiveRole, type TransferableCurrency, type WalletAddressMap, deriveHiveKey, deriveHiveKeys, deriveHiveMasterPasswordKey, deriveHiveMasterPasswordKeys, detectHiveKeyDerivation, discoverMetaMaskWallets, ensureEvmChain, estimateEvmGas, fetchEvmAddress, fetchMultichainAddresses, formatLamports, formatWei, getAccountWalletListQueryOptions, getAllTokensListQueryOptions, getEvmChainConfig, getEvmExplorerUrl, getHivePublicKeys, getSolExplorerUrl, getTokenOperationsQueryOptions, getTokenPriceQueryOptions, installHiveSnap, parseToLamports, parseToWei, sendEvmTransfer, sendSolTransfer, useExternalTransfer, useGetExternalWalletBalanceQuery, useSaveWalletInformationToMetadata }; +export { type AccountPointsResponse, type EcencyHiveKeys, type EcencyTokenMetadata, EcencyWalletBasicTokens, EcencyWalletCurrency, index as EcencyWalletsPrivateApi, type ExternalWalletBalance, type HiveKeyDerivation, type HivePublicKey, type HiveRole, type TransferableCurrency, type WalletAddressMap, buildTokensPayload, deriveHiveKey, deriveHiveKeys, deriveHiveMasterPasswordKey, deriveHiveMasterPasswordKeys, detectHiveKeyDerivation, discoverMetaMaskWallets, ensureEvmChain, estimateEvmGas, fetchEvmAddress, fetchMultichainAddresses, formatLamports, formatWei, getAccountWalletListQueryOptions, getAllTokensListQueryOptions, getEvmChainConfig, getEvmExplorerUrl, getHivePublicKeys, getSolExplorerUrl, getTokenOperationsQueryOptions, getTokenPriceQueryOptions, installHiveSnap, parseToLamports, parseToWei, sendEvmTransfer, sendSolTransfer, useExternalTransfer, useGetExternalWalletBalanceQuery, useSaveWalletInformationToMetadata }; diff --git a/packages/wallets/dist/browser/index.js b/packages/wallets/dist/browser/index.js index 30597b0576..b6bb3127d3 100644 --- a/packages/wallets/dist/browser/index.js +++ b/packages/wallets/dist/browser/index.js @@ -631,15 +631,17 @@ function getTokenOperationsQueryOptions(token, username, isForOwner = false, cur } // src/modules/wallets/mutations/save-wallet-information-to-metadata.ts +var isChainToken = ({ + type, + symbol +}) => type === "CHAIN" || Object.values(EcencyWalletCurrency).includes(symbol); function getGroupedChainTokens(tokens, defaultShow) { if (!tokens) { return {}; } return R.pipe( tokens, - R.filter( - ({ type, symbol }) => type === "CHAIN" || Object.values(EcencyWalletCurrency).includes(symbol) - ), + R.filter(isChainToken), R.map((item) => { const meta = { ...item.meta ?? {} @@ -659,6 +661,35 @@ function getGroupedChainTokens(tokens, defaultShow) { ) ); } +function buildTokensPayload(existingTokens, tokens) { + const profileChainTokens = getGroupedChainTokens(existingTokens); + const payloadTokens = tokens.map(({ currency, type, privateKey, username, ...meta }) => ({ + symbol: currency, + type: type ?? (Object.values(EcencyWalletCurrency).includes(currency) ? "CHAIN" : void 0), + meta + })) ?? []; + const payloadChainTokens = getGroupedChainTokens(payloadTokens, true); + const payloadNonChainTokens = (payloadTokens ?? []).filter( + (token) => !isChainToken(token) + ); + const mergedChainTokens = R.pipe( + profileChainTokens, + R.mergeDeep(payloadChainTokens), + R.values() + ); + const managesNonChainTokens = payloadNonChainTokens.length > 0; + const payloadSymbols = new Set( + (payloadTokens ?? []).map(({ symbol }) => symbol) + ); + const preservedTokens = managesNonChainTokens ? [] : (existingTokens ?? []).filter( + (token) => !isChainToken(token) && !payloadSymbols.has(token.symbol) + ); + return [ + ...preservedTokens, + ...payloadNonChainTokens, + ...mergedChainTokens + ]; +} function useSaveWalletInformationToMetadata(username, auth, options2) { const queryClient = useQueryClient(); const { data: accountData } = useQuery(getAccountFullQueryOptions(username)); @@ -673,28 +704,8 @@ function useSaveWalletInformationToMetadata(username, auth, options2) { if (!accountData) { throw new Error("[SDK][Wallets] \u2013 no account data to save wallets"); } - const profileChainTokens = getGroupedChainTokens( - accountData.profile?.tokens - ); - const payloadTokens = tokens.map(({ currency, type, privateKey, username: username2, ...meta }) => ({ - symbol: currency, - type: type ?? (Object.values(EcencyWalletCurrency).includes(currency) ? "CHAIN" : void 0), - meta - })) ?? []; - const payloadChainTokens = getGroupedChainTokens(payloadTokens, true); - const payloadNonChainTokens = payloadTokens.filter( - ({ type, symbol }) => type !== "CHAIN" && !Object.values(EcencyWalletCurrency).includes(symbol) - ); - const mergedChainTokens = R.pipe( - profileChainTokens, - R.mergeDeep(payloadChainTokens), - R.values() - ); return updateProfile({ - tokens: [ - ...payloadNonChainTokens, - ...mergedChainTokens - ] + tokens: buildTokensPayload(accountData.profile?.tokens, tokens) }); }, onError: options2?.onError, @@ -1137,6 +1148,6 @@ async function getHivePublicKeys() { // src/index.ts rememberScryptBsvVersion(); -export { EcencyWalletBasicTokens, EcencyWalletCurrency, private_api_exports as EcencyWalletsPrivateApi, deriveHiveKey, deriveHiveKeys, deriveHiveMasterPasswordKey, deriveHiveMasterPasswordKeys, detectHiveKeyDerivation, discoverMetaMaskWallets, ensureEvmChain, estimateEvmGas, fetchEvmAddress, fetchMultichainAddresses, formatLamports, formatWei, getAccountWalletListQueryOptions, getAllTokensListQueryOptions, getEvmChainConfig, getEvmExplorerUrl, getHivePublicKeys, getSolExplorerUrl, getTokenOperationsQueryOptions, getTokenPriceQueryOptions, installHiveSnap, parseToLamports, parseToWei, sendEvmTransfer, sendSolTransfer, useExternalTransfer, useGetExternalWalletBalanceQuery, useSaveWalletInformationToMetadata }; +export { EcencyWalletBasicTokens, EcencyWalletCurrency, private_api_exports as EcencyWalletsPrivateApi, buildTokensPayload, deriveHiveKey, deriveHiveKeys, deriveHiveMasterPasswordKey, deriveHiveMasterPasswordKeys, detectHiveKeyDerivation, discoverMetaMaskWallets, ensureEvmChain, estimateEvmGas, fetchEvmAddress, fetchMultichainAddresses, formatLamports, formatWei, getAccountWalletListQueryOptions, getAllTokensListQueryOptions, getEvmChainConfig, getEvmExplorerUrl, getHivePublicKeys, getSolExplorerUrl, getTokenOperationsQueryOptions, getTokenPriceQueryOptions, installHiveSnap, parseToLamports, parseToWei, sendEvmTransfer, sendSolTransfer, useExternalTransfer, useGetExternalWalletBalanceQuery, useSaveWalletInformationToMetadata }; //# sourceMappingURL=index.js.map //# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/packages/wallets/dist/browser/index.js.map b/packages/wallets/dist/browser/index.js.map index 8bbab5331e..57c0cbf447 100644 --- a/packages/wallets/dist/browser/index.js.map +++ b/packages/wallets/dist/browser/index.js.map @@ -1 +1 @@ -{"version":3,"sources":["../../src/internal/scrypt-guard.ts","../../src/modules/wallets/enums/ecency-wallet-currency.ts","../../src/modules/wallets/enums/ecency-wallet-basic-tokens.ts","../../src/modules/wallets/mutations/private-api/index.ts","../../src/modules/wallets/utils/get-bound-fetch.ts","../../src/modules/wallets/mutations/private-api/create-account-with-wallets.ts","../../src/modules/wallets/mutations/private-api/check-wallet-existence.ts","../../src/modules/wallets/mutations/private-api/update-account-with-wallets.ts","../../src/modules/wallets/queries/use-get-external-wallet-query.ts","../../src/modules/wallets/queries/get-token-price-query-options.ts","../../src/modules/wallets/queries/get-all-tokens-list-query-options.ts","../../src/modules/wallets/queries/use-get-account-wallet-list-query.ts","../../src/modules/wallets/queries/get-tokens-operations-query-options.ts","../../src/modules/wallets/mutations/save-wallet-information-to-metadata.ts","../../src/modules/wallets/utils/metamask-evm-transfer.ts","../../src/modules/wallets/utils/metamask-sol-transfer.ts","../../src/modules/wallets/mutations/use-external-transfer.ts","../../src/modules/wallets/utils/derive-hive-bip44-keys.ts","../../src/modules/wallets/utils/derive-hive-master-password-keys.ts","../../src/modules/wallets/utils/detect-hive-key-derivation.ts","../../src/modules/wallets/utils/metamask-discovery.ts","../../src/index.ts"],"names":["EcencyWalletCurrency","EcencyWalletBasicTokens","useMutation","ConfigManager","queryOptions","getQueryClient","getPortfolioQueryOptions","options","useQuery","getAccountFullQueryOptions","username","AMOUNT_REGEX","useQueryClient","PrivateKey"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * The scrypt bsv package writes the version string to a global symbol and\n * warns when that symbol is already populated. In environments that reload\n * modules (Next.js dev server, Storybook, etc.) the stale value triggers\n * repeated warnings. Clearing the cached handle before our modules touch bsv\n * keeps the console quiet without requiring downstream wrappers.\n *\n * Similarly, bitcore-lib and bitcore-lib-inquisition check for duplicate instances\n * using global variables and throw errors when detected. We clear these globals\n * to prevent false positives in module reloading scenarios.\n */\nconst globalLike = globalThis as Record & {\n _scrypt_bsv?: unknown;\n __scryptBsvPreviousVersion?: unknown;\n _bitcore?: unknown;\n __bitcorePreviousVersion?: unknown;\n};\n\nif (typeof globalLike._scrypt_bsv !== \"undefined\") {\n if (typeof globalLike._scrypt_bsv === \"string\") {\n globalLike.__scryptBsvPreviousVersion = globalLike._scrypt_bsv;\n }\n\n try {\n delete globalLike._scrypt_bsv;\n } catch {\n globalLike._scrypt_bsv = undefined;\n }\n}\n\n// Clear bitcore-lib global to prevent \"more than one instance\" errors\nif (typeof globalLike._bitcore !== \"undefined\") {\n if (typeof globalLike._bitcore === \"object\") {\n globalLike.__bitcorePreviousVersion = globalLike._bitcore;\n }\n\n try {\n delete globalLike._bitcore;\n } catch {\n globalLike._bitcore = undefined;\n }\n}\n\nexport function rememberScryptBsvVersion() {\n if (typeof globalLike._scrypt_bsv === \"string\") {\n globalLike.__scryptBsvPreviousVersion = globalLike._scrypt_bsv;\n }\n\n // Also remember bitcore version if it exists\n if (typeof globalLike._bitcore === \"object\") {\n globalLike.__bitcorePreviousVersion = globalLike._bitcore;\n }\n}\n","export enum EcencyWalletCurrency {\n BTC = \"BTC\",\n ETH = \"ETH\",\n BNB = \"BNB\",\n SOL = \"SOL\",\n}\n","export enum EcencyWalletBasicTokens {\n Points = \"POINTS\",\n HivePower = \"HP\",\n Hive = \"HIVE\",\n HiveDollar = \"HBD\"\n}\n","export * from \"./create-account-with-wallets\";\nexport * from \"./check-wallet-existence\";\nexport * from \"./update-account-with-wallets\";\n","let cachedFetch: typeof globalThis.fetch | undefined;\n\nexport function getBoundFetch() {\n if (!cachedFetch) {\n if (typeof globalThis.fetch !== \"function\") {\n throw new Error(\"[Ecency][Wallets] - global fetch is not available\");\n }\n\n cachedFetch = globalThis.fetch.bind(globalThis);\n }\n\n return cachedFetch;\n}\n","import { ConfigManager } from \"@ecency/sdk\";\nimport { EcencyWalletCurrency } from \"@/modules/wallets/enums\";\nimport { getBoundFetch } from \"@/modules/wallets/utils/get-bound-fetch\";\nimport { useMutation } from \"@tanstack/react-query\";\n\ninterface HiveKeys {\n ownerPublicKey?: string;\n activePublicKey?: string;\n postingPublicKey?: string;\n memoPublicKey?: string;\n}\n\ninterface Payload {\n currency: EcencyWalletCurrency;\n address: string;\n hiveKeys?: HiveKeys;\n walletAddresses?: Partial>;\n}\n\nexport function useCreateAccountWithWallets(username: string) {\n const fetchApi = getBoundFetch();\n\n return useMutation({\n mutationKey: [\"ecency-wallets\", \"create-account-with-wallets\", username],\n mutationFn: async ({ currency, address, hiveKeys, walletAddresses }: Payload) => {\n const addresses: Record = {};\n if (walletAddresses) {\n for (const [k, v] of Object.entries(walletAddresses)) {\n if (v) addresses[k] = v;\n }\n }\n\n const response = await fetchApi(`${ConfigManager.getValidatedBaseUrl()}/private-api/wallets-add`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n username,\n token: currency,\n address,\n meta: {\n ...hiveKeys,\n ...addresses,\n [currency]: address\n },\n }),\n });\n\n if (!response.ok) {\n throw new Error(`Account creation failed (${response.status})`);\n }\n\n return response;\n },\n });\n}\n","import { ConfigManager } from \"@ecency/sdk\";\nimport { EcencyWalletCurrency } from \"@/modules/wallets/enums\";\nimport { useMutation } from \"@tanstack/react-query\";\n\ninterface Payload {\n address: string;\n currency: EcencyWalletCurrency;\n}\n\nexport function useCheckWalletExistence() {\n return useMutation({\n mutationKey: [\"ecency-wallets\", \"check-wallet-existence\"],\n mutationFn: async ({ address, currency }: Payload) => {\n const response = await fetch(\n `${ConfigManager.getValidatedBaseUrl()}/private-api/wallets-exist`,\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n address,\n token: currency,\n }),\n }\n );\n const data = await response.json();\n return data.length === 0;\n },\n });\n}\n","import { ConfigManager } from \"@ecency/sdk\";\nimport { useMutation } from \"@tanstack/react-query\";\nimport { getBoundFetch } from \"@/modules/wallets/utils/get-bound-fetch\";\n\ninterface Payload {\n tokens: Record;\n hiveKeys: {\n ownerPublicKey: string;\n activePublicKey: string;\n postingPublicKey: string;\n memoPublicKey: string;\n };\n}\n\nexport function useUpdateAccountWithWallets(\n username: string,\n accessToken: string | undefined\n) {\n const fetchApi = getBoundFetch();\n\n return useMutation({\n mutationKey: [\"ecency-wallets\", \"update-account-with-wallets\", username],\n mutationFn: async ({ tokens, hiveKeys }: Payload) => {\n const entries = Object.entries(tokens).filter(([, address]) => Boolean(address));\n\n if (entries.length === 0) {\n return new Response(null, { status: 204 });\n }\n\n const [primaryToken, primaryAddress] = entries[0] ?? [\"\", \"\"];\n\n if (!accessToken) {\n throw new Error(\n \"[SDK][Wallets][PrivateApi][WalletsAdd] – access token wasn`t found\"\n );\n }\n\n const response = await fetchApi(`${ConfigManager.getValidatedBaseUrl()}/private-api/wallets-add`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n username,\n code: accessToken,\n token: primaryToken,\n address: primaryAddress,\n status: 3,\n meta: {\n ...Object.fromEntries(entries),\n ownerPublicKey: hiveKeys.ownerPublicKey,\n activePublicKey: hiveKeys.activePublicKey,\n postingPublicKey: hiveKeys.postingPublicKey,\n memoPublicKey: hiveKeys.memoPublicKey,\n },\n }),\n });\n\n // Raw fetch resolves on 4xx/5xx; guard so a failed wallet-add doesn't run\n // onSuccess as if the account had been updated.\n if (!response.ok) {\n throw new Error(\n `[SDK][Wallets][PrivateApi][WalletsAdd] – request failed: ${response.status}`\n );\n }\n\n return response;\n },\n });\n}\n","import { EcencyWalletCurrency } from \"@/modules/wallets/enums\";\nimport { ConfigManager } from \"@ecency/sdk\";\nimport { useQuery } from \"@tanstack/react-query\";\n\nconst currencyChainMap: Record = {\n [EcencyWalletCurrency.BTC]: \"btc\",\n [EcencyWalletCurrency.ETH]: \"eth\",\n [EcencyWalletCurrency.BNB]: \"bnb\",\n [EcencyWalletCurrency.SOL]: \"sol\",\n};\n\ninterface PrivateApiBalanceResponse {\n chain: string;\n balance: number | string;\n unit: string;\n raw?: unknown;\n nodeId?: string;\n}\n\nexport interface ExternalWalletBalance {\n chain: string;\n unit: string;\n raw?: unknown;\n nodeId?: string;\n /**\n * Balance represented as a BigInt for convenience.\n */\n balanceBigInt: bigint;\n /**\n * Balance returned as a string to preserve precision for UIs that cannot\n * handle bigint values directly.\n */\n balanceString: string;\n}\n\nfunction normalizeBalance(balance: number | string): string {\n if (typeof balance === \"number\") {\n if (!Number.isFinite(balance)) {\n throw new Error(\"Private API returned a non-finite numeric balance\");\n }\n\n return Math.trunc(balance).toString();\n }\n\n if (typeof balance === \"string\") {\n const trimmed = balance.trim();\n\n if (trimmed === \"\") {\n throw new Error(\"Private API returned an empty balance string\");\n }\n\n return trimmed;\n }\n\n throw new Error(\"Private API returned balance in an unexpected format\");\n}\n\nfunction parsePrivateApiBalance(\n result: unknown,\n expectedChain: string\n): ExternalWalletBalance {\n if (!result || typeof result !== \"object\") {\n throw new Error(\"Private API returned an unexpected response\");\n }\n\n const { chain, balance, unit, raw, nodeId } =\n result as PrivateApiBalanceResponse;\n\n if (typeof chain !== \"string\" || chain !== expectedChain) {\n throw new Error(\"Private API response chain did not match request\");\n }\n\n if (typeof unit !== \"string\" || unit.length === 0) {\n throw new Error(\"Private API response is missing unit information\");\n }\n\n if (balance === undefined || balance === null) {\n throw new Error(\"Private API response is missing balance information\");\n }\n\n const balanceString = normalizeBalance(balance);\n\n let balanceBigInt: bigint;\n\n try {\n balanceBigInt = BigInt(balanceString);\n } catch (error) {\n throw new Error(\"Private API returned a balance that is not an integer\");\n }\n\n return {\n chain,\n unit,\n raw,\n nodeId:\n typeof nodeId === \"string\" && nodeId.length > 0 ? nodeId : undefined,\n balanceBigInt,\n balanceString,\n };\n}\n\nexport function useGetExternalWalletBalanceQuery(\n currency: EcencyWalletCurrency,\n address: string\n) {\n return useQuery({\n queryKey: [\"ecency-wallets\", \"external-wallet-balance\", currency, address],\n queryFn: async () => {\n const chain = currencyChainMap[currency];\n\n if (!chain) {\n throw new Error(`Unsupported currency ${currency}`);\n }\n\n const baseUrl = `${ConfigManager.getValidatedBaseUrl()}/private-api/balance/${chain}/${encodeURIComponent(\n address\n )}`;\n\n let primaryResponse: Response | undefined;\n let primaryError: unknown;\n\n try {\n primaryResponse = await fetch(baseUrl);\n } catch (error) {\n primaryError = error;\n }\n\n let response = primaryResponse;\n\n if (!response || !response.ok) {\n const fallbackUrl = `${baseUrl}?provider=chainz`;\n let fallbackError: unknown;\n\n try {\n const fallbackResponse = await fetch(fallbackUrl);\n\n if (fallbackResponse.ok) {\n response = fallbackResponse;\n } else {\n fallbackError = new Error(\n `Fallback provider responded with status ${fallbackResponse.status}`\n );\n }\n } catch (error) {\n fallbackError = error;\n }\n\n if (!response || !response.ok) {\n const failureReasons: string[] = [];\n\n if (primaryError) {\n const message =\n primaryError instanceof Error\n ? primaryError.message\n : String(primaryError);\n failureReasons.push(`primary provider failed: ${message}`);\n } else if (primaryResponse && !primaryResponse.ok) {\n failureReasons.push(\n `primary provider status ${primaryResponse.status}`\n );\n }\n\n if (fallbackError) {\n const message =\n fallbackError instanceof Error\n ? fallbackError.message\n : String(fallbackError);\n failureReasons.push(`fallback provider failed: ${message}`);\n }\n\n if (failureReasons.length === 0) {\n failureReasons.push(\"unknown error\");\n }\n\n throw new Error(\n `Private API request failed (${failureReasons.join(\", \")})`\n );\n }\n }\n\n const result = (await response.json()) as unknown;\n\n return parsePrivateApiBalance(result, chain);\n },\n });\n}\n","import { ConfigManager } from \"@ecency/sdk\";\nimport { EcencyWalletCurrency } from \"@/modules/wallets/enums\";\nimport { queryOptions } from \"@tanstack/react-query\";\nimport { LRUCache } from \"lru-cache\";\n\nconst options = {\n max: 500,\n // how long to live in ms\n ttl: 1000 * 60 * 5,\n // return stale items before removing from cache?\n allowStale: false,\n updateAgeOnGet: false,\n updateAgeOnHas: false,\n};\n\nconst cache = new LRUCache(options);\nconst undefinedValue = Symbol(\"undefined\");\n\nconst cacheSet = (key: string, value: any) =>\n cache.set(key, value === undefined ? undefinedValue : value);\n\nconst cacheGet = (key: string) => {\n const v = cache.get(key);\n return v === undefinedValue ? undefined : v;\n};\n\ninterface MarketDataQuote {\n last_updated: string;\n percent_change: number;\n price: number;\n}\n\ninterface MarketDataLatestResponse {\n [token: string]: {\n quotes?: {\n usd?: MarketDataQuote;\n btc?: MarketDataQuote;\n [fiat: string]: MarketDataQuote | undefined;\n };\n };\n}\n\nconst CURRENCY_TO_TOKEN_MAP: Record = {\n [EcencyWalletCurrency.BTC]: \"btc\",\n [EcencyWalletCurrency.ETH]: \"eth\",\n [EcencyWalletCurrency.SOL]: \"sol\",\n [EcencyWalletCurrency.BNB]: \"bnb\",\n HBD: \"hbd\",\n HIVE: \"hive\",\n};\n\nconst MARKET_DATA_CACHE_KEY = \"market-data/latest\";\n\nconst normalizeCurrencyToToken = (currency: string) => {\n const upperCased = currency.toUpperCase();\n return CURRENCY_TO_TOKEN_MAP[upperCased] ?? currency.toLowerCase();\n};\n\nexport function getTokenPriceQueryOptions(currency?: string) {\n return queryOptions({\n queryKey: [\"ecency-wallets\", \"market-data\", currency],\n queryFn: async () => {\n if (!currency) {\n throw new Error(\n \"[SDK][Wallets][MarketData] – currency wasn`t provided\"\n );\n }\n\n const token = normalizeCurrencyToToken(currency);\n const baseUrl = ConfigManager.getValidatedBaseUrl();\n\n let marketData = cacheGet(MARKET_DATA_CACHE_KEY) as\n | MarketDataLatestResponse\n | undefined;\n\n if (!marketData) {\n const httpResponse = await fetch(\n `${baseUrl}/private-api/market-data/latest`,\n {\n method: \"GET\",\n }\n );\n\n if (!httpResponse.ok) {\n throw new Error(\n `[SDK][Wallets][MarketData] – failed to fetch latest market data (${httpResponse.status})`\n );\n }\n\n const data = (await httpResponse.json()) as MarketDataLatestResponse;\n cacheSet(MARKET_DATA_CACHE_KEY, data);\n marketData = data;\n }\n\n const tokenData = marketData[token];\n\n if (!tokenData) {\n throw new Error(\n `[SDK][Wallets][MarketData] – missing market data for token: ${token}`\n );\n }\n\n const usdQuote = tokenData.quotes?.usd;\n\n if (!usdQuote) {\n throw new Error(\n `[SDK][Wallets][MarketData] – missing USD quote for token: ${token}`\n );\n }\n\n return Number(usdQuote.price);\n },\n enabled: !!currency,\n });\n}\n","import {\n getHiveEngineTokensBalancesQueryOptions,\n getHiveEngineTokensMetadataQueryOptions,\n} from \"@/modules/assets\";\nimport {\n HiveEngineTokenBalance,\n HiveEngineTokenMetadataResponse,\n} from \"@/modules/assets/hive-engine/types\";\nimport { getQueryClient } from \"@ecency/sdk\";\nimport { queryOptions } from \"@tanstack/react-query\";\nimport { EcencyWalletBasicTokens, EcencyWalletCurrency } from \"../enums\";\n\nfunction createFallbackTokenMetadata(symbol: string): HiveEngineTokenMetadataResponse {\n return {\n issuer: \"\",\n symbol,\n name: symbol,\n metadata: \"{}\",\n precision: 0,\n maxSupply: \"0\",\n supply: \"0\",\n circulatingSupply: \"0\",\n stakingEnabled: false,\n unstakingCooldown: 0,\n delegationEnabled: false,\n undelegationCooldown: 0,\n numberTransactions: 0,\n totalStaked: \"0\",\n };\n}\n\nasync function getLayer2TokensMetadata(username?: string) {\n if (!username) {\n return [] as HiveEngineTokenMetadataResponse[];\n }\n\n let balances: HiveEngineTokenBalance[] = [];\n\n try {\n balances = await getQueryClient().fetchQuery(\n getHiveEngineTokensBalancesQueryOptions(username)\n );\n } catch {\n balances = [];\n }\n\n const uniqueSymbols = Array.from(\n new Set(\n balances\n .map((balance) => balance.symbol)\n .filter((symbol): symbol is string => Boolean(symbol))\n )\n );\n\n if (uniqueSymbols.length === 0) {\n return [] as HiveEngineTokenMetadataResponse[];\n }\n\n let metadataList: HiveEngineTokenMetadataResponse[] = [];\n\n try {\n metadataList = await getQueryClient().fetchQuery(\n getHiveEngineTokensMetadataQueryOptions(uniqueSymbols)\n );\n } catch {\n metadataList = [];\n }\n\n const metadataBySymbol = new Map(\n metadataList.map((token) => [token.symbol, token])\n );\n\n return uniqueSymbols.map(\n (symbol) => metadataBySymbol.get(symbol) ?? createFallbackTokenMetadata(symbol)\n );\n}\n\nexport function getAllTokensListQueryOptions(username?: string) {\n return queryOptions({\n queryKey: [\"ecency-wallets\", \"all-tokens-list\", username ?? null],\n queryFn: async () => {\n return {\n basic: [\n EcencyWalletBasicTokens.Points,\n EcencyWalletBasicTokens.Hive,\n EcencyWalletBasicTokens.HivePower,\n EcencyWalletBasicTokens.HiveDollar,\n ],\n external: Object.values(EcencyWalletCurrency),\n layer2: await getLayer2TokensMetadata(username),\n };\n },\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { EcencyWalletBasicTokens } from \"../enums\";\nimport {\n AccountProfile,\n FullAccount,\n getAccountFullQueryOptions,\n getQueryClient,\n getPortfolioQueryOptions,\n type PortfolioResponse,\n type PortfolioWalletItem,\n} from \"@ecency/sdk\";\n\ntype ProfileTokens = AccountProfile[\"tokens\"];\ntype ProfileToken = NonNullable[number];\n\nfunction normalizeAccountTokens(tokens: ProfileTokens): ProfileToken[] {\n if (Array.isArray(tokens)) {\n return tokens.filter(Boolean) as ProfileToken[];\n }\n\n if (tokens && typeof tokens === \"object\") {\n return Object.values(tokens).flatMap((value) =>\n Array.isArray(value) ? (value.filter(Boolean) as ProfileToken[]) : []\n );\n }\n\n return [];\n}\n\nconst BASIC_TOKENS: string[] = [\n EcencyWalletBasicTokens.Points,\n EcencyWalletBasicTokens.Hive,\n EcencyWalletBasicTokens.HivePower,\n EcencyWalletBasicTokens.HiveDollar,\n];\n\n// Tokens whose support has been removed. Stale profile.tokens entries and\n// portfolio responses may still reference them, so they are always hidden.\nconst REMOVED_TOKENS = new Set([\"SPK\", \"LARYNX\", \"LP\", \"BROCA\"]);\n\nexport function getAccountWalletListQueryOptions(username: string, currency: string = \"usd\") {\n return queryOptions({\n queryKey: [\"ecency-wallets\", \"list\", username, currency],\n enabled: !!username,\n queryFn: async () => {\n const portfolioQuery = getPortfolioQueryOptions(username, currency, true);\n const queryClient = getQueryClient();\n const accountQuery = getAccountFullQueryOptions(username);\n\n let account: FullAccount | undefined;\n\n try {\n account = (await queryClient.fetchQuery(accountQuery)) ?? undefined;\n } catch {\n // Best effort; fall back to defaults if account metadata is not available.\n }\n\n const tokenVisibility = new Map();\n\n const accountTokens = normalizeAccountTokens(account?.profile?.tokens);\n\n accountTokens.forEach((token: ProfileToken) => {\n const symbol = token.symbol?.toUpperCase?.();\n\n if (!symbol) {\n return;\n }\n\n const showValue = (token as any)?.meta?.show;\n\n if (typeof showValue === \"boolean\") {\n tokenVisibility.set(symbol, showValue);\n }\n });\n\n const isTokenVisible = (symbol?: string) => {\n const normalized = symbol?.toUpperCase();\n\n if (!normalized) {\n return false;\n }\n\n if (REMOVED_TOKENS.has(normalized)) {\n return false;\n }\n\n if (BASIC_TOKENS.includes(normalized)) {\n return true;\n }\n\n return tokenVisibility.get(normalized) === true;\n };\n\n try {\n const portfolio: PortfolioResponse = await queryClient.fetchQuery(portfolioQuery);\n const tokensFromPortfolio: string[] = portfolio.wallets.map(\n (asset: PortfolioWalletItem) => asset.symbol\n );\n\n if (tokensFromPortfolio.length > 0) {\n const visibleTokens = tokensFromPortfolio\n .map((token: string) => token?.toUpperCase?.())\n .filter((token: string | undefined): token is string => Boolean(token))\n .filter(isTokenVisible);\n\n if (visibleTokens.length > 0) {\n // Always include basic tokens (HP, HIVE, HBD, POINTS) even if\n // the portfolio API omits them from its response.\n return Array.from(new Set([...BASIC_TOKENS, ...visibleTokens]));\n }\n }\n } catch {\n // Fallback to legacy behaviour when the portfolio endpoint is not accessible.\n }\n\n if (accountTokens.length > 0) {\n const list = [\n ...BASIC_TOKENS,\n ...accountTokens\n .map((token: ProfileToken) => token.symbol)\n .filter(isTokenVisible),\n ];\n\n return Array.from(new Set(list).values());\n }\n\n return [...BASIC_TOKENS];\n },\n });\n}\n","import { AssetOperation } from \"@/modules/assets\";\nimport {\n getQueryClient,\n getPortfolioQueryOptions,\n type PortfolioResponse,\n type PortfolioWalletItem,\n} from \"@ecency/sdk\";\nimport { queryOptions } from \"@tanstack/react-query\";\n\nexport function getTokenOperationsQueryOptions(\n token: string,\n username: string,\n isForOwner = false,\n currency: string = \"usd\"\n) {\n return queryOptions({\n queryKey: [\"wallets\", \"token-operations\", token, username, isForOwner, currency],\n queryFn: async () => {\n const queryClient = getQueryClient();\n const normalizedToken = token.toUpperCase();\n\n if (!username || !isForOwner) {\n return [] as AssetOperation[];\n }\n\n try {\n const portfolio: PortfolioResponse = await queryClient.fetchQuery(\n getPortfolioQueryOptions(username, currency, true)\n );\n const assetEntry = portfolio.wallets.find(\n (assetItem: PortfolioWalletItem) => assetItem.symbol.toUpperCase() === normalizedToken\n );\n\n if (!assetEntry) {\n return [] as AssetOperation[];\n }\n\n // Extract action IDs and map to AssetOperation enums\n const rawActions: Array<{ id: string; [key: string]: unknown }> = assetEntry.actions ?? [];\n const operations: AssetOperation[] = rawActions\n .map((action: { id: string; [key: string]: unknown } | string) => {\n // Extract the id field from action object\n if (typeof action === \"string\") return action;\n if (action && typeof action === \"object\") {\n const record = action as Record;\n return (record.id ?? record.code ?? record.name ?? record.action) as string | undefined;\n }\n return undefined;\n })\n .filter((id: string | undefined): id is string => Boolean(id))\n .map((id: string) => {\n // Normalize: underscores to hyphens, lowercase\n const canonical = id.trim().toLowerCase().replace(/[\\s_]+/g, \"-\");\n\n // Primary mapping: API action IDs to AssetOperation enum values\n const aliasMap: Record = {\n // Common operations\n \"transfer\": AssetOperation.Transfer,\n \"ecency-point-transfer\": AssetOperation.Transfer,\n\n // Savings operations\n \"transfer-to-savings\": AssetOperation.TransferToSavings,\n \"transfer-savings\": AssetOperation.TransferToSavings,\n \"savings-transfer\": AssetOperation.TransferToSavings,\n \"withdraw-from-savings\": AssetOperation.WithdrawFromSavings,\n \"transfer-from-savings\": AssetOperation.WithdrawFromSavings,\n \"withdraw-savings\": AssetOperation.WithdrawFromSavings,\n \"savings-withdraw\": AssetOperation.WithdrawFromSavings,\n\n // Vesting/Power operations\n \"transfer-to-vesting\": AssetOperation.PowerUp,\n \"powerup\": AssetOperation.PowerUp,\n \"power-up\": AssetOperation.PowerUp,\n \"withdraw-vesting\": AssetOperation.PowerDown,\n \"power-down\": AssetOperation.PowerDown,\n \"powerdown\": AssetOperation.PowerDown,\n\n // Delegation\n \"delegate\": AssetOperation.Delegate,\n \"delegate-vesting-shares\": AssetOperation.Delegate,\n \"hp-delegate\": AssetOperation.Delegate,\n \"delegate-hp\": AssetOperation.Delegate,\n \"delegate-power\": AssetOperation.Delegate,\n \"undelegate\": AssetOperation.Undelegate,\n \"undelegate-power\": AssetOperation.Undelegate,\n \"undelegate-token\": AssetOperation.Undelegate,\n\n // Staking (Layer 2)\n \"stake\": AssetOperation.Stake,\n \"stake-token\": AssetOperation.Stake,\n \"stake-power\": AssetOperation.Stake,\n \"unstake\": AssetOperation.Unstake,\n \"unstake-token\": AssetOperation.Unstake,\n \"unstake-power\": AssetOperation.Unstake,\n\n // Swap/Convert\n \"swap\": AssetOperation.Swap,\n \"swap-token\": AssetOperation.Swap,\n \"swap-tokens\": AssetOperation.Swap,\n \"convert\": AssetOperation.Convert,\n\n // Points operations\n \"promote\": AssetOperation.Promote,\n \"promote-post\": AssetOperation.Promote,\n \"promote-entry\": AssetOperation.Promote,\n \"boost\": AssetOperation.Promote,\n \"gift\": AssetOperation.Gift,\n \"gift-points\": AssetOperation.Gift,\n \"points-gift\": AssetOperation.Gift,\n \"claim\": AssetOperation.Claim,\n \"claim-rewards\": AssetOperation.Claim,\n \"claim-points\": AssetOperation.Claim,\n \"buy\": AssetOperation.Buy,\n \"buy-points\": AssetOperation.Buy,\n\n // Other\n \"claim-interest\": AssetOperation.ClaimInterest,\n // Chain operation name, as emitted in the HP action list. The two\n // slug spellings below predate it and stay as a fallback.\n \"set-withdraw-vesting-route\": AssetOperation.WithdrawRoutes,\n \"withdraw-routes\": AssetOperation.WithdrawRoutes,\n \"withdrawroutes\": AssetOperation.WithdrawRoutes,\n };\n\n // Check alias map first (primary method)\n const mapped = aliasMap[canonical];\n if (mapped) return mapped;\n\n // Fallback: try direct enum value match (for exact matches like \"transfer\", \"promote\")\n const directMatch = Object.values(AssetOperation).find(\n (op) => op.toLowerCase() === canonical\n );\n return directMatch;\n })\n .filter((op: AssetOperation | undefined): op is AssetOperation => Boolean(op))\n // Remove duplicates - API may return multiple actions that map to same operation\n .filter((op: AssetOperation, index: number, self: AssetOperation[]) => self.indexOf(op) === index);\n\n const isHiveOrHbd = [\"HIVE\", \"HBD\"].includes(normalizedToken);\n // Check if there's a non-zero savings balance\n const rawToken = assetEntry as any;\n const hasSavings = Number(rawToken.savings ?? 0) > 0;\n\n if (\n isHiveOrHbd &&\n !hasSavings\n ) {\n return operations.filter(\n (operation) => operation !== AssetOperation.WithdrawFromSavings\n );\n }\n\n return operations;\n } catch {\n return [];\n }\n },\n });\n}\n","import {\n AccountProfile,\n getAccountFullQueryOptions,\n useAccountUpdate,\n type AuthContext,\n} from \"@ecency/sdk\";\nimport {\n useMutation,\n useQuery,\n useQueryClient,\n type UseMutationOptions,\n} from \"@tanstack/react-query\";\nimport { EcencyTokenMetadata } from \"../types\";\nimport * as R from \"remeda\";\nimport { getAccountWalletListQueryOptions } from \"../queries\";\nimport { EcencyWalletCurrency } from \"../enums\";\n\nfunction getGroupedChainTokens(\n tokens?: AccountProfile[\"tokens\"],\n defaultShow?: boolean\n) {\n if (!tokens) {\n return {};\n }\n\n return R.pipe(\n tokens,\n R.filter(\n ({ type, symbol }) =>\n type === \"CHAIN\" ||\n Object.values(EcencyWalletCurrency).includes(symbol as any)\n ),\n R.map((item) => {\n const meta = {\n ...(item.meta ?? {}),\n } as Record;\n\n if (typeof meta.show !== \"boolean\" && typeof defaultShow === \"boolean\") {\n meta.show = defaultShow;\n }\n\n return {\n ...item,\n meta,\n };\n }),\n // Chain tokens are unique by symbol, so indexing by symbol\n // gives a direct lookup map instead of an array-based grouping.\n R.indexBy(\n (item: NonNullable[number]) => item.symbol\n )\n );\n}\n\n/**\n * Saving of token(s) metadata to Hive profile\n * It may contain: external wallets(see EcencyWalletCurrency), Hive tokens arrangement\n *\n * Basically, this mutation is a convenient wrapper for update profile operation\n */\ntype SaveWalletInformationOptions = Pick<\n UseMutationOptions,\n \"onSuccess\" | \"onError\"\n>;\n\nexport function useSaveWalletInformationToMetadata(\n username: string,\n auth?: AuthContext,\n options?: SaveWalletInformationOptions\n) {\n const queryClient = useQueryClient();\n\n const { data: accountData } = useQuery(getAccountFullQueryOptions(username));\n const { mutateAsync: updateProfile } = useAccountUpdate(username, auth);\n\n return useMutation({\n mutationKey: [\n \"ecency-wallets\",\n \"save-wallet-to-metadata\",\n accountData?.name,\n ],\n mutationFn: async (tokens: EcencyTokenMetadata[]) => {\n if (!accountData) {\n throw new Error(\"[SDK][Wallets] – no account data to save wallets\");\n }\n\n // Chain type tokens couldn't be deleted entirely from the profile list,\n // then visibility should be controlling using meta.show field\n const profileChainTokens = getGroupedChainTokens(\n accountData.profile?.tokens\n );\n\n const payloadTokens =\n (tokens.map(({ currency, type, privateKey, username, ...meta }) => ({\n symbol: currency!,\n type:\n type ??\n (Object.values(EcencyWalletCurrency).includes(currency as any)\n ? \"CHAIN\"\n : undefined),\n meta,\n })) as AccountProfile[\"tokens\"]) ?? [];\n\n const payloadChainTokens = getGroupedChainTokens(payloadTokens, true);\n const payloadNonChainTokens = payloadTokens.filter(\n ({ type, symbol }) =>\n type !== \"CHAIN\" &&\n !Object.values(EcencyWalletCurrency).includes(symbol as any)\n );\n\n const mergedChainTokens = R.pipe(\n profileChainTokens,\n R.mergeDeep(payloadChainTokens),\n R.values()\n );\n\n return updateProfile({\n tokens: [\n ...payloadNonChainTokens,\n ...mergedChainTokens,\n ] as AccountProfile[\"tokens\"],\n });\n },\n onError: options?.onError,\n onSuccess: (response, vars, context) => {\n (\n options?.onSuccess as\n | ((\n data: unknown,\n variables: EcencyTokenMetadata[],\n context: unknown\n ) => unknown)\n | undefined\n )?.(response, vars, context);\n queryClient.invalidateQueries({\n queryKey: getAccountWalletListQueryOptions(username).queryKey,\n });\n },\n });\n}\n","import { EcencyWalletCurrency } from \"@/modules/wallets/enums\";\n\ninterface RequestArguments {\n method: string;\n params?: unknown[] | Record;\n}\n\ninterface EthereumProvider {\n isMetaMask?: boolean;\n request(args: RequestArguments): Promise;\n}\n\ndeclare global {\n interface Window {\n ethereum?: EthereumProvider;\n }\n}\n\nfunction getEthereum(): EthereumProvider {\n if (typeof window === \"undefined\" || !window.ethereum) {\n throw new Error(\"MetaMask not found\");\n }\n return window.ethereum;\n}\n\nconst WEI_PER_ETH = 1000000000000000000n;\n\nconst EVM_CHAIN_CONFIG: Record = {\n [EcencyWalletCurrency.ETH]: {\n chainId: \"0x1\",\n name: \"Ethereum Mainnet\",\n rpcUrl: \"https://rpc.ankr.com/eth\",\n explorerUrl: \"https://etherscan.io/tx/\"\n },\n [EcencyWalletCurrency.BNB]: {\n chainId: \"0x38\",\n name: \"BNB Smart Chain\",\n rpcUrl: \"https://bsc-dataseed.binance.org\",\n explorerUrl: \"https://bscscan.com/tx/\"\n }\n};\n\nexport function getEvmChainConfig(currency: EcencyWalletCurrency) {\n const config = EVM_CHAIN_CONFIG[currency];\n if (!config) throw new Error(`Unsupported EVM currency: ${currency}`);\n return config;\n}\n\nexport function getEvmExplorerUrl(currency: EcencyWalletCurrency, txHash: string) {\n return `${getEvmChainConfig(currency).explorerUrl}${txHash}`;\n}\n\nexport async function ensureEvmChain(currency: EcencyWalletCurrency): Promise {\n const ethereum = getEthereum();\n\n const { chainId, name, rpcUrl } = getEvmChainConfig(currency);\n const currentChainId = await ethereum.request({ method: \"eth_chainId\" });\n\n if (currentChainId === chainId) return;\n\n try {\n await ethereum.request({\n method: \"wallet_switchEthereumChain\",\n params: [{ chainId }]\n });\n } catch (err: unknown) {\n // Chain not added — add it\n if (typeof err === \"object\" && err !== null && \"code\" in err && (err as { code: number }).code === 4902) {\n await ethereum.request({\n method: \"wallet_addEthereumChain\",\n params: [{\n chainId,\n chainName: name,\n rpcUrls: [rpcUrl],\n nativeCurrency: {\n name: currency === EcencyWalletCurrency.ETH ? \"Ether\" : \"BNB\",\n symbol: currency === EcencyWalletCurrency.ETH ? \"ETH\" : \"BNB\",\n decimals: 18\n }\n }]\n });\n } else {\n throw err;\n }\n }\n}\n\nexport async function estimateEvmGas(\n from: string,\n to: string,\n valueHex: string,\n currency: EcencyWalletCurrency\n): Promise<{ gasLimit: string; gasPrice: string; estimatedFeeWei: bigint }> {\n const ethereum = getEthereum();\n\n await ensureEvmChain(currency);\n\n const [gasLimit, gasPrice] = await Promise.all([\n ethereum.request({\n method: \"eth_estimateGas\",\n params: [{ from, to, value: valueHex }]\n }),\n ethereum.request({ method: \"eth_gasPrice\" })\n ]);\n\n const estimatedFeeWei = BigInt(gasLimit) * BigInt(gasPrice);\n\n return { gasLimit, gasPrice, estimatedFeeWei };\n}\n\nexport function formatWei(wei: bigint, decimals = 6): string {\n const whole = wei / WEI_PER_ETH;\n const rem = wei % WEI_PER_ETH;\n if (rem === 0n) return whole.toString();\n\n const scale = 10n ** BigInt(decimals);\n const fractional = (rem * scale) / WEI_PER_ETH;\n const fracStr = fractional.toString().padStart(decimals, \"0\").replace(/0+$/, \"\");\n return fracStr ? `${whole}.${fracStr}` : whole.toString();\n}\n\nconst AMOUNT_REGEX = /^\\d+(\\.\\d+)?$/;\n\nexport function parseToWei(amount: string): string {\n const trimmed = amount.trim();\n if (!AMOUNT_REGEX.test(trimmed)) {\n throw new Error(`Invalid amount: \"${amount}\"`);\n }\n\n const [whole, fraction = \"\"] = trimmed.split(\".\");\n if (!/^\\d+$/.test(whole) || (fraction && !/^\\d+$/.test(fraction))) {\n throw new Error(`Invalid amount: \"${amount}\"`);\n }\n\n const paddedFraction = fraction.padEnd(18, \"0\").slice(0, 18);\n const wei = BigInt(whole) * WEI_PER_ETH + BigInt(paddedFraction);\n return \"0x\" + wei.toString(16);\n}\n\nexport async function sendEvmTransfer(\n to: string,\n amountWei: string,\n currency: EcencyWalletCurrency,\n expectedFrom?: string\n): Promise {\n const ethereum = getEthereum();\n\n await ensureEvmChain(currency);\n\n const accounts = await ethereum.request({ method: \"eth_requestAccounts\" });\n const from = accounts[0];\n if (!from) throw new Error(\"No MetaMask account connected\");\n\n // Funds safety: never send from an account other than the linked wallet. The\n // active MetaMask account can differ from the one the user linked (multiple\n // accounts, switched account, or access just granted to a different one). This\n // comparison is atomic with the account read above and is the single source of\n // truth for the EVM send. Throws a sentinel the caller maps to a message.\n if (expectedFrom && from.toLowerCase() !== expectedFrom.toLowerCase()) {\n throw new Error(\"ACCOUNT_MISMATCH\");\n }\n\n const txHash = await ethereum.request({\n method: \"eth_sendTransaction\",\n params: [{\n from,\n to,\n value: amountWei\n }]\n });\n\n return txHash;\n}\n","import { ConfigManager } from \"@ecency/sdk\";\n\nconst SOL_EXPLORER_URL = \"https://explorer.solana.com/tx/\";\nconst LAMPORTS_PER_SOL = 1_000_000_000n;\nconst AMOUNT_REGEX = /^\\d+(\\.\\d+)?$/;\n\nexport function getSolExplorerUrl(signature: string) {\n return `${SOL_EXPLORER_URL}${signature}`;\n}\n\nexport function parseToLamports(amount: string): bigint {\n const trimmed = amount.trim();\n if (!AMOUNT_REGEX.test(trimmed)) {\n throw new Error(`Invalid amount: \"${amount}\"`);\n }\n\n const [whole, fraction = \"\"] = trimmed.split(\".\");\n if (!/^\\d+$/.test(whole) || (fraction && !/^\\d+$/.test(fraction))) {\n throw new Error(`Invalid amount: \"${amount}\"`);\n }\n\n if (fraction.length > 9 && fraction.slice(9).replace(/0/g, \"\").length > 0) {\n throw new Error(`Amount has more than 9 decimal places: \"${amount}\"`);\n }\n\n const paddedFraction = fraction.padEnd(9, \"0\").slice(0, 9);\n return BigInt(whole) * LAMPORTS_PER_SOL + BigInt(paddedFraction);\n}\n\nexport function formatLamports(lamports: bigint, decimals = 6): string {\n const whole = lamports / LAMPORTS_PER_SOL;\n const rem = lamports % LAMPORTS_PER_SOL;\n if (rem === 0n) return whole.toString();\n\n const scale = 10n ** BigInt(decimals);\n const fractional = (rem * scale) / LAMPORTS_PER_SOL;\n const fracStr = fractional.toString().padStart(decimals, \"0\").replace(/0+$/, \"\");\n return fracStr ? `${whole}.${fracStr}` : whole.toString();\n}\n\ninterface JsonRpcResponse {\n jsonrpc: string;\n id: number | string;\n result?: T;\n error?: { code?: number; message?: string };\n}\n\n/**\n * Call a Solana JSON-RPC method via the Ecency private API proxy.\n * This avoids hitting the public Solana RPC directly from the browser\n * (which returns 403). The proxy forwards to a public Solana RPC node.\n */\nasync function solRpc(method: string, params: unknown[] = []): Promise {\n const baseUrl = ConfigManager.getValidatedBaseUrl();\n const response = await fetch(`${baseUrl}/private-api/rpc/sol`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ jsonrpc: \"2.0\", id: 1, method, params })\n });\n\n if (!response.ok) {\n const text = await response.text().catch(() => \"\");\n throw new Error(`SOL RPC ${method} failed: ${response.status} ${response.statusText}${text ? ` — ${text}` : \"\"}`);\n }\n\n const json: JsonRpcResponse = await response.json();\n if (json.error) {\n throw new Error(json.error.message || `SOL RPC ${method} failed`);\n }\n return json.result as T;\n}\n\nasync function getMetaMaskSolanaWallet(): Promise {\n const { getWallets } = await import(\"@wallet-standard/app\");\n const walletsApi = getWallets();\n const wallets = walletsApi.get();\n\n // Only select a MetaMask wallet that supports Solana signing\n const mmWallet = wallets.find(\n (w: any) =>\n w.name.toLowerCase().includes(\"metamask\") &&\n w.features[\"standard:connect\"] &&\n w.features[\"solana:signAndSendTransaction\"]\n );\n\n if (!mmWallet) {\n throw new Error(\"MetaMask Solana wallet not found. Enable Solana in MetaMask settings.\");\n }\n\n return mmWallet;\n}\n\nexport async function sendSolTransfer(\n to: string,\n amountSol: string\n): Promise {\n const mmWallet = await getMetaMaskSolanaWallet();\n\n // Connect to get accounts\n const connectFeature = mmWallet.features[\"standard:connect\"] as any;\n await connectFeature.connect();\n\n const solAccount = mmWallet.accounts?.find(\n (acc: any) => acc.chains?.some((c: string) => c.startsWith(\"solana:\"))\n );\n\n if (!solAccount) {\n throw new Error(\"No Solana account found in MetaMask.\");\n }\n\n // Use @solana/web3.js for transaction building (dynamic import to avoid bundle bloat)\n const { PublicKey, SystemProgram, Transaction } = await import(\"@solana/web3.js\");\n\n const fromPubkey = new PublicKey(solAccount.address);\n const toPubkey = new PublicKey(to);\n const lamports = parseToLamports(amountSol);\n\n const transaction = new Transaction().add(\n SystemProgram.transfer({\n fromPubkey,\n toPubkey,\n lamports\n })\n );\n\n // Fetch blockhash via Ecency RPC proxy (avoids 403 from public Solana RPC)\n const blockhashResult = await solRpc<{ value: { blockhash: string } }>(\n \"getLatestBlockhash\",\n [{ commitment: \"finalized\" }]\n );\n transaction.recentBlockhash = blockhashResult.value.blockhash;\n transaction.feePayer = fromPubkey;\n\n // Serialize the transaction for signing via Wallet Standard\n const serializedTx = transaction.serialize({\n requireAllSignatures: false,\n verifySignatures: false\n });\n\n const signAndSendFeature = mmWallet.features[\"solana:signAndSendTransaction\"] as any;\n if (!signAndSendFeature) {\n throw new Error(\"MetaMask does not support Solana transaction signing. Please update MetaMask.\");\n }\n\n const [result] = await signAndSendFeature.signAndSendTransaction({\n account: solAccount,\n transaction: serializedTx,\n chain: \"solana:mainnet\"\n });\n\n // Result contains the signature — either a string or Uint8Array\n if (typeof result.signature === \"string\") {\n return result.signature;\n }\n\n // Encode Uint8Array to base58 (standard Solana signature format)\n const { base58 } = await import(\"@scure/base\");\n return base58.encode(new Uint8Array(result.signature));\n}\n","import { EcencyWalletCurrency } from \"@/modules/wallets/enums\";\nimport { sendEvmTransfer, parseToWei } from \"@/modules/wallets/utils/metamask-evm-transfer\";\nimport { sendSolTransfer } from \"@/modules/wallets/utils/metamask-sol-transfer\";\nimport { useMutation, useQueryClient } from \"@tanstack/react-query\";\n\nexport type TransferableCurrency =\n | EcencyWalletCurrency.ETH\n | EcencyWalletCurrency.BNB\n | EcencyWalletCurrency.SOL;\n\ninterface ExternalTransferPayload {\n to: string;\n amount: string;\n /** EVM only: the linked wallet address. The send is blocked if the active\n * MetaMask account does not match it (funds safety). */\n expectedFrom?: string;\n}\n\nexport function useExternalTransfer(currency: TransferableCurrency) {\n const queryClient = useQueryClient();\n\n return useMutation({\n mutationKey: [\"ecency-wallets\", \"external-transfer\", currency],\n mutationFn: async ({ to, amount, expectedFrom }: ExternalTransferPayload) => {\n switch (currency) {\n case EcencyWalletCurrency.ETH:\n case EcencyWalletCurrency.BNB: {\n const valueHex = parseToWei(amount);\n const txHash = await sendEvmTransfer(to, valueHex, currency, expectedFrom);\n return { txHash, currency };\n }\n case EcencyWalletCurrency.SOL: {\n const signature = await sendSolTransfer(to, amount);\n return { txHash: signature, currency };\n }\n }\n },\n onSuccess: () => {\n queryClient.invalidateQueries({\n queryKey: [\"ecency-wallets\", \"external-wallet-balance\"]\n });\n }\n });\n}\n","// @scure/bip39 (same @noble/@scure family as @scure/bip32 used below).\n// mnemonicToSeedSync is pure PBKDF2-HMAC-SHA512 over the mnemonic string — it\n// uses no wordlist, so this is byte-identical to bip39's output (verified\n// against BIP39 test vectors) while dropping bip39's ~164KB of 10 bundled\n// language wordlists from the app bundle.\nimport { mnemonicToSeedSync } from \"@scure/bip39\";\nimport { HDKey } from \"@scure/bip32\";\nimport { PrivateKey } from \"@ecency/sdk\";\n\nexport type HiveRole = \"owner\" | \"active\" | \"posting\" | \"memo\";\n\nconst ROLE_INDEX: Record = {\n owner: 0,\n active: 1,\n posting: 2,\n memo: 3,\n};\n\nexport function deriveHiveKey(\n mnemonic: string,\n role: HiveRole,\n accountIndex = 0\n) {\n const seed = mnemonicToSeedSync(mnemonic);\n const master = HDKey.fromMasterSeed(seed);\n const path = `m/44'/3054'/${accountIndex}'/0'/${ROLE_INDEX[role]}'`;\n const child = master.derive(path);\n if (!child.privateKey) {\n throw new Error(\"[Ecency][Wallets] - hive key derivation failed\");\n }\n const pk = PrivateKey.from(Buffer.from(child.privateKey));\n return {\n privateKey: pk.toString(),\n publicKey: pk.createPublic().toString(),\n } as const;\n}\n\nexport function deriveHiveKeys(\n mnemonic: string,\n accountIndex = 0\n) {\n const owner = deriveHiveKey(mnemonic, \"owner\", accountIndex);\n const active = deriveHiveKey(mnemonic, \"active\", accountIndex);\n const posting = deriveHiveKey(mnemonic, \"posting\", accountIndex);\n const memo = deriveHiveKey(mnemonic, \"memo\", accountIndex);\n return {\n owner: owner.privateKey,\n active: active.privateKey,\n posting: posting.privateKey,\n memo: memo.privateKey,\n ownerPubkey: owner.publicKey,\n activePubkey: active.publicKey,\n postingPubkey: posting.publicKey,\n memoPubkey: memo.publicKey,\n } as const;\n}\n\n","import { PrivateKey } from \"@ecency/sdk\";\nimport type { HiveRole } from \"./derive-hive-bip44-keys\";\n\nexport function deriveHiveMasterPasswordKey(\n username: string,\n masterPassword: string,\n role: HiveRole\n) {\n const pk = PrivateKey.fromLogin(username, masterPassword, role);\n return {\n privateKey: pk.toString(),\n publicKey: pk.createPublic().toString(),\n } as const;\n}\n\nexport function deriveHiveMasterPasswordKeys(\n username: string,\n masterPassword: string\n) {\n const owner = deriveHiveMasterPasswordKey(username, masterPassword, \"owner\");\n const active = deriveHiveMasterPasswordKey(username, masterPassword, \"active\");\n const posting = deriveHiveMasterPasswordKey(\n username,\n masterPassword,\n \"posting\"\n );\n const memo = deriveHiveMasterPasswordKey(username, masterPassword, \"memo\");\n return {\n owner: owner.privateKey,\n active: active.privateKey,\n posting: posting.privateKey,\n memo: memo.privateKey,\n ownerPubkey: owner.publicKey,\n activePubkey: active.publicKey,\n postingPubkey: posting.publicKey,\n memoPubkey: memo.publicKey,\n } as const;\n}\n","import { CONFIG, FullAccount, getAccountFullQueryOptions, PrivateKey } from \"@ecency/sdk\";\nimport { deriveHiveKeys } from \"./derive-hive-bip44-keys\";\n\nexport type HiveKeyDerivation = \"bip44\" | \"master-password\" | \"unknown\";\n\nexport async function detectHiveKeyDerivation(\n username: string,\n seed: string,\n type: \"active\" | \"owner\" = \"active\"\n): Promise {\n const uname = username.trim().toLowerCase();\n\n // ensure we actually have data\n const account = (await CONFIG.queryClient.fetchQuery(\n getAccountFullQueryOptions(uname)\n )) as FullAccount | null;\n if (!account) {\n throw new Error(\"[SDK][Wallets] – no account found for key derivation\");\n }\n\n // pick the right authority based on `type`\n const auth = account[type];\n\n // --- BIP44 check (match selected authority) ---\n // The input may be a legacy master password (or any non-mnemonic string),\n // which @scure/bip39 rejects with \"Invalid mnemonic\". The previous bip39 ran\n // PBKDF2 over any string and produced a (non-matching) seed here, so guard the\n // BIP44 probe and fall through to the master-password check on failure —\n // otherwise master-password logins/signing abort before authenticating.\n let matchBip44 = false;\n try {\n const bip44 = deriveHiveKeys(seed);\n const bip44Pub = type === \"owner\" ? bip44.ownerPubkey : bip44.activePubkey;\n matchBip44 = auth.key_auths.some(([pub]) => String(pub) === bip44Pub);\n } catch {\n // not a valid BIP39 mnemonic -> not a BIP44 seed\n }\n if (matchBip44) return \"bip44\";\n\n // --- Master password (legacy) check (match selected authority) ---\n const legacyPub = PrivateKey.fromLogin(uname, seed, type)\n .createPublic()\n .toString();\n\n const matchLegacy = auth.key_auths.some(([pub]) => String(pub) === legacyPub);\n if (matchLegacy) return \"master-password\";\n\n return \"unknown\";\n}\n","import { EcencyWalletCurrency } from \"@/modules/wallets/enums\";\n\nexport type WalletAddressMap = Partial>;\n\n/** Chain prefixes we look for in Wallet Standard accounts */\nconst CHAIN_PREFIX_MAP: Record = {\n \"solana:\": EcencyWalletCurrency.SOL,\n \"bip122:\": EcencyWalletCurrency.BTC\n};\n\nconst HIVE_SNAP_ID = \"npm:@hiveio/metamask-snap\";\n\nexport interface HivePublicKey {\n publicKey: string;\n role?: string;\n accountIndex: number;\n addressIndex: number;\n}\n\ninterface WalletStandardWallet {\n name: string;\n chains: readonly string[];\n features: Record;\n accounts: ReadonlyArray<{\n address: string;\n chains: readonly string[];\n }>;\n}\n\n/**\n * Fetch non-EVM addresses from MetaMask via the Wallet Standard protocol.\n *\n * MetaMask registers non-EVM wallets (Solana, Bitcoin) as separate Wallet Standard\n * wallets — they are NOT accessible through window.ethereum (EVM-only provider).\n */\nexport async function fetchMultichainAddresses(): Promise {\n const addresses: WalletAddressMap = {};\n\n try {\n const { getWallets } = await import(\"@wallet-standard/app\");\n const walletsApi = getWallets();\n const wallets = walletsApi.get();\n\n // Iterate ALL MetaMask wallet registrations — MetaMask may expose\n // separate entries per chain (e.g., one for Solana, one for Bitcoin)\n const mmWallets = wallets.filter(\n (w: WalletStandardWallet) =>\n w.name.toLowerCase().includes(\"metamask\") &&\n w.features[\"standard:connect\"]\n ) as WalletStandardWallet[];\n\n for (const mmWallet of mmWallets) {\n try {\n const connectFeature = mmWallet.features[\"standard:connect\"] as\n { connect: () => Promise };\n await connectFeature.connect();\n } catch (connectErr) {\n if (process.env.NODE_ENV === \"development\") {\n console.log(\"[MetaMask multichain] wallet connect failed, trying next:\", connectErr);\n }\n continue;\n }\n\n for (const account of mmWallet.accounts ?? []) {\n if (!account.address || !Array.isArray(account.chains)) continue;\n\n for (const [prefix, currency] of Object.entries(CHAIN_PREFIX_MAP)) {\n if (addresses[currency]) continue;\n if (account.chains.some((c: string) => c.startsWith(prefix))) {\n addresses[currency] = account.address;\n }\n }\n }\n }\n } catch (e) {\n if (process.env.NODE_ENV === \"development\") {\n console.log(\"[MetaMask multichain] wallet standard discovery failed:\", e);\n }\n }\n\n return addresses;\n}\n\n/**\n * Fetch the EVM address from MetaMask via window.ethereum.\n * Returns the first connected account address, or undefined on failure.\n */\nexport async function fetchEvmAddress(): Promise {\n if (typeof window === \"undefined\" || !window.ethereum?.isMetaMask) return undefined;\n\n try {\n const accounts = await window.ethereum.request({\n method: \"eth_requestAccounts\"\n }) as string[] | undefined;\n\n return accounts?.[0] ?? undefined;\n } catch {\n return undefined;\n }\n}\n\n/**\n * Discover all wallet addresses from MetaMask (EVM + non-EVM).\n * Returns a map of currency -> address. Partial results are returned on failure.\n */\nexport async function discoverMetaMaskWallets(): Promise {\n const addresses: WalletAddressMap = {};\n\n // EVM address (shared for ETH + BNB)\n const evmAddress = await fetchEvmAddress();\n if (evmAddress) {\n addresses[EcencyWalletCurrency.ETH] = evmAddress;\n addresses[EcencyWalletCurrency.BNB] = evmAddress;\n }\n\n // Non-EVM addresses via Wallet Standard\n const multichainAddresses = await fetchMultichainAddresses();\n Object.assign(addresses, multichainAddresses);\n\n return addresses;\n}\n\n/**\n * Install the Hive Snap in MetaMask.\n */\nexport async function installHiveSnap(): Promise {\n if (typeof window === \"undefined\" || !window.ethereum) {\n throw new Error(\"MetaMask is not available\");\n }\n await window.ethereum.request({\n method: \"wallet_requestSnaps\",\n params: { [HIVE_SNAP_ID]: {} }\n });\n}\n\n/**\n * Get Hive public keys from the MetaMask Hive Snap.\n * Returns owner, active, posting, and memo public keys.\n */\nexport async function getHivePublicKeys(): Promise {\n if (typeof window === \"undefined\" || !window.ethereum) {\n throw new Error(\"MetaMask is not available\");\n }\n\n const result = await window.ethereum.request({\n method: \"wallet_invokeSnap\",\n params: {\n snapId: HIVE_SNAP_ID,\n request: {\n method: \"hive_getPublicKeys\",\n params: {\n keys: [\n { role: \"owner\", accountIndex: 0 },\n { role: \"active\", accountIndex: 0 },\n { role: \"posting\", accountIndex: 0 },\n { role: \"memo\", accountIndex: 0 }\n ]\n }\n }\n }\n }) as { publicKeys?: unknown } | undefined;\n\n const keys = result?.publicKeys;\n if (!Array.isArray(keys)) {\n throw new Error(\"Hive Snap returned invalid response — expected publicKeys array\");\n }\n\n return keys as HivePublicKey[];\n}\n","import { rememberScryptBsvVersion } from \"./internal/scrypt-guard\";\n\nrememberScryptBsvVersion();\n\nexport * from \"./modules/wallets\";\nexport * from \"./modules/assets\";\n"]} \ No newline at end of file +{"version":3,"sources":["../../src/internal/scrypt-guard.ts","../../src/modules/wallets/enums/ecency-wallet-currency.ts","../../src/modules/wallets/enums/ecency-wallet-basic-tokens.ts","../../src/modules/wallets/mutations/private-api/index.ts","../../src/modules/wallets/utils/get-bound-fetch.ts","../../src/modules/wallets/mutations/private-api/create-account-with-wallets.ts","../../src/modules/wallets/mutations/private-api/check-wallet-existence.ts","../../src/modules/wallets/mutations/private-api/update-account-with-wallets.ts","../../src/modules/wallets/queries/use-get-external-wallet-query.ts","../../src/modules/wallets/queries/get-token-price-query-options.ts","../../src/modules/wallets/queries/get-all-tokens-list-query-options.ts","../../src/modules/wallets/queries/use-get-account-wallet-list-query.ts","../../src/modules/wallets/queries/get-tokens-operations-query-options.ts","../../src/modules/wallets/mutations/save-wallet-information-to-metadata.ts","../../src/modules/wallets/utils/metamask-evm-transfer.ts","../../src/modules/wallets/utils/metamask-sol-transfer.ts","../../src/modules/wallets/mutations/use-external-transfer.ts","../../src/modules/wallets/utils/derive-hive-bip44-keys.ts","../../src/modules/wallets/utils/derive-hive-master-password-keys.ts","../../src/modules/wallets/utils/detect-hive-key-derivation.ts","../../src/modules/wallets/utils/metamask-discovery.ts","../../src/index.ts"],"names":["EcencyWalletCurrency","EcencyWalletBasicTokens","useMutation","ConfigManager","queryOptions","getQueryClient","getPortfolioQueryOptions","options","useQuery","getAccountFullQueryOptions","AMOUNT_REGEX","useQueryClient","PrivateKey"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * The scrypt bsv package writes the version string to a global symbol and\n * warns when that symbol is already populated. In environments that reload\n * modules (Next.js dev server, Storybook, etc.) the stale value triggers\n * repeated warnings. Clearing the cached handle before our modules touch bsv\n * keeps the console quiet without requiring downstream wrappers.\n *\n * Similarly, bitcore-lib and bitcore-lib-inquisition check for duplicate instances\n * using global variables and throw errors when detected. We clear these globals\n * to prevent false positives in module reloading scenarios.\n */\nconst globalLike = globalThis as Record & {\n _scrypt_bsv?: unknown;\n __scryptBsvPreviousVersion?: unknown;\n _bitcore?: unknown;\n __bitcorePreviousVersion?: unknown;\n};\n\nif (typeof globalLike._scrypt_bsv !== \"undefined\") {\n if (typeof globalLike._scrypt_bsv === \"string\") {\n globalLike.__scryptBsvPreviousVersion = globalLike._scrypt_bsv;\n }\n\n try {\n delete globalLike._scrypt_bsv;\n } catch {\n globalLike._scrypt_bsv = undefined;\n }\n}\n\n// Clear bitcore-lib global to prevent \"more than one instance\" errors\nif (typeof globalLike._bitcore !== \"undefined\") {\n if (typeof globalLike._bitcore === \"object\") {\n globalLike.__bitcorePreviousVersion = globalLike._bitcore;\n }\n\n try {\n delete globalLike._bitcore;\n } catch {\n globalLike._bitcore = undefined;\n }\n}\n\nexport function rememberScryptBsvVersion() {\n if (typeof globalLike._scrypt_bsv === \"string\") {\n globalLike.__scryptBsvPreviousVersion = globalLike._scrypt_bsv;\n }\n\n // Also remember bitcore version if it exists\n if (typeof globalLike._bitcore === \"object\") {\n globalLike.__bitcorePreviousVersion = globalLike._bitcore;\n }\n}\n","export enum EcencyWalletCurrency {\n BTC = \"BTC\",\n ETH = \"ETH\",\n BNB = \"BNB\",\n SOL = \"SOL\",\n}\n","export enum EcencyWalletBasicTokens {\n Points = \"POINTS\",\n HivePower = \"HP\",\n Hive = \"HIVE\",\n HiveDollar = \"HBD\"\n}\n","export * from \"./create-account-with-wallets\";\nexport * from \"./check-wallet-existence\";\nexport * from \"./update-account-with-wallets\";\n","let cachedFetch: typeof globalThis.fetch | undefined;\n\nexport function getBoundFetch() {\n if (!cachedFetch) {\n if (typeof globalThis.fetch !== \"function\") {\n throw new Error(\"[Ecency][Wallets] - global fetch is not available\");\n }\n\n cachedFetch = globalThis.fetch.bind(globalThis);\n }\n\n return cachedFetch;\n}\n","import { ConfigManager } from \"@ecency/sdk\";\nimport { EcencyWalletCurrency } from \"@/modules/wallets/enums\";\nimport { getBoundFetch } from \"@/modules/wallets/utils/get-bound-fetch\";\nimport { useMutation } from \"@tanstack/react-query\";\n\ninterface HiveKeys {\n ownerPublicKey?: string;\n activePublicKey?: string;\n postingPublicKey?: string;\n memoPublicKey?: string;\n}\n\ninterface Payload {\n currency: EcencyWalletCurrency;\n address: string;\n hiveKeys?: HiveKeys;\n walletAddresses?: Partial>;\n}\n\nexport function useCreateAccountWithWallets(username: string) {\n const fetchApi = getBoundFetch();\n\n return useMutation({\n mutationKey: [\"ecency-wallets\", \"create-account-with-wallets\", username],\n mutationFn: async ({ currency, address, hiveKeys, walletAddresses }: Payload) => {\n const addresses: Record = {};\n if (walletAddresses) {\n for (const [k, v] of Object.entries(walletAddresses)) {\n if (v) addresses[k] = v;\n }\n }\n\n const response = await fetchApi(`${ConfigManager.getValidatedBaseUrl()}/private-api/wallets-add`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n username,\n token: currency,\n address,\n meta: {\n ...hiveKeys,\n ...addresses,\n [currency]: address\n },\n }),\n });\n\n if (!response.ok) {\n throw new Error(`Account creation failed (${response.status})`);\n }\n\n return response;\n },\n });\n}\n","import { ConfigManager } from \"@ecency/sdk\";\nimport { EcencyWalletCurrency } from \"@/modules/wallets/enums\";\nimport { useMutation } from \"@tanstack/react-query\";\n\ninterface Payload {\n address: string;\n currency: EcencyWalletCurrency;\n}\n\nexport function useCheckWalletExistence() {\n return useMutation({\n mutationKey: [\"ecency-wallets\", \"check-wallet-existence\"],\n mutationFn: async ({ address, currency }: Payload) => {\n const response = await fetch(\n `${ConfigManager.getValidatedBaseUrl()}/private-api/wallets-exist`,\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n address,\n token: currency,\n }),\n }\n );\n const data = await response.json();\n return data.length === 0;\n },\n });\n}\n","import { ConfigManager } from \"@ecency/sdk\";\nimport { useMutation } from \"@tanstack/react-query\";\nimport { getBoundFetch } from \"@/modules/wallets/utils/get-bound-fetch\";\n\ninterface Payload {\n tokens: Record;\n hiveKeys: {\n ownerPublicKey: string;\n activePublicKey: string;\n postingPublicKey: string;\n memoPublicKey: string;\n };\n}\n\nexport function useUpdateAccountWithWallets(\n username: string,\n accessToken: string | undefined\n) {\n const fetchApi = getBoundFetch();\n\n return useMutation({\n mutationKey: [\"ecency-wallets\", \"update-account-with-wallets\", username],\n mutationFn: async ({ tokens, hiveKeys }: Payload) => {\n const entries = Object.entries(tokens).filter(([, address]) => Boolean(address));\n\n if (entries.length === 0) {\n return new Response(null, { status: 204 });\n }\n\n const [primaryToken, primaryAddress] = entries[0] ?? [\"\", \"\"];\n\n if (!accessToken) {\n throw new Error(\n \"[SDK][Wallets][PrivateApi][WalletsAdd] – access token wasn`t found\"\n );\n }\n\n const response = await fetchApi(`${ConfigManager.getValidatedBaseUrl()}/private-api/wallets-add`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n username,\n code: accessToken,\n token: primaryToken,\n address: primaryAddress,\n status: 3,\n meta: {\n ...Object.fromEntries(entries),\n ownerPublicKey: hiveKeys.ownerPublicKey,\n activePublicKey: hiveKeys.activePublicKey,\n postingPublicKey: hiveKeys.postingPublicKey,\n memoPublicKey: hiveKeys.memoPublicKey,\n },\n }),\n });\n\n // Raw fetch resolves on 4xx/5xx; guard so a failed wallet-add doesn't run\n // onSuccess as if the account had been updated.\n if (!response.ok) {\n throw new Error(\n `[SDK][Wallets][PrivateApi][WalletsAdd] – request failed: ${response.status}`\n );\n }\n\n return response;\n },\n });\n}\n","import { EcencyWalletCurrency } from \"@/modules/wallets/enums\";\nimport { ConfigManager } from \"@ecency/sdk\";\nimport { useQuery } from \"@tanstack/react-query\";\n\nconst currencyChainMap: Record = {\n [EcencyWalletCurrency.BTC]: \"btc\",\n [EcencyWalletCurrency.ETH]: \"eth\",\n [EcencyWalletCurrency.BNB]: \"bnb\",\n [EcencyWalletCurrency.SOL]: \"sol\",\n};\n\ninterface PrivateApiBalanceResponse {\n chain: string;\n balance: number | string;\n unit: string;\n raw?: unknown;\n nodeId?: string;\n}\n\nexport interface ExternalWalletBalance {\n chain: string;\n unit: string;\n raw?: unknown;\n nodeId?: string;\n /**\n * Balance represented as a BigInt for convenience.\n */\n balanceBigInt: bigint;\n /**\n * Balance returned as a string to preserve precision for UIs that cannot\n * handle bigint values directly.\n */\n balanceString: string;\n}\n\nfunction normalizeBalance(balance: number | string): string {\n if (typeof balance === \"number\") {\n if (!Number.isFinite(balance)) {\n throw new Error(\"Private API returned a non-finite numeric balance\");\n }\n\n return Math.trunc(balance).toString();\n }\n\n if (typeof balance === \"string\") {\n const trimmed = balance.trim();\n\n if (trimmed === \"\") {\n throw new Error(\"Private API returned an empty balance string\");\n }\n\n return trimmed;\n }\n\n throw new Error(\"Private API returned balance in an unexpected format\");\n}\n\nfunction parsePrivateApiBalance(\n result: unknown,\n expectedChain: string\n): ExternalWalletBalance {\n if (!result || typeof result !== \"object\") {\n throw new Error(\"Private API returned an unexpected response\");\n }\n\n const { chain, balance, unit, raw, nodeId } =\n result as PrivateApiBalanceResponse;\n\n if (typeof chain !== \"string\" || chain !== expectedChain) {\n throw new Error(\"Private API response chain did not match request\");\n }\n\n if (typeof unit !== \"string\" || unit.length === 0) {\n throw new Error(\"Private API response is missing unit information\");\n }\n\n if (balance === undefined || balance === null) {\n throw new Error(\"Private API response is missing balance information\");\n }\n\n const balanceString = normalizeBalance(balance);\n\n let balanceBigInt: bigint;\n\n try {\n balanceBigInt = BigInt(balanceString);\n } catch (error) {\n throw new Error(\"Private API returned a balance that is not an integer\");\n }\n\n return {\n chain,\n unit,\n raw,\n nodeId:\n typeof nodeId === \"string\" && nodeId.length > 0 ? nodeId : undefined,\n balanceBigInt,\n balanceString,\n };\n}\n\nexport function useGetExternalWalletBalanceQuery(\n currency: EcencyWalletCurrency,\n address: string\n) {\n return useQuery({\n queryKey: [\"ecency-wallets\", \"external-wallet-balance\", currency, address],\n queryFn: async () => {\n const chain = currencyChainMap[currency];\n\n if (!chain) {\n throw new Error(`Unsupported currency ${currency}`);\n }\n\n const baseUrl = `${ConfigManager.getValidatedBaseUrl()}/private-api/balance/${chain}/${encodeURIComponent(\n address\n )}`;\n\n let primaryResponse: Response | undefined;\n let primaryError: unknown;\n\n try {\n primaryResponse = await fetch(baseUrl);\n } catch (error) {\n primaryError = error;\n }\n\n let response = primaryResponse;\n\n if (!response || !response.ok) {\n const fallbackUrl = `${baseUrl}?provider=chainz`;\n let fallbackError: unknown;\n\n try {\n const fallbackResponse = await fetch(fallbackUrl);\n\n if (fallbackResponse.ok) {\n response = fallbackResponse;\n } else {\n fallbackError = new Error(\n `Fallback provider responded with status ${fallbackResponse.status}`\n );\n }\n } catch (error) {\n fallbackError = error;\n }\n\n if (!response || !response.ok) {\n const failureReasons: string[] = [];\n\n if (primaryError) {\n const message =\n primaryError instanceof Error\n ? primaryError.message\n : String(primaryError);\n failureReasons.push(`primary provider failed: ${message}`);\n } else if (primaryResponse && !primaryResponse.ok) {\n failureReasons.push(\n `primary provider status ${primaryResponse.status}`\n );\n }\n\n if (fallbackError) {\n const message =\n fallbackError instanceof Error\n ? fallbackError.message\n : String(fallbackError);\n failureReasons.push(`fallback provider failed: ${message}`);\n }\n\n if (failureReasons.length === 0) {\n failureReasons.push(\"unknown error\");\n }\n\n throw new Error(\n `Private API request failed (${failureReasons.join(\", \")})`\n );\n }\n }\n\n const result = (await response.json()) as unknown;\n\n return parsePrivateApiBalance(result, chain);\n },\n });\n}\n","import { ConfigManager } from \"@ecency/sdk\";\nimport { EcencyWalletCurrency } from \"@/modules/wallets/enums\";\nimport { queryOptions } from \"@tanstack/react-query\";\nimport { LRUCache } from \"lru-cache\";\n\nconst options = {\n max: 500,\n // how long to live in ms\n ttl: 1000 * 60 * 5,\n // return stale items before removing from cache?\n allowStale: false,\n updateAgeOnGet: false,\n updateAgeOnHas: false,\n};\n\nconst cache = new LRUCache(options);\nconst undefinedValue = Symbol(\"undefined\");\n\nconst cacheSet = (key: string, value: any) =>\n cache.set(key, value === undefined ? undefinedValue : value);\n\nconst cacheGet = (key: string) => {\n const v = cache.get(key);\n return v === undefinedValue ? undefined : v;\n};\n\ninterface MarketDataQuote {\n last_updated: string;\n percent_change: number;\n price: number;\n}\n\ninterface MarketDataLatestResponse {\n [token: string]: {\n quotes?: {\n usd?: MarketDataQuote;\n btc?: MarketDataQuote;\n [fiat: string]: MarketDataQuote | undefined;\n };\n };\n}\n\nconst CURRENCY_TO_TOKEN_MAP: Record = {\n [EcencyWalletCurrency.BTC]: \"btc\",\n [EcencyWalletCurrency.ETH]: \"eth\",\n [EcencyWalletCurrency.SOL]: \"sol\",\n [EcencyWalletCurrency.BNB]: \"bnb\",\n HBD: \"hbd\",\n HIVE: \"hive\",\n};\n\nconst MARKET_DATA_CACHE_KEY = \"market-data/latest\";\n\nconst normalizeCurrencyToToken = (currency: string) => {\n const upperCased = currency.toUpperCase();\n return CURRENCY_TO_TOKEN_MAP[upperCased] ?? currency.toLowerCase();\n};\n\nexport function getTokenPriceQueryOptions(currency?: string) {\n return queryOptions({\n queryKey: [\"ecency-wallets\", \"market-data\", currency],\n queryFn: async () => {\n if (!currency) {\n throw new Error(\n \"[SDK][Wallets][MarketData] – currency wasn`t provided\"\n );\n }\n\n const token = normalizeCurrencyToToken(currency);\n const baseUrl = ConfigManager.getValidatedBaseUrl();\n\n let marketData = cacheGet(MARKET_DATA_CACHE_KEY) as\n | MarketDataLatestResponse\n | undefined;\n\n if (!marketData) {\n const httpResponse = await fetch(\n `${baseUrl}/private-api/market-data/latest`,\n {\n method: \"GET\",\n }\n );\n\n if (!httpResponse.ok) {\n throw new Error(\n `[SDK][Wallets][MarketData] – failed to fetch latest market data (${httpResponse.status})`\n );\n }\n\n const data = (await httpResponse.json()) as MarketDataLatestResponse;\n cacheSet(MARKET_DATA_CACHE_KEY, data);\n marketData = data;\n }\n\n const tokenData = marketData[token];\n\n if (!tokenData) {\n throw new Error(\n `[SDK][Wallets][MarketData] – missing market data for token: ${token}`\n );\n }\n\n const usdQuote = tokenData.quotes?.usd;\n\n if (!usdQuote) {\n throw new Error(\n `[SDK][Wallets][MarketData] – missing USD quote for token: ${token}`\n );\n }\n\n return Number(usdQuote.price);\n },\n enabled: !!currency,\n });\n}\n","import {\n getHiveEngineTokensBalancesQueryOptions,\n getHiveEngineTokensMetadataQueryOptions,\n} from \"@/modules/assets\";\nimport {\n HiveEngineTokenBalance,\n HiveEngineTokenMetadataResponse,\n} from \"@/modules/assets/hive-engine/types\";\nimport { getQueryClient } from \"@ecency/sdk\";\nimport { queryOptions } from \"@tanstack/react-query\";\nimport { EcencyWalletBasicTokens, EcencyWalletCurrency } from \"../enums\";\n\nfunction createFallbackTokenMetadata(symbol: string): HiveEngineTokenMetadataResponse {\n return {\n issuer: \"\",\n symbol,\n name: symbol,\n metadata: \"{}\",\n precision: 0,\n maxSupply: \"0\",\n supply: \"0\",\n circulatingSupply: \"0\",\n stakingEnabled: false,\n unstakingCooldown: 0,\n delegationEnabled: false,\n undelegationCooldown: 0,\n numberTransactions: 0,\n totalStaked: \"0\",\n };\n}\n\nasync function getLayer2TokensMetadata(username?: string) {\n if (!username) {\n return [] as HiveEngineTokenMetadataResponse[];\n }\n\n let balances: HiveEngineTokenBalance[] = [];\n\n try {\n balances = await getQueryClient().fetchQuery(\n getHiveEngineTokensBalancesQueryOptions(username)\n );\n } catch {\n balances = [];\n }\n\n const uniqueSymbols = Array.from(\n new Set(\n balances\n .map((balance) => balance.symbol)\n .filter((symbol): symbol is string => Boolean(symbol))\n )\n );\n\n if (uniqueSymbols.length === 0) {\n return [] as HiveEngineTokenMetadataResponse[];\n }\n\n let metadataList: HiveEngineTokenMetadataResponse[] = [];\n\n try {\n metadataList = await getQueryClient().fetchQuery(\n getHiveEngineTokensMetadataQueryOptions(uniqueSymbols)\n );\n } catch {\n metadataList = [];\n }\n\n const metadataBySymbol = new Map(\n metadataList.map((token) => [token.symbol, token])\n );\n\n return uniqueSymbols.map(\n (symbol) => metadataBySymbol.get(symbol) ?? createFallbackTokenMetadata(symbol)\n );\n}\n\nexport function getAllTokensListQueryOptions(username?: string) {\n return queryOptions({\n queryKey: [\"ecency-wallets\", \"all-tokens-list\", username ?? null],\n queryFn: async () => {\n return {\n basic: [\n EcencyWalletBasicTokens.Points,\n EcencyWalletBasicTokens.Hive,\n EcencyWalletBasicTokens.HivePower,\n EcencyWalletBasicTokens.HiveDollar,\n ],\n external: Object.values(EcencyWalletCurrency),\n layer2: await getLayer2TokensMetadata(username),\n };\n },\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { EcencyWalletBasicTokens } from \"../enums\";\nimport {\n AccountProfile,\n FullAccount,\n getAccountFullQueryOptions,\n getQueryClient,\n getPortfolioQueryOptions,\n type PortfolioResponse,\n type PortfolioWalletItem,\n} from \"@ecency/sdk\";\n\ntype ProfileTokens = AccountProfile[\"tokens\"];\ntype ProfileToken = NonNullable[number];\n\nfunction normalizeAccountTokens(tokens: ProfileTokens): ProfileToken[] {\n if (Array.isArray(tokens)) {\n return tokens.filter(Boolean) as ProfileToken[];\n }\n\n if (tokens && typeof tokens === \"object\") {\n return Object.values(tokens).flatMap((value) =>\n Array.isArray(value) ? (value.filter(Boolean) as ProfileToken[]) : []\n );\n }\n\n return [];\n}\n\nconst BASIC_TOKENS: string[] = [\n EcencyWalletBasicTokens.Points,\n EcencyWalletBasicTokens.Hive,\n EcencyWalletBasicTokens.HivePower,\n EcencyWalletBasicTokens.HiveDollar,\n];\n\n// Tokens whose support has been removed. Stale profile.tokens entries and\n// portfolio responses may still reference them, so they are always hidden.\nconst REMOVED_TOKENS = new Set([\"SPK\", \"LARYNX\", \"LP\", \"BROCA\"]);\n\nexport function getAccountWalletListQueryOptions(username: string, currency: string = \"usd\") {\n return queryOptions({\n queryKey: [\"ecency-wallets\", \"list\", username, currency],\n enabled: !!username,\n queryFn: async () => {\n const portfolioQuery = getPortfolioQueryOptions(username, currency, true);\n const queryClient = getQueryClient();\n const accountQuery = getAccountFullQueryOptions(username);\n\n let account: FullAccount | undefined;\n\n try {\n account = (await queryClient.fetchQuery(accountQuery)) ?? undefined;\n } catch {\n // Best effort; fall back to defaults if account metadata is not available.\n }\n\n const tokenVisibility = new Map();\n\n const accountTokens = normalizeAccountTokens(account?.profile?.tokens);\n\n accountTokens.forEach((token: ProfileToken) => {\n const symbol = token.symbol?.toUpperCase?.();\n\n if (!symbol) {\n return;\n }\n\n const showValue = (token as any)?.meta?.show;\n\n if (typeof showValue === \"boolean\") {\n tokenVisibility.set(symbol, showValue);\n }\n });\n\n const isTokenVisible = (symbol?: string) => {\n const normalized = symbol?.toUpperCase();\n\n if (!normalized) {\n return false;\n }\n\n if (REMOVED_TOKENS.has(normalized)) {\n return false;\n }\n\n if (BASIC_TOKENS.includes(normalized)) {\n return true;\n }\n\n return tokenVisibility.get(normalized) === true;\n };\n\n try {\n const portfolio: PortfolioResponse = await queryClient.fetchQuery(portfolioQuery);\n const tokensFromPortfolio: string[] = portfolio.wallets.map(\n (asset: PortfolioWalletItem) => asset.symbol\n );\n\n if (tokensFromPortfolio.length > 0) {\n const visibleTokens = tokensFromPortfolio\n .map((token: string) => token?.toUpperCase?.())\n .filter((token: string | undefined): token is string => Boolean(token))\n .filter(isTokenVisible);\n\n if (visibleTokens.length > 0) {\n // Always include basic tokens (HP, HIVE, HBD, POINTS) even if\n // the portfolio API omits them from its response.\n return Array.from(new Set([...BASIC_TOKENS, ...visibleTokens]));\n }\n }\n } catch {\n // Fallback to legacy behaviour when the portfolio endpoint is not accessible.\n }\n\n if (accountTokens.length > 0) {\n const list = [\n ...BASIC_TOKENS,\n ...accountTokens\n .map((token: ProfileToken) => token.symbol)\n .filter(isTokenVisible),\n ];\n\n return Array.from(new Set(list).values());\n }\n\n return [...BASIC_TOKENS];\n },\n });\n}\n","import { AssetOperation } from \"@/modules/assets\";\nimport {\n getQueryClient,\n getPortfolioQueryOptions,\n type PortfolioResponse,\n type PortfolioWalletItem,\n} from \"@ecency/sdk\";\nimport { queryOptions } from \"@tanstack/react-query\";\n\nexport function getTokenOperationsQueryOptions(\n token: string,\n username: string,\n isForOwner = false,\n currency: string = \"usd\"\n) {\n return queryOptions({\n queryKey: [\"wallets\", \"token-operations\", token, username, isForOwner, currency],\n queryFn: async () => {\n const queryClient = getQueryClient();\n const normalizedToken = token.toUpperCase();\n\n if (!username || !isForOwner) {\n return [] as AssetOperation[];\n }\n\n try {\n const portfolio: PortfolioResponse = await queryClient.fetchQuery(\n getPortfolioQueryOptions(username, currency, true)\n );\n const assetEntry = portfolio.wallets.find(\n (assetItem: PortfolioWalletItem) => assetItem.symbol.toUpperCase() === normalizedToken\n );\n\n if (!assetEntry) {\n return [] as AssetOperation[];\n }\n\n // Extract action IDs and map to AssetOperation enums\n const rawActions: Array<{ id: string; [key: string]: unknown }> = assetEntry.actions ?? [];\n const operations: AssetOperation[] = rawActions\n .map((action: { id: string; [key: string]: unknown } | string) => {\n // Extract the id field from action object\n if (typeof action === \"string\") return action;\n if (action && typeof action === \"object\") {\n const record = action as Record;\n return (record.id ?? record.code ?? record.name ?? record.action) as string | undefined;\n }\n return undefined;\n })\n .filter((id: string | undefined): id is string => Boolean(id))\n .map((id: string) => {\n // Normalize: underscores to hyphens, lowercase\n const canonical = id.trim().toLowerCase().replace(/[\\s_]+/g, \"-\");\n\n // Primary mapping: API action IDs to AssetOperation enum values\n const aliasMap: Record = {\n // Common operations\n \"transfer\": AssetOperation.Transfer,\n \"ecency-point-transfer\": AssetOperation.Transfer,\n\n // Savings operations\n \"transfer-to-savings\": AssetOperation.TransferToSavings,\n \"transfer-savings\": AssetOperation.TransferToSavings,\n \"savings-transfer\": AssetOperation.TransferToSavings,\n \"withdraw-from-savings\": AssetOperation.WithdrawFromSavings,\n \"transfer-from-savings\": AssetOperation.WithdrawFromSavings,\n \"withdraw-savings\": AssetOperation.WithdrawFromSavings,\n \"savings-withdraw\": AssetOperation.WithdrawFromSavings,\n\n // Vesting/Power operations\n \"transfer-to-vesting\": AssetOperation.PowerUp,\n \"powerup\": AssetOperation.PowerUp,\n \"power-up\": AssetOperation.PowerUp,\n \"withdraw-vesting\": AssetOperation.PowerDown,\n \"power-down\": AssetOperation.PowerDown,\n \"powerdown\": AssetOperation.PowerDown,\n\n // Delegation\n \"delegate\": AssetOperation.Delegate,\n \"delegate-vesting-shares\": AssetOperation.Delegate,\n \"hp-delegate\": AssetOperation.Delegate,\n \"delegate-hp\": AssetOperation.Delegate,\n \"delegate-power\": AssetOperation.Delegate,\n \"undelegate\": AssetOperation.Undelegate,\n \"undelegate-power\": AssetOperation.Undelegate,\n \"undelegate-token\": AssetOperation.Undelegate,\n\n // Staking (Layer 2)\n \"stake\": AssetOperation.Stake,\n \"stake-token\": AssetOperation.Stake,\n \"stake-power\": AssetOperation.Stake,\n \"unstake\": AssetOperation.Unstake,\n \"unstake-token\": AssetOperation.Unstake,\n \"unstake-power\": AssetOperation.Unstake,\n\n // Swap/Convert\n \"swap\": AssetOperation.Swap,\n \"swap-token\": AssetOperation.Swap,\n \"swap-tokens\": AssetOperation.Swap,\n \"convert\": AssetOperation.Convert,\n\n // Points operations\n \"promote\": AssetOperation.Promote,\n \"promote-post\": AssetOperation.Promote,\n \"promote-entry\": AssetOperation.Promote,\n \"boost\": AssetOperation.Promote,\n \"gift\": AssetOperation.Gift,\n \"gift-points\": AssetOperation.Gift,\n \"points-gift\": AssetOperation.Gift,\n \"claim\": AssetOperation.Claim,\n \"claim-rewards\": AssetOperation.Claim,\n \"claim-points\": AssetOperation.Claim,\n \"buy\": AssetOperation.Buy,\n \"buy-points\": AssetOperation.Buy,\n\n // Other\n \"claim-interest\": AssetOperation.ClaimInterest,\n // Chain operation name, as emitted in the HP action list. The two\n // slug spellings below predate it and stay as a fallback.\n \"set-withdraw-vesting-route\": AssetOperation.WithdrawRoutes,\n \"withdraw-routes\": AssetOperation.WithdrawRoutes,\n \"withdrawroutes\": AssetOperation.WithdrawRoutes,\n };\n\n // Check alias map first (primary method)\n const mapped = aliasMap[canonical];\n if (mapped) return mapped;\n\n // Fallback: try direct enum value match (for exact matches like \"transfer\", \"promote\")\n const directMatch = Object.values(AssetOperation).find(\n (op) => op.toLowerCase() === canonical\n );\n return directMatch;\n })\n .filter((op: AssetOperation | undefined): op is AssetOperation => Boolean(op))\n // Remove duplicates - API may return multiple actions that map to same operation\n .filter((op: AssetOperation, index: number, self: AssetOperation[]) => self.indexOf(op) === index);\n\n const isHiveOrHbd = [\"HIVE\", \"HBD\"].includes(normalizedToken);\n // Check if there's a non-zero savings balance\n const rawToken = assetEntry as any;\n const hasSavings = Number(rawToken.savings ?? 0) > 0;\n\n if (\n isHiveOrHbd &&\n !hasSavings\n ) {\n return operations.filter(\n (operation) => operation !== AssetOperation.WithdrawFromSavings\n );\n }\n\n return operations;\n } catch {\n return [];\n }\n },\n });\n}\n","import {\n AccountProfile,\n getAccountFullQueryOptions,\n useAccountUpdate,\n type AuthContext,\n} from \"@ecency/sdk\";\nimport {\n useMutation,\n useQuery,\n useQueryClient,\n type UseMutationOptions,\n} from \"@tanstack/react-query\";\nimport { EcencyTokenMetadata } from \"../types\";\nimport * as R from \"remeda\";\nimport { getAccountWalletListQueryOptions } from \"../queries\";\nimport { EcencyWalletCurrency } from \"../enums\";\n\n/**\n * A CHAIN-layer entry (external wallet address). Everything else in\n * `profile.tokens` — Hive-Engine (`ENGINE`) and the basic Hive assets (`HIVE`) —\n * is managed by the wallet token picker, not by the external-wallet screens.\n */\nconst isChainToken = ({\n type,\n symbol,\n}: NonNullable[number]) =>\n type === \"CHAIN\" ||\n Object.values(EcencyWalletCurrency).includes(symbol as any);\n\nfunction getGroupedChainTokens(\n tokens?: AccountProfile[\"tokens\"],\n defaultShow?: boolean\n) {\n if (!tokens) {\n return {};\n }\n\n return R.pipe(\n tokens,\n R.filter(isChainToken),\n R.map((item) => {\n const meta = {\n ...(item.meta ?? {}),\n } as Record;\n\n if (typeof meta.show !== \"boolean\" && typeof defaultShow === \"boolean\") {\n meta.show = defaultShow;\n }\n\n return {\n ...item,\n meta,\n };\n }),\n // Chain tokens are unique by symbol, so indexing by symbol\n // gives a direct lookup map instead of an array-based grouping.\n R.indexBy(\n (item: NonNullable[number]) => item.symbol\n )\n );\n}\n\n/**\n * Assemble the `profile.tokens` array to broadcast.\n *\n * `profile.tokens` is written wholesale, so whatever this returns IS the user's\n * new on-chain token list — anything omitted is deleted, and since no app other\n * than Ecency writes this field, the deletion is unrecoverable.\n *\n * Which entries survive depends on what the caller manages, inferred from the\n * payload itself:\n *\n * - A payload carrying non-chain entries comes from the wallet token picker,\n * which owns the COMPLETE list — it always sends the basic Hive assets plus\n * every selected engine token, and deselecting one means omitting it. Unlisted\n * entries are therefore dropped, which is what the user asked for.\n * - A CHAIN-only payload comes from the external-wallet screens, which know\n * nothing about engine tokens. Their unlisted entries are carried forward.\n *\n * Inferring rather than taking a flag keeps this fix inside the package (the\n * apps resolve it through the committed dist, so a new public option could not\n * be used by a caller until the next release). It is also safe in the degenerate\n * case: if the picker somehow submits before its token list has loaded, the\n * payload is chain-only and we preserve — the non-destructive outcome.\n *\n * @param existingTokens the account's current on-chain `profile.tokens`\n * @param tokens the caller's payload\n */\nexport function buildTokensPayload(\n existingTokens: AccountProfile[\"tokens\"],\n tokens: EcencyTokenMetadata[]\n): AccountProfile[\"tokens\"] {\n // Chain type tokens couldn't be deleted entirely from the profile list,\n // then visibility should be controlling using meta.show field\n const profileChainTokens = getGroupedChainTokens(existingTokens);\n\n const payloadTokens =\n (tokens.map(({ currency, type, privateKey, username, ...meta }) => ({\n symbol: currency!,\n type:\n type ??\n (Object.values(EcencyWalletCurrency).includes(currency as any)\n ? \"CHAIN\"\n : undefined),\n meta,\n })) as AccountProfile[\"tokens\"]) ?? [];\n\n const payloadChainTokens = getGroupedChainTokens(payloadTokens, true);\n const payloadNonChainTokens = (payloadTokens ?? []).filter(\n (token) => !isChainToken(token)\n );\n\n const mergedChainTokens = R.pipe(\n profileChainTokens,\n R.mergeDeep(payloadChainTokens),\n R.values()\n );\n\n // Carry forward the on-chain entries this caller does not manage. Without it,\n // saving external wallet addresses (a CHAIN-only payload) rewrites\n // `profile.tokens` to chain entries alone and silently deletes every\n // Hive-Engine token the user selected.\n const managesNonChainTokens = payloadNonChainTokens.length > 0;\n const payloadSymbols = new Set(\n (payloadTokens ?? []).map(({ symbol }) => symbol)\n );\n const preservedTokens = managesNonChainTokens\n ? []\n : (existingTokens ?? []).filter(\n (token) => !isChainToken(token) && !payloadSymbols.has(token.symbol)\n );\n\n return [\n ...preservedTokens,\n ...payloadNonChainTokens,\n ...mergedChainTokens,\n ] as AccountProfile[\"tokens\"];\n}\n\n/**\n * Saving of token(s) metadata to Hive profile\n * It may contain: external wallets(see EcencyWalletCurrency), Hive tokens arrangement\n *\n * Basically, this mutation is a convenient wrapper for update profile operation\n */\ntype SaveWalletInformationOptions = Pick<\n UseMutationOptions,\n \"onSuccess\" | \"onError\"\n>;\n\nexport function useSaveWalletInformationToMetadata(\n username: string,\n auth?: AuthContext,\n options?: SaveWalletInformationOptions\n) {\n const queryClient = useQueryClient();\n\n const { data: accountData } = useQuery(getAccountFullQueryOptions(username));\n const { mutateAsync: updateProfile } = useAccountUpdate(username, auth);\n\n return useMutation({\n mutationKey: [\n \"ecency-wallets\",\n \"save-wallet-to-metadata\",\n accountData?.name,\n ],\n mutationFn: async (tokens: EcencyTokenMetadata[]) => {\n if (!accountData) {\n throw new Error(\"[SDK][Wallets] – no account data to save wallets\");\n }\n\n return updateProfile({\n tokens: buildTokensPayload(accountData.profile?.tokens, tokens),\n });\n },\n onError: options?.onError,\n onSuccess: (response, vars, context) => {\n (\n options?.onSuccess as\n | ((\n data: unknown,\n variables: EcencyTokenMetadata[],\n context: unknown\n ) => unknown)\n | undefined\n )?.(response, vars, context);\n queryClient.invalidateQueries({\n queryKey: getAccountWalletListQueryOptions(username).queryKey,\n });\n },\n });\n}\n","import { EcencyWalletCurrency } from \"@/modules/wallets/enums\";\n\ninterface RequestArguments {\n method: string;\n params?: unknown[] | Record;\n}\n\ninterface EthereumProvider {\n isMetaMask?: boolean;\n request(args: RequestArguments): Promise;\n}\n\ndeclare global {\n interface Window {\n ethereum?: EthereumProvider;\n }\n}\n\nfunction getEthereum(): EthereumProvider {\n if (typeof window === \"undefined\" || !window.ethereum) {\n throw new Error(\"MetaMask not found\");\n }\n return window.ethereum;\n}\n\nconst WEI_PER_ETH = 1000000000000000000n;\n\nconst EVM_CHAIN_CONFIG: Record = {\n [EcencyWalletCurrency.ETH]: {\n chainId: \"0x1\",\n name: \"Ethereum Mainnet\",\n rpcUrl: \"https://rpc.ankr.com/eth\",\n explorerUrl: \"https://etherscan.io/tx/\"\n },\n [EcencyWalletCurrency.BNB]: {\n chainId: \"0x38\",\n name: \"BNB Smart Chain\",\n rpcUrl: \"https://bsc-dataseed.binance.org\",\n explorerUrl: \"https://bscscan.com/tx/\"\n }\n};\n\nexport function getEvmChainConfig(currency: EcencyWalletCurrency) {\n const config = EVM_CHAIN_CONFIG[currency];\n if (!config) throw new Error(`Unsupported EVM currency: ${currency}`);\n return config;\n}\n\nexport function getEvmExplorerUrl(currency: EcencyWalletCurrency, txHash: string) {\n return `${getEvmChainConfig(currency).explorerUrl}${txHash}`;\n}\n\nexport async function ensureEvmChain(currency: EcencyWalletCurrency): Promise {\n const ethereum = getEthereum();\n\n const { chainId, name, rpcUrl } = getEvmChainConfig(currency);\n const currentChainId = await ethereum.request({ method: \"eth_chainId\" });\n\n if (currentChainId === chainId) return;\n\n try {\n await ethereum.request({\n method: \"wallet_switchEthereumChain\",\n params: [{ chainId }]\n });\n } catch (err: unknown) {\n // Chain not added — add it\n if (typeof err === \"object\" && err !== null && \"code\" in err && (err as { code: number }).code === 4902) {\n await ethereum.request({\n method: \"wallet_addEthereumChain\",\n params: [{\n chainId,\n chainName: name,\n rpcUrls: [rpcUrl],\n nativeCurrency: {\n name: currency === EcencyWalletCurrency.ETH ? \"Ether\" : \"BNB\",\n symbol: currency === EcencyWalletCurrency.ETH ? \"ETH\" : \"BNB\",\n decimals: 18\n }\n }]\n });\n } else {\n throw err;\n }\n }\n}\n\nexport async function estimateEvmGas(\n from: string,\n to: string,\n valueHex: string,\n currency: EcencyWalletCurrency\n): Promise<{ gasLimit: string; gasPrice: string; estimatedFeeWei: bigint }> {\n const ethereum = getEthereum();\n\n await ensureEvmChain(currency);\n\n const [gasLimit, gasPrice] = await Promise.all([\n ethereum.request({\n method: \"eth_estimateGas\",\n params: [{ from, to, value: valueHex }]\n }),\n ethereum.request({ method: \"eth_gasPrice\" })\n ]);\n\n const estimatedFeeWei = BigInt(gasLimit) * BigInt(gasPrice);\n\n return { gasLimit, gasPrice, estimatedFeeWei };\n}\n\nexport function formatWei(wei: bigint, decimals = 6): string {\n const whole = wei / WEI_PER_ETH;\n const rem = wei % WEI_PER_ETH;\n if (rem === 0n) return whole.toString();\n\n const scale = 10n ** BigInt(decimals);\n const fractional = (rem * scale) / WEI_PER_ETH;\n const fracStr = fractional.toString().padStart(decimals, \"0\").replace(/0+$/, \"\");\n return fracStr ? `${whole}.${fracStr}` : whole.toString();\n}\n\nconst AMOUNT_REGEX = /^\\d+(\\.\\d+)?$/;\n\nexport function parseToWei(amount: string): string {\n const trimmed = amount.trim();\n if (!AMOUNT_REGEX.test(trimmed)) {\n throw new Error(`Invalid amount: \"${amount}\"`);\n }\n\n const [whole, fraction = \"\"] = trimmed.split(\".\");\n if (!/^\\d+$/.test(whole) || (fraction && !/^\\d+$/.test(fraction))) {\n throw new Error(`Invalid amount: \"${amount}\"`);\n }\n\n const paddedFraction = fraction.padEnd(18, \"0\").slice(0, 18);\n const wei = BigInt(whole) * WEI_PER_ETH + BigInt(paddedFraction);\n return \"0x\" + wei.toString(16);\n}\n\nexport async function sendEvmTransfer(\n to: string,\n amountWei: string,\n currency: EcencyWalletCurrency,\n expectedFrom?: string\n): Promise {\n const ethereum = getEthereum();\n\n await ensureEvmChain(currency);\n\n const accounts = await ethereum.request({ method: \"eth_requestAccounts\" });\n const from = accounts[0];\n if (!from) throw new Error(\"No MetaMask account connected\");\n\n // Funds safety: never send from an account other than the linked wallet. The\n // active MetaMask account can differ from the one the user linked (multiple\n // accounts, switched account, or access just granted to a different one). This\n // comparison is atomic with the account read above and is the single source of\n // truth for the EVM send. Throws a sentinel the caller maps to a message.\n if (expectedFrom && from.toLowerCase() !== expectedFrom.toLowerCase()) {\n throw new Error(\"ACCOUNT_MISMATCH\");\n }\n\n const txHash = await ethereum.request({\n method: \"eth_sendTransaction\",\n params: [{\n from,\n to,\n value: amountWei\n }]\n });\n\n return txHash;\n}\n","import { ConfigManager } from \"@ecency/sdk\";\n\nconst SOL_EXPLORER_URL = \"https://explorer.solana.com/tx/\";\nconst LAMPORTS_PER_SOL = 1_000_000_000n;\nconst AMOUNT_REGEX = /^\\d+(\\.\\d+)?$/;\n\nexport function getSolExplorerUrl(signature: string) {\n return `${SOL_EXPLORER_URL}${signature}`;\n}\n\nexport function parseToLamports(amount: string): bigint {\n const trimmed = amount.trim();\n if (!AMOUNT_REGEX.test(trimmed)) {\n throw new Error(`Invalid amount: \"${amount}\"`);\n }\n\n const [whole, fraction = \"\"] = trimmed.split(\".\");\n if (!/^\\d+$/.test(whole) || (fraction && !/^\\d+$/.test(fraction))) {\n throw new Error(`Invalid amount: \"${amount}\"`);\n }\n\n if (fraction.length > 9 && fraction.slice(9).replace(/0/g, \"\").length > 0) {\n throw new Error(`Amount has more than 9 decimal places: \"${amount}\"`);\n }\n\n const paddedFraction = fraction.padEnd(9, \"0\").slice(0, 9);\n return BigInt(whole) * LAMPORTS_PER_SOL + BigInt(paddedFraction);\n}\n\nexport function formatLamports(lamports: bigint, decimals = 6): string {\n const whole = lamports / LAMPORTS_PER_SOL;\n const rem = lamports % LAMPORTS_PER_SOL;\n if (rem === 0n) return whole.toString();\n\n const scale = 10n ** BigInt(decimals);\n const fractional = (rem * scale) / LAMPORTS_PER_SOL;\n const fracStr = fractional.toString().padStart(decimals, \"0\").replace(/0+$/, \"\");\n return fracStr ? `${whole}.${fracStr}` : whole.toString();\n}\n\ninterface JsonRpcResponse {\n jsonrpc: string;\n id: number | string;\n result?: T;\n error?: { code?: number; message?: string };\n}\n\n/**\n * Call a Solana JSON-RPC method via the Ecency private API proxy.\n * This avoids hitting the public Solana RPC directly from the browser\n * (which returns 403). The proxy forwards to a public Solana RPC node.\n */\nasync function solRpc(method: string, params: unknown[] = []): Promise {\n const baseUrl = ConfigManager.getValidatedBaseUrl();\n const response = await fetch(`${baseUrl}/private-api/rpc/sol`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ jsonrpc: \"2.0\", id: 1, method, params })\n });\n\n if (!response.ok) {\n const text = await response.text().catch(() => \"\");\n throw new Error(`SOL RPC ${method} failed: ${response.status} ${response.statusText}${text ? ` — ${text}` : \"\"}`);\n }\n\n const json: JsonRpcResponse = await response.json();\n if (json.error) {\n throw new Error(json.error.message || `SOL RPC ${method} failed`);\n }\n return json.result as T;\n}\n\nasync function getMetaMaskSolanaWallet(): Promise {\n const { getWallets } = await import(\"@wallet-standard/app\");\n const walletsApi = getWallets();\n const wallets = walletsApi.get();\n\n // Only select a MetaMask wallet that supports Solana signing\n const mmWallet = wallets.find(\n (w: any) =>\n w.name.toLowerCase().includes(\"metamask\") &&\n w.features[\"standard:connect\"] &&\n w.features[\"solana:signAndSendTransaction\"]\n );\n\n if (!mmWallet) {\n throw new Error(\"MetaMask Solana wallet not found. Enable Solana in MetaMask settings.\");\n }\n\n return mmWallet;\n}\n\nexport async function sendSolTransfer(\n to: string,\n amountSol: string\n): Promise {\n const mmWallet = await getMetaMaskSolanaWallet();\n\n // Connect to get accounts\n const connectFeature = mmWallet.features[\"standard:connect\"] as any;\n await connectFeature.connect();\n\n const solAccount = mmWallet.accounts?.find(\n (acc: any) => acc.chains?.some((c: string) => c.startsWith(\"solana:\"))\n );\n\n if (!solAccount) {\n throw new Error(\"No Solana account found in MetaMask.\");\n }\n\n // Use @solana/web3.js for transaction building (dynamic import to avoid bundle bloat)\n const { PublicKey, SystemProgram, Transaction } = await import(\"@solana/web3.js\");\n\n const fromPubkey = new PublicKey(solAccount.address);\n const toPubkey = new PublicKey(to);\n const lamports = parseToLamports(amountSol);\n\n const transaction = new Transaction().add(\n SystemProgram.transfer({\n fromPubkey,\n toPubkey,\n lamports\n })\n );\n\n // Fetch blockhash via Ecency RPC proxy (avoids 403 from public Solana RPC)\n const blockhashResult = await solRpc<{ value: { blockhash: string } }>(\n \"getLatestBlockhash\",\n [{ commitment: \"finalized\" }]\n );\n transaction.recentBlockhash = blockhashResult.value.blockhash;\n transaction.feePayer = fromPubkey;\n\n // Serialize the transaction for signing via Wallet Standard\n const serializedTx = transaction.serialize({\n requireAllSignatures: false,\n verifySignatures: false\n });\n\n const signAndSendFeature = mmWallet.features[\"solana:signAndSendTransaction\"] as any;\n if (!signAndSendFeature) {\n throw new Error(\"MetaMask does not support Solana transaction signing. Please update MetaMask.\");\n }\n\n const [result] = await signAndSendFeature.signAndSendTransaction({\n account: solAccount,\n transaction: serializedTx,\n chain: \"solana:mainnet\"\n });\n\n // Result contains the signature — either a string or Uint8Array\n if (typeof result.signature === \"string\") {\n return result.signature;\n }\n\n // Encode Uint8Array to base58 (standard Solana signature format)\n const { base58 } = await import(\"@scure/base\");\n return base58.encode(new Uint8Array(result.signature));\n}\n","import { EcencyWalletCurrency } from \"@/modules/wallets/enums\";\nimport { sendEvmTransfer, parseToWei } from \"@/modules/wallets/utils/metamask-evm-transfer\";\nimport { sendSolTransfer } from \"@/modules/wallets/utils/metamask-sol-transfer\";\nimport { useMutation, useQueryClient } from \"@tanstack/react-query\";\n\nexport type TransferableCurrency =\n | EcencyWalletCurrency.ETH\n | EcencyWalletCurrency.BNB\n | EcencyWalletCurrency.SOL;\n\ninterface ExternalTransferPayload {\n to: string;\n amount: string;\n /** EVM only: the linked wallet address. The send is blocked if the active\n * MetaMask account does not match it (funds safety). */\n expectedFrom?: string;\n}\n\nexport function useExternalTransfer(currency: TransferableCurrency) {\n const queryClient = useQueryClient();\n\n return useMutation({\n mutationKey: [\"ecency-wallets\", \"external-transfer\", currency],\n mutationFn: async ({ to, amount, expectedFrom }: ExternalTransferPayload) => {\n switch (currency) {\n case EcencyWalletCurrency.ETH:\n case EcencyWalletCurrency.BNB: {\n const valueHex = parseToWei(amount);\n const txHash = await sendEvmTransfer(to, valueHex, currency, expectedFrom);\n return { txHash, currency };\n }\n case EcencyWalletCurrency.SOL: {\n const signature = await sendSolTransfer(to, amount);\n return { txHash: signature, currency };\n }\n }\n },\n onSuccess: () => {\n queryClient.invalidateQueries({\n queryKey: [\"ecency-wallets\", \"external-wallet-balance\"]\n });\n }\n });\n}\n","// @scure/bip39 (same @noble/@scure family as @scure/bip32 used below).\n// mnemonicToSeedSync is pure PBKDF2-HMAC-SHA512 over the mnemonic string — it\n// uses no wordlist, so this is byte-identical to bip39's output (verified\n// against BIP39 test vectors) while dropping bip39's ~164KB of 10 bundled\n// language wordlists from the app bundle.\nimport { mnemonicToSeedSync } from \"@scure/bip39\";\nimport { HDKey } from \"@scure/bip32\";\nimport { PrivateKey } from \"@ecency/sdk\";\n\nexport type HiveRole = \"owner\" | \"active\" | \"posting\" | \"memo\";\n\nconst ROLE_INDEX: Record = {\n owner: 0,\n active: 1,\n posting: 2,\n memo: 3,\n};\n\nexport function deriveHiveKey(\n mnemonic: string,\n role: HiveRole,\n accountIndex = 0\n) {\n const seed = mnemonicToSeedSync(mnemonic);\n const master = HDKey.fromMasterSeed(seed);\n const path = `m/44'/3054'/${accountIndex}'/0'/${ROLE_INDEX[role]}'`;\n const child = master.derive(path);\n if (!child.privateKey) {\n throw new Error(\"[Ecency][Wallets] - hive key derivation failed\");\n }\n const pk = PrivateKey.from(Buffer.from(child.privateKey));\n return {\n privateKey: pk.toString(),\n publicKey: pk.createPublic().toString(),\n } as const;\n}\n\nexport function deriveHiveKeys(\n mnemonic: string,\n accountIndex = 0\n) {\n const owner = deriveHiveKey(mnemonic, \"owner\", accountIndex);\n const active = deriveHiveKey(mnemonic, \"active\", accountIndex);\n const posting = deriveHiveKey(mnemonic, \"posting\", accountIndex);\n const memo = deriveHiveKey(mnemonic, \"memo\", accountIndex);\n return {\n owner: owner.privateKey,\n active: active.privateKey,\n posting: posting.privateKey,\n memo: memo.privateKey,\n ownerPubkey: owner.publicKey,\n activePubkey: active.publicKey,\n postingPubkey: posting.publicKey,\n memoPubkey: memo.publicKey,\n } as const;\n}\n\n","import { PrivateKey } from \"@ecency/sdk\";\nimport type { HiveRole } from \"./derive-hive-bip44-keys\";\n\nexport function deriveHiveMasterPasswordKey(\n username: string,\n masterPassword: string,\n role: HiveRole\n) {\n const pk = PrivateKey.fromLogin(username, masterPassword, role);\n return {\n privateKey: pk.toString(),\n publicKey: pk.createPublic().toString(),\n } as const;\n}\n\nexport function deriveHiveMasterPasswordKeys(\n username: string,\n masterPassword: string\n) {\n const owner = deriveHiveMasterPasswordKey(username, masterPassword, \"owner\");\n const active = deriveHiveMasterPasswordKey(username, masterPassword, \"active\");\n const posting = deriveHiveMasterPasswordKey(\n username,\n masterPassword,\n \"posting\"\n );\n const memo = deriveHiveMasterPasswordKey(username, masterPassword, \"memo\");\n return {\n owner: owner.privateKey,\n active: active.privateKey,\n posting: posting.privateKey,\n memo: memo.privateKey,\n ownerPubkey: owner.publicKey,\n activePubkey: active.publicKey,\n postingPubkey: posting.publicKey,\n memoPubkey: memo.publicKey,\n } as const;\n}\n","import { CONFIG, FullAccount, getAccountFullQueryOptions, PrivateKey } from \"@ecency/sdk\";\nimport { deriveHiveKeys } from \"./derive-hive-bip44-keys\";\n\nexport type HiveKeyDerivation = \"bip44\" | \"master-password\" | \"unknown\";\n\nexport async function detectHiveKeyDerivation(\n username: string,\n seed: string,\n type: \"active\" | \"owner\" = \"active\"\n): Promise {\n const uname = username.trim().toLowerCase();\n\n // ensure we actually have data\n const account = (await CONFIG.queryClient.fetchQuery(\n getAccountFullQueryOptions(uname)\n )) as FullAccount | null;\n if (!account) {\n throw new Error(\"[SDK][Wallets] – no account found for key derivation\");\n }\n\n // pick the right authority based on `type`\n const auth = account[type];\n\n // --- BIP44 check (match selected authority) ---\n // The input may be a legacy master password (or any non-mnemonic string),\n // which @scure/bip39 rejects with \"Invalid mnemonic\". The previous bip39 ran\n // PBKDF2 over any string and produced a (non-matching) seed here, so guard the\n // BIP44 probe and fall through to the master-password check on failure —\n // otherwise master-password logins/signing abort before authenticating.\n let matchBip44 = false;\n try {\n const bip44 = deriveHiveKeys(seed);\n const bip44Pub = type === \"owner\" ? bip44.ownerPubkey : bip44.activePubkey;\n matchBip44 = auth.key_auths.some(([pub]) => String(pub) === bip44Pub);\n } catch {\n // not a valid BIP39 mnemonic -> not a BIP44 seed\n }\n if (matchBip44) return \"bip44\";\n\n // --- Master password (legacy) check (match selected authority) ---\n const legacyPub = PrivateKey.fromLogin(uname, seed, type)\n .createPublic()\n .toString();\n\n const matchLegacy = auth.key_auths.some(([pub]) => String(pub) === legacyPub);\n if (matchLegacy) return \"master-password\";\n\n return \"unknown\";\n}\n","import { EcencyWalletCurrency } from \"@/modules/wallets/enums\";\n\nexport type WalletAddressMap = Partial>;\n\n/** Chain prefixes we look for in Wallet Standard accounts */\nconst CHAIN_PREFIX_MAP: Record = {\n \"solana:\": EcencyWalletCurrency.SOL,\n \"bip122:\": EcencyWalletCurrency.BTC\n};\n\nconst HIVE_SNAP_ID = \"npm:@hiveio/metamask-snap\";\n\nexport interface HivePublicKey {\n publicKey: string;\n role?: string;\n accountIndex: number;\n addressIndex: number;\n}\n\ninterface WalletStandardWallet {\n name: string;\n chains: readonly string[];\n features: Record;\n accounts: ReadonlyArray<{\n address: string;\n chains: readonly string[];\n }>;\n}\n\n/**\n * Fetch non-EVM addresses from MetaMask via the Wallet Standard protocol.\n *\n * MetaMask registers non-EVM wallets (Solana, Bitcoin) as separate Wallet Standard\n * wallets — they are NOT accessible through window.ethereum (EVM-only provider).\n */\nexport async function fetchMultichainAddresses(): Promise {\n const addresses: WalletAddressMap = {};\n\n try {\n const { getWallets } = await import(\"@wallet-standard/app\");\n const walletsApi = getWallets();\n const wallets = walletsApi.get();\n\n // Iterate ALL MetaMask wallet registrations — MetaMask may expose\n // separate entries per chain (e.g., one for Solana, one for Bitcoin)\n const mmWallets = wallets.filter(\n (w: WalletStandardWallet) =>\n w.name.toLowerCase().includes(\"metamask\") &&\n w.features[\"standard:connect\"]\n ) as WalletStandardWallet[];\n\n for (const mmWallet of mmWallets) {\n try {\n const connectFeature = mmWallet.features[\"standard:connect\"] as\n { connect: () => Promise };\n await connectFeature.connect();\n } catch (connectErr) {\n if (process.env.NODE_ENV === \"development\") {\n console.log(\"[MetaMask multichain] wallet connect failed, trying next:\", connectErr);\n }\n continue;\n }\n\n for (const account of mmWallet.accounts ?? []) {\n if (!account.address || !Array.isArray(account.chains)) continue;\n\n for (const [prefix, currency] of Object.entries(CHAIN_PREFIX_MAP)) {\n if (addresses[currency]) continue;\n if (account.chains.some((c: string) => c.startsWith(prefix))) {\n addresses[currency] = account.address;\n }\n }\n }\n }\n } catch (e) {\n if (process.env.NODE_ENV === \"development\") {\n console.log(\"[MetaMask multichain] wallet standard discovery failed:\", e);\n }\n }\n\n return addresses;\n}\n\n/**\n * Fetch the EVM address from MetaMask via window.ethereum.\n * Returns the first connected account address, or undefined on failure.\n */\nexport async function fetchEvmAddress(): Promise {\n if (typeof window === \"undefined\" || !window.ethereum?.isMetaMask) return undefined;\n\n try {\n const accounts = await window.ethereum.request({\n method: \"eth_requestAccounts\"\n }) as string[] | undefined;\n\n return accounts?.[0] ?? undefined;\n } catch {\n return undefined;\n }\n}\n\n/**\n * Discover all wallet addresses from MetaMask (EVM + non-EVM).\n * Returns a map of currency -> address. Partial results are returned on failure.\n */\nexport async function discoverMetaMaskWallets(): Promise {\n const addresses: WalletAddressMap = {};\n\n // EVM address (shared for ETH + BNB)\n const evmAddress = await fetchEvmAddress();\n if (evmAddress) {\n addresses[EcencyWalletCurrency.ETH] = evmAddress;\n addresses[EcencyWalletCurrency.BNB] = evmAddress;\n }\n\n // Non-EVM addresses via Wallet Standard\n const multichainAddresses = await fetchMultichainAddresses();\n Object.assign(addresses, multichainAddresses);\n\n return addresses;\n}\n\n/**\n * Install the Hive Snap in MetaMask.\n */\nexport async function installHiveSnap(): Promise {\n if (typeof window === \"undefined\" || !window.ethereum) {\n throw new Error(\"MetaMask is not available\");\n }\n await window.ethereum.request({\n method: \"wallet_requestSnaps\",\n params: { [HIVE_SNAP_ID]: {} }\n });\n}\n\n/**\n * Get Hive public keys from the MetaMask Hive Snap.\n * Returns owner, active, posting, and memo public keys.\n */\nexport async function getHivePublicKeys(): Promise {\n if (typeof window === \"undefined\" || !window.ethereum) {\n throw new Error(\"MetaMask is not available\");\n }\n\n const result = await window.ethereum.request({\n method: \"wallet_invokeSnap\",\n params: {\n snapId: HIVE_SNAP_ID,\n request: {\n method: \"hive_getPublicKeys\",\n params: {\n keys: [\n { role: \"owner\", accountIndex: 0 },\n { role: \"active\", accountIndex: 0 },\n { role: \"posting\", accountIndex: 0 },\n { role: \"memo\", accountIndex: 0 }\n ]\n }\n }\n }\n }) as { publicKeys?: unknown } | undefined;\n\n const keys = result?.publicKeys;\n if (!Array.isArray(keys)) {\n throw new Error(\"Hive Snap returned invalid response — expected publicKeys array\");\n }\n\n return keys as HivePublicKey[];\n}\n","import { rememberScryptBsvVersion } from \"./internal/scrypt-guard\";\n\nrememberScryptBsvVersion();\n\nexport * from \"./modules/wallets\";\nexport * from \"./modules/assets\";\n"]} \ No newline at end of file diff --git a/packages/wallets/dist/node/index.cjs b/packages/wallets/dist/node/index.cjs index ab560245b2..55b6d83c16 100644 --- a/packages/wallets/dist/node/index.cjs +++ b/packages/wallets/dist/node/index.cjs @@ -652,15 +652,17 @@ function getTokenOperationsQueryOptions(token, username, isForOwner = false, cur } // src/modules/wallets/mutations/save-wallet-information-to-metadata.ts +var isChainToken = ({ + type, + symbol +}) => type === "CHAIN" || Object.values(EcencyWalletCurrency).includes(symbol); function getGroupedChainTokens(tokens, defaultShow) { if (!tokens) { return {}; } return R__namespace.pipe( tokens, - R__namespace.filter( - ({ type, symbol }) => type === "CHAIN" || Object.values(EcencyWalletCurrency).includes(symbol) - ), + R__namespace.filter(isChainToken), R__namespace.map((item) => { const meta = { ...item.meta ?? {} @@ -680,6 +682,35 @@ function getGroupedChainTokens(tokens, defaultShow) { ) ); } +function buildTokensPayload(existingTokens, tokens) { + const profileChainTokens = getGroupedChainTokens(existingTokens); + const payloadTokens = tokens.map(({ currency, type, privateKey, username, ...meta }) => ({ + symbol: currency, + type: type ?? (Object.values(EcencyWalletCurrency).includes(currency) ? "CHAIN" : void 0), + meta + })) ?? []; + const payloadChainTokens = getGroupedChainTokens(payloadTokens, true); + const payloadNonChainTokens = (payloadTokens ?? []).filter( + (token) => !isChainToken(token) + ); + const mergedChainTokens = R__namespace.pipe( + profileChainTokens, + R__namespace.mergeDeep(payloadChainTokens), + R__namespace.values() + ); + const managesNonChainTokens = payloadNonChainTokens.length > 0; + const payloadSymbols = new Set( + (payloadTokens ?? []).map(({ symbol }) => symbol) + ); + const preservedTokens = managesNonChainTokens ? [] : (existingTokens ?? []).filter( + (token) => !isChainToken(token) && !payloadSymbols.has(token.symbol) + ); + return [ + ...preservedTokens, + ...payloadNonChainTokens, + ...mergedChainTokens + ]; +} function useSaveWalletInformationToMetadata(username, auth, options2) { const queryClient = reactQuery.useQueryClient(); const { data: accountData } = reactQuery.useQuery(sdk.getAccountFullQueryOptions(username)); @@ -694,28 +725,8 @@ function useSaveWalletInformationToMetadata(username, auth, options2) { if (!accountData) { throw new Error("[SDK][Wallets] \u2013 no account data to save wallets"); } - const profileChainTokens = getGroupedChainTokens( - accountData.profile?.tokens - ); - const payloadTokens = tokens.map(({ currency, type, privateKey, username: username2, ...meta }) => ({ - symbol: currency, - type: type ?? (Object.values(EcencyWalletCurrency).includes(currency) ? "CHAIN" : void 0), - meta - })) ?? []; - const payloadChainTokens = getGroupedChainTokens(payloadTokens, true); - const payloadNonChainTokens = payloadTokens.filter( - ({ type, symbol }) => type !== "CHAIN" && !Object.values(EcencyWalletCurrency).includes(symbol) - ); - const mergedChainTokens = R__namespace.pipe( - profileChainTokens, - R__namespace.mergeDeep(payloadChainTokens), - R__namespace.values() - ); return updateProfile({ - tokens: [ - ...payloadNonChainTokens, - ...mergedChainTokens - ] + tokens: buildTokensPayload(accountData.profile?.tokens, tokens) }); }, onError: options2?.onError, @@ -1322,6 +1333,7 @@ Object.defineProperty(exports, "vestsToHp", { exports.EcencyWalletBasicTokens = EcencyWalletBasicTokens; exports.EcencyWalletCurrency = EcencyWalletCurrency; exports.EcencyWalletsPrivateApi = private_api_exports; +exports.buildTokensPayload = buildTokensPayload; exports.deriveHiveKey = deriveHiveKey; exports.deriveHiveKeys = deriveHiveKeys; exports.deriveHiveMasterPasswordKey = deriveHiveMasterPasswordKey; diff --git a/packages/wallets/dist/node/index.cjs.map b/packages/wallets/dist/node/index.cjs.map index 319178b5d8..77fbdd128d 100644 --- a/packages/wallets/dist/node/index.cjs.map +++ b/packages/wallets/dist/node/index.cjs.map @@ -1 +1 @@ -{"version":3,"sources":["../../src/internal/scrypt-guard.ts","../../src/modules/wallets/enums/ecency-wallet-currency.ts","../../src/modules/wallets/enums/ecency-wallet-basic-tokens.ts","../../src/modules/wallets/mutations/private-api/index.ts","../../src/modules/wallets/utils/get-bound-fetch.ts","../../src/modules/wallets/mutations/private-api/create-account-with-wallets.ts","../../src/modules/wallets/mutations/private-api/check-wallet-existence.ts","../../src/modules/wallets/mutations/private-api/update-account-with-wallets.ts","../../src/modules/wallets/queries/use-get-external-wallet-query.ts","../../src/modules/wallets/queries/get-token-price-query-options.ts","../../src/modules/wallets/queries/get-all-tokens-list-query-options.ts","../../src/modules/wallets/queries/use-get-account-wallet-list-query.ts","../../src/modules/wallets/queries/get-tokens-operations-query-options.ts","../../src/modules/wallets/mutations/save-wallet-information-to-metadata.ts","../../src/modules/wallets/utils/metamask-evm-transfer.ts","../../src/modules/wallets/utils/metamask-sol-transfer.ts","../../src/modules/wallets/mutations/use-external-transfer.ts","../../src/modules/wallets/utils/derive-hive-bip44-keys.ts","../../src/modules/wallets/utils/derive-hive-master-password-keys.ts","../../src/modules/wallets/utils/detect-hive-key-derivation.ts","../../src/modules/wallets/utils/metamask-discovery.ts","../../src/index.ts"],"names":["EcencyWalletCurrency","EcencyWalletBasicTokens","useMutation","ConfigManager","useQuery","LRUCache","queryOptions","getQueryClient","getHiveEngineTokensBalancesQueryOptions","getHiveEngineTokensMetadataQueryOptions","getPortfolioQueryOptions","getAccountFullQueryOptions","AssetOperation","R","options","useQueryClient","useAccountUpdate","username","AMOUNT_REGEX","mnemonicToSeedSync","HDKey","PrivateKey","CONFIG"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * The scrypt bsv package writes the version string to a global symbol and\n * warns when that symbol is already populated. In environments that reload\n * modules (Next.js dev server, Storybook, etc.) the stale value triggers\n * repeated warnings. Clearing the cached handle before our modules touch bsv\n * keeps the console quiet without requiring downstream wrappers.\n *\n * Similarly, bitcore-lib and bitcore-lib-inquisition check for duplicate instances\n * using global variables and throw errors when detected. We clear these globals\n * to prevent false positives in module reloading scenarios.\n */\nconst globalLike = globalThis as Record & {\n _scrypt_bsv?: unknown;\n __scryptBsvPreviousVersion?: unknown;\n _bitcore?: unknown;\n __bitcorePreviousVersion?: unknown;\n};\n\nif (typeof globalLike._scrypt_bsv !== \"undefined\") {\n if (typeof globalLike._scrypt_bsv === \"string\") {\n globalLike.__scryptBsvPreviousVersion = globalLike._scrypt_bsv;\n }\n\n try {\n delete globalLike._scrypt_bsv;\n } catch {\n globalLike._scrypt_bsv = undefined;\n }\n}\n\n// Clear bitcore-lib global to prevent \"more than one instance\" errors\nif (typeof globalLike._bitcore !== \"undefined\") {\n if (typeof globalLike._bitcore === \"object\") {\n globalLike.__bitcorePreviousVersion = globalLike._bitcore;\n }\n\n try {\n delete globalLike._bitcore;\n } catch {\n globalLike._bitcore = undefined;\n }\n}\n\nexport function rememberScryptBsvVersion() {\n if (typeof globalLike._scrypt_bsv === \"string\") {\n globalLike.__scryptBsvPreviousVersion = globalLike._scrypt_bsv;\n }\n\n // Also remember bitcore version if it exists\n if (typeof globalLike._bitcore === \"object\") {\n globalLike.__bitcorePreviousVersion = globalLike._bitcore;\n }\n}\n","export enum EcencyWalletCurrency {\n BTC = \"BTC\",\n ETH = \"ETH\",\n BNB = \"BNB\",\n SOL = \"SOL\",\n}\n","export enum EcencyWalletBasicTokens {\n Points = \"POINTS\",\n HivePower = \"HP\",\n Hive = \"HIVE\",\n HiveDollar = \"HBD\"\n}\n","export * from \"./create-account-with-wallets\";\nexport * from \"./check-wallet-existence\";\nexport * from \"./update-account-with-wallets\";\n","let cachedFetch: typeof globalThis.fetch | undefined;\n\nexport function getBoundFetch() {\n if (!cachedFetch) {\n if (typeof globalThis.fetch !== \"function\") {\n throw new Error(\"[Ecency][Wallets] - global fetch is not available\");\n }\n\n cachedFetch = globalThis.fetch.bind(globalThis);\n }\n\n return cachedFetch;\n}\n","import { ConfigManager } from \"@ecency/sdk\";\nimport { EcencyWalletCurrency } from \"@/modules/wallets/enums\";\nimport { getBoundFetch } from \"@/modules/wallets/utils/get-bound-fetch\";\nimport { useMutation } from \"@tanstack/react-query\";\n\ninterface HiveKeys {\n ownerPublicKey?: string;\n activePublicKey?: string;\n postingPublicKey?: string;\n memoPublicKey?: string;\n}\n\ninterface Payload {\n currency: EcencyWalletCurrency;\n address: string;\n hiveKeys?: HiveKeys;\n walletAddresses?: Partial>;\n}\n\nexport function useCreateAccountWithWallets(username: string) {\n const fetchApi = getBoundFetch();\n\n return useMutation({\n mutationKey: [\"ecency-wallets\", \"create-account-with-wallets\", username],\n mutationFn: async ({ currency, address, hiveKeys, walletAddresses }: Payload) => {\n const addresses: Record = {};\n if (walletAddresses) {\n for (const [k, v] of Object.entries(walletAddresses)) {\n if (v) addresses[k] = v;\n }\n }\n\n const response = await fetchApi(`${ConfigManager.getValidatedBaseUrl()}/private-api/wallets-add`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n username,\n token: currency,\n address,\n meta: {\n ...hiveKeys,\n ...addresses,\n [currency]: address\n },\n }),\n });\n\n if (!response.ok) {\n throw new Error(`Account creation failed (${response.status})`);\n }\n\n return response;\n },\n });\n}\n","import { ConfigManager } from \"@ecency/sdk\";\nimport { EcencyWalletCurrency } from \"@/modules/wallets/enums\";\nimport { useMutation } from \"@tanstack/react-query\";\n\ninterface Payload {\n address: string;\n currency: EcencyWalletCurrency;\n}\n\nexport function useCheckWalletExistence() {\n return useMutation({\n mutationKey: [\"ecency-wallets\", \"check-wallet-existence\"],\n mutationFn: async ({ address, currency }: Payload) => {\n const response = await fetch(\n `${ConfigManager.getValidatedBaseUrl()}/private-api/wallets-exist`,\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n address,\n token: currency,\n }),\n }\n );\n const data = await response.json();\n return data.length === 0;\n },\n });\n}\n","import { ConfigManager } from \"@ecency/sdk\";\nimport { useMutation } from \"@tanstack/react-query\";\nimport { getBoundFetch } from \"@/modules/wallets/utils/get-bound-fetch\";\n\ninterface Payload {\n tokens: Record;\n hiveKeys: {\n ownerPublicKey: string;\n activePublicKey: string;\n postingPublicKey: string;\n memoPublicKey: string;\n };\n}\n\nexport function useUpdateAccountWithWallets(\n username: string,\n accessToken: string | undefined\n) {\n const fetchApi = getBoundFetch();\n\n return useMutation({\n mutationKey: [\"ecency-wallets\", \"update-account-with-wallets\", username],\n mutationFn: async ({ tokens, hiveKeys }: Payload) => {\n const entries = Object.entries(tokens).filter(([, address]) => Boolean(address));\n\n if (entries.length === 0) {\n return new Response(null, { status: 204 });\n }\n\n const [primaryToken, primaryAddress] = entries[0] ?? [\"\", \"\"];\n\n if (!accessToken) {\n throw new Error(\n \"[SDK][Wallets][PrivateApi][WalletsAdd] – access token wasn`t found\"\n );\n }\n\n const response = await fetchApi(`${ConfigManager.getValidatedBaseUrl()}/private-api/wallets-add`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n username,\n code: accessToken,\n token: primaryToken,\n address: primaryAddress,\n status: 3,\n meta: {\n ...Object.fromEntries(entries),\n ownerPublicKey: hiveKeys.ownerPublicKey,\n activePublicKey: hiveKeys.activePublicKey,\n postingPublicKey: hiveKeys.postingPublicKey,\n memoPublicKey: hiveKeys.memoPublicKey,\n },\n }),\n });\n\n // Raw fetch resolves on 4xx/5xx; guard so a failed wallet-add doesn't run\n // onSuccess as if the account had been updated.\n if (!response.ok) {\n throw new Error(\n `[SDK][Wallets][PrivateApi][WalletsAdd] – request failed: ${response.status}`\n );\n }\n\n return response;\n },\n });\n}\n","import { EcencyWalletCurrency } from \"@/modules/wallets/enums\";\nimport { ConfigManager } from \"@ecency/sdk\";\nimport { useQuery } from \"@tanstack/react-query\";\n\nconst currencyChainMap: Record = {\n [EcencyWalletCurrency.BTC]: \"btc\",\n [EcencyWalletCurrency.ETH]: \"eth\",\n [EcencyWalletCurrency.BNB]: \"bnb\",\n [EcencyWalletCurrency.SOL]: \"sol\",\n};\n\ninterface PrivateApiBalanceResponse {\n chain: string;\n balance: number | string;\n unit: string;\n raw?: unknown;\n nodeId?: string;\n}\n\nexport interface ExternalWalletBalance {\n chain: string;\n unit: string;\n raw?: unknown;\n nodeId?: string;\n /**\n * Balance represented as a BigInt for convenience.\n */\n balanceBigInt: bigint;\n /**\n * Balance returned as a string to preserve precision for UIs that cannot\n * handle bigint values directly.\n */\n balanceString: string;\n}\n\nfunction normalizeBalance(balance: number | string): string {\n if (typeof balance === \"number\") {\n if (!Number.isFinite(balance)) {\n throw new Error(\"Private API returned a non-finite numeric balance\");\n }\n\n return Math.trunc(balance).toString();\n }\n\n if (typeof balance === \"string\") {\n const trimmed = balance.trim();\n\n if (trimmed === \"\") {\n throw new Error(\"Private API returned an empty balance string\");\n }\n\n return trimmed;\n }\n\n throw new Error(\"Private API returned balance in an unexpected format\");\n}\n\nfunction parsePrivateApiBalance(\n result: unknown,\n expectedChain: string\n): ExternalWalletBalance {\n if (!result || typeof result !== \"object\") {\n throw new Error(\"Private API returned an unexpected response\");\n }\n\n const { chain, balance, unit, raw, nodeId } =\n result as PrivateApiBalanceResponse;\n\n if (typeof chain !== \"string\" || chain !== expectedChain) {\n throw new Error(\"Private API response chain did not match request\");\n }\n\n if (typeof unit !== \"string\" || unit.length === 0) {\n throw new Error(\"Private API response is missing unit information\");\n }\n\n if (balance === undefined || balance === null) {\n throw new Error(\"Private API response is missing balance information\");\n }\n\n const balanceString = normalizeBalance(balance);\n\n let balanceBigInt: bigint;\n\n try {\n balanceBigInt = BigInt(balanceString);\n } catch (error) {\n throw new Error(\"Private API returned a balance that is not an integer\");\n }\n\n return {\n chain,\n unit,\n raw,\n nodeId:\n typeof nodeId === \"string\" && nodeId.length > 0 ? nodeId : undefined,\n balanceBigInt,\n balanceString,\n };\n}\n\nexport function useGetExternalWalletBalanceQuery(\n currency: EcencyWalletCurrency,\n address: string\n) {\n return useQuery({\n queryKey: [\"ecency-wallets\", \"external-wallet-balance\", currency, address],\n queryFn: async () => {\n const chain = currencyChainMap[currency];\n\n if (!chain) {\n throw new Error(`Unsupported currency ${currency}`);\n }\n\n const baseUrl = `${ConfigManager.getValidatedBaseUrl()}/private-api/balance/${chain}/${encodeURIComponent(\n address\n )}`;\n\n let primaryResponse: Response | undefined;\n let primaryError: unknown;\n\n try {\n primaryResponse = await fetch(baseUrl);\n } catch (error) {\n primaryError = error;\n }\n\n let response = primaryResponse;\n\n if (!response || !response.ok) {\n const fallbackUrl = `${baseUrl}?provider=chainz`;\n let fallbackError: unknown;\n\n try {\n const fallbackResponse = await fetch(fallbackUrl);\n\n if (fallbackResponse.ok) {\n response = fallbackResponse;\n } else {\n fallbackError = new Error(\n `Fallback provider responded with status ${fallbackResponse.status}`\n );\n }\n } catch (error) {\n fallbackError = error;\n }\n\n if (!response || !response.ok) {\n const failureReasons: string[] = [];\n\n if (primaryError) {\n const message =\n primaryError instanceof Error\n ? primaryError.message\n : String(primaryError);\n failureReasons.push(`primary provider failed: ${message}`);\n } else if (primaryResponse && !primaryResponse.ok) {\n failureReasons.push(\n `primary provider status ${primaryResponse.status}`\n );\n }\n\n if (fallbackError) {\n const message =\n fallbackError instanceof Error\n ? fallbackError.message\n : String(fallbackError);\n failureReasons.push(`fallback provider failed: ${message}`);\n }\n\n if (failureReasons.length === 0) {\n failureReasons.push(\"unknown error\");\n }\n\n throw new Error(\n `Private API request failed (${failureReasons.join(\", \")})`\n );\n }\n }\n\n const result = (await response.json()) as unknown;\n\n return parsePrivateApiBalance(result, chain);\n },\n });\n}\n","import { ConfigManager } from \"@ecency/sdk\";\nimport { EcencyWalletCurrency } from \"@/modules/wallets/enums\";\nimport { queryOptions } from \"@tanstack/react-query\";\nimport { LRUCache } from \"lru-cache\";\n\nconst options = {\n max: 500,\n // how long to live in ms\n ttl: 1000 * 60 * 5,\n // return stale items before removing from cache?\n allowStale: false,\n updateAgeOnGet: false,\n updateAgeOnHas: false,\n};\n\nconst cache = new LRUCache(options);\nconst undefinedValue = Symbol(\"undefined\");\n\nconst cacheSet = (key: string, value: any) =>\n cache.set(key, value === undefined ? undefinedValue : value);\n\nconst cacheGet = (key: string) => {\n const v = cache.get(key);\n return v === undefinedValue ? undefined : v;\n};\n\ninterface MarketDataQuote {\n last_updated: string;\n percent_change: number;\n price: number;\n}\n\ninterface MarketDataLatestResponse {\n [token: string]: {\n quotes?: {\n usd?: MarketDataQuote;\n btc?: MarketDataQuote;\n [fiat: string]: MarketDataQuote | undefined;\n };\n };\n}\n\nconst CURRENCY_TO_TOKEN_MAP: Record = {\n [EcencyWalletCurrency.BTC]: \"btc\",\n [EcencyWalletCurrency.ETH]: \"eth\",\n [EcencyWalletCurrency.SOL]: \"sol\",\n [EcencyWalletCurrency.BNB]: \"bnb\",\n HBD: \"hbd\",\n HIVE: \"hive\",\n};\n\nconst MARKET_DATA_CACHE_KEY = \"market-data/latest\";\n\nconst normalizeCurrencyToToken = (currency: string) => {\n const upperCased = currency.toUpperCase();\n return CURRENCY_TO_TOKEN_MAP[upperCased] ?? currency.toLowerCase();\n};\n\nexport function getTokenPriceQueryOptions(currency?: string) {\n return queryOptions({\n queryKey: [\"ecency-wallets\", \"market-data\", currency],\n queryFn: async () => {\n if (!currency) {\n throw new Error(\n \"[SDK][Wallets][MarketData] – currency wasn`t provided\"\n );\n }\n\n const token = normalizeCurrencyToToken(currency);\n const baseUrl = ConfigManager.getValidatedBaseUrl();\n\n let marketData = cacheGet(MARKET_DATA_CACHE_KEY) as\n | MarketDataLatestResponse\n | undefined;\n\n if (!marketData) {\n const httpResponse = await fetch(\n `${baseUrl}/private-api/market-data/latest`,\n {\n method: \"GET\",\n }\n );\n\n if (!httpResponse.ok) {\n throw new Error(\n `[SDK][Wallets][MarketData] – failed to fetch latest market data (${httpResponse.status})`\n );\n }\n\n const data = (await httpResponse.json()) as MarketDataLatestResponse;\n cacheSet(MARKET_DATA_CACHE_KEY, data);\n marketData = data;\n }\n\n const tokenData = marketData[token];\n\n if (!tokenData) {\n throw new Error(\n `[SDK][Wallets][MarketData] – missing market data for token: ${token}`\n );\n }\n\n const usdQuote = tokenData.quotes?.usd;\n\n if (!usdQuote) {\n throw new Error(\n `[SDK][Wallets][MarketData] – missing USD quote for token: ${token}`\n );\n }\n\n return Number(usdQuote.price);\n },\n enabled: !!currency,\n });\n}\n","import {\n getHiveEngineTokensBalancesQueryOptions,\n getHiveEngineTokensMetadataQueryOptions,\n} from \"@/modules/assets\";\nimport {\n HiveEngineTokenBalance,\n HiveEngineTokenMetadataResponse,\n} from \"@/modules/assets/hive-engine/types\";\nimport { getQueryClient } from \"@ecency/sdk\";\nimport { queryOptions } from \"@tanstack/react-query\";\nimport { EcencyWalletBasicTokens, EcencyWalletCurrency } from \"../enums\";\n\nfunction createFallbackTokenMetadata(symbol: string): HiveEngineTokenMetadataResponse {\n return {\n issuer: \"\",\n symbol,\n name: symbol,\n metadata: \"{}\",\n precision: 0,\n maxSupply: \"0\",\n supply: \"0\",\n circulatingSupply: \"0\",\n stakingEnabled: false,\n unstakingCooldown: 0,\n delegationEnabled: false,\n undelegationCooldown: 0,\n numberTransactions: 0,\n totalStaked: \"0\",\n };\n}\n\nasync function getLayer2TokensMetadata(username?: string) {\n if (!username) {\n return [] as HiveEngineTokenMetadataResponse[];\n }\n\n let balances: HiveEngineTokenBalance[] = [];\n\n try {\n balances = await getQueryClient().fetchQuery(\n getHiveEngineTokensBalancesQueryOptions(username)\n );\n } catch {\n balances = [];\n }\n\n const uniqueSymbols = Array.from(\n new Set(\n balances\n .map((balance) => balance.symbol)\n .filter((symbol): symbol is string => Boolean(symbol))\n )\n );\n\n if (uniqueSymbols.length === 0) {\n return [] as HiveEngineTokenMetadataResponse[];\n }\n\n let metadataList: HiveEngineTokenMetadataResponse[] = [];\n\n try {\n metadataList = await getQueryClient().fetchQuery(\n getHiveEngineTokensMetadataQueryOptions(uniqueSymbols)\n );\n } catch {\n metadataList = [];\n }\n\n const metadataBySymbol = new Map(\n metadataList.map((token) => [token.symbol, token])\n );\n\n return uniqueSymbols.map(\n (symbol) => metadataBySymbol.get(symbol) ?? createFallbackTokenMetadata(symbol)\n );\n}\n\nexport function getAllTokensListQueryOptions(username?: string) {\n return queryOptions({\n queryKey: [\"ecency-wallets\", \"all-tokens-list\", username ?? null],\n queryFn: async () => {\n return {\n basic: [\n EcencyWalletBasicTokens.Points,\n EcencyWalletBasicTokens.Hive,\n EcencyWalletBasicTokens.HivePower,\n EcencyWalletBasicTokens.HiveDollar,\n ],\n external: Object.values(EcencyWalletCurrency),\n layer2: await getLayer2TokensMetadata(username),\n };\n },\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { EcencyWalletBasicTokens } from \"../enums\";\nimport {\n AccountProfile,\n FullAccount,\n getAccountFullQueryOptions,\n getQueryClient,\n getPortfolioQueryOptions,\n type PortfolioResponse,\n type PortfolioWalletItem,\n} from \"@ecency/sdk\";\n\ntype ProfileTokens = AccountProfile[\"tokens\"];\ntype ProfileToken = NonNullable[number];\n\nfunction normalizeAccountTokens(tokens: ProfileTokens): ProfileToken[] {\n if (Array.isArray(tokens)) {\n return tokens.filter(Boolean) as ProfileToken[];\n }\n\n if (tokens && typeof tokens === \"object\") {\n return Object.values(tokens).flatMap((value) =>\n Array.isArray(value) ? (value.filter(Boolean) as ProfileToken[]) : []\n );\n }\n\n return [];\n}\n\nconst BASIC_TOKENS: string[] = [\n EcencyWalletBasicTokens.Points,\n EcencyWalletBasicTokens.Hive,\n EcencyWalletBasicTokens.HivePower,\n EcencyWalletBasicTokens.HiveDollar,\n];\n\n// Tokens whose support has been removed. Stale profile.tokens entries and\n// portfolio responses may still reference them, so they are always hidden.\nconst REMOVED_TOKENS = new Set([\"SPK\", \"LARYNX\", \"LP\", \"BROCA\"]);\n\nexport function getAccountWalletListQueryOptions(username: string, currency: string = \"usd\") {\n return queryOptions({\n queryKey: [\"ecency-wallets\", \"list\", username, currency],\n enabled: !!username,\n queryFn: async () => {\n const portfolioQuery = getPortfolioQueryOptions(username, currency, true);\n const queryClient = getQueryClient();\n const accountQuery = getAccountFullQueryOptions(username);\n\n let account: FullAccount | undefined;\n\n try {\n account = (await queryClient.fetchQuery(accountQuery)) ?? undefined;\n } catch {\n // Best effort; fall back to defaults if account metadata is not available.\n }\n\n const tokenVisibility = new Map();\n\n const accountTokens = normalizeAccountTokens(account?.profile?.tokens);\n\n accountTokens.forEach((token: ProfileToken) => {\n const symbol = token.symbol?.toUpperCase?.();\n\n if (!symbol) {\n return;\n }\n\n const showValue = (token as any)?.meta?.show;\n\n if (typeof showValue === \"boolean\") {\n tokenVisibility.set(symbol, showValue);\n }\n });\n\n const isTokenVisible = (symbol?: string) => {\n const normalized = symbol?.toUpperCase();\n\n if (!normalized) {\n return false;\n }\n\n if (REMOVED_TOKENS.has(normalized)) {\n return false;\n }\n\n if (BASIC_TOKENS.includes(normalized)) {\n return true;\n }\n\n return tokenVisibility.get(normalized) === true;\n };\n\n try {\n const portfolio: PortfolioResponse = await queryClient.fetchQuery(portfolioQuery);\n const tokensFromPortfolio: string[] = portfolio.wallets.map(\n (asset: PortfolioWalletItem) => asset.symbol\n );\n\n if (tokensFromPortfolio.length > 0) {\n const visibleTokens = tokensFromPortfolio\n .map((token: string) => token?.toUpperCase?.())\n .filter((token: string | undefined): token is string => Boolean(token))\n .filter(isTokenVisible);\n\n if (visibleTokens.length > 0) {\n // Always include basic tokens (HP, HIVE, HBD, POINTS) even if\n // the portfolio API omits them from its response.\n return Array.from(new Set([...BASIC_TOKENS, ...visibleTokens]));\n }\n }\n } catch {\n // Fallback to legacy behaviour when the portfolio endpoint is not accessible.\n }\n\n if (accountTokens.length > 0) {\n const list = [\n ...BASIC_TOKENS,\n ...accountTokens\n .map((token: ProfileToken) => token.symbol)\n .filter(isTokenVisible),\n ];\n\n return Array.from(new Set(list).values());\n }\n\n return [...BASIC_TOKENS];\n },\n });\n}\n","import { AssetOperation } from \"@/modules/assets\";\nimport {\n getQueryClient,\n getPortfolioQueryOptions,\n type PortfolioResponse,\n type PortfolioWalletItem,\n} from \"@ecency/sdk\";\nimport { queryOptions } from \"@tanstack/react-query\";\n\nexport function getTokenOperationsQueryOptions(\n token: string,\n username: string,\n isForOwner = false,\n currency: string = \"usd\"\n) {\n return queryOptions({\n queryKey: [\"wallets\", \"token-operations\", token, username, isForOwner, currency],\n queryFn: async () => {\n const queryClient = getQueryClient();\n const normalizedToken = token.toUpperCase();\n\n if (!username || !isForOwner) {\n return [] as AssetOperation[];\n }\n\n try {\n const portfolio: PortfolioResponse = await queryClient.fetchQuery(\n getPortfolioQueryOptions(username, currency, true)\n );\n const assetEntry = portfolio.wallets.find(\n (assetItem: PortfolioWalletItem) => assetItem.symbol.toUpperCase() === normalizedToken\n );\n\n if (!assetEntry) {\n return [] as AssetOperation[];\n }\n\n // Extract action IDs and map to AssetOperation enums\n const rawActions: Array<{ id: string; [key: string]: unknown }> = assetEntry.actions ?? [];\n const operations: AssetOperation[] = rawActions\n .map((action: { id: string; [key: string]: unknown } | string) => {\n // Extract the id field from action object\n if (typeof action === \"string\") return action;\n if (action && typeof action === \"object\") {\n const record = action as Record;\n return (record.id ?? record.code ?? record.name ?? record.action) as string | undefined;\n }\n return undefined;\n })\n .filter((id: string | undefined): id is string => Boolean(id))\n .map((id: string) => {\n // Normalize: underscores to hyphens, lowercase\n const canonical = id.trim().toLowerCase().replace(/[\\s_]+/g, \"-\");\n\n // Primary mapping: API action IDs to AssetOperation enum values\n const aliasMap: Record = {\n // Common operations\n \"transfer\": AssetOperation.Transfer,\n \"ecency-point-transfer\": AssetOperation.Transfer,\n\n // Savings operations\n \"transfer-to-savings\": AssetOperation.TransferToSavings,\n \"transfer-savings\": AssetOperation.TransferToSavings,\n \"savings-transfer\": AssetOperation.TransferToSavings,\n \"withdraw-from-savings\": AssetOperation.WithdrawFromSavings,\n \"transfer-from-savings\": AssetOperation.WithdrawFromSavings,\n \"withdraw-savings\": AssetOperation.WithdrawFromSavings,\n \"savings-withdraw\": AssetOperation.WithdrawFromSavings,\n\n // Vesting/Power operations\n \"transfer-to-vesting\": AssetOperation.PowerUp,\n \"powerup\": AssetOperation.PowerUp,\n \"power-up\": AssetOperation.PowerUp,\n \"withdraw-vesting\": AssetOperation.PowerDown,\n \"power-down\": AssetOperation.PowerDown,\n \"powerdown\": AssetOperation.PowerDown,\n\n // Delegation\n \"delegate\": AssetOperation.Delegate,\n \"delegate-vesting-shares\": AssetOperation.Delegate,\n \"hp-delegate\": AssetOperation.Delegate,\n \"delegate-hp\": AssetOperation.Delegate,\n \"delegate-power\": AssetOperation.Delegate,\n \"undelegate\": AssetOperation.Undelegate,\n \"undelegate-power\": AssetOperation.Undelegate,\n \"undelegate-token\": AssetOperation.Undelegate,\n\n // Staking (Layer 2)\n \"stake\": AssetOperation.Stake,\n \"stake-token\": AssetOperation.Stake,\n \"stake-power\": AssetOperation.Stake,\n \"unstake\": AssetOperation.Unstake,\n \"unstake-token\": AssetOperation.Unstake,\n \"unstake-power\": AssetOperation.Unstake,\n\n // Swap/Convert\n \"swap\": AssetOperation.Swap,\n \"swap-token\": AssetOperation.Swap,\n \"swap-tokens\": AssetOperation.Swap,\n \"convert\": AssetOperation.Convert,\n\n // Points operations\n \"promote\": AssetOperation.Promote,\n \"promote-post\": AssetOperation.Promote,\n \"promote-entry\": AssetOperation.Promote,\n \"boost\": AssetOperation.Promote,\n \"gift\": AssetOperation.Gift,\n \"gift-points\": AssetOperation.Gift,\n \"points-gift\": AssetOperation.Gift,\n \"claim\": AssetOperation.Claim,\n \"claim-rewards\": AssetOperation.Claim,\n \"claim-points\": AssetOperation.Claim,\n \"buy\": AssetOperation.Buy,\n \"buy-points\": AssetOperation.Buy,\n\n // Other\n \"claim-interest\": AssetOperation.ClaimInterest,\n // Chain operation name, as emitted in the HP action list. The two\n // slug spellings below predate it and stay as a fallback.\n \"set-withdraw-vesting-route\": AssetOperation.WithdrawRoutes,\n \"withdraw-routes\": AssetOperation.WithdrawRoutes,\n \"withdrawroutes\": AssetOperation.WithdrawRoutes,\n };\n\n // Check alias map first (primary method)\n const mapped = aliasMap[canonical];\n if (mapped) return mapped;\n\n // Fallback: try direct enum value match (for exact matches like \"transfer\", \"promote\")\n const directMatch = Object.values(AssetOperation).find(\n (op) => op.toLowerCase() === canonical\n );\n return directMatch;\n })\n .filter((op: AssetOperation | undefined): op is AssetOperation => Boolean(op))\n // Remove duplicates - API may return multiple actions that map to same operation\n .filter((op: AssetOperation, index: number, self: AssetOperation[]) => self.indexOf(op) === index);\n\n const isHiveOrHbd = [\"HIVE\", \"HBD\"].includes(normalizedToken);\n // Check if there's a non-zero savings balance\n const rawToken = assetEntry as any;\n const hasSavings = Number(rawToken.savings ?? 0) > 0;\n\n if (\n isHiveOrHbd &&\n !hasSavings\n ) {\n return operations.filter(\n (operation) => operation !== AssetOperation.WithdrawFromSavings\n );\n }\n\n return operations;\n } catch {\n return [];\n }\n },\n });\n}\n","import {\n AccountProfile,\n getAccountFullQueryOptions,\n useAccountUpdate,\n type AuthContext,\n} from \"@ecency/sdk\";\nimport {\n useMutation,\n useQuery,\n useQueryClient,\n type UseMutationOptions,\n} from \"@tanstack/react-query\";\nimport { EcencyTokenMetadata } from \"../types\";\nimport * as R from \"remeda\";\nimport { getAccountWalletListQueryOptions } from \"../queries\";\nimport { EcencyWalletCurrency } from \"../enums\";\n\nfunction getGroupedChainTokens(\n tokens?: AccountProfile[\"tokens\"],\n defaultShow?: boolean\n) {\n if (!tokens) {\n return {};\n }\n\n return R.pipe(\n tokens,\n R.filter(\n ({ type, symbol }) =>\n type === \"CHAIN\" ||\n Object.values(EcencyWalletCurrency).includes(symbol as any)\n ),\n R.map((item) => {\n const meta = {\n ...(item.meta ?? {}),\n } as Record;\n\n if (typeof meta.show !== \"boolean\" && typeof defaultShow === \"boolean\") {\n meta.show = defaultShow;\n }\n\n return {\n ...item,\n meta,\n };\n }),\n // Chain tokens are unique by symbol, so indexing by symbol\n // gives a direct lookup map instead of an array-based grouping.\n R.indexBy(\n (item: NonNullable[number]) => item.symbol\n )\n );\n}\n\n/**\n * Saving of token(s) metadata to Hive profile\n * It may contain: external wallets(see EcencyWalletCurrency), Hive tokens arrangement\n *\n * Basically, this mutation is a convenient wrapper for update profile operation\n */\ntype SaveWalletInformationOptions = Pick<\n UseMutationOptions,\n \"onSuccess\" | \"onError\"\n>;\n\nexport function useSaveWalletInformationToMetadata(\n username: string,\n auth?: AuthContext,\n options?: SaveWalletInformationOptions\n) {\n const queryClient = useQueryClient();\n\n const { data: accountData } = useQuery(getAccountFullQueryOptions(username));\n const { mutateAsync: updateProfile } = useAccountUpdate(username, auth);\n\n return useMutation({\n mutationKey: [\n \"ecency-wallets\",\n \"save-wallet-to-metadata\",\n accountData?.name,\n ],\n mutationFn: async (tokens: EcencyTokenMetadata[]) => {\n if (!accountData) {\n throw new Error(\"[SDK][Wallets] – no account data to save wallets\");\n }\n\n // Chain type tokens couldn't be deleted entirely from the profile list,\n // then visibility should be controlling using meta.show field\n const profileChainTokens = getGroupedChainTokens(\n accountData.profile?.tokens\n );\n\n const payloadTokens =\n (tokens.map(({ currency, type, privateKey, username, ...meta }) => ({\n symbol: currency!,\n type:\n type ??\n (Object.values(EcencyWalletCurrency).includes(currency as any)\n ? \"CHAIN\"\n : undefined),\n meta,\n })) as AccountProfile[\"tokens\"]) ?? [];\n\n const payloadChainTokens = getGroupedChainTokens(payloadTokens, true);\n const payloadNonChainTokens = payloadTokens.filter(\n ({ type, symbol }) =>\n type !== \"CHAIN\" &&\n !Object.values(EcencyWalletCurrency).includes(symbol as any)\n );\n\n const mergedChainTokens = R.pipe(\n profileChainTokens,\n R.mergeDeep(payloadChainTokens),\n R.values()\n );\n\n return updateProfile({\n tokens: [\n ...payloadNonChainTokens,\n ...mergedChainTokens,\n ] as AccountProfile[\"tokens\"],\n });\n },\n onError: options?.onError,\n onSuccess: (response, vars, context) => {\n (\n options?.onSuccess as\n | ((\n data: unknown,\n variables: EcencyTokenMetadata[],\n context: unknown\n ) => unknown)\n | undefined\n )?.(response, vars, context);\n queryClient.invalidateQueries({\n queryKey: getAccountWalletListQueryOptions(username).queryKey,\n });\n },\n });\n}\n","import { EcencyWalletCurrency } from \"@/modules/wallets/enums\";\n\ninterface RequestArguments {\n method: string;\n params?: unknown[] | Record;\n}\n\ninterface EthereumProvider {\n isMetaMask?: boolean;\n request(args: RequestArguments): Promise;\n}\n\ndeclare global {\n interface Window {\n ethereum?: EthereumProvider;\n }\n}\n\nfunction getEthereum(): EthereumProvider {\n if (typeof window === \"undefined\" || !window.ethereum) {\n throw new Error(\"MetaMask not found\");\n }\n return window.ethereum;\n}\n\nconst WEI_PER_ETH = 1000000000000000000n;\n\nconst EVM_CHAIN_CONFIG: Record = {\n [EcencyWalletCurrency.ETH]: {\n chainId: \"0x1\",\n name: \"Ethereum Mainnet\",\n rpcUrl: \"https://rpc.ankr.com/eth\",\n explorerUrl: \"https://etherscan.io/tx/\"\n },\n [EcencyWalletCurrency.BNB]: {\n chainId: \"0x38\",\n name: \"BNB Smart Chain\",\n rpcUrl: \"https://bsc-dataseed.binance.org\",\n explorerUrl: \"https://bscscan.com/tx/\"\n }\n};\n\nexport function getEvmChainConfig(currency: EcencyWalletCurrency) {\n const config = EVM_CHAIN_CONFIG[currency];\n if (!config) throw new Error(`Unsupported EVM currency: ${currency}`);\n return config;\n}\n\nexport function getEvmExplorerUrl(currency: EcencyWalletCurrency, txHash: string) {\n return `${getEvmChainConfig(currency).explorerUrl}${txHash}`;\n}\n\nexport async function ensureEvmChain(currency: EcencyWalletCurrency): Promise {\n const ethereum = getEthereum();\n\n const { chainId, name, rpcUrl } = getEvmChainConfig(currency);\n const currentChainId = await ethereum.request({ method: \"eth_chainId\" });\n\n if (currentChainId === chainId) return;\n\n try {\n await ethereum.request({\n method: \"wallet_switchEthereumChain\",\n params: [{ chainId }]\n });\n } catch (err: unknown) {\n // Chain not added — add it\n if (typeof err === \"object\" && err !== null && \"code\" in err && (err as { code: number }).code === 4902) {\n await ethereum.request({\n method: \"wallet_addEthereumChain\",\n params: [{\n chainId,\n chainName: name,\n rpcUrls: [rpcUrl],\n nativeCurrency: {\n name: currency === EcencyWalletCurrency.ETH ? \"Ether\" : \"BNB\",\n symbol: currency === EcencyWalletCurrency.ETH ? \"ETH\" : \"BNB\",\n decimals: 18\n }\n }]\n });\n } else {\n throw err;\n }\n }\n}\n\nexport async function estimateEvmGas(\n from: string,\n to: string,\n valueHex: string,\n currency: EcencyWalletCurrency\n): Promise<{ gasLimit: string; gasPrice: string; estimatedFeeWei: bigint }> {\n const ethereum = getEthereum();\n\n await ensureEvmChain(currency);\n\n const [gasLimit, gasPrice] = await Promise.all([\n ethereum.request({\n method: \"eth_estimateGas\",\n params: [{ from, to, value: valueHex }]\n }),\n ethereum.request({ method: \"eth_gasPrice\" })\n ]);\n\n const estimatedFeeWei = BigInt(gasLimit) * BigInt(gasPrice);\n\n return { gasLimit, gasPrice, estimatedFeeWei };\n}\n\nexport function formatWei(wei: bigint, decimals = 6): string {\n const whole = wei / WEI_PER_ETH;\n const rem = wei % WEI_PER_ETH;\n if (rem === 0n) return whole.toString();\n\n const scale = 10n ** BigInt(decimals);\n const fractional = (rem * scale) / WEI_PER_ETH;\n const fracStr = fractional.toString().padStart(decimals, \"0\").replace(/0+$/, \"\");\n return fracStr ? `${whole}.${fracStr}` : whole.toString();\n}\n\nconst AMOUNT_REGEX = /^\\d+(\\.\\d+)?$/;\n\nexport function parseToWei(amount: string): string {\n const trimmed = amount.trim();\n if (!AMOUNT_REGEX.test(trimmed)) {\n throw new Error(`Invalid amount: \"${amount}\"`);\n }\n\n const [whole, fraction = \"\"] = trimmed.split(\".\");\n if (!/^\\d+$/.test(whole) || (fraction && !/^\\d+$/.test(fraction))) {\n throw new Error(`Invalid amount: \"${amount}\"`);\n }\n\n const paddedFraction = fraction.padEnd(18, \"0\").slice(0, 18);\n const wei = BigInt(whole) * WEI_PER_ETH + BigInt(paddedFraction);\n return \"0x\" + wei.toString(16);\n}\n\nexport async function sendEvmTransfer(\n to: string,\n amountWei: string,\n currency: EcencyWalletCurrency,\n expectedFrom?: string\n): Promise {\n const ethereum = getEthereum();\n\n await ensureEvmChain(currency);\n\n const accounts = await ethereum.request({ method: \"eth_requestAccounts\" });\n const from = accounts[0];\n if (!from) throw new Error(\"No MetaMask account connected\");\n\n // Funds safety: never send from an account other than the linked wallet. The\n // active MetaMask account can differ from the one the user linked (multiple\n // accounts, switched account, or access just granted to a different one). This\n // comparison is atomic with the account read above and is the single source of\n // truth for the EVM send. Throws a sentinel the caller maps to a message.\n if (expectedFrom && from.toLowerCase() !== expectedFrom.toLowerCase()) {\n throw new Error(\"ACCOUNT_MISMATCH\");\n }\n\n const txHash = await ethereum.request({\n method: \"eth_sendTransaction\",\n params: [{\n from,\n to,\n value: amountWei\n }]\n });\n\n return txHash;\n}\n","import { ConfigManager } from \"@ecency/sdk\";\n\nconst SOL_EXPLORER_URL = \"https://explorer.solana.com/tx/\";\nconst LAMPORTS_PER_SOL = 1_000_000_000n;\nconst AMOUNT_REGEX = /^\\d+(\\.\\d+)?$/;\n\nexport function getSolExplorerUrl(signature: string) {\n return `${SOL_EXPLORER_URL}${signature}`;\n}\n\nexport function parseToLamports(amount: string): bigint {\n const trimmed = amount.trim();\n if (!AMOUNT_REGEX.test(trimmed)) {\n throw new Error(`Invalid amount: \"${amount}\"`);\n }\n\n const [whole, fraction = \"\"] = trimmed.split(\".\");\n if (!/^\\d+$/.test(whole) || (fraction && !/^\\d+$/.test(fraction))) {\n throw new Error(`Invalid amount: \"${amount}\"`);\n }\n\n if (fraction.length > 9 && fraction.slice(9).replace(/0/g, \"\").length > 0) {\n throw new Error(`Amount has more than 9 decimal places: \"${amount}\"`);\n }\n\n const paddedFraction = fraction.padEnd(9, \"0\").slice(0, 9);\n return BigInt(whole) * LAMPORTS_PER_SOL + BigInt(paddedFraction);\n}\n\nexport function formatLamports(lamports: bigint, decimals = 6): string {\n const whole = lamports / LAMPORTS_PER_SOL;\n const rem = lamports % LAMPORTS_PER_SOL;\n if (rem === 0n) return whole.toString();\n\n const scale = 10n ** BigInt(decimals);\n const fractional = (rem * scale) / LAMPORTS_PER_SOL;\n const fracStr = fractional.toString().padStart(decimals, \"0\").replace(/0+$/, \"\");\n return fracStr ? `${whole}.${fracStr}` : whole.toString();\n}\n\ninterface JsonRpcResponse {\n jsonrpc: string;\n id: number | string;\n result?: T;\n error?: { code?: number; message?: string };\n}\n\n/**\n * Call a Solana JSON-RPC method via the Ecency private API proxy.\n * This avoids hitting the public Solana RPC directly from the browser\n * (which returns 403). The proxy forwards to a public Solana RPC node.\n */\nasync function solRpc(method: string, params: unknown[] = []): Promise {\n const baseUrl = ConfigManager.getValidatedBaseUrl();\n const response = await fetch(`${baseUrl}/private-api/rpc/sol`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ jsonrpc: \"2.0\", id: 1, method, params })\n });\n\n if (!response.ok) {\n const text = await response.text().catch(() => \"\");\n throw new Error(`SOL RPC ${method} failed: ${response.status} ${response.statusText}${text ? ` — ${text}` : \"\"}`);\n }\n\n const json: JsonRpcResponse = await response.json();\n if (json.error) {\n throw new Error(json.error.message || `SOL RPC ${method} failed`);\n }\n return json.result as T;\n}\n\nasync function getMetaMaskSolanaWallet(): Promise {\n const { getWallets } = await import(\"@wallet-standard/app\");\n const walletsApi = getWallets();\n const wallets = walletsApi.get();\n\n // Only select a MetaMask wallet that supports Solana signing\n const mmWallet = wallets.find(\n (w: any) =>\n w.name.toLowerCase().includes(\"metamask\") &&\n w.features[\"standard:connect\"] &&\n w.features[\"solana:signAndSendTransaction\"]\n );\n\n if (!mmWallet) {\n throw new Error(\"MetaMask Solana wallet not found. Enable Solana in MetaMask settings.\");\n }\n\n return mmWallet;\n}\n\nexport async function sendSolTransfer(\n to: string,\n amountSol: string\n): Promise {\n const mmWallet = await getMetaMaskSolanaWallet();\n\n // Connect to get accounts\n const connectFeature = mmWallet.features[\"standard:connect\"] as any;\n await connectFeature.connect();\n\n const solAccount = mmWallet.accounts?.find(\n (acc: any) => acc.chains?.some((c: string) => c.startsWith(\"solana:\"))\n );\n\n if (!solAccount) {\n throw new Error(\"No Solana account found in MetaMask.\");\n }\n\n // Use @solana/web3.js for transaction building (dynamic import to avoid bundle bloat)\n const { PublicKey, SystemProgram, Transaction } = await import(\"@solana/web3.js\");\n\n const fromPubkey = new PublicKey(solAccount.address);\n const toPubkey = new PublicKey(to);\n const lamports = parseToLamports(amountSol);\n\n const transaction = new Transaction().add(\n SystemProgram.transfer({\n fromPubkey,\n toPubkey,\n lamports\n })\n );\n\n // Fetch blockhash via Ecency RPC proxy (avoids 403 from public Solana RPC)\n const blockhashResult = await solRpc<{ value: { blockhash: string } }>(\n \"getLatestBlockhash\",\n [{ commitment: \"finalized\" }]\n );\n transaction.recentBlockhash = blockhashResult.value.blockhash;\n transaction.feePayer = fromPubkey;\n\n // Serialize the transaction for signing via Wallet Standard\n const serializedTx = transaction.serialize({\n requireAllSignatures: false,\n verifySignatures: false\n });\n\n const signAndSendFeature = mmWallet.features[\"solana:signAndSendTransaction\"] as any;\n if (!signAndSendFeature) {\n throw new Error(\"MetaMask does not support Solana transaction signing. Please update MetaMask.\");\n }\n\n const [result] = await signAndSendFeature.signAndSendTransaction({\n account: solAccount,\n transaction: serializedTx,\n chain: \"solana:mainnet\"\n });\n\n // Result contains the signature — either a string or Uint8Array\n if (typeof result.signature === \"string\") {\n return result.signature;\n }\n\n // Encode Uint8Array to base58 (standard Solana signature format)\n const { base58 } = await import(\"@scure/base\");\n return base58.encode(new Uint8Array(result.signature));\n}\n","import { EcencyWalletCurrency } from \"@/modules/wallets/enums\";\nimport { sendEvmTransfer, parseToWei } from \"@/modules/wallets/utils/metamask-evm-transfer\";\nimport { sendSolTransfer } from \"@/modules/wallets/utils/metamask-sol-transfer\";\nimport { useMutation, useQueryClient } from \"@tanstack/react-query\";\n\nexport type TransferableCurrency =\n | EcencyWalletCurrency.ETH\n | EcencyWalletCurrency.BNB\n | EcencyWalletCurrency.SOL;\n\ninterface ExternalTransferPayload {\n to: string;\n amount: string;\n /** EVM only: the linked wallet address. The send is blocked if the active\n * MetaMask account does not match it (funds safety). */\n expectedFrom?: string;\n}\n\nexport function useExternalTransfer(currency: TransferableCurrency) {\n const queryClient = useQueryClient();\n\n return useMutation({\n mutationKey: [\"ecency-wallets\", \"external-transfer\", currency],\n mutationFn: async ({ to, amount, expectedFrom }: ExternalTransferPayload) => {\n switch (currency) {\n case EcencyWalletCurrency.ETH:\n case EcencyWalletCurrency.BNB: {\n const valueHex = parseToWei(amount);\n const txHash = await sendEvmTransfer(to, valueHex, currency, expectedFrom);\n return { txHash, currency };\n }\n case EcencyWalletCurrency.SOL: {\n const signature = await sendSolTransfer(to, amount);\n return { txHash: signature, currency };\n }\n }\n },\n onSuccess: () => {\n queryClient.invalidateQueries({\n queryKey: [\"ecency-wallets\", \"external-wallet-balance\"]\n });\n }\n });\n}\n","// @scure/bip39 (same @noble/@scure family as @scure/bip32 used below).\n// mnemonicToSeedSync is pure PBKDF2-HMAC-SHA512 over the mnemonic string — it\n// uses no wordlist, so this is byte-identical to bip39's output (verified\n// against BIP39 test vectors) while dropping bip39's ~164KB of 10 bundled\n// language wordlists from the app bundle.\nimport { mnemonicToSeedSync } from \"@scure/bip39\";\nimport { HDKey } from \"@scure/bip32\";\nimport { PrivateKey } from \"@ecency/sdk\";\n\nexport type HiveRole = \"owner\" | \"active\" | \"posting\" | \"memo\";\n\nconst ROLE_INDEX: Record = {\n owner: 0,\n active: 1,\n posting: 2,\n memo: 3,\n};\n\nexport function deriveHiveKey(\n mnemonic: string,\n role: HiveRole,\n accountIndex = 0\n) {\n const seed = mnemonicToSeedSync(mnemonic);\n const master = HDKey.fromMasterSeed(seed);\n const path = `m/44'/3054'/${accountIndex}'/0'/${ROLE_INDEX[role]}'`;\n const child = master.derive(path);\n if (!child.privateKey) {\n throw new Error(\"[Ecency][Wallets] - hive key derivation failed\");\n }\n const pk = PrivateKey.from(Buffer.from(child.privateKey));\n return {\n privateKey: pk.toString(),\n publicKey: pk.createPublic().toString(),\n } as const;\n}\n\nexport function deriveHiveKeys(\n mnemonic: string,\n accountIndex = 0\n) {\n const owner = deriveHiveKey(mnemonic, \"owner\", accountIndex);\n const active = deriveHiveKey(mnemonic, \"active\", accountIndex);\n const posting = deriveHiveKey(mnemonic, \"posting\", accountIndex);\n const memo = deriveHiveKey(mnemonic, \"memo\", accountIndex);\n return {\n owner: owner.privateKey,\n active: active.privateKey,\n posting: posting.privateKey,\n memo: memo.privateKey,\n ownerPubkey: owner.publicKey,\n activePubkey: active.publicKey,\n postingPubkey: posting.publicKey,\n memoPubkey: memo.publicKey,\n } as const;\n}\n\n","import { PrivateKey } from \"@ecency/sdk\";\nimport type { HiveRole } from \"./derive-hive-bip44-keys\";\n\nexport function deriveHiveMasterPasswordKey(\n username: string,\n masterPassword: string,\n role: HiveRole\n) {\n const pk = PrivateKey.fromLogin(username, masterPassword, role);\n return {\n privateKey: pk.toString(),\n publicKey: pk.createPublic().toString(),\n } as const;\n}\n\nexport function deriveHiveMasterPasswordKeys(\n username: string,\n masterPassword: string\n) {\n const owner = deriveHiveMasterPasswordKey(username, masterPassword, \"owner\");\n const active = deriveHiveMasterPasswordKey(username, masterPassword, \"active\");\n const posting = deriveHiveMasterPasswordKey(\n username,\n masterPassword,\n \"posting\"\n );\n const memo = deriveHiveMasterPasswordKey(username, masterPassword, \"memo\");\n return {\n owner: owner.privateKey,\n active: active.privateKey,\n posting: posting.privateKey,\n memo: memo.privateKey,\n ownerPubkey: owner.publicKey,\n activePubkey: active.publicKey,\n postingPubkey: posting.publicKey,\n memoPubkey: memo.publicKey,\n } as const;\n}\n","import { CONFIG, FullAccount, getAccountFullQueryOptions, PrivateKey } from \"@ecency/sdk\";\nimport { deriveHiveKeys } from \"./derive-hive-bip44-keys\";\n\nexport type HiveKeyDerivation = \"bip44\" | \"master-password\" | \"unknown\";\n\nexport async function detectHiveKeyDerivation(\n username: string,\n seed: string,\n type: \"active\" | \"owner\" = \"active\"\n): Promise {\n const uname = username.trim().toLowerCase();\n\n // ensure we actually have data\n const account = (await CONFIG.queryClient.fetchQuery(\n getAccountFullQueryOptions(uname)\n )) as FullAccount | null;\n if (!account) {\n throw new Error(\"[SDK][Wallets] – no account found for key derivation\");\n }\n\n // pick the right authority based on `type`\n const auth = account[type];\n\n // --- BIP44 check (match selected authority) ---\n // The input may be a legacy master password (or any non-mnemonic string),\n // which @scure/bip39 rejects with \"Invalid mnemonic\". The previous bip39 ran\n // PBKDF2 over any string and produced a (non-matching) seed here, so guard the\n // BIP44 probe and fall through to the master-password check on failure —\n // otherwise master-password logins/signing abort before authenticating.\n let matchBip44 = false;\n try {\n const bip44 = deriveHiveKeys(seed);\n const bip44Pub = type === \"owner\" ? bip44.ownerPubkey : bip44.activePubkey;\n matchBip44 = auth.key_auths.some(([pub]) => String(pub) === bip44Pub);\n } catch {\n // not a valid BIP39 mnemonic -> not a BIP44 seed\n }\n if (matchBip44) return \"bip44\";\n\n // --- Master password (legacy) check (match selected authority) ---\n const legacyPub = PrivateKey.fromLogin(uname, seed, type)\n .createPublic()\n .toString();\n\n const matchLegacy = auth.key_auths.some(([pub]) => String(pub) === legacyPub);\n if (matchLegacy) return \"master-password\";\n\n return \"unknown\";\n}\n","import { EcencyWalletCurrency } from \"@/modules/wallets/enums\";\n\nexport type WalletAddressMap = Partial>;\n\n/** Chain prefixes we look for in Wallet Standard accounts */\nconst CHAIN_PREFIX_MAP: Record = {\n \"solana:\": EcencyWalletCurrency.SOL,\n \"bip122:\": EcencyWalletCurrency.BTC\n};\n\nconst HIVE_SNAP_ID = \"npm:@hiveio/metamask-snap\";\n\nexport interface HivePublicKey {\n publicKey: string;\n role?: string;\n accountIndex: number;\n addressIndex: number;\n}\n\ninterface WalletStandardWallet {\n name: string;\n chains: readonly string[];\n features: Record;\n accounts: ReadonlyArray<{\n address: string;\n chains: readonly string[];\n }>;\n}\n\n/**\n * Fetch non-EVM addresses from MetaMask via the Wallet Standard protocol.\n *\n * MetaMask registers non-EVM wallets (Solana, Bitcoin) as separate Wallet Standard\n * wallets — they are NOT accessible through window.ethereum (EVM-only provider).\n */\nexport async function fetchMultichainAddresses(): Promise {\n const addresses: WalletAddressMap = {};\n\n try {\n const { getWallets } = await import(\"@wallet-standard/app\");\n const walletsApi = getWallets();\n const wallets = walletsApi.get();\n\n // Iterate ALL MetaMask wallet registrations — MetaMask may expose\n // separate entries per chain (e.g., one for Solana, one for Bitcoin)\n const mmWallets = wallets.filter(\n (w: WalletStandardWallet) =>\n w.name.toLowerCase().includes(\"metamask\") &&\n w.features[\"standard:connect\"]\n ) as WalletStandardWallet[];\n\n for (const mmWallet of mmWallets) {\n try {\n const connectFeature = mmWallet.features[\"standard:connect\"] as\n { connect: () => Promise };\n await connectFeature.connect();\n } catch (connectErr) {\n if (process.env.NODE_ENV === \"development\") {\n console.log(\"[MetaMask multichain] wallet connect failed, trying next:\", connectErr);\n }\n continue;\n }\n\n for (const account of mmWallet.accounts ?? []) {\n if (!account.address || !Array.isArray(account.chains)) continue;\n\n for (const [prefix, currency] of Object.entries(CHAIN_PREFIX_MAP)) {\n if (addresses[currency]) continue;\n if (account.chains.some((c: string) => c.startsWith(prefix))) {\n addresses[currency] = account.address;\n }\n }\n }\n }\n } catch (e) {\n if (process.env.NODE_ENV === \"development\") {\n console.log(\"[MetaMask multichain] wallet standard discovery failed:\", e);\n }\n }\n\n return addresses;\n}\n\n/**\n * Fetch the EVM address from MetaMask via window.ethereum.\n * Returns the first connected account address, or undefined on failure.\n */\nexport async function fetchEvmAddress(): Promise {\n if (typeof window === \"undefined\" || !window.ethereum?.isMetaMask) return undefined;\n\n try {\n const accounts = await window.ethereum.request({\n method: \"eth_requestAccounts\"\n }) as string[] | undefined;\n\n return accounts?.[0] ?? undefined;\n } catch {\n return undefined;\n }\n}\n\n/**\n * Discover all wallet addresses from MetaMask (EVM + non-EVM).\n * Returns a map of currency -> address. Partial results are returned on failure.\n */\nexport async function discoverMetaMaskWallets(): Promise {\n const addresses: WalletAddressMap = {};\n\n // EVM address (shared for ETH + BNB)\n const evmAddress = await fetchEvmAddress();\n if (evmAddress) {\n addresses[EcencyWalletCurrency.ETH] = evmAddress;\n addresses[EcencyWalletCurrency.BNB] = evmAddress;\n }\n\n // Non-EVM addresses via Wallet Standard\n const multichainAddresses = await fetchMultichainAddresses();\n Object.assign(addresses, multichainAddresses);\n\n return addresses;\n}\n\n/**\n * Install the Hive Snap in MetaMask.\n */\nexport async function installHiveSnap(): Promise {\n if (typeof window === \"undefined\" || !window.ethereum) {\n throw new Error(\"MetaMask is not available\");\n }\n await window.ethereum.request({\n method: \"wallet_requestSnaps\",\n params: { [HIVE_SNAP_ID]: {} }\n });\n}\n\n/**\n * Get Hive public keys from the MetaMask Hive Snap.\n * Returns owner, active, posting, and memo public keys.\n */\nexport async function getHivePublicKeys(): Promise {\n if (typeof window === \"undefined\" || !window.ethereum) {\n throw new Error(\"MetaMask is not available\");\n }\n\n const result = await window.ethereum.request({\n method: \"wallet_invokeSnap\",\n params: {\n snapId: HIVE_SNAP_ID,\n request: {\n method: \"hive_getPublicKeys\",\n params: {\n keys: [\n { role: \"owner\", accountIndex: 0 },\n { role: \"active\", accountIndex: 0 },\n { role: \"posting\", accountIndex: 0 },\n { role: \"memo\", accountIndex: 0 }\n ]\n }\n }\n }\n }) as { publicKeys?: unknown } | undefined;\n\n const keys = result?.publicKeys;\n if (!Array.isArray(keys)) {\n throw new Error(\"Hive Snap returned invalid response — expected publicKeys array\");\n }\n\n return keys as HivePublicKey[];\n}\n","import { rememberScryptBsvVersion } from \"./internal/scrypt-guard\";\n\nrememberScryptBsvVersion();\n\nexport * from \"./modules/wallets\";\nexport * from \"./modules/assets\";\n"]} \ No newline at end of file +{"version":3,"sources":["../../src/internal/scrypt-guard.ts","../../src/modules/wallets/enums/ecency-wallet-currency.ts","../../src/modules/wallets/enums/ecency-wallet-basic-tokens.ts","../../src/modules/wallets/mutations/private-api/index.ts","../../src/modules/wallets/utils/get-bound-fetch.ts","../../src/modules/wallets/mutations/private-api/create-account-with-wallets.ts","../../src/modules/wallets/mutations/private-api/check-wallet-existence.ts","../../src/modules/wallets/mutations/private-api/update-account-with-wallets.ts","../../src/modules/wallets/queries/use-get-external-wallet-query.ts","../../src/modules/wallets/queries/get-token-price-query-options.ts","../../src/modules/wallets/queries/get-all-tokens-list-query-options.ts","../../src/modules/wallets/queries/use-get-account-wallet-list-query.ts","../../src/modules/wallets/queries/get-tokens-operations-query-options.ts","../../src/modules/wallets/mutations/save-wallet-information-to-metadata.ts","../../src/modules/wallets/utils/metamask-evm-transfer.ts","../../src/modules/wallets/utils/metamask-sol-transfer.ts","../../src/modules/wallets/mutations/use-external-transfer.ts","../../src/modules/wallets/utils/derive-hive-bip44-keys.ts","../../src/modules/wallets/utils/derive-hive-master-password-keys.ts","../../src/modules/wallets/utils/detect-hive-key-derivation.ts","../../src/modules/wallets/utils/metamask-discovery.ts","../../src/index.ts"],"names":["EcencyWalletCurrency","EcencyWalletBasicTokens","useMutation","ConfigManager","useQuery","LRUCache","queryOptions","getQueryClient","getHiveEngineTokensBalancesQueryOptions","getHiveEngineTokensMetadataQueryOptions","getPortfolioQueryOptions","getAccountFullQueryOptions","AssetOperation","R","options","useQueryClient","useAccountUpdate","AMOUNT_REGEX","mnemonicToSeedSync","HDKey","PrivateKey","CONFIG"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * The scrypt bsv package writes the version string to a global symbol and\n * warns when that symbol is already populated. In environments that reload\n * modules (Next.js dev server, Storybook, etc.) the stale value triggers\n * repeated warnings. Clearing the cached handle before our modules touch bsv\n * keeps the console quiet without requiring downstream wrappers.\n *\n * Similarly, bitcore-lib and bitcore-lib-inquisition check for duplicate instances\n * using global variables and throw errors when detected. We clear these globals\n * to prevent false positives in module reloading scenarios.\n */\nconst globalLike = globalThis as Record & {\n _scrypt_bsv?: unknown;\n __scryptBsvPreviousVersion?: unknown;\n _bitcore?: unknown;\n __bitcorePreviousVersion?: unknown;\n};\n\nif (typeof globalLike._scrypt_bsv !== \"undefined\") {\n if (typeof globalLike._scrypt_bsv === \"string\") {\n globalLike.__scryptBsvPreviousVersion = globalLike._scrypt_bsv;\n }\n\n try {\n delete globalLike._scrypt_bsv;\n } catch {\n globalLike._scrypt_bsv = undefined;\n }\n}\n\n// Clear bitcore-lib global to prevent \"more than one instance\" errors\nif (typeof globalLike._bitcore !== \"undefined\") {\n if (typeof globalLike._bitcore === \"object\") {\n globalLike.__bitcorePreviousVersion = globalLike._bitcore;\n }\n\n try {\n delete globalLike._bitcore;\n } catch {\n globalLike._bitcore = undefined;\n }\n}\n\nexport function rememberScryptBsvVersion() {\n if (typeof globalLike._scrypt_bsv === \"string\") {\n globalLike.__scryptBsvPreviousVersion = globalLike._scrypt_bsv;\n }\n\n // Also remember bitcore version if it exists\n if (typeof globalLike._bitcore === \"object\") {\n globalLike.__bitcorePreviousVersion = globalLike._bitcore;\n }\n}\n","export enum EcencyWalletCurrency {\n BTC = \"BTC\",\n ETH = \"ETH\",\n BNB = \"BNB\",\n SOL = \"SOL\",\n}\n","export enum EcencyWalletBasicTokens {\n Points = \"POINTS\",\n HivePower = \"HP\",\n Hive = \"HIVE\",\n HiveDollar = \"HBD\"\n}\n","export * from \"./create-account-with-wallets\";\nexport * from \"./check-wallet-existence\";\nexport * from \"./update-account-with-wallets\";\n","let cachedFetch: typeof globalThis.fetch | undefined;\n\nexport function getBoundFetch() {\n if (!cachedFetch) {\n if (typeof globalThis.fetch !== \"function\") {\n throw new Error(\"[Ecency][Wallets] - global fetch is not available\");\n }\n\n cachedFetch = globalThis.fetch.bind(globalThis);\n }\n\n return cachedFetch;\n}\n","import { ConfigManager } from \"@ecency/sdk\";\nimport { EcencyWalletCurrency } from \"@/modules/wallets/enums\";\nimport { getBoundFetch } from \"@/modules/wallets/utils/get-bound-fetch\";\nimport { useMutation } from \"@tanstack/react-query\";\n\ninterface HiveKeys {\n ownerPublicKey?: string;\n activePublicKey?: string;\n postingPublicKey?: string;\n memoPublicKey?: string;\n}\n\ninterface Payload {\n currency: EcencyWalletCurrency;\n address: string;\n hiveKeys?: HiveKeys;\n walletAddresses?: Partial>;\n}\n\nexport function useCreateAccountWithWallets(username: string) {\n const fetchApi = getBoundFetch();\n\n return useMutation({\n mutationKey: [\"ecency-wallets\", \"create-account-with-wallets\", username],\n mutationFn: async ({ currency, address, hiveKeys, walletAddresses }: Payload) => {\n const addresses: Record = {};\n if (walletAddresses) {\n for (const [k, v] of Object.entries(walletAddresses)) {\n if (v) addresses[k] = v;\n }\n }\n\n const response = await fetchApi(`${ConfigManager.getValidatedBaseUrl()}/private-api/wallets-add`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n username,\n token: currency,\n address,\n meta: {\n ...hiveKeys,\n ...addresses,\n [currency]: address\n },\n }),\n });\n\n if (!response.ok) {\n throw new Error(`Account creation failed (${response.status})`);\n }\n\n return response;\n },\n });\n}\n","import { ConfigManager } from \"@ecency/sdk\";\nimport { EcencyWalletCurrency } from \"@/modules/wallets/enums\";\nimport { useMutation } from \"@tanstack/react-query\";\n\ninterface Payload {\n address: string;\n currency: EcencyWalletCurrency;\n}\n\nexport function useCheckWalletExistence() {\n return useMutation({\n mutationKey: [\"ecency-wallets\", \"check-wallet-existence\"],\n mutationFn: async ({ address, currency }: Payload) => {\n const response = await fetch(\n `${ConfigManager.getValidatedBaseUrl()}/private-api/wallets-exist`,\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n address,\n token: currency,\n }),\n }\n );\n const data = await response.json();\n return data.length === 0;\n },\n });\n}\n","import { ConfigManager } from \"@ecency/sdk\";\nimport { useMutation } from \"@tanstack/react-query\";\nimport { getBoundFetch } from \"@/modules/wallets/utils/get-bound-fetch\";\n\ninterface Payload {\n tokens: Record;\n hiveKeys: {\n ownerPublicKey: string;\n activePublicKey: string;\n postingPublicKey: string;\n memoPublicKey: string;\n };\n}\n\nexport function useUpdateAccountWithWallets(\n username: string,\n accessToken: string | undefined\n) {\n const fetchApi = getBoundFetch();\n\n return useMutation({\n mutationKey: [\"ecency-wallets\", \"update-account-with-wallets\", username],\n mutationFn: async ({ tokens, hiveKeys }: Payload) => {\n const entries = Object.entries(tokens).filter(([, address]) => Boolean(address));\n\n if (entries.length === 0) {\n return new Response(null, { status: 204 });\n }\n\n const [primaryToken, primaryAddress] = entries[0] ?? [\"\", \"\"];\n\n if (!accessToken) {\n throw new Error(\n \"[SDK][Wallets][PrivateApi][WalletsAdd] – access token wasn`t found\"\n );\n }\n\n const response = await fetchApi(`${ConfigManager.getValidatedBaseUrl()}/private-api/wallets-add`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n username,\n code: accessToken,\n token: primaryToken,\n address: primaryAddress,\n status: 3,\n meta: {\n ...Object.fromEntries(entries),\n ownerPublicKey: hiveKeys.ownerPublicKey,\n activePublicKey: hiveKeys.activePublicKey,\n postingPublicKey: hiveKeys.postingPublicKey,\n memoPublicKey: hiveKeys.memoPublicKey,\n },\n }),\n });\n\n // Raw fetch resolves on 4xx/5xx; guard so a failed wallet-add doesn't run\n // onSuccess as if the account had been updated.\n if (!response.ok) {\n throw new Error(\n `[SDK][Wallets][PrivateApi][WalletsAdd] – request failed: ${response.status}`\n );\n }\n\n return response;\n },\n });\n}\n","import { EcencyWalletCurrency } from \"@/modules/wallets/enums\";\nimport { ConfigManager } from \"@ecency/sdk\";\nimport { useQuery } from \"@tanstack/react-query\";\n\nconst currencyChainMap: Record = {\n [EcencyWalletCurrency.BTC]: \"btc\",\n [EcencyWalletCurrency.ETH]: \"eth\",\n [EcencyWalletCurrency.BNB]: \"bnb\",\n [EcencyWalletCurrency.SOL]: \"sol\",\n};\n\ninterface PrivateApiBalanceResponse {\n chain: string;\n balance: number | string;\n unit: string;\n raw?: unknown;\n nodeId?: string;\n}\n\nexport interface ExternalWalletBalance {\n chain: string;\n unit: string;\n raw?: unknown;\n nodeId?: string;\n /**\n * Balance represented as a BigInt for convenience.\n */\n balanceBigInt: bigint;\n /**\n * Balance returned as a string to preserve precision for UIs that cannot\n * handle bigint values directly.\n */\n balanceString: string;\n}\n\nfunction normalizeBalance(balance: number | string): string {\n if (typeof balance === \"number\") {\n if (!Number.isFinite(balance)) {\n throw new Error(\"Private API returned a non-finite numeric balance\");\n }\n\n return Math.trunc(balance).toString();\n }\n\n if (typeof balance === \"string\") {\n const trimmed = balance.trim();\n\n if (trimmed === \"\") {\n throw new Error(\"Private API returned an empty balance string\");\n }\n\n return trimmed;\n }\n\n throw new Error(\"Private API returned balance in an unexpected format\");\n}\n\nfunction parsePrivateApiBalance(\n result: unknown,\n expectedChain: string\n): ExternalWalletBalance {\n if (!result || typeof result !== \"object\") {\n throw new Error(\"Private API returned an unexpected response\");\n }\n\n const { chain, balance, unit, raw, nodeId } =\n result as PrivateApiBalanceResponse;\n\n if (typeof chain !== \"string\" || chain !== expectedChain) {\n throw new Error(\"Private API response chain did not match request\");\n }\n\n if (typeof unit !== \"string\" || unit.length === 0) {\n throw new Error(\"Private API response is missing unit information\");\n }\n\n if (balance === undefined || balance === null) {\n throw new Error(\"Private API response is missing balance information\");\n }\n\n const balanceString = normalizeBalance(balance);\n\n let balanceBigInt: bigint;\n\n try {\n balanceBigInt = BigInt(balanceString);\n } catch (error) {\n throw new Error(\"Private API returned a balance that is not an integer\");\n }\n\n return {\n chain,\n unit,\n raw,\n nodeId:\n typeof nodeId === \"string\" && nodeId.length > 0 ? nodeId : undefined,\n balanceBigInt,\n balanceString,\n };\n}\n\nexport function useGetExternalWalletBalanceQuery(\n currency: EcencyWalletCurrency,\n address: string\n) {\n return useQuery({\n queryKey: [\"ecency-wallets\", \"external-wallet-balance\", currency, address],\n queryFn: async () => {\n const chain = currencyChainMap[currency];\n\n if (!chain) {\n throw new Error(`Unsupported currency ${currency}`);\n }\n\n const baseUrl = `${ConfigManager.getValidatedBaseUrl()}/private-api/balance/${chain}/${encodeURIComponent(\n address\n )}`;\n\n let primaryResponse: Response | undefined;\n let primaryError: unknown;\n\n try {\n primaryResponse = await fetch(baseUrl);\n } catch (error) {\n primaryError = error;\n }\n\n let response = primaryResponse;\n\n if (!response || !response.ok) {\n const fallbackUrl = `${baseUrl}?provider=chainz`;\n let fallbackError: unknown;\n\n try {\n const fallbackResponse = await fetch(fallbackUrl);\n\n if (fallbackResponse.ok) {\n response = fallbackResponse;\n } else {\n fallbackError = new Error(\n `Fallback provider responded with status ${fallbackResponse.status}`\n );\n }\n } catch (error) {\n fallbackError = error;\n }\n\n if (!response || !response.ok) {\n const failureReasons: string[] = [];\n\n if (primaryError) {\n const message =\n primaryError instanceof Error\n ? primaryError.message\n : String(primaryError);\n failureReasons.push(`primary provider failed: ${message}`);\n } else if (primaryResponse && !primaryResponse.ok) {\n failureReasons.push(\n `primary provider status ${primaryResponse.status}`\n );\n }\n\n if (fallbackError) {\n const message =\n fallbackError instanceof Error\n ? fallbackError.message\n : String(fallbackError);\n failureReasons.push(`fallback provider failed: ${message}`);\n }\n\n if (failureReasons.length === 0) {\n failureReasons.push(\"unknown error\");\n }\n\n throw new Error(\n `Private API request failed (${failureReasons.join(\", \")})`\n );\n }\n }\n\n const result = (await response.json()) as unknown;\n\n return parsePrivateApiBalance(result, chain);\n },\n });\n}\n","import { ConfigManager } from \"@ecency/sdk\";\nimport { EcencyWalletCurrency } from \"@/modules/wallets/enums\";\nimport { queryOptions } from \"@tanstack/react-query\";\nimport { LRUCache } from \"lru-cache\";\n\nconst options = {\n max: 500,\n // how long to live in ms\n ttl: 1000 * 60 * 5,\n // return stale items before removing from cache?\n allowStale: false,\n updateAgeOnGet: false,\n updateAgeOnHas: false,\n};\n\nconst cache = new LRUCache(options);\nconst undefinedValue = Symbol(\"undefined\");\n\nconst cacheSet = (key: string, value: any) =>\n cache.set(key, value === undefined ? undefinedValue : value);\n\nconst cacheGet = (key: string) => {\n const v = cache.get(key);\n return v === undefinedValue ? undefined : v;\n};\n\ninterface MarketDataQuote {\n last_updated: string;\n percent_change: number;\n price: number;\n}\n\ninterface MarketDataLatestResponse {\n [token: string]: {\n quotes?: {\n usd?: MarketDataQuote;\n btc?: MarketDataQuote;\n [fiat: string]: MarketDataQuote | undefined;\n };\n };\n}\n\nconst CURRENCY_TO_TOKEN_MAP: Record = {\n [EcencyWalletCurrency.BTC]: \"btc\",\n [EcencyWalletCurrency.ETH]: \"eth\",\n [EcencyWalletCurrency.SOL]: \"sol\",\n [EcencyWalletCurrency.BNB]: \"bnb\",\n HBD: \"hbd\",\n HIVE: \"hive\",\n};\n\nconst MARKET_DATA_CACHE_KEY = \"market-data/latest\";\n\nconst normalizeCurrencyToToken = (currency: string) => {\n const upperCased = currency.toUpperCase();\n return CURRENCY_TO_TOKEN_MAP[upperCased] ?? currency.toLowerCase();\n};\n\nexport function getTokenPriceQueryOptions(currency?: string) {\n return queryOptions({\n queryKey: [\"ecency-wallets\", \"market-data\", currency],\n queryFn: async () => {\n if (!currency) {\n throw new Error(\n \"[SDK][Wallets][MarketData] – currency wasn`t provided\"\n );\n }\n\n const token = normalizeCurrencyToToken(currency);\n const baseUrl = ConfigManager.getValidatedBaseUrl();\n\n let marketData = cacheGet(MARKET_DATA_CACHE_KEY) as\n | MarketDataLatestResponse\n | undefined;\n\n if (!marketData) {\n const httpResponse = await fetch(\n `${baseUrl}/private-api/market-data/latest`,\n {\n method: \"GET\",\n }\n );\n\n if (!httpResponse.ok) {\n throw new Error(\n `[SDK][Wallets][MarketData] – failed to fetch latest market data (${httpResponse.status})`\n );\n }\n\n const data = (await httpResponse.json()) as MarketDataLatestResponse;\n cacheSet(MARKET_DATA_CACHE_KEY, data);\n marketData = data;\n }\n\n const tokenData = marketData[token];\n\n if (!tokenData) {\n throw new Error(\n `[SDK][Wallets][MarketData] – missing market data for token: ${token}`\n );\n }\n\n const usdQuote = tokenData.quotes?.usd;\n\n if (!usdQuote) {\n throw new Error(\n `[SDK][Wallets][MarketData] – missing USD quote for token: ${token}`\n );\n }\n\n return Number(usdQuote.price);\n },\n enabled: !!currency,\n });\n}\n","import {\n getHiveEngineTokensBalancesQueryOptions,\n getHiveEngineTokensMetadataQueryOptions,\n} from \"@/modules/assets\";\nimport {\n HiveEngineTokenBalance,\n HiveEngineTokenMetadataResponse,\n} from \"@/modules/assets/hive-engine/types\";\nimport { getQueryClient } from \"@ecency/sdk\";\nimport { queryOptions } from \"@tanstack/react-query\";\nimport { EcencyWalletBasicTokens, EcencyWalletCurrency } from \"../enums\";\n\nfunction createFallbackTokenMetadata(symbol: string): HiveEngineTokenMetadataResponse {\n return {\n issuer: \"\",\n symbol,\n name: symbol,\n metadata: \"{}\",\n precision: 0,\n maxSupply: \"0\",\n supply: \"0\",\n circulatingSupply: \"0\",\n stakingEnabled: false,\n unstakingCooldown: 0,\n delegationEnabled: false,\n undelegationCooldown: 0,\n numberTransactions: 0,\n totalStaked: \"0\",\n };\n}\n\nasync function getLayer2TokensMetadata(username?: string) {\n if (!username) {\n return [] as HiveEngineTokenMetadataResponse[];\n }\n\n let balances: HiveEngineTokenBalance[] = [];\n\n try {\n balances = await getQueryClient().fetchQuery(\n getHiveEngineTokensBalancesQueryOptions(username)\n );\n } catch {\n balances = [];\n }\n\n const uniqueSymbols = Array.from(\n new Set(\n balances\n .map((balance) => balance.symbol)\n .filter((symbol): symbol is string => Boolean(symbol))\n )\n );\n\n if (uniqueSymbols.length === 0) {\n return [] as HiveEngineTokenMetadataResponse[];\n }\n\n let metadataList: HiveEngineTokenMetadataResponse[] = [];\n\n try {\n metadataList = await getQueryClient().fetchQuery(\n getHiveEngineTokensMetadataQueryOptions(uniqueSymbols)\n );\n } catch {\n metadataList = [];\n }\n\n const metadataBySymbol = new Map(\n metadataList.map((token) => [token.symbol, token])\n );\n\n return uniqueSymbols.map(\n (symbol) => metadataBySymbol.get(symbol) ?? createFallbackTokenMetadata(symbol)\n );\n}\n\nexport function getAllTokensListQueryOptions(username?: string) {\n return queryOptions({\n queryKey: [\"ecency-wallets\", \"all-tokens-list\", username ?? null],\n queryFn: async () => {\n return {\n basic: [\n EcencyWalletBasicTokens.Points,\n EcencyWalletBasicTokens.Hive,\n EcencyWalletBasicTokens.HivePower,\n EcencyWalletBasicTokens.HiveDollar,\n ],\n external: Object.values(EcencyWalletCurrency),\n layer2: await getLayer2TokensMetadata(username),\n };\n },\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { EcencyWalletBasicTokens } from \"../enums\";\nimport {\n AccountProfile,\n FullAccount,\n getAccountFullQueryOptions,\n getQueryClient,\n getPortfolioQueryOptions,\n type PortfolioResponse,\n type PortfolioWalletItem,\n} from \"@ecency/sdk\";\n\ntype ProfileTokens = AccountProfile[\"tokens\"];\ntype ProfileToken = NonNullable[number];\n\nfunction normalizeAccountTokens(tokens: ProfileTokens): ProfileToken[] {\n if (Array.isArray(tokens)) {\n return tokens.filter(Boolean) as ProfileToken[];\n }\n\n if (tokens && typeof tokens === \"object\") {\n return Object.values(tokens).flatMap((value) =>\n Array.isArray(value) ? (value.filter(Boolean) as ProfileToken[]) : []\n );\n }\n\n return [];\n}\n\nconst BASIC_TOKENS: string[] = [\n EcencyWalletBasicTokens.Points,\n EcencyWalletBasicTokens.Hive,\n EcencyWalletBasicTokens.HivePower,\n EcencyWalletBasicTokens.HiveDollar,\n];\n\n// Tokens whose support has been removed. Stale profile.tokens entries and\n// portfolio responses may still reference them, so they are always hidden.\nconst REMOVED_TOKENS = new Set([\"SPK\", \"LARYNX\", \"LP\", \"BROCA\"]);\n\nexport function getAccountWalletListQueryOptions(username: string, currency: string = \"usd\") {\n return queryOptions({\n queryKey: [\"ecency-wallets\", \"list\", username, currency],\n enabled: !!username,\n queryFn: async () => {\n const portfolioQuery = getPortfolioQueryOptions(username, currency, true);\n const queryClient = getQueryClient();\n const accountQuery = getAccountFullQueryOptions(username);\n\n let account: FullAccount | undefined;\n\n try {\n account = (await queryClient.fetchQuery(accountQuery)) ?? undefined;\n } catch {\n // Best effort; fall back to defaults if account metadata is not available.\n }\n\n const tokenVisibility = new Map();\n\n const accountTokens = normalizeAccountTokens(account?.profile?.tokens);\n\n accountTokens.forEach((token: ProfileToken) => {\n const symbol = token.symbol?.toUpperCase?.();\n\n if (!symbol) {\n return;\n }\n\n const showValue = (token as any)?.meta?.show;\n\n if (typeof showValue === \"boolean\") {\n tokenVisibility.set(symbol, showValue);\n }\n });\n\n const isTokenVisible = (symbol?: string) => {\n const normalized = symbol?.toUpperCase();\n\n if (!normalized) {\n return false;\n }\n\n if (REMOVED_TOKENS.has(normalized)) {\n return false;\n }\n\n if (BASIC_TOKENS.includes(normalized)) {\n return true;\n }\n\n return tokenVisibility.get(normalized) === true;\n };\n\n try {\n const portfolio: PortfolioResponse = await queryClient.fetchQuery(portfolioQuery);\n const tokensFromPortfolio: string[] = portfolio.wallets.map(\n (asset: PortfolioWalletItem) => asset.symbol\n );\n\n if (tokensFromPortfolio.length > 0) {\n const visibleTokens = tokensFromPortfolio\n .map((token: string) => token?.toUpperCase?.())\n .filter((token: string | undefined): token is string => Boolean(token))\n .filter(isTokenVisible);\n\n if (visibleTokens.length > 0) {\n // Always include basic tokens (HP, HIVE, HBD, POINTS) even if\n // the portfolio API omits them from its response.\n return Array.from(new Set([...BASIC_TOKENS, ...visibleTokens]));\n }\n }\n } catch {\n // Fallback to legacy behaviour when the portfolio endpoint is not accessible.\n }\n\n if (accountTokens.length > 0) {\n const list = [\n ...BASIC_TOKENS,\n ...accountTokens\n .map((token: ProfileToken) => token.symbol)\n .filter(isTokenVisible),\n ];\n\n return Array.from(new Set(list).values());\n }\n\n return [...BASIC_TOKENS];\n },\n });\n}\n","import { AssetOperation } from \"@/modules/assets\";\nimport {\n getQueryClient,\n getPortfolioQueryOptions,\n type PortfolioResponse,\n type PortfolioWalletItem,\n} from \"@ecency/sdk\";\nimport { queryOptions } from \"@tanstack/react-query\";\n\nexport function getTokenOperationsQueryOptions(\n token: string,\n username: string,\n isForOwner = false,\n currency: string = \"usd\"\n) {\n return queryOptions({\n queryKey: [\"wallets\", \"token-operations\", token, username, isForOwner, currency],\n queryFn: async () => {\n const queryClient = getQueryClient();\n const normalizedToken = token.toUpperCase();\n\n if (!username || !isForOwner) {\n return [] as AssetOperation[];\n }\n\n try {\n const portfolio: PortfolioResponse = await queryClient.fetchQuery(\n getPortfolioQueryOptions(username, currency, true)\n );\n const assetEntry = portfolio.wallets.find(\n (assetItem: PortfolioWalletItem) => assetItem.symbol.toUpperCase() === normalizedToken\n );\n\n if (!assetEntry) {\n return [] as AssetOperation[];\n }\n\n // Extract action IDs and map to AssetOperation enums\n const rawActions: Array<{ id: string; [key: string]: unknown }> = assetEntry.actions ?? [];\n const operations: AssetOperation[] = rawActions\n .map((action: { id: string; [key: string]: unknown } | string) => {\n // Extract the id field from action object\n if (typeof action === \"string\") return action;\n if (action && typeof action === \"object\") {\n const record = action as Record;\n return (record.id ?? record.code ?? record.name ?? record.action) as string | undefined;\n }\n return undefined;\n })\n .filter((id: string | undefined): id is string => Boolean(id))\n .map((id: string) => {\n // Normalize: underscores to hyphens, lowercase\n const canonical = id.trim().toLowerCase().replace(/[\\s_]+/g, \"-\");\n\n // Primary mapping: API action IDs to AssetOperation enum values\n const aliasMap: Record = {\n // Common operations\n \"transfer\": AssetOperation.Transfer,\n \"ecency-point-transfer\": AssetOperation.Transfer,\n\n // Savings operations\n \"transfer-to-savings\": AssetOperation.TransferToSavings,\n \"transfer-savings\": AssetOperation.TransferToSavings,\n \"savings-transfer\": AssetOperation.TransferToSavings,\n \"withdraw-from-savings\": AssetOperation.WithdrawFromSavings,\n \"transfer-from-savings\": AssetOperation.WithdrawFromSavings,\n \"withdraw-savings\": AssetOperation.WithdrawFromSavings,\n \"savings-withdraw\": AssetOperation.WithdrawFromSavings,\n\n // Vesting/Power operations\n \"transfer-to-vesting\": AssetOperation.PowerUp,\n \"powerup\": AssetOperation.PowerUp,\n \"power-up\": AssetOperation.PowerUp,\n \"withdraw-vesting\": AssetOperation.PowerDown,\n \"power-down\": AssetOperation.PowerDown,\n \"powerdown\": AssetOperation.PowerDown,\n\n // Delegation\n \"delegate\": AssetOperation.Delegate,\n \"delegate-vesting-shares\": AssetOperation.Delegate,\n \"hp-delegate\": AssetOperation.Delegate,\n \"delegate-hp\": AssetOperation.Delegate,\n \"delegate-power\": AssetOperation.Delegate,\n \"undelegate\": AssetOperation.Undelegate,\n \"undelegate-power\": AssetOperation.Undelegate,\n \"undelegate-token\": AssetOperation.Undelegate,\n\n // Staking (Layer 2)\n \"stake\": AssetOperation.Stake,\n \"stake-token\": AssetOperation.Stake,\n \"stake-power\": AssetOperation.Stake,\n \"unstake\": AssetOperation.Unstake,\n \"unstake-token\": AssetOperation.Unstake,\n \"unstake-power\": AssetOperation.Unstake,\n\n // Swap/Convert\n \"swap\": AssetOperation.Swap,\n \"swap-token\": AssetOperation.Swap,\n \"swap-tokens\": AssetOperation.Swap,\n \"convert\": AssetOperation.Convert,\n\n // Points operations\n \"promote\": AssetOperation.Promote,\n \"promote-post\": AssetOperation.Promote,\n \"promote-entry\": AssetOperation.Promote,\n \"boost\": AssetOperation.Promote,\n \"gift\": AssetOperation.Gift,\n \"gift-points\": AssetOperation.Gift,\n \"points-gift\": AssetOperation.Gift,\n \"claim\": AssetOperation.Claim,\n \"claim-rewards\": AssetOperation.Claim,\n \"claim-points\": AssetOperation.Claim,\n \"buy\": AssetOperation.Buy,\n \"buy-points\": AssetOperation.Buy,\n\n // Other\n \"claim-interest\": AssetOperation.ClaimInterest,\n // Chain operation name, as emitted in the HP action list. The two\n // slug spellings below predate it and stay as a fallback.\n \"set-withdraw-vesting-route\": AssetOperation.WithdrawRoutes,\n \"withdraw-routes\": AssetOperation.WithdrawRoutes,\n \"withdrawroutes\": AssetOperation.WithdrawRoutes,\n };\n\n // Check alias map first (primary method)\n const mapped = aliasMap[canonical];\n if (mapped) return mapped;\n\n // Fallback: try direct enum value match (for exact matches like \"transfer\", \"promote\")\n const directMatch = Object.values(AssetOperation).find(\n (op) => op.toLowerCase() === canonical\n );\n return directMatch;\n })\n .filter((op: AssetOperation | undefined): op is AssetOperation => Boolean(op))\n // Remove duplicates - API may return multiple actions that map to same operation\n .filter((op: AssetOperation, index: number, self: AssetOperation[]) => self.indexOf(op) === index);\n\n const isHiveOrHbd = [\"HIVE\", \"HBD\"].includes(normalizedToken);\n // Check if there's a non-zero savings balance\n const rawToken = assetEntry as any;\n const hasSavings = Number(rawToken.savings ?? 0) > 0;\n\n if (\n isHiveOrHbd &&\n !hasSavings\n ) {\n return operations.filter(\n (operation) => operation !== AssetOperation.WithdrawFromSavings\n );\n }\n\n return operations;\n } catch {\n return [];\n }\n },\n });\n}\n","import {\n AccountProfile,\n getAccountFullQueryOptions,\n useAccountUpdate,\n type AuthContext,\n} from \"@ecency/sdk\";\nimport {\n useMutation,\n useQuery,\n useQueryClient,\n type UseMutationOptions,\n} from \"@tanstack/react-query\";\nimport { EcencyTokenMetadata } from \"../types\";\nimport * as R from \"remeda\";\nimport { getAccountWalletListQueryOptions } from \"../queries\";\nimport { EcencyWalletCurrency } from \"../enums\";\n\n/**\n * A CHAIN-layer entry (external wallet address). Everything else in\n * `profile.tokens` — Hive-Engine (`ENGINE`) and the basic Hive assets (`HIVE`) —\n * is managed by the wallet token picker, not by the external-wallet screens.\n */\nconst isChainToken = ({\n type,\n symbol,\n}: NonNullable[number]) =>\n type === \"CHAIN\" ||\n Object.values(EcencyWalletCurrency).includes(symbol as any);\n\nfunction getGroupedChainTokens(\n tokens?: AccountProfile[\"tokens\"],\n defaultShow?: boolean\n) {\n if (!tokens) {\n return {};\n }\n\n return R.pipe(\n tokens,\n R.filter(isChainToken),\n R.map((item) => {\n const meta = {\n ...(item.meta ?? {}),\n } as Record;\n\n if (typeof meta.show !== \"boolean\" && typeof defaultShow === \"boolean\") {\n meta.show = defaultShow;\n }\n\n return {\n ...item,\n meta,\n };\n }),\n // Chain tokens are unique by symbol, so indexing by symbol\n // gives a direct lookup map instead of an array-based grouping.\n R.indexBy(\n (item: NonNullable[number]) => item.symbol\n )\n );\n}\n\n/**\n * Assemble the `profile.tokens` array to broadcast.\n *\n * `profile.tokens` is written wholesale, so whatever this returns IS the user's\n * new on-chain token list — anything omitted is deleted, and since no app other\n * than Ecency writes this field, the deletion is unrecoverable.\n *\n * Which entries survive depends on what the caller manages, inferred from the\n * payload itself:\n *\n * - A payload carrying non-chain entries comes from the wallet token picker,\n * which owns the COMPLETE list — it always sends the basic Hive assets plus\n * every selected engine token, and deselecting one means omitting it. Unlisted\n * entries are therefore dropped, which is what the user asked for.\n * - A CHAIN-only payload comes from the external-wallet screens, which know\n * nothing about engine tokens. Their unlisted entries are carried forward.\n *\n * Inferring rather than taking a flag keeps this fix inside the package (the\n * apps resolve it through the committed dist, so a new public option could not\n * be used by a caller until the next release). It is also safe in the degenerate\n * case: if the picker somehow submits before its token list has loaded, the\n * payload is chain-only and we preserve — the non-destructive outcome.\n *\n * @param existingTokens the account's current on-chain `profile.tokens`\n * @param tokens the caller's payload\n */\nexport function buildTokensPayload(\n existingTokens: AccountProfile[\"tokens\"],\n tokens: EcencyTokenMetadata[]\n): AccountProfile[\"tokens\"] {\n // Chain type tokens couldn't be deleted entirely from the profile list,\n // then visibility should be controlling using meta.show field\n const profileChainTokens = getGroupedChainTokens(existingTokens);\n\n const payloadTokens =\n (tokens.map(({ currency, type, privateKey, username, ...meta }) => ({\n symbol: currency!,\n type:\n type ??\n (Object.values(EcencyWalletCurrency).includes(currency as any)\n ? \"CHAIN\"\n : undefined),\n meta,\n })) as AccountProfile[\"tokens\"]) ?? [];\n\n const payloadChainTokens = getGroupedChainTokens(payloadTokens, true);\n const payloadNonChainTokens = (payloadTokens ?? []).filter(\n (token) => !isChainToken(token)\n );\n\n const mergedChainTokens = R.pipe(\n profileChainTokens,\n R.mergeDeep(payloadChainTokens),\n R.values()\n );\n\n // Carry forward the on-chain entries this caller does not manage. Without it,\n // saving external wallet addresses (a CHAIN-only payload) rewrites\n // `profile.tokens` to chain entries alone and silently deletes every\n // Hive-Engine token the user selected.\n const managesNonChainTokens = payloadNonChainTokens.length > 0;\n const payloadSymbols = new Set(\n (payloadTokens ?? []).map(({ symbol }) => symbol)\n );\n const preservedTokens = managesNonChainTokens\n ? []\n : (existingTokens ?? []).filter(\n (token) => !isChainToken(token) && !payloadSymbols.has(token.symbol)\n );\n\n return [\n ...preservedTokens,\n ...payloadNonChainTokens,\n ...mergedChainTokens,\n ] as AccountProfile[\"tokens\"];\n}\n\n/**\n * Saving of token(s) metadata to Hive profile\n * It may contain: external wallets(see EcencyWalletCurrency), Hive tokens arrangement\n *\n * Basically, this mutation is a convenient wrapper for update profile operation\n */\ntype SaveWalletInformationOptions = Pick<\n UseMutationOptions,\n \"onSuccess\" | \"onError\"\n>;\n\nexport function useSaveWalletInformationToMetadata(\n username: string,\n auth?: AuthContext,\n options?: SaveWalletInformationOptions\n) {\n const queryClient = useQueryClient();\n\n const { data: accountData } = useQuery(getAccountFullQueryOptions(username));\n const { mutateAsync: updateProfile } = useAccountUpdate(username, auth);\n\n return useMutation({\n mutationKey: [\n \"ecency-wallets\",\n \"save-wallet-to-metadata\",\n accountData?.name,\n ],\n mutationFn: async (tokens: EcencyTokenMetadata[]) => {\n if (!accountData) {\n throw new Error(\"[SDK][Wallets] – no account data to save wallets\");\n }\n\n return updateProfile({\n tokens: buildTokensPayload(accountData.profile?.tokens, tokens),\n });\n },\n onError: options?.onError,\n onSuccess: (response, vars, context) => {\n (\n options?.onSuccess as\n | ((\n data: unknown,\n variables: EcencyTokenMetadata[],\n context: unknown\n ) => unknown)\n | undefined\n )?.(response, vars, context);\n queryClient.invalidateQueries({\n queryKey: getAccountWalletListQueryOptions(username).queryKey,\n });\n },\n });\n}\n","import { EcencyWalletCurrency } from \"@/modules/wallets/enums\";\n\ninterface RequestArguments {\n method: string;\n params?: unknown[] | Record;\n}\n\ninterface EthereumProvider {\n isMetaMask?: boolean;\n request(args: RequestArguments): Promise;\n}\n\ndeclare global {\n interface Window {\n ethereum?: EthereumProvider;\n }\n}\n\nfunction getEthereum(): EthereumProvider {\n if (typeof window === \"undefined\" || !window.ethereum) {\n throw new Error(\"MetaMask not found\");\n }\n return window.ethereum;\n}\n\nconst WEI_PER_ETH = 1000000000000000000n;\n\nconst EVM_CHAIN_CONFIG: Record = {\n [EcencyWalletCurrency.ETH]: {\n chainId: \"0x1\",\n name: \"Ethereum Mainnet\",\n rpcUrl: \"https://rpc.ankr.com/eth\",\n explorerUrl: \"https://etherscan.io/tx/\"\n },\n [EcencyWalletCurrency.BNB]: {\n chainId: \"0x38\",\n name: \"BNB Smart Chain\",\n rpcUrl: \"https://bsc-dataseed.binance.org\",\n explorerUrl: \"https://bscscan.com/tx/\"\n }\n};\n\nexport function getEvmChainConfig(currency: EcencyWalletCurrency) {\n const config = EVM_CHAIN_CONFIG[currency];\n if (!config) throw new Error(`Unsupported EVM currency: ${currency}`);\n return config;\n}\n\nexport function getEvmExplorerUrl(currency: EcencyWalletCurrency, txHash: string) {\n return `${getEvmChainConfig(currency).explorerUrl}${txHash}`;\n}\n\nexport async function ensureEvmChain(currency: EcencyWalletCurrency): Promise {\n const ethereum = getEthereum();\n\n const { chainId, name, rpcUrl } = getEvmChainConfig(currency);\n const currentChainId = await ethereum.request({ method: \"eth_chainId\" });\n\n if (currentChainId === chainId) return;\n\n try {\n await ethereum.request({\n method: \"wallet_switchEthereumChain\",\n params: [{ chainId }]\n });\n } catch (err: unknown) {\n // Chain not added — add it\n if (typeof err === \"object\" && err !== null && \"code\" in err && (err as { code: number }).code === 4902) {\n await ethereum.request({\n method: \"wallet_addEthereumChain\",\n params: [{\n chainId,\n chainName: name,\n rpcUrls: [rpcUrl],\n nativeCurrency: {\n name: currency === EcencyWalletCurrency.ETH ? \"Ether\" : \"BNB\",\n symbol: currency === EcencyWalletCurrency.ETH ? \"ETH\" : \"BNB\",\n decimals: 18\n }\n }]\n });\n } else {\n throw err;\n }\n }\n}\n\nexport async function estimateEvmGas(\n from: string,\n to: string,\n valueHex: string,\n currency: EcencyWalletCurrency\n): Promise<{ gasLimit: string; gasPrice: string; estimatedFeeWei: bigint }> {\n const ethereum = getEthereum();\n\n await ensureEvmChain(currency);\n\n const [gasLimit, gasPrice] = await Promise.all([\n ethereum.request({\n method: \"eth_estimateGas\",\n params: [{ from, to, value: valueHex }]\n }),\n ethereum.request({ method: \"eth_gasPrice\" })\n ]);\n\n const estimatedFeeWei = BigInt(gasLimit) * BigInt(gasPrice);\n\n return { gasLimit, gasPrice, estimatedFeeWei };\n}\n\nexport function formatWei(wei: bigint, decimals = 6): string {\n const whole = wei / WEI_PER_ETH;\n const rem = wei % WEI_PER_ETH;\n if (rem === 0n) return whole.toString();\n\n const scale = 10n ** BigInt(decimals);\n const fractional = (rem * scale) / WEI_PER_ETH;\n const fracStr = fractional.toString().padStart(decimals, \"0\").replace(/0+$/, \"\");\n return fracStr ? `${whole}.${fracStr}` : whole.toString();\n}\n\nconst AMOUNT_REGEX = /^\\d+(\\.\\d+)?$/;\n\nexport function parseToWei(amount: string): string {\n const trimmed = amount.trim();\n if (!AMOUNT_REGEX.test(trimmed)) {\n throw new Error(`Invalid amount: \"${amount}\"`);\n }\n\n const [whole, fraction = \"\"] = trimmed.split(\".\");\n if (!/^\\d+$/.test(whole) || (fraction && !/^\\d+$/.test(fraction))) {\n throw new Error(`Invalid amount: \"${amount}\"`);\n }\n\n const paddedFraction = fraction.padEnd(18, \"0\").slice(0, 18);\n const wei = BigInt(whole) * WEI_PER_ETH + BigInt(paddedFraction);\n return \"0x\" + wei.toString(16);\n}\n\nexport async function sendEvmTransfer(\n to: string,\n amountWei: string,\n currency: EcencyWalletCurrency,\n expectedFrom?: string\n): Promise {\n const ethereum = getEthereum();\n\n await ensureEvmChain(currency);\n\n const accounts = await ethereum.request({ method: \"eth_requestAccounts\" });\n const from = accounts[0];\n if (!from) throw new Error(\"No MetaMask account connected\");\n\n // Funds safety: never send from an account other than the linked wallet. The\n // active MetaMask account can differ from the one the user linked (multiple\n // accounts, switched account, or access just granted to a different one). This\n // comparison is atomic with the account read above and is the single source of\n // truth for the EVM send. Throws a sentinel the caller maps to a message.\n if (expectedFrom && from.toLowerCase() !== expectedFrom.toLowerCase()) {\n throw new Error(\"ACCOUNT_MISMATCH\");\n }\n\n const txHash = await ethereum.request({\n method: \"eth_sendTransaction\",\n params: [{\n from,\n to,\n value: amountWei\n }]\n });\n\n return txHash;\n}\n","import { ConfigManager } from \"@ecency/sdk\";\n\nconst SOL_EXPLORER_URL = \"https://explorer.solana.com/tx/\";\nconst LAMPORTS_PER_SOL = 1_000_000_000n;\nconst AMOUNT_REGEX = /^\\d+(\\.\\d+)?$/;\n\nexport function getSolExplorerUrl(signature: string) {\n return `${SOL_EXPLORER_URL}${signature}`;\n}\n\nexport function parseToLamports(amount: string): bigint {\n const trimmed = amount.trim();\n if (!AMOUNT_REGEX.test(trimmed)) {\n throw new Error(`Invalid amount: \"${amount}\"`);\n }\n\n const [whole, fraction = \"\"] = trimmed.split(\".\");\n if (!/^\\d+$/.test(whole) || (fraction && !/^\\d+$/.test(fraction))) {\n throw new Error(`Invalid amount: \"${amount}\"`);\n }\n\n if (fraction.length > 9 && fraction.slice(9).replace(/0/g, \"\").length > 0) {\n throw new Error(`Amount has more than 9 decimal places: \"${amount}\"`);\n }\n\n const paddedFraction = fraction.padEnd(9, \"0\").slice(0, 9);\n return BigInt(whole) * LAMPORTS_PER_SOL + BigInt(paddedFraction);\n}\n\nexport function formatLamports(lamports: bigint, decimals = 6): string {\n const whole = lamports / LAMPORTS_PER_SOL;\n const rem = lamports % LAMPORTS_PER_SOL;\n if (rem === 0n) return whole.toString();\n\n const scale = 10n ** BigInt(decimals);\n const fractional = (rem * scale) / LAMPORTS_PER_SOL;\n const fracStr = fractional.toString().padStart(decimals, \"0\").replace(/0+$/, \"\");\n return fracStr ? `${whole}.${fracStr}` : whole.toString();\n}\n\ninterface JsonRpcResponse {\n jsonrpc: string;\n id: number | string;\n result?: T;\n error?: { code?: number; message?: string };\n}\n\n/**\n * Call a Solana JSON-RPC method via the Ecency private API proxy.\n * This avoids hitting the public Solana RPC directly from the browser\n * (which returns 403). The proxy forwards to a public Solana RPC node.\n */\nasync function solRpc(method: string, params: unknown[] = []): Promise {\n const baseUrl = ConfigManager.getValidatedBaseUrl();\n const response = await fetch(`${baseUrl}/private-api/rpc/sol`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ jsonrpc: \"2.0\", id: 1, method, params })\n });\n\n if (!response.ok) {\n const text = await response.text().catch(() => \"\");\n throw new Error(`SOL RPC ${method} failed: ${response.status} ${response.statusText}${text ? ` — ${text}` : \"\"}`);\n }\n\n const json: JsonRpcResponse = await response.json();\n if (json.error) {\n throw new Error(json.error.message || `SOL RPC ${method} failed`);\n }\n return json.result as T;\n}\n\nasync function getMetaMaskSolanaWallet(): Promise {\n const { getWallets } = await import(\"@wallet-standard/app\");\n const walletsApi = getWallets();\n const wallets = walletsApi.get();\n\n // Only select a MetaMask wallet that supports Solana signing\n const mmWallet = wallets.find(\n (w: any) =>\n w.name.toLowerCase().includes(\"metamask\") &&\n w.features[\"standard:connect\"] &&\n w.features[\"solana:signAndSendTransaction\"]\n );\n\n if (!mmWallet) {\n throw new Error(\"MetaMask Solana wallet not found. Enable Solana in MetaMask settings.\");\n }\n\n return mmWallet;\n}\n\nexport async function sendSolTransfer(\n to: string,\n amountSol: string\n): Promise {\n const mmWallet = await getMetaMaskSolanaWallet();\n\n // Connect to get accounts\n const connectFeature = mmWallet.features[\"standard:connect\"] as any;\n await connectFeature.connect();\n\n const solAccount = mmWallet.accounts?.find(\n (acc: any) => acc.chains?.some((c: string) => c.startsWith(\"solana:\"))\n );\n\n if (!solAccount) {\n throw new Error(\"No Solana account found in MetaMask.\");\n }\n\n // Use @solana/web3.js for transaction building (dynamic import to avoid bundle bloat)\n const { PublicKey, SystemProgram, Transaction } = await import(\"@solana/web3.js\");\n\n const fromPubkey = new PublicKey(solAccount.address);\n const toPubkey = new PublicKey(to);\n const lamports = parseToLamports(amountSol);\n\n const transaction = new Transaction().add(\n SystemProgram.transfer({\n fromPubkey,\n toPubkey,\n lamports\n })\n );\n\n // Fetch blockhash via Ecency RPC proxy (avoids 403 from public Solana RPC)\n const blockhashResult = await solRpc<{ value: { blockhash: string } }>(\n \"getLatestBlockhash\",\n [{ commitment: \"finalized\" }]\n );\n transaction.recentBlockhash = blockhashResult.value.blockhash;\n transaction.feePayer = fromPubkey;\n\n // Serialize the transaction for signing via Wallet Standard\n const serializedTx = transaction.serialize({\n requireAllSignatures: false,\n verifySignatures: false\n });\n\n const signAndSendFeature = mmWallet.features[\"solana:signAndSendTransaction\"] as any;\n if (!signAndSendFeature) {\n throw new Error(\"MetaMask does not support Solana transaction signing. Please update MetaMask.\");\n }\n\n const [result] = await signAndSendFeature.signAndSendTransaction({\n account: solAccount,\n transaction: serializedTx,\n chain: \"solana:mainnet\"\n });\n\n // Result contains the signature — either a string or Uint8Array\n if (typeof result.signature === \"string\") {\n return result.signature;\n }\n\n // Encode Uint8Array to base58 (standard Solana signature format)\n const { base58 } = await import(\"@scure/base\");\n return base58.encode(new Uint8Array(result.signature));\n}\n","import { EcencyWalletCurrency } from \"@/modules/wallets/enums\";\nimport { sendEvmTransfer, parseToWei } from \"@/modules/wallets/utils/metamask-evm-transfer\";\nimport { sendSolTransfer } from \"@/modules/wallets/utils/metamask-sol-transfer\";\nimport { useMutation, useQueryClient } from \"@tanstack/react-query\";\n\nexport type TransferableCurrency =\n | EcencyWalletCurrency.ETH\n | EcencyWalletCurrency.BNB\n | EcencyWalletCurrency.SOL;\n\ninterface ExternalTransferPayload {\n to: string;\n amount: string;\n /** EVM only: the linked wallet address. The send is blocked if the active\n * MetaMask account does not match it (funds safety). */\n expectedFrom?: string;\n}\n\nexport function useExternalTransfer(currency: TransferableCurrency) {\n const queryClient = useQueryClient();\n\n return useMutation({\n mutationKey: [\"ecency-wallets\", \"external-transfer\", currency],\n mutationFn: async ({ to, amount, expectedFrom }: ExternalTransferPayload) => {\n switch (currency) {\n case EcencyWalletCurrency.ETH:\n case EcencyWalletCurrency.BNB: {\n const valueHex = parseToWei(amount);\n const txHash = await sendEvmTransfer(to, valueHex, currency, expectedFrom);\n return { txHash, currency };\n }\n case EcencyWalletCurrency.SOL: {\n const signature = await sendSolTransfer(to, amount);\n return { txHash: signature, currency };\n }\n }\n },\n onSuccess: () => {\n queryClient.invalidateQueries({\n queryKey: [\"ecency-wallets\", \"external-wallet-balance\"]\n });\n }\n });\n}\n","// @scure/bip39 (same @noble/@scure family as @scure/bip32 used below).\n// mnemonicToSeedSync is pure PBKDF2-HMAC-SHA512 over the mnemonic string — it\n// uses no wordlist, so this is byte-identical to bip39's output (verified\n// against BIP39 test vectors) while dropping bip39's ~164KB of 10 bundled\n// language wordlists from the app bundle.\nimport { mnemonicToSeedSync } from \"@scure/bip39\";\nimport { HDKey } from \"@scure/bip32\";\nimport { PrivateKey } from \"@ecency/sdk\";\n\nexport type HiveRole = \"owner\" | \"active\" | \"posting\" | \"memo\";\n\nconst ROLE_INDEX: Record = {\n owner: 0,\n active: 1,\n posting: 2,\n memo: 3,\n};\n\nexport function deriveHiveKey(\n mnemonic: string,\n role: HiveRole,\n accountIndex = 0\n) {\n const seed = mnemonicToSeedSync(mnemonic);\n const master = HDKey.fromMasterSeed(seed);\n const path = `m/44'/3054'/${accountIndex}'/0'/${ROLE_INDEX[role]}'`;\n const child = master.derive(path);\n if (!child.privateKey) {\n throw new Error(\"[Ecency][Wallets] - hive key derivation failed\");\n }\n const pk = PrivateKey.from(Buffer.from(child.privateKey));\n return {\n privateKey: pk.toString(),\n publicKey: pk.createPublic().toString(),\n } as const;\n}\n\nexport function deriveHiveKeys(\n mnemonic: string,\n accountIndex = 0\n) {\n const owner = deriveHiveKey(mnemonic, \"owner\", accountIndex);\n const active = deriveHiveKey(mnemonic, \"active\", accountIndex);\n const posting = deriveHiveKey(mnemonic, \"posting\", accountIndex);\n const memo = deriveHiveKey(mnemonic, \"memo\", accountIndex);\n return {\n owner: owner.privateKey,\n active: active.privateKey,\n posting: posting.privateKey,\n memo: memo.privateKey,\n ownerPubkey: owner.publicKey,\n activePubkey: active.publicKey,\n postingPubkey: posting.publicKey,\n memoPubkey: memo.publicKey,\n } as const;\n}\n\n","import { PrivateKey } from \"@ecency/sdk\";\nimport type { HiveRole } from \"./derive-hive-bip44-keys\";\n\nexport function deriveHiveMasterPasswordKey(\n username: string,\n masterPassword: string,\n role: HiveRole\n) {\n const pk = PrivateKey.fromLogin(username, masterPassword, role);\n return {\n privateKey: pk.toString(),\n publicKey: pk.createPublic().toString(),\n } as const;\n}\n\nexport function deriveHiveMasterPasswordKeys(\n username: string,\n masterPassword: string\n) {\n const owner = deriveHiveMasterPasswordKey(username, masterPassword, \"owner\");\n const active = deriveHiveMasterPasswordKey(username, masterPassword, \"active\");\n const posting = deriveHiveMasterPasswordKey(\n username,\n masterPassword,\n \"posting\"\n );\n const memo = deriveHiveMasterPasswordKey(username, masterPassword, \"memo\");\n return {\n owner: owner.privateKey,\n active: active.privateKey,\n posting: posting.privateKey,\n memo: memo.privateKey,\n ownerPubkey: owner.publicKey,\n activePubkey: active.publicKey,\n postingPubkey: posting.publicKey,\n memoPubkey: memo.publicKey,\n } as const;\n}\n","import { CONFIG, FullAccount, getAccountFullQueryOptions, PrivateKey } from \"@ecency/sdk\";\nimport { deriveHiveKeys } from \"./derive-hive-bip44-keys\";\n\nexport type HiveKeyDerivation = \"bip44\" | \"master-password\" | \"unknown\";\n\nexport async function detectHiveKeyDerivation(\n username: string,\n seed: string,\n type: \"active\" | \"owner\" = \"active\"\n): Promise {\n const uname = username.trim().toLowerCase();\n\n // ensure we actually have data\n const account = (await CONFIG.queryClient.fetchQuery(\n getAccountFullQueryOptions(uname)\n )) as FullAccount | null;\n if (!account) {\n throw new Error(\"[SDK][Wallets] – no account found for key derivation\");\n }\n\n // pick the right authority based on `type`\n const auth = account[type];\n\n // --- BIP44 check (match selected authority) ---\n // The input may be a legacy master password (or any non-mnemonic string),\n // which @scure/bip39 rejects with \"Invalid mnemonic\". The previous bip39 ran\n // PBKDF2 over any string and produced a (non-matching) seed here, so guard the\n // BIP44 probe and fall through to the master-password check on failure —\n // otherwise master-password logins/signing abort before authenticating.\n let matchBip44 = false;\n try {\n const bip44 = deriveHiveKeys(seed);\n const bip44Pub = type === \"owner\" ? bip44.ownerPubkey : bip44.activePubkey;\n matchBip44 = auth.key_auths.some(([pub]) => String(pub) === bip44Pub);\n } catch {\n // not a valid BIP39 mnemonic -> not a BIP44 seed\n }\n if (matchBip44) return \"bip44\";\n\n // --- Master password (legacy) check (match selected authority) ---\n const legacyPub = PrivateKey.fromLogin(uname, seed, type)\n .createPublic()\n .toString();\n\n const matchLegacy = auth.key_auths.some(([pub]) => String(pub) === legacyPub);\n if (matchLegacy) return \"master-password\";\n\n return \"unknown\";\n}\n","import { EcencyWalletCurrency } from \"@/modules/wallets/enums\";\n\nexport type WalletAddressMap = Partial>;\n\n/** Chain prefixes we look for in Wallet Standard accounts */\nconst CHAIN_PREFIX_MAP: Record = {\n \"solana:\": EcencyWalletCurrency.SOL,\n \"bip122:\": EcencyWalletCurrency.BTC\n};\n\nconst HIVE_SNAP_ID = \"npm:@hiveio/metamask-snap\";\n\nexport interface HivePublicKey {\n publicKey: string;\n role?: string;\n accountIndex: number;\n addressIndex: number;\n}\n\ninterface WalletStandardWallet {\n name: string;\n chains: readonly string[];\n features: Record;\n accounts: ReadonlyArray<{\n address: string;\n chains: readonly string[];\n }>;\n}\n\n/**\n * Fetch non-EVM addresses from MetaMask via the Wallet Standard protocol.\n *\n * MetaMask registers non-EVM wallets (Solana, Bitcoin) as separate Wallet Standard\n * wallets — they are NOT accessible through window.ethereum (EVM-only provider).\n */\nexport async function fetchMultichainAddresses(): Promise {\n const addresses: WalletAddressMap = {};\n\n try {\n const { getWallets } = await import(\"@wallet-standard/app\");\n const walletsApi = getWallets();\n const wallets = walletsApi.get();\n\n // Iterate ALL MetaMask wallet registrations — MetaMask may expose\n // separate entries per chain (e.g., one for Solana, one for Bitcoin)\n const mmWallets = wallets.filter(\n (w: WalletStandardWallet) =>\n w.name.toLowerCase().includes(\"metamask\") &&\n w.features[\"standard:connect\"]\n ) as WalletStandardWallet[];\n\n for (const mmWallet of mmWallets) {\n try {\n const connectFeature = mmWallet.features[\"standard:connect\"] as\n { connect: () => Promise };\n await connectFeature.connect();\n } catch (connectErr) {\n if (process.env.NODE_ENV === \"development\") {\n console.log(\"[MetaMask multichain] wallet connect failed, trying next:\", connectErr);\n }\n continue;\n }\n\n for (const account of mmWallet.accounts ?? []) {\n if (!account.address || !Array.isArray(account.chains)) continue;\n\n for (const [prefix, currency] of Object.entries(CHAIN_PREFIX_MAP)) {\n if (addresses[currency]) continue;\n if (account.chains.some((c: string) => c.startsWith(prefix))) {\n addresses[currency] = account.address;\n }\n }\n }\n }\n } catch (e) {\n if (process.env.NODE_ENV === \"development\") {\n console.log(\"[MetaMask multichain] wallet standard discovery failed:\", e);\n }\n }\n\n return addresses;\n}\n\n/**\n * Fetch the EVM address from MetaMask via window.ethereum.\n * Returns the first connected account address, or undefined on failure.\n */\nexport async function fetchEvmAddress(): Promise {\n if (typeof window === \"undefined\" || !window.ethereum?.isMetaMask) return undefined;\n\n try {\n const accounts = await window.ethereum.request({\n method: \"eth_requestAccounts\"\n }) as string[] | undefined;\n\n return accounts?.[0] ?? undefined;\n } catch {\n return undefined;\n }\n}\n\n/**\n * Discover all wallet addresses from MetaMask (EVM + non-EVM).\n * Returns a map of currency -> address. Partial results are returned on failure.\n */\nexport async function discoverMetaMaskWallets(): Promise {\n const addresses: WalletAddressMap = {};\n\n // EVM address (shared for ETH + BNB)\n const evmAddress = await fetchEvmAddress();\n if (evmAddress) {\n addresses[EcencyWalletCurrency.ETH] = evmAddress;\n addresses[EcencyWalletCurrency.BNB] = evmAddress;\n }\n\n // Non-EVM addresses via Wallet Standard\n const multichainAddresses = await fetchMultichainAddresses();\n Object.assign(addresses, multichainAddresses);\n\n return addresses;\n}\n\n/**\n * Install the Hive Snap in MetaMask.\n */\nexport async function installHiveSnap(): Promise {\n if (typeof window === \"undefined\" || !window.ethereum) {\n throw new Error(\"MetaMask is not available\");\n }\n await window.ethereum.request({\n method: \"wallet_requestSnaps\",\n params: { [HIVE_SNAP_ID]: {} }\n });\n}\n\n/**\n * Get Hive public keys from the MetaMask Hive Snap.\n * Returns owner, active, posting, and memo public keys.\n */\nexport async function getHivePublicKeys(): Promise {\n if (typeof window === \"undefined\" || !window.ethereum) {\n throw new Error(\"MetaMask is not available\");\n }\n\n const result = await window.ethereum.request({\n method: \"wallet_invokeSnap\",\n params: {\n snapId: HIVE_SNAP_ID,\n request: {\n method: \"hive_getPublicKeys\",\n params: {\n keys: [\n { role: \"owner\", accountIndex: 0 },\n { role: \"active\", accountIndex: 0 },\n { role: \"posting\", accountIndex: 0 },\n { role: \"memo\", accountIndex: 0 }\n ]\n }\n }\n }\n }) as { publicKeys?: unknown } | undefined;\n\n const keys = result?.publicKeys;\n if (!Array.isArray(keys)) {\n throw new Error(\"Hive Snap returned invalid response — expected publicKeys array\");\n }\n\n return keys as HivePublicKey[];\n}\n","import { rememberScryptBsvVersion } from \"./internal/scrypt-guard\";\n\nrememberScryptBsvVersion();\n\nexport * from \"./modules/wallets\";\nexport * from \"./modules/assets\";\n"]} \ No newline at end of file diff --git a/packages/wallets/dist/node/index.mjs b/packages/wallets/dist/node/index.mjs index 86618d68ce..1739f71962 100644 --- a/packages/wallets/dist/node/index.mjs +++ b/packages/wallets/dist/node/index.mjs @@ -631,15 +631,17 @@ function getTokenOperationsQueryOptions(token, username, isForOwner = false, cur } // src/modules/wallets/mutations/save-wallet-information-to-metadata.ts +var isChainToken = ({ + type, + symbol +}) => type === "CHAIN" || Object.values(EcencyWalletCurrency).includes(symbol); function getGroupedChainTokens(tokens, defaultShow) { if (!tokens) { return {}; } return R.pipe( tokens, - R.filter( - ({ type, symbol }) => type === "CHAIN" || Object.values(EcencyWalletCurrency).includes(symbol) - ), + R.filter(isChainToken), R.map((item) => { const meta = { ...item.meta ?? {} @@ -659,6 +661,35 @@ function getGroupedChainTokens(tokens, defaultShow) { ) ); } +function buildTokensPayload(existingTokens, tokens) { + const profileChainTokens = getGroupedChainTokens(existingTokens); + const payloadTokens = tokens.map(({ currency, type, privateKey, username, ...meta }) => ({ + symbol: currency, + type: type ?? (Object.values(EcencyWalletCurrency).includes(currency) ? "CHAIN" : void 0), + meta + })) ?? []; + const payloadChainTokens = getGroupedChainTokens(payloadTokens, true); + const payloadNonChainTokens = (payloadTokens ?? []).filter( + (token) => !isChainToken(token) + ); + const mergedChainTokens = R.pipe( + profileChainTokens, + R.mergeDeep(payloadChainTokens), + R.values() + ); + const managesNonChainTokens = payloadNonChainTokens.length > 0; + const payloadSymbols = new Set( + (payloadTokens ?? []).map(({ symbol }) => symbol) + ); + const preservedTokens = managesNonChainTokens ? [] : (existingTokens ?? []).filter( + (token) => !isChainToken(token) && !payloadSymbols.has(token.symbol) + ); + return [ + ...preservedTokens, + ...payloadNonChainTokens, + ...mergedChainTokens + ]; +} function useSaveWalletInformationToMetadata(username, auth, options2) { const queryClient = useQueryClient(); const { data: accountData } = useQuery(getAccountFullQueryOptions(username)); @@ -673,28 +704,8 @@ function useSaveWalletInformationToMetadata(username, auth, options2) { if (!accountData) { throw new Error("[SDK][Wallets] \u2013 no account data to save wallets"); } - const profileChainTokens = getGroupedChainTokens( - accountData.profile?.tokens - ); - const payloadTokens = tokens.map(({ currency, type, privateKey, username: username2, ...meta }) => ({ - symbol: currency, - type: type ?? (Object.values(EcencyWalletCurrency).includes(currency) ? "CHAIN" : void 0), - meta - })) ?? []; - const payloadChainTokens = getGroupedChainTokens(payloadTokens, true); - const payloadNonChainTokens = payloadTokens.filter( - ({ type, symbol }) => type !== "CHAIN" && !Object.values(EcencyWalletCurrency).includes(symbol) - ); - const mergedChainTokens = R.pipe( - profileChainTokens, - R.mergeDeep(payloadChainTokens), - R.values() - ); return updateProfile({ - tokens: [ - ...payloadNonChainTokens, - ...mergedChainTokens - ] + tokens: buildTokensPayload(accountData.profile?.tokens, tokens) }); }, onError: options2?.onError, @@ -1142,6 +1153,6 @@ async function getHivePublicKeys() { // src/index.ts rememberScryptBsvVersion(); -export { EcencyWalletBasicTokens, EcencyWalletCurrency, private_api_exports as EcencyWalletsPrivateApi, deriveHiveKey, deriveHiveKeys, deriveHiveMasterPasswordKey, deriveHiveMasterPasswordKeys, detectHiveKeyDerivation, discoverMetaMaskWallets, ensureEvmChain, estimateEvmGas, fetchEvmAddress, fetchMultichainAddresses, formatLamports, formatWei, getAccountWalletListQueryOptions, getAllTokensListQueryOptions, getEvmChainConfig, getEvmExplorerUrl, getHivePublicKeys, getSolExplorerUrl, getTokenOperationsQueryOptions, getTokenPriceQueryOptions, installHiveSnap, parseToLamports, parseToWei, sendEvmTransfer, sendSolTransfer, useExternalTransfer, useGetExternalWalletBalanceQuery, useSaveWalletInformationToMetadata }; +export { EcencyWalletBasicTokens, EcencyWalletCurrency, private_api_exports as EcencyWalletsPrivateApi, buildTokensPayload, deriveHiveKey, deriveHiveKeys, deriveHiveMasterPasswordKey, deriveHiveMasterPasswordKeys, detectHiveKeyDerivation, discoverMetaMaskWallets, ensureEvmChain, estimateEvmGas, fetchEvmAddress, fetchMultichainAddresses, formatLamports, formatWei, getAccountWalletListQueryOptions, getAllTokensListQueryOptions, getEvmChainConfig, getEvmExplorerUrl, getHivePublicKeys, getSolExplorerUrl, getTokenOperationsQueryOptions, getTokenPriceQueryOptions, installHiveSnap, parseToLamports, parseToWei, sendEvmTransfer, sendSolTransfer, useExternalTransfer, useGetExternalWalletBalanceQuery, useSaveWalletInformationToMetadata }; //# sourceMappingURL=index.mjs.map //# sourceMappingURL=index.mjs.map \ No newline at end of file diff --git a/packages/wallets/dist/node/index.mjs.map b/packages/wallets/dist/node/index.mjs.map index d9e940a38d..aac7e3164c 100644 --- a/packages/wallets/dist/node/index.mjs.map +++ b/packages/wallets/dist/node/index.mjs.map @@ -1 +1 @@ -{"version":3,"sources":["../../src/internal/scrypt-guard.ts","../../src/modules/wallets/enums/ecency-wallet-currency.ts","../../src/modules/wallets/enums/ecency-wallet-basic-tokens.ts","../../src/modules/wallets/mutations/private-api/index.ts","../../src/modules/wallets/utils/get-bound-fetch.ts","../../src/modules/wallets/mutations/private-api/create-account-with-wallets.ts","../../src/modules/wallets/mutations/private-api/check-wallet-existence.ts","../../src/modules/wallets/mutations/private-api/update-account-with-wallets.ts","../../src/modules/wallets/queries/use-get-external-wallet-query.ts","../../src/modules/wallets/queries/get-token-price-query-options.ts","../../src/modules/wallets/queries/get-all-tokens-list-query-options.ts","../../src/modules/wallets/queries/use-get-account-wallet-list-query.ts","../../src/modules/wallets/queries/get-tokens-operations-query-options.ts","../../src/modules/wallets/mutations/save-wallet-information-to-metadata.ts","../../src/modules/wallets/utils/metamask-evm-transfer.ts","../../src/modules/wallets/utils/metamask-sol-transfer.ts","../../src/modules/wallets/mutations/use-external-transfer.ts","../../src/modules/wallets/utils/derive-hive-bip44-keys.ts","../../src/modules/wallets/utils/derive-hive-master-password-keys.ts","../../src/modules/wallets/utils/detect-hive-key-derivation.ts","../../src/modules/wallets/utils/metamask-discovery.ts","../../src/index.ts"],"names":["EcencyWalletCurrency","EcencyWalletBasicTokens","useMutation","ConfigManager","queryOptions","getQueryClient","getPortfolioQueryOptions","options","useQuery","getAccountFullQueryOptions","username","AMOUNT_REGEX","useQueryClient","PrivateKey"],"mappings":";;;;;;;;;;;;;;;AAWA,IAAM,UAAA,GAAa,UAAA;AAOnB,IAAI,OAAO,UAAA,CAAW,WAAA,KAAgB,WAAA,EAAa;AACjD,EAAA,IAAI,OAAO,UAAA,CAAW,WAAA,KAAgB,QAAA,EAAU;AAC9C,IAAA,UAAA,CAAW,6BAA6B,UAAA,CAAW,WAAA;AAAA,EACrD;AAEA,EAAA,IAAI;AACF,IAAA,OAAO,UAAA,CAAW,WAAA;AAAA,EACpB,CAAA,CAAA,MAAQ;AACN,IAAA,UAAA,CAAW,WAAA,GAAc,MAAA;AAAA,EAC3B;AACF;AAGA,IAAI,OAAO,UAAA,CAAW,QAAA,KAAa,WAAA,EAAa;AAC9C,EAAA,IAAI,OAAO,UAAA,CAAW,QAAA,KAAa,QAAA,EAAU;AAC3C,IAAA,UAAA,CAAW,2BAA2B,UAAA,CAAW,QAAA;AAAA,EACnD;AAEA,EAAA,IAAI;AACF,IAAA,OAAO,UAAA,CAAW,QAAA;AAAA,EACpB,CAAA,CAAA,MAAQ;AACN,IAAA,UAAA,CAAW,QAAA,GAAW,MAAA;AAAA,EACxB;AACF;AAEO,SAAS,wBAAA,GAA2B;AACzC,EAAA,IAAI,OAAO,UAAA,CAAW,WAAA,KAAgB,QAAA,EAAU;AAC9C,IAAA,UAAA,CAAW,6BAA6B,UAAA,CAAW,WAAA;AAAA,EACrD;AAGA,EAAA,IAAI,OAAO,UAAA,CAAW,QAAA,KAAa,QAAA,EAAU;AAC3C,IAAA,UAAA,CAAW,2BAA2B,UAAA,CAAW,QAAA;AAAA,EACnD;AACF;;;ACpDO,IAAK,oBAAA,qBAAAA,qBAAAA,KAAL;AACL,EAAAA,sBAAA,KAAA,CAAA,GAAM,KAAA;AACN,EAAAA,sBAAA,KAAA,CAAA,GAAM,KAAA;AACN,EAAAA,sBAAA,KAAA,CAAA,GAAM,KAAA;AACN,EAAAA,sBAAA,KAAA,CAAA,GAAM,KAAA;AAJI,EAAA,OAAAA,qBAAAA;AAAA,CAAA,EAAA,oBAAA,IAAA,EAAA;;;ACAL,IAAK,uBAAA,qBAAAC,wBAAAA,KAAL;AACL,EAAAA,yBAAA,QAAA,CAAA,GAAS,QAAA;AACT,EAAAA,yBAAA,WAAA,CAAA,GAAY,IAAA;AACZ,EAAAA,yBAAA,MAAA,CAAA,GAAO,MAAA;AACP,EAAAA,yBAAA,YAAA,CAAA,GAAa,KAAA;AAJH,EAAA,OAAAA,wBAAAA;AAAA,CAAA,EAAA,uBAAA,IAAA,EAAA;;;ACAZ,IAAA,mBAAA,GAAA;AAAA,QAAA,CAAA,mBAAA,EAAA;AAAA,EAAA,uBAAA,EAAA,MAAA,uBAAA;AAAA,EAAA,2BAAA,EAAA,MAAA,2BAAA;AAAA,EAAA,2BAAA,EAAA,MAAA;AAAA,CAAA,CAAA;;;ACAA,IAAI,WAAA;AAEG,SAAS,aAAA,GAAgB;AAC9B,EAAA,IAAI,CAAC,WAAA,EAAa;AAChB,IAAA,IAAI,OAAO,UAAA,CAAW,KAAA,KAAU,UAAA,EAAY;AAC1C,MAAA,MAAM,IAAI,MAAM,mDAAmD,CAAA;AAAA,IACrE;AAEA,IAAA,WAAA,GAAc,UAAA,CAAW,KAAA,CAAM,IAAA,CAAK,UAAU,CAAA;AAAA,EAChD;AAEA,EAAA,OAAO,WAAA;AACT;ACOO,SAAS,4BAA4B,QAAA,EAAkB;AAC5D,EAAA,MAAM,WAAW,aAAA,EAAc;AAE/B,EAAA,OAAO,WAAA,CAAY;AAAA,IACjB,WAAA,EAAa,CAAC,gBAAA,EAAkB,6BAAA,EAA+B,QAAQ,CAAA;AAAA,IACvE,YAAY,OAAO,EAAE,UAAU,OAAA,EAAS,QAAA,EAAU,iBAAgB,KAAe;AAC/E,MAAA,MAAM,YAAoC,EAAC;AAC3C,MAAA,IAAI,eAAA,EAAiB;AACnB,QAAA,KAAA,MAAW,CAAC,CAAA,EAAG,CAAC,KAAK,MAAA,CAAO,OAAA,CAAQ,eAAe,CAAA,EAAG;AACpD,UAAA,IAAI,CAAA,EAAG,SAAA,CAAU,CAAC,CAAA,GAAI,CAAA;AAAA,QACxB;AAAA,MACF;AAEA,MAAA,MAAM,WAAW,MAAM,QAAA,CAAS,GAAG,aAAA,CAAc,mBAAA,EAAqB,CAAA,wBAAA,CAAA,EAA4B;AAAA,QAChG,MAAA,EAAQ,MAAA;AAAA,QACR,OAAA,EAAS;AAAA,UACP,cAAA,EAAgB;AAAA,SAClB;AAAA,QACA,IAAA,EAAM,KAAK,SAAA,CAAU;AAAA,UACnB,QAAA;AAAA,UACA,KAAA,EAAO,QAAA;AAAA,UACP,OAAA;AAAA,UACA,IAAA,EAAM;AAAA,YACJ,GAAG,QAAA;AAAA,YACH,GAAG,SAAA;AAAA,YACH,CAAC,QAAQ,GAAG;AAAA;AACd,SACD;AAAA,OACF,CAAA;AAED,MAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,QAAA,MAAM,IAAI,KAAA,CAAM,CAAA,yBAAA,EAA4B,QAAA,CAAS,MAAM,CAAA,CAAA,CAAG,CAAA;AAAA,MAChE;AAEA,MAAA,OAAO,QAAA;AAAA,IACT;AAAA,GACD,CAAA;AACH;AC/CO,SAAS,uBAAA,GAA0B;AACxC,EAAA,OAAOC,WAAAA,CAAY;AAAA,IACjB,WAAA,EAAa,CAAC,gBAAA,EAAkB,wBAAwB,CAAA;AAAA,IACxD,UAAA,EAAY,OAAO,EAAE,OAAA,EAAS,UAAS,KAAe;AACpD,MAAA,MAAM,WAAW,MAAM,KAAA;AAAA,QACrB,CAAA,EAAGC,aAAAA,CAAc,mBAAA,EAAqB,CAAA,0BAAA,CAAA;AAAA,QACtC;AAAA,UACE,MAAA,EAAQ,MAAA;AAAA,UACR,OAAA,EAAS;AAAA,YACP,cAAA,EAAgB;AAAA,WAClB;AAAA,UACA,IAAA,EAAM,KAAK,SAAA,CAAU;AAAA,YACnB,OAAA;AAAA,YACA,KAAA,EAAO;AAAA,WACR;AAAA;AACH,OACF;AACA,MAAA,MAAM,IAAA,GAAO,MAAM,QAAA,CAAS,IAAA,EAAK;AACjC,MAAA,OAAO,KAAK,MAAA,KAAW,CAAA;AAAA,IACzB;AAAA,GACD,CAAA;AACH;AChBO,SAAS,2BAAA,CACd,UACA,WAAA,EACA;AACA,EAAA,MAAM,WAAW,aAAA,EAAc;AAE/B,EAAA,OAAOD,WAAAA,CAAY;AAAA,IACjB,WAAA,EAAa,CAAC,gBAAA,EAAkB,6BAAA,EAA+B,QAAQ,CAAA;AAAA,IACvE,UAAA,EAAY,OAAO,EAAE,MAAA,EAAQ,UAAS,KAAe;AACnD,MAAA,MAAM,OAAA,GAAU,MAAA,CAAO,OAAA,CAAQ,MAAM,CAAA,CAAE,MAAA,CAAO,CAAC,GAAG,OAAO,CAAA,KAAM,OAAA,CAAQ,OAAO,CAAC,CAAA;AAE/E,MAAA,IAAI,OAAA,CAAQ,WAAW,CAAA,EAAG;AACxB,QAAA,OAAO,IAAI,QAAA,CAAS,IAAA,EAAM,EAAE,MAAA,EAAQ,KAAK,CAAA;AAAA,MAC3C;AAEA,MAAA,MAAM,CAAC,cAAc,cAAc,CAAA,GAAI,QAAQ,CAAC,CAAA,IAAK,CAAC,EAAA,EAAI,EAAE,CAAA;AAE5D,MAAA,IAAI,CAAC,WAAA,EAAa;AAChB,QAAA,MAAM,IAAI,KAAA;AAAA,UACR;AAAA,SACF;AAAA,MACF;AAEA,MAAA,MAAM,WAAW,MAAM,QAAA,CAAS,GAAGC,aAAAA,CAAc,mBAAA,EAAqB,CAAA,wBAAA,CAAA,EAA4B;AAAA,QAChG,MAAA,EAAQ,MAAA;AAAA,QACR,OAAA,EAAS;AAAA,UACP,cAAA,EAAgB;AAAA,SAClB;AAAA,QACA,IAAA,EAAM,KAAK,SAAA,CAAU;AAAA,UACnB,QAAA;AAAA,UACA,IAAA,EAAM,WAAA;AAAA,UACN,KAAA,EAAO,YAAA;AAAA,UACP,OAAA,EAAS,cAAA;AAAA,UACT,MAAA,EAAQ,CAAA;AAAA,UACR,IAAA,EAAM;AAAA,YACJ,GAAG,MAAA,CAAO,WAAA,CAAY,OAAO,CAAA;AAAA,YAC7B,gBAAgB,QAAA,CAAS,cAAA;AAAA,YACzB,iBAAiB,QAAA,CAAS,eAAA;AAAA,YAC1B,kBAAkB,QAAA,CAAS,gBAAA;AAAA,YAC3B,eAAe,QAAA,CAAS;AAAA;AAC1B,SACD;AAAA,OACF,CAAA;AAID,MAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,QAAA,MAAM,IAAI,KAAA;AAAA,UACR,CAAA,8DAAA,EAA4D,SAAS,MAAM,CAAA;AAAA,SAC7E;AAAA,MACF;AAEA,MAAA,OAAO,QAAA;AAAA,IACT;AAAA,GACD,CAAA;AACH;ACjEA,IAAM,gBAAA,GAAyD;AAAA,EAC7D,mBAA4B,KAAA;AAAA,EAC5B,mBAA4B,KAAA;AAAA,EAC5B,mBAA4B,KAAA;AAAA,EAC5B,mBAA4B;AAC9B,CAAA;AA0BA,SAAS,iBAAiB,OAAA,EAAkC;AAC1D,EAAA,IAAI,OAAO,YAAY,QAAA,EAAU;AAC/B,IAAA,IAAI,CAAC,MAAA,CAAO,QAAA,CAAS,OAAO,CAAA,EAAG;AAC7B,MAAA,MAAM,IAAI,MAAM,mDAAmD,CAAA;AAAA,IACrE;AAEA,IAAA,OAAO,IAAA,CAAK,KAAA,CAAM,OAAO,CAAA,CAAE,QAAA,EAAS;AAAA,EACtC;AAEA,EAAA,IAAI,OAAO,YAAY,QAAA,EAAU;AAC/B,IAAA,MAAM,OAAA,GAAU,QAAQ,IAAA,EAAK;AAE7B,IAAA,IAAI,YAAY,EAAA,EAAI;AAClB,MAAA,MAAM,IAAI,MAAM,8CAA8C,CAAA;AAAA,IAChE;AAEA,IAAA,OAAO,OAAA;AAAA,EACT;AAEA,EAAA,MAAM,IAAI,MAAM,sDAAsD,CAAA;AACxE;AAEA,SAAS,sBAAA,CACP,QACA,aAAA,EACuB;AACvB,EAAA,IAAI,CAAC,MAAA,IAAU,OAAO,MAAA,KAAW,QAAA,EAAU;AACzC,IAAA,MAAM,IAAI,MAAM,6CAA6C,CAAA;AAAA,EAC/D;AAEA,EAAA,MAAM,EAAE,KAAA,EAAO,OAAA,EAAS,IAAA,EAAM,GAAA,EAAK,QAAO,GACxC,MAAA;AAEF,EAAA,IAAI,OAAO,KAAA,KAAU,QAAA,IAAY,KAAA,KAAU,aAAA,EAAe;AACxD,IAAA,MAAM,IAAI,MAAM,kDAAkD,CAAA;AAAA,EACpE;AAEA,EAAA,IAAI,OAAO,IAAA,KAAS,QAAA,IAAY,IAAA,CAAK,WAAW,CAAA,EAAG;AACjD,IAAA,MAAM,IAAI,MAAM,kDAAkD,CAAA;AAAA,EACpE;AAEA,EAAA,IAAI,OAAA,KAAY,MAAA,IAAa,OAAA,KAAY,IAAA,EAAM;AAC7C,IAAA,MAAM,IAAI,MAAM,qDAAqD,CAAA;AAAA,EACvE;AAEA,EAAA,MAAM,aAAA,GAAgB,iBAAiB,OAAO,CAAA;AAE9C,EAAA,IAAI,aAAA;AAEJ,EAAA,IAAI;AACF,IAAA,aAAA,GAAgB,OAAO,aAAa,CAAA;AAAA,EACtC,SAAS,KAAA,EAAO;AACd,IAAA,MAAM,IAAI,MAAM,uDAAuD,CAAA;AAAA,EACzE;AAEA,EAAA,OAAO;AAAA,IACL,KAAA;AAAA,IACA,IAAA;AAAA,IACA,GAAA;AAAA,IACA,QACE,OAAO,MAAA,KAAW,YAAY,MAAA,CAAO,MAAA,GAAS,IAAI,MAAA,GAAS,MAAA;AAAA,IAC7D,aAAA;AAAA,IACA;AAAA,GACF;AACF;AAEO,SAAS,gCAAA,CACd,UACA,OAAA,EACA;AACA,EAAA,OAAO,QAAA,CAAgC;AAAA,IACrC,QAAA,EAAU,CAAC,gBAAA,EAAkB,yBAAA,EAA2B,UAAU,OAAO,CAAA;AAAA,IACzE,SAAS,YAAY;AACnB,MAAA,MAAM,KAAA,GAAQ,iBAAiB,QAAQ,CAAA;AAEvC,MAAA,IAAI,CAAC,KAAA,EAAO;AACV,QAAA,MAAM,IAAI,KAAA,CAAM,CAAA,qBAAA,EAAwB,QAAQ,CAAA,CAAE,CAAA;AAAA,MACpD;AAEA,MAAA,MAAM,UAAU,CAAA,EAAGA,aAAAA,CAAc,qBAAqB,CAAA,qBAAA,EAAwB,KAAK,CAAA,CAAA,EAAI,kBAAA;AAAA,QACrF;AAAA,OACD,CAAA,CAAA;AAED,MAAA,IAAI,eAAA;AACJ,MAAA,IAAI,YAAA;AAEJ,MAAA,IAAI;AACF,QAAA,eAAA,GAAkB,MAAM,MAAM,OAAO,CAAA;AAAA,MACvC,SAAS,KAAA,EAAO;AACd,QAAA,YAAA,GAAe,KAAA;AAAA,MACjB;AAEA,MAAA,IAAI,QAAA,GAAW,eAAA;AAEf,MAAA,IAAI,CAAC,QAAA,IAAY,CAAC,QAAA,CAAS,EAAA,EAAI;AAC7B,QAAA,MAAM,WAAA,GAAc,GAAG,OAAO,CAAA,gBAAA,CAAA;AAC9B,QAAA,IAAI,aAAA;AAEJ,QAAA,IAAI;AACF,UAAA,MAAM,gBAAA,GAAmB,MAAM,KAAA,CAAM,WAAW,CAAA;AAEhD,UAAA,IAAI,iBAAiB,EAAA,EAAI;AACvB,YAAA,QAAA,GAAW,gBAAA;AAAA,UACb,CAAA,MAAO;AACL,YAAA,aAAA,GAAgB,IAAI,KAAA;AAAA,cAClB,CAAA,wCAAA,EAA2C,iBAAiB,MAAM,CAAA;AAAA,aACpE;AAAA,UACF;AAAA,QACF,SAAS,KAAA,EAAO;AACd,UAAA,aAAA,GAAgB,KAAA;AAAA,QAClB;AAEA,QAAA,IAAI,CAAC,QAAA,IAAY,CAAC,QAAA,CAAS,EAAA,EAAI;AAC7B,UAAA,MAAM,iBAA2B,EAAC;AAElC,UAAA,IAAI,YAAA,EAAc;AAChB,YAAA,MAAM,UACJ,YAAA,YAAwB,KAAA,GACpB,YAAA,CAAa,OAAA,GACb,OAAO,YAAY,CAAA;AACzB,YAAA,cAAA,CAAe,IAAA,CAAK,CAAA,yBAAA,EAA4B,OAAO,CAAA,CAAE,CAAA;AAAA,UAC3D,CAAA,MAAA,IAAW,eAAA,IAAmB,CAAC,eAAA,CAAgB,EAAA,EAAI;AACjD,YAAA,cAAA,CAAe,IAAA;AAAA,cACb,CAAA,wBAAA,EAA2B,gBAAgB,MAAM,CAAA;AAAA,aACnD;AAAA,UACF;AAEA,UAAA,IAAI,aAAA,EAAe;AACjB,YAAA,MAAM,UACJ,aAAA,YAAyB,KAAA,GACrB,aAAA,CAAc,OAAA,GACd,OAAO,aAAa,CAAA;AAC1B,YAAA,cAAA,CAAe,IAAA,CAAK,CAAA,0BAAA,EAA6B,OAAO,CAAA,CAAE,CAAA;AAAA,UAC5D;AAEA,UAAA,IAAI,cAAA,CAAe,WAAW,CAAA,EAAG;AAC/B,YAAA,cAAA,CAAe,KAAK,eAAe,CAAA;AAAA,UACrC;AAEA,UAAA,MAAM,IAAI,KAAA;AAAA,YACR,CAAA,4BAAA,EAA+B,cAAA,CAAe,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA;AAAA,WAC1D;AAAA,QACF;AAAA,MACF;AAEA,MAAA,MAAM,MAAA,GAAU,MAAM,QAAA,CAAS,IAAA,EAAK;AAEpC,MAAA,OAAO,sBAAA,CAAuB,QAAQ,KAAK,CAAA;AAAA,IAC7C;AAAA,GACD,CAAA;AACH;ACpLA,IAAM,OAAA,GAAU;AAAA,EACd,GAAA,EAAK,GAAA;AAAA;AAAA,EAEL,GAAA,EAAK,MAAO,EAAA,GAAK,CAAA;AAAA;AAAA,EAEjB,UAAA,EAAY,KAAA;AAAA,EACZ,cAAA,EAAgB,KAAA;AAAA,EAChB,cAAA,EAAgB;AAClB,CAAA;AAEA,IAAM,KAAA,GAAQ,IAAI,QAAA,CAAS,OAAO,CAAA;AAClC,IAAM,cAAA,0BAAwB,WAAW,CAAA;AAEzC,IAAM,QAAA,GAAW,CAAC,GAAA,EAAa,KAAA,KAC7B,KAAA,CAAM,IAAI,GAAA,EAAK,KAAA,KAAU,MAAA,GAAY,cAAA,GAAiB,KAAK,CAAA;AAE7D,IAAM,QAAA,GAAW,CAAC,GAAA,KAAgB;AAChC,EAAA,MAAM,CAAA,GAAI,KAAA,CAAM,GAAA,CAAI,GAAG,CAAA;AACvB,EAAA,OAAO,CAAA,KAAM,iBAAiB,MAAA,GAAY,CAAA;AAC5C,CAAA;AAkBA,IAAM,qBAAA,GAAgD;AAAA,EACpD,mBAA4B,KAAA;AAAA,EAC5B,mBAA4B,KAAA;AAAA,EAC5B,mBAA4B,KAAA;AAAA,EAC5B,mBAA4B,KAAA;AAAA,EAC5B,GAAA,EAAK,KAAA;AAAA,EACL,IAAA,EAAM;AACR,CAAA;AAEA,IAAM,qBAAA,GAAwB,oBAAA;AAE9B,IAAM,wBAAA,GAA2B,CAAC,QAAA,KAAqB;AACrD,EAAA,MAAM,UAAA,GAAa,SAAS,WAAA,EAAY;AACxC,EAAA,OAAO,qBAAA,CAAsB,UAAU,CAAA,IAAK,QAAA,CAAS,WAAA,EAAY;AACnE,CAAA;AAEO,SAAS,0BAA0B,QAAA,EAAmB;AAC3D,EAAA,OAAO,YAAA,CAAa;AAAA,IAClB,QAAA,EAAU,CAAC,gBAAA,EAAkB,aAAA,EAAe,QAAQ,CAAA;AAAA,IACpD,SAAS,YAAY;AACnB,MAAA,IAAI,CAAC,QAAA,EAAU;AACb,QAAA,MAAM,IAAI,KAAA;AAAA,UACR;AAAA,SACF;AAAA,MACF;AAEA,MAAA,MAAM,KAAA,GAAQ,yBAAyB,QAAQ,CAAA;AAC/C,MAAA,MAAM,OAAA,GAAUA,cAAc,mBAAA,EAAoB;AAElD,MAAA,IAAI,UAAA,GAAa,SAAS,qBAAqB,CAAA;AAI/C,MAAA,IAAI,CAAC,UAAA,EAAY;AACf,QAAA,MAAM,eAAe,MAAM,KAAA;AAAA,UACzB,GAAG,OAAO,CAAA,+BAAA,CAAA;AAAA,UACV;AAAA,YACE,MAAA,EAAQ;AAAA;AACV,SACF;AAEA,QAAA,IAAI,CAAC,aAAa,EAAA,EAAI;AACpB,UAAA,MAAM,IAAI,KAAA;AAAA,YACR,CAAA,sEAAA,EAAoE,aAAa,MAAM,CAAA,CAAA;AAAA,WACzF;AAAA,QACF;AAEA,QAAA,MAAM,IAAA,GAAQ,MAAM,YAAA,CAAa,IAAA,EAAK;AACtC,QAAA,QAAA,CAAS,uBAAuB,IAAI,CAAA;AACpC,QAAA,UAAA,GAAa,IAAA;AAAA,MACf;AAEA,MAAA,MAAM,SAAA,GAAY,WAAW,KAAK,CAAA;AAElC,MAAA,IAAI,CAAC,SAAA,EAAW;AACd,QAAA,MAAM,IAAI,KAAA;AAAA,UACR,oEAA+D,KAAK,CAAA;AAAA,SACtE;AAAA,MACF;AAEA,MAAA,MAAM,QAAA,GAAW,UAAU,MAAA,EAAQ,GAAA;AAEnC,MAAA,IAAI,CAAC,QAAA,EAAU;AACb,QAAA,MAAM,IAAI,KAAA;AAAA,UACR,kEAA6D,KAAK,CAAA;AAAA,SACpE;AAAA,MACF;AAEA,MAAA,OAAO,MAAA,CAAO,SAAS,KAAK,CAAA;AAAA,IAC9B,CAAA;AAAA,IACA,OAAA,EAAS,CAAC,CAAC;AAAA,GACZ,CAAA;AACH;ACtGA,SAAS,4BAA4B,MAAA,EAAiD;AACpF,EAAA,OAAO;AAAA,IACL,MAAA,EAAQ,EAAA;AAAA,IACR,MAAA;AAAA,IACA,IAAA,EAAM,MAAA;AAAA,IACN,QAAA,EAAU,IAAA;AAAA,IACV,SAAA,EAAW,CAAA;AAAA,IACX,SAAA,EAAW,GAAA;AAAA,IACX,MAAA,EAAQ,GAAA;AAAA,IACR,iBAAA,EAAmB,GAAA;AAAA,IACnB,cAAA,EAAgB,KAAA;AAAA,IAChB,iBAAA,EAAmB,CAAA;AAAA,IACnB,iBAAA,EAAmB,KAAA;AAAA,IACnB,oBAAA,EAAsB,CAAA;AAAA,IACtB,kBAAA,EAAoB,CAAA;AAAA,IACpB,WAAA,EAAa;AAAA,GACf;AACF;AAEA,eAAe,wBAAwB,QAAA,EAAmB;AACxD,EAAA,IAAI,CAAC,QAAA,EAAU;AACb,IAAA,OAAO,EAAC;AAAA,EACV;AAEA,EAAA,IAAI,WAAqC,EAAC;AAE1C,EAAA,IAAI;AACF,IAAA,QAAA,GAAW,MAAM,gBAAe,CAAE,UAAA;AAAA,MAChC,wCAAwC,QAAQ;AAAA,KAClD;AAAA,EACF,CAAA,CAAA,MAAQ;AACN,IAAA,QAAA,GAAW,EAAC;AAAA,EACd;AAEA,EAAA,MAAM,gBAAgB,KAAA,CAAM,IAAA;AAAA,IAC1B,IAAI,GAAA;AAAA,MACF,QAAA,CACG,GAAA,CAAI,CAAC,OAAA,KAAY,OAAA,CAAQ,MAAM,CAAA,CAC/B,MAAA,CAAO,CAAC,MAAA,KAA6B,OAAA,CAAQ,MAAM,CAAC;AAAA;AACzD,GACF;AAEA,EAAA,IAAI,aAAA,CAAc,WAAW,CAAA,EAAG;AAC9B,IAAA,OAAO,EAAC;AAAA,EACV;AAEA,EAAA,IAAI,eAAkD,EAAC;AAEvD,EAAA,IAAI;AACF,IAAA,YAAA,GAAe,MAAM,gBAAe,CAAE,UAAA;AAAA,MACpC,wCAAwC,aAAa;AAAA,KACvD;AAAA,EACF,CAAA,CAAA,MAAQ;AACN,IAAA,YAAA,GAAe,EAAC;AAAA,EAClB;AAEA,EAAA,MAAM,mBAAmB,IAAI,GAAA;AAAA,IAC3B,YAAA,CAAa,IAAI,CAAC,KAAA,KAAU,CAAC,KAAA,CAAM,MAAA,EAAQ,KAAK,CAAC;AAAA,GACnD;AAEA,EAAA,OAAO,aAAA,CAAc,GAAA;AAAA,IACnB,CAAC,MAAA,KAAW,gBAAA,CAAiB,IAAI,MAAM,CAAA,IAAK,4BAA4B,MAAM;AAAA,GAChF;AACF;AAEO,SAAS,6BAA6B,QAAA,EAAmB;AAC9D,EAAA,OAAOC,YAAAA,CAAa;AAAA,IAClB,QAAA,EAAU,CAAC,gBAAA,EAAkB,iBAAA,EAAmB,YAAY,IAAI,CAAA;AAAA,IAChE,SAAS,YAAY;AACnB,MAAA,OAAO;AAAA,QACL,KAAA,EAAO;AAAA,UAAA,QAAA;AAAA,UAAA,MAAA;AAAA,UAAA,IAAA;AAAA,UAAA,KAAA;AAAA,SAKP;AAAA,QACA,QAAA,EAAU,MAAA,CAAO,MAAA,CAAO,oBAAoB,CAAA;AAAA,QAC5C,MAAA,EAAQ,MAAM,uBAAA,CAAwB,QAAQ;AAAA,OAChD;AAAA,IACF;AAAA,GACD,CAAA;AACH;AC9EA,SAAS,uBAAuB,MAAA,EAAuC;AACrE,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,MAAM,CAAA,EAAG;AACzB,IAAA,OAAO,MAAA,CAAO,OAAO,OAAO,CAAA;AAAA,EAC9B;AAEA,EAAA,IAAI,MAAA,IAAU,OAAO,MAAA,KAAW,QAAA,EAAU;AACxC,IAAA,OAAO,MAAA,CAAO,MAAA,CAAO,MAAM,CAAA,CAAE,OAAA;AAAA,MAAQ,CAAC,KAAA,KACpC,KAAA,CAAM,OAAA,CAAQ,KAAK,IAAK,KAAA,CAAM,MAAA,CAAO,OAAO,CAAA,GAAuB;AAAC,KACtE;AAAA,EACF;AAEA,EAAA,OAAO,EAAC;AACV;AAEA,IAAM,YAAA,GAAyB;AAAA,EAAA,QAAA;AAAA,EAAA,MAAA;AAAA,EAAA,IAAA;AAAA,EAAA,KAAA;AAK/B,CAAA;AAIA,IAAM,cAAA,uBAAqB,GAAA,CAAI,CAAC,OAAO,QAAA,EAAU,IAAA,EAAM,OAAO,CAAC,CAAA;AAExD,SAAS,gCAAA,CAAiC,QAAA,EAAkB,QAAA,GAAmB,KAAA,EAAO;AAC3F,EAAA,OAAOA,YAAAA,CAAa;AAAA,IAClB,QAAA,EAAU,CAAC,gBAAA,EAAkB,MAAA,EAAQ,UAAU,QAAQ,CAAA;AAAA,IACvD,OAAA,EAAS,CAAC,CAAC,QAAA;AAAA,IACX,SAAS,YAAY;AACnB,MAAA,MAAM,cAAA,GAAiB,wBAAA,CAAyB,QAAA,EAAU,QAAA,EAAU,IAAI,CAAA;AACxE,MAAA,MAAM,cAAcC,cAAAA,EAAe;AACnC,MAAA,MAAM,YAAA,GAAe,2BAA2B,QAAQ,CAAA;AAExD,MAAA,IAAI,OAAA;AAEJ,MAAA,IAAI;AACF,QAAA,OAAA,GAAW,MAAM,WAAA,CAAY,UAAA,CAAW,YAAY,CAAA,IAAM,KAAA,CAAA;AAAA,MAC5D,CAAA,CAAA,MAAQ;AAAA,MAER;AAEA,MAAA,MAAM,eAAA,uBAAsB,GAAA,EAAqB;AAEjD,MAAA,MAAM,aAAA,GAAgB,sBAAA,CAAuB,OAAA,EAAS,OAAA,EAAS,MAAM,CAAA;AAErE,MAAA,aAAA,CAAc,OAAA,CAAQ,CAAC,KAAA,KAAwB;AAC7C,QAAA,MAAM,MAAA,GAAS,KAAA,CAAM,MAAA,EAAQ,WAAA,IAAc;AAE3C,QAAA,IAAI,CAAC,MAAA,EAAQ;AACX,UAAA;AAAA,QACF;AAEA,QAAA,MAAM,SAAA,GAAa,OAAe,IAAA,EAAM,IAAA;AAExC,QAAA,IAAI,OAAO,cAAc,SAAA,EAAW;AAClC,UAAA,eAAA,CAAgB,GAAA,CAAI,QAAQ,SAAS,CAAA;AAAA,QACvC;AAAA,MACF,CAAC,CAAA;AAED,MAAA,MAAM,cAAA,GAAiB,CAAC,MAAA,KAAoB;AAC1C,QAAA,MAAM,UAAA,GAAa,QAAQ,WAAA,EAAY;AAEvC,QAAA,IAAI,CAAC,UAAA,EAAY;AACf,UAAA,OAAO,KAAA;AAAA,QACT;AAEA,QAAA,IAAI,cAAA,CAAe,GAAA,CAAI,UAAU,CAAA,EAAG;AAClC,UAAA,OAAO,KAAA;AAAA,QACT;AAEA,QAAA,IAAI,YAAA,CAAa,QAAA,CAAS,UAAU,CAAA,EAAG;AACrC,UAAA,OAAO,IAAA;AAAA,QACT;AAEA,QAAA,OAAO,eAAA,CAAgB,GAAA,CAAI,UAAU,CAAA,KAAM,IAAA;AAAA,MAC7C,CAAA;AAEA,MAAA,IAAI;AACF,QAAA,MAAM,SAAA,GAA+B,MAAM,WAAA,CAAY,UAAA,CAAW,cAAc,CAAA;AAChF,QAAA,MAAM,mBAAA,GAAgC,UAAU,OAAA,CAAQ,GAAA;AAAA,UACtD,CAAC,UAA+B,KAAA,CAAM;AAAA,SACxC;AAEA,QAAA,IAAI,mBAAA,CAAoB,SAAS,CAAA,EAAG;AAClC,UAAA,MAAM,gBAAgB,mBAAA,CACnB,GAAA,CAAI,CAAC,KAAA,KAAkB,OAAO,WAAA,IAAe,CAAA,CAC7C,MAAA,CAAO,CAAC,KAAA,KAA+C,OAAA,CAAQ,KAAK,CAAC,CAAA,CACrE,OAAO,cAAc,CAAA;AAExB,UAAA,IAAI,aAAA,CAAc,SAAS,CAAA,EAAG;AAG5B,YAAA,OAAO,KAAA,CAAM,IAAA,iBAAK,IAAI,GAAA,CAAI,CAAC,GAAG,YAAA,EAAc,GAAG,aAAa,CAAC,CAAC,CAAA;AAAA,UAChE;AAAA,QACF;AAAA,MACF,CAAA,CAAA,MAAQ;AAAA,MAER;AAEA,MAAA,IAAI,aAAA,CAAc,SAAS,CAAA,EAAG;AAC5B,QAAA,MAAM,IAAA,GAAO;AAAA,UACX,GAAG,YAAA;AAAA,UACH,GAAG,cACA,GAAA,CAAI,CAAC,UAAwB,KAAA,CAAM,MAAM,CAAA,CACzC,MAAA,CAAO,cAAc;AAAA,SAC1B;AAEA,QAAA,OAAO,MAAM,IAAA,CAAK,IAAI,IAAI,IAAI,CAAA,CAAE,QAAQ,CAAA;AAAA,MAC1C;AAEA,MAAA,OAAO,CAAC,GAAG,YAAY,CAAA;AAAA,IACzB;AAAA,GACD,CAAA;AACH;ACxHO,SAAS,+BACd,KAAA,EACA,QAAA,EACA,UAAA,GAAa,KAAA,EACb,WAAmB,KAAA,EACnB;AACA,EAAA,OAAOD,YAAAA,CAAa;AAAA,IAClB,UAAU,CAAC,SAAA,EAAW,oBAAoB,KAAA,EAAO,QAAA,EAAU,YAAY,QAAQ,CAAA;AAAA,IAC/E,SAAS,YAAY;AACnB,MAAA,MAAM,cAAcC,cAAAA,EAAe;AACnC,MAAA,MAAM,eAAA,GAAkB,MAAM,WAAA,EAAY;AAE1C,MAAA,IAAI,CAAC,QAAA,IAAY,CAAC,UAAA,EAAY;AAC5B,QAAA,OAAO,EAAC;AAAA,MACV;AAEA,MAAA,IAAI;AACF,QAAA,MAAM,SAAA,GAA+B,MAAM,WAAA,CAAY,UAAA;AAAA,UACrDC,wBAAAA,CAAyB,QAAA,EAAU,QAAA,EAAU,IAAI;AAAA,SACnD;AACA,QAAA,MAAM,UAAA,GAAa,UAAU,OAAA,CAAQ,IAAA;AAAA,UACnC,CAAC,SAAA,KAAmC,SAAA,CAAU,MAAA,CAAO,aAAY,KAAM;AAAA,SACzE;AAEA,QAAA,IAAI,CAAC,UAAA,EAAY;AACf,UAAA,OAAO,EAAC;AAAA,QACV;AAGA,QAAA,MAAM,UAAA,GAA4D,UAAA,CAAW,OAAA,IAAW,EAAC;AACzF,QAAA,MAAM,UAAA,GAA+B,UAAA,CAClC,GAAA,CAAI,CAAC,MAAA,KAA4D;AAEhE,UAAA,IAAI,OAAO,MAAA,KAAW,QAAA,EAAU,OAAO,MAAA;AACvC,UAAA,IAAI,MAAA,IAAU,OAAO,MAAA,KAAW,QAAA,EAAU;AACxC,YAAA,MAAM,MAAA,GAAS,MAAA;AACf,YAAA,OAAQ,OAAO,EAAA,IAAM,MAAA,CAAO,IAAA,IAAQ,MAAA,CAAO,QAAQ,MAAA,CAAO,MAAA;AAAA,UAC5D;AACA,UAAA,OAAO,KAAA,CAAA;AAAA,QACT,CAAC,CAAA,CACA,MAAA,CAAO,CAAC,EAAA,KAAyC,OAAA,CAAQ,EAAE,CAAC,CAAA,CAC5D,GAAA,CAAI,CAAC,EAAA,KAAe;AAEnB,UAAA,MAAM,SAAA,GAAY,GAAG,IAAA,EAAK,CAAE,aAAY,CAAE,OAAA,CAAQ,WAAW,GAAG,CAAA;AAGhE,UAAA,MAAM,QAAA,GAA2C;AAAA;AAAA,YAE/C,YAAY,cAAA,CAAe,QAAA;AAAA,YAC3B,yBAAyB,cAAA,CAAe,QAAA;AAAA;AAAA,YAGxC,uBAAuB,cAAA,CAAe,iBAAA;AAAA,YACtC,oBAAoB,cAAA,CAAe,iBAAA;AAAA,YACnC,oBAAoB,cAAA,CAAe,iBAAA;AAAA,YACnC,yBAAyB,cAAA,CAAe,mBAAA;AAAA,YACxC,yBAAyB,cAAA,CAAe,mBAAA;AAAA,YACxC,oBAAoB,cAAA,CAAe,mBAAA;AAAA,YACnC,oBAAoB,cAAA,CAAe,mBAAA;AAAA;AAAA,YAGnC,uBAAuB,cAAA,CAAe,OAAA;AAAA,YACtC,WAAW,cAAA,CAAe,OAAA;AAAA,YAC1B,YAAY,cAAA,CAAe,OAAA;AAAA,YAC3B,oBAAoB,cAAA,CAAe,SAAA;AAAA,YACnC,cAAc,cAAA,CAAe,SAAA;AAAA,YAC7B,aAAa,cAAA,CAAe,SAAA;AAAA;AAAA,YAG5B,YAAY,cAAA,CAAe,QAAA;AAAA,YAC3B,2BAA2B,cAAA,CAAe,QAAA;AAAA,YAC1C,eAAe,cAAA,CAAe,QAAA;AAAA,YAC9B,eAAe,cAAA,CAAe,QAAA;AAAA,YAC9B,kBAAkB,cAAA,CAAe,QAAA;AAAA,YACjC,cAAc,cAAA,CAAe,UAAA;AAAA,YAC7B,oBAAoB,cAAA,CAAe,UAAA;AAAA,YACnC,oBAAoB,cAAA,CAAe,UAAA;AAAA;AAAA,YAGnC,SAAS,cAAA,CAAe,KAAA;AAAA,YACxB,eAAe,cAAA,CAAe,KAAA;AAAA,YAC9B,eAAe,cAAA,CAAe,KAAA;AAAA,YAC9B,WAAW,cAAA,CAAe,OAAA;AAAA,YAC1B,iBAAiB,cAAA,CAAe,OAAA;AAAA,YAChC,iBAAiB,cAAA,CAAe,OAAA;AAAA;AAAA,YAGhC,QAAQ,cAAA,CAAe,IAAA;AAAA,YACvB,cAAc,cAAA,CAAe,IAAA;AAAA,YAC7B,eAAe,cAAA,CAAe,IAAA;AAAA,YAC9B,WAAW,cAAA,CAAe,OAAA;AAAA;AAAA,YAG1B,WAAW,cAAA,CAAe,OAAA;AAAA,YAC1B,gBAAgB,cAAA,CAAe,OAAA;AAAA,YAC/B,iBAAiB,cAAA,CAAe,OAAA;AAAA,YAChC,SAAS,cAAA,CAAe,OAAA;AAAA,YACxB,QAAQ,cAAA,CAAe,IAAA;AAAA,YACvB,eAAe,cAAA,CAAe,IAAA;AAAA,YAC9B,eAAe,cAAA,CAAe,IAAA;AAAA,YAC9B,SAAS,cAAA,CAAe,KAAA;AAAA,YACxB,iBAAiB,cAAA,CAAe,KAAA;AAAA,YAChC,gBAAgB,cAAA,CAAe,KAAA;AAAA,YAC/B,OAAO,cAAA,CAAe,GAAA;AAAA,YACtB,cAAc,cAAA,CAAe,GAAA;AAAA;AAAA,YAG7B,kBAAkB,cAAA,CAAe,aAAA;AAAA;AAAA;AAAA,YAGjC,8BAA8B,cAAA,CAAe,cAAA;AAAA,YAC7C,mBAAmB,cAAA,CAAe,cAAA;AAAA,YAClC,kBAAkB,cAAA,CAAe;AAAA,WACnC;AAGA,UAAA,MAAM,MAAA,GAAS,SAAS,SAAS,CAAA;AACjC,UAAA,IAAI,QAAQ,OAAO,MAAA;AAGnB,UAAA,MAAM,WAAA,GAAc,MAAA,CAAO,MAAA,CAAO,cAAc,CAAA,CAAE,IAAA;AAAA,YAChD,CAAC,EAAA,KAAO,EAAA,CAAG,WAAA,EAAY,KAAM;AAAA,WAC/B;AACA,UAAA,OAAO,WAAA;AAAA,QACT,CAAC,CAAA,CACA,MAAA,CAAO,CAAC,EAAA,KAAyD,OAAA,CAAQ,EAAE,CAAC,CAAA,CAE5E,MAAA,CAAO,CAAC,IAAoB,KAAA,EAAe,IAAA,KAA2B,KAAK,OAAA,CAAQ,EAAE,MAAM,KAAK,CAAA;AAEnG,QAAA,MAAM,cAAc,CAAC,MAAA,EAAQ,KAAK,CAAA,CAAE,SAAS,eAAe,CAAA;AAE5D,QAAA,MAAM,QAAA,GAAW,UAAA;AACjB,QAAA,MAAM,UAAA,GAAa,MAAA,CAAO,QAAA,CAAS,OAAA,IAAW,CAAC,CAAA,GAAI,CAAA;AAEnD,QAAA,IACE,WAAA,IACA,CAAC,UAAA,EACD;AACA,UAAA,OAAO,UAAA,CAAW,MAAA;AAAA,YAChB,CAAC,SAAA,KAAc,SAAA,KAAc,cAAA,CAAe;AAAA,WAC9C;AAAA,QACF;AAEA,QAAA,OAAO,UAAA;AAAA,MACT,CAAA,CAAA,MAAQ;AACN,QAAA,OAAO,EAAC;AAAA,MACV;AAAA,IACF;AAAA,GACD,CAAA;AACH;;;AC7IA,SAAS,qBAAA,CACP,QACA,WAAA,EACA;AACA,EAAA,IAAI,CAAC,MAAA,EAAQ;AACX,IAAA,OAAO,EAAC;AAAA,EACV;AAEA,EAAA,OAAS,CAAA,CAAA,IAAA;AAAA,IACP,MAAA;AAAA,IACE,CAAA,CAAA,MAAA;AAAA,MACA,CAAC,EAAE,IAAA,EAAM,MAAA,EAAO,KACd,IAAA,KAAS,OAAA,IACT,MAAA,CAAO,MAAA,CAAO,oBAAoB,CAAA,CAAE,QAAA,CAAS,MAAa;AAAA,KAC9D;AAAA,IACE,CAAA,CAAA,GAAA,CAAI,CAAC,IAAA,KAAS;AACd,MAAA,MAAM,IAAA,GAAO;AAAA,QACX,GAAI,IAAA,CAAK,IAAA,IAAQ;AAAC,OACpB;AAEA,MAAA,IAAI,OAAO,IAAA,CAAK,IAAA,KAAS,SAAA,IAAa,OAAO,gBAAgB,SAAA,EAAW;AACtE,QAAA,IAAA,CAAK,IAAA,GAAO,WAAA;AAAA,MACd;AAEA,MAAA,OAAO;AAAA,QACL,GAAG,IAAA;AAAA,QACH;AAAA,OACF;AAAA,IACF,CAAC,CAAA;AAAA;AAAA;AAAA,IAGC,CAAA,CAAA,OAAA;AAAA,MACA,CAAC,SAAwD,IAAA,CAAK;AAAA;AAChE,GACF;AACF;AAaO,SAAS,kCAAA,CACd,QAAA,EACA,IAAA,EACAC,QAAAA,EACA;AACA,EAAA,MAAM,cAAc,cAAA,EAAe;AAEnC,EAAA,MAAM,EAAE,IAAA,EAAM,WAAA,KAAgBC,QAAAA,CAASC,0BAAAA,CAA2B,QAAQ,CAAC,CAAA;AAC3E,EAAA,MAAM,EAAE,WAAA,EAAa,aAAA,EAAc,GAAI,gBAAA,CAAiB,UAAU,IAAI,CAAA;AAEtE,EAAA,OAAOP,WAAAA,CAAY;AAAA,IACjB,WAAA,EAAa;AAAA,MACX,gBAAA;AAAA,MACA,yBAAA;AAAA,MACA,WAAA,EAAa;AAAA,KACf;AAAA,IACA,UAAA,EAAY,OAAO,MAAA,KAAkC;AACnD,MAAA,IAAI,CAAC,WAAA,EAAa;AAChB,QAAA,MAAM,IAAI,MAAM,uDAAkD,CAAA;AAAA,MACpE;AAIA,MAAA,MAAM,kBAAA,GAAqB,qBAAA;AAAA,QACzB,YAAY,OAAA,EAAS;AAAA,OACvB;AAEA,MAAA,MAAM,aAAA,GACH,MAAA,CAAO,GAAA,CAAI,CAAC,EAAE,QAAA,EAAU,IAAA,EAAM,UAAA,EAAY,QAAA,EAAAQ,SAAAA,EAAU,GAAG,IAAA,EAAK,MAAO;AAAA,QAClE,MAAA,EAAQ,QAAA;AAAA,QACR,IAAA,EACE,SACC,MAAA,CAAO,MAAA,CAAO,oBAAoB,CAAA,CAAE,QAAA,CAAS,QAAe,CAAA,GACzD,OAAA,GACA,MAAA,CAAA;AAAA,QACN;AAAA,OACF,CAAE,KAAkC,EAAC;AAEvC,MAAA,MAAM,kBAAA,GAAqB,qBAAA,CAAsB,aAAA,EAAe,IAAI,CAAA;AACpE,MAAA,MAAM,wBAAwB,aAAA,CAAc,MAAA;AAAA,QAC1C,CAAC,EAAE,IAAA,EAAM,MAAA,EAAO,KACd,IAAA,KAAS,OAAA,IACT,CAAC,MAAA,CAAO,MAAA,CAAO,oBAAoB,CAAA,CAAE,SAAS,MAAa;AAAA,OAC/D;AAEA,MAAA,MAAM,iBAAA,GAAsB,CAAA,CAAA,IAAA;AAAA,QAC1B,kBAAA;AAAA,QACE,YAAU,kBAAkB,CAAA;AAAA,QAC5B,CAAA,CAAA,MAAA;AAAO,OACX;AAEA,MAAA,OAAO,aAAA,CAAc;AAAA,QACnB,MAAA,EAAQ;AAAA,UACN,GAAG,qBAAA;AAAA,UACH,GAAG;AAAA;AACL,OACD,CAAA;AAAA,IACH,CAAA;AAAA,IACA,SAASH,QAAAA,EAAS,OAAA;AAAA,IAClB,SAAA,EAAW,CAAC,QAAA,EAAU,IAAA,EAAM,OAAA,KAAY;AACtC,MACEA,QAAAA,EAAS,SAAA,GAOP,QAAA,EAAU,IAAA,EAAM,OAAO,CAAA;AAC3B,MAAA,WAAA,CAAY,iBAAA,CAAkB;AAAA,QAC5B,QAAA,EAAU,gCAAA,CAAiC,QAAQ,CAAA,CAAE;AAAA,OACtD,CAAA;AAAA,IACH;AAAA,GACD,CAAA;AACH;;;ACzHA,SAAS,WAAA,GAAgC;AACvC,EAAA,IAAI,OAAO,MAAA,KAAW,WAAA,IAAe,CAAC,OAAO,QAAA,EAAU;AACrD,IAAA,MAAM,IAAI,MAAM,oBAAoB,CAAA;AAAA,EACtC;AACA,EAAA,OAAO,MAAA,CAAO,QAAA;AAChB;AAEA,IAAM,WAAA,GAAc,oBAAA;AAEpB,IAAM,gBAAA,GAA2G;AAAA,EAC/G,mBAA4B;AAAA,IAC1B,OAAA,EAAS,KAAA;AAAA,IACT,IAAA,EAAM,kBAAA;AAAA,IACN,MAAA,EAAQ,0BAAA;AAAA,IACR,WAAA,EAAa;AAAA,GACf;AAAA,EACA,mBAA4B;AAAA,IAC1B,OAAA,EAAS,MAAA;AAAA,IACT,IAAA,EAAM,iBAAA;AAAA,IACN,MAAA,EAAQ,kCAAA;AAAA,IACR,WAAA,EAAa;AAAA;AAEjB,CAAA;AAEO,SAAS,kBAAkB,QAAA,EAAgC;AAChE,EAAA,MAAM,MAAA,GAAS,iBAAiB,QAAQ,CAAA;AACxC,EAAA,IAAI,CAAC,MAAA,EAAQ,MAAM,IAAI,KAAA,CAAM,CAAA,0BAAA,EAA6B,QAAQ,CAAA,CAAE,CAAA;AACpE,EAAA,OAAO,MAAA;AACT;AAEO,SAAS,iBAAA,CAAkB,UAAgC,MAAA,EAAgB;AAChF,EAAA,OAAO,GAAG,iBAAA,CAAkB,QAAQ,CAAA,CAAE,WAAW,GAAG,MAAM,CAAA,CAAA;AAC5D;AAEA,eAAsB,eAAe,QAAA,EAA+C;AAClF,EAAA,MAAM,WAAW,WAAA,EAAY;AAE7B,EAAA,MAAM,EAAE,OAAA,EAAS,IAAA,EAAM,MAAA,EAAO,GAAI,kBAAkB,QAAQ,CAAA;AAC5D,EAAA,MAAM,iBAAiB,MAAM,QAAA,CAAS,QAAgB,EAAE,MAAA,EAAQ,eAAe,CAAA;AAE/E,EAAA,IAAI,mBAAmB,OAAA,EAAS;AAEhC,EAAA,IAAI;AACF,IAAA,MAAM,SAAS,OAAA,CAAQ;AAAA,MACrB,MAAA,EAAQ,4BAAA;AAAA,MACR,MAAA,EAAQ,CAAC,EAAE,OAAA,EAAS;AAAA,KACrB,CAAA;AAAA,EACH,SAAS,GAAA,EAAc;AAErB,IAAA,IAAI,OAAO,QAAQ,QAAA,IAAY,GAAA,KAAQ,QAAQ,MAAA,IAAU,GAAA,IAAQ,GAAA,CAAyB,IAAA,KAAS,IAAA,EAAM;AACvG,MAAA,MAAM,SAAS,OAAA,CAAQ;AAAA,QACrB,MAAA,EAAQ,yBAAA;AAAA,QACR,QAAQ,CAAC;AAAA,UACP,OAAA;AAAA,UACA,SAAA,EAAW,IAAA;AAAA,UACX,OAAA,EAAS,CAAC,MAAM,CAAA;AAAA,UAChB,cAAA,EAAgB;AAAA,YACd,IAAA,EAAM,+BAAwC,OAAA,GAAU,KAAA;AAAA,YACxD,MAAA,EAAQ,+BAAwC,KAAA,GAAQ,KAAA;AAAA,YACxD,QAAA,EAAU;AAAA;AACZ,SACD;AAAA,OACF,CAAA;AAAA,IACH,CAAA,MAAO;AACL,MAAA,MAAM,GAAA;AAAA,IACR;AAAA,EACF;AACF;AAEA,eAAsB,cAAA,CACpB,IAAA,EACA,EAAA,EACA,QAAA,EACA,QAAA,EAC0E;AAC1E,EAAA,MAAM,WAAW,WAAA,EAAY;AAE7B,EAAA,MAAM,eAAe,QAAQ,CAAA;AAE7B,EAAA,MAAM,CAAC,QAAA,EAAU,QAAQ,CAAA,GAAI,MAAM,QAAQ,GAAA,CAAI;AAAA,IAC7C,SAAS,OAAA,CAAgB;AAAA,MACvB,MAAA,EAAQ,iBAAA;AAAA,MACR,QAAQ,CAAC,EAAE,MAAM,EAAA,EAAI,KAAA,EAAO,UAAU;AAAA,KACvC,CAAA;AAAA,IACD,QAAA,CAAS,OAAA,CAAgB,EAAE,MAAA,EAAQ,gBAAgB;AAAA,GACpD,CAAA;AAED,EAAA,MAAM,eAAA,GAAkB,MAAA,CAAO,QAAQ,CAAA,GAAI,OAAO,QAAQ,CAAA;AAE1D,EAAA,OAAO,EAAE,QAAA,EAAU,QAAA,EAAU,eAAA,EAAgB;AAC/C;AAEO,SAAS,SAAA,CAAU,GAAA,EAAa,QAAA,GAAW,CAAA,EAAW;AAC3D,EAAA,MAAM,QAAQ,GAAA,GAAM,WAAA;AACpB,EAAA,MAAM,MAAM,GAAA,GAAM,WAAA;AAClB,EAAA,IAAI,GAAA,KAAQ,EAAA,EAAI,OAAO,KAAA,CAAM,QAAA,EAAS;AAEtC,EAAA,MAAM,KAAA,GAAQ,GAAA,IAAO,MAAA,CAAO,QAAQ,CAAA;AACpC,EAAA,MAAM,UAAA,GAAc,MAAM,KAAA,GAAS,WAAA;AACnC,EAAA,MAAM,OAAA,GAAU,UAAA,CAAW,QAAA,EAAS,CAAE,QAAA,CAAS,UAAU,GAAG,CAAA,CAAE,OAAA,CAAQ,KAAA,EAAO,EAAE,CAAA;AAC/E,EAAA,OAAO,UAAU,CAAA,EAAG,KAAK,IAAI,OAAO,CAAA,CAAA,GAAK,MAAM,QAAA,EAAS;AAC1D;AAEA,IAAM,YAAA,GAAe,eAAA;AAEd,SAAS,WAAW,MAAA,EAAwB;AACjD,EAAA,MAAM,OAAA,GAAU,OAAO,IAAA,EAAK;AAC5B,EAAA,IAAI,CAAC,YAAA,CAAa,IAAA,CAAK,OAAO,CAAA,EAAG;AAC/B,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,iBAAA,EAAoB,MAAM,CAAA,CAAA,CAAG,CAAA;AAAA,EAC/C;AAEA,EAAA,MAAM,CAAC,KAAA,EAAO,QAAA,GAAW,EAAE,CAAA,GAAI,OAAA,CAAQ,MAAM,GAAG,CAAA;AAChD,EAAA,IAAI,CAAC,OAAA,CAAQ,IAAA,CAAK,KAAK,CAAA,IAAM,YAAY,CAAC,OAAA,CAAQ,IAAA,CAAK,QAAQ,CAAA,EAAI;AACjE,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,iBAAA,EAAoB,MAAM,CAAA,CAAA,CAAG,CAAA;AAAA,EAC/C;AAEA,EAAA,MAAM,cAAA,GAAiB,SAAS,MAAA,CAAO,EAAA,EAAI,GAAG,CAAA,CAAE,KAAA,CAAM,GAAG,EAAE,CAAA;AAC3D,EAAA,MAAM,MAAM,MAAA,CAAO,KAAK,CAAA,GAAI,WAAA,GAAc,OAAO,cAAc,CAAA;AAC/D,EAAA,OAAO,IAAA,GAAO,GAAA,CAAI,QAAA,CAAS,EAAE,CAAA;AAC/B;AAEA,eAAsB,eAAA,CACpB,EAAA,EACA,SAAA,EACA,QAAA,EACA,YAAA,EACiB;AACjB,EAAA,MAAM,WAAW,WAAA,EAAY;AAE7B,EAAA,MAAM,eAAe,QAAQ,CAAA;AAE7B,EAAA,MAAM,WAAW,MAAM,QAAA,CAAS,QAAkB,EAAE,MAAA,EAAQ,uBAAuB,CAAA;AACnF,EAAA,MAAM,IAAA,GAAO,SAAS,CAAC,CAAA;AACvB,EAAA,IAAI,CAAC,IAAA,EAAM,MAAM,IAAI,MAAM,+BAA+B,CAAA;AAO1D,EAAA,IAAI,gBAAgB,IAAA,CAAK,WAAA,EAAY,KAAM,YAAA,CAAa,aAAY,EAAG;AACrE,IAAA,MAAM,IAAI,MAAM,kBAAkB,CAAA;AAAA,EACpC;AAEA,EAAA,MAAM,MAAA,GAAS,MAAM,QAAA,CAAS,OAAA,CAAgB;AAAA,IAC5C,MAAA,EAAQ,qBAAA;AAAA,IACR,QAAQ,CAAC;AAAA,MACP,IAAA;AAAA,MACA,EAAA;AAAA,MACA,KAAA,EAAO;AAAA,KACR;AAAA,GACF,CAAA;AAED,EAAA,OAAO,MAAA;AACT;AC1KA,IAAM,gBAAA,GAAmB,iCAAA;AACzB,IAAM,gBAAA,GAAmB,WAAA;AACzB,IAAMI,aAAAA,GAAe,eAAA;AAEd,SAAS,kBAAkB,SAAA,EAAmB;AACnD,EAAA,OAAO,CAAA,EAAG,gBAAgB,CAAA,EAAG,SAAS,CAAA,CAAA;AACxC;AAEO,SAAS,gBAAgB,MAAA,EAAwB;AACtD,EAAA,MAAM,OAAA,GAAU,OAAO,IAAA,EAAK;AAC5B,EAAA,IAAI,CAACA,aAAAA,CAAa,IAAA,CAAK,OAAO,CAAA,EAAG;AAC/B,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,iBAAA,EAAoB,MAAM,CAAA,CAAA,CAAG,CAAA;AAAA,EAC/C;AAEA,EAAA,MAAM,CAAC,KAAA,EAAO,QAAA,GAAW,EAAE,CAAA,GAAI,OAAA,CAAQ,MAAM,GAAG,CAAA;AAChD,EAAA,IAAI,CAAC,OAAA,CAAQ,IAAA,CAAK,KAAK,CAAA,IAAM,YAAY,CAAC,OAAA,CAAQ,IAAA,CAAK,QAAQ,CAAA,EAAI;AACjE,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,iBAAA,EAAoB,MAAM,CAAA,CAAA,CAAG,CAAA;AAAA,EAC/C;AAEA,EAAA,IAAI,QAAA,CAAS,MAAA,GAAS,CAAA,IAAK,QAAA,CAAS,KAAA,CAAM,CAAC,CAAA,CAAE,OAAA,CAAQ,IAAA,EAAM,EAAE,CAAA,CAAE,MAAA,GAAS,CAAA,EAAG;AACzE,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,wCAAA,EAA2C,MAAM,CAAA,CAAA,CAAG,CAAA;AAAA,EACtE;AAEA,EAAA,MAAM,cAAA,GAAiB,SAAS,MAAA,CAAO,CAAA,EAAG,GAAG,CAAA,CAAE,KAAA,CAAM,GAAG,CAAC,CAAA;AACzD,EAAA,OAAO,MAAA,CAAO,KAAK,CAAA,GAAI,gBAAA,GAAmB,OAAO,cAAc,CAAA;AACjE;AAEO,SAAS,cAAA,CAAe,QAAA,EAAkB,QAAA,GAAW,CAAA,EAAW;AACrE,EAAA,MAAM,QAAQ,QAAA,GAAW,gBAAA;AACzB,EAAA,MAAM,MAAM,QAAA,GAAW,gBAAA;AACvB,EAAA,IAAI,GAAA,KAAQ,EAAA,EAAI,OAAO,KAAA,CAAM,QAAA,EAAS;AAEtC,EAAA,MAAM,KAAA,GAAQ,GAAA,IAAO,MAAA,CAAO,QAAQ,CAAA;AACpC,EAAA,MAAM,UAAA,GAAc,MAAM,KAAA,GAAS,gBAAA;AACnC,EAAA,MAAM,OAAA,GAAU,UAAA,CAAW,QAAA,EAAS,CAAE,QAAA,CAAS,UAAU,GAAG,CAAA,CAAE,OAAA,CAAQ,KAAA,EAAO,EAAE,CAAA;AAC/E,EAAA,OAAO,UAAU,CAAA,EAAG,KAAK,IAAI,OAAO,CAAA,CAAA,GAAK,MAAM,QAAA,EAAS;AAC1D;AAcA,eAAe,MAAA,CAAU,MAAA,EAAgB,MAAA,GAAoB,EAAC,EAAe;AAC3E,EAAA,MAAM,OAAA,GAAUR,cAAc,mBAAA,EAAoB;AAClD,EAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,CAAA,EAAG,OAAO,CAAA,oBAAA,CAAA,EAAwB;AAAA,IAC7D,MAAA,EAAQ,MAAA;AAAA,IACR,OAAA,EAAS,EAAE,cAAA,EAAgB,kBAAA,EAAmB;AAAA,IAC9C,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,EAAE,OAAA,EAAS,OAAO,EAAA,EAAI,CAAA,EAAG,MAAA,EAAQ,MAAA,EAAQ;AAAA,GAC/D,CAAA;AAED,EAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,IAAA,MAAM,OAAO,MAAM,QAAA,CAAS,MAAK,CAAE,KAAA,CAAM,MAAM,EAAE,CAAA;AACjD,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,QAAA,EAAW,MAAM,CAAA,SAAA,EAAY,SAAS,MAAM,CAAA,CAAA,EAAI,QAAA,CAAS,UAAU,GAAG,IAAA,GAAO,CAAA,QAAA,EAAM,IAAI,CAAA,CAAA,GAAK,EAAE,CAAA,CAAE,CAAA;AAAA,EAClH;AAEA,EAAA,MAAM,IAAA,GAA2B,MAAM,QAAA,CAAS,IAAA,EAAK;AACrD,EAAA,IAAI,KAAK,KAAA,EAAO;AACd,IAAA,MAAM,IAAI,KAAA,CAAM,IAAA,CAAK,MAAM,OAAA,IAAW,CAAA,QAAA,EAAW,MAAM,CAAA,OAAA,CAAS,CAAA;AAAA,EAClE;AACA,EAAA,OAAO,IAAA,CAAK,MAAA;AACd;AAEA,eAAe,uBAAA,GAAwC;AACrD,EAAA,MAAM,EAAE,UAAA,EAAW,GAAI,MAAM,OAAO,sBAAsB,CAAA;AAC1D,EAAA,MAAM,aAAa,UAAA,EAAW;AAC9B,EAAA,MAAM,OAAA,GAAU,WAAW,GAAA,EAAI;AAG/B,EAAA,MAAM,WAAW,OAAA,CAAQ,IAAA;AAAA,IACvB,CAAC,CAAA,KACC,CAAA,CAAE,IAAA,CAAK,aAAY,CAAE,QAAA,CAAS,UAAU,CAAA,IACxC,EAAE,QAAA,CAAS,kBAAkB,CAAA,IAC7B,CAAA,CAAE,SAAS,+BAA+B;AAAA,GAC9C;AAEA,EAAA,IAAI,CAAC,QAAA,EAAU;AACb,IAAA,MAAM,IAAI,MAAM,uEAAuE,CAAA;AAAA,EACzF;AAEA,EAAA,OAAO,QAAA;AACT;AAEA,eAAsB,eAAA,CACpB,IACA,SAAA,EACiB;AACjB,EAAA,MAAM,QAAA,GAAW,MAAM,uBAAA,EAAwB;AAG/C,EAAA,MAAM,cAAA,GAAiB,QAAA,CAAS,QAAA,CAAS,kBAAkB,CAAA;AAC3D,EAAA,MAAM,eAAe,OAAA,EAAQ;AAE7B,EAAA,MAAM,UAAA,GAAa,SAAS,QAAA,EAAU,IAAA;AAAA,IACpC,CAAC,GAAA,KAAa,GAAA,CAAI,MAAA,EAAQ,IAAA,CAAK,CAAC,CAAA,KAAc,CAAA,CAAE,UAAA,CAAW,SAAS,CAAC;AAAA,GACvE;AAEA,EAAA,IAAI,CAAC,UAAA,EAAY;AACf,IAAA,MAAM,IAAI,MAAM,sCAAsC,CAAA;AAAA,EACxD;AAGA,EAAA,MAAM,EAAE,SAAA,EAAW,aAAA,EAAe,aAAY,GAAI,MAAM,OAAO,iBAAiB,CAAA;AAEhF,EAAA,MAAM,UAAA,GAAa,IAAI,SAAA,CAAU,UAAA,CAAW,OAAO,CAAA;AACnD,EAAA,MAAM,QAAA,GAAW,IAAI,SAAA,CAAU,EAAE,CAAA;AACjC,EAAA,MAAM,QAAA,GAAW,gBAAgB,SAAS,CAAA;AAE1C,EAAA,MAAM,WAAA,GAAc,IAAI,WAAA,EAAY,CAAE,GAAA;AAAA,IACpC,cAAc,QAAA,CAAS;AAAA,MACrB,UAAA;AAAA,MACA,QAAA;AAAA,MACA;AAAA,KACD;AAAA,GACH;AAGA,EAAA,MAAM,kBAAkB,MAAM,MAAA;AAAA,IAC5B,oBAAA;AAAA,IACA,CAAC,EAAE,UAAA,EAAY,WAAA,EAAa;AAAA,GAC9B;AACA,EAAA,WAAA,CAAY,eAAA,GAAkB,gBAAgB,KAAA,CAAM,SAAA;AACpD,EAAA,WAAA,CAAY,QAAA,GAAW,UAAA;AAGvB,EAAA,MAAM,YAAA,GAAe,YAAY,SAAA,CAAU;AAAA,IACzC,oBAAA,EAAsB,KAAA;AAAA,IACtB,gBAAA,EAAkB;AAAA,GACnB,CAAA;AAED,EAAA,MAAM,kBAAA,GAAqB,QAAA,CAAS,QAAA,CAAS,+BAA+B,CAAA;AAC5E,EAAA,IAAI,CAAC,kBAAA,EAAoB;AACvB,IAAA,MAAM,IAAI,MAAM,+EAA+E,CAAA;AAAA,EACjG;AAEA,EAAA,MAAM,CAAC,MAAM,CAAA,GAAI,MAAM,mBAAmB,sBAAA,CAAuB;AAAA,IAC/D,OAAA,EAAS,UAAA;AAAA,IACT,WAAA,EAAa,YAAA;AAAA,IACb,KAAA,EAAO;AAAA,GACR,CAAA;AAGD,EAAA,IAAI,OAAO,MAAA,CAAO,SAAA,KAAc,QAAA,EAAU;AACxC,IAAA,OAAO,MAAA,CAAO,SAAA;AAAA,EAChB;AAGA,EAAA,MAAM,EAAE,MAAA,EAAO,GAAI,MAAM,OAAO,aAAa,CAAA;AAC7C,EAAA,OAAO,OAAO,MAAA,CAAO,IAAI,UAAA,CAAW,MAAA,CAAO,SAAS,CAAC,CAAA;AACvD;AC5IO,SAAS,oBAAoB,QAAA,EAAgC;AAClE,EAAA,MAAM,cAAcS,cAAAA,EAAe;AAEnC,EAAA,OAAOV,WAAAA,CAAY;AAAA,IACjB,WAAA,EAAa,CAAC,gBAAA,EAAkB,mBAAA,EAAqB,QAAQ,CAAA;AAAA,IAC7D,YAAY,OAAO,EAAE,EAAA,EAAI,MAAA,EAAQ,cAAa,KAA+B;AAC3E,MAAA,QAAQ,QAAA;AAAU,QAChB,KAAA,KAAA;AAAA,QACA,KAAA,KAAA,YAA+B;AAC7B,UAAA,MAAM,QAAA,GAAW,WAAW,MAAM,CAAA;AAClC,UAAA,MAAM,SAAS,MAAM,eAAA,CAAgB,EAAA,EAAI,QAAA,EAAU,UAAU,YAAY,CAAA;AACzE,UAAA,OAAO,EAAE,QAAQ,QAAA,EAAS;AAAA,QAC5B;AAAA,QACA,KAAA,KAAA,YAA+B;AAC7B,UAAA,MAAM,SAAA,GAAY,MAAM,eAAA,CAAgB,EAAA,EAAI,MAAM,CAAA;AAClD,UAAA,OAAO,EAAE,MAAA,EAAQ,SAAA,EAAW,QAAA,EAAS;AAAA,QACvC;AAAA;AACF,IACF,CAAA;AAAA,IACA,WAAW,MAAM;AACf,MAAA,WAAA,CAAY,iBAAA,CAAkB;AAAA,QAC5B,QAAA,EAAU,CAAC,gBAAA,EAAkB,yBAAyB;AAAA,OACvD,CAAA;AAAA,IACH;AAAA,GACD,CAAA;AACH;AChCA,IAAM,UAAA,GAAuC;AAAA,EAC3C,KAAA,EAAO,CAAA;AAAA,EACP,MAAA,EAAQ,CAAA;AAAA,EACR,OAAA,EAAS,CAAA;AAAA,EACT,IAAA,EAAM;AACR,CAAA;AAEO,SAAS,aAAA,CACd,QAAA,EACA,IAAA,EACA,YAAA,GAAe,CAAA,EACf;AACA,EAAA,MAAM,IAAA,GAAO,mBAAmB,QAAQ,CAAA;AACxC,EAAA,MAAM,MAAA,GAAS,KAAA,CAAM,cAAA,CAAe,IAAI,CAAA;AACxC,EAAA,MAAM,OAAO,CAAA,YAAA,EAAe,YAAY,CAAA,KAAA,EAAQ,UAAA,CAAW,IAAI,CAAC,CAAA,CAAA,CAAA;AAChE,EAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,MAAA,CAAO,IAAI,CAAA;AAChC,EAAA,IAAI,CAAC,MAAM,UAAA,EAAY;AACrB,IAAA,MAAM,IAAI,MAAM,gDAAgD,CAAA;AAAA,EAClE;AACA,EAAA,MAAM,KAAK,UAAA,CAAW,IAAA,CAAK,OAAO,IAAA,CAAK,KAAA,CAAM,UAAU,CAAC,CAAA;AACxD,EAAA,OAAO;AAAA,IACL,UAAA,EAAY,GAAG,QAAA,EAAS;AAAA,IACxB,SAAA,EAAW,EAAA,CAAG,YAAA,EAAa,CAAE,QAAA;AAAS,GACxC;AACF;AAEO,SAAS,cAAA,CACd,QAAA,EACA,YAAA,GAAe,CAAA,EACf;AACA,EAAA,MAAM,KAAA,GAAQ,aAAA,CAAc,QAAA,EAAU,OAAA,EAAS,YAAY,CAAA;AAC3D,EAAA,MAAM,MAAA,GAAS,aAAA,CAAc,QAAA,EAAU,QAAA,EAAU,YAAY,CAAA;AAC7D,EAAA,MAAM,OAAA,GAAU,aAAA,CAAc,QAAA,EAAU,SAAA,EAAW,YAAY,CAAA;AAC/D,EAAA,MAAM,IAAA,GAAO,aAAA,CAAc,QAAA,EAAU,MAAA,EAAQ,YAAY,CAAA;AACzD,EAAA,OAAO;AAAA,IACL,OAAO,KAAA,CAAM,UAAA;AAAA,IACb,QAAQ,MAAA,CAAO,UAAA;AAAA,IACf,SAAS,OAAA,CAAQ,UAAA;AAAA,IACjB,MAAM,IAAA,CAAK,UAAA;AAAA,IACX,aAAa,KAAA,CAAM,SAAA;AAAA,IACnB,cAAc,MAAA,CAAO,SAAA;AAAA,IACrB,eAAe,OAAA,CAAQ,SAAA;AAAA,IACvB,YAAY,IAAA,CAAK;AAAA,GACnB;AACF;ACpDO,SAAS,2BAAA,CACd,QAAA,EACA,cAAA,EACA,IAAA,EACA;AACA,EAAA,MAAM,EAAA,GAAKW,UAAAA,CAAW,SAAA,CAAU,QAAA,EAAU,gBAAgB,IAAI,CAAA;AAC9D,EAAA,OAAO;AAAA,IACL,UAAA,EAAY,GAAG,QAAA,EAAS;AAAA,IACxB,SAAA,EAAW,EAAA,CAAG,YAAA,EAAa,CAAE,QAAA;AAAS,GACxC;AACF;AAEO,SAAS,4BAAA,CACd,UACA,cAAA,EACA;AACA,EAAA,MAAM,KAAA,GAAQ,2BAAA,CAA4B,QAAA,EAAU,cAAA,EAAgB,OAAO,CAAA;AAC3E,EAAA,MAAM,MAAA,GAAS,2BAAA,CAA4B,QAAA,EAAU,cAAA,EAAgB,QAAQ,CAAA;AAC7E,EAAA,MAAM,OAAA,GAAU,2BAAA;AAAA,IACd,QAAA;AAAA,IACA,cAAA;AAAA,IACA;AAAA,GACF;AACA,EAAA,MAAM,IAAA,GAAO,2BAAA,CAA4B,QAAA,EAAU,cAAA,EAAgB,MAAM,CAAA;AACzE,EAAA,OAAO;AAAA,IACL,OAAO,KAAA,CAAM,UAAA;AAAA,IACb,QAAQ,MAAA,CAAO,UAAA;AAAA,IACf,SAAS,OAAA,CAAQ,UAAA;AAAA,IACjB,MAAM,IAAA,CAAK,UAAA;AAAA,IACX,aAAa,KAAA,CAAM,SAAA;AAAA,IACnB,cAAc,MAAA,CAAO,SAAA;AAAA,IACrB,eAAe,OAAA,CAAQ,SAAA;AAAA,IACvB,YAAY,IAAA,CAAK;AAAA,GACnB;AACF;AChCA,eAAsB,uBAAA,CAClB,QAAA,EACA,IAAA,EACA,IAAA,GAA2B,QAAA,EACD;AAC5B,EAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,IAAA,EAAK,CAAE,WAAA,EAAY;AAG1C,EAAA,MAAM,OAAA,GAAW,MAAM,MAAA,CAAO,WAAA,CAAY,UAAA;AAAA,IACtCJ,2BAA2B,KAAK;AAAA,GACpC;AACA,EAAA,IAAI,CAAC,OAAA,EAAS;AACZ,IAAA,MAAM,IAAI,MAAM,2DAAsD,CAAA;AAAA,EACxE;AAGA,EAAA,MAAM,IAAA,GAAO,QAAQ,IAAI,CAAA;AAQzB,EAAA,IAAI,UAAA,GAAa,KAAA;AACjB,EAAA,IAAI;AACF,IAAA,MAAM,KAAA,GAAQ,eAAe,IAAI,CAAA;AACjC,IAAA,MAAM,QAAA,GAAW,IAAA,KAAS,OAAA,GAAU,KAAA,CAAM,cAAc,KAAA,CAAM,YAAA;AAC9D,IAAA,UAAA,GAAa,IAAA,CAAK,SAAA,CAAU,IAAA,CAAK,CAAC,CAAC,GAAG,CAAA,KAAM,MAAA,CAAO,GAAG,CAAA,KAAM,QAAQ,CAAA;AAAA,EACtE,CAAA,CAAA,MAAQ;AAAA,EAER;AACA,EAAA,IAAI,YAAY,OAAO,OAAA;AAGvB,EAAA,MAAM,SAAA,GAAYI,WAAW,SAAA,CAAU,KAAA,EAAO,MAAM,IAAI,CAAA,CACnD,YAAA,EAAa,CACb,QAAA,EAAS;AAEd,EAAA,MAAM,WAAA,GAAc,IAAA,CAAK,SAAA,CAAU,IAAA,CAAK,CAAC,CAAC,GAAG,CAAA,KAAM,MAAA,CAAO,GAAG,CAAA,KAAM,SAAS,CAAA;AAC5E,EAAA,IAAI,aAAa,OAAO,iBAAA;AAExB,EAAA,OAAO,SAAA;AACT;;;AC3CA,IAAM,gBAAA,GAAyD;AAAA,EAC7D,SAAA,EAAA,KAAA;AAAA,EACA,SAAA,EAAA,KAAA;AACF,CAAA;AAEA,IAAM,YAAA,GAAe,2BAAA;AAyBrB,eAAsB,wBAAA,GAAsD;AAC1E,EAAA,MAAM,YAA8B,EAAC;AAErC,EAAA,IAAI;AACF,IAAA,MAAM,EAAE,UAAA,EAAW,GAAI,MAAM,OAAO,sBAAsB,CAAA;AAC1D,IAAA,MAAM,aAAa,UAAA,EAAW;AAC9B,IAAA,MAAM,OAAA,GAAU,WAAW,GAAA,EAAI;AAI/B,IAAA,MAAM,YAAY,OAAA,CAAQ,MAAA;AAAA,MACxB,CAAC,CAAA,KACC,CAAA,CAAE,IAAA,CAAK,WAAA,EAAY,CAAE,QAAA,CAAS,UAAU,CAAA,IACxC,CAAA,CAAE,QAAA,CAAS,kBAAkB;AAAA,KACjC;AAEA,IAAA,KAAA,MAAW,YAAY,SAAA,EAAW;AAChC,MAAA,IAAI;AACF,QAAA,MAAM,cAAA,GAAiB,QAAA,CAAS,QAAA,CAAS,kBAAkB,CAAA;AAE3D,QAAA,MAAM,eAAe,OAAA,EAAQ;AAAA,MAC/B,SAAS,UAAA,EAAY;AACnB,QAAA,IAAI,OAAA,CAAQ,GAAA,CAAI,QAAA,KAAa,aAAA,EAAe;AAC1C,UAAA,OAAA,CAAQ,GAAA,CAAI,6DAA6D,UAAU,CAAA;AAAA,QACrF;AACA,QAAA;AAAA,MACF;AAEA,MAAA,KAAA,MAAW,OAAA,IAAW,QAAA,CAAS,QAAA,IAAY,EAAC,EAAG;AAC7C,QAAA,IAAI,CAAC,QAAQ,OAAA,IAAW,CAAC,MAAM,OAAA,CAAQ,OAAA,CAAQ,MAAM,CAAA,EAAG;AAExD,QAAA,KAAA,MAAW,CAAC,MAAA,EAAQ,QAAQ,KAAK,MAAA,CAAO,OAAA,CAAQ,gBAAgB,CAAA,EAAG;AACjE,UAAA,IAAI,SAAA,CAAU,QAAQ,CAAA,EAAG;AACzB,UAAA,IAAI,OAAA,CAAQ,OAAO,IAAA,CAAK,CAAC,MAAc,CAAA,CAAE,UAAA,CAAW,MAAM,CAAC,CAAA,EAAG;AAC5D,YAAA,SAAA,CAAU,QAAQ,IAAI,OAAA,CAAQ,OAAA;AAAA,UAChC;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF,SAAS,CAAA,EAAG;AACV,IAAA,IAAI,OAAA,CAAQ,GAAA,CAAI,QAAA,KAAa,aAAA,EAAe;AAC1C,MAAA,OAAA,CAAQ,GAAA,CAAI,2DAA2D,CAAC,CAAA;AAAA,IAC1E;AAAA,EACF;AAEA,EAAA,OAAO,SAAA;AACT;AAMA,eAAsB,eAAA,GAA+C;AACnE,EAAA,IAAI,OAAO,MAAA,KAAW,WAAA,IAAe,CAAC,MAAA,CAAO,QAAA,EAAU,YAAY,OAAO,MAAA;AAE1E,EAAA,IAAI;AACF,IAAA,MAAM,QAAA,GAAW,MAAM,MAAA,CAAO,QAAA,CAAS,OAAA,CAAQ;AAAA,MAC7C,MAAA,EAAQ;AAAA,KACT,CAAA;AAED,IAAA,OAAO,QAAA,GAAW,CAAC,CAAA,IAAK,KAAA,CAAA;AAAA,EAC1B,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,MAAA;AAAA,EACT;AACF;AAMA,eAAsB,uBAAA,GAAqD;AACzE,EAAA,MAAM,YAA8B,EAAC;AAGrC,EAAA,MAAM,UAAA,GAAa,MAAM,eAAA,EAAgB;AACzC,EAAA,IAAI,UAAA,EAAY;AACd,IAAA,SAAA,CAAA,KAAA,WAAkC,GAAI,UAAA;AACtC,IAAA,SAAA,CAAA,KAAA,WAAkC,GAAI,UAAA;AAAA,EACxC;AAGA,EAAA,MAAM,mBAAA,GAAsB,MAAM,wBAAA,EAAyB;AAC3D,EAAA,MAAA,CAAO,MAAA,CAAO,WAAW,mBAAmB,CAAA;AAE5C,EAAA,OAAO,SAAA;AACT;AAKA,eAAsB,eAAA,GAAiC;AACrD,EAAA,IAAI,OAAO,MAAA,KAAW,WAAA,IAAe,CAAC,OAAO,QAAA,EAAU;AACrD,IAAA,MAAM,IAAI,MAAM,2BAA2B,CAAA;AAAA,EAC7C;AACA,EAAA,MAAM,MAAA,CAAO,SAAS,OAAA,CAAQ;AAAA,IAC5B,MAAA,EAAQ,qBAAA;AAAA,IACR,QAAQ,EAAE,CAAC,YAAY,GAAG,EAAC;AAAE,GAC9B,CAAA;AACH;AAMA,eAAsB,iBAAA,GAA8C;AAClE,EAAA,IAAI,OAAO,MAAA,KAAW,WAAA,IAAe,CAAC,OAAO,QAAA,EAAU;AACrD,IAAA,MAAM,IAAI,MAAM,2BAA2B,CAAA;AAAA,EAC7C;AAEA,EAAA,MAAM,MAAA,GAAS,MAAM,MAAA,CAAO,QAAA,CAAS,OAAA,CAAQ;AAAA,IAC3C,MAAA,EAAQ,mBAAA;AAAA,IACR,MAAA,EAAQ;AAAA,MACN,MAAA,EAAQ,YAAA;AAAA,MACR,OAAA,EAAS;AAAA,QACP,MAAA,EAAQ,oBAAA;AAAA,QACR,MAAA,EAAQ;AAAA,UACN,IAAA,EAAM;AAAA,YACJ,EAAE,IAAA,EAAM,OAAA,EAAS,YAAA,EAAc,CAAA,EAAE;AAAA,YACjC,EAAE,IAAA,EAAM,QAAA,EAAU,YAAA,EAAc,CAAA,EAAE;AAAA,YAClC,EAAE,IAAA,EAAM,SAAA,EAAW,YAAA,EAAc,CAAA,EAAE;AAAA,YACnC,EAAE,IAAA,EAAM,MAAA,EAAQ,YAAA,EAAc,CAAA;AAAE;AAClC;AACF;AACF;AACF,GACD,CAAA;AAED,EAAA,MAAM,OAAO,MAAA,EAAQ,UAAA;AACrB,EAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,IAAI,CAAA,EAAG;AACxB,IAAA,MAAM,IAAI,MAAM,sEAAiE,CAAA;AAAA,EACnF;AAEA,EAAA,OAAO,IAAA;AACT;;;ACtKA,wBAAA,EAAyB","file":"index.mjs","sourcesContent":["/**\n * The scrypt bsv package writes the version string to a global symbol and\n * warns when that symbol is already populated. In environments that reload\n * modules (Next.js dev server, Storybook, etc.) the stale value triggers\n * repeated warnings. Clearing the cached handle before our modules touch bsv\n * keeps the console quiet without requiring downstream wrappers.\n *\n * Similarly, bitcore-lib and bitcore-lib-inquisition check for duplicate instances\n * using global variables and throw errors when detected. We clear these globals\n * to prevent false positives in module reloading scenarios.\n */\nconst globalLike = globalThis as Record & {\n _scrypt_bsv?: unknown;\n __scryptBsvPreviousVersion?: unknown;\n _bitcore?: unknown;\n __bitcorePreviousVersion?: unknown;\n};\n\nif (typeof globalLike._scrypt_bsv !== \"undefined\") {\n if (typeof globalLike._scrypt_bsv === \"string\") {\n globalLike.__scryptBsvPreviousVersion = globalLike._scrypt_bsv;\n }\n\n try {\n delete globalLike._scrypt_bsv;\n } catch {\n globalLike._scrypt_bsv = undefined;\n }\n}\n\n// Clear bitcore-lib global to prevent \"more than one instance\" errors\nif (typeof globalLike._bitcore !== \"undefined\") {\n if (typeof globalLike._bitcore === \"object\") {\n globalLike.__bitcorePreviousVersion = globalLike._bitcore;\n }\n\n try {\n delete globalLike._bitcore;\n } catch {\n globalLike._bitcore = undefined;\n }\n}\n\nexport function rememberScryptBsvVersion() {\n if (typeof globalLike._scrypt_bsv === \"string\") {\n globalLike.__scryptBsvPreviousVersion = globalLike._scrypt_bsv;\n }\n\n // Also remember bitcore version if it exists\n if (typeof globalLike._bitcore === \"object\") {\n globalLike.__bitcorePreviousVersion = globalLike._bitcore;\n }\n}\n","export enum EcencyWalletCurrency {\n BTC = \"BTC\",\n ETH = \"ETH\",\n BNB = \"BNB\",\n SOL = \"SOL\",\n}\n","export enum EcencyWalletBasicTokens {\n Points = \"POINTS\",\n HivePower = \"HP\",\n Hive = \"HIVE\",\n HiveDollar = \"HBD\"\n}\n","export * from \"./create-account-with-wallets\";\nexport * from \"./check-wallet-existence\";\nexport * from \"./update-account-with-wallets\";\n","let cachedFetch: typeof globalThis.fetch | undefined;\n\nexport function getBoundFetch() {\n if (!cachedFetch) {\n if (typeof globalThis.fetch !== \"function\") {\n throw new Error(\"[Ecency][Wallets] - global fetch is not available\");\n }\n\n cachedFetch = globalThis.fetch.bind(globalThis);\n }\n\n return cachedFetch;\n}\n","import { ConfigManager } from \"@ecency/sdk\";\nimport { EcencyWalletCurrency } from \"@/modules/wallets/enums\";\nimport { getBoundFetch } from \"@/modules/wallets/utils/get-bound-fetch\";\nimport { useMutation } from \"@tanstack/react-query\";\n\ninterface HiveKeys {\n ownerPublicKey?: string;\n activePublicKey?: string;\n postingPublicKey?: string;\n memoPublicKey?: string;\n}\n\ninterface Payload {\n currency: EcencyWalletCurrency;\n address: string;\n hiveKeys?: HiveKeys;\n walletAddresses?: Partial>;\n}\n\nexport function useCreateAccountWithWallets(username: string) {\n const fetchApi = getBoundFetch();\n\n return useMutation({\n mutationKey: [\"ecency-wallets\", \"create-account-with-wallets\", username],\n mutationFn: async ({ currency, address, hiveKeys, walletAddresses }: Payload) => {\n const addresses: Record = {};\n if (walletAddresses) {\n for (const [k, v] of Object.entries(walletAddresses)) {\n if (v) addresses[k] = v;\n }\n }\n\n const response = await fetchApi(`${ConfigManager.getValidatedBaseUrl()}/private-api/wallets-add`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n username,\n token: currency,\n address,\n meta: {\n ...hiveKeys,\n ...addresses,\n [currency]: address\n },\n }),\n });\n\n if (!response.ok) {\n throw new Error(`Account creation failed (${response.status})`);\n }\n\n return response;\n },\n });\n}\n","import { ConfigManager } from \"@ecency/sdk\";\nimport { EcencyWalletCurrency } from \"@/modules/wallets/enums\";\nimport { useMutation } from \"@tanstack/react-query\";\n\ninterface Payload {\n address: string;\n currency: EcencyWalletCurrency;\n}\n\nexport function useCheckWalletExistence() {\n return useMutation({\n mutationKey: [\"ecency-wallets\", \"check-wallet-existence\"],\n mutationFn: async ({ address, currency }: Payload) => {\n const response = await fetch(\n `${ConfigManager.getValidatedBaseUrl()}/private-api/wallets-exist`,\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n address,\n token: currency,\n }),\n }\n );\n const data = await response.json();\n return data.length === 0;\n },\n });\n}\n","import { ConfigManager } from \"@ecency/sdk\";\nimport { useMutation } from \"@tanstack/react-query\";\nimport { getBoundFetch } from \"@/modules/wallets/utils/get-bound-fetch\";\n\ninterface Payload {\n tokens: Record;\n hiveKeys: {\n ownerPublicKey: string;\n activePublicKey: string;\n postingPublicKey: string;\n memoPublicKey: string;\n };\n}\n\nexport function useUpdateAccountWithWallets(\n username: string,\n accessToken: string | undefined\n) {\n const fetchApi = getBoundFetch();\n\n return useMutation({\n mutationKey: [\"ecency-wallets\", \"update-account-with-wallets\", username],\n mutationFn: async ({ tokens, hiveKeys }: Payload) => {\n const entries = Object.entries(tokens).filter(([, address]) => Boolean(address));\n\n if (entries.length === 0) {\n return new Response(null, { status: 204 });\n }\n\n const [primaryToken, primaryAddress] = entries[0] ?? [\"\", \"\"];\n\n if (!accessToken) {\n throw new Error(\n \"[SDK][Wallets][PrivateApi][WalletsAdd] – access token wasn`t found\"\n );\n }\n\n const response = await fetchApi(`${ConfigManager.getValidatedBaseUrl()}/private-api/wallets-add`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n username,\n code: accessToken,\n token: primaryToken,\n address: primaryAddress,\n status: 3,\n meta: {\n ...Object.fromEntries(entries),\n ownerPublicKey: hiveKeys.ownerPublicKey,\n activePublicKey: hiveKeys.activePublicKey,\n postingPublicKey: hiveKeys.postingPublicKey,\n memoPublicKey: hiveKeys.memoPublicKey,\n },\n }),\n });\n\n // Raw fetch resolves on 4xx/5xx; guard so a failed wallet-add doesn't run\n // onSuccess as if the account had been updated.\n if (!response.ok) {\n throw new Error(\n `[SDK][Wallets][PrivateApi][WalletsAdd] – request failed: ${response.status}`\n );\n }\n\n return response;\n },\n });\n}\n","import { EcencyWalletCurrency } from \"@/modules/wallets/enums\";\nimport { ConfigManager } from \"@ecency/sdk\";\nimport { useQuery } from \"@tanstack/react-query\";\n\nconst currencyChainMap: Record = {\n [EcencyWalletCurrency.BTC]: \"btc\",\n [EcencyWalletCurrency.ETH]: \"eth\",\n [EcencyWalletCurrency.BNB]: \"bnb\",\n [EcencyWalletCurrency.SOL]: \"sol\",\n};\n\ninterface PrivateApiBalanceResponse {\n chain: string;\n balance: number | string;\n unit: string;\n raw?: unknown;\n nodeId?: string;\n}\n\nexport interface ExternalWalletBalance {\n chain: string;\n unit: string;\n raw?: unknown;\n nodeId?: string;\n /**\n * Balance represented as a BigInt for convenience.\n */\n balanceBigInt: bigint;\n /**\n * Balance returned as a string to preserve precision for UIs that cannot\n * handle bigint values directly.\n */\n balanceString: string;\n}\n\nfunction normalizeBalance(balance: number | string): string {\n if (typeof balance === \"number\") {\n if (!Number.isFinite(balance)) {\n throw new Error(\"Private API returned a non-finite numeric balance\");\n }\n\n return Math.trunc(balance).toString();\n }\n\n if (typeof balance === \"string\") {\n const trimmed = balance.trim();\n\n if (trimmed === \"\") {\n throw new Error(\"Private API returned an empty balance string\");\n }\n\n return trimmed;\n }\n\n throw new Error(\"Private API returned balance in an unexpected format\");\n}\n\nfunction parsePrivateApiBalance(\n result: unknown,\n expectedChain: string\n): ExternalWalletBalance {\n if (!result || typeof result !== \"object\") {\n throw new Error(\"Private API returned an unexpected response\");\n }\n\n const { chain, balance, unit, raw, nodeId } =\n result as PrivateApiBalanceResponse;\n\n if (typeof chain !== \"string\" || chain !== expectedChain) {\n throw new Error(\"Private API response chain did not match request\");\n }\n\n if (typeof unit !== \"string\" || unit.length === 0) {\n throw new Error(\"Private API response is missing unit information\");\n }\n\n if (balance === undefined || balance === null) {\n throw new Error(\"Private API response is missing balance information\");\n }\n\n const balanceString = normalizeBalance(balance);\n\n let balanceBigInt: bigint;\n\n try {\n balanceBigInt = BigInt(balanceString);\n } catch (error) {\n throw new Error(\"Private API returned a balance that is not an integer\");\n }\n\n return {\n chain,\n unit,\n raw,\n nodeId:\n typeof nodeId === \"string\" && nodeId.length > 0 ? nodeId : undefined,\n balanceBigInt,\n balanceString,\n };\n}\n\nexport function useGetExternalWalletBalanceQuery(\n currency: EcencyWalletCurrency,\n address: string\n) {\n return useQuery({\n queryKey: [\"ecency-wallets\", \"external-wallet-balance\", currency, address],\n queryFn: async () => {\n const chain = currencyChainMap[currency];\n\n if (!chain) {\n throw new Error(`Unsupported currency ${currency}`);\n }\n\n const baseUrl = `${ConfigManager.getValidatedBaseUrl()}/private-api/balance/${chain}/${encodeURIComponent(\n address\n )}`;\n\n let primaryResponse: Response | undefined;\n let primaryError: unknown;\n\n try {\n primaryResponse = await fetch(baseUrl);\n } catch (error) {\n primaryError = error;\n }\n\n let response = primaryResponse;\n\n if (!response || !response.ok) {\n const fallbackUrl = `${baseUrl}?provider=chainz`;\n let fallbackError: unknown;\n\n try {\n const fallbackResponse = await fetch(fallbackUrl);\n\n if (fallbackResponse.ok) {\n response = fallbackResponse;\n } else {\n fallbackError = new Error(\n `Fallback provider responded with status ${fallbackResponse.status}`\n );\n }\n } catch (error) {\n fallbackError = error;\n }\n\n if (!response || !response.ok) {\n const failureReasons: string[] = [];\n\n if (primaryError) {\n const message =\n primaryError instanceof Error\n ? primaryError.message\n : String(primaryError);\n failureReasons.push(`primary provider failed: ${message}`);\n } else if (primaryResponse && !primaryResponse.ok) {\n failureReasons.push(\n `primary provider status ${primaryResponse.status}`\n );\n }\n\n if (fallbackError) {\n const message =\n fallbackError instanceof Error\n ? fallbackError.message\n : String(fallbackError);\n failureReasons.push(`fallback provider failed: ${message}`);\n }\n\n if (failureReasons.length === 0) {\n failureReasons.push(\"unknown error\");\n }\n\n throw new Error(\n `Private API request failed (${failureReasons.join(\", \")})`\n );\n }\n }\n\n const result = (await response.json()) as unknown;\n\n return parsePrivateApiBalance(result, chain);\n },\n });\n}\n","import { ConfigManager } from \"@ecency/sdk\";\nimport { EcencyWalletCurrency } from \"@/modules/wallets/enums\";\nimport { queryOptions } from \"@tanstack/react-query\";\nimport { LRUCache } from \"lru-cache\";\n\nconst options = {\n max: 500,\n // how long to live in ms\n ttl: 1000 * 60 * 5,\n // return stale items before removing from cache?\n allowStale: false,\n updateAgeOnGet: false,\n updateAgeOnHas: false,\n};\n\nconst cache = new LRUCache(options);\nconst undefinedValue = Symbol(\"undefined\");\n\nconst cacheSet = (key: string, value: any) =>\n cache.set(key, value === undefined ? undefinedValue : value);\n\nconst cacheGet = (key: string) => {\n const v = cache.get(key);\n return v === undefinedValue ? undefined : v;\n};\n\ninterface MarketDataQuote {\n last_updated: string;\n percent_change: number;\n price: number;\n}\n\ninterface MarketDataLatestResponse {\n [token: string]: {\n quotes?: {\n usd?: MarketDataQuote;\n btc?: MarketDataQuote;\n [fiat: string]: MarketDataQuote | undefined;\n };\n };\n}\n\nconst CURRENCY_TO_TOKEN_MAP: Record = {\n [EcencyWalletCurrency.BTC]: \"btc\",\n [EcencyWalletCurrency.ETH]: \"eth\",\n [EcencyWalletCurrency.SOL]: \"sol\",\n [EcencyWalletCurrency.BNB]: \"bnb\",\n HBD: \"hbd\",\n HIVE: \"hive\",\n};\n\nconst MARKET_DATA_CACHE_KEY = \"market-data/latest\";\n\nconst normalizeCurrencyToToken = (currency: string) => {\n const upperCased = currency.toUpperCase();\n return CURRENCY_TO_TOKEN_MAP[upperCased] ?? currency.toLowerCase();\n};\n\nexport function getTokenPriceQueryOptions(currency?: string) {\n return queryOptions({\n queryKey: [\"ecency-wallets\", \"market-data\", currency],\n queryFn: async () => {\n if (!currency) {\n throw new Error(\n \"[SDK][Wallets][MarketData] – currency wasn`t provided\"\n );\n }\n\n const token = normalizeCurrencyToToken(currency);\n const baseUrl = ConfigManager.getValidatedBaseUrl();\n\n let marketData = cacheGet(MARKET_DATA_CACHE_KEY) as\n | MarketDataLatestResponse\n | undefined;\n\n if (!marketData) {\n const httpResponse = await fetch(\n `${baseUrl}/private-api/market-data/latest`,\n {\n method: \"GET\",\n }\n );\n\n if (!httpResponse.ok) {\n throw new Error(\n `[SDK][Wallets][MarketData] – failed to fetch latest market data (${httpResponse.status})`\n );\n }\n\n const data = (await httpResponse.json()) as MarketDataLatestResponse;\n cacheSet(MARKET_DATA_CACHE_KEY, data);\n marketData = data;\n }\n\n const tokenData = marketData[token];\n\n if (!tokenData) {\n throw new Error(\n `[SDK][Wallets][MarketData] – missing market data for token: ${token}`\n );\n }\n\n const usdQuote = tokenData.quotes?.usd;\n\n if (!usdQuote) {\n throw new Error(\n `[SDK][Wallets][MarketData] – missing USD quote for token: ${token}`\n );\n }\n\n return Number(usdQuote.price);\n },\n enabled: !!currency,\n });\n}\n","import {\n getHiveEngineTokensBalancesQueryOptions,\n getHiveEngineTokensMetadataQueryOptions,\n} from \"@/modules/assets\";\nimport {\n HiveEngineTokenBalance,\n HiveEngineTokenMetadataResponse,\n} from \"@/modules/assets/hive-engine/types\";\nimport { getQueryClient } from \"@ecency/sdk\";\nimport { queryOptions } from \"@tanstack/react-query\";\nimport { EcencyWalletBasicTokens, EcencyWalletCurrency } from \"../enums\";\n\nfunction createFallbackTokenMetadata(symbol: string): HiveEngineTokenMetadataResponse {\n return {\n issuer: \"\",\n symbol,\n name: symbol,\n metadata: \"{}\",\n precision: 0,\n maxSupply: \"0\",\n supply: \"0\",\n circulatingSupply: \"0\",\n stakingEnabled: false,\n unstakingCooldown: 0,\n delegationEnabled: false,\n undelegationCooldown: 0,\n numberTransactions: 0,\n totalStaked: \"0\",\n };\n}\n\nasync function getLayer2TokensMetadata(username?: string) {\n if (!username) {\n return [] as HiveEngineTokenMetadataResponse[];\n }\n\n let balances: HiveEngineTokenBalance[] = [];\n\n try {\n balances = await getQueryClient().fetchQuery(\n getHiveEngineTokensBalancesQueryOptions(username)\n );\n } catch {\n balances = [];\n }\n\n const uniqueSymbols = Array.from(\n new Set(\n balances\n .map((balance) => balance.symbol)\n .filter((symbol): symbol is string => Boolean(symbol))\n )\n );\n\n if (uniqueSymbols.length === 0) {\n return [] as HiveEngineTokenMetadataResponse[];\n }\n\n let metadataList: HiveEngineTokenMetadataResponse[] = [];\n\n try {\n metadataList = await getQueryClient().fetchQuery(\n getHiveEngineTokensMetadataQueryOptions(uniqueSymbols)\n );\n } catch {\n metadataList = [];\n }\n\n const metadataBySymbol = new Map(\n metadataList.map((token) => [token.symbol, token])\n );\n\n return uniqueSymbols.map(\n (symbol) => metadataBySymbol.get(symbol) ?? createFallbackTokenMetadata(symbol)\n );\n}\n\nexport function getAllTokensListQueryOptions(username?: string) {\n return queryOptions({\n queryKey: [\"ecency-wallets\", \"all-tokens-list\", username ?? null],\n queryFn: async () => {\n return {\n basic: [\n EcencyWalletBasicTokens.Points,\n EcencyWalletBasicTokens.Hive,\n EcencyWalletBasicTokens.HivePower,\n EcencyWalletBasicTokens.HiveDollar,\n ],\n external: Object.values(EcencyWalletCurrency),\n layer2: await getLayer2TokensMetadata(username),\n };\n },\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { EcencyWalletBasicTokens } from \"../enums\";\nimport {\n AccountProfile,\n FullAccount,\n getAccountFullQueryOptions,\n getQueryClient,\n getPortfolioQueryOptions,\n type PortfolioResponse,\n type PortfolioWalletItem,\n} from \"@ecency/sdk\";\n\ntype ProfileTokens = AccountProfile[\"tokens\"];\ntype ProfileToken = NonNullable[number];\n\nfunction normalizeAccountTokens(tokens: ProfileTokens): ProfileToken[] {\n if (Array.isArray(tokens)) {\n return tokens.filter(Boolean) as ProfileToken[];\n }\n\n if (tokens && typeof tokens === \"object\") {\n return Object.values(tokens).flatMap((value) =>\n Array.isArray(value) ? (value.filter(Boolean) as ProfileToken[]) : []\n );\n }\n\n return [];\n}\n\nconst BASIC_TOKENS: string[] = [\n EcencyWalletBasicTokens.Points,\n EcencyWalletBasicTokens.Hive,\n EcencyWalletBasicTokens.HivePower,\n EcencyWalletBasicTokens.HiveDollar,\n];\n\n// Tokens whose support has been removed. Stale profile.tokens entries and\n// portfolio responses may still reference them, so they are always hidden.\nconst REMOVED_TOKENS = new Set([\"SPK\", \"LARYNX\", \"LP\", \"BROCA\"]);\n\nexport function getAccountWalletListQueryOptions(username: string, currency: string = \"usd\") {\n return queryOptions({\n queryKey: [\"ecency-wallets\", \"list\", username, currency],\n enabled: !!username,\n queryFn: async () => {\n const portfolioQuery = getPortfolioQueryOptions(username, currency, true);\n const queryClient = getQueryClient();\n const accountQuery = getAccountFullQueryOptions(username);\n\n let account: FullAccount | undefined;\n\n try {\n account = (await queryClient.fetchQuery(accountQuery)) ?? undefined;\n } catch {\n // Best effort; fall back to defaults if account metadata is not available.\n }\n\n const tokenVisibility = new Map();\n\n const accountTokens = normalizeAccountTokens(account?.profile?.tokens);\n\n accountTokens.forEach((token: ProfileToken) => {\n const symbol = token.symbol?.toUpperCase?.();\n\n if (!symbol) {\n return;\n }\n\n const showValue = (token as any)?.meta?.show;\n\n if (typeof showValue === \"boolean\") {\n tokenVisibility.set(symbol, showValue);\n }\n });\n\n const isTokenVisible = (symbol?: string) => {\n const normalized = symbol?.toUpperCase();\n\n if (!normalized) {\n return false;\n }\n\n if (REMOVED_TOKENS.has(normalized)) {\n return false;\n }\n\n if (BASIC_TOKENS.includes(normalized)) {\n return true;\n }\n\n return tokenVisibility.get(normalized) === true;\n };\n\n try {\n const portfolio: PortfolioResponse = await queryClient.fetchQuery(portfolioQuery);\n const tokensFromPortfolio: string[] = portfolio.wallets.map(\n (asset: PortfolioWalletItem) => asset.symbol\n );\n\n if (tokensFromPortfolio.length > 0) {\n const visibleTokens = tokensFromPortfolio\n .map((token: string) => token?.toUpperCase?.())\n .filter((token: string | undefined): token is string => Boolean(token))\n .filter(isTokenVisible);\n\n if (visibleTokens.length > 0) {\n // Always include basic tokens (HP, HIVE, HBD, POINTS) even if\n // the portfolio API omits them from its response.\n return Array.from(new Set([...BASIC_TOKENS, ...visibleTokens]));\n }\n }\n } catch {\n // Fallback to legacy behaviour when the portfolio endpoint is not accessible.\n }\n\n if (accountTokens.length > 0) {\n const list = [\n ...BASIC_TOKENS,\n ...accountTokens\n .map((token: ProfileToken) => token.symbol)\n .filter(isTokenVisible),\n ];\n\n return Array.from(new Set(list).values());\n }\n\n return [...BASIC_TOKENS];\n },\n });\n}\n","import { AssetOperation } from \"@/modules/assets\";\nimport {\n getQueryClient,\n getPortfolioQueryOptions,\n type PortfolioResponse,\n type PortfolioWalletItem,\n} from \"@ecency/sdk\";\nimport { queryOptions } from \"@tanstack/react-query\";\n\nexport function getTokenOperationsQueryOptions(\n token: string,\n username: string,\n isForOwner = false,\n currency: string = \"usd\"\n) {\n return queryOptions({\n queryKey: [\"wallets\", \"token-operations\", token, username, isForOwner, currency],\n queryFn: async () => {\n const queryClient = getQueryClient();\n const normalizedToken = token.toUpperCase();\n\n if (!username || !isForOwner) {\n return [] as AssetOperation[];\n }\n\n try {\n const portfolio: PortfolioResponse = await queryClient.fetchQuery(\n getPortfolioQueryOptions(username, currency, true)\n );\n const assetEntry = portfolio.wallets.find(\n (assetItem: PortfolioWalletItem) => assetItem.symbol.toUpperCase() === normalizedToken\n );\n\n if (!assetEntry) {\n return [] as AssetOperation[];\n }\n\n // Extract action IDs and map to AssetOperation enums\n const rawActions: Array<{ id: string; [key: string]: unknown }> = assetEntry.actions ?? [];\n const operations: AssetOperation[] = rawActions\n .map((action: { id: string; [key: string]: unknown } | string) => {\n // Extract the id field from action object\n if (typeof action === \"string\") return action;\n if (action && typeof action === \"object\") {\n const record = action as Record;\n return (record.id ?? record.code ?? record.name ?? record.action) as string | undefined;\n }\n return undefined;\n })\n .filter((id: string | undefined): id is string => Boolean(id))\n .map((id: string) => {\n // Normalize: underscores to hyphens, lowercase\n const canonical = id.trim().toLowerCase().replace(/[\\s_]+/g, \"-\");\n\n // Primary mapping: API action IDs to AssetOperation enum values\n const aliasMap: Record = {\n // Common operations\n \"transfer\": AssetOperation.Transfer,\n \"ecency-point-transfer\": AssetOperation.Transfer,\n\n // Savings operations\n \"transfer-to-savings\": AssetOperation.TransferToSavings,\n \"transfer-savings\": AssetOperation.TransferToSavings,\n \"savings-transfer\": AssetOperation.TransferToSavings,\n \"withdraw-from-savings\": AssetOperation.WithdrawFromSavings,\n \"transfer-from-savings\": AssetOperation.WithdrawFromSavings,\n \"withdraw-savings\": AssetOperation.WithdrawFromSavings,\n \"savings-withdraw\": AssetOperation.WithdrawFromSavings,\n\n // Vesting/Power operations\n \"transfer-to-vesting\": AssetOperation.PowerUp,\n \"powerup\": AssetOperation.PowerUp,\n \"power-up\": AssetOperation.PowerUp,\n \"withdraw-vesting\": AssetOperation.PowerDown,\n \"power-down\": AssetOperation.PowerDown,\n \"powerdown\": AssetOperation.PowerDown,\n\n // Delegation\n \"delegate\": AssetOperation.Delegate,\n \"delegate-vesting-shares\": AssetOperation.Delegate,\n \"hp-delegate\": AssetOperation.Delegate,\n \"delegate-hp\": AssetOperation.Delegate,\n \"delegate-power\": AssetOperation.Delegate,\n \"undelegate\": AssetOperation.Undelegate,\n \"undelegate-power\": AssetOperation.Undelegate,\n \"undelegate-token\": AssetOperation.Undelegate,\n\n // Staking (Layer 2)\n \"stake\": AssetOperation.Stake,\n \"stake-token\": AssetOperation.Stake,\n \"stake-power\": AssetOperation.Stake,\n \"unstake\": AssetOperation.Unstake,\n \"unstake-token\": AssetOperation.Unstake,\n \"unstake-power\": AssetOperation.Unstake,\n\n // Swap/Convert\n \"swap\": AssetOperation.Swap,\n \"swap-token\": AssetOperation.Swap,\n \"swap-tokens\": AssetOperation.Swap,\n \"convert\": AssetOperation.Convert,\n\n // Points operations\n \"promote\": AssetOperation.Promote,\n \"promote-post\": AssetOperation.Promote,\n \"promote-entry\": AssetOperation.Promote,\n \"boost\": AssetOperation.Promote,\n \"gift\": AssetOperation.Gift,\n \"gift-points\": AssetOperation.Gift,\n \"points-gift\": AssetOperation.Gift,\n \"claim\": AssetOperation.Claim,\n \"claim-rewards\": AssetOperation.Claim,\n \"claim-points\": AssetOperation.Claim,\n \"buy\": AssetOperation.Buy,\n \"buy-points\": AssetOperation.Buy,\n\n // Other\n \"claim-interest\": AssetOperation.ClaimInterest,\n // Chain operation name, as emitted in the HP action list. The two\n // slug spellings below predate it and stay as a fallback.\n \"set-withdraw-vesting-route\": AssetOperation.WithdrawRoutes,\n \"withdraw-routes\": AssetOperation.WithdrawRoutes,\n \"withdrawroutes\": AssetOperation.WithdrawRoutes,\n };\n\n // Check alias map first (primary method)\n const mapped = aliasMap[canonical];\n if (mapped) return mapped;\n\n // Fallback: try direct enum value match (for exact matches like \"transfer\", \"promote\")\n const directMatch = Object.values(AssetOperation).find(\n (op) => op.toLowerCase() === canonical\n );\n return directMatch;\n })\n .filter((op: AssetOperation | undefined): op is AssetOperation => Boolean(op))\n // Remove duplicates - API may return multiple actions that map to same operation\n .filter((op: AssetOperation, index: number, self: AssetOperation[]) => self.indexOf(op) === index);\n\n const isHiveOrHbd = [\"HIVE\", \"HBD\"].includes(normalizedToken);\n // Check if there's a non-zero savings balance\n const rawToken = assetEntry as any;\n const hasSavings = Number(rawToken.savings ?? 0) > 0;\n\n if (\n isHiveOrHbd &&\n !hasSavings\n ) {\n return operations.filter(\n (operation) => operation !== AssetOperation.WithdrawFromSavings\n );\n }\n\n return operations;\n } catch {\n return [];\n }\n },\n });\n}\n","import {\n AccountProfile,\n getAccountFullQueryOptions,\n useAccountUpdate,\n type AuthContext,\n} from \"@ecency/sdk\";\nimport {\n useMutation,\n useQuery,\n useQueryClient,\n type UseMutationOptions,\n} from \"@tanstack/react-query\";\nimport { EcencyTokenMetadata } from \"../types\";\nimport * as R from \"remeda\";\nimport { getAccountWalletListQueryOptions } from \"../queries\";\nimport { EcencyWalletCurrency } from \"../enums\";\n\nfunction getGroupedChainTokens(\n tokens?: AccountProfile[\"tokens\"],\n defaultShow?: boolean\n) {\n if (!tokens) {\n return {};\n }\n\n return R.pipe(\n tokens,\n R.filter(\n ({ type, symbol }) =>\n type === \"CHAIN\" ||\n Object.values(EcencyWalletCurrency).includes(symbol as any)\n ),\n R.map((item) => {\n const meta = {\n ...(item.meta ?? {}),\n } as Record;\n\n if (typeof meta.show !== \"boolean\" && typeof defaultShow === \"boolean\") {\n meta.show = defaultShow;\n }\n\n return {\n ...item,\n meta,\n };\n }),\n // Chain tokens are unique by symbol, so indexing by symbol\n // gives a direct lookup map instead of an array-based grouping.\n R.indexBy(\n (item: NonNullable[number]) => item.symbol\n )\n );\n}\n\n/**\n * Saving of token(s) metadata to Hive profile\n * It may contain: external wallets(see EcencyWalletCurrency), Hive tokens arrangement\n *\n * Basically, this mutation is a convenient wrapper for update profile operation\n */\ntype SaveWalletInformationOptions = Pick<\n UseMutationOptions,\n \"onSuccess\" | \"onError\"\n>;\n\nexport function useSaveWalletInformationToMetadata(\n username: string,\n auth?: AuthContext,\n options?: SaveWalletInformationOptions\n) {\n const queryClient = useQueryClient();\n\n const { data: accountData } = useQuery(getAccountFullQueryOptions(username));\n const { mutateAsync: updateProfile } = useAccountUpdate(username, auth);\n\n return useMutation({\n mutationKey: [\n \"ecency-wallets\",\n \"save-wallet-to-metadata\",\n accountData?.name,\n ],\n mutationFn: async (tokens: EcencyTokenMetadata[]) => {\n if (!accountData) {\n throw new Error(\"[SDK][Wallets] – no account data to save wallets\");\n }\n\n // Chain type tokens couldn't be deleted entirely from the profile list,\n // then visibility should be controlling using meta.show field\n const profileChainTokens = getGroupedChainTokens(\n accountData.profile?.tokens\n );\n\n const payloadTokens =\n (tokens.map(({ currency, type, privateKey, username, ...meta }) => ({\n symbol: currency!,\n type:\n type ??\n (Object.values(EcencyWalletCurrency).includes(currency as any)\n ? \"CHAIN\"\n : undefined),\n meta,\n })) as AccountProfile[\"tokens\"]) ?? [];\n\n const payloadChainTokens = getGroupedChainTokens(payloadTokens, true);\n const payloadNonChainTokens = payloadTokens.filter(\n ({ type, symbol }) =>\n type !== \"CHAIN\" &&\n !Object.values(EcencyWalletCurrency).includes(symbol as any)\n );\n\n const mergedChainTokens = R.pipe(\n profileChainTokens,\n R.mergeDeep(payloadChainTokens),\n R.values()\n );\n\n return updateProfile({\n tokens: [\n ...payloadNonChainTokens,\n ...mergedChainTokens,\n ] as AccountProfile[\"tokens\"],\n });\n },\n onError: options?.onError,\n onSuccess: (response, vars, context) => {\n (\n options?.onSuccess as\n | ((\n data: unknown,\n variables: EcencyTokenMetadata[],\n context: unknown\n ) => unknown)\n | undefined\n )?.(response, vars, context);\n queryClient.invalidateQueries({\n queryKey: getAccountWalletListQueryOptions(username).queryKey,\n });\n },\n });\n}\n","import { EcencyWalletCurrency } from \"@/modules/wallets/enums\";\n\ninterface RequestArguments {\n method: string;\n params?: unknown[] | Record;\n}\n\ninterface EthereumProvider {\n isMetaMask?: boolean;\n request(args: RequestArguments): Promise;\n}\n\ndeclare global {\n interface Window {\n ethereum?: EthereumProvider;\n }\n}\n\nfunction getEthereum(): EthereumProvider {\n if (typeof window === \"undefined\" || !window.ethereum) {\n throw new Error(\"MetaMask not found\");\n }\n return window.ethereum;\n}\n\nconst WEI_PER_ETH = 1000000000000000000n;\n\nconst EVM_CHAIN_CONFIG: Record = {\n [EcencyWalletCurrency.ETH]: {\n chainId: \"0x1\",\n name: \"Ethereum Mainnet\",\n rpcUrl: \"https://rpc.ankr.com/eth\",\n explorerUrl: \"https://etherscan.io/tx/\"\n },\n [EcencyWalletCurrency.BNB]: {\n chainId: \"0x38\",\n name: \"BNB Smart Chain\",\n rpcUrl: \"https://bsc-dataseed.binance.org\",\n explorerUrl: \"https://bscscan.com/tx/\"\n }\n};\n\nexport function getEvmChainConfig(currency: EcencyWalletCurrency) {\n const config = EVM_CHAIN_CONFIG[currency];\n if (!config) throw new Error(`Unsupported EVM currency: ${currency}`);\n return config;\n}\n\nexport function getEvmExplorerUrl(currency: EcencyWalletCurrency, txHash: string) {\n return `${getEvmChainConfig(currency).explorerUrl}${txHash}`;\n}\n\nexport async function ensureEvmChain(currency: EcencyWalletCurrency): Promise {\n const ethereum = getEthereum();\n\n const { chainId, name, rpcUrl } = getEvmChainConfig(currency);\n const currentChainId = await ethereum.request({ method: \"eth_chainId\" });\n\n if (currentChainId === chainId) return;\n\n try {\n await ethereum.request({\n method: \"wallet_switchEthereumChain\",\n params: [{ chainId }]\n });\n } catch (err: unknown) {\n // Chain not added — add it\n if (typeof err === \"object\" && err !== null && \"code\" in err && (err as { code: number }).code === 4902) {\n await ethereum.request({\n method: \"wallet_addEthereumChain\",\n params: [{\n chainId,\n chainName: name,\n rpcUrls: [rpcUrl],\n nativeCurrency: {\n name: currency === EcencyWalletCurrency.ETH ? \"Ether\" : \"BNB\",\n symbol: currency === EcencyWalletCurrency.ETH ? \"ETH\" : \"BNB\",\n decimals: 18\n }\n }]\n });\n } else {\n throw err;\n }\n }\n}\n\nexport async function estimateEvmGas(\n from: string,\n to: string,\n valueHex: string,\n currency: EcencyWalletCurrency\n): Promise<{ gasLimit: string; gasPrice: string; estimatedFeeWei: bigint }> {\n const ethereum = getEthereum();\n\n await ensureEvmChain(currency);\n\n const [gasLimit, gasPrice] = await Promise.all([\n ethereum.request({\n method: \"eth_estimateGas\",\n params: [{ from, to, value: valueHex }]\n }),\n ethereum.request({ method: \"eth_gasPrice\" })\n ]);\n\n const estimatedFeeWei = BigInt(gasLimit) * BigInt(gasPrice);\n\n return { gasLimit, gasPrice, estimatedFeeWei };\n}\n\nexport function formatWei(wei: bigint, decimals = 6): string {\n const whole = wei / WEI_PER_ETH;\n const rem = wei % WEI_PER_ETH;\n if (rem === 0n) return whole.toString();\n\n const scale = 10n ** BigInt(decimals);\n const fractional = (rem * scale) / WEI_PER_ETH;\n const fracStr = fractional.toString().padStart(decimals, \"0\").replace(/0+$/, \"\");\n return fracStr ? `${whole}.${fracStr}` : whole.toString();\n}\n\nconst AMOUNT_REGEX = /^\\d+(\\.\\d+)?$/;\n\nexport function parseToWei(amount: string): string {\n const trimmed = amount.trim();\n if (!AMOUNT_REGEX.test(trimmed)) {\n throw new Error(`Invalid amount: \"${amount}\"`);\n }\n\n const [whole, fraction = \"\"] = trimmed.split(\".\");\n if (!/^\\d+$/.test(whole) || (fraction && !/^\\d+$/.test(fraction))) {\n throw new Error(`Invalid amount: \"${amount}\"`);\n }\n\n const paddedFraction = fraction.padEnd(18, \"0\").slice(0, 18);\n const wei = BigInt(whole) * WEI_PER_ETH + BigInt(paddedFraction);\n return \"0x\" + wei.toString(16);\n}\n\nexport async function sendEvmTransfer(\n to: string,\n amountWei: string,\n currency: EcencyWalletCurrency,\n expectedFrom?: string\n): Promise {\n const ethereum = getEthereum();\n\n await ensureEvmChain(currency);\n\n const accounts = await ethereum.request({ method: \"eth_requestAccounts\" });\n const from = accounts[0];\n if (!from) throw new Error(\"No MetaMask account connected\");\n\n // Funds safety: never send from an account other than the linked wallet. The\n // active MetaMask account can differ from the one the user linked (multiple\n // accounts, switched account, or access just granted to a different one). This\n // comparison is atomic with the account read above and is the single source of\n // truth for the EVM send. Throws a sentinel the caller maps to a message.\n if (expectedFrom && from.toLowerCase() !== expectedFrom.toLowerCase()) {\n throw new Error(\"ACCOUNT_MISMATCH\");\n }\n\n const txHash = await ethereum.request({\n method: \"eth_sendTransaction\",\n params: [{\n from,\n to,\n value: amountWei\n }]\n });\n\n return txHash;\n}\n","import { ConfigManager } from \"@ecency/sdk\";\n\nconst SOL_EXPLORER_URL = \"https://explorer.solana.com/tx/\";\nconst LAMPORTS_PER_SOL = 1_000_000_000n;\nconst AMOUNT_REGEX = /^\\d+(\\.\\d+)?$/;\n\nexport function getSolExplorerUrl(signature: string) {\n return `${SOL_EXPLORER_URL}${signature}`;\n}\n\nexport function parseToLamports(amount: string): bigint {\n const trimmed = amount.trim();\n if (!AMOUNT_REGEX.test(trimmed)) {\n throw new Error(`Invalid amount: \"${amount}\"`);\n }\n\n const [whole, fraction = \"\"] = trimmed.split(\".\");\n if (!/^\\d+$/.test(whole) || (fraction && !/^\\d+$/.test(fraction))) {\n throw new Error(`Invalid amount: \"${amount}\"`);\n }\n\n if (fraction.length > 9 && fraction.slice(9).replace(/0/g, \"\").length > 0) {\n throw new Error(`Amount has more than 9 decimal places: \"${amount}\"`);\n }\n\n const paddedFraction = fraction.padEnd(9, \"0\").slice(0, 9);\n return BigInt(whole) * LAMPORTS_PER_SOL + BigInt(paddedFraction);\n}\n\nexport function formatLamports(lamports: bigint, decimals = 6): string {\n const whole = lamports / LAMPORTS_PER_SOL;\n const rem = lamports % LAMPORTS_PER_SOL;\n if (rem === 0n) return whole.toString();\n\n const scale = 10n ** BigInt(decimals);\n const fractional = (rem * scale) / LAMPORTS_PER_SOL;\n const fracStr = fractional.toString().padStart(decimals, \"0\").replace(/0+$/, \"\");\n return fracStr ? `${whole}.${fracStr}` : whole.toString();\n}\n\ninterface JsonRpcResponse {\n jsonrpc: string;\n id: number | string;\n result?: T;\n error?: { code?: number; message?: string };\n}\n\n/**\n * Call a Solana JSON-RPC method via the Ecency private API proxy.\n * This avoids hitting the public Solana RPC directly from the browser\n * (which returns 403). The proxy forwards to a public Solana RPC node.\n */\nasync function solRpc(method: string, params: unknown[] = []): Promise {\n const baseUrl = ConfigManager.getValidatedBaseUrl();\n const response = await fetch(`${baseUrl}/private-api/rpc/sol`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ jsonrpc: \"2.0\", id: 1, method, params })\n });\n\n if (!response.ok) {\n const text = await response.text().catch(() => \"\");\n throw new Error(`SOL RPC ${method} failed: ${response.status} ${response.statusText}${text ? ` — ${text}` : \"\"}`);\n }\n\n const json: JsonRpcResponse = await response.json();\n if (json.error) {\n throw new Error(json.error.message || `SOL RPC ${method} failed`);\n }\n return json.result as T;\n}\n\nasync function getMetaMaskSolanaWallet(): Promise {\n const { getWallets } = await import(\"@wallet-standard/app\");\n const walletsApi = getWallets();\n const wallets = walletsApi.get();\n\n // Only select a MetaMask wallet that supports Solana signing\n const mmWallet = wallets.find(\n (w: any) =>\n w.name.toLowerCase().includes(\"metamask\") &&\n w.features[\"standard:connect\"] &&\n w.features[\"solana:signAndSendTransaction\"]\n );\n\n if (!mmWallet) {\n throw new Error(\"MetaMask Solana wallet not found. Enable Solana in MetaMask settings.\");\n }\n\n return mmWallet;\n}\n\nexport async function sendSolTransfer(\n to: string,\n amountSol: string\n): Promise {\n const mmWallet = await getMetaMaskSolanaWallet();\n\n // Connect to get accounts\n const connectFeature = mmWallet.features[\"standard:connect\"] as any;\n await connectFeature.connect();\n\n const solAccount = mmWallet.accounts?.find(\n (acc: any) => acc.chains?.some((c: string) => c.startsWith(\"solana:\"))\n );\n\n if (!solAccount) {\n throw new Error(\"No Solana account found in MetaMask.\");\n }\n\n // Use @solana/web3.js for transaction building (dynamic import to avoid bundle bloat)\n const { PublicKey, SystemProgram, Transaction } = await import(\"@solana/web3.js\");\n\n const fromPubkey = new PublicKey(solAccount.address);\n const toPubkey = new PublicKey(to);\n const lamports = parseToLamports(amountSol);\n\n const transaction = new Transaction().add(\n SystemProgram.transfer({\n fromPubkey,\n toPubkey,\n lamports\n })\n );\n\n // Fetch blockhash via Ecency RPC proxy (avoids 403 from public Solana RPC)\n const blockhashResult = await solRpc<{ value: { blockhash: string } }>(\n \"getLatestBlockhash\",\n [{ commitment: \"finalized\" }]\n );\n transaction.recentBlockhash = blockhashResult.value.blockhash;\n transaction.feePayer = fromPubkey;\n\n // Serialize the transaction for signing via Wallet Standard\n const serializedTx = transaction.serialize({\n requireAllSignatures: false,\n verifySignatures: false\n });\n\n const signAndSendFeature = mmWallet.features[\"solana:signAndSendTransaction\"] as any;\n if (!signAndSendFeature) {\n throw new Error(\"MetaMask does not support Solana transaction signing. Please update MetaMask.\");\n }\n\n const [result] = await signAndSendFeature.signAndSendTransaction({\n account: solAccount,\n transaction: serializedTx,\n chain: \"solana:mainnet\"\n });\n\n // Result contains the signature — either a string or Uint8Array\n if (typeof result.signature === \"string\") {\n return result.signature;\n }\n\n // Encode Uint8Array to base58 (standard Solana signature format)\n const { base58 } = await import(\"@scure/base\");\n return base58.encode(new Uint8Array(result.signature));\n}\n","import { EcencyWalletCurrency } from \"@/modules/wallets/enums\";\nimport { sendEvmTransfer, parseToWei } from \"@/modules/wallets/utils/metamask-evm-transfer\";\nimport { sendSolTransfer } from \"@/modules/wallets/utils/metamask-sol-transfer\";\nimport { useMutation, useQueryClient } from \"@tanstack/react-query\";\n\nexport type TransferableCurrency =\n | EcencyWalletCurrency.ETH\n | EcencyWalletCurrency.BNB\n | EcencyWalletCurrency.SOL;\n\ninterface ExternalTransferPayload {\n to: string;\n amount: string;\n /** EVM only: the linked wallet address. The send is blocked if the active\n * MetaMask account does not match it (funds safety). */\n expectedFrom?: string;\n}\n\nexport function useExternalTransfer(currency: TransferableCurrency) {\n const queryClient = useQueryClient();\n\n return useMutation({\n mutationKey: [\"ecency-wallets\", \"external-transfer\", currency],\n mutationFn: async ({ to, amount, expectedFrom }: ExternalTransferPayload) => {\n switch (currency) {\n case EcencyWalletCurrency.ETH:\n case EcencyWalletCurrency.BNB: {\n const valueHex = parseToWei(amount);\n const txHash = await sendEvmTransfer(to, valueHex, currency, expectedFrom);\n return { txHash, currency };\n }\n case EcencyWalletCurrency.SOL: {\n const signature = await sendSolTransfer(to, amount);\n return { txHash: signature, currency };\n }\n }\n },\n onSuccess: () => {\n queryClient.invalidateQueries({\n queryKey: [\"ecency-wallets\", \"external-wallet-balance\"]\n });\n }\n });\n}\n","// @scure/bip39 (same @noble/@scure family as @scure/bip32 used below).\n// mnemonicToSeedSync is pure PBKDF2-HMAC-SHA512 over the mnemonic string — it\n// uses no wordlist, so this is byte-identical to bip39's output (verified\n// against BIP39 test vectors) while dropping bip39's ~164KB of 10 bundled\n// language wordlists from the app bundle.\nimport { mnemonicToSeedSync } from \"@scure/bip39\";\nimport { HDKey } from \"@scure/bip32\";\nimport { PrivateKey } from \"@ecency/sdk\";\n\nexport type HiveRole = \"owner\" | \"active\" | \"posting\" | \"memo\";\n\nconst ROLE_INDEX: Record = {\n owner: 0,\n active: 1,\n posting: 2,\n memo: 3,\n};\n\nexport function deriveHiveKey(\n mnemonic: string,\n role: HiveRole,\n accountIndex = 0\n) {\n const seed = mnemonicToSeedSync(mnemonic);\n const master = HDKey.fromMasterSeed(seed);\n const path = `m/44'/3054'/${accountIndex}'/0'/${ROLE_INDEX[role]}'`;\n const child = master.derive(path);\n if (!child.privateKey) {\n throw new Error(\"[Ecency][Wallets] - hive key derivation failed\");\n }\n const pk = PrivateKey.from(Buffer.from(child.privateKey));\n return {\n privateKey: pk.toString(),\n publicKey: pk.createPublic().toString(),\n } as const;\n}\n\nexport function deriveHiveKeys(\n mnemonic: string,\n accountIndex = 0\n) {\n const owner = deriveHiveKey(mnemonic, \"owner\", accountIndex);\n const active = deriveHiveKey(mnemonic, \"active\", accountIndex);\n const posting = deriveHiveKey(mnemonic, \"posting\", accountIndex);\n const memo = deriveHiveKey(mnemonic, \"memo\", accountIndex);\n return {\n owner: owner.privateKey,\n active: active.privateKey,\n posting: posting.privateKey,\n memo: memo.privateKey,\n ownerPubkey: owner.publicKey,\n activePubkey: active.publicKey,\n postingPubkey: posting.publicKey,\n memoPubkey: memo.publicKey,\n } as const;\n}\n\n","import { PrivateKey } from \"@ecency/sdk\";\nimport type { HiveRole } from \"./derive-hive-bip44-keys\";\n\nexport function deriveHiveMasterPasswordKey(\n username: string,\n masterPassword: string,\n role: HiveRole\n) {\n const pk = PrivateKey.fromLogin(username, masterPassword, role);\n return {\n privateKey: pk.toString(),\n publicKey: pk.createPublic().toString(),\n } as const;\n}\n\nexport function deriveHiveMasterPasswordKeys(\n username: string,\n masterPassword: string\n) {\n const owner = deriveHiveMasterPasswordKey(username, masterPassword, \"owner\");\n const active = deriveHiveMasterPasswordKey(username, masterPassword, \"active\");\n const posting = deriveHiveMasterPasswordKey(\n username,\n masterPassword,\n \"posting\"\n );\n const memo = deriveHiveMasterPasswordKey(username, masterPassword, \"memo\");\n return {\n owner: owner.privateKey,\n active: active.privateKey,\n posting: posting.privateKey,\n memo: memo.privateKey,\n ownerPubkey: owner.publicKey,\n activePubkey: active.publicKey,\n postingPubkey: posting.publicKey,\n memoPubkey: memo.publicKey,\n } as const;\n}\n","import { CONFIG, FullAccount, getAccountFullQueryOptions, PrivateKey } from \"@ecency/sdk\";\nimport { deriveHiveKeys } from \"./derive-hive-bip44-keys\";\n\nexport type HiveKeyDerivation = \"bip44\" | \"master-password\" | \"unknown\";\n\nexport async function detectHiveKeyDerivation(\n username: string,\n seed: string,\n type: \"active\" | \"owner\" = \"active\"\n): Promise {\n const uname = username.trim().toLowerCase();\n\n // ensure we actually have data\n const account = (await CONFIG.queryClient.fetchQuery(\n getAccountFullQueryOptions(uname)\n )) as FullAccount | null;\n if (!account) {\n throw new Error(\"[SDK][Wallets] – no account found for key derivation\");\n }\n\n // pick the right authority based on `type`\n const auth = account[type];\n\n // --- BIP44 check (match selected authority) ---\n // The input may be a legacy master password (or any non-mnemonic string),\n // which @scure/bip39 rejects with \"Invalid mnemonic\". The previous bip39 ran\n // PBKDF2 over any string and produced a (non-matching) seed here, so guard the\n // BIP44 probe and fall through to the master-password check on failure —\n // otherwise master-password logins/signing abort before authenticating.\n let matchBip44 = false;\n try {\n const bip44 = deriveHiveKeys(seed);\n const bip44Pub = type === \"owner\" ? bip44.ownerPubkey : bip44.activePubkey;\n matchBip44 = auth.key_auths.some(([pub]) => String(pub) === bip44Pub);\n } catch {\n // not a valid BIP39 mnemonic -> not a BIP44 seed\n }\n if (matchBip44) return \"bip44\";\n\n // --- Master password (legacy) check (match selected authority) ---\n const legacyPub = PrivateKey.fromLogin(uname, seed, type)\n .createPublic()\n .toString();\n\n const matchLegacy = auth.key_auths.some(([pub]) => String(pub) === legacyPub);\n if (matchLegacy) return \"master-password\";\n\n return \"unknown\";\n}\n","import { EcencyWalletCurrency } from \"@/modules/wallets/enums\";\n\nexport type WalletAddressMap = Partial>;\n\n/** Chain prefixes we look for in Wallet Standard accounts */\nconst CHAIN_PREFIX_MAP: Record = {\n \"solana:\": EcencyWalletCurrency.SOL,\n \"bip122:\": EcencyWalletCurrency.BTC\n};\n\nconst HIVE_SNAP_ID = \"npm:@hiveio/metamask-snap\";\n\nexport interface HivePublicKey {\n publicKey: string;\n role?: string;\n accountIndex: number;\n addressIndex: number;\n}\n\ninterface WalletStandardWallet {\n name: string;\n chains: readonly string[];\n features: Record;\n accounts: ReadonlyArray<{\n address: string;\n chains: readonly string[];\n }>;\n}\n\n/**\n * Fetch non-EVM addresses from MetaMask via the Wallet Standard protocol.\n *\n * MetaMask registers non-EVM wallets (Solana, Bitcoin) as separate Wallet Standard\n * wallets — they are NOT accessible through window.ethereum (EVM-only provider).\n */\nexport async function fetchMultichainAddresses(): Promise {\n const addresses: WalletAddressMap = {};\n\n try {\n const { getWallets } = await import(\"@wallet-standard/app\");\n const walletsApi = getWallets();\n const wallets = walletsApi.get();\n\n // Iterate ALL MetaMask wallet registrations — MetaMask may expose\n // separate entries per chain (e.g., one for Solana, one for Bitcoin)\n const mmWallets = wallets.filter(\n (w: WalletStandardWallet) =>\n w.name.toLowerCase().includes(\"metamask\") &&\n w.features[\"standard:connect\"]\n ) as WalletStandardWallet[];\n\n for (const mmWallet of mmWallets) {\n try {\n const connectFeature = mmWallet.features[\"standard:connect\"] as\n { connect: () => Promise };\n await connectFeature.connect();\n } catch (connectErr) {\n if (process.env.NODE_ENV === \"development\") {\n console.log(\"[MetaMask multichain] wallet connect failed, trying next:\", connectErr);\n }\n continue;\n }\n\n for (const account of mmWallet.accounts ?? []) {\n if (!account.address || !Array.isArray(account.chains)) continue;\n\n for (const [prefix, currency] of Object.entries(CHAIN_PREFIX_MAP)) {\n if (addresses[currency]) continue;\n if (account.chains.some((c: string) => c.startsWith(prefix))) {\n addresses[currency] = account.address;\n }\n }\n }\n }\n } catch (e) {\n if (process.env.NODE_ENV === \"development\") {\n console.log(\"[MetaMask multichain] wallet standard discovery failed:\", e);\n }\n }\n\n return addresses;\n}\n\n/**\n * Fetch the EVM address from MetaMask via window.ethereum.\n * Returns the first connected account address, or undefined on failure.\n */\nexport async function fetchEvmAddress(): Promise {\n if (typeof window === \"undefined\" || !window.ethereum?.isMetaMask) return undefined;\n\n try {\n const accounts = await window.ethereum.request({\n method: \"eth_requestAccounts\"\n }) as string[] | undefined;\n\n return accounts?.[0] ?? undefined;\n } catch {\n return undefined;\n }\n}\n\n/**\n * Discover all wallet addresses from MetaMask (EVM + non-EVM).\n * Returns a map of currency -> address. Partial results are returned on failure.\n */\nexport async function discoverMetaMaskWallets(): Promise {\n const addresses: WalletAddressMap = {};\n\n // EVM address (shared for ETH + BNB)\n const evmAddress = await fetchEvmAddress();\n if (evmAddress) {\n addresses[EcencyWalletCurrency.ETH] = evmAddress;\n addresses[EcencyWalletCurrency.BNB] = evmAddress;\n }\n\n // Non-EVM addresses via Wallet Standard\n const multichainAddresses = await fetchMultichainAddresses();\n Object.assign(addresses, multichainAddresses);\n\n return addresses;\n}\n\n/**\n * Install the Hive Snap in MetaMask.\n */\nexport async function installHiveSnap(): Promise {\n if (typeof window === \"undefined\" || !window.ethereum) {\n throw new Error(\"MetaMask is not available\");\n }\n await window.ethereum.request({\n method: \"wallet_requestSnaps\",\n params: { [HIVE_SNAP_ID]: {} }\n });\n}\n\n/**\n * Get Hive public keys from the MetaMask Hive Snap.\n * Returns owner, active, posting, and memo public keys.\n */\nexport async function getHivePublicKeys(): Promise {\n if (typeof window === \"undefined\" || !window.ethereum) {\n throw new Error(\"MetaMask is not available\");\n }\n\n const result = await window.ethereum.request({\n method: \"wallet_invokeSnap\",\n params: {\n snapId: HIVE_SNAP_ID,\n request: {\n method: \"hive_getPublicKeys\",\n params: {\n keys: [\n { role: \"owner\", accountIndex: 0 },\n { role: \"active\", accountIndex: 0 },\n { role: \"posting\", accountIndex: 0 },\n { role: \"memo\", accountIndex: 0 }\n ]\n }\n }\n }\n }) as { publicKeys?: unknown } | undefined;\n\n const keys = result?.publicKeys;\n if (!Array.isArray(keys)) {\n throw new Error(\"Hive Snap returned invalid response — expected publicKeys array\");\n }\n\n return keys as HivePublicKey[];\n}\n","import { rememberScryptBsvVersion } from \"./internal/scrypt-guard\";\n\nrememberScryptBsvVersion();\n\nexport * from \"./modules/wallets\";\nexport * from \"./modules/assets\";\n"]} \ No newline at end of file +{"version":3,"sources":["../../src/internal/scrypt-guard.ts","../../src/modules/wallets/enums/ecency-wallet-currency.ts","../../src/modules/wallets/enums/ecency-wallet-basic-tokens.ts","../../src/modules/wallets/mutations/private-api/index.ts","../../src/modules/wallets/utils/get-bound-fetch.ts","../../src/modules/wallets/mutations/private-api/create-account-with-wallets.ts","../../src/modules/wallets/mutations/private-api/check-wallet-existence.ts","../../src/modules/wallets/mutations/private-api/update-account-with-wallets.ts","../../src/modules/wallets/queries/use-get-external-wallet-query.ts","../../src/modules/wallets/queries/get-token-price-query-options.ts","../../src/modules/wallets/queries/get-all-tokens-list-query-options.ts","../../src/modules/wallets/queries/use-get-account-wallet-list-query.ts","../../src/modules/wallets/queries/get-tokens-operations-query-options.ts","../../src/modules/wallets/mutations/save-wallet-information-to-metadata.ts","../../src/modules/wallets/utils/metamask-evm-transfer.ts","../../src/modules/wallets/utils/metamask-sol-transfer.ts","../../src/modules/wallets/mutations/use-external-transfer.ts","../../src/modules/wallets/utils/derive-hive-bip44-keys.ts","../../src/modules/wallets/utils/derive-hive-master-password-keys.ts","../../src/modules/wallets/utils/detect-hive-key-derivation.ts","../../src/modules/wallets/utils/metamask-discovery.ts","../../src/index.ts"],"names":["EcencyWalletCurrency","EcencyWalletBasicTokens","useMutation","ConfigManager","queryOptions","getQueryClient","getPortfolioQueryOptions","options","useQuery","getAccountFullQueryOptions","AMOUNT_REGEX","useQueryClient","PrivateKey"],"mappings":"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","file":"index.mjs","sourcesContent":["/**\n * The scrypt bsv package writes the version string to a global symbol and\n * warns when that symbol is already populated. In environments that reload\n * modules (Next.js dev server, Storybook, etc.) the stale value triggers\n * repeated warnings. Clearing the cached handle before our modules touch bsv\n * keeps the console quiet without requiring downstream wrappers.\n *\n * Similarly, bitcore-lib and bitcore-lib-inquisition check for duplicate instances\n * using global variables and throw errors when detected. We clear these globals\n * to prevent false positives in module reloading scenarios.\n */\nconst globalLike = globalThis as Record & {\n _scrypt_bsv?: unknown;\n __scryptBsvPreviousVersion?: unknown;\n _bitcore?: unknown;\n __bitcorePreviousVersion?: unknown;\n};\n\nif (typeof globalLike._scrypt_bsv !== \"undefined\") {\n if (typeof globalLike._scrypt_bsv === \"string\") {\n globalLike.__scryptBsvPreviousVersion = globalLike._scrypt_bsv;\n }\n\n try {\n delete globalLike._scrypt_bsv;\n } catch {\n globalLike._scrypt_bsv = undefined;\n }\n}\n\n// Clear bitcore-lib global to prevent \"more than one instance\" errors\nif (typeof globalLike._bitcore !== \"undefined\") {\n if (typeof globalLike._bitcore === \"object\") {\n globalLike.__bitcorePreviousVersion = globalLike._bitcore;\n }\n\n try {\n delete globalLike._bitcore;\n } catch {\n globalLike._bitcore = undefined;\n }\n}\n\nexport function rememberScryptBsvVersion() {\n if (typeof globalLike._scrypt_bsv === \"string\") {\n globalLike.__scryptBsvPreviousVersion = globalLike._scrypt_bsv;\n }\n\n // Also remember bitcore version if it exists\n if (typeof globalLike._bitcore === \"object\") {\n globalLike.__bitcorePreviousVersion = globalLike._bitcore;\n }\n}\n","export enum EcencyWalletCurrency {\n BTC = \"BTC\",\n ETH = \"ETH\",\n BNB = \"BNB\",\n SOL = \"SOL\",\n}\n","export enum EcencyWalletBasicTokens {\n Points = \"POINTS\",\n HivePower = \"HP\",\n Hive = \"HIVE\",\n HiveDollar = \"HBD\"\n}\n","export * from \"./create-account-with-wallets\";\nexport * from \"./check-wallet-existence\";\nexport * from \"./update-account-with-wallets\";\n","let cachedFetch: typeof globalThis.fetch | undefined;\n\nexport function getBoundFetch() {\n if (!cachedFetch) {\n if (typeof globalThis.fetch !== \"function\") {\n throw new Error(\"[Ecency][Wallets] - global fetch is not available\");\n }\n\n cachedFetch = globalThis.fetch.bind(globalThis);\n }\n\n return cachedFetch;\n}\n","import { ConfigManager } from \"@ecency/sdk\";\nimport { EcencyWalletCurrency } from \"@/modules/wallets/enums\";\nimport { getBoundFetch } from \"@/modules/wallets/utils/get-bound-fetch\";\nimport { useMutation } from \"@tanstack/react-query\";\n\ninterface HiveKeys {\n ownerPublicKey?: string;\n activePublicKey?: string;\n postingPublicKey?: string;\n memoPublicKey?: string;\n}\n\ninterface Payload {\n currency: EcencyWalletCurrency;\n address: string;\n hiveKeys?: HiveKeys;\n walletAddresses?: Partial>;\n}\n\nexport function useCreateAccountWithWallets(username: string) {\n const fetchApi = getBoundFetch();\n\n return useMutation({\n mutationKey: [\"ecency-wallets\", \"create-account-with-wallets\", username],\n mutationFn: async ({ currency, address, hiveKeys, walletAddresses }: Payload) => {\n const addresses: Record = {};\n if (walletAddresses) {\n for (const [k, v] of Object.entries(walletAddresses)) {\n if (v) addresses[k] = v;\n }\n }\n\n const response = await fetchApi(`${ConfigManager.getValidatedBaseUrl()}/private-api/wallets-add`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n username,\n token: currency,\n address,\n meta: {\n ...hiveKeys,\n ...addresses,\n [currency]: address\n },\n }),\n });\n\n if (!response.ok) {\n throw new Error(`Account creation failed (${response.status})`);\n }\n\n return response;\n },\n });\n}\n","import { ConfigManager } from \"@ecency/sdk\";\nimport { EcencyWalletCurrency } from \"@/modules/wallets/enums\";\nimport { useMutation } from \"@tanstack/react-query\";\n\ninterface Payload {\n address: string;\n currency: EcencyWalletCurrency;\n}\n\nexport function useCheckWalletExistence() {\n return useMutation({\n mutationKey: [\"ecency-wallets\", \"check-wallet-existence\"],\n mutationFn: async ({ address, currency }: Payload) => {\n const response = await fetch(\n `${ConfigManager.getValidatedBaseUrl()}/private-api/wallets-exist`,\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n address,\n token: currency,\n }),\n }\n );\n const data = await response.json();\n return data.length === 0;\n },\n });\n}\n","import { ConfigManager } from \"@ecency/sdk\";\nimport { useMutation } from \"@tanstack/react-query\";\nimport { getBoundFetch } from \"@/modules/wallets/utils/get-bound-fetch\";\n\ninterface Payload {\n tokens: Record;\n hiveKeys: {\n ownerPublicKey: string;\n activePublicKey: string;\n postingPublicKey: string;\n memoPublicKey: string;\n };\n}\n\nexport function useUpdateAccountWithWallets(\n username: string,\n accessToken: string | undefined\n) {\n const fetchApi = getBoundFetch();\n\n return useMutation({\n mutationKey: [\"ecency-wallets\", \"update-account-with-wallets\", username],\n mutationFn: async ({ tokens, hiveKeys }: Payload) => {\n const entries = Object.entries(tokens).filter(([, address]) => Boolean(address));\n\n if (entries.length === 0) {\n return new Response(null, { status: 204 });\n }\n\n const [primaryToken, primaryAddress] = entries[0] ?? [\"\", \"\"];\n\n if (!accessToken) {\n throw new Error(\n \"[SDK][Wallets][PrivateApi][WalletsAdd] – access token wasn`t found\"\n );\n }\n\n const response = await fetchApi(`${ConfigManager.getValidatedBaseUrl()}/private-api/wallets-add`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n username,\n code: accessToken,\n token: primaryToken,\n address: primaryAddress,\n status: 3,\n meta: {\n ...Object.fromEntries(entries),\n ownerPublicKey: hiveKeys.ownerPublicKey,\n activePublicKey: hiveKeys.activePublicKey,\n postingPublicKey: hiveKeys.postingPublicKey,\n memoPublicKey: hiveKeys.memoPublicKey,\n },\n }),\n });\n\n // Raw fetch resolves on 4xx/5xx; guard so a failed wallet-add doesn't run\n // onSuccess as if the account had been updated.\n if (!response.ok) {\n throw new Error(\n `[SDK][Wallets][PrivateApi][WalletsAdd] – request failed: ${response.status}`\n );\n }\n\n return response;\n },\n });\n}\n","import { EcencyWalletCurrency } from \"@/modules/wallets/enums\";\nimport { ConfigManager } from \"@ecency/sdk\";\nimport { useQuery } from \"@tanstack/react-query\";\n\nconst currencyChainMap: Record = {\n [EcencyWalletCurrency.BTC]: \"btc\",\n [EcencyWalletCurrency.ETH]: \"eth\",\n [EcencyWalletCurrency.BNB]: \"bnb\",\n [EcencyWalletCurrency.SOL]: \"sol\",\n};\n\ninterface PrivateApiBalanceResponse {\n chain: string;\n balance: number | string;\n unit: string;\n raw?: unknown;\n nodeId?: string;\n}\n\nexport interface ExternalWalletBalance {\n chain: string;\n unit: string;\n raw?: unknown;\n nodeId?: string;\n /**\n * Balance represented as a BigInt for convenience.\n */\n balanceBigInt: bigint;\n /**\n * Balance returned as a string to preserve precision for UIs that cannot\n * handle bigint values directly.\n */\n balanceString: string;\n}\n\nfunction normalizeBalance(balance: number | string): string {\n if (typeof balance === \"number\") {\n if (!Number.isFinite(balance)) {\n throw new Error(\"Private API returned a non-finite numeric balance\");\n }\n\n return Math.trunc(balance).toString();\n }\n\n if (typeof balance === \"string\") {\n const trimmed = balance.trim();\n\n if (trimmed === \"\") {\n throw new Error(\"Private API returned an empty balance string\");\n }\n\n return trimmed;\n }\n\n throw new Error(\"Private API returned balance in an unexpected format\");\n}\n\nfunction parsePrivateApiBalance(\n result: unknown,\n expectedChain: string\n): ExternalWalletBalance {\n if (!result || typeof result !== \"object\") {\n throw new Error(\"Private API returned an unexpected response\");\n }\n\n const { chain, balance, unit, raw, nodeId } =\n result as PrivateApiBalanceResponse;\n\n if (typeof chain !== \"string\" || chain !== expectedChain) {\n throw new Error(\"Private API response chain did not match request\");\n }\n\n if (typeof unit !== \"string\" || unit.length === 0) {\n throw new Error(\"Private API response is missing unit information\");\n }\n\n if (balance === undefined || balance === null) {\n throw new Error(\"Private API response is missing balance information\");\n }\n\n const balanceString = normalizeBalance(balance);\n\n let balanceBigInt: bigint;\n\n try {\n balanceBigInt = BigInt(balanceString);\n } catch (error) {\n throw new Error(\"Private API returned a balance that is not an integer\");\n }\n\n return {\n chain,\n unit,\n raw,\n nodeId:\n typeof nodeId === \"string\" && nodeId.length > 0 ? nodeId : undefined,\n balanceBigInt,\n balanceString,\n };\n}\n\nexport function useGetExternalWalletBalanceQuery(\n currency: EcencyWalletCurrency,\n address: string\n) {\n return useQuery({\n queryKey: [\"ecency-wallets\", \"external-wallet-balance\", currency, address],\n queryFn: async () => {\n const chain = currencyChainMap[currency];\n\n if (!chain) {\n throw new Error(`Unsupported currency ${currency}`);\n }\n\n const baseUrl = `${ConfigManager.getValidatedBaseUrl()}/private-api/balance/${chain}/${encodeURIComponent(\n address\n )}`;\n\n let primaryResponse: Response | undefined;\n let primaryError: unknown;\n\n try {\n primaryResponse = await fetch(baseUrl);\n } catch (error) {\n primaryError = error;\n }\n\n let response = primaryResponse;\n\n if (!response || !response.ok) {\n const fallbackUrl = `${baseUrl}?provider=chainz`;\n let fallbackError: unknown;\n\n try {\n const fallbackResponse = await fetch(fallbackUrl);\n\n if (fallbackResponse.ok) {\n response = fallbackResponse;\n } else {\n fallbackError = new Error(\n `Fallback provider responded with status ${fallbackResponse.status}`\n );\n }\n } catch (error) {\n fallbackError = error;\n }\n\n if (!response || !response.ok) {\n const failureReasons: string[] = [];\n\n if (primaryError) {\n const message =\n primaryError instanceof Error\n ? primaryError.message\n : String(primaryError);\n failureReasons.push(`primary provider failed: ${message}`);\n } else if (primaryResponse && !primaryResponse.ok) {\n failureReasons.push(\n `primary provider status ${primaryResponse.status}`\n );\n }\n\n if (fallbackError) {\n const message =\n fallbackError instanceof Error\n ? fallbackError.message\n : String(fallbackError);\n failureReasons.push(`fallback provider failed: ${message}`);\n }\n\n if (failureReasons.length === 0) {\n failureReasons.push(\"unknown error\");\n }\n\n throw new Error(\n `Private API request failed (${failureReasons.join(\", \")})`\n );\n }\n }\n\n const result = (await response.json()) as unknown;\n\n return parsePrivateApiBalance(result, chain);\n },\n });\n}\n","import { ConfigManager } from \"@ecency/sdk\";\nimport { EcencyWalletCurrency } from \"@/modules/wallets/enums\";\nimport { queryOptions } from \"@tanstack/react-query\";\nimport { LRUCache } from \"lru-cache\";\n\nconst options = {\n max: 500,\n // how long to live in ms\n ttl: 1000 * 60 * 5,\n // return stale items before removing from cache?\n allowStale: false,\n updateAgeOnGet: false,\n updateAgeOnHas: false,\n};\n\nconst cache = new LRUCache(options);\nconst undefinedValue = Symbol(\"undefined\");\n\nconst cacheSet = (key: string, value: any) =>\n cache.set(key, value === undefined ? undefinedValue : value);\n\nconst cacheGet = (key: string) => {\n const v = cache.get(key);\n return v === undefinedValue ? undefined : v;\n};\n\ninterface MarketDataQuote {\n last_updated: string;\n percent_change: number;\n price: number;\n}\n\ninterface MarketDataLatestResponse {\n [token: string]: {\n quotes?: {\n usd?: MarketDataQuote;\n btc?: MarketDataQuote;\n [fiat: string]: MarketDataQuote | undefined;\n };\n };\n}\n\nconst CURRENCY_TO_TOKEN_MAP: Record = {\n [EcencyWalletCurrency.BTC]: \"btc\",\n [EcencyWalletCurrency.ETH]: \"eth\",\n [EcencyWalletCurrency.SOL]: \"sol\",\n [EcencyWalletCurrency.BNB]: \"bnb\",\n HBD: \"hbd\",\n HIVE: \"hive\",\n};\n\nconst MARKET_DATA_CACHE_KEY = \"market-data/latest\";\n\nconst normalizeCurrencyToToken = (currency: string) => {\n const upperCased = currency.toUpperCase();\n return CURRENCY_TO_TOKEN_MAP[upperCased] ?? currency.toLowerCase();\n};\n\nexport function getTokenPriceQueryOptions(currency?: string) {\n return queryOptions({\n queryKey: [\"ecency-wallets\", \"market-data\", currency],\n queryFn: async () => {\n if (!currency) {\n throw new Error(\n \"[SDK][Wallets][MarketData] – currency wasn`t provided\"\n );\n }\n\n const token = normalizeCurrencyToToken(currency);\n const baseUrl = ConfigManager.getValidatedBaseUrl();\n\n let marketData = cacheGet(MARKET_DATA_CACHE_KEY) as\n | MarketDataLatestResponse\n | undefined;\n\n if (!marketData) {\n const httpResponse = await fetch(\n `${baseUrl}/private-api/market-data/latest`,\n {\n method: \"GET\",\n }\n );\n\n if (!httpResponse.ok) {\n throw new Error(\n `[SDK][Wallets][MarketData] – failed to fetch latest market data (${httpResponse.status})`\n );\n }\n\n const data = (await httpResponse.json()) as MarketDataLatestResponse;\n cacheSet(MARKET_DATA_CACHE_KEY, data);\n marketData = data;\n }\n\n const tokenData = marketData[token];\n\n if (!tokenData) {\n throw new Error(\n `[SDK][Wallets][MarketData] – missing market data for token: ${token}`\n );\n }\n\n const usdQuote = tokenData.quotes?.usd;\n\n if (!usdQuote) {\n throw new Error(\n `[SDK][Wallets][MarketData] – missing USD quote for token: ${token}`\n );\n }\n\n return Number(usdQuote.price);\n },\n enabled: !!currency,\n });\n}\n","import {\n getHiveEngineTokensBalancesQueryOptions,\n getHiveEngineTokensMetadataQueryOptions,\n} from \"@/modules/assets\";\nimport {\n HiveEngineTokenBalance,\n HiveEngineTokenMetadataResponse,\n} from \"@/modules/assets/hive-engine/types\";\nimport { getQueryClient } from \"@ecency/sdk\";\nimport { queryOptions } from \"@tanstack/react-query\";\nimport { EcencyWalletBasicTokens, EcencyWalletCurrency } from \"../enums\";\n\nfunction createFallbackTokenMetadata(symbol: string): HiveEngineTokenMetadataResponse {\n return {\n issuer: \"\",\n symbol,\n name: symbol,\n metadata: \"{}\",\n precision: 0,\n maxSupply: \"0\",\n supply: \"0\",\n circulatingSupply: \"0\",\n stakingEnabled: false,\n unstakingCooldown: 0,\n delegationEnabled: false,\n undelegationCooldown: 0,\n numberTransactions: 0,\n totalStaked: \"0\",\n };\n}\n\nasync function getLayer2TokensMetadata(username?: string) {\n if (!username) {\n return [] as HiveEngineTokenMetadataResponse[];\n }\n\n let balances: HiveEngineTokenBalance[] = [];\n\n try {\n balances = await getQueryClient().fetchQuery(\n getHiveEngineTokensBalancesQueryOptions(username)\n );\n } catch {\n balances = [];\n }\n\n const uniqueSymbols = Array.from(\n new Set(\n balances\n .map((balance) => balance.symbol)\n .filter((symbol): symbol is string => Boolean(symbol))\n )\n );\n\n if (uniqueSymbols.length === 0) {\n return [] as HiveEngineTokenMetadataResponse[];\n }\n\n let metadataList: HiveEngineTokenMetadataResponse[] = [];\n\n try {\n metadataList = await getQueryClient().fetchQuery(\n getHiveEngineTokensMetadataQueryOptions(uniqueSymbols)\n );\n } catch {\n metadataList = [];\n }\n\n const metadataBySymbol = new Map(\n metadataList.map((token) => [token.symbol, token])\n );\n\n return uniqueSymbols.map(\n (symbol) => metadataBySymbol.get(symbol) ?? createFallbackTokenMetadata(symbol)\n );\n}\n\nexport function getAllTokensListQueryOptions(username?: string) {\n return queryOptions({\n queryKey: [\"ecency-wallets\", \"all-tokens-list\", username ?? null],\n queryFn: async () => {\n return {\n basic: [\n EcencyWalletBasicTokens.Points,\n EcencyWalletBasicTokens.Hive,\n EcencyWalletBasicTokens.HivePower,\n EcencyWalletBasicTokens.HiveDollar,\n ],\n external: Object.values(EcencyWalletCurrency),\n layer2: await getLayer2TokensMetadata(username),\n };\n },\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { EcencyWalletBasicTokens } from \"../enums\";\nimport {\n AccountProfile,\n FullAccount,\n getAccountFullQueryOptions,\n getQueryClient,\n getPortfolioQueryOptions,\n type PortfolioResponse,\n type PortfolioWalletItem,\n} from \"@ecency/sdk\";\n\ntype ProfileTokens = AccountProfile[\"tokens\"];\ntype ProfileToken = NonNullable[number];\n\nfunction normalizeAccountTokens(tokens: ProfileTokens): ProfileToken[] {\n if (Array.isArray(tokens)) {\n return tokens.filter(Boolean) as ProfileToken[];\n }\n\n if (tokens && typeof tokens === \"object\") {\n return Object.values(tokens).flatMap((value) =>\n Array.isArray(value) ? (value.filter(Boolean) as ProfileToken[]) : []\n );\n }\n\n return [];\n}\n\nconst BASIC_TOKENS: string[] = [\n EcencyWalletBasicTokens.Points,\n EcencyWalletBasicTokens.Hive,\n EcencyWalletBasicTokens.HivePower,\n EcencyWalletBasicTokens.HiveDollar,\n];\n\n// Tokens whose support has been removed. Stale profile.tokens entries and\n// portfolio responses may still reference them, so they are always hidden.\nconst REMOVED_TOKENS = new Set([\"SPK\", \"LARYNX\", \"LP\", \"BROCA\"]);\n\nexport function getAccountWalletListQueryOptions(username: string, currency: string = \"usd\") {\n return queryOptions({\n queryKey: [\"ecency-wallets\", \"list\", username, currency],\n enabled: !!username,\n queryFn: async () => {\n const portfolioQuery = getPortfolioQueryOptions(username, currency, true);\n const queryClient = getQueryClient();\n const accountQuery = getAccountFullQueryOptions(username);\n\n let account: FullAccount | undefined;\n\n try {\n account = (await queryClient.fetchQuery(accountQuery)) ?? undefined;\n } catch {\n // Best effort; fall back to defaults if account metadata is not available.\n }\n\n const tokenVisibility = new Map();\n\n const accountTokens = normalizeAccountTokens(account?.profile?.tokens);\n\n accountTokens.forEach((token: ProfileToken) => {\n const symbol = token.symbol?.toUpperCase?.();\n\n if (!symbol) {\n return;\n }\n\n const showValue = (token as any)?.meta?.show;\n\n if (typeof showValue === \"boolean\") {\n tokenVisibility.set(symbol, showValue);\n }\n });\n\n const isTokenVisible = (symbol?: string) => {\n const normalized = symbol?.toUpperCase();\n\n if (!normalized) {\n return false;\n }\n\n if (REMOVED_TOKENS.has(normalized)) {\n return false;\n }\n\n if (BASIC_TOKENS.includes(normalized)) {\n return true;\n }\n\n return tokenVisibility.get(normalized) === true;\n };\n\n try {\n const portfolio: PortfolioResponse = await queryClient.fetchQuery(portfolioQuery);\n const tokensFromPortfolio: string[] = portfolio.wallets.map(\n (asset: PortfolioWalletItem) => asset.symbol\n );\n\n if (tokensFromPortfolio.length > 0) {\n const visibleTokens = tokensFromPortfolio\n .map((token: string) => token?.toUpperCase?.())\n .filter((token: string | undefined): token is string => Boolean(token))\n .filter(isTokenVisible);\n\n if (visibleTokens.length > 0) {\n // Always include basic tokens (HP, HIVE, HBD, POINTS) even if\n // the portfolio API omits them from its response.\n return Array.from(new Set([...BASIC_TOKENS, ...visibleTokens]));\n }\n }\n } catch {\n // Fallback to legacy behaviour when the portfolio endpoint is not accessible.\n }\n\n if (accountTokens.length > 0) {\n const list = [\n ...BASIC_TOKENS,\n ...accountTokens\n .map((token: ProfileToken) => token.symbol)\n .filter(isTokenVisible),\n ];\n\n return Array.from(new Set(list).values());\n }\n\n return [...BASIC_TOKENS];\n },\n });\n}\n","import { AssetOperation } from \"@/modules/assets\";\nimport {\n getQueryClient,\n getPortfolioQueryOptions,\n type PortfolioResponse,\n type PortfolioWalletItem,\n} from \"@ecency/sdk\";\nimport { queryOptions } from \"@tanstack/react-query\";\n\nexport function getTokenOperationsQueryOptions(\n token: string,\n username: string,\n isForOwner = false,\n currency: string = \"usd\"\n) {\n return queryOptions({\n queryKey: [\"wallets\", \"token-operations\", token, username, isForOwner, currency],\n queryFn: async () => {\n const queryClient = getQueryClient();\n const normalizedToken = token.toUpperCase();\n\n if (!username || !isForOwner) {\n return [] as AssetOperation[];\n }\n\n try {\n const portfolio: PortfolioResponse = await queryClient.fetchQuery(\n getPortfolioQueryOptions(username, currency, true)\n );\n const assetEntry = portfolio.wallets.find(\n (assetItem: PortfolioWalletItem) => assetItem.symbol.toUpperCase() === normalizedToken\n );\n\n if (!assetEntry) {\n return [] as AssetOperation[];\n }\n\n // Extract action IDs and map to AssetOperation enums\n const rawActions: Array<{ id: string; [key: string]: unknown }> = assetEntry.actions ?? [];\n const operations: AssetOperation[] = rawActions\n .map((action: { id: string; [key: string]: unknown } | string) => {\n // Extract the id field from action object\n if (typeof action === \"string\") return action;\n if (action && typeof action === \"object\") {\n const record = action as Record;\n return (record.id ?? record.code ?? record.name ?? record.action) as string | undefined;\n }\n return undefined;\n })\n .filter((id: string | undefined): id is string => Boolean(id))\n .map((id: string) => {\n // Normalize: underscores to hyphens, lowercase\n const canonical = id.trim().toLowerCase().replace(/[\\s_]+/g, \"-\");\n\n // Primary mapping: API action IDs to AssetOperation enum values\n const aliasMap: Record = {\n // Common operations\n \"transfer\": AssetOperation.Transfer,\n \"ecency-point-transfer\": AssetOperation.Transfer,\n\n // Savings operations\n \"transfer-to-savings\": AssetOperation.TransferToSavings,\n \"transfer-savings\": AssetOperation.TransferToSavings,\n \"savings-transfer\": AssetOperation.TransferToSavings,\n \"withdraw-from-savings\": AssetOperation.WithdrawFromSavings,\n \"transfer-from-savings\": AssetOperation.WithdrawFromSavings,\n \"withdraw-savings\": AssetOperation.WithdrawFromSavings,\n \"savings-withdraw\": AssetOperation.WithdrawFromSavings,\n\n // Vesting/Power operations\n \"transfer-to-vesting\": AssetOperation.PowerUp,\n \"powerup\": AssetOperation.PowerUp,\n \"power-up\": AssetOperation.PowerUp,\n \"withdraw-vesting\": AssetOperation.PowerDown,\n \"power-down\": AssetOperation.PowerDown,\n \"powerdown\": AssetOperation.PowerDown,\n\n // Delegation\n \"delegate\": AssetOperation.Delegate,\n \"delegate-vesting-shares\": AssetOperation.Delegate,\n \"hp-delegate\": AssetOperation.Delegate,\n \"delegate-hp\": AssetOperation.Delegate,\n \"delegate-power\": AssetOperation.Delegate,\n \"undelegate\": AssetOperation.Undelegate,\n \"undelegate-power\": AssetOperation.Undelegate,\n \"undelegate-token\": AssetOperation.Undelegate,\n\n // Staking (Layer 2)\n \"stake\": AssetOperation.Stake,\n \"stake-token\": AssetOperation.Stake,\n \"stake-power\": AssetOperation.Stake,\n \"unstake\": AssetOperation.Unstake,\n \"unstake-token\": AssetOperation.Unstake,\n \"unstake-power\": AssetOperation.Unstake,\n\n // Swap/Convert\n \"swap\": AssetOperation.Swap,\n \"swap-token\": AssetOperation.Swap,\n \"swap-tokens\": AssetOperation.Swap,\n \"convert\": AssetOperation.Convert,\n\n // Points operations\n \"promote\": AssetOperation.Promote,\n \"promote-post\": AssetOperation.Promote,\n \"promote-entry\": AssetOperation.Promote,\n \"boost\": AssetOperation.Promote,\n \"gift\": AssetOperation.Gift,\n \"gift-points\": AssetOperation.Gift,\n \"points-gift\": AssetOperation.Gift,\n \"claim\": AssetOperation.Claim,\n \"claim-rewards\": AssetOperation.Claim,\n \"claim-points\": AssetOperation.Claim,\n \"buy\": AssetOperation.Buy,\n \"buy-points\": AssetOperation.Buy,\n\n // Other\n \"claim-interest\": AssetOperation.ClaimInterest,\n // Chain operation name, as emitted in the HP action list. The two\n // slug spellings below predate it and stay as a fallback.\n \"set-withdraw-vesting-route\": AssetOperation.WithdrawRoutes,\n \"withdraw-routes\": AssetOperation.WithdrawRoutes,\n \"withdrawroutes\": AssetOperation.WithdrawRoutes,\n };\n\n // Check alias map first (primary method)\n const mapped = aliasMap[canonical];\n if (mapped) return mapped;\n\n // Fallback: try direct enum value match (for exact matches like \"transfer\", \"promote\")\n const directMatch = Object.values(AssetOperation).find(\n (op) => op.toLowerCase() === canonical\n );\n return directMatch;\n })\n .filter((op: AssetOperation | undefined): op is AssetOperation => Boolean(op))\n // Remove duplicates - API may return multiple actions that map to same operation\n .filter((op: AssetOperation, index: number, self: AssetOperation[]) => self.indexOf(op) === index);\n\n const isHiveOrHbd = [\"HIVE\", \"HBD\"].includes(normalizedToken);\n // Check if there's a non-zero savings balance\n const rawToken = assetEntry as any;\n const hasSavings = Number(rawToken.savings ?? 0) > 0;\n\n if (\n isHiveOrHbd &&\n !hasSavings\n ) {\n return operations.filter(\n (operation) => operation !== AssetOperation.WithdrawFromSavings\n );\n }\n\n return operations;\n } catch {\n return [];\n }\n },\n });\n}\n","import {\n AccountProfile,\n getAccountFullQueryOptions,\n useAccountUpdate,\n type AuthContext,\n} from \"@ecency/sdk\";\nimport {\n useMutation,\n useQuery,\n useQueryClient,\n type UseMutationOptions,\n} from \"@tanstack/react-query\";\nimport { EcencyTokenMetadata } from \"../types\";\nimport * as R from \"remeda\";\nimport { getAccountWalletListQueryOptions } from \"../queries\";\nimport { EcencyWalletCurrency } from \"../enums\";\n\n/**\n * A CHAIN-layer entry (external wallet address). Everything else in\n * `profile.tokens` — Hive-Engine (`ENGINE`) and the basic Hive assets (`HIVE`) —\n * is managed by the wallet token picker, not by the external-wallet screens.\n */\nconst isChainToken = ({\n type,\n symbol,\n}: NonNullable[number]) =>\n type === \"CHAIN\" ||\n Object.values(EcencyWalletCurrency).includes(symbol as any);\n\nfunction getGroupedChainTokens(\n tokens?: AccountProfile[\"tokens\"],\n defaultShow?: boolean\n) {\n if (!tokens) {\n return {};\n }\n\n return R.pipe(\n tokens,\n R.filter(isChainToken),\n R.map((item) => {\n const meta = {\n ...(item.meta ?? {}),\n } as Record;\n\n if (typeof meta.show !== \"boolean\" && typeof defaultShow === \"boolean\") {\n meta.show = defaultShow;\n }\n\n return {\n ...item,\n meta,\n };\n }),\n // Chain tokens are unique by symbol, so indexing by symbol\n // gives a direct lookup map instead of an array-based grouping.\n R.indexBy(\n (item: NonNullable[number]) => item.symbol\n )\n );\n}\n\n/**\n * Assemble the `profile.tokens` array to broadcast.\n *\n * `profile.tokens` is written wholesale, so whatever this returns IS the user's\n * new on-chain token list — anything omitted is deleted, and since no app other\n * than Ecency writes this field, the deletion is unrecoverable.\n *\n * Which entries survive depends on what the caller manages, inferred from the\n * payload itself:\n *\n * - A payload carrying non-chain entries comes from the wallet token picker,\n * which owns the COMPLETE list — it always sends the basic Hive assets plus\n * every selected engine token, and deselecting one means omitting it. Unlisted\n * entries are therefore dropped, which is what the user asked for.\n * - A CHAIN-only payload comes from the external-wallet screens, which know\n * nothing about engine tokens. Their unlisted entries are carried forward.\n *\n * Inferring rather than taking a flag keeps this fix inside the package (the\n * apps resolve it through the committed dist, so a new public option could not\n * be used by a caller until the next release). It is also safe in the degenerate\n * case: if the picker somehow submits before its token list has loaded, the\n * payload is chain-only and we preserve — the non-destructive outcome.\n *\n * @param existingTokens the account's current on-chain `profile.tokens`\n * @param tokens the caller's payload\n */\nexport function buildTokensPayload(\n existingTokens: AccountProfile[\"tokens\"],\n tokens: EcencyTokenMetadata[]\n): AccountProfile[\"tokens\"] {\n // Chain type tokens couldn't be deleted entirely from the profile list,\n // then visibility should be controlling using meta.show field\n const profileChainTokens = getGroupedChainTokens(existingTokens);\n\n const payloadTokens =\n (tokens.map(({ currency, type, privateKey, username, ...meta }) => ({\n symbol: currency!,\n type:\n type ??\n (Object.values(EcencyWalletCurrency).includes(currency as any)\n ? \"CHAIN\"\n : undefined),\n meta,\n })) as AccountProfile[\"tokens\"]) ?? [];\n\n const payloadChainTokens = getGroupedChainTokens(payloadTokens, true);\n const payloadNonChainTokens = (payloadTokens ?? []).filter(\n (token) => !isChainToken(token)\n );\n\n const mergedChainTokens = R.pipe(\n profileChainTokens,\n R.mergeDeep(payloadChainTokens),\n R.values()\n );\n\n // Carry forward the on-chain entries this caller does not manage. Without it,\n // saving external wallet addresses (a CHAIN-only payload) rewrites\n // `profile.tokens` to chain entries alone and silently deletes every\n // Hive-Engine token the user selected.\n const managesNonChainTokens = payloadNonChainTokens.length > 0;\n const payloadSymbols = new Set(\n (payloadTokens ?? []).map(({ symbol }) => symbol)\n );\n const preservedTokens = managesNonChainTokens\n ? []\n : (existingTokens ?? []).filter(\n (token) => !isChainToken(token) && !payloadSymbols.has(token.symbol)\n );\n\n return [\n ...preservedTokens,\n ...payloadNonChainTokens,\n ...mergedChainTokens,\n ] as AccountProfile[\"tokens\"];\n}\n\n/**\n * Saving of token(s) metadata to Hive profile\n * It may contain: external wallets(see EcencyWalletCurrency), Hive tokens arrangement\n *\n * Basically, this mutation is a convenient wrapper for update profile operation\n */\ntype SaveWalletInformationOptions = Pick<\n UseMutationOptions,\n \"onSuccess\" | \"onError\"\n>;\n\nexport function useSaveWalletInformationToMetadata(\n username: string,\n auth?: AuthContext,\n options?: SaveWalletInformationOptions\n) {\n const queryClient = useQueryClient();\n\n const { data: accountData } = useQuery(getAccountFullQueryOptions(username));\n const { mutateAsync: updateProfile } = useAccountUpdate(username, auth);\n\n return useMutation({\n mutationKey: [\n \"ecency-wallets\",\n \"save-wallet-to-metadata\",\n accountData?.name,\n ],\n mutationFn: async (tokens: EcencyTokenMetadata[]) => {\n if (!accountData) {\n throw new Error(\"[SDK][Wallets] – no account data to save wallets\");\n }\n\n return updateProfile({\n tokens: buildTokensPayload(accountData.profile?.tokens, tokens),\n });\n },\n onError: options?.onError,\n onSuccess: (response, vars, context) => {\n (\n options?.onSuccess as\n | ((\n data: unknown,\n variables: EcencyTokenMetadata[],\n context: unknown\n ) => unknown)\n | undefined\n )?.(response, vars, context);\n queryClient.invalidateQueries({\n queryKey: getAccountWalletListQueryOptions(username).queryKey,\n });\n },\n });\n}\n","import { EcencyWalletCurrency } from \"@/modules/wallets/enums\";\n\ninterface RequestArguments {\n method: string;\n params?: unknown[] | Record;\n}\n\ninterface EthereumProvider {\n isMetaMask?: boolean;\n request(args: RequestArguments): Promise;\n}\n\ndeclare global {\n interface Window {\n ethereum?: EthereumProvider;\n }\n}\n\nfunction getEthereum(): EthereumProvider {\n if (typeof window === \"undefined\" || !window.ethereum) {\n throw new Error(\"MetaMask not found\");\n }\n return window.ethereum;\n}\n\nconst WEI_PER_ETH = 1000000000000000000n;\n\nconst EVM_CHAIN_CONFIG: Record = {\n [EcencyWalletCurrency.ETH]: {\n chainId: \"0x1\",\n name: \"Ethereum Mainnet\",\n rpcUrl: \"https://rpc.ankr.com/eth\",\n explorerUrl: \"https://etherscan.io/tx/\"\n },\n [EcencyWalletCurrency.BNB]: {\n chainId: \"0x38\",\n name: \"BNB Smart Chain\",\n rpcUrl: \"https://bsc-dataseed.binance.org\",\n explorerUrl: \"https://bscscan.com/tx/\"\n }\n};\n\nexport function getEvmChainConfig(currency: EcencyWalletCurrency) {\n const config = EVM_CHAIN_CONFIG[currency];\n if (!config) throw new Error(`Unsupported EVM currency: ${currency}`);\n return config;\n}\n\nexport function getEvmExplorerUrl(currency: EcencyWalletCurrency, txHash: string) {\n return `${getEvmChainConfig(currency).explorerUrl}${txHash}`;\n}\n\nexport async function ensureEvmChain(currency: EcencyWalletCurrency): Promise {\n const ethereum = getEthereum();\n\n const { chainId, name, rpcUrl } = getEvmChainConfig(currency);\n const currentChainId = await ethereum.request({ method: \"eth_chainId\" });\n\n if (currentChainId === chainId) return;\n\n try {\n await ethereum.request({\n method: \"wallet_switchEthereumChain\",\n params: [{ chainId }]\n });\n } catch (err: unknown) {\n // Chain not added — add it\n if (typeof err === \"object\" && err !== null && \"code\" in err && (err as { code: number }).code === 4902) {\n await ethereum.request({\n method: \"wallet_addEthereumChain\",\n params: [{\n chainId,\n chainName: name,\n rpcUrls: [rpcUrl],\n nativeCurrency: {\n name: currency === EcencyWalletCurrency.ETH ? \"Ether\" : \"BNB\",\n symbol: currency === EcencyWalletCurrency.ETH ? \"ETH\" : \"BNB\",\n decimals: 18\n }\n }]\n });\n } else {\n throw err;\n }\n }\n}\n\nexport async function estimateEvmGas(\n from: string,\n to: string,\n valueHex: string,\n currency: EcencyWalletCurrency\n): Promise<{ gasLimit: string; gasPrice: string; estimatedFeeWei: bigint }> {\n const ethereum = getEthereum();\n\n await ensureEvmChain(currency);\n\n const [gasLimit, gasPrice] = await Promise.all([\n ethereum.request({\n method: \"eth_estimateGas\",\n params: [{ from, to, value: valueHex }]\n }),\n ethereum.request({ method: \"eth_gasPrice\" })\n ]);\n\n const estimatedFeeWei = BigInt(gasLimit) * BigInt(gasPrice);\n\n return { gasLimit, gasPrice, estimatedFeeWei };\n}\n\nexport function formatWei(wei: bigint, decimals = 6): string {\n const whole = wei / WEI_PER_ETH;\n const rem = wei % WEI_PER_ETH;\n if (rem === 0n) return whole.toString();\n\n const scale = 10n ** BigInt(decimals);\n const fractional = (rem * scale) / WEI_PER_ETH;\n const fracStr = fractional.toString().padStart(decimals, \"0\").replace(/0+$/, \"\");\n return fracStr ? `${whole}.${fracStr}` : whole.toString();\n}\n\nconst AMOUNT_REGEX = /^\\d+(\\.\\d+)?$/;\n\nexport function parseToWei(amount: string): string {\n const trimmed = amount.trim();\n if (!AMOUNT_REGEX.test(trimmed)) {\n throw new Error(`Invalid amount: \"${amount}\"`);\n }\n\n const [whole, fraction = \"\"] = trimmed.split(\".\");\n if (!/^\\d+$/.test(whole) || (fraction && !/^\\d+$/.test(fraction))) {\n throw new Error(`Invalid amount: \"${amount}\"`);\n }\n\n const paddedFraction = fraction.padEnd(18, \"0\").slice(0, 18);\n const wei = BigInt(whole) * WEI_PER_ETH + BigInt(paddedFraction);\n return \"0x\" + wei.toString(16);\n}\n\nexport async function sendEvmTransfer(\n to: string,\n amountWei: string,\n currency: EcencyWalletCurrency,\n expectedFrom?: string\n): Promise {\n const ethereum = getEthereum();\n\n await ensureEvmChain(currency);\n\n const accounts = await ethereum.request({ method: \"eth_requestAccounts\" });\n const from = accounts[0];\n if (!from) throw new Error(\"No MetaMask account connected\");\n\n // Funds safety: never send from an account other than the linked wallet. The\n // active MetaMask account can differ from the one the user linked (multiple\n // accounts, switched account, or access just granted to a different one). This\n // comparison is atomic with the account read above and is the single source of\n // truth for the EVM send. Throws a sentinel the caller maps to a message.\n if (expectedFrom && from.toLowerCase() !== expectedFrom.toLowerCase()) {\n throw new Error(\"ACCOUNT_MISMATCH\");\n }\n\n const txHash = await ethereum.request({\n method: \"eth_sendTransaction\",\n params: [{\n from,\n to,\n value: amountWei\n }]\n });\n\n return txHash;\n}\n","import { ConfigManager } from \"@ecency/sdk\";\n\nconst SOL_EXPLORER_URL = \"https://explorer.solana.com/tx/\";\nconst LAMPORTS_PER_SOL = 1_000_000_000n;\nconst AMOUNT_REGEX = /^\\d+(\\.\\d+)?$/;\n\nexport function getSolExplorerUrl(signature: string) {\n return `${SOL_EXPLORER_URL}${signature}`;\n}\n\nexport function parseToLamports(amount: string): bigint {\n const trimmed = amount.trim();\n if (!AMOUNT_REGEX.test(trimmed)) {\n throw new Error(`Invalid amount: \"${amount}\"`);\n }\n\n const [whole, fraction = \"\"] = trimmed.split(\".\");\n if (!/^\\d+$/.test(whole) || (fraction && !/^\\d+$/.test(fraction))) {\n throw new Error(`Invalid amount: \"${amount}\"`);\n }\n\n if (fraction.length > 9 && fraction.slice(9).replace(/0/g, \"\").length > 0) {\n throw new Error(`Amount has more than 9 decimal places: \"${amount}\"`);\n }\n\n const paddedFraction = fraction.padEnd(9, \"0\").slice(0, 9);\n return BigInt(whole) * LAMPORTS_PER_SOL + BigInt(paddedFraction);\n}\n\nexport function formatLamports(lamports: bigint, decimals = 6): string {\n const whole = lamports / LAMPORTS_PER_SOL;\n const rem = lamports % LAMPORTS_PER_SOL;\n if (rem === 0n) return whole.toString();\n\n const scale = 10n ** BigInt(decimals);\n const fractional = (rem * scale) / LAMPORTS_PER_SOL;\n const fracStr = fractional.toString().padStart(decimals, \"0\").replace(/0+$/, \"\");\n return fracStr ? `${whole}.${fracStr}` : whole.toString();\n}\n\ninterface JsonRpcResponse {\n jsonrpc: string;\n id: number | string;\n result?: T;\n error?: { code?: number; message?: string };\n}\n\n/**\n * Call a Solana JSON-RPC method via the Ecency private API proxy.\n * This avoids hitting the public Solana RPC directly from the browser\n * (which returns 403). The proxy forwards to a public Solana RPC node.\n */\nasync function solRpc(method: string, params: unknown[] = []): Promise {\n const baseUrl = ConfigManager.getValidatedBaseUrl();\n const response = await fetch(`${baseUrl}/private-api/rpc/sol`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ jsonrpc: \"2.0\", id: 1, method, params })\n });\n\n if (!response.ok) {\n const text = await response.text().catch(() => \"\");\n throw new Error(`SOL RPC ${method} failed: ${response.status} ${response.statusText}${text ? ` — ${text}` : \"\"}`);\n }\n\n const json: JsonRpcResponse = await response.json();\n if (json.error) {\n throw new Error(json.error.message || `SOL RPC ${method} failed`);\n }\n return json.result as T;\n}\n\nasync function getMetaMaskSolanaWallet(): Promise {\n const { getWallets } = await import(\"@wallet-standard/app\");\n const walletsApi = getWallets();\n const wallets = walletsApi.get();\n\n // Only select a MetaMask wallet that supports Solana signing\n const mmWallet = wallets.find(\n (w: any) =>\n w.name.toLowerCase().includes(\"metamask\") &&\n w.features[\"standard:connect\"] &&\n w.features[\"solana:signAndSendTransaction\"]\n );\n\n if (!mmWallet) {\n throw new Error(\"MetaMask Solana wallet not found. Enable Solana in MetaMask settings.\");\n }\n\n return mmWallet;\n}\n\nexport async function sendSolTransfer(\n to: string,\n amountSol: string\n): Promise {\n const mmWallet = await getMetaMaskSolanaWallet();\n\n // Connect to get accounts\n const connectFeature = mmWallet.features[\"standard:connect\"] as any;\n await connectFeature.connect();\n\n const solAccount = mmWallet.accounts?.find(\n (acc: any) => acc.chains?.some((c: string) => c.startsWith(\"solana:\"))\n );\n\n if (!solAccount) {\n throw new Error(\"No Solana account found in MetaMask.\");\n }\n\n // Use @solana/web3.js for transaction building (dynamic import to avoid bundle bloat)\n const { PublicKey, SystemProgram, Transaction } = await import(\"@solana/web3.js\");\n\n const fromPubkey = new PublicKey(solAccount.address);\n const toPubkey = new PublicKey(to);\n const lamports = parseToLamports(amountSol);\n\n const transaction = new Transaction().add(\n SystemProgram.transfer({\n fromPubkey,\n toPubkey,\n lamports\n })\n );\n\n // Fetch blockhash via Ecency RPC proxy (avoids 403 from public Solana RPC)\n const blockhashResult = await solRpc<{ value: { blockhash: string } }>(\n \"getLatestBlockhash\",\n [{ commitment: \"finalized\" }]\n );\n transaction.recentBlockhash = blockhashResult.value.blockhash;\n transaction.feePayer = fromPubkey;\n\n // Serialize the transaction for signing via Wallet Standard\n const serializedTx = transaction.serialize({\n requireAllSignatures: false,\n verifySignatures: false\n });\n\n const signAndSendFeature = mmWallet.features[\"solana:signAndSendTransaction\"] as any;\n if (!signAndSendFeature) {\n throw new Error(\"MetaMask does not support Solana transaction signing. Please update MetaMask.\");\n }\n\n const [result] = await signAndSendFeature.signAndSendTransaction({\n account: solAccount,\n transaction: serializedTx,\n chain: \"solana:mainnet\"\n });\n\n // Result contains the signature — either a string or Uint8Array\n if (typeof result.signature === \"string\") {\n return result.signature;\n }\n\n // Encode Uint8Array to base58 (standard Solana signature format)\n const { base58 } = await import(\"@scure/base\");\n return base58.encode(new Uint8Array(result.signature));\n}\n","import { EcencyWalletCurrency } from \"@/modules/wallets/enums\";\nimport { sendEvmTransfer, parseToWei } from \"@/modules/wallets/utils/metamask-evm-transfer\";\nimport { sendSolTransfer } from \"@/modules/wallets/utils/metamask-sol-transfer\";\nimport { useMutation, useQueryClient } from \"@tanstack/react-query\";\n\nexport type TransferableCurrency =\n | EcencyWalletCurrency.ETH\n | EcencyWalletCurrency.BNB\n | EcencyWalletCurrency.SOL;\n\ninterface ExternalTransferPayload {\n to: string;\n amount: string;\n /** EVM only: the linked wallet address. The send is blocked if the active\n * MetaMask account does not match it (funds safety). */\n expectedFrom?: string;\n}\n\nexport function useExternalTransfer(currency: TransferableCurrency) {\n const queryClient = useQueryClient();\n\n return useMutation({\n mutationKey: [\"ecency-wallets\", \"external-transfer\", currency],\n mutationFn: async ({ to, amount, expectedFrom }: ExternalTransferPayload) => {\n switch (currency) {\n case EcencyWalletCurrency.ETH:\n case EcencyWalletCurrency.BNB: {\n const valueHex = parseToWei(amount);\n const txHash = await sendEvmTransfer(to, valueHex, currency, expectedFrom);\n return { txHash, currency };\n }\n case EcencyWalletCurrency.SOL: {\n const signature = await sendSolTransfer(to, amount);\n return { txHash: signature, currency };\n }\n }\n },\n onSuccess: () => {\n queryClient.invalidateQueries({\n queryKey: [\"ecency-wallets\", \"external-wallet-balance\"]\n });\n }\n });\n}\n","// @scure/bip39 (same @noble/@scure family as @scure/bip32 used below).\n// mnemonicToSeedSync is pure PBKDF2-HMAC-SHA512 over the mnemonic string — it\n// uses no wordlist, so this is byte-identical to bip39's output (verified\n// against BIP39 test vectors) while dropping bip39's ~164KB of 10 bundled\n// language wordlists from the app bundle.\nimport { mnemonicToSeedSync } from \"@scure/bip39\";\nimport { HDKey } from \"@scure/bip32\";\nimport { PrivateKey } from \"@ecency/sdk\";\n\nexport type HiveRole = \"owner\" | \"active\" | \"posting\" | \"memo\";\n\nconst ROLE_INDEX: Record = {\n owner: 0,\n active: 1,\n posting: 2,\n memo: 3,\n};\n\nexport function deriveHiveKey(\n mnemonic: string,\n role: HiveRole,\n accountIndex = 0\n) {\n const seed = mnemonicToSeedSync(mnemonic);\n const master = HDKey.fromMasterSeed(seed);\n const path = `m/44'/3054'/${accountIndex}'/0'/${ROLE_INDEX[role]}'`;\n const child = master.derive(path);\n if (!child.privateKey) {\n throw new Error(\"[Ecency][Wallets] - hive key derivation failed\");\n }\n const pk = PrivateKey.from(Buffer.from(child.privateKey));\n return {\n privateKey: pk.toString(),\n publicKey: pk.createPublic().toString(),\n } as const;\n}\n\nexport function deriveHiveKeys(\n mnemonic: string,\n accountIndex = 0\n) {\n const owner = deriveHiveKey(mnemonic, \"owner\", accountIndex);\n const active = deriveHiveKey(mnemonic, \"active\", accountIndex);\n const posting = deriveHiveKey(mnemonic, \"posting\", accountIndex);\n const memo = deriveHiveKey(mnemonic, \"memo\", accountIndex);\n return {\n owner: owner.privateKey,\n active: active.privateKey,\n posting: posting.privateKey,\n memo: memo.privateKey,\n ownerPubkey: owner.publicKey,\n activePubkey: active.publicKey,\n postingPubkey: posting.publicKey,\n memoPubkey: memo.publicKey,\n } as const;\n}\n\n","import { PrivateKey } from \"@ecency/sdk\";\nimport type { HiveRole } from \"./derive-hive-bip44-keys\";\n\nexport function deriveHiveMasterPasswordKey(\n username: string,\n masterPassword: string,\n role: HiveRole\n) {\n const pk = PrivateKey.fromLogin(username, masterPassword, role);\n return {\n privateKey: pk.toString(),\n publicKey: pk.createPublic().toString(),\n } as const;\n}\n\nexport function deriveHiveMasterPasswordKeys(\n username: string,\n masterPassword: string\n) {\n const owner = deriveHiveMasterPasswordKey(username, masterPassword, \"owner\");\n const active = deriveHiveMasterPasswordKey(username, masterPassword, \"active\");\n const posting = deriveHiveMasterPasswordKey(\n username,\n masterPassword,\n \"posting\"\n );\n const memo = deriveHiveMasterPasswordKey(username, masterPassword, \"memo\");\n return {\n owner: owner.privateKey,\n active: active.privateKey,\n posting: posting.privateKey,\n memo: memo.privateKey,\n ownerPubkey: owner.publicKey,\n activePubkey: active.publicKey,\n postingPubkey: posting.publicKey,\n memoPubkey: memo.publicKey,\n } as const;\n}\n","import { CONFIG, FullAccount, getAccountFullQueryOptions, PrivateKey } from \"@ecency/sdk\";\nimport { deriveHiveKeys } from \"./derive-hive-bip44-keys\";\n\nexport type HiveKeyDerivation = \"bip44\" | \"master-password\" | \"unknown\";\n\nexport async function detectHiveKeyDerivation(\n username: string,\n seed: string,\n type: \"active\" | \"owner\" = \"active\"\n): Promise {\n const uname = username.trim().toLowerCase();\n\n // ensure we actually have data\n const account = (await CONFIG.queryClient.fetchQuery(\n getAccountFullQueryOptions(uname)\n )) as FullAccount | null;\n if (!account) {\n throw new Error(\"[SDK][Wallets] – no account found for key derivation\");\n }\n\n // pick the right authority based on `type`\n const auth = account[type];\n\n // --- BIP44 check (match selected authority) ---\n // The input may be a legacy master password (or any non-mnemonic string),\n // which @scure/bip39 rejects with \"Invalid mnemonic\". The previous bip39 ran\n // PBKDF2 over any string and produced a (non-matching) seed here, so guard the\n // BIP44 probe and fall through to the master-password check on failure —\n // otherwise master-password logins/signing abort before authenticating.\n let matchBip44 = false;\n try {\n const bip44 = deriveHiveKeys(seed);\n const bip44Pub = type === \"owner\" ? bip44.ownerPubkey : bip44.activePubkey;\n matchBip44 = auth.key_auths.some(([pub]) => String(pub) === bip44Pub);\n } catch {\n // not a valid BIP39 mnemonic -> not a BIP44 seed\n }\n if (matchBip44) return \"bip44\";\n\n // --- Master password (legacy) check (match selected authority) ---\n const legacyPub = PrivateKey.fromLogin(uname, seed, type)\n .createPublic()\n .toString();\n\n const matchLegacy = auth.key_auths.some(([pub]) => String(pub) === legacyPub);\n if (matchLegacy) return \"master-password\";\n\n return \"unknown\";\n}\n","import { EcencyWalletCurrency } from \"@/modules/wallets/enums\";\n\nexport type WalletAddressMap = Partial>;\n\n/** Chain prefixes we look for in Wallet Standard accounts */\nconst CHAIN_PREFIX_MAP: Record = {\n \"solana:\": EcencyWalletCurrency.SOL,\n \"bip122:\": EcencyWalletCurrency.BTC\n};\n\nconst HIVE_SNAP_ID = \"npm:@hiveio/metamask-snap\";\n\nexport interface HivePublicKey {\n publicKey: string;\n role?: string;\n accountIndex: number;\n addressIndex: number;\n}\n\ninterface WalletStandardWallet {\n name: string;\n chains: readonly string[];\n features: Record;\n accounts: ReadonlyArray<{\n address: string;\n chains: readonly string[];\n }>;\n}\n\n/**\n * Fetch non-EVM addresses from MetaMask via the Wallet Standard protocol.\n *\n * MetaMask registers non-EVM wallets (Solana, Bitcoin) as separate Wallet Standard\n * wallets — they are NOT accessible through window.ethereum (EVM-only provider).\n */\nexport async function fetchMultichainAddresses(): Promise {\n const addresses: WalletAddressMap = {};\n\n try {\n const { getWallets } = await import(\"@wallet-standard/app\");\n const walletsApi = getWallets();\n const wallets = walletsApi.get();\n\n // Iterate ALL MetaMask wallet registrations — MetaMask may expose\n // separate entries per chain (e.g., one for Solana, one for Bitcoin)\n const mmWallets = wallets.filter(\n (w: WalletStandardWallet) =>\n w.name.toLowerCase().includes(\"metamask\") &&\n w.features[\"standard:connect\"]\n ) as WalletStandardWallet[];\n\n for (const mmWallet of mmWallets) {\n try {\n const connectFeature = mmWallet.features[\"standard:connect\"] as\n { connect: () => Promise };\n await connectFeature.connect();\n } catch (connectErr) {\n if (process.env.NODE_ENV === \"development\") {\n console.log(\"[MetaMask multichain] wallet connect failed, trying next:\", connectErr);\n }\n continue;\n }\n\n for (const account of mmWallet.accounts ?? []) {\n if (!account.address || !Array.isArray(account.chains)) continue;\n\n for (const [prefix, currency] of Object.entries(CHAIN_PREFIX_MAP)) {\n if (addresses[currency]) continue;\n if (account.chains.some((c: string) => c.startsWith(prefix))) {\n addresses[currency] = account.address;\n }\n }\n }\n }\n } catch (e) {\n if (process.env.NODE_ENV === \"development\") {\n console.log(\"[MetaMask multichain] wallet standard discovery failed:\", e);\n }\n }\n\n return addresses;\n}\n\n/**\n * Fetch the EVM address from MetaMask via window.ethereum.\n * Returns the first connected account address, or undefined on failure.\n */\nexport async function fetchEvmAddress(): Promise {\n if (typeof window === \"undefined\" || !window.ethereum?.isMetaMask) return undefined;\n\n try {\n const accounts = await window.ethereum.request({\n method: \"eth_requestAccounts\"\n }) as string[] | undefined;\n\n return accounts?.[0] ?? undefined;\n } catch {\n return undefined;\n }\n}\n\n/**\n * Discover all wallet addresses from MetaMask (EVM + non-EVM).\n * Returns a map of currency -> address. Partial results are returned on failure.\n */\nexport async function discoverMetaMaskWallets(): Promise {\n const addresses: WalletAddressMap = {};\n\n // EVM address (shared for ETH + BNB)\n const evmAddress = await fetchEvmAddress();\n if (evmAddress) {\n addresses[EcencyWalletCurrency.ETH] = evmAddress;\n addresses[EcencyWalletCurrency.BNB] = evmAddress;\n }\n\n // Non-EVM addresses via Wallet Standard\n const multichainAddresses = await fetchMultichainAddresses();\n Object.assign(addresses, multichainAddresses);\n\n return addresses;\n}\n\n/**\n * Install the Hive Snap in MetaMask.\n */\nexport async function installHiveSnap(): Promise {\n if (typeof window === \"undefined\" || !window.ethereum) {\n throw new Error(\"MetaMask is not available\");\n }\n await window.ethereum.request({\n method: \"wallet_requestSnaps\",\n params: { [HIVE_SNAP_ID]: {} }\n });\n}\n\n/**\n * Get Hive public keys from the MetaMask Hive Snap.\n * Returns owner, active, posting, and memo public keys.\n */\nexport async function getHivePublicKeys(): Promise {\n if (typeof window === \"undefined\" || !window.ethereum) {\n throw new Error(\"MetaMask is not available\");\n }\n\n const result = await window.ethereum.request({\n method: \"wallet_invokeSnap\",\n params: {\n snapId: HIVE_SNAP_ID,\n request: {\n method: \"hive_getPublicKeys\",\n params: {\n keys: [\n { role: \"owner\", accountIndex: 0 },\n { role: \"active\", accountIndex: 0 },\n { role: \"posting\", accountIndex: 0 },\n { role: \"memo\", accountIndex: 0 }\n ]\n }\n }\n }\n }) as { publicKeys?: unknown } | undefined;\n\n const keys = result?.publicKeys;\n if (!Array.isArray(keys)) {\n throw new Error(\"Hive Snap returned invalid response — expected publicKeys array\");\n }\n\n return keys as HivePublicKey[];\n}\n","import { rememberScryptBsvVersion } from \"./internal/scrypt-guard\";\n\nrememberScryptBsvVersion();\n\nexport * from \"./modules/wallets\";\nexport * from \"./modules/assets\";\n"]} \ No newline at end of file diff --git a/packages/wallets/src/modules/wallets/mutations/save-wallet-information-to-metadata.spec.ts b/packages/wallets/src/modules/wallets/mutations/save-wallet-information-to-metadata.spec.ts new file mode 100644 index 0000000000..32ce196b97 --- /dev/null +++ b/packages/wallets/src/modules/wallets/mutations/save-wallet-information-to-metadata.spec.ts @@ -0,0 +1,73 @@ +import { describe, expect, it } from "vitest"; +import { buildTokensPayload } from "./save-wallet-information-to-metadata"; + +const symbolsOf = (tokens: ReturnType) => + (tokens ?? []).map((t) => t.symbol); + +/** What the user already has on chain: two engine picks plus one address. */ +const onChain = [ + { symbol: "LEO", type: "ENGINE", meta: { show: true } }, + { symbol: "POB", type: "ENGINE", meta: { show: true } }, + { symbol: "BTC", type: "CHAIN", meta: { address: "bc1", show: true } }, +] as any; + +/** What setup-external-metamask / setup-external-import send: CHAIN only. */ +const chainOnlyPayload = [ + { currency: "BTC", type: "CHAIN", address: "bc1", show: true }, + { currency: "ETH", type: "CHAIN", address: "0xabc", show: true }, +] as any; + +describe("buildTokensPayload", () => { + // The regression. profile.tokens is written wholesale and no app other than + // Ecency writes it, so dropping the engine entries here is unrecoverable for + // the user — they silently lose their wallet selection. + it("preserves engine tokens when the caller saves only chain addresses", () => { + const symbols = symbolsOf(buildTokensPayload(onChain, chainOnlyPayload)); + + expect(symbols).toEqual(expect.arrayContaining(["LEO", "POB"])); + expect(symbols).toEqual(expect.arrayContaining(["BTC", "ETH"])); + }); + + // The token picker owns the whole list: deselecting an engine token drops it + // from the payload, so carrying unlisted entries forward would resurrect it. + it("honours deselection when the payload carries non-chain entries", () => { + // The picker always sends the basic Hive assets plus every selected engine + // token, so a non-chain entry in the payload marks it as the owner of the + // whole list and omission means remove. + const symbols = symbolsOf( + buildTokensPayload(onChain, [ + { currency: "HIVE", type: "HIVE", show: true }, + { currency: "LEO", type: "ENGINE", show: true }, + ] as any) + ); + + expect(symbols).toContain("LEO"); + expect(symbols).not.toContain("POB"); + }); + + it("does not duplicate an entry the payload already carries", () => { + const symbols = symbolsOf( + buildTokensPayload(onChain, [ + { currency: "LEO", type: "ENGINE", show: true }, + ] as any) + ); + + expect(symbols.filter((s) => s === "LEO")).toHaveLength(1); + }); + + it("keeps existing chain addresses the payload does not mention", () => { + const symbols = symbolsOf( + buildTokensPayload(onChain, [ + { currency: "ETH", type: "CHAIN", address: "0xabc", show: true }, + ] as any) + ); + + expect(symbols).toEqual(expect.arrayContaining(["BTC", "ETH"])); + }); + + it("handles an account with no tokens yet", () => { + expect(symbolsOf(buildTokensPayload(undefined, chainOnlyPayload))).toEqual( + expect.arrayContaining(["BTC", "ETH"]) + ); + }); +}); diff --git a/packages/wallets/src/modules/wallets/mutations/save-wallet-information-to-metadata.ts b/packages/wallets/src/modules/wallets/mutations/save-wallet-information-to-metadata.ts index 9d4b1dfafe..d1da510abe 100644 --- a/packages/wallets/src/modules/wallets/mutations/save-wallet-information-to-metadata.ts +++ b/packages/wallets/src/modules/wallets/mutations/save-wallet-information-to-metadata.ts @@ -15,6 +15,18 @@ import * as R from "remeda"; import { getAccountWalletListQueryOptions } from "../queries"; import { EcencyWalletCurrency } from "../enums"; +/** + * A CHAIN-layer entry (external wallet address). Everything else in + * `profile.tokens` — Hive-Engine (`ENGINE`) and the basic Hive assets (`HIVE`) — + * is managed by the wallet token picker, not by the external-wallet screens. + */ +const isChainToken = ({ + type, + symbol, +}: NonNullable[number]) => + type === "CHAIN" || + Object.values(EcencyWalletCurrency).includes(symbol as any); + function getGroupedChainTokens( tokens?: AccountProfile["tokens"], defaultShow?: boolean @@ -25,11 +37,7 @@ function getGroupedChainTokens( return R.pipe( tokens, - R.filter( - ({ type, symbol }) => - type === "CHAIN" || - Object.values(EcencyWalletCurrency).includes(symbol as any) - ), + R.filter(isChainToken), R.map((item) => { const meta = { ...(item.meta ?? {}), @@ -52,6 +60,83 @@ function getGroupedChainTokens( ); } +/** + * Assemble the `profile.tokens` array to broadcast. + * + * `profile.tokens` is written wholesale, so whatever this returns IS the user's + * new on-chain token list — anything omitted is deleted, and since no app other + * than Ecency writes this field, the deletion is unrecoverable. + * + * Which entries survive depends on what the caller manages, inferred from the + * payload itself: + * + * - A payload carrying non-chain entries comes from the wallet token picker, + * which owns the COMPLETE list — it always sends the basic Hive assets plus + * every selected engine token, and deselecting one means omitting it. Unlisted + * entries are therefore dropped, which is what the user asked for. + * - A CHAIN-only payload comes from the external-wallet screens, which know + * nothing about engine tokens. Their unlisted entries are carried forward. + * + * Inferring rather than taking a flag keeps this fix inside the package (the + * apps resolve it through the committed dist, so a new public option could not + * be used by a caller until the next release). It is also safe in the degenerate + * case: if the picker somehow submits before its token list has loaded, the + * payload is chain-only and we preserve — the non-destructive outcome. + * + * @param existingTokens the account's current on-chain `profile.tokens` + * @param tokens the caller's payload + */ +export function buildTokensPayload( + existingTokens: AccountProfile["tokens"], + tokens: EcencyTokenMetadata[] +): AccountProfile["tokens"] { + // Chain type tokens couldn't be deleted entirely from the profile list, + // then visibility should be controlling using meta.show field + const profileChainTokens = getGroupedChainTokens(existingTokens); + + const payloadTokens = + (tokens.map(({ currency, type, privateKey, username, ...meta }) => ({ + symbol: currency!, + type: + type ?? + (Object.values(EcencyWalletCurrency).includes(currency as any) + ? "CHAIN" + : undefined), + meta, + })) as AccountProfile["tokens"]) ?? []; + + const payloadChainTokens = getGroupedChainTokens(payloadTokens, true); + const payloadNonChainTokens = (payloadTokens ?? []).filter( + (token) => !isChainToken(token) + ); + + const mergedChainTokens = R.pipe( + profileChainTokens, + R.mergeDeep(payloadChainTokens), + R.values() + ); + + // Carry forward the on-chain entries this caller does not manage. Without it, + // saving external wallet addresses (a CHAIN-only payload) rewrites + // `profile.tokens` to chain entries alone and silently deletes every + // Hive-Engine token the user selected. + const managesNonChainTokens = payloadNonChainTokens.length > 0; + const payloadSymbols = new Set( + (payloadTokens ?? []).map(({ symbol }) => symbol) + ); + const preservedTokens = managesNonChainTokens + ? [] + : (existingTokens ?? []).filter( + (token) => !isChainToken(token) && !payloadSymbols.has(token.symbol) + ); + + return [ + ...preservedTokens, + ...payloadNonChainTokens, + ...mergedChainTokens, + ] as AccountProfile["tokens"]; +} + /** * Saving of token(s) metadata to Hive profile * It may contain: external wallets(see EcencyWalletCurrency), Hive tokens arrangement @@ -84,41 +169,8 @@ export function useSaveWalletInformationToMetadata( throw new Error("[SDK][Wallets] – no account data to save wallets"); } - // Chain type tokens couldn't be deleted entirely from the profile list, - // then visibility should be controlling using meta.show field - const profileChainTokens = getGroupedChainTokens( - accountData.profile?.tokens - ); - - const payloadTokens = - (tokens.map(({ currency, type, privateKey, username, ...meta }) => ({ - symbol: currency!, - type: - type ?? - (Object.values(EcencyWalletCurrency).includes(currency as any) - ? "CHAIN" - : undefined), - meta, - })) as AccountProfile["tokens"]) ?? []; - - const payloadChainTokens = getGroupedChainTokens(payloadTokens, true); - const payloadNonChainTokens = payloadTokens.filter( - ({ type, symbol }) => - type !== "CHAIN" && - !Object.values(EcencyWalletCurrency).includes(symbol as any) - ); - - const mergedChainTokens = R.pipe( - profileChainTokens, - R.mergeDeep(payloadChainTokens), - R.values() - ); - return updateProfile({ - tokens: [ - ...payloadNonChainTokens, - ...mergedChainTokens, - ] as AccountProfile["tokens"], + tokens: buildTokensPayload(accountData.profile?.tokens, tokens), }); }, onError: options?.onError,