@avalabs/avalanche-module 4.0.2 → 4.0.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/module.ts","../../../packages-internal/utils/src/services/token-service/token-service.ts","../../../packages-internal/utils/src/utils/charsum.ts","../../../packages-internal/utils/src/utils/array-hash.ts","../../../packages-internal/utils/src/utils/retry.ts","../../../packages-internal/utils/src/utils/coingecko-retry.ts","../../../packages-internal/utils/src/services/token-service/coingecko-proxy-client.ts","../../../packages-internal/utils/src/utils/fetch-and-verify.ts","../../../packages-internal/utils/src/services/token-service/watchlist-proxy-client.ts","../../../packages-internal/utils/src/services/pricing-service/exchange-rates.ts","../../../packages-internal/utils/src/utils/detail-item.ts","../../../packages-internal/utils/src/utils/get-core-headers.ts","../../../packages-internal/utils/src/consts.ts","../../../packages-internal/utils/src/utils/get-glacier-api-key.ts","../../../packages-internal/utils/src/utils/glacier-fetch-http-request.ts","../../../packages-internal/utils/src/utils/rpc-error-opts.ts","../manifest.json","../src/env.ts","../src/handlers/avalanche-send-transaction/avalanche-send-transaction.ts","../src/handlers/avalanche-send-transaction/schema.ts","../src/utils/get-provider.ts","../src/utils/get-provided-utxos.ts","../src/utils/parse-tx-details.ts","../src/handlers/avalanche-send-transaction/utils/parse-tx-display-title.ts","../src/handlers/avalanche-send-transaction/utils/get-addresses-by-indices.ts","../src/utils/get-transaction-detail-sections.ts","../src/handlers/avalanche-send-transaction/typeguards.ts","../src/constants.ts","../src/utils/transaction-detail-sections/add-permissionless-delegator-detail-section.ts","../src/utils/transaction-detail-sections/add-permissionless-validator-detail-section.ts","../src/utils/transaction-detail-sections/add-subnet-validator-detail-section.ts","../src/utils/transaction-detail-sections/convert-subnet-to-l1-detail-section.ts","../src/utils/transaction-detail-sections/export-detail-section.ts","../src/utils/transaction-detail-sections/import-detail-section.ts","../src/utils/transaction-detail-sections/remove-subnet-validator-detail-section.ts","../src/utils/transaction-detail-sections/chain-detail-section.ts","../src/utils/transaction-detail-sections/subnet-detail-section.ts","../src/utils/transaction-detail-sections/block-chain-detail-section.ts","../src/utils/transaction-detail-sections/disable-l1-validator-detail-section.ts","../src/utils/transaction-detail-sections/increase-l1-validator-balance-detail-section.ts","../src/utils/transaction-detail-sections/register-l1-validator-detail-section.ts","../src/utils/transaction-detail-sections/set-l1-validator-weight-detail-section.ts","../src/utils/transaction-detail-sections/add-auto-renewed-validator-detail-section.ts","../src/utils/transaction-detail-sections/set-auto-renewed-validator-config-detail-section.ts","../src/handlers/get-transaction-history/utils.ts","../src/utils/get-account-from-context.ts","../src/handlers/avalanche-sign-message/avalanche-sign-message.ts","../src/handlers/avalanche-sign-message/schemas/parse-request-params/parse-request-params.ts","../src/handlers/avalanche-sign-transaction/avalanche-sign-transaction.ts","../src/handlers/avalanche-sign-transaction/schemas/parse-request-params/parse-request-params.ts","../src/handlers/avalanche-sign-transaction/util/get-unsigned-or-partially-signed-tx.ts","../src/handlers/build-derivation-path/build-derivation-path.ts","../src/handlers/derive-address/derive-address.ts","../../../packages-internal/utils/src/utils/address-derivation.ts","../src/handlers/derive-addresses/derive-addresses.ts","../src/handlers/get-address/get-address.ts","../src/handlers/get-balances/get-balances.ts","../src/services/glacier-service/glacier-service.ts","../src/handlers/get-balances/utils.ts","../src/handlers/get-balances/convert-p-chain-balance.ts","../src/handlers/get-balances/covnert-x-chain-balance.ts","../src/handlers/get-network-fee/get-network-fee.ts","../src/handlers/get-transaction-history/get-transaction-history.ts","../src/handlers/get-transaction-history/convert-p-chain-transaction.ts","../src/handlers/get-transaction-history/convert-x-chain-transaction.ts","../src/utils/hash-blockchain-id.ts","../src/handlers/get-balances/typeguards.ts"],"names":["parseManifest","RpcMethod","VsCurrencyType","getBasicCoingeckoHttp","simplePrice","simpleTokenPrice","charsum","s","i","sum","__name","arrayHash","array","cs","retry","operation","isSuccess","maxRetries","backoffPolicy","RetryBackoffPolicy","backoffPeriodMillis","retries","lastError","delay","result","err","errorMessage","_RetryBackoffPolicy","retryIndex","secondsToDelay","_","msToDelay","linearCount","linearStepMs","n","base","incSum","ms","r","coingeckoRetry","response","RawSimplePriceResponseSchema","fetchAndVerify","fetchOptions","schema","fetchFn","responseJson","_CoingeckoProxyClient","proxyApiUrl","params","queryParams","id","rawQueryParams","CoingeckoProxyClient","z","WatchlistTokenResponseSchema","_WatchlistProxyClient","WatchlistProxyClient","_storage","_proxyApiUrl","_fetchFn","_coingeckoBasicClient","_TokenService","storage","fetch","__privateAdd","__publicField","data","currencies","formattedData","tokenData","currency","__privateSet","__privateGet","tokenDetails","token","tokenInfo","coinIds","cacheId","useCoingeckoProxy","tokenAddresses","assetPlatformId","rawData","marketCap","vol24","change24","lastUpdated","shouldThrow","TokenService","number","object","record","string","ExchangeRateSchema","DetailItemType","currencyItem","label","value","maxDecimals","symbol","textItem","alignment","addressItem","addressListItem","nodeIDItem","dataItem","dateItem","networkItem","AppName","getCoreHeaders","name","version","GLACIER_API_KEY","getGlacierApiKey","ApiError","CancelablePromise","FetchHttpRequest","GLOBAL_QUERY_PARAMS","_failedRequests","_getDelay","_request","request_fn","_postponeRequest","postponeRequest_fn","_GlacierFetchHttpRequest","config","options","mergedQuery","modifiedOptions","getRequest","__privateMethod","inner","resolve","reject","onCancel","isHttpTooManyRequests","isHttpInternalServerError","timeout","GlacierFetchHttpRequest","rpcErrorOpts","message","cause","rpcErrors","manifest_default","Environment","prodEnv","devEnv","getEnv","environment","GlacierNetwork","paramsSchema","parseRequestParams","Avalanche","AVM","PVM","utils","getProvider","network","isTestnet","isDevnet","rpcUrl","customRpcHeaders","Utxo","getProvidedUtxos","utxoHexes","vm","codec","utxoHex","utxoBytes","TxType","parseTxDetails","tx","parseTxDisplayTitle","getAddressesByIndices","indices","chainAlias","isChange","xpubXP","externalXPAddresses","provider","index","address","acc","account","isAddPermissionlessDelegatorTx","isAddPermissionlessValidatorTx","isExportTx","isImportTx","isBaseTx","isAddSubnetValidatorTx","isCreateChainTx","isCreateSubnetTx","isRemoveSubnetValidatorTx","isConvertSubnetToL1Tx","isDisableL1ValidatorTx","isIncreaseL1ValidatorBalanceTx","isRegisterL1ValidatorTx","isSetL1ValidatorWeightTx","isAddAutoRenewedValidatorTx","isSetAutoRenewedValidatorConfigTx","isStakingDetails","isExportImportTxDetails","isChainDetails","isBlockchainDetails","isSubnetDetails","AvalancheChainStrings","addPermissionlessDelegatorDetailSection","signerAccount","details","txFee","nodeID","start","end","stake","basicInfo","items","addPermissionlessValidatorDetailSection","delegationFee","addSubnetValidatorDetailSection","subnetID","convertSubnetToL1DetailSection","chainID","managerAddress","validators","subnetItems","balance","nodeId","remainingBalanceOwners","deactivationOwners","validatorItem","exportDetailSection","amount","chain","destination","type","importDetailSection","source","removeSubnetValidatorDetailSection","chainDetailSection","outputs","memo","output","balanceChangeItems","ownerAddress","subnetDetailSection","threshold","controlKeys","formatGenesisData","genesisData","genesisParsed","error","blockChainDetailSection","chainName","vmID","disableL1ValidatorDetailSection","validationId","increaseL1ValidatorBalanceDetailSection","registerL1ValidatorDetailSection","setL1ValidatorWeightDetailSection","SECONDS_IN_DAY","PPM_TO_PERCENT_DIVISOR","addAutoRenewedValidatorDetailSection","autoCompoundRewardShares","period","setAutoRenewedValidatorConfigDetailSection","txId","getTransactionDetailSections","txDetails","context","PrimaryNetworkChainName","Big","isPChainTransactions","isXChainTransactions","getExplorerAddressByNetwork","explorerUrl","hash","hashType","getTokenValue","decimals","LegacyAvalancheTxContextSchema","NewAvalancheTxContextSchema","getAccountFromLegacyContext","getAccountFromNewContext","hasAccountField","getAccountFromContext","success","avalancheSendTransaction","request","approvalController","glacierApiUrl","appInfo","getAuthHeaders","transactionHex","externalIndices","internalIndices","providedUtxoHexes","txBytes","contextResult","currentAddress","providedUtxos","utxos","unsignedTx","externalAddresses","internalAddresses","fromAddressBytes","txData","title","signingData","displayData","txHash","getTxHash","waitForTransactionReceipt","txID","onTransactionPending","onTransactionConfirmed","onTransactionReverted","explorerLink","avalancheSignMessage","accountIndex","msgHex","avaxSerial","evmSerial","Credential","getUnsignedOrPartiallySignedTx","currentEvmAddress","credentials","parsedTxInstance","spenderAddress","signedTx","sigIndices","credentialIndex","indicies","avalancheSignTransaction","from","contextParserResult","unsignedOrPartiallySignedTx","signerAddress","ownSignatureIndices","inputIndex","sigIndex","NetworkVMType","buildDerivationPath","derivationPathType","addressIndex","hasDerivationDetails","deriveAddress","secretId","xpDerivationPath","coreEthDerivationPath","provXP","xpPublicKeyHex","coreEthPublicKeyHex","coreEthAddress","xpAddresses","deriveAddressesForAvalanche","init","deriveAddresses","accountIndices","pubkeyPairs","paths","xpHex","evmHex","p","b","WalletType","getAddress","walletType","xpPub","Glacier","_GlacierUnhealthyError","GlacierUnhealthyError","_AvalancheGlacierService","headers","AvalancheGlacierService","BlockchainId","Network","isPchainBalance","balanceResult","isXchainBalance","sumAvaxFromAssets","assets","avaxAssetId","total","asset","calculateAvaxTotalBalance","balances","balanceArrays","arrayTotal","restakedRewards","TokenUnit","TokenType","convertPChainBalance","networkToken","priceInCurrency","coingeckoId","balancePerType","balanceTypes","balanceType","balancesToAdd","utxo","newBalance","available","availableInCurrency","totalBalance","balanceInCurrency","convertXChainBalance","getBalances","addresses","glacierService","tokenService","lowercaseCurrency","blockchainId","glacierNetwork","chainBalances","priceData","getNetworkFee","vmName","price","minimumPercentageBump","fastPCentage","instPCentage","fastMultiplier","instantMultiplier","SortOrder","convertPChainTransaction","chainId","froms","tos","getAmount","avaxBurnedAmount","getBurnedAmount","chainAddress","isSender","isImportExport","nonChangeEmittedUtxosAmt","getAvaxAssetId","addr","agg","txValue","val","baseTxValue","pBlockchainId","importExportAmount","nAvaxAmount","aggregateValue","nAvaxFee","accumulator","value_","convertXChainTransaction","amountSpent","amountToDisplay","xBlockchainId","consumedAmountOfAddress","changeAmountOfAddress","totalAmountUnlocked","totalAmountCreated","getTransactionHistory","nextPageToken","offset","getBlockchainIdByAddress","transactions","Crypto","hashBlockchainId","blockChainIdWithPrefix","base64","convertBase64ToBase64Url","_glacierService","_glacierApiUrl","_approvalController","_appInfo","_runtime","_AvalancheModule","runtime","AvalancheModule","isTokenWithBalancePVM","isTokenWithBalanceAVM"],"mappings":"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","sourcesContent":["import type { Avalanche } from '@avalabs/core-wallets-sdk';\nimport type {\n AppInfo,\n ApprovalController,\n BuildDerivationPathParams,\n ConstructorParams,\n DeriveAddressesParams,\n DeriveAddressesResponse,\n DeriveAddressParams,\n DeriveAddressResponse,\n GetAddressParams,\n GetAddressResponse,\n GetBalancesParams,\n GetBalancesResponse,\n GetTransactionHistory,\n Manifest,\n Module,\n Network,\n NetworkFees,\n RpcRequest,\n RuntimeParams,\n} from '@avalabs/vm-module-types';\nimport { parseManifest, RpcMethod } from '@avalabs/vm-module-types';\nimport { getCoreHeaders, TokenService } from '@internal/utils';\nimport { rpcErrors } from '@metamask/rpc-errors';\nimport ManifestJson from '../manifest.json';\nimport { getEnv } from './env';\nimport { avalancheSendTransaction } from './handlers/avalanche-send-transaction/avalanche-send-transaction';\nimport { avalancheSignMessage } from './handlers/avalanche-sign-message/avalanche-sign-message';\nimport { avalancheSignTransaction } from './handlers/avalanche-sign-transaction/avalanche-sign-transaction';\nimport { buildDerivationPath } from './handlers/build-derivation-path/build-derivation-path';\nimport { deriveAddress } from './handlers/derive-address/derive-address';\nimport { deriveAddresses } from './handlers/derive-addresses/derive-addresses';\nimport { getAddress } from './handlers/get-address/get-address';\nimport { getBalances } from './handlers/get-balances/get-balances';\nimport { getNetworkFee } from './handlers/get-network-fee/get-network-fee';\nimport { getTransactionHistory } from './handlers/get-transaction-history/get-transaction-history';\nimport { AvalancheGlacierService } from './services/glacier-service/glacier-service';\nimport { getProvider } from './utils/get-provider';\nimport { hashBlockchainId } from './utils/hash-blockchain-id';\n\ntype AvalancheConstructorParams = Omit<ConstructorParams, 'runtime'> & {\n /**\n * Required: the module cannot function without it — P/X/C balances,\n * transaction history and the UTXO fetch during avalanche_sign/sendTransaction\n * all go through core-proxy-api, which rejects requests without auth headers\n * (Firebase AppCheck) — so `getAuthHeaders` must be supplied.\n */\n runtime: RuntimeParams & Required<Pick<RuntimeParams, 'getAuthHeaders'>>;\n};\n\nexport class AvalancheModule implements Module {\n #glacierService: AvalancheGlacierService;\n #proxyApiUrl: string;\n #glacierApiUrl: string;\n #approvalController: ApprovalController;\n #appInfo: AppInfo;\n #runtime?: RuntimeParams;\n\n constructor({ approvalController, environment, appInfo, runtime }: AvalancheConstructorParams) {\n const { glacierApiUrl, proxyApiUrl } = getEnv(environment);\n this.#appInfo = appInfo;\n this.#runtime = runtime;\n this.#glacierService = new AvalancheGlacierService({\n glacierApiUrl,\n headers: getCoreHeaders(appInfo),\n // Reads #runtime at call time rather than capturing the resolver.\n getAuthHeaders: async () => this.#runtime?.getAuthHeaders?.(),\n });\n this.#proxyApiUrl = proxyApiUrl;\n this.#glacierApiUrl = glacierApiUrl;\n this.#approvalController = approvalController;\n }\n\n getProvider(network: Network): Promise<Avalanche.JsonRpcProvider> {\n return getProvider(network);\n }\n\n getAddress({ accountIndex, xpubXP, walletType, network }: GetAddressParams): Promise<GetAddressResponse> {\n return getAddress({\n accountIndex,\n xpubXP,\n walletType,\n network,\n });\n }\n\n getBalances({ addresses, network, storage, currency }: GetBalancesParams): Promise<GetBalancesResponse> {\n const tokenService = new TokenService({ storage, proxyApiUrl: this.#proxyApiUrl, fetch: this.#runtime?.fetch });\n return getBalances({ addresses, currency, network, glacierService: this.#glacierService, tokenService });\n }\n\n getManifest(): Manifest | undefined {\n const result = parseManifest(ManifestJson);\n return result.success ? result.data : undefined;\n }\n\n getNetworkFee(network: Network): Promise<NetworkFees> {\n return getNetworkFee(network);\n }\n\n getTransactionHistory({ network, address, nextPageToken, offset }: GetTransactionHistory) {\n return getTransactionHistory({ network, address, nextPageToken, offset, glacierService: this.#glacierService });\n }\n\n getTokens(_: Network) {\n return Promise.resolve([]);\n }\n\n buildDerivationPath(params: BuildDerivationPathParams) {\n return buildDerivationPath(params);\n }\n\n async deriveAddress(params: DeriveAddressParams): Promise<DeriveAddressResponse> {\n return deriveAddress({\n ...params,\n approvalController: this.#approvalController,\n });\n }\n\n async deriveAddresses(params: DeriveAddressesParams): Promise<DeriveAddressesResponse> {\n return deriveAddresses({\n ...params,\n approvalController: this.#approvalController,\n });\n }\n\n async onRpcRequest(request: RpcRequest, network: Network) {\n switch (request.method) {\n case RpcMethod.AVALANCHE_SIGN_MESSAGE:\n return avalancheSignMessage({ request, network, approvalController: this.#approvalController });\n case RpcMethod.AVALANCHE_SIGN_TRANSACTION:\n return avalancheSignTransaction({\n request,\n network,\n approvalController: this.#approvalController,\n glacierApiUrl: this.#glacierApiUrl,\n appInfo: this.#appInfo,\n getAuthHeaders: this.#runtime?.getAuthHeaders,\n });\n case RpcMethod.AVALANCHE_SEND_TRANSACTION:\n return avalancheSendTransaction({\n request,\n network,\n approvalController: this.#approvalController,\n glacierApiUrl: this.#glacierApiUrl,\n appInfo: this.#appInfo,\n getAuthHeaders: this.#runtime?.getAuthHeaders,\n });\n default:\n return { error: rpcErrors.methodNotSupported(`Method ${request.method} not supported`) };\n }\n }\n\n static getHashedBlockchainId({ blockchainId, isTestnet }: { blockchainId: string; isTestnet?: boolean }): string {\n return hashBlockchainId({ blockchainId, isTestnet });\n }\n}\n","import {\n VsCurrencyType,\n getBasicCoingeckoHttp,\n simplePrice,\n simpleTokenPrice,\n type SimplePriceParams,\n} from '@avalabs/core-coingecko-sdk';\nimport type { RawSimplePriceResponse, SimplePriceResponse, Storage } from '@avalabs/vm-module-types';\nimport { arrayHash } from '../../utils/array-hash';\nimport { coingeckoRetry } from '../../utils/coingecko-retry';\nimport { CoingeckoProxyClient } from './coingecko-proxy-client';\nimport { WatchlistProxyClient } from './watchlist-proxy-client';\n\ntype FetchFn = typeof globalThis.fetch;\n\ntype ConstructorParams = {\n storage?: Storage;\n proxyApiUrl: string;\n fetch?: FetchFn;\n};\n\nexport class TokenService {\n #storage?: Storage;\n #proxyApiUrl: string;\n #fetchFn: FetchFn;\n #coingeckoBasicClient: ReturnType<typeof getBasicCoingeckoHttp>;\n\n constructor({ storage, proxyApiUrl, fetch }: ConstructorParams) {\n this.#storage = storage;\n this.#proxyApiUrl = proxyApiUrl;\n this.#fetchFn = fetch ?? globalThis.fetch;\n this.#coingeckoBasicClient = getBasicCoingeckoHttp(undefined, this.#fetchFn);\n }\n\n async getWatchlistDataForToken({\n tokenDetails,\n currency = VsCurrencyType.USD,\n }: {\n tokenDetails: {\n symbol: string;\n isNative: boolean;\n caip2Id: string;\n address?: string;\n };\n currency: VsCurrencyType;\n }): Promise<{\n priceInCurrency: number;\n change24: number;\n marketCap: number;\n vol24: number;\n }> {\n const data = (\n await new WatchlistProxyClient(this.#proxyApiUrl).watchlistToken({\n tokens: tokenDetails.symbol,\n currency: currency,\n })\n ).filter((token) => {\n return tokenDetails.isNative\n ? token.internalId === `NATIVE-${tokenDetails.symbol.toLowerCase()}`\n : token.platforms[tokenDetails.caip2Id] === tokenDetails.address;\n });\n\n const [tokenInfo] = data;\n\n if (!tokenInfo) {\n return {\n priceInCurrency: 0,\n change24: 0,\n marketCap: 0,\n vol24: 0,\n };\n }\n\n return {\n priceInCurrency: tokenInfo.current_price ?? 0,\n change24: tokenInfo.price_change_percentage_24h ?? 0,\n marketCap: tokenInfo.market_cap ?? 0,\n vol24: tokenInfo.total_volume ?? 0,\n };\n }\n\n /**\n * Get token price with market data first on coingecko (free tier) directly,\n * if we get 429 error, retry it on coingecko proxy (paid service)\n * @returns token price with market data\n */\n async getSimplePrice({\n coinIds = [],\n currencies = [VsCurrencyType.USD],\n }: SimplePriceParams): Promise<SimplePriceResponse | undefined> {\n let data: SimplePriceResponse | undefined;\n\n const key = coinIds ? `${arrayHash(coinIds)}-${currencies.toString()}` : `${currencies.toString()}`;\n\n const cacheId = `getSimplePrice-${key}`;\n\n data = this.#storage?.get?.<SimplePriceResponse>(cacheId);\n\n if (data) return data;\n\n try {\n data = await coingeckoRetry((useCoingeckoProxy) =>\n this.simplePrice({\n coinIds,\n currencies,\n marketCap: true,\n vol24: true,\n change24: true,\n useCoingeckoProxy,\n }),\n );\n } catch {\n data = undefined;\n }\n this.#storage?.set?.(cacheId, data);\n return data;\n }\n\n /**\n * Get token price with market data for a list of addresses\n * @param tokenAddresses the token addresses\n * @param assetPlatformId The platform id for all the tokens in the list\n * @param currency the currency to be used\n * @returns a list of token price with market data\n */\n async getPricesByAddresses(\n tokenAddresses: string[],\n assetPlatformId: string,\n currency: VsCurrencyType = VsCurrencyType.USD,\n ): Promise<SimplePriceResponse | undefined> {\n let data: SimplePriceResponse | undefined;\n\n const key = `${arrayHash(tokenAddresses)}-${assetPlatformId}-${currency}`;\n\n const cacheId = `getPricesWithMarketDataByAddresses-${key}`;\n data = this.#storage?.get?.<SimplePriceResponse>(cacheId);\n\n if (data) return data;\n\n try {\n data = await coingeckoRetry((useCoingeckoProxy) =>\n this.fetchPricesByAddresses({\n assetPlatformId,\n tokenAddresses,\n currency,\n useCoingeckoProxy,\n }),\n );\n } catch (err) {\n console.error(err);\n data = undefined;\n }\n this.#storage?.set?.(cacheId, data);\n return data;\n }\n\n private async fetchPricesByAddresses({\n assetPlatformId,\n tokenAddresses,\n currency = VsCurrencyType.USD,\n useCoingeckoProxy = false,\n }: {\n assetPlatformId: string;\n tokenAddresses: string[];\n currency: VsCurrencyType;\n useCoingeckoProxy?: boolean;\n }): Promise<SimplePriceResponse> {\n if (useCoingeckoProxy) {\n const rawData = await new CoingeckoProxyClient(this.#proxyApiUrl, this.#fetchFn).simplePriceByContractAddresses({\n id: assetPlatformId,\n contract_addresses: tokenAddresses,\n vs_currencies: [currency],\n include_market_cap: true,\n include_24hr_vol: true,\n include_24hr_change: true,\n });\n return this.transformSimplePriceResponse(rawData, [currency]);\n }\n\n return simpleTokenPrice(this.#coingeckoBasicClient, {\n assetPlatformId,\n tokenAddresses,\n currencies: [currency],\n marketCap: true,\n vol24: true,\n change24: true,\n });\n }\n\n private async simplePrice({\n coinIds = [],\n currencies = [VsCurrencyType.USD],\n marketCap = false,\n vol24 = false,\n change24 = false,\n lastUpdated = false,\n useCoingeckoProxy = false,\n shouldThrow = true,\n }: SimplePriceParams & { useCoingeckoProxy?: boolean }): Promise<SimplePriceResponse> {\n if (useCoingeckoProxy) {\n const rawData = await new CoingeckoProxyClient(this.#proxyApiUrl, this.#fetchFn).simplePrice({\n ids: coinIds,\n vs_currencies: currencies,\n include_market_cap: marketCap,\n include_24hr_vol: vol24,\n include_24hr_change: change24,\n include_last_updated_at: lastUpdated,\n });\n return this.transformSimplePriceResponse(rawData, currencies);\n }\n return simplePrice(this.#coingeckoBasicClient, {\n coinIds,\n currencies,\n marketCap,\n vol24,\n change24,\n lastUpdated,\n shouldThrow,\n });\n }\n\n private transformSimplePriceResponse = (\n data: RawSimplePriceResponse,\n currencies = [VsCurrencyType.USD],\n ): SimplePriceResponse => {\n const formattedData: SimplePriceResponse = {};\n Object.keys(data).forEach((id) => {\n const tokenData = data[id];\n formattedData[id] = {};\n currencies.forEach((currency: VsCurrencyType) => {\n formattedData[id] = {\n [currency]: {\n price: tokenData?.[currency],\n change24: tokenData?.[`${currency}_24h_change`],\n vol24: tokenData?.[`${currency}_24h_vol`],\n marketCap: tokenData?.[`${currency}_market_cap`],\n },\n };\n });\n });\n return formattedData;\n };\n}\n","export function charsum(s: string): number {\n let i,\n sum = 0;\n for (i = 0; i < s.length; i++) {\n sum += s.charCodeAt(i) * (i + 1);\n }\n return sum;\n}\n","import { charsum } from './charsum';\n\n// from https://stackoverflow.com/a/25105589\nexport function arrayHash(array: string[]): string {\n let i,\n sum = 0;\n for (i = 0; i < array.length; i++) {\n const cs = charsum(array[i] ?? '');\n sum = sum + 65027 / cs;\n }\n return ('' + sum).slice(0, 16);\n}\n","const DEFAULT_MAX_RETRIES = 10;\n\ntype RetryParams<T> = {\n operation: (retryIndex: number) => Promise<T>;\n isSuccess: (result: T) => boolean;\n maxRetries?: number;\n backoffPolicy?: RetryBackoffPolicyInterface;\n};\n/*\n * Retries an operation with defined backoff policy.\n *\n * @param operation - The operation to retry.\n * @param isSuccess - The predicate to check if the operation succeeded.\n * @param maxRetries - The maximum number of retries.\n * @param backoffPolicy - Function to generate delay time based on current retry count.\n *\n * @returns The result of the operation.\n * @throws An error if the operation fails after the maximum number of retries.\n *\n * @example\n * const result = await retry(\n * async () => {\n * const response = await fetch('https://example.com')\n * return response.json()\n * },\n * result => result.status === 200\n * )\n */\nexport const retry = async <T>({\n operation,\n isSuccess,\n maxRetries = DEFAULT_MAX_RETRIES,\n backoffPolicy = RetryBackoffPolicy.exponential(),\n}: RetryParams<T>): Promise<T> => {\n let backoffPeriodMillis = 0;\n let retries = 0;\n let lastError: unknown;\n\n while (retries < maxRetries) {\n if (retries > 0) {\n await delay(backoffPeriodMillis);\n }\n\n try {\n const result = await operation(retries);\n\n if (isSuccess(result)) {\n return result;\n }\n } catch (err) {\n // when the operation throws an error, we still retry\n lastError = err;\n }\n\n backoffPeriodMillis = backoffPolicy(retries);\n retries++;\n }\n\n const errorMessage = lastError ? `Max retry exceeded. ${lastError}` : 'Max retry exceeded.';\n\n throw new Error(errorMessage);\n};\n\ntype RetryBackoffPolicyInterface = (retryIndex: number) => number;\n\nexport class RetryBackoffPolicy {\n static exponential(): RetryBackoffPolicyInterface {\n return (retryIndex: number): number => {\n return Math.pow(2, retryIndex) * 1000;\n };\n }\n\n static constant(secondsToDelay: number): RetryBackoffPolicyInterface {\n return (_: number): number => {\n return secondsToDelay * 1000;\n };\n }\n\n static constantMs(msToDelay: number): RetryBackoffPolicyInterface {\n return (_: number): number => {\n return msToDelay;\n };\n }\n\n /**\n * linearThenExponential backoff:\n * - First `linearCount` retries: linear increase by `linearStepMs`\n * - After that: increment grows exponentially based on `linearStepMs`\n * Example (linearCount=4, linearStepMs=1000):\n * 1s, 2s, 3s, 4s, 6s, 10s, 18s, 34s...\n */\n static linearThenExponential(linearCount: number, linearStepMs: number): RetryBackoffPolicyInterface {\n return (retryIndex: number): number => {\n if (retryIndex < linearCount) {\n // Linear phase: (i+1) * step\n return (retryIndex + 1) * linearStepMs;\n }\n // Exponential-increment phase (closed form):\n // n = number of exponential increments applied\n // base = linearCount * step\n // increment sum = 2*step * (2^n - 1)\n const n = retryIndex - linearCount + 1;\n const base = linearCount * linearStepMs;\n const incSum = 2 * linearStepMs * (Math.pow(2, n) - 1);\n return base + incSum;\n };\n }\n}\n\nfunction delay(ms: number) {\n return new Promise((r) => setTimeout(r, ms));\n}\n","import { RetryBackoffPolicy, retry } from './retry';\n\ntype Error = {\n status: {\n error_code: number;\n error_message: string;\n };\n};\n\nexport const coingeckoRetry = <T>(\n operation: (useCoingeckoProxy: boolean) => Promise<T | Error>,\n): Promise<T | undefined> => {\n return retry({\n operation: (retryIndex: number) => operation(retryIndex > 0),\n maxRetries: 2,\n backoffPolicy: RetryBackoffPolicy.constant(1),\n isSuccess: (response: T | Error) => {\n const errorStatus = (response as Error)?.status;\n return errorStatus?.error_code !== 429;\n },\n }) as Promise<T | undefined>;\n};\n","import { RawSimplePriceResponseSchema } from '@avalabs/vm-module-types';\nimport { fetchAndVerify } from '../../utils/fetch-and-verify';\n\nexport class CoingeckoProxyClient {\n constructor(\n private proxyApiUrl: string,\n private fetchFn?: typeof fetch,\n ) {}\n\n simplePrice(params: {\n ids: string[];\n vs_currencies: string[];\n include_market_cap?: boolean;\n include_24hr_vol?: boolean;\n include_24hr_change?: boolean;\n include_last_updated_at?: boolean;\n }) {\n // casting params as any since typing does not allow boolean and other non-string values\n // even though NodeJS does not have this restriction itself: https://nodejs.org/api/url.html#new-urlsearchparamsobj\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const queryParams = new URLSearchParams(params as any);\n return fetchAndVerify(\n [\n `${this.proxyApiUrl}/proxy/coingecko/simple/price?${queryParams}`,\n {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n },\n ],\n RawSimplePriceResponseSchema,\n this.fetchFn,\n );\n }\n\n simplePriceByContractAddresses(params: {\n id: string;\n contract_addresses: string[];\n vs_currencies?: string[];\n include_market_cap?: boolean;\n include_24hr_vol?: boolean;\n include_24hr_change?: boolean;\n }) {\n const { id, ...rawQueryParams } = params;\n\n // casting params as any since typing does not allow boolean and other non-string values\n // even though NodeJS does not have this restriction itself: https://nodejs.org/api/url.html#new-urlsearchparamsobj\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const queryParams = new URLSearchParams(rawQueryParams as any);\n\n return fetchAndVerify(\n [\n `${this.proxyApiUrl}/proxy/coingecko/simple/token_price/${id}?${queryParams}`,\n {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n },\n ],\n RawSimplePriceResponseSchema,\n this.fetchFn,\n );\n }\n}\n","import type { ZodSchema } from 'zod';\nimport z from 'zod';\n\nexport async function fetchAndVerify<T extends ZodSchema>(\n fetchOptions: Parameters<typeof fetch>,\n schema: T,\n fetchFn: typeof fetch = fetch,\n): Promise<z.infer<T>> {\n const response = await fetchFn(...fetchOptions);\n\n if (!response.ok) {\n throw new Error(`Request failed with status ${response.status}`);\n }\n\n const responseJson = await response.json();\n return schema.parse(responseJson);\n}\n","import { fetchAndVerify } from '../../utils/fetch-and-verify';\nimport { z } from 'zod';\n\nconst WatchlistTokenResponseSchema = z.array(\n z.object({\n // the object has more properties than the ones listed here, but we only need these at the moment\n internalId: z.string(),\n id: z.string(),\n symbol: z.string(),\n name: z.string(),\n image: z.string().optional().nullable(),\n current_price: z.number().optional().nullable(),\n price_change_percentage_24h: z.number().optional().nullable(),\n market_cap: z.number().optional().nullable(),\n total_volume: z.number().optional().nullable(),\n platforms: z.record(z.string(), z.string()),\n }),\n);\n\nexport class WatchlistProxyClient {\n constructor(private proxyApiUrl: string) {}\n\n watchlistToken(params: { tokens: string; currency: string }) {\n // casting params as any since typing does not allow boolean and other non-string values\n // even though NodeJS does not have this restriction itself: https://nodejs.org/api/url.html#new-urlsearchparamsobj\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const queryParams = new URLSearchParams(params as any);\n return fetchAndVerify(\n [\n `${this.proxyApiUrl}/watchlist/tokens?${queryParams}`,\n {\n method: 'GET',\n headers: {\n 'Content-Type': 'application/json',\n },\n },\n ],\n WatchlistTokenResponseSchema,\n );\n }\n}\n","import z, { number, object, record, string } from 'zod';\nimport { fetchAndVerify } from '../../utils/fetch-and-verify';\n\nconst CURRENCY_EXCHANGE_RATES_URL =\n 'https://cdn.jsdelivr.net/npm/@fawazahmed0/currency-api@latest/v1/currencies/usd.min.json';\n\nconst CURRENCY_EXCHANGE_RATES_FALLBACK_URL = 'https://latest.currency-api.pages.dev/v1/currencies/usd.min.json';\n\nconst ExchangeRateSchema = object({\n date: string(),\n usd: record(number()),\n});\n\ntype ExchangeRate = z.infer<typeof ExchangeRateSchema>;\n\nexport const getExchangeRates = async (): Promise<ExchangeRate> => {\n try {\n return await fetchAndVerify([CURRENCY_EXCHANGE_RATES_URL], ExchangeRateSchema);\n } catch {\n return await fetchAndVerify([CURRENCY_EXCHANGE_RATES_FALLBACK_URL], ExchangeRateSchema);\n }\n};\n","import {\n type AddressItem,\n type CurrencyItem,\n type NodeIDItem,\n type TextItem,\n type DataItem,\n type DateItem,\n type LinkItemValue,\n DetailItemType,\n type LinkItem,\n type FundsRecipientItem,\n type AddressListItem,\n type NetworkItemValue,\n type NetworkItem,\n} from '@avalabs/vm-module-types';\n\nexport const fundsRecipientItem = (\n address: string,\n amount: bigint,\n maxDecimals: number,\n symbol: string,\n): FundsRecipientItem => ({\n type: DetailItemType.FUNDS_RECIPIENT,\n label: address,\n amount,\n maxDecimals,\n symbol,\n});\n\nexport const currencyItem = (label: string, value: bigint, maxDecimals: number, symbol: string): CurrencyItem => ({\n label,\n type: DetailItemType.CURRENCY,\n value,\n maxDecimals,\n symbol,\n});\n\nexport const textItem = (\n label: string,\n value: string,\n alignment: 'horizontal' | 'vertical' = 'horizontal',\n): TextItem => ({\n label,\n alignment,\n type: DetailItemType.TEXT,\n value,\n});\n\nexport const linkItem = (label: string, value: LinkItemValue): LinkItem => ({\n label,\n value,\n type: DetailItemType.LINK,\n});\n\nexport const addressItem = (label: string, value: string): AddressItem => ({\n label,\n type: DetailItemType.ADDRESS,\n value,\n});\n\nexport const addressListItem = (label: string, value: string[]): AddressListItem => ({\n label,\n type: DetailItemType.ADDRESS_LIST,\n value,\n});\n\nexport const nodeIDItem = (label: string, value: string): NodeIDItem => ({\n label,\n type: DetailItemType.NODE_ID,\n value,\n});\n\nexport const dataItem = (label: string, value: string): DataItem => ({\n label,\n type: DetailItemType.DATA,\n value,\n});\n\nexport const dateItem = (label: string, value: string): DateItem => ({\n label,\n type: DetailItemType.DATE,\n value,\n});\n\nexport const networkItem = (label: string, value: NetworkItemValue): NetworkItem => ({\n label,\n type: DetailItemType.NETWORK,\n value,\n});\n","import { AppName, type AppInfo } from '@avalabs/vm-module-types';\n\nexport const getCoreHeaders = ({ name, version }: AppInfo): Record<string, string> | undefined => {\n switch (name) {\n case AppName.CORE_MOBILE_IOS:\n case AppName.CORE_MOBILE_ANDROID:\n case AppName.CORE_WEB:\n case AppName.CORE_EXTENSION:\n case AppName.EXPLORER:\n return {\n 'x-application-name': name,\n 'x-application-version': version,\n };\n case AppName.OTHER:\n return undefined;\n }\n};\n","export const GLACIER_API_KEY = process.env.GLACIER_API_KEY;\n","import { GLACIER_API_KEY } from '../consts';\n\n// this key is only needed in development to bypass rate limit\n// it should never be used in production\nexport const getGlacierApiKey = (): string | undefined => {\n return GLACIER_API_KEY;\n};\n","import {\n ApiError,\n type ApiRequestOptions,\n CancelablePromise,\n FetchHttpRequest,\n type OpenAPIConfig,\n} from '@avalabs/glacier-sdk';\nimport { getGlacierApiKey } from './get-glacier-api-key';\nimport { RetryBackoffPolicy } from './retry';\n\nconst GLOBAL_QUERY_PARAMS: Record<string, string | undefined> = {\n rltoken: getGlacierApiKey(),\n};\n\n/**\n * Custom HTTP request handler that automatically appends the Glacier API key (if present)\n * to bypass rate limits in development environments.\n */\nexport class GlacierFetchHttpRequest extends FetchHttpRequest {\n #failedRequests = 0;\n #getDelay = RetryBackoffPolicy.exponential();\n\n constructor(config: OpenAPIConfig) {\n super(config);\n }\n\n public override request<T>(options: ApiRequestOptions): CancelablePromise<T> {\n // Merge global query parameters with request-specific ones\n const mergedQuery = {\n ...GLOBAL_QUERY_PARAMS,\n ...(options.query || {}), // Request-specific params (override globals if same key)\n };\n\n // Create modified options with merged query\n const modifiedOptions: ApiRequestOptions = {\n ...options,\n query: Object.keys(mergedQuery).length > 0 ? mergedQuery : undefined,\n };\n\n const getRequest = () => super.request<T>(modifiedOptions);\n return this.#failedRequests > 0 ? this.#postponeRequest<T>(getRequest) : this.#request<T>(getRequest);\n }\n\n #request<T>(getRequest: () => CancelablePromise<T>): CancelablePromise<T> {\n const inner = getRequest();\n return new CancelablePromise((resolve, reject, onCancel) => {\n onCancel(() => inner.cancel());\n inner\n .then((response) => {\n this.#failedRequests = 0;\n resolve(response);\n })\n .catch((err) => {\n if (err instanceof ApiError) {\n const isHttpTooManyRequests = err.status === 429;\n const isHttpInternalServerError = err.status >= 500 && err.status < 600;\n this.#failedRequests += Number(isHttpTooManyRequests || isHttpInternalServerError);\n }\n reject(err);\n });\n });\n }\n\n #postponeRequest<T>(getRequest: () => CancelablePromise<T>): CancelablePromise<T> {\n const delay = this.#getDelay(this.#failedRequests);\n return new CancelablePromise<T>((resolve, reject, onCancel) => {\n const timeout = setTimeout(() => {\n const inner = getRequest();\n onCancel(() => {\n inner.cancel();\n clearTimeout(timeout);\n });\n inner.then(resolve).catch(reject);\n }, delay);\n });\n }\n}\n","/**\n * Builds the options object for `rpcErrors.internal()` / `rpcErrors.invalidParams()` etc.\n * Ensures the actual error message appears in the top-level `message` field,\n * which is what viem exposes as `error.details` to dapps.\n */\nexport const rpcErrorOpts = (message: string, cause: unknown) => ({\n message: `${message}${cause instanceof Error ? `: ${cause.message}` : ''}`,\n data: { cause },\n});\n","{\n \"name\": \"Avalanche\",\n \"description\": \"\",\n \"version\": \"0.0.1\",\n \"sources\": {\n \"module\": {\n \"checksum\": \"\",\n \"location\": {\n \"npm\": {\n \"filePath\": \"dist/index.js\",\n \"packageName\": \"@avalabs/avalanche-module\",\n \"registry\": \"https://registry.npmjs.org\"\n }\n }\n }\n },\n \"network\": {\n \"chainIds\": [\n \"avax:8aDU0Kqh-5d23op-B-r-4YbQFRbsgF9a\",\n \"avax:YRLfeDBJpfEqUWe2FYR1OpXsnDDZeKWd\",\n \"avax:Rr9hnPVPxuUvrdCul-vjEsU1zmqKqRDo\",\n \"avax:Sj7NVE3jXTbJvwFAiu7OEUo_8g8ctXMG\",\n \"avax:imji8papUf2EhV3le337w1vgFauqkJg-\",\n \"avax:8AJTpRj3SAqv1e80Mtl9em08LhvKEbkl\",\n \"avax:N5PeRoKwDDREF0awn2GPsb9sHnGRzdEX\"\n ],\n \"namespaces\": [\"avax\"]\n },\n \"cointype\": \"9000\",\n \"permissions\": {\n \"rpc\": {\n \"dapps\": true,\n \"methods\": [\"avalanche_sendTransaction\", \"avalanche_signTransaction\", \"avalanche_signMessage\"],\n \"nonRestrictedMethods\": []\n }\n },\n \"manifestVersion\": \"0.1\"\n}\n","import { Environment } from '@avalabs/vm-module-types';\n\ntype Env = {\n glacierApiUrl: string;\n proxyApiUrl: string;\n};\n\nexport const prodEnv: Env = {\n glacierApiUrl: 'https://core-proxy-api.avax.network/v1/proxy/glacier',\n proxyApiUrl: 'https://proxy-api.avax.network',\n};\n\nexport const devEnv: Env = {\n glacierApiUrl: 'https://core-proxy-api.avax-test.network/v1/proxy/glacier',\n proxyApiUrl: 'https://proxy-api-dev.avax.network',\n};\n\nexport const getEnv = (environment: Environment): Env => {\n switch (environment) {\n case Environment.PRODUCTION:\n return prodEnv;\n case Environment.DEV:\n return devEnv;\n }\n};\n","import {\n type SigningData,\n type Network,\n type ApprovalController,\n type DisplayData,\n type RpcRequest,\n RpcMethod,\n type SigningResult,\n type Hex,\n type AppInfo,\n} from '@avalabs/vm-module-types';\nimport { Network as GlacierNetwork } from '@avalabs/glacier-sdk';\nimport { parseRequestParams } from './schema';\nimport { rpcErrors } from '@metamask/rpc-errors';\nimport { Avalanche } from '@avalabs/core-wallets-sdk';\nimport { avaxSerial, AVM, EVMUnsignedTx, PVM, UnsignedTx, utils } from '@avalabs/avalanchejs';\nimport { getProvider } from '../../utils/get-provider';\nimport { getProvidedUtxos } from '../../utils/get-provided-utxos';\nimport { parseTxDetails } from '../../utils/parse-tx-details';\nimport { parseTxDisplayTitle } from './utils/parse-tx-display-title';\nimport { getCoreHeaders, retry, rpcErrorOpts } from '@internal/utils';\nimport { getAddressesByIndices } from './utils/get-addresses-by-indices';\nimport { getTransactionDetailSections } from '../../utils/get-transaction-detail-sections';\nimport { getExplorerAddressByNetwork } from '../get-transaction-history/utils';\nimport { getAccountFromContext } from '../../utils/get-account-from-context';\n\nexport const avalancheSendTransaction = async ({\n request,\n network,\n approvalController,\n glacierApiUrl,\n appInfo,\n getAuthHeaders,\n}: {\n request: RpcRequest;\n network: Network;\n approvalController: ApprovalController;\n glacierApiUrl: string;\n appInfo: AppInfo;\n getAuthHeaders?: () => Promise<Record<string, string>>;\n}) => {\n const result = parseRequestParams(request.params);\n\n if (!result.success) {\n return {\n error: rpcErrors.invalidParams(rpcErrorOpts('Transaction params are invalid', result.error)),\n };\n }\n\n try {\n const { transactionHex, chainAlias, externalIndices, internalIndices, utxos: providedUtxoHexes } = result.data;\n const vm = Avalanche.getVmByChainAlias(chainAlias);\n const txBytes = utils.hexToBuffer(transactionHex);\n const isTestnet = network.isTestnet ?? false;\n const provider = await getProvider(network);\n const contextResult = getAccountFromContext(request.context);\n\n if (!contextResult.success) {\n return {\n error: rpcErrors.invalidParams(contextResult.error),\n };\n }\n\n const { xpAddress: currentAddress, xpubXP, externalXPAddresses } = contextResult.data;\n\n const providedUtxos = getProvidedUtxos({\n utxoHexes: providedUtxoHexes,\n vm,\n });\n\n const utxos = providedUtxos.length\n ? providedUtxos\n : await Avalanche.getUtxosByTxFromGlacier({\n transactionHex,\n chainAlias,\n network: isTestnet ? GlacierNetwork.FUJI : GlacierNetwork.MAINNET,\n url: glacierApiUrl,\n headers: { ...getCoreHeaders(appInfo), ...(await getAuthHeaders?.()) },\n });\n\n let unsignedTx: UnsignedTx | EVMUnsignedTx;\n if (chainAlias === 'C') {\n unsignedTx = await Avalanche.createAvalancheEvmUnsignedTx({\n txBytes,\n vm,\n utxos,\n fromAddress: currentAddress,\n });\n } else {\n const tx = utils.unpackWithManager(vm, txBytes) as avaxSerial.AvaxTx;\n\n if (xpubXP !== undefined && typeof xpubXP !== 'string') {\n return {\n error: rpcErrors.invalidParams('xpubXP must be a string'),\n };\n }\n\n const externalAddresses = await getAddressesByIndices({\n indices: externalIndices ?? [],\n chainAlias,\n isChange: false,\n network,\n xpubXP,\n externalXPAddresses,\n });\n\n const internalAddresses = await getAddressesByIndices({\n indices: internalIndices ?? [],\n chainAlias,\n isChange: true,\n network,\n xpubXP,\n externalXPAddresses,\n });\n\n const fromAddresses = [...new Set([currentAddress, ...externalAddresses, ...internalAddresses])];\n\n const fromAddressBytes = fromAddresses.map((address) => utils.parse(address)[2]);\n\n unsignedTx = await Avalanche.createAvalancheUnsignedTx({\n tx,\n utxos,\n provider,\n fromAddressBytes,\n });\n }\n\n const txData = await Avalanche.parseAvalancheTx(unsignedTx, provider, currentAddress);\n\n const txDetails = parseTxDetails(txData);\n const title = parseTxDisplayTitle(txData);\n\n // Throw an error if we can't parse the transaction\n if (txData.type === 'unknown' || txDetails === undefined) {\n return {\n error: rpcErrors.internal('Unable to parse transaction data. Unsupported tx type'),\n };\n }\n\n const signingData: SigningData = {\n type: RpcMethod.AVALANCHE_SEND_TRANSACTION,\n unsignedTxJson: JSON.stringify(unsignedTx.toJSON()),\n data: txData,\n vm,\n externalIndices,\n internalIndices,\n };\n\n const details = getTransactionDetailSections(txDetails, network.networkToken.symbol, {\n network,\n signerAccount: currentAddress,\n });\n\n // Throw an error if we can't parse the transaction details\n if (details === undefined) {\n return {\n error: rpcErrors.internal('Unable to parse transaction display data. Unsupported tx type'),\n };\n }\n\n const displayData: DisplayData = {\n title,\n network: {\n chainId: network.chainId,\n name: network.chainName,\n logoUri: network.logoUri,\n },\n details,\n networkFeeSelector: false,\n };\n\n // prompt user for approval\n const response = await approvalController.requestApproval({ request, displayData, signingData });\n\n if ('error' in response) {\n return {\n error: response.error,\n };\n }\n\n let txHash: Hex;\n\n try {\n txHash = (await getTxHash(provider, response, vm)) as Hex;\n } catch (error) {\n return {\n error: rpcErrors.internal(rpcErrorOpts('Unable to broadcast transaction', error)),\n };\n }\n\n waitForTransactionReceipt({\n explorerUrl: network.explorerUrl ?? '',\n provider,\n txHash,\n vm,\n onTransactionPending: approvalController.onTransactionPending,\n onTransactionConfirmed: approvalController.onTransactionConfirmed,\n onTransactionReverted: approvalController.onTransactionReverted,\n request: request,\n });\n\n return { result: txHash };\n } catch (error) {\n console.error(error);\n return {\n error: rpcErrors.internal(rpcErrorOpts('Unable to create transaction', error)),\n };\n }\n};\n\nconst getTxHash = async (provider: Avalanche.JsonRpcProvider, response: SigningResult, vm: 'EVM' | 'AVM' | 'PVM') => {\n if ('txHash' in response) {\n return response.txHash;\n }\n\n // broadcast the signed transaction\n const { txID } = await provider.issueTxHex(response.signedData, vm);\n return txID;\n};\n\nconst waitForTransactionReceipt = async ({\n explorerUrl,\n provider,\n txHash,\n vm,\n onTransactionPending,\n onTransactionConfirmed,\n onTransactionReverted,\n request,\n}: {\n explorerUrl: string;\n provider: Avalanche.JsonRpcProvider;\n txHash: Hex;\n vm: 'EVM' | 'AVM' | 'PVM';\n onTransactionPending: ({\n txHash,\n request,\n explorerLink,\n }: {\n txHash: Hex;\n request: RpcRequest;\n explorerLink: string;\n }) => void;\n onTransactionConfirmed: ({\n txHash,\n explorerLink,\n request,\n }: {\n txHash: Hex;\n explorerLink: string;\n request: RpcRequest;\n }) => void;\n onTransactionReverted: ({ txHash, request }: { txHash: Hex; request: RpcRequest }) => void;\n request: RpcRequest;\n}) => {\n const maxTransactionStatusCheckRetries = 7;\n\n const explorerLink = getExplorerAddressByNetwork(explorerUrl, txHash);\n\n try {\n onTransactionPending({ txHash, request, explorerLink });\n\n if (vm === PVM) {\n // https://docs.avax.network/api-reference/p-chain/api#platformgettxstatus\n const result = await retry({\n operation: () => provider.getApiP().getTxStatus({ txID: txHash }),\n isSuccess: (result) => ['Committed', 'Dropped'].includes(result.status),\n maxRetries: maxTransactionStatusCheckRetries,\n });\n\n if (result.status === 'Committed') {\n onTransactionConfirmed({ txHash, explorerLink, request });\n } else {\n onTransactionReverted({ txHash, request });\n }\n } else if (vm === AVM) {\n // https://docs.avax.network/api-reference/x-chain/api#avmgettxstatus\n const result = await retry({\n operation: () => provider.getApiX().getTxStatus({ txID: txHash }),\n isSuccess: (result) => ['Accepted', 'Rejected'].includes(result.status),\n maxRetries: maxTransactionStatusCheckRetries,\n });\n\n if (result.status === 'Accepted') {\n onTransactionConfirmed({ txHash, explorerLink, request });\n } else {\n onTransactionReverted({ txHash, request });\n }\n } else {\n // https://docs.avax.network/api-reference/c-chain/api#avaxgetatomictxstatus\n const result = await retry({\n operation: () => provider.getApiC().getAtomicTxStatus(txHash),\n isSuccess: (result) => ['Accepted', 'Dropped'].includes(result.status),\n maxRetries: maxTransactionStatusCheckRetries,\n });\n\n if (result.status === 'Accepted') {\n onTransactionConfirmed({ txHash, explorerLink, request });\n } else {\n onTransactionReverted({ txHash, request });\n }\n }\n } catch (error) {\n console.error(error);\n if (error instanceof Error && error.message.startsWith('Max retry exceeded.')) {\n // in the future, we may want to handle this timeout situation differently\n } else {\n onTransactionReverted({ txHash, request });\n }\n }\n};\n","import { z } from 'zod';\n\nconst paramsSchema = z.object({\n transactionHex: z.string(),\n chainAlias: z.enum(['X', 'P', 'C']),\n externalIndices: z.number().array().optional(),\n internalIndices: z.number().array().optional(),\n utxos: z.string().array().optional(),\n});\n\nexport const parseRequestParams = (params: unknown) => {\n return paramsSchema.safeParse(params);\n};\n\nexport type AvalancheSendTransactionParams = z.infer<typeof paramsSchema>;\n","import { Avalanche } from '@avalabs/core-wallets-sdk';\nimport type { Network } from '@avalabs/vm-module-types';\n\nexport const getProvider = async (network: Network): Promise<Avalanche.JsonRpcProvider> => {\n const { isTestnet, isDevnet, rpcUrl, customRpcHeaders } = network;\n const fetchOptions: RequestInit | undefined = customRpcHeaders ? { headers: customRpcHeaders } : undefined;\n\n if (isDevnet) {\n return Avalanche.JsonRpcProvider.fromBaseURL(rpcUrl);\n }\n\n return isTestnet\n ? Avalanche.JsonRpcProvider.getDefaultFujiProvider(fetchOptions)\n : Avalanche.JsonRpcProvider.getDefaultMainnetProvider(fetchOptions);\n};\n","import { Utxo, type VM, utils } from '@avalabs/avalanchejs';\n\nexport const getProvidedUtxos = ({ utxoHexes = [], vm }: { utxoHexes?: string[]; vm: VM }): Utxo[] => {\n try {\n const codec = utils.getManagerForVM(vm).getDefaultCodec();\n return utxoHexes.map((utxoHex) => {\n const utxoBytes = utils.hexToBuffer(utxoHex);\n return Utxo.fromBytes(utxoBytes, codec)[0];\n });\n } catch (err) {\n console.error('Error getting provided utxos', err);\n return [];\n }\n};\n","import type { Avalanche } from '@avalabs/core-wallets-sdk';\nimport { type VM, TxType, type TxDetails } from '@avalabs/vm-module-types';\n\nexport const parseTxDetails = (tx: Avalanche.Tx): TxDetails | undefined => {\n switch (tx.type) {\n case TxType.AddPermissionlessDelegator:\n return { ...tx, type: TxType.AddPermissionlessDelegator };\n case TxType.AddPermissionlessValidator:\n return { ...tx, type: TxType.AddPermissionlessValidator };\n case TxType.AddSubnetValidator:\n return { ...tx, type: TxType.AddSubnetValidator };\n case TxType.CreateChain:\n return { ...tx, type: TxType.CreateChain };\n case TxType.CreateSubnet:\n return { ...tx, type: TxType.CreateSubnet };\n case TxType.RemoveSubnetValidator:\n return { ...tx, type: TxType.RemoveSubnetValidator };\n case TxType.AddAutoRenewedValidator:\n return { ...tx, type: TxType.AddAutoRenewedValidator };\n case TxType.SetAutoRenewedValidatorConfig:\n return { ...tx, type: TxType.SetAutoRenewedValidatorConfig };\n case TxType.ConvertSubnetToL1:\n return { ...tx, type: TxType.ConvertSubnetToL1, chain: tx.chain as VM };\n case TxType.SetL1ValidatorWeight:\n return { ...tx, type: TxType.SetL1ValidatorWeight, chain: tx.chain as VM };\n case TxType.DisableL1Validator:\n return { ...tx, type: TxType.DisableL1Validator, chain: tx.chain as VM };\n case TxType.IncreaseL1ValidatorBalance:\n return {\n ...tx,\n type: TxType.IncreaseL1ValidatorBalance,\n chain: tx.chain as VM,\n };\n case TxType.RegisterL1Validator:\n return { ...tx, type: TxType.RegisterL1Validator, chain: tx.chain as VM };\n case TxType.Export:\n return {\n ...tx,\n type: TxType.Export,\n chain: tx.chain as VM,\n destination: tx.destination as VM,\n };\n case TxType.Import:\n return {\n ...tx,\n type: TxType.Import,\n chain: tx.chain as VM,\n source: tx.source as VM,\n };\n case TxType.Base:\n return {\n ...tx,\n type: TxType.Base,\n chain: tx.chain as VM,\n };\n default:\n return undefined;\n }\n};\n","import type { Avalanche } from '@avalabs/core-wallets-sdk';\nimport { TxType } from '@avalabs/vm-module-types';\n\nexport const parseTxDisplayTitle = (tx: Avalanche.Tx): string => {\n switch (tx.type) {\n case TxType.AddPermissionlessDelegator:\n return 'Do you want to add this delegator?';\n case TxType.AddPermissionlessValidator:\n return 'Do you want to add this validator?';\n case TxType.Export:\n return 'Do you approve this export?';\n case TxType.Import:\n return 'Do you approve this import?';\n case TxType.Base:\n return 'Do you approve this transaction?';\n case TxType.AddSubnetValidator:\n return 'Do you want to add this subnet validator?';\n case TxType.CreateChain:\n return 'Do you want to create this chain?';\n case TxType.CreateSubnet:\n return 'Do you want to create this L1?';\n case TxType.RemoveSubnetValidator:\n return 'Do you want to remove this subnet validator?';\n case TxType.ConvertSubnetToL1:\n return 'Do you want to convert this subnet?';\n case TxType.DisableL1Validator:\n return 'Do you want to disable this validator?';\n case TxType.IncreaseL1ValidatorBalance:\n return 'Do you want to increase this validator balance?';\n case TxType.RegisterL1Validator:\n return 'Do you want to register this validator?';\n case TxType.SetL1ValidatorWeight:\n return 'Do you want to set this validator weight?';\n case TxType.AddAutoRenewedValidator:\n return 'Do you want to add this auto-renewed validator?';\n case TxType.SetAutoRenewedValidatorConfig:\n return 'Do you want to update this auto-renewed validator config?';\n default:\n return 'Sign Message';\n }\n};\n","import { Avalanche } from '@avalabs/core-wallets-sdk';\nimport type { Network } from '@avalabs/vm-module-types';\nimport { getProvider } from '../../../utils/get-provider';\n\nexport const getAddressesByIndices = async ({\n indices,\n chainAlias,\n isChange,\n network,\n xpubXP,\n externalXPAddresses,\n}: {\n indices: number[];\n chainAlias: 'X' | 'P';\n isChange: boolean;\n network: Network;\n xpubXP?: string;\n externalXPAddresses?: { index: number; address: string }[];\n}): Promise<string[]> => {\n if (xpubXP) {\n const provider = await getProvider(network);\n\n return indices.map((index) => Avalanche.getAddressFromXpub(xpubXP, index, provider, chainAlias, isChange));\n }\n\n if (externalXPAddresses && Array.isArray(externalXPAddresses)) {\n const accounts = indices\n .map((index) => externalXPAddresses.find((address) => address.index === index))\n .filter((acc) => acc !== undefined);\n\n return accounts.map((account) => account.address);\n }\n\n return [];\n};\n","import { type Network, type TxDetails } from '@avalabs/vm-module-types';\nimport {\n isAddAutoRenewedValidatorTx,\n isAddPermissionlessDelegatorTx,\n isAddPermissionlessValidatorTx,\n isAddSubnetValidatorTx,\n isBlockchainDetails,\n isExportTx,\n isImportTx,\n isRemoveSubnetValidatorTx,\n isSetAutoRenewedValidatorConfigTx,\n isSubnetDetails,\n isConvertSubnetToL1Tx,\n isDisableL1ValidatorTx,\n isIncreaseL1ValidatorBalanceTx,\n isRegisterL1ValidatorTx,\n isSetL1ValidatorWeightTx,\n isChainDetails,\n} from '../handlers/avalanche-send-transaction/typeguards';\nimport {\n addAutoRenewedValidatorDetailSection,\n convertSubnetToL1DetailSection,\n addSubnetValidatorDetailSection,\n removeSubnetValidatorDetailSection,\n addPermissionlessValidatorDetailSection,\n blockChainDetailSection,\n subnetDetailSection,\n chainDetailSection,\n exportDetailSection,\n importDetailSection,\n addPermissionlessDelegatorDetailSection,\n disableL1ValidatorDetailSection,\n increaseL1ValidatorBalanceDetailSection,\n registerL1ValidatorDetailSection,\n setAutoRenewedValidatorConfigDetailSection,\n setL1ValidatorWeightDetailSection,\n} from './transaction-detail-sections';\n\nexport type GetTransactionDetailSectionsContext = {\n network: Network;\n signerAccount: string;\n};\n\nexport const getTransactionDetailSections = (\n txDetails: TxDetails,\n symbol: string,\n context?: GetTransactionDetailSectionsContext,\n) => {\n if (isChainDetails(txDetails)) {\n return chainDetailSection(txDetails, symbol);\n } else if (isExportTx(txDetails)) {\n return exportDetailSection(txDetails, symbol);\n } else if (isImportTx(txDetails)) {\n return importDetailSection(txDetails, symbol);\n } else if (isSubnetDetails(txDetails)) {\n return subnetDetailSection(txDetails, symbol);\n } else if (isAddPermissionlessDelegatorTx(txDetails)) {\n if (!context) throw new Error('context (network, signerAccount) is required for AddPermissionlessDelegator');\n return addPermissionlessDelegatorDetailSection({\n tx: txDetails,\n symbol,\n network: context.network,\n signerAccount: context.signerAccount,\n });\n } else if (isAddPermissionlessValidatorTx(txDetails)) {\n if (!context) throw new Error('context (network, signerAccount) is required for AddPermissionlessValidator');\n return addPermissionlessValidatorDetailSection({\n tx: txDetails,\n symbol,\n network: context.network,\n signerAccount: context.signerAccount,\n });\n } else if (isBlockchainDetails(txDetails)) {\n return blockChainDetailSection(txDetails, symbol);\n } else if (isAddSubnetValidatorTx(txDetails)) {\n return addSubnetValidatorDetailSection(txDetails, symbol);\n } else if (isRemoveSubnetValidatorTx(txDetails)) {\n return removeSubnetValidatorDetailSection(txDetails, symbol);\n } else if (isConvertSubnetToL1Tx(txDetails)) {\n return convertSubnetToL1DetailSection(txDetails, symbol);\n } else if (isDisableL1ValidatorTx(txDetails)) {\n return disableL1ValidatorDetailSection(txDetails, symbol);\n } else if (isIncreaseL1ValidatorBalanceTx(txDetails)) {\n return increaseL1ValidatorBalanceDetailSection(txDetails, symbol);\n } else if (isRegisterL1ValidatorTx(txDetails)) {\n return registerL1ValidatorDetailSection(txDetails, symbol);\n } else if (isSetL1ValidatorWeightTx(txDetails)) {\n return setL1ValidatorWeightDetailSection(txDetails, symbol);\n } else if (isAddAutoRenewedValidatorTx(txDetails)) {\n if (!context) throw new Error('context (network, signerAccount) is required for AddAutoRenewedValidator');\n return addAutoRenewedValidatorDetailSection({\n tx: txDetails,\n symbol,\n network: context.network,\n signerAccount: context.signerAccount,\n });\n } else if (isSetAutoRenewedValidatorConfigTx(txDetails)) {\n return setAutoRenewedValidatorConfigDetailSection(txDetails, symbol);\n }\n};\n","import {\n TxType,\n type AddAutoRenewedValidatorTx,\n type AddPermissionlessDelegatorTx,\n type AddPermissionlessValidatorTx,\n type AddSubnetValidatorTx,\n type BaseTx,\n type BlockchainDetails,\n type ChainDetails,\n type ConvertSubnetToL1Tx,\n type CreateChainTx,\n type CreateSubnetTx,\n type DisableL1ValidatorTx,\n type ExportImportTxDetails,\n type ExportTx,\n type ImportTx,\n type IncreaseL1ValidatorBalanceTx,\n type RegisterL1ValidatorTx,\n type RemoveSubnetValidatorTx,\n type SetAutoRenewedValidatorConfigTx,\n type SetL1ValidatorWeightTx,\n type StakingDetails,\n type SubnetDetails,\n type TxDetails,\n} from '@avalabs/vm-module-types';\n\nexport const isAddPermissionlessDelegatorTx = (tx: TxDetails): tx is AddPermissionlessDelegatorTx =>\n tx.type === TxType.AddPermissionlessDelegator;\nexport const isAddPermissionlessValidatorTx = (tx: TxDetails): tx is AddPermissionlessValidatorTx =>\n tx.type === TxType.AddPermissionlessValidator;\nexport const isExportTx = (tx: TxDetails): tx is ExportTx => tx.type === TxType.Export;\nexport const isImportTx = (tx: TxDetails): tx is ImportTx => tx.type === TxType.Import;\nexport const isBaseTx = (tx: TxDetails): tx is BaseTx => tx.type === TxType.Base;\nexport const isAddSubnetValidatorTx = (tx: TxDetails): tx is AddSubnetValidatorTx =>\n tx.type === TxType.AddSubnetValidator;\nexport const isCreateChainTx = (tx: TxDetails): tx is CreateChainTx => tx.type === TxType.CreateChain;\nexport const isCreateSubnetTx = (tx: TxDetails): tx is CreateSubnetTx => tx.type === TxType.CreateSubnet;\nexport const isRemoveSubnetValidatorTx = (tx: TxDetails): tx is RemoveSubnetValidatorTx =>\n tx.type === TxType.RemoveSubnetValidator;\nexport const isConvertSubnetToL1Tx = (tx: TxDetails): tx is ConvertSubnetToL1Tx => tx.type === TxType.ConvertSubnetToL1;\nexport const isDisableL1ValidatorTx = (tx: TxDetails): tx is DisableL1ValidatorTx =>\n tx.type === TxType.DisableL1Validator;\nexport const isIncreaseL1ValidatorBalanceTx = (tx: TxDetails): tx is IncreaseL1ValidatorBalanceTx =>\n tx.type === TxType.IncreaseL1ValidatorBalance;\nexport const isRegisterL1ValidatorTx = (tx: TxDetails): tx is RegisterL1ValidatorTx =>\n tx.type === TxType.RegisterL1Validator;\nexport const isSetL1ValidatorWeightTx = (tx: TxDetails): tx is SetL1ValidatorWeightTx =>\n tx.type === TxType.SetL1ValidatorWeight;\nexport const isAddAutoRenewedValidatorTx = (tx: TxDetails): tx is AddAutoRenewedValidatorTx =>\n tx.type === TxType.AddAutoRenewedValidator;\nexport const isSetAutoRenewedValidatorConfigTx = (tx: TxDetails): tx is SetAutoRenewedValidatorConfigTx =>\n tx.type === TxType.SetAutoRenewedValidatorConfig;\n\nexport const isStakingDetails = (tx: TxDetails): tx is StakingDetails =>\n isAddPermissionlessDelegatorTx(tx) ||\n isAddPermissionlessValidatorTx(tx) ||\n isAddSubnetValidatorTx(tx) ||\n isRemoveSubnetValidatorTx(tx) ||\n isAddAutoRenewedValidatorTx(tx) ||\n isSetAutoRenewedValidatorConfigTx(tx);\nexport const isExportImportTxDetails = (tx: TxDetails): tx is ExportImportTxDetails => isExportTx(tx) || isImportTx(tx);\nexport const isChainDetails = (tx: TxDetails): tx is ChainDetails => isBaseTx(tx);\nexport const isBlockchainDetails = (tx: TxDetails): tx is BlockchainDetails => isCreateChainTx(tx);\nexport const isSubnetDetails = (tx: TxDetails): tx is SubnetDetails => isCreateSubnetTx(tx);\n","export const AVAX_NONEVM_DENOMINATION = 9;\n\nexport enum AvalancheChainStrings {\n AVM = 'X-Chain',\n PVM = 'P-Chain',\n EVM = 'C-Chain',\n}\n","import type { AddPermissionlessDelegatorTx, DetailItem, DetailSection, Network } from '@avalabs/vm-module-types';\nimport { addressItem, currencyItem, dateItem, nodeIDItem } from '@internal/utils';\nimport { AVAX_NONEVM_DENOMINATION } from '../../constants';\nimport { networkItem } from '@internal/utils/src/utils/detail-item';\n\ntype AddPermissionlessDelegatorDetailSectionProps = {\n tx: AddPermissionlessDelegatorTx;\n symbol: string;\n network: Network;\n signerAccount: string;\n};\n\nexport const addPermissionlessDelegatorDetailSection = ({\n tx,\n symbol,\n network,\n signerAccount,\n}: AddPermissionlessDelegatorDetailSectionProps) => {\n const details: DetailSection[] = [];\n const { txFee, nodeID, start, end, stake } = tx;\n\n const basicInfo: DetailSection = {\n items: [\n addressItem('Account', signerAccount),\n networkItem('Network', {\n name: network.chainName,\n logoUri: network.logoUri,\n }),\n ],\n };\n\n details.push(basicInfo);\n\n const items: DetailItem[] = [\n nodeIDItem('Node', nodeID),\n currencyItem('Stake Amount', stake, AVAX_NONEVM_DENOMINATION, symbol),\n dateItem('Start', start),\n dateItem('End', end),\n ];\n\n details.push({\n title: 'Staking Details',\n items,\n });\n if (txFee) {\n details.push({\n title: 'Network Fee',\n items: [currencyItem('Fee Amount', txFee, AVAX_NONEVM_DENOMINATION, symbol)],\n });\n }\n return details;\n};\n","import type { AddPermissionlessValidatorTx, DetailItem, DetailSection, Network } from '@avalabs/vm-module-types';\nimport { addressItem, currencyItem, dateItem, nodeIDItem, textItem } from '@internal/utils';\nimport { AVAX_NONEVM_DENOMINATION } from '../../constants';\nimport { networkItem } from '@internal/utils/src/utils/detail-item';\n\ntype AddPermissionlessValidatorDetailSectionProps = {\n tx: AddPermissionlessValidatorTx;\n symbol: string;\n network: Network;\n signerAccount: string;\n};\n\nexport const addPermissionlessValidatorDetailSection = ({\n tx,\n symbol,\n network,\n signerAccount,\n}: AddPermissionlessValidatorDetailSectionProps) => {\n const details: DetailSection[] = [];\n const { txFee, nodeID, delegationFee, start, end, stake } = tx;\n\n const basicInfo: DetailSection = {\n items: [\n addressItem('Account', signerAccount),\n networkItem('Network', {\n name: network.chainName,\n logoUri: network.logoUri,\n }),\n ],\n };\n\n details.push(basicInfo);\n\n const items: DetailItem[] = [nodeIDItem('Node', nodeID)];\n\n items.push(\n currencyItem('Stake Amount', stake, AVAX_NONEVM_DENOMINATION, symbol),\n textItem('Delegation Fee', `${delegationFee / 10000} %`),\n dateItem('Start', start),\n dateItem('End', end),\n );\n\n details.push({\n title: 'Staking Details',\n items,\n });\n\n if (txFee) {\n details.push({\n title: 'Network Fee',\n items: [currencyItem('Fee Amount', txFee, AVAX_NONEVM_DENOMINATION, symbol)],\n });\n }\n\n return details;\n};\n","import type { AddSubnetValidatorTx, DetailItem, DetailSection } from '@avalabs/vm-module-types';\nimport { currencyItem, dateItem, nodeIDItem } from '@internal/utils';\nimport { AVAX_NONEVM_DENOMINATION } from '../../constants';\n\nexport const addSubnetValidatorDetailSection = (tx: AddSubnetValidatorTx, symbol: string) => {\n const details: DetailSection[] = [];\n const { txFee, nodeID, start, end, subnetID } = tx;\n\n const items: DetailItem[] = [\n nodeIDItem('Subnet ID', subnetID),\n nodeIDItem('Node ID', nodeID),\n dateItem('Start Date', start),\n dateItem('End Date', end),\n ];\n\n details.push({\n title: 'Staking Details',\n items,\n });\n\n if (txFee) {\n details.push({\n title: 'Network Fee',\n items: [currencyItem('Fee Amount', txFee, AVAX_NONEVM_DENOMINATION, symbol)],\n });\n }\n return details;\n};\n","import type { ConvertSubnetToL1Tx, DetailItem, DetailSection } from '@avalabs/vm-module-types';\nimport { addressItem, currencyItem, nodeIDItem, textItem } from '@internal/utils';\nimport { AVAX_NONEVM_DENOMINATION } from '../../constants';\n\nexport const convertSubnetToL1DetailSection = (tx: ConvertSubnetToL1Tx, symbol: string) => {\n const details: DetailSection[] = [];\n const { txFee, chainID, managerAddress, subnetID, validators } = tx;\n\n const subnetItems: DetailItem[] = [\n nodeIDItem('Subnet ID', subnetID),\n nodeIDItem('Chain ID', chainID),\n addressItem('Manager Address', managerAddress),\n ];\n\n details.push({\n title: 'L1 Details',\n items: subnetItems,\n });\n\n validators.forEach(({ balance, stake, nodeId, remainingBalanceOwners, deactivationOwners }, index) => {\n const validatorItem: DetailItem[] = [\n nodeIDItem('Node ID', nodeId),\n currencyItem('Balance', balance, AVAX_NONEVM_DENOMINATION, symbol),\n currencyItem('Stake', stake, AVAX_NONEVM_DENOMINATION, symbol),\n ];\n if (deactivationOwners.length > 0) {\n validatorItem.push(\n textItem(\n `${deactivationOwners.length > 1 ? 'Owners' : 'Owner'} Able to Deactivate`,\n deactivationOwners.join('\\n'),\n 'vertical',\n ),\n );\n }\n if (remainingBalanceOwners.length > 0) {\n validatorItem.push(\n textItem(\n `${remainingBalanceOwners.length > 1 ? 'Owners' : 'Owner'} of the Remaining Balance`,\n remainingBalanceOwners.join('\\n'),\n 'vertical',\n ),\n );\n }\n\n details.push({\n title: index === 0 ? 'Validators' : undefined,\n items: validatorItem,\n });\n });\n\n if (txFee) {\n details.push({\n title: 'Network Fee',\n items: [currencyItem('Fee Amount', txFee, AVAX_NONEVM_DENOMINATION, symbol)],\n });\n }\n\n return details;\n};\n","import type { DetailSection, ExportTx } from '@avalabs/vm-module-types';\nimport { currencyItem, textItem } from '@internal/utils';\nimport { AvalancheChainStrings, AVAX_NONEVM_DENOMINATION } from '../../constants';\n\nexport const exportDetailSection = (tx: ExportTx, symbol: string) => {\n const details: DetailSection[] = [];\n const { txFee, amount, chain, destination, type } = tx;\n\n details.push({\n items: [\n textItem('Source Chain', `Avalanche ${AvalancheChainStrings[chain]}`),\n textItem('Target Chain', `Avalanche ${AvalancheChainStrings[destination]}`),\n ],\n });\n\n details.push({\n items: [\n textItem('Transaction Type', type ? (type[0] || '').toUpperCase() + type.slice(1) : ''),\n currencyItem('Amount', amount, AVAX_NONEVM_DENOMINATION, symbol),\n ],\n });\n if (txFee) {\n details.push({\n title: 'Network Fee',\n items: [currencyItem('Fee Amount', txFee, AVAX_NONEVM_DENOMINATION, symbol)],\n });\n }\n return details;\n};\n","import type { DetailSection, ImportTx } from '@avalabs/vm-module-types';\nimport { currencyItem, textItem } from '@internal/utils';\nimport { AvalancheChainStrings, AVAX_NONEVM_DENOMINATION } from '../../constants';\n\nexport const importDetailSection = (tx: ImportTx, symbol: string) => {\n const details: DetailSection[] = [];\n const { txFee, amount, chain, source, type } = tx;\n details.push({\n items: [\n textItem('Source Chain', `Avalanche ${AvalancheChainStrings[source]}`),\n textItem('Destination Chain', `Avalanche ${AvalancheChainStrings[chain]}`),\n ],\n });\n\n details.push({\n items: [\n textItem('Transaction Type', type ? (type[0] || '').toUpperCase() + type.slice(1) : ''),\n currencyItem('Amount', amount, AVAX_NONEVM_DENOMINATION, symbol),\n ],\n });\n if (txFee) {\n details.push({\n title: 'Network Fee',\n items: [currencyItem('Fee Amount', txFee, AVAX_NONEVM_DENOMINATION, symbol)],\n });\n }\n return details;\n};\n","import type { DetailItem, DetailSection, RemoveSubnetValidatorTx } from '@avalabs/vm-module-types';\nimport { currencyItem, nodeIDItem } from '@internal/utils';\nimport { AVAX_NONEVM_DENOMINATION } from '../../constants';\n\nexport const removeSubnetValidatorDetailSection = (tx: RemoveSubnetValidatorTx, symbol: string) => {\n const details: DetailSection[] = [];\n const { txFee, nodeID, subnetID } = tx;\n\n const items: DetailItem[] = [nodeIDItem('Node ID', nodeID), nodeIDItem('Subnet ID', subnetID)];\n\n details.push({\n title: 'Staking Details',\n items,\n });\n\n if (txFee) {\n details.push({\n title: 'Network Fee',\n items: [currencyItem('Fee Amount', txFee, AVAX_NONEVM_DENOMINATION, symbol)],\n });\n }\n return details;\n};\n","import type { BaseTx, DetailItem, DetailSection } from '@avalabs/vm-module-types';\nimport { addressItem, currencyItem, textItem } from '@internal/utils';\nimport { AvalancheChainStrings, AVAX_NONEVM_DENOMINATION } from '../../constants';\nimport { PVM } from '@avalabs/avalanchejs';\n\nexport const chainDetailSection = (tx: BaseTx, symbol: string) => {\n const details: DetailSection[] = [];\n const { txFee, chain, outputs, memo } = tx;\n\n details.push({\n title: 'Chain Details',\n items: [textItem('Active chain', `Avalanche ${AvalancheChainStrings[chain]}`)],\n });\n\n outputs.forEach((output, index) => {\n const balanceChangeItems: DetailItem[] = output.owners.flatMap((ownerAddress) => [\n addressItem('To', ownerAddress),\n currencyItem('Amount', output.amount, AVAX_NONEVM_DENOMINATION, symbol),\n ]);\n\n if (output.owners.length > 1) {\n balanceChangeItems.push(textItem('Threshold', output.threshold.toString()));\n }\n\n details.push({\n title: index === 0 ? 'Balance Change' : undefined,\n items: balanceChangeItems,\n });\n });\n\n if (chain !== PVM && !!memo) {\n details.push({\n title: 'Memo',\n items: [memo],\n });\n }\n if (txFee) {\n details.push({\n title: 'Network Fee',\n items: [currencyItem('Fee Amount', txFee, AVAX_NONEVM_DENOMINATION, symbol)],\n });\n }\n\n return details;\n};\n","import type { CreateSubnetTx, DetailSection } from '@avalabs/vm-module-types';\nimport { currencyItem, textItem } from '@internal/utils';\nimport { AVAX_NONEVM_DENOMINATION } from '../../constants';\nimport { addressListItem } from '@internal/utils/src/utils/detail-item';\n\nexport const subnetDetailSection = (tx: CreateSubnetTx, symbol: string) => {\n const details: DetailSection[] = [];\n const { txFee, threshold, controlKeys } = tx;\n\n details.push({\n title: 'L1 Details',\n items: [\n addressListItem(controlKeys.length > 1 ? 'Owners' : 'Owner', controlKeys),\n textItem('Signature Threshold', `${threshold}/${controlKeys.length}`, 'horizontal'),\n ],\n });\n if (txFee) {\n details.push({\n title: 'Network Fee',\n items: [currencyItem('Fee Amount', txFee, AVAX_NONEVM_DENOMINATION, symbol)],\n });\n }\n\n return details;\n};\n","import type { CreateChainTx, DetailItem, DetailSection } from '@avalabs/vm-module-types';\nimport { currencyItem, dataItem, textItem } from '@internal/utils';\nimport { AVAX_NONEVM_DENOMINATION } from '../../constants';\n\nconst formatGenesisData = (genesisData: string): string => {\n try {\n // Parse and re-stringify with formatting\n const genesisParsed = JSON.parse(genesisData);\n return JSON.stringify(genesisParsed, null, 2);\n } catch (error) {\n // If parsing fails, return original string (don't break approval)\n console.error('Failed to format genesis data:', error);\n return genesisData;\n }\n};\n\nexport const blockChainDetailSection = (tx: CreateChainTx, symbol: string) => {\n const details: DetailSection[] = [];\n // handle genesis data similarly to how we handle data in transaction details\n const { txFee, chainID, chainName, vmID, genesisData } = tx;\n\n const items: DetailItem[] = [\n textItem('Blockchain name', chainName, 'vertical'),\n textItem('Blockchain ID', chainID, 'vertical'),\n textItem('Virtual Machine ID', vmID, 'vertical'),\n dataItem('Genesis Data', formatGenesisData(genesisData)),\n ];\n\n details.push({\n title: 'Blockchain Details',\n items,\n });\n if (txFee) {\n details.push({\n title: 'Network Fee',\n items: [currencyItem('Fee Amount', txFee, AVAX_NONEVM_DENOMINATION, symbol)],\n });\n }\n\n return details;\n};\n","import type { DetailItem, DetailSection, DisableL1ValidatorTx } from '@avalabs/vm-module-types';\nimport { currencyItem, nodeIDItem } from '@internal/utils';\nimport { AVAX_NONEVM_DENOMINATION } from '../../constants';\n\nexport const disableL1ValidatorDetailSection = (tx: DisableL1ValidatorTx, symbol: string) => {\n const details: DetailSection[] = [];\n\n const { txFee, validationId } = tx;\n\n const items: DetailItem[] = [nodeIDItem('Validation ID', validationId)];\n\n details.push({\n title: 'L1 Details',\n items: items,\n });\n\n if (txFee) {\n details.push({\n title: 'Network Fee',\n items: [currencyItem('Fee Amount', txFee, AVAX_NONEVM_DENOMINATION, symbol)],\n });\n }\n\n return details;\n};\n","import type { DetailItem, DetailSection, IncreaseL1ValidatorBalanceTx } from '@avalabs/vm-module-types';\nimport { currencyItem, nodeIDItem } from '@internal/utils';\nimport { AVAX_NONEVM_DENOMINATION } from '../../constants';\n\nexport const increaseL1ValidatorBalanceDetailSection = (tx: IncreaseL1ValidatorBalanceTx, symbol: string) => {\n const details: DetailSection[] = [];\n\n const { txFee, balance, validationId } = tx;\n\n const items: DetailItem[] = [\n nodeIDItem('Validation ID', validationId),\n currencyItem('Increase by amount', balance, AVAX_NONEVM_DENOMINATION, symbol),\n ];\n\n details.push({\n title: 'L1 Details',\n items: items,\n });\n\n if (txFee) {\n details.push({\n title: 'Network Fee',\n items: [currencyItem('Fee Amount', txFee, AVAX_NONEVM_DENOMINATION, symbol)],\n });\n }\n\n return details;\n};\n","import type { DetailItem, DetailSection, RegisterL1ValidatorTx } from '@avalabs/vm-module-types';\nimport { currencyItem } from '@internal/utils';\nimport { AVAX_NONEVM_DENOMINATION } from '../../constants';\n\nexport const registerL1ValidatorDetailSection = (tx: RegisterL1ValidatorTx, symbol: string) => {\n const details: DetailSection[] = [];\n\n const { txFee, balance } = tx;\n\n const items: DetailItem[] = [currencyItem('Initial balance', balance, AVAX_NONEVM_DENOMINATION, symbol)];\n\n details.push({\n title: 'L1 Details',\n items: items,\n });\n\n if (txFee) {\n details.push({\n title: 'Network Fee',\n items: [currencyItem('Fee Amount', txFee, AVAX_NONEVM_DENOMINATION, symbol)],\n });\n }\n\n return details;\n};\n","import type { DetailSection, SetL1ValidatorWeightTx } from '@avalabs/vm-module-types';\nimport { currencyItem } from '@internal/utils';\nimport { AVAX_NONEVM_DENOMINATION } from '../../constants';\n\nexport const setL1ValidatorWeightDetailSection = (tx: SetL1ValidatorWeightTx, symbol: string) => {\n const details: DetailSection[] = [];\n\n const { txFee } = tx;\n\n if (txFee) {\n details.push({\n title: 'Network Fee',\n items: [currencyItem('Fee Amount', txFee, AVAX_NONEVM_DENOMINATION, symbol)],\n });\n }\n\n return details;\n};\n","import type { AddAutoRenewedValidatorTx, DetailItem, DetailSection, Network } from '@avalabs/vm-module-types';\nimport { addressItem, currencyItem, nodeIDItem, textItem } from '@internal/utils';\nimport { AVAX_NONEVM_DENOMINATION } from '../../constants';\nimport { networkItem } from '@internal/utils/src/utils/detail-item';\n\ntype AddAutoRenewedValidatorDetailSectionProps = {\n tx: AddAutoRenewedValidatorTx;\n symbol: string;\n network: Network;\n signerAccount: string;\n};\n\n// Auto-renewal cycle (`period`) is provided in seconds.\nconst SECONDS_IN_DAY = 60 * 60 * 24;\n\n// `delegationFee` and `autoCompoundRewardShares` are stored in millionths\n// (percentage × 10,000), per ACP-236 — i.e. 1,000,000 = 100%, 300,000 = 30%.\n// Dividing by 10,000 converts the raw value directly to a percentage.\nconst PPM_TO_PERCENT_DIVISOR = 10_000;\n\nexport const addAutoRenewedValidatorDetailSection = ({\n tx,\n symbol,\n network,\n signerAccount,\n}: AddAutoRenewedValidatorDetailSectionProps) => {\n const details: DetailSection[] = [];\n const { txFee, nodeID, stake, delegationFee, autoCompoundRewardShares, period } = tx;\n\n const basicInfo: DetailSection = {\n items: [\n addressItem('Account', signerAccount),\n networkItem('Network', {\n name: network.chainName,\n logoUri: network.logoUri,\n }),\n ],\n };\n\n details.push(basicInfo);\n\n const items: DetailItem[] = [\n nodeIDItem('Node', nodeID),\n currencyItem('Stake Amount', stake, AVAX_NONEVM_DENOMINATION, symbol),\n textItem('Delegation fee', `${delegationFee / PPM_TO_PERCENT_DIVISOR} %`),\n textItem('Cycle duration', `${Number(period) / SECONDS_IN_DAY} days`),\n textItem('Compound rewards percentage', `${autoCompoundRewardShares / PPM_TO_PERCENT_DIVISOR} %`),\n ];\n\n details.push({\n title: 'Staking Details',\n items,\n });\n\n if (txFee) {\n details.push({\n title: 'Network Fee',\n items: [currencyItem('Fee Amount', txFee, AVAX_NONEVM_DENOMINATION, symbol)],\n });\n }\n\n return details;\n};\n","import type { DetailItem, DetailSection, SetAutoRenewedValidatorConfigTx } from '@avalabs/vm-module-types';\nimport { currencyItem, nodeIDItem, textItem } from '@internal/utils';\nimport { AVAX_NONEVM_DENOMINATION } from '../../constants';\n\nconst SECONDS_IN_DAY = 60 * 60 * 24;\n// `autoCompoundRewardShares` is stored in millionths (percentage × 10,000) per\n// ACP-236 — i.e. 1,000,000 = 100%. Dividing by 10,000 yields the percentage.\nconst PPM_TO_PERCENT_DIVISOR = 10_000;\n\nexport const setAutoRenewedValidatorConfigDetailSection = (tx: SetAutoRenewedValidatorConfigTx, symbol: string) => {\n const details: DetailSection[] = [];\n\n const { txFee, txId, autoCompoundRewardShares, period } = tx;\n\n const items: DetailItem[] = [\n nodeIDItem('Validator Tx ID', txId),\n textItem('Cycle duration', `${Number(period) / SECONDS_IN_DAY} days`),\n textItem('Compound rewards percentage', `${autoCompoundRewardShares / PPM_TO_PERCENT_DIVISOR} %`),\n ];\n\n details.push({\n title: 'Staking Details',\n items: items,\n });\n\n if (txFee) {\n details.push({\n title: 'Network Fee',\n items: [currencyItem('Fee Amount', txFee, AVAX_NONEVM_DENOMINATION, symbol)],\n });\n }\n\n return details;\n};\n","import {\n PrimaryNetworkChainName,\n type ListCChainAtomicTransactionsResponse,\n type ListPChainTransactionsResponse,\n type ListXChainTransactionsResponse,\n} from '@avalabs/glacier-sdk';\nimport Big from 'big.js';\n\nexport const isPChainTransactions = (\n value: ListPChainTransactionsResponse | ListXChainTransactionsResponse | ListCChainAtomicTransactionsResponse,\n): value is ListPChainTransactionsResponse => {\n return value.chainInfo.chainName === PrimaryNetworkChainName.P_CHAIN;\n};\n\nexport const isXChainTransactions = (\n value: ListPChainTransactionsResponse | ListXChainTransactionsResponse | ListCChainAtomicTransactionsResponse,\n): value is ListXChainTransactionsResponse => {\n return value.chainInfo.chainName === PrimaryNetworkChainName.X_CHAIN;\n};\n\nexport function getExplorerAddressByNetwork(\n explorerUrl: string,\n hash: string,\n hashType: 'address' | 'tx' = 'tx',\n): string {\n return `${explorerUrl}/${hashType}/${hash}`;\n}\n\nexport function getTokenValue({ amount, decimals }: { decimals: number; amount?: number }): Big {\n return amount === undefined ? new Big(0) : new Big(amount / 10 ** decimals);\n}\n","import { z } from 'zod';\n\nimport type { RpcRequest } from '@avalabs/vm-module-types';\n\nexport type CurrentAvalancheAccount = {\n xpAddress: string;\n evmAddress?: string;\n xpubXP?: string;\n externalXPAddresses: {\n index: number;\n address: string;\n }[];\n};\n\nconst LegacyAvalancheTxContextSchema = z.object({\n currentAddress: z.string({ required_error: 'No active account found' }),\n currentEvmAddress: z.string().optional(),\n xpubXP: z.string({ invalid_type_error: 'xpubXP must be a string' }).optional(),\n});\n\nconst NewAvalancheTxContextSchema = z.object({\n account: z.object({\n xpAddress: z.string({\n required_error: 'XP address is required',\n invalid_type_error: 'XP address must be a string',\n }),\n evmAddress: z.string().optional(),\n xpubXP: z.string({ invalid_type_error: 'xpubXP must be a string' }).optional(),\n externalXPAddresses: z.array(\n z.object({\n index: z.number(),\n address: z.string(),\n }),\n ),\n }),\n});\n\ntype NewAvalancheTxContextType = z.infer<typeof NewAvalancheTxContextSchema>;\ntype LegacyAvalancheTxContextType = z.infer<typeof LegacyAvalancheTxContextSchema>;\n\nconst getAccountFromLegacyContext = (context: LegacyAvalancheTxContextType): CurrentAvalancheAccount => {\n return {\n xpAddress: context.currentAddress,\n evmAddress: context.currentEvmAddress,\n xpubXP: context.xpubXP,\n externalXPAddresses: [],\n };\n};\n\nconst getAccountFromNewContext = (context: NewAvalancheTxContextType): CurrentAvalancheAccount => {\n return context.account;\n};\n\ntype GetAccountFromContextResult =\n | {\n success: true;\n data: CurrentAvalancheAccount;\n }\n | {\n success: false;\n error: string;\n };\n\ntype RpcContextWithAccount = RpcRequest['context'] & {\n account: Record<string, unknown>;\n};\n\nconst hasAccountField = (context: RpcRequest['context']): context is RpcContextWithAccount => {\n return (\n context != null &&\n typeof context === 'object' &&\n 'account' in context &&\n context.account != null &&\n typeof context.account === 'object'\n );\n};\n\nexport const getAccountFromContext = (context: RpcRequest['context']): GetAccountFromContextResult => {\n if (!context) {\n return {\n success: false,\n error: 'Missing Avalanche transaction context',\n };\n }\n\n // If `account` field is present, we treat & validate the context as a new Avalanche transaction context.\n if (hasAccountField(context)) {\n const { success, data, error } = NewAvalancheTxContextSchema.safeParse(context);\n\n if (!success) {\n return {\n success: false,\n error: error.errors[0]?.message || 'Invalid or missing Avalanche transaction context',\n };\n }\n\n return {\n success: true,\n data: getAccountFromNewContext(data),\n };\n }\n\n const { success, data, error } = LegacyAvalancheTxContextSchema.safeParse(context);\n\n if (!success) {\n return {\n success: false,\n error: error.errors[0]?.message || 'Invalid or missing Avalanche transaction context',\n };\n }\n\n return {\n success: true,\n data: getAccountFromLegacyContext(data),\n };\n};\n","import {\n type SigningData,\n type Network,\n type ApprovalController,\n type DisplayData,\n type RpcRequest,\n RpcMethod,\n} from '@avalabs/vm-module-types';\nimport { parseRequestParams } from './schemas/parse-request-params/parse-request-params';\nimport { rpcErrors } from '@metamask/rpc-errors';\nimport { rpcErrorOpts } from '@internal/utils';\n\nexport const avalancheSignMessage = async ({\n request,\n network,\n approvalController,\n}: {\n request: RpcRequest;\n network: Network;\n approvalController: ApprovalController;\n}) => {\n const result = parseRequestParams(request.params);\n\n if (!result.success) {\n console.error('invalid params', result.error);\n\n return {\n error: rpcErrors.invalidParams(rpcErrorOpts('Params are invalid', result.error)),\n };\n }\n const [message, accountIndex] = result.data;\n const msgHex = Buffer.from(message, 'utf-8').toString('hex');\n const signingData: SigningData = {\n type: RpcMethod.AVALANCHE_SIGN_MESSAGE,\n data: msgHex,\n accountIndex,\n };\n\n const displayData: DisplayData = {\n title: 'Sign Message',\n dAppInfo: {\n name: request.dappInfo.name,\n action: `${request.dappInfo.name} is requesting to sign the following message`,\n logoUri: request.dappInfo.icon,\n },\n network: {\n chainId: network.chainId,\n name: network.chainName,\n logoUri: network.logoUri,\n },\n details: [\n {\n title: 'Message',\n items: [message],\n },\n ],\n };\n\n // prompt user for approval\n const response = await approvalController.requestApproval({ request, displayData, signingData });\n\n if ('error' in response) {\n return {\n error: response.error,\n };\n }\n\n if (!('signedData' in response)) {\n return {\n error: rpcErrors.internal('No signed data returned'),\n };\n }\n\n return { result: response.signedData };\n};\n","import { z } from 'zod';\n\nconst paramsSchema = z.union([\n z.tuple([z.string()]).describe('message to sign'),\n z.tuple([z.string().describe('message to sign'), z.number().nonnegative().describe('account index')]),\n]);\n\nexport const parseRequestParams = (\n params: unknown,\n): z.SafeParseReturnType<[string, number], [string, number] | [string]> => {\n return paramsSchema.safeParse(params);\n};\n","import {\n type SigningData,\n type Network,\n type ApprovalController,\n type DisplayData,\n type RpcRequest,\n RpcMethod,\n type AppInfo,\n} from '@avalabs/vm-module-types';\nimport { utils } from '@avalabs/avalanchejs';\nimport { rpcErrors } from '@metamask/rpc-errors';\nimport { Avalanche } from '@avalabs/core-wallets-sdk';\nimport { Network as GlacierNetwork } from '@avalabs/glacier-sdk';\n\nimport { getCoreHeaders } from '@internal/utils';\n\nimport { getProvider } from '../../utils/get-provider';\nimport { parseTxDetails } from '../../utils/parse-tx-details';\nimport { getProvidedUtxos } from '../../utils/get-provided-utxos';\nimport { getTransactionDetailSections } from '../../utils/get-transaction-detail-sections';\n\nimport { parseRequestParams } from './schemas/parse-request-params/parse-request-params';\nimport { getUnsignedOrPartiallySignedTx } from './util/get-unsigned-or-partially-signed-tx';\nimport { getAccountFromContext } from '../../utils/get-account-from-context';\n\nexport const avalancheSignTransaction = async ({\n request,\n network,\n approvalController,\n glacierApiUrl,\n appInfo,\n getAuthHeaders,\n}: {\n request: RpcRequest;\n network: Network;\n approvalController: ApprovalController;\n glacierApiUrl: string;\n appInfo: AppInfo;\n getAuthHeaders?: () => Promise<Record<string, string>>;\n}) => {\n const result = parseRequestParams(request.params);\n\n if (!result.success) {\n console.error('invalid params', result.error);\n\n return {\n error: rpcErrors.invalidParams('Params are invalid'),\n };\n }\n const { transactionHex, chainAlias, from, utxos: providedUtxoHexes } = result.data;\n\n const vm = Avalanche.getVmByChainAlias(chainAlias);\n const isTestnet = network.isTestnet ?? false;\n const provider = await getProvider(network);\n\n const contextParserResult = getAccountFromContext(request.context);\n\n if (!contextParserResult.success) {\n return {\n error: rpcErrors.invalidParams(contextParserResult.error),\n };\n }\n\n const { xpAddress: currentAddress, evmAddress: currentEvmAddress } = contextParserResult.data;\n\n const providedUtxos = getProvidedUtxos({\n utxoHexes: providedUtxoHexes,\n vm,\n });\n\n const utxos = providedUtxos.length\n ? providedUtxos\n : await Avalanche.getUtxosByTxFromGlacier({\n transactionHex,\n chainAlias,\n network: isTestnet ? GlacierNetwork.FUJI : GlacierNetwork.MAINNET,\n url: glacierApiUrl,\n headers: { ...getCoreHeaders(appInfo), ...(await getAuthHeaders?.()) },\n });\n\n const unsignedOrPartiallySignedTx = await getUnsignedOrPartiallySignedTx({\n txBytes: utils.hexToBuffer(transactionHex),\n vm,\n utxos,\n currentAddress,\n currentEvmAddress,\n provider,\n });\n\n // check if the current account's signature is needed\n const signerAddress = utils.addressesFromBytes([utils.parse(from ?? currentAddress)[2]])[0];\n\n if (!signerAddress) {\n return {\n error: rpcErrors.invalidRequest('Missing signer address'),\n };\n }\n\n const ownSignatureIndices = unsignedOrPartiallySignedTx.getSigIndicesForAddress(signerAddress);\n\n if (!ownSignatureIndices) {\n return {\n error: rpcErrors.invalidRequest('This account has nothing to sign'),\n };\n }\n\n const sigIndices = unsignedOrPartiallySignedTx.getSigIndices();\n const needsToSign = ownSignatureIndices.some(([inputIndex, sigIndex]) => sigIndices[inputIndex]?.includes(sigIndex));\n\n if (!needsToSign) {\n return {\n error: rpcErrors.invalidRequest('This account has nothing to sign'),\n };\n }\n const signerAccount = from ?? currentAddress;\n\n // get display data for the UI\n const txData = await Avalanche.parseAvalancheTx(unsignedOrPartiallySignedTx, provider, from ?? currentAddress);\n const txDetails = parseTxDetails(txData);\n\n if (txData.type === 'unknown' || txDetails === undefined) {\n return {\n error: rpcErrors.invalidParams('Unable to parse transaction data. Unsupported tx type'),\n };\n }\n\n const signingData: SigningData = {\n type: RpcMethod.AVALANCHE_SIGN_TRANSACTION,\n data: txData,\n vm,\n unsignedTxJson: JSON.stringify(unsignedOrPartiallySignedTx.toJSON()),\n ownSignatureIndices,\n };\n\n const details = getTransactionDetailSections(txDetails, network.networkToken.symbol, {\n network,\n signerAccount,\n });\n\n // Throw an error if we can't parse the transaction details\n if (details === undefined) {\n return {\n error: rpcErrors.internal('Unable to parse transaction display data. Unsupported tx type'),\n };\n }\n\n const displayData: DisplayData = {\n title: 'Do you approve this transaction?',\n dAppInfo: {\n name: request.dappInfo.name,\n action: `${request.dappInfo.name} requests you to sign the following transaction`,\n logoUri: request.dappInfo.icon,\n },\n network: {\n chainId: network.chainId,\n name: network.chainName,\n logoUri: network.logoUri,\n },\n details,\n };\n\n // prompt user for approval\n const response = await approvalController.requestApproval({ request, displayData, signingData });\n\n if ('error' in response) {\n return {\n error: response.error,\n };\n }\n\n if (!('signedData' in response)) {\n return {\n error: rpcErrors.invalidRequest('No signed data returned'),\n };\n }\n return { result: response.signedData };\n};\n","import { z } from 'zod';\n\nconst paramsSchema = z.object({\n from: z.string().optional().describe('Avalanche receiving address'),\n transactionHex: z.string(),\n chainAlias: z.enum(['X', 'P', 'C']),\n utxos: z.string().array().optional(),\n});\n\nexport const parseRequestParams = (params: unknown) => {\n return paramsSchema.safeParse(params);\n};\n","import {\n avaxSerial,\n evmSerial,\n utils,\n type EVMUnsignedTx,\n type UnsignedTx,\n type Utxo,\n type VM,\n Credential,\n} from '@avalabs/avalanchejs';\nimport { Avalanche } from '@avalabs/core-wallets-sdk';\nimport { rpcErrors } from '@metamask/rpc-errors';\n\nexport const getUnsignedOrPartiallySignedTx = async ({\n vm,\n txBytes,\n utxos,\n currentAddress,\n currentEvmAddress,\n provider,\n}: {\n txBytes: Uint8Array<ArrayBufferLike>;\n vm: VM;\n utxos: Utxo[];\n currentAddress: string;\n currentEvmAddress?: string;\n provider: Avalanche.JsonRpcProvider;\n}) => {\n let credentials: Credential[] | undefined = undefined;\n let parsedTxInstance: UnsignedTx | EVMUnsignedTx;\n const tx = utils.unpackWithManager(vm, txBytes) as avaxSerial.AvaxTx;\n\n if (evmSerial.isExportTx(tx)) {\n const spenderAddress = tx.ins[0]?.address.toHex();\n\n if (!currentEvmAddress) {\n throw rpcErrors.invalidRequest('Missing EVM address');\n }\n\n if (spenderAddress?.toLowerCase() !== currentEvmAddress.toLowerCase()) {\n throw new Error('This account has nothing to sign');\n }\n\n return Avalanche.createAvalancheEvmUnsignedTx({\n txBytes,\n vm,\n utxos,\n fromAddress: currentAddress,\n });\n }\n\n try {\n const codecManager = utils.getManagerForVM(vm);\n const signedTx = codecManager.unpack(txBytes, avaxSerial.SignedTx);\n\n if (evmSerial.isImportTx(tx)) {\n parsedTxInstance = await Avalanche.createAvalancheEvmUnsignedTx({\n txBytes,\n vm,\n utxos,\n fromAddress: currentAddress,\n });\n } else {\n parsedTxInstance = await Avalanche.createAvalancheUnsignedTx({\n tx,\n provider,\n credentials: signedTx.getCredentials(),\n utxos,\n });\n }\n\n // transaction has been already (partially) signed, but it may have gaps in its signatures arrays\n // so we fill these gaps with placeholder signatures if needed\n credentials = tx.getSigIndices().map(\n (sigIndices, credentialIndex) =>\n new Credential(\n Avalanche.populateCredential(sigIndices, {\n unsignedTx: parsedTxInstance,\n credentialIndex,\n }),\n ),\n );\n } catch (_err) {\n // transaction hasn't been signed yet thus we continue with a custom list of empty credentials\n // to ensure it contains a signature slot for all signature indices from the inputs\n credentials = tx.getSigIndices().map((indicies) => new Credential(Avalanche.populateCredential(indicies)));\n }\n\n return Avalanche.createAvalancheUnsignedTx({\n tx,\n provider,\n credentials,\n utxos,\n });\n};\n","import {\n NetworkVMType,\n type BuildDerivationPathParams,\n type BuildDerivationPathResponse,\n} from '@avalabs/vm-module-types';\nimport { rpcErrors } from '@metamask/rpc-errors';\n\nexport const buildDerivationPath = ({\n accountIndex,\n derivationPathType,\n addressIndex = 0,\n}: BuildDerivationPathParams): Pick<BuildDerivationPathResponse, NetworkVMType.AVM | NetworkVMType.CoreEth> => {\n if (accountIndex < 0) {\n throw rpcErrors.invalidParams('Account index must be a non-negative integer');\n }\n\n if (addressIndex !== undefined && addressIndex < 0) {\n throw rpcErrors.invalidParams('Address index must be a non-negative integer');\n }\n\n switch (derivationPathType) {\n case 'bip44':\n return {\n [NetworkVMType.AVM]: `m/44'/9000'/${accountIndex}'/0/${addressIndex}`,\n [NetworkVMType.CoreEth]: `m/44'/60'/0'/0/${accountIndex}`, // Must match the derivation path used by the EMV Module\n };\n\n case 'ledger_live':\n return {\n [NetworkVMType.AVM]: `m/44'/9000'/${accountIndex}'/0/${addressIndex}`,\n [NetworkVMType.CoreEth]: `m/44'/60'/${accountIndex}'/0/0`, // Must match the derivation path used by the EMV Module\n };\n\n default:\n throw rpcErrors.invalidParams(`Unsupported derivation path type: ${derivationPathType}`);\n }\n};\n","import type { ApprovalController, DeriveAddressParams, DeriveAddressResponse } from '@avalabs/vm-module-types';\nimport { NetworkVMType } from '@avalabs/vm-module-types';\n\nimport { hasDerivationDetails } from '@internal/utils/src/utils/address-derivation';\n\nimport { getProvider } from '../../utils/get-provider';\nimport { buildDerivationPath } from '../build-derivation-path/build-derivation-path';\n\nexport const deriveAddress = async (\n params: DeriveAddressParams & { approvalController: ApprovalController },\n): Promise<DeriveAddressResponse> => {\n const { approvalController, network, secretId } = params;\n\n // When dealing with single-account private keys, we don't need the derivation path any more.\n const xpDerivationPath = hasDerivationDetails(params) ? buildDerivationPath(params).AVM : undefined;\n const coreEthDerivationPath = hasDerivationDetails(params) ? buildDerivationPath(params).CoreEth : undefined;\n const provXP = await getProvider(network);\n\n const xpPublicKeyHex = await approvalController\n .requestPublicKey({\n curve: 'secp256k1',\n secretId,\n derivationPath: xpDerivationPath,\n })\n .catch(() => null);\n const coreEthPublicKeyHex = await approvalController\n .requestPublicKey({\n curve: 'secp256k1',\n secretId,\n derivationPath: coreEthDerivationPath,\n })\n .catch(() => null);\n\n // Resolve CoreEth address even if X/P public keys are not available\n const coreEthAddress = coreEthPublicKeyHex\n ? {\n [NetworkVMType.CoreEth]: provXP.getAddress(Buffer.from(coreEthPublicKeyHex, 'hex'), 'C'),\n }\n : {};\n\n const xpAddresses = xpPublicKeyHex\n ? {\n [NetworkVMType.AVM]: provXP.getAddress(Buffer.from(xpPublicKeyHex, 'hex'), 'X'),\n [NetworkVMType.PVM]: provXP.getAddress(Buffer.from(xpPublicKeyHex, 'hex'), 'P'),\n }\n : {};\n\n return {\n ...coreEthAddress,\n ...xpAddresses,\n };\n};\n","import type { DeriveAddressParams, DetailedDeriveAddressParams } from '@avalabs/vm-module-types';\n\nexport const hasDerivationDetails = (params: DeriveAddressParams): params is DetailedDeriveAddressParams =>\n 'derivationPathType' in params &&\n 'accountIndex' in params &&\n typeof params.accountIndex === 'number' &&\n typeof params.derivationPathType === 'string';\n","import type { ApprovalController, DeriveAddressesParams, DeriveAddressesResponse } from '@avalabs/vm-module-types';\nimport { NetworkVMType } from '@avalabs/vm-module-types';\nimport { deriveAddressesForAvalanche, init } from '@avalabs/crypto-sdk';\n\nimport { buildDerivationPath } from '../build-derivation-path/build-derivation-path';\n\nexport const deriveAddresses = async (\n params: DeriveAddressesParams & { approvalController: ApprovalController },\n): Promise<DeriveAddressesResponse> => {\n const { approvalController, network, secretId, accountIndices, derivationPathType, addressIndex } = params;\n\n if (accountIndices.length === 0) {\n return [];\n }\n\n await init();\n\n // crypto-sdk's deriveAddressesForAvalanche needs the X/P pubkey AND the EVM\n // pubkey (the latter drives the CoreEth bech32 — same path as the EVM module).\n // The avalanche buildDerivationPath's CoreEth entry already returns that EVM path.\n const pubkeyPairs = await Promise.all(\n accountIndices.map(async (accountIndex) => {\n const paths = buildDerivationPath({ accountIndex, derivationPathType, addressIndex });\n const [xpHex, evmHex] = await Promise.all([\n approvalController.requestPublicKey({\n curve: 'secp256k1',\n secretId,\n derivationPath: paths.AVM,\n }),\n approvalController.requestPublicKey({\n curve: 'secp256k1',\n secretId,\n derivationPath: paths.CoreEth,\n }),\n ]);\n return {\n xp: Uint8Array.from(Buffer.from(xpHex, 'hex')),\n evm: Uint8Array.from(Buffer.from(evmHex, 'hex')),\n };\n }),\n );\n\n const bundles = await deriveAddressesForAvalanche(\n pubkeyPairs.map((p) => p.xp),\n pubkeyPairs.map((p) => p.evm),\n Boolean(network.isTestnet),\n );\n\n return bundles.map((b) => ({\n [NetworkVMType.AVM]: b.x,\n [NetworkVMType.PVM]: b.p,\n [NetworkVMType.CoreEth]: b.coreEth,\n }));\n};\n","import type { GetAddressParams, GetAddressResponse } from '@avalabs/vm-module-types';\nimport { Avalanche } from '@avalabs/core-wallets-sdk';\nimport { NetworkVMType, WalletType } from '@avalabs/vm-module-types';\nimport { rpcErrors } from '@metamask/rpc-errors';\nimport { getProvider } from '../../utils/get-provider';\n\ntype GetAddress = Omit<GetAddressParams, 'xpub'>;\n\nexport const getAddress = async ({\n accountIndex,\n xpubXP,\n walletType,\n network,\n}: GetAddress): Promise<GetAddressResponse> => {\n if (!network) {\n throw rpcErrors.invalidParams('network is required to get address');\n }\n\n if (xpubXP === undefined) {\n throw rpcErrors.invalidParams('xpubXP is required to get address');\n }\n\n const provXP = await getProvider(network);\n let xpPub: Buffer;\n\n switch (walletType) {\n case WalletType.Mnemonic:\n case WalletType.Ledger:\n case WalletType.Keystone: {\n // X and P addresses different derivation path m/44'/9000'/0'...\n xpPub = Avalanche.getAddressPublicKeyFromXpub(xpubXP, accountIndex);\n break;\n }\n case WalletType.LedgerLive:\n case WalletType.Seedless: {\n xpPub = Buffer.from(xpubXP, 'hex');\n break;\n }\n default:\n throw rpcErrors.invalidParams(`Unsupported wallet type: ${walletType}`);\n }\n\n return {\n [NetworkVMType.AVM]: provXP.getAddress(xpPub, 'X'),\n [NetworkVMType.PVM]: provXP.getAddress(xpPub, 'P'),\n };\n};\n","import {\n NetworkVMType,\n type GetBalancesParams,\n type TokenWithBalanceAVM,\n type TokenWithBalancePVM,\n} from '@avalabs/vm-module-types';\nimport { type AvalancheGlacierService } from '../../services/glacier-service/glacier-service';\nimport {\n BlockchainId,\n Network,\n type ListPChainBalancesResponse,\n type ListXChainBalancesResponse,\n} from '@avalabs/glacier-sdk';\nimport type { TokenService } from '@internal/utils';\nimport { VsCurrencyType } from '@avalabs/core-coingecko-sdk';\nimport { isPchainBalance, isXchainBalance } from './utils';\nimport { convertPChainBalance } from './convert-p-chain-balance';\nimport { convertXChainBalance } from './covnert-x-chain-balance';\nimport { getProvider } from '../../utils/get-provider';\n\ntype GetAvalancheBalancesResponse = Record<string, Record<string, TokenWithBalanceAVM | TokenWithBalancePVM>>;\n\nexport const getBalances = async ({\n addresses,\n currency,\n network,\n glacierService,\n tokenService,\n}: GetBalancesParams & {\n glacierService: AvalancheGlacierService;\n tokenService: TokenService;\n}): Promise<GetAvalancheBalancesResponse> => {\n const provider = await getProvider(network);\n const isHealthy = glacierService.isHealthy();\n if (!isHealthy) {\n return Promise.reject('Glacier is unhealthy. Try again later.');\n }\n\n const lowercaseCurrency = currency.toLowerCase();\n const address = addresses[0] ?? '';\n const networkToken = network.networkToken;\n const coingeckoId = network.pricingProviders?.coingecko.nativeTokenId;\n\n const blockchainId = network.vmName === NetworkVMType.PVM ? BlockchainId.P_CHAIN : BlockchainId.X_CHAIN;\n const glacierNetwork = network.isDevnet ? null : network.isTestnet ? Network.FUJI : Network.MAINNET;\n\n if (!glacierNetwork) {\n return Promise.reject('Glacier does not supported local devnets');\n }\n\n const chainBalances = await glacierService\n .getChainBalance({\n blockchainId,\n network: glacierNetwork,\n addresses: addresses.join(','),\n })\n .then((value) => (value as ListPChainBalancesResponse | ListXChainBalancesResponse).balances);\n\n const priceData = await tokenService.getWatchlistDataForToken({\n tokenDetails: {\n symbol: network.networkToken.symbol,\n isNative: true,\n caip2Id: network.caipId ?? '',\n },\n currency: lowercaseCurrency as VsCurrencyType,\n });\n\n let balance: TokenWithBalanceAVM | TokenWithBalancePVM;\n if (isPchainBalance(chainBalances)) {\n balance = convertPChainBalance({\n balance: chainBalances,\n networkToken,\n priceInCurrency: priceData.priceInCurrency ?? undefined,\n marketCap: priceData.marketCap ?? undefined,\n vol24: priceData.vol24 ?? undefined,\n change24: priceData.change24 ?? undefined,\n coingeckoId: coingeckoId ?? '',\n avaxAssetId: provider.getContext().avaxAssetID,\n });\n\n return {\n [address]: {\n [networkToken.symbol]: balance,\n },\n };\n }\n\n if (isXchainBalance(chainBalances)) {\n balance = convertXChainBalance({\n balance: chainBalances,\n networkToken,\n priceInCurrency: priceData.priceInCurrency ?? undefined,\n marketCap: priceData.marketCap ?? undefined,\n vol24: priceData.vol24 ?? undefined,\n change24: priceData.change24 ?? undefined,\n coingeckoId: coingeckoId ?? '',\n avaxAssetId: provider.getContext().avaxAssetID,\n });\n return {\n [address]: {\n [networkToken.symbol]: balance,\n },\n };\n }\n return Promise.reject('Incorrect type balance was returned from glacier');\n};\n","import {\n BlockchainId,\n Glacier,\n type ListCChainAtomicBalancesResponse,\n type ListCChainAtomicTransactionsResponse,\n type ListPChainBalancesResponse,\n type ListPChainTransactionsResponse,\n type ListXChainBalancesResponse,\n type ListXChainTransactionsResponse,\n Network,\n PrimaryNetworkTxType,\n SortOrder,\n} from '@avalabs/glacier-sdk';\nimport { GlacierFetchHttpRequest } from '@internal/utils';\n\nclass GlacierUnhealthyError extends Error {\n override message = 'Glacier is unhealthy. Try again later.';\n}\n\nexport class AvalancheGlacierService {\n glacierSdk: Glacier;\n isGlacierHealthy = true;\n\n constructor({\n glacierApiUrl,\n headers,\n getAuthHeaders,\n }: {\n glacierApiUrl: string;\n headers?: Record<string, string>;\n /**\n * Resolves per-request auth headers (e.g. a Firebase AppCheck token) required\n * by the Glacier proxy. Merged over the static `headers`.\n */\n getAuthHeaders?: () => Promise<Record<string, string> | undefined>;\n }) {\n this.glacierSdk = new Glacier(\n {\n BASE: glacierApiUrl,\n HEADERS: getAuthHeaders ? async () => ({ ...headers, ...(await getAuthHeaders()) }) : headers,\n },\n GlacierFetchHttpRequest,\n );\n }\n\n isHealthy = (): boolean => this.isGlacierHealthy;\n\n setGlacierToUnhealthy(): void {\n this.isGlacierHealthy = false;\n setTimeout(\n () => {\n this.isGlacierHealthy = true;\n },\n 5 * 60 * 1000,\n ); // 5 minutes\n }\n\n async listLatestPrimaryNetworkTransactions(params: {\n blockchainId: BlockchainId;\n network: Network;\n addresses?: string;\n txTypes?: Array<PrimaryNetworkTxType>;\n startTimestamp?: number;\n endTimestamp?: number;\n pageToken?: string;\n pageSize?: number;\n sortOrder?: SortOrder;\n }): Promise<ListPChainTransactionsResponse | ListXChainTransactionsResponse | ListCChainAtomicTransactionsResponse> {\n try {\n return this.glacierSdk.primaryNetworkTransactions.listLatestPrimaryNetworkTransactions(params);\n } catch (error) {\n if (error instanceof GlacierUnhealthyError) {\n this.setGlacierToUnhealthy();\n }\n throw error;\n }\n }\n\n async getChainBalance(params: {\n blockchainId: BlockchainId;\n network: Network;\n blockTimestamp?: number;\n addresses?: string;\n }): Promise<ListPChainBalancesResponse | ListXChainBalancesResponse | ListCChainAtomicBalancesResponse> {\n try {\n return this.glacierSdk.primaryNetworkBalances.getBalancesByAddresses(params);\n } catch (error) {\n if (error instanceof GlacierUnhealthyError) {\n this.setGlacierToUnhealthy();\n }\n throw error;\n }\n }\n}\n","import type {\n AggregatedAssetAmount,\n PChainBalance,\n PChainSharedAsset,\n XChainBalances,\n XChainSharedAssetBalance,\n} from '@avalabs/glacier-sdk';\n\nexport const isPchainBalance = (balanceResult: PChainBalance | XChainBalances): balanceResult is PChainBalance => {\n return Object.keys(balanceResult).includes('unlockedUnstaked');\n};\n\nexport const isXchainBalance = (balanceResult: PChainBalance | XChainBalances): balanceResult is XChainBalances => {\n return Object.keys(balanceResult).includes('locked');\n};\n\ntype BalanceAsset = AggregatedAssetAmount | PChainSharedAsset | XChainSharedAssetBalance;\n\nconst sumAvaxFromAssets = (assets: BalanceAsset[] | undefined, avaxAssetId: string): bigint => {\n if (!assets?.length) {\n return 0n;\n }\n\n return assets.reduce((total, asset) => {\n if (asset.assetId !== avaxAssetId) {\n return total;\n }\n\n return total + BigInt(asset.amount);\n }, 0n);\n};\n\nexport function calculateAvaxTotalBalance(balances: PChainBalance | XChainBalances, avaxAssetId: string): bigint {\n if (isPchainBalance(balances)) {\n const balanceArrays = [\n ...(balances.unlockedUnstaked || []),\n ...(balances.unlockedStaked || []),\n ...(balances.pendingStaked || []),\n ...(balances.lockedStaked || []),\n ...(balances.lockedStakeable || []),\n ...(balances.lockedPlatform || []),\n ...(balances.atomicMemoryLocked || []),\n ...(balances.atomicMemoryUnlocked || []),\n ];\n\n const arrayTotal = sumAvaxFromAssets(balanceArrays, avaxAssetId);\n\n const restakedRewards = balances.restakedRewards ? BigInt(balances.restakedRewards) : 0n;\n\n return arrayTotal + restakedRewards;\n }\n\n const balanceArrays = [\n ...(balances.unlocked || []),\n ...(balances.locked || []),\n ...(balances.atomicMemoryUnlocked || []),\n ...(balances.atomicMemoryLocked || []),\n ];\n\n return sumAvaxFromAssets(balanceArrays, avaxAssetId);\n}\n","import type { AggregatedAssetAmount, PChainBalance } from '@avalabs/glacier-sdk';\nimport { TokenUnit } from '@avalabs/core-utils-sdk';\nimport { calculateAvaxTotalBalance } from './utils';\nimport { type NetworkToken, TokenType, type TokenWithBalancePVM } from '@avalabs/vm-module-types';\n\nexport const convertPChainBalance = ({\n balance,\n networkToken,\n priceInCurrency,\n marketCap,\n vol24,\n change24,\n coingeckoId,\n avaxAssetId,\n}: {\n balance: PChainBalance;\n networkToken: NetworkToken;\n priceInCurrency?: number;\n marketCap?: number;\n vol24?: number;\n change24?: number;\n coingeckoId: string;\n avaxAssetId: string;\n}): TokenWithBalancePVM => {\n const balancePerType: Record<string, bigint> = {};\n\n const balanceTypes: Record<string, AggregatedAssetAmount[]> = {\n unlockedUnstaked: balance.unlockedUnstaked,\n unlockedStaked: balance.unlockedStaked,\n pendingStaked: balance.pendingStaked,\n lockedStaked: balance.lockedStaked,\n lockedStakeable: balance.lockedStakeable,\n lockedPlatform: balance.lockedPlatform,\n atomicMemoryLocked: balance.atomicMemoryLocked,\n atomicMemoryUnlocked: balance.atomicMemoryUnlocked,\n };\n\n for (const balanceType in balanceTypes) {\n const balancesToAdd = balanceTypes[balanceType];\n if (!balancesToAdd || !balancesToAdd.length) {\n balancePerType[balanceType] = 0n;\n continue;\n }\n\n balancesToAdd.forEach((utxo: AggregatedAssetAmount) => {\n if (utxo.assetId !== avaxAssetId) {\n return;\n }\n const previousBalance = balancePerType[balanceType] ?? 0n;\n const newBalance = previousBalance + BigInt(utxo.amount);\n balancePerType[balanceType] = newBalance;\n });\n }\n\n const available = new TokenUnit(\n balancePerType['unlockedUnstaked'] ? balancePerType['unlockedUnstaked'] : 0n,\n networkToken.decimals,\n networkToken.symbol,\n );\n const availableInCurrency = priceInCurrency\n ? available.mul(priceInCurrency).toDisplay({ fixedDp: 2, asNumber: true })\n : undefined;\n const totalBalance = new TokenUnit(\n calculateAvaxTotalBalance(balance, avaxAssetId),\n networkToken.decimals,\n networkToken.symbol,\n );\n const balanceInCurrency = priceInCurrency\n ? totalBalance.mul(priceInCurrency).toDisplay({ fixedDp: 2, asNumber: true })\n : undefined;\n\n return {\n ...networkToken,\n type: TokenType.NATIVE,\n priceInCurrency,\n balance: totalBalance.toSubUnit(),\n balanceInCurrency,\n balanceDisplayValue: totalBalance.toDisplay(),\n balanceCurrencyDisplayValue: balanceInCurrency?.toFixed(2),\n available: available.toSubUnit(),\n availableInCurrency,\n availableDisplayValue: available.toDisplay(),\n availableCurrencyDisplayValue: availableInCurrency?.toFixed(2),\n utxos: balance,\n balancePerType: {\n lockedStaked: balancePerType['lockedStaked'],\n lockedStakeable: balancePerType['lockedStakeable'],\n lockedPlatform: balancePerType['lockedPlatform'],\n atomicMemoryLocked: balancePerType['atomicMemoryLocked'],\n atomicMemoryUnlocked: balancePerType['atomicMemoryUnlocked'],\n unlockedUnstaked: balancePerType['unlockedUnstaked'],\n unlockedStaked: balancePerType['unlockedStaked'],\n pendingStaked: balancePerType['pendingStaked'],\n },\n marketCap,\n vol24,\n change24,\n coingeckoId,\n };\n};\n","import type { AggregatedAssetAmount, XChainBalances } from '@avalabs/glacier-sdk';\nimport { TokenUnit } from '@avalabs/core-utils-sdk';\nimport { calculateAvaxTotalBalance } from './utils';\nimport { TokenType, type NetworkToken, type TokenWithBalanceAVM } from '@avalabs/vm-module-types';\n\nexport const convertXChainBalance = ({\n balance,\n networkToken,\n priceInCurrency,\n marketCap,\n vol24,\n change24,\n coingeckoId,\n avaxAssetId,\n}: {\n balance: XChainBalances;\n networkToken: NetworkToken;\n priceInCurrency?: number;\n marketCap?: number;\n vol24?: number;\n change24?: number;\n coingeckoId: string;\n avaxAssetId: string;\n}): TokenWithBalanceAVM => {\n const balancePerType: Record<string, bigint> = {};\n\n const balanceTypes: Record<string, AggregatedAssetAmount[]> = {\n unlocked: balance.unlocked,\n locked: balance.locked,\n atomicMemoryUnlocked: balance.atomicMemoryUnlocked,\n atomicMemoryLocked: balance.atomicMemoryLocked,\n };\n\n for (const balanceType in balanceTypes) {\n const balancesToAdd = balanceTypes[balanceType];\n if (!balancesToAdd || !balancesToAdd.length) {\n balancePerType[balanceType] = 0n;\n continue;\n }\n\n balancesToAdd.forEach((utxo: AggregatedAssetAmount) => {\n // Skip non-AVAX assets\n if (utxo.assetId !== avaxAssetId) {\n return;\n }\n const previousBalance = balancePerType[balanceType] ?? 0n;\n const newBalance = previousBalance + BigInt(utxo.amount);\n balancePerType[balanceType] = newBalance;\n });\n }\n\n const available = new TokenUnit(\n balancePerType['unlocked'] ? balancePerType['unlocked'] : 0n,\n networkToken.decimals,\n networkToken.symbol,\n );\n const availableInCurrency = priceInCurrency\n ? available.mul(priceInCurrency).toDisplay({ fixedDp: 2, asNumber: true })\n : undefined;\n const totalBalance = new TokenUnit(\n calculateAvaxTotalBalance(balance, avaxAssetId),\n networkToken.decimals,\n networkToken.symbol,\n );\n const balanceInCurrency = priceInCurrency !== undefined ? totalBalance.mul(priceInCurrency) : undefined;\n\n return {\n ...networkToken,\n coingeckoId,\n type: TokenType.NATIVE,\n priceInCurrency,\n balance: totalBalance.toSubUnit(),\n balanceInCurrency: balanceInCurrency?.toDisplay({ fixedDp: 2, asNumber: true }),\n balanceDisplayValue: totalBalance.toDisplay(),\n balanceCurrencyDisplayValue: balanceInCurrency?.toDisplay({ fixedDp: 2 }),\n available: available.toSubUnit(),\n availableInCurrency,\n availableDisplayValue: available.toDisplay(),\n availableCurrencyDisplayValue: availableInCurrency?.toFixed(2),\n utxos: balance,\n balancePerType: {\n unlocked: balancePerType['unlocked'],\n locked: balancePerType['locked'],\n atomicMemoryUnlocked: balancePerType['atomicMemoryUnlocked'],\n atomicMemoryLocked: balancePerType['atomicMemoryLocked'],\n },\n marketCap,\n vol24,\n change24,\n };\n};\n","import { NetworkVMType, type Network, type NetworkFees } from '@avalabs/vm-module-types';\nimport { getProvider } from '../../utils/get-provider';\n\n/**\n * Returns {@link NetworkFees} based on a fixed fee.\n */\nexport async function getNetworkFee(network: Network): Promise<NetworkFees> {\n const { vmName } = network;\n const provider = await getProvider(network);\n\n // Return static fees for X-Chain\n if (vmName === NetworkVMType.AVM) {\n // this is 0.001 Avax denominated in nAvax, taken from https://docs.avax.network/reference/standards/guides/txn-fees#fee-schedule\n return {\n baseFee: BigInt(1000000),\n low: {\n maxFeePerGas: BigInt(1000000),\n },\n medium: {\n maxFeePerGas: BigInt(1000000),\n },\n high: {\n maxFeePerGas: BigInt(1000000),\n },\n isFixedFee: true,\n };\n }\n\n const { price } = await provider.getApiP().getFeeState();\n\n // This represents how much (percentage-wise) you need to bump the base fee\n // to get to the next integer (since we operate with BigInts here)\n const minimumPercentageBump = 100 / Number(price) / 100;\n\n // Added percentages for faster presets\n const fastPCentage = Math.min(1, Math.max(minimumPercentageBump, 0.15));\n const instPCentage = Math.min(1, Math.max(minimumPercentageBump * 2, 0.3));\n\n const fastMultiplier = 1 + fastPCentage; // Adds between 15 and 100%\n const instantMultiplier = 1 + instPCentage; // Adds between 30 and 100%\n\n // Even though the hard-coded percentages would end up being integers after\n // multiplying by 100x, we still need to round due to floating point precision errors.\n return {\n baseFee: price,\n low: {\n maxFeePerGas: price,\n },\n medium: {\n maxFeePerGas: (price * BigInt(Math.round(100 * fastMultiplier))) / 100n,\n },\n high: {\n maxFeePerGas: (price * BigInt(Math.round(100 * instantMultiplier))) / 100n,\n },\n isFixedFee: false,\n };\n}\n","import type { GetTransactionHistory, Transaction, TransactionHistoryResponse } from '@avalabs/vm-module-types';\nimport { BlockchainId, Network, SortOrder } from '@avalabs/glacier-sdk';\nimport { isPChainTransactions, isXChainTransactions } from './utils';\nimport { convertPChainTransaction } from './convert-p-chain-transaction';\nimport { convertXChainTransaction } from './convert-x-chain-transaction';\nimport type { AvalancheGlacierService } from '../../services/glacier-service/glacier-service';\n\nexport const getTransactionHistory = async ({\n address,\n nextPageToken,\n offset,\n network,\n glacierService,\n}: GetTransactionHistory & { glacierService: AvalancheGlacierService }): Promise<TransactionHistoryResponse> => {\n const { isTestnet, networkToken, explorerUrl, chainId } = network;\n const isHealthy = glacierService.isHealthy();\n if (!isHealthy) {\n return {\n transactions: [],\n nextPageToken: '',\n };\n }\n\n const glacierNetwork = network.isTestnet ? Network.FUJI : Network.MAINNET;\n const response = await glacierService.listLatestPrimaryNetworkTransactions({\n addresses: address,\n blockchainId: getBlockchainIdByAddress(address),\n network: glacierNetwork,\n pageSize: offset,\n pageToken: nextPageToken,\n sortOrder: SortOrder.DESC,\n });\n\n let transactions: Transaction[] = [];\n if (isPChainTransactions(response)) {\n transactions = response.transactions.map((value) =>\n convertPChainTransaction({ tx: value, isTestnet, address, networkToken, explorerUrl, chainId }),\n );\n }\n if (isXChainTransactions(response)) {\n transactions = response.transactions.map((value) =>\n convertXChainTransaction({ tx: value, isTestnet, address, networkToken, explorerUrl, chainId }),\n );\n }\n\n return {\n transactions,\n nextPageToken: response.nextPageToken,\n };\n};\n\nconst getBlockchainIdByAddress = (address: string) => {\n // A comma separated list of X-Chain or P-Chain wallet addresses,\n // starting with \"avax\"/\"fuji\", \"P-avax\"/\"P-fuji\" or \"X-avax\"/\"X-fuji\"\n const firstAddress = address.split(',')[0];\n if (firstAddress?.toLowerCase().startsWith('p-')) {\n return BlockchainId.P_CHAIN;\n }\n return BlockchainId.X_CHAIN;\n};\n","import { type PChainTransaction, type NetworkToken } from '@avalabs/glacier-sdk';\nimport Big from 'big.js';\nimport { Avalanche } from '@avalabs/core-wallets-sdk';\nimport { TokenType, type Transaction } from '@avalabs/vm-module-types';\nimport { getExplorerAddressByNetwork, getTokenValue } from './utils';\n\nexport function convertPChainTransaction({\n tx,\n address,\n networkToken,\n chainId,\n explorerUrl,\n isTestnet,\n}: {\n tx: PChainTransaction;\n address: string;\n networkToken: NetworkToken;\n chainId: number;\n explorerUrl?: string;\n isTestnet?: boolean;\n}): Transaction {\n const froms = new Set(tx.consumedUtxos.flatMap((utxo) => utxo.addresses) || []);\n const tos = new Set(tx.emittedUtxos.flatMap((utxo) => utxo.addresses) || []);\n\n const amount = getAmount({\n tx,\n isTestnet,\n networkToken,\n froms,\n });\n\n const avaxBurnedAmount = getBurnedAmount({ tx, isTestnet, networkToken });\n const chainAddress = address.toLowerCase().startsWith('p-') ? address.slice(2) : address;\n const isSender = froms.has(chainAddress);\n\n return {\n hash: tx.txHash,\n isContractCall: false,\n isIncoming: !isSender,\n isOutgoing: isSender,\n from: [...froms.values()].join(','),\n to: [...tos.values()].join(','),\n isSender,\n timestamp: tx.blockTimestamp * 1000, // to millis\n tokens: [\n {\n decimal: networkToken.decimals.toString(),\n name: networkToken.name,\n symbol: networkToken.symbol,\n type: TokenType.NATIVE,\n amount: amount.toString(),\n },\n ],\n gasUsed: avaxBurnedAmount.toString(),\n explorerLink: getExplorerAddressByNetwork(explorerUrl ?? '', tx.txHash, 'tx'),\n txType: tx.txType,\n chainId: chainId.toString(),\n };\n}\n\nfunction getAmount({\n tx,\n isTestnet,\n networkToken,\n froms,\n}: {\n tx: PChainTransaction;\n isTestnet?: boolean;\n networkToken: NetworkToken;\n froms: Set<string>;\n}): Big {\n const isImportExport = ['ImportTx', 'ExportTx'].includes(tx.txType);\n const isBaseTx = tx.txType === 'BaseTx';\n\n const nonChangeEmittedUtxosAmt = tx.emittedUtxos\n .filter(\n (utxo) => utxo.asset.assetId === getAvaxAssetId(!!isTestnet) && !utxo.addresses.some((addr) => froms.has(addr)),\n )\n .reduce((agg, utxo) => agg.add(utxo.asset.amount), new Big(0));\n const txValue = tx.value.find((val) => val.assetId === getAvaxAssetId(!!isTestnet))?.amount;\n // This ternary attempts to cover the case where users send themselves AVAX\n // in which case the senders are the recipients and we should use the total tx value.\n const baseTxValue = nonChangeEmittedUtxosAmt.gt(new Big(0))\n ? nonChangeEmittedUtxosAmt\n : txValue\n ? new Big(txValue)\n : new Big(0) ?? new Big(0);\n\n const pBlockchainId = isTestnet ? Avalanche.FujiContext.pBlockchainID : Avalanche.MainnetContext.pBlockchainID;\n\n const importExportAmount = tx.emittedUtxos\n .filter(\n (utxo) =>\n utxo.asset.assetId === getAvaxAssetId(!!isTestnet) &&\n ((tx.txType === 'ImportTx' && utxo.consumedOnChainId === pBlockchainId) ||\n (tx.txType === 'ExportTx' && utxo.consumedOnChainId !== pBlockchainId)),\n )\n .reduce((agg, utxo) => agg.add(utxo.amount), new Big(0));\n const nAvaxAmount = isBaseTx\n ? baseTxValue\n : isImportExport\n ? importExportAmount\n : tx.amountStaked.length === 0\n ? aggregateValue(tx.value, !!isTestnet)\n : aggregateValue(tx.amountStaked, !!isTestnet);\n return getTokenValue({ amount: nAvaxAmount?.toNumber(), decimals: networkToken.decimals });\n}\n\nfunction getBurnedAmount({\n tx,\n isTestnet,\n networkToken,\n}: {\n tx: PChainTransaction;\n isTestnet?: boolean;\n networkToken: NetworkToken;\n}): Big {\n const nAvaxFee = tx.amountBurned\n ?.filter((value) => value.assetId === getAvaxAssetId(!!isTestnet))\n .reduce((accumulator, value) => accumulator.add(value.amount), new Big(0));\n return getTokenValue({ amount: nAvaxFee?.toNumber(), decimals: networkToken.decimals });\n}\n\nfunction aggregateValue(value: PChainTransaction['value'], isTestnet: boolean): Big | undefined {\n return value\n .filter((value_) => value_.assetId === getAvaxAssetId(isTestnet))\n .reduce((accumulator, value_) => accumulator.add(value_.amount), new Big(0));\n}\n\nfunction getAvaxAssetId(isTestnet: boolean): string {\n return isTestnet ? Avalanche.FujiContext.avaxAssetID : Avalanche.MainnetContext.avaxAssetID;\n}\n","import { type NetworkToken, XChainNonLinearTransaction, XChainLinearTransaction } from '@avalabs/glacier-sdk';\nimport Big from 'big.js';\nimport { Avalanche } from '@avalabs/core-wallets-sdk';\nimport { TokenType, type Transaction } from '@avalabs/vm-module-types';\nimport { getExplorerAddressByNetwork, getTokenValue } from './utils';\n\nexport function convertXChainTransaction({\n tx,\n address,\n networkToken,\n chainId,\n explorerUrl,\n isTestnet,\n}: {\n tx: XChainNonLinearTransaction | XChainLinearTransaction;\n address: string;\n networkToken: NetworkToken;\n chainId: number;\n isTestnet?: boolean;\n explorerUrl?: string;\n}): Transaction {\n const froms = new Set(tx.consumedUtxos.flatMap((utxo) => utxo.addresses) || []);\n const tos = new Set(tx.emittedUtxos.flatMap((utxo) => utxo.addresses) || []);\n const chainAddress = address.toLowerCase().startsWith('x-') ? address.slice(2) : address;\n const isImportExport = ['ImportTx', 'ExportTx'].includes(tx.txType);\n\n const { amount: amountSpent, isSender } = getAmount({\n tx,\n isTestnet,\n networkToken,\n chainAddress,\n isImportExport,\n });\n const avaxBurnedAmount = getBurnedAmount({ isTestnet, tx, networkToken });\n const amountToDisplay = isImportExport\n ? amountSpent.toString()\n : isSender\n ? amountSpent.minus(avaxBurnedAmount).toString()\n : amountSpent.toString();\n\n return {\n hash: tx.txHash,\n isContractCall: false,\n isIncoming: !isSender,\n isOutgoing: isSender,\n from: [...froms.values()].join(','),\n to: [...tos.values()].join(','),\n isSender,\n timestamp: tx.timestamp * 1000, // to millis\n tokens: [\n {\n decimal: networkToken.decimals.toString(),\n name: networkToken.name,\n symbol: networkToken.symbol,\n type: TokenType.NATIVE,\n amount: amountToDisplay,\n },\n ],\n gasUsed: avaxBurnedAmount.toString(),\n explorerLink: getExplorerAddressByNetwork(explorerUrl ?? '', tx.txHash, 'tx'),\n txType: tx.txType,\n chainId: chainId.toString(),\n };\n}\n\nfunction getAmount({\n tx,\n isTestnet,\n networkToken,\n chainAddress,\n isImportExport,\n}: {\n tx: XChainNonLinearTransaction | XChainLinearTransaction;\n isTestnet?: boolean;\n networkToken: NetworkToken;\n chainAddress: string;\n isImportExport: boolean;\n}): { amount: Big; isSender: boolean } {\n if (isImportExport) {\n const xBlockchainId = isTestnet ? Avalanche.FujiContext.xBlockchainID : Avalanche.MainnetContext.xBlockchainID;\n const amount = tx.emittedUtxos\n .filter(\n (utxo) =>\n utxo.asset.assetId === getAvaxAssetId(!!isTestnet) &&\n ((tx.txType === 'ImportTx' && utxo.consumedOnChainId === xBlockchainId) ||\n (tx.txType === 'ExportTx' && utxo.consumedOnChainId !== xBlockchainId)),\n )\n .reduce((agg, utxo) => agg.add(utxo.asset.amount), new Big(0));\n\n return { amount: getTokenValue({ amount: amount.toNumber(), decimals: networkToken.decimals }), isSender: true };\n }\n\n const consumedAmountOfAddress = tx.consumedUtxos\n .filter((utxo) => utxo.asset.assetId === getAvaxAssetId(!!isTestnet) && utxo.addresses.includes(chainAddress))\n .reduce((accumulator, utxo) => accumulator.add(utxo.asset.amount), new Big(0));\n\n const changeAmountOfAddress = tx.emittedUtxos\n .filter((utxo) => utxo.asset.assetId === getAvaxAssetId(!!isTestnet) && utxo.addresses.includes(chainAddress))\n .reduce((accumulator, utxo) => accumulator.add(utxo.asset.amount), new Big(0));\n\n const isSender = consumedAmountOfAddress.gte(changeAmountOfAddress);\n const amount = isSender\n ? consumedAmountOfAddress.minus(changeAmountOfAddress)\n : changeAmountOfAddress.minus(consumedAmountOfAddress);\n\n return {\n amount: getTokenValue({\n amount: amount.toNumber(),\n decimals: networkToken.decimals,\n }),\n isSender,\n };\n}\n\nfunction getBurnedAmount({\n isTestnet,\n tx,\n networkToken,\n}: {\n isTestnet?: boolean;\n tx: XChainNonLinearTransaction | XChainLinearTransaction;\n networkToken: NetworkToken;\n}): Big {\n const totalAmountUnlocked = tx.amountUnlocked\n .filter((asset) => asset.assetId === getAvaxAssetId(!!isTestnet))\n .reduce((accumulator, asset) => accumulator.add(asset.amount), new Big(0));\n const totalAmountCreated = tx.amountCreated\n .filter((asset) => asset.assetId === getAvaxAssetId(!!isTestnet))\n .reduce((accumulator, asset) => accumulator.add(asset.amount), new Big(0));\n const nAvaxFee = totalAmountUnlocked.minus(totalAmountCreated);\n return getTokenValue({ amount: nAvaxFee.toNumber(), decimals: networkToken.decimals });\n}\n\nfunction getAvaxAssetId(isTestnet: boolean): string {\n return isTestnet ? Avalanche.FujiContext.avaxAssetID : Avalanche.MainnetContext.avaxAssetID;\n}\n","import Crypto from 'crypto';\n\n//github.com/gergelylovas/chain-agnostic-namespaces/pull/1/files#diff-cf7185539a48e85d069d194c1c17d7cfa0317b3caa3a89c92e797e3717e49d59R40\nexport function hashBlockchainId({ blockchainId, isTestnet }: { blockchainId: string; isTestnet?: boolean }): string {\n const blockChainIdWithPrefix = isTestnet ? 'fuji' + blockchainId : blockchainId;\n const base64 = Crypto.createHash('sha256').update(blockChainIdWithPrefix).digest('base64');\n const hash = convertBase64ToBase64Url(base64).substring(0, 32);\n return 'avax:' + hash;\n}\n\nconst convertBase64ToBase64Url = (base64: string) => base64.replace(/\\+/g, '-').replace(/\\//g, '_').replace(/=/g, '');\n","import type { TokenWithBalance, TokenWithBalanceAVM, TokenWithBalancePVM } from '@avalabs/vm-module-types';\n\nexport const isTokenWithBalancePVM = (token: TokenWithBalance): token is TokenWithBalancePVM => {\n return 'balancePerType' in token && 'unlockedUnstaked' in token.balancePerType;\n};\n\nexport const isTokenWithBalanceAVM = (token: TokenWithBalance): token is TokenWithBalanceAVM => {\n return 'balancePerType' in token && 'unlocked' in token.balancePerType;\n};\n"]}
1
+ {"version":3,"sources":["../src/module.ts","../../../packages-internal/utils/src/services/token-service/token-service.ts","../../../packages-internal/utils/src/utils/charsum.ts","../../../packages-internal/utils/src/utils/array-hash.ts","../../../packages-internal/utils/src/utils/retry.ts","../../../packages-internal/utils/src/utils/coingecko-retry.ts","../../../packages-internal/utils/src/services/token-service/coingecko-proxy-client.ts","../../../packages-internal/utils/src/utils/fetch-and-verify.ts","../../../packages-internal/utils/src/services/token-service/watchlist-proxy-client.ts","../../../packages-internal/utils/src/services/pricing-service/exchange-rates.ts","../../../packages-internal/utils/src/utils/detail-item.ts","../../../packages-internal/utils/src/utils/get-core-headers.ts","../../../packages-internal/utils/src/consts.ts","../../../packages-internal/utils/src/utils/get-glacier-api-key.ts","../../../packages-internal/utils/src/utils/glacier-fetch-http-request.ts","../../../packages-internal/utils/src/utils/rpc-error-opts.ts","../manifest.json","../src/env.ts","../src/handlers/avalanche-send-transaction/avalanche-send-transaction.ts","../src/handlers/avalanche-send-transaction/schema.ts","../src/utils/get-provider.ts","../src/utils/get-provided-utxos.ts","../src/utils/resolve-utxos.ts","../src/utils/get-cross-chain-recipients.ts","../src/utils/parse-tx-details.ts","../src/handlers/avalanche-send-transaction/utils/parse-tx-display-title.ts","../src/handlers/avalanche-send-transaction/utils/get-addresses-by-indices.ts","../src/utils/get-transaction-detail-sections.ts","../src/handlers/avalanche-send-transaction/typeguards.ts","../src/constants.ts","../src/utils/transaction-detail-sections/add-permissionless-delegator-detail-section.ts","../src/utils/transaction-detail-sections/add-permissionless-validator-detail-section.ts","../src/utils/transaction-detail-sections/add-subnet-validator-detail-section.ts","../src/utils/transaction-detail-sections/convert-subnet-to-l1-detail-section.ts","../src/utils/transaction-detail-sections/export-detail-section.ts","../src/utils/transaction-detail-sections/import-detail-section.ts","../src/utils/transaction-detail-sections/remove-subnet-validator-detail-section.ts","../src/utils/transaction-detail-sections/chain-detail-section.ts","../src/utils/transaction-detail-sections/subnet-detail-section.ts","../src/utils/transaction-detail-sections/block-chain-detail-section.ts","../src/utils/transaction-detail-sections/disable-l1-validator-detail-section.ts","../src/utils/transaction-detail-sections/increase-l1-validator-balance-detail-section.ts","../src/utils/transaction-detail-sections/register-l1-validator-detail-section.ts","../src/utils/transaction-detail-sections/set-l1-validator-weight-detail-section.ts","../src/utils/transaction-detail-sections/add-auto-renewed-validator-detail-section.ts","../src/utils/transaction-detail-sections/set-auto-renewed-validator-config-detail-section.ts","../src/handlers/get-transaction-history/utils.ts","../src/utils/get-account-from-context.ts","../src/handlers/avalanche-sign-message/avalanche-sign-message.ts","../src/handlers/avalanche-sign-message/schemas/parse-request-params/parse-request-params.ts","../src/handlers/avalanche-sign-transaction/avalanche-sign-transaction.ts","../src/handlers/avalanche-sign-transaction/schemas/parse-request-params/parse-request-params.ts","../src/handlers/avalanche-sign-transaction/util/get-unsigned-or-partially-signed-tx.ts","../src/handlers/build-derivation-path/build-derivation-path.ts","../src/handlers/derive-address/derive-address.ts","../../../packages-internal/utils/src/utils/address-derivation.ts","../src/handlers/derive-addresses/derive-addresses.ts","../src/handlers/get-address/get-address.ts","../src/handlers/get-balances/get-balances.ts","../src/services/glacier-service/glacier-service.ts","../src/handlers/get-balances/utils.ts","../src/handlers/get-balances/convert-p-chain-balance.ts","../src/handlers/get-balances/covnert-x-chain-balance.ts","../src/handlers/get-network-fee/get-network-fee.ts","../src/handlers/get-transaction-history/get-transaction-history.ts","../src/handlers/get-transaction-history/convert-p-chain-transaction.ts","../src/handlers/get-transaction-history/convert-x-chain-transaction.ts","../src/utils/hash-blockchain-id.ts","../src/handlers/get-balances/typeguards.ts"],"names":["parseManifest","RpcMethod","VsCurrencyType","getBasicCoingeckoHttp","simplePrice","simpleTokenPrice","charsum","s","i","sum","__name","arrayHash","array","cs","retry","operation","isSuccess","maxRetries","backoffPolicy","RetryBackoffPolicy","backoffPeriodMillis","retries","lastError","delay","result","err","errorMessage","_RetryBackoffPolicy","retryIndex","secondsToDelay","_","msToDelay","linearCount","linearStepMs","n","base","incSum","ms","r","coingeckoRetry","response","RawSimplePriceResponseSchema","fetchAndVerify","fetchOptions","schema","fetchFn","responseJson","_CoingeckoProxyClient","proxyApiUrl","params","queryParams","id","rawQueryParams","CoingeckoProxyClient","z","WatchlistTokenResponseSchema","_WatchlistProxyClient","WatchlistProxyClient","_storage","_proxyApiUrl","_fetchFn","_coingeckoBasicClient","_TokenService","storage","fetch","__privateAdd","__publicField","data","currencies","formattedData","tokenData","currency","__privateSet","__privateGet","tokenDetails","token","tokenInfo","coinIds","cacheId","useCoingeckoProxy","tokenAddresses","assetPlatformId","rawData","marketCap","vol24","change24","lastUpdated","shouldThrow","TokenService","number","object","record","string","ExchangeRateSchema","DetailItemType","currencyItem","label","value","maxDecimals","symbol","textItem","alignment","addressItem","addressListItem","nodeIDItem","dataItem","dateItem","networkItem","AppName","getCoreHeaders","name","version","GLACIER_API_KEY","getGlacierApiKey","ApiError","CancelablePromise","FetchHttpRequest","GLOBAL_QUERY_PARAMS","_failedRequests","_getDelay","_request","request_fn","_postponeRequest","postponeRequest_fn","_GlacierFetchHttpRequest","config","options","mergedQuery","modifiedOptions","getRequest","__privateMethod","inner","resolve","reject","onCancel","isHttpTooManyRequests","isHttpInternalServerError","timeout","GlacierFetchHttpRequest","rpcErrorOpts","message","cause","rpcErrors","manifest_default","Environment","prodEnv","devEnv","getEnv","environment","GlacierNetwork","paramsSchema","parseRequestParams","Avalanche","AVM","PVM","utils","getProvider","network","isTestnet","isDevnet","rpcUrl","customRpcHeaders","Utxo","getProvidedUtxos","utxoHexes","vm","codec","utxoHex","utxoBytes","resolveUtxos","getIndexedUtxos","providedUtxos","indexedUtxos","utxoKey","utxo","indexedKeys","networkIDs","NetworkVMType","TxType","CHAIN_ALIASES","hasOwners","output","isEvmOutput","formatOwners","outputs","chainAlias","hrp","recipients","owner","getExportRecipients","tx","destination","candidate","getImportRecipients","chain","getCrossChainRecipients","txDetails","parseTxDetails","parseTxDisplayTitle","getAddressesByIndices","indices","isChange","xpubXP","externalXPAddresses","provider","index","address","acc","account","isAddPermissionlessDelegatorTx","isAddPermissionlessValidatorTx","isExportTx","isImportTx","isBaseTx","isAddSubnetValidatorTx","isCreateChainTx","isCreateSubnetTx","isRemoveSubnetValidatorTx","isConvertSubnetToL1Tx","isDisableL1ValidatorTx","isIncreaseL1ValidatorBalanceTx","isRegisterL1ValidatorTx","isSetL1ValidatorWeightTx","isAddAutoRenewedValidatorTx","isSetAutoRenewedValidatorConfigTx","isStakingDetails","isExportImportTxDetails","isChainDetails","isBlockchainDetails","isSubnetDetails","AvalancheChainStrings","addPermissionlessDelegatorDetailSection","signerAccount","details","txFee","nodeID","subnetID","start","end","stake","basicInfo","items","addPermissionlessValidatorDetailSection","delegationFee","addSubnetValidatorDetailSection","convertSubnetToL1DetailSection","chainID","managerAddress","validators","subnetItems","balance","nodeId","remainingBalanceOwners","deactivationOwners","validatorItem","exportDetailSection","amount","type","recipient","importDetailSection","source","removeSubnetValidatorDetailSection","amountItems","chainDetailSection","memo","balanceChangeItems","ownerAddress","lockedUntilMs","subnetDetailSection","threshold","controlKeys","formatGenesisData","genesisData","genesisParsed","error","blockChainDetailSection","chainName","vmID","disableL1ValidatorDetailSection","validationId","increaseL1ValidatorBalanceDetailSection","registerL1ValidatorDetailSection","setL1ValidatorWeightDetailSection","SECONDS_IN_DAY","PPM_TO_PERCENT_DIVISOR","addAutoRenewedValidatorDetailSection","autoCompoundRewardShares","period","setAutoRenewedValidatorConfigDetailSection","txId","getTransactionDetailSections","context","PrimaryNetworkChainName","Big","isPChainTransactions","isXChainTransactions","getExplorerAddressByNetwork","explorerUrl","hash","hashType","getTokenValue","decimals","LegacyAvalancheTxContextSchema","NewAvalancheTxContextSchema","getAccountFromLegacyContext","getAccountFromNewContext","hasAccountField","getAccountFromContext","success","avalancheSendTransaction","request","approvalController","glacierApiUrl","appInfo","getAuthHeaders","transactionHex","externalIndices","internalIndices","providedUtxoHexes","txBytes","contextResult","currentAddress","utxos","unsignedTx","externalAddresses","internalAddresses","fromAddressBytes","txData","title","signingData","displayData","txHash","getTxHash","waitForTransactionReceipt","txID","onTransactionPending","onTransactionConfirmed","onTransactionReverted","explorerLink","avalancheSignMessage","accountIndex","msgHex","avaxSerial","evmSerial","Credential","getUnsignedOrPartiallySignedTx","currentEvmAddress","credentials","parsedTxInstance","spenderAddress","signedTx","sigIndices","credentialIndex","indicies","avalancheSignTransaction","from","contextParserResult","unsignedOrPartiallySignedTx","signerAddress","ownSignatureIndices","inputIndex","sigIndex","buildDerivationPath","derivationPathType","addressIndex","hasDerivationDetails","deriveAddress","secretId","xpDerivationPath","coreEthDerivationPath","provXP","xpPublicKeyHex","coreEthPublicKeyHex","coreEthAddress","xpAddresses","deriveAddressesForAvalanche","init","deriveAddresses","accountIndices","pubkeyPairs","paths","xpHex","evmHex","p","b","WalletType","getAddress","walletType","xpPub","Glacier","_GlacierUnhealthyError","GlacierUnhealthyError","_AvalancheGlacierService","headers","AvalancheGlacierService","BlockchainId","Network","isPchainBalance","balanceResult","isXchainBalance","sumAvaxFromAssets","assets","avaxAssetId","total","asset","calculateAvaxTotalBalance","balances","balanceArrays","arrayTotal","restakedRewards","TokenUnit","TokenType","convertPChainBalance","networkToken","priceInCurrency","coingeckoId","balancePerType","balanceTypes","balanceType","balancesToAdd","newBalance","available","availableInCurrency","totalBalance","balanceInCurrency","convertXChainBalance","getBalances","addresses","glacierService","tokenService","lowercaseCurrency","blockchainId","glacierNetwork","chainBalances","priceData","getNetworkFee","vmName","price","minimumPercentageBump","fastPCentage","instPCentage","fastMultiplier","instantMultiplier","SortOrder","convertPChainTransaction","chainId","froms","tos","getAmount","avaxBurnedAmount","getBurnedAmount","chainAddress","isSender","isImportExport","nonChangeEmittedUtxosAmt","getAvaxAssetId","addr","agg","txValue","val","baseTxValue","pBlockchainId","importExportAmount","nAvaxAmount","aggregateValue","nAvaxFee","accumulator","value_","convertXChainTransaction","amountSpent","amountToDisplay","xBlockchainId","consumedAmountOfAddress","changeAmountOfAddress","totalAmountUnlocked","totalAmountCreated","getTransactionHistory","nextPageToken","offset","getBlockchainIdByAddress","transactions","Crypto","hashBlockchainId","blockChainIdWithPrefix","base64","convertBase64ToBase64Url","_glacierService","_glacierApiUrl","_approvalController","_appInfo","_runtime","_AvalancheModule","runtime","AvalancheModule","isTokenWithBalancePVM","isTokenWithBalanceAVM"],"mappings":"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","sourcesContent":["import type { Avalanche } from '@avalabs/core-wallets-sdk';\nimport type {\n AppInfo,\n ApprovalController,\n BuildDerivationPathParams,\n ConstructorParams,\n DeriveAddressesParams,\n DeriveAddressesResponse,\n DeriveAddressParams,\n DeriveAddressResponse,\n GetAddressParams,\n GetAddressResponse,\n GetBalancesParams,\n GetBalancesResponse,\n GetTransactionHistory,\n Manifest,\n Module,\n Network,\n NetworkFees,\n RpcRequest,\n RuntimeParams,\n} from '@avalabs/vm-module-types';\nimport { parseManifest, RpcMethod } from '@avalabs/vm-module-types';\nimport { getCoreHeaders, TokenService } from '@internal/utils';\nimport { rpcErrors } from '@metamask/rpc-errors';\nimport ManifestJson from '../manifest.json';\nimport { getEnv } from './env';\nimport { avalancheSendTransaction } from './handlers/avalanche-send-transaction/avalanche-send-transaction';\nimport { avalancheSignMessage } from './handlers/avalanche-sign-message/avalanche-sign-message';\nimport { avalancheSignTransaction } from './handlers/avalanche-sign-transaction/avalanche-sign-transaction';\nimport { buildDerivationPath } from './handlers/build-derivation-path/build-derivation-path';\nimport { deriveAddress } from './handlers/derive-address/derive-address';\nimport { deriveAddresses } from './handlers/derive-addresses/derive-addresses';\nimport { getAddress } from './handlers/get-address/get-address';\nimport { getBalances } from './handlers/get-balances/get-balances';\nimport { getNetworkFee } from './handlers/get-network-fee/get-network-fee';\nimport { getTransactionHistory } from './handlers/get-transaction-history/get-transaction-history';\nimport { AvalancheGlacierService } from './services/glacier-service/glacier-service';\nimport { getProvider } from './utils/get-provider';\nimport { hashBlockchainId } from './utils/hash-blockchain-id';\n\ntype AvalancheConstructorParams = Omit<ConstructorParams, 'runtime'> & {\n /**\n * Required: the module cannot function without it — P/X/C balances,\n * transaction history and the UTXO fetch during avalanche_sign/sendTransaction\n * all go through core-proxy-api, which rejects requests without auth headers\n * (Firebase AppCheck) — so `getAuthHeaders` must be supplied.\n */\n runtime: RuntimeParams & Required<Pick<RuntimeParams, 'getAuthHeaders'>>;\n};\n\nexport class AvalancheModule implements Module {\n #glacierService: AvalancheGlacierService;\n #proxyApiUrl: string;\n #glacierApiUrl: string;\n #approvalController: ApprovalController;\n #appInfo: AppInfo;\n #runtime?: RuntimeParams;\n\n constructor({ approvalController, environment, appInfo, runtime }: AvalancheConstructorParams) {\n const { glacierApiUrl, proxyApiUrl } = getEnv(environment);\n this.#appInfo = appInfo;\n this.#runtime = runtime;\n this.#glacierService = new AvalancheGlacierService({\n glacierApiUrl,\n headers: getCoreHeaders(appInfo),\n // Reads #runtime at call time rather than capturing the resolver.\n getAuthHeaders: async () => this.#runtime?.getAuthHeaders?.(),\n });\n this.#proxyApiUrl = proxyApiUrl;\n this.#glacierApiUrl = glacierApiUrl;\n this.#approvalController = approvalController;\n }\n\n getProvider(network: Network): Promise<Avalanche.JsonRpcProvider> {\n return getProvider(network);\n }\n\n getAddress({ accountIndex, xpubXP, walletType, network }: GetAddressParams): Promise<GetAddressResponse> {\n return getAddress({\n accountIndex,\n xpubXP,\n walletType,\n network,\n });\n }\n\n getBalances({ addresses, network, storage, currency }: GetBalancesParams): Promise<GetBalancesResponse> {\n const tokenService = new TokenService({ storage, proxyApiUrl: this.#proxyApiUrl, fetch: this.#runtime?.fetch });\n return getBalances({ addresses, currency, network, glacierService: this.#glacierService, tokenService });\n }\n\n getManifest(): Manifest | undefined {\n const result = parseManifest(ManifestJson);\n return result.success ? result.data : undefined;\n }\n\n getNetworkFee(network: Network): Promise<NetworkFees> {\n return getNetworkFee(network);\n }\n\n getTransactionHistory({ network, address, nextPageToken, offset }: GetTransactionHistory) {\n return getTransactionHistory({ network, address, nextPageToken, offset, glacierService: this.#glacierService });\n }\n\n getTokens(_: Network) {\n return Promise.resolve([]);\n }\n\n buildDerivationPath(params: BuildDerivationPathParams) {\n return buildDerivationPath(params);\n }\n\n async deriveAddress(params: DeriveAddressParams): Promise<DeriveAddressResponse> {\n return deriveAddress({\n ...params,\n approvalController: this.#approvalController,\n });\n }\n\n async deriveAddresses(params: DeriveAddressesParams): Promise<DeriveAddressesResponse> {\n return deriveAddresses({\n ...params,\n approvalController: this.#approvalController,\n });\n }\n\n async onRpcRequest(request: RpcRequest, network: Network) {\n switch (request.method) {\n case RpcMethod.AVALANCHE_SIGN_MESSAGE:\n return avalancheSignMessage({ request, network, approvalController: this.#approvalController });\n case RpcMethod.AVALANCHE_SIGN_TRANSACTION:\n return avalancheSignTransaction({\n request,\n network,\n approvalController: this.#approvalController,\n glacierApiUrl: this.#glacierApiUrl,\n appInfo: this.#appInfo,\n getAuthHeaders: this.#runtime?.getAuthHeaders,\n });\n case RpcMethod.AVALANCHE_SEND_TRANSACTION:\n return avalancheSendTransaction({\n request,\n network,\n approvalController: this.#approvalController,\n glacierApiUrl: this.#glacierApiUrl,\n appInfo: this.#appInfo,\n getAuthHeaders: this.#runtime?.getAuthHeaders,\n });\n default:\n return { error: rpcErrors.methodNotSupported(`Method ${request.method} not supported`) };\n }\n }\n\n static getHashedBlockchainId({ blockchainId, isTestnet }: { blockchainId: string; isTestnet?: boolean }): string {\n return hashBlockchainId({ blockchainId, isTestnet });\n }\n}\n","import {\n VsCurrencyType,\n getBasicCoingeckoHttp,\n simplePrice,\n simpleTokenPrice,\n type SimplePriceParams,\n} from '@avalabs/core-coingecko-sdk';\nimport type { RawSimplePriceResponse, SimplePriceResponse, Storage } from '@avalabs/vm-module-types';\nimport { arrayHash } from '../../utils/array-hash';\nimport { coingeckoRetry } from '../../utils/coingecko-retry';\nimport { CoingeckoProxyClient } from './coingecko-proxy-client';\nimport { WatchlistProxyClient } from './watchlist-proxy-client';\n\ntype FetchFn = typeof globalThis.fetch;\n\ntype ConstructorParams = {\n storage?: Storage;\n proxyApiUrl: string;\n fetch?: FetchFn;\n};\n\nexport class TokenService {\n #storage?: Storage;\n #proxyApiUrl: string;\n #fetchFn: FetchFn;\n #coingeckoBasicClient: ReturnType<typeof getBasicCoingeckoHttp>;\n\n constructor({ storage, proxyApiUrl, fetch }: ConstructorParams) {\n this.#storage = storage;\n this.#proxyApiUrl = proxyApiUrl;\n this.#fetchFn = fetch ?? globalThis.fetch;\n this.#coingeckoBasicClient = getBasicCoingeckoHttp(undefined, this.#fetchFn);\n }\n\n async getWatchlistDataForToken({\n tokenDetails,\n currency = VsCurrencyType.USD,\n }: {\n tokenDetails: {\n symbol: string;\n isNative: boolean;\n caip2Id: string;\n address?: string;\n };\n currency: VsCurrencyType;\n }): Promise<{\n priceInCurrency: number;\n change24: number;\n marketCap: number;\n vol24: number;\n }> {\n const data = (\n await new WatchlistProxyClient(this.#proxyApiUrl).watchlistToken({\n tokens: tokenDetails.symbol,\n currency: currency,\n })\n ).filter((token) => {\n return tokenDetails.isNative\n ? token.internalId === `NATIVE-${tokenDetails.symbol.toLowerCase()}`\n : token.platforms[tokenDetails.caip2Id] === tokenDetails.address;\n });\n\n const [tokenInfo] = data;\n\n if (!tokenInfo) {\n return {\n priceInCurrency: 0,\n change24: 0,\n marketCap: 0,\n vol24: 0,\n };\n }\n\n return {\n priceInCurrency: tokenInfo.current_price ?? 0,\n change24: tokenInfo.price_change_percentage_24h ?? 0,\n marketCap: tokenInfo.market_cap ?? 0,\n vol24: tokenInfo.total_volume ?? 0,\n };\n }\n\n /**\n * Get token price with market data first on coingecko (free tier) directly,\n * if we get 429 error, retry it on coingecko proxy (paid service)\n * @returns token price with market data\n */\n async getSimplePrice({\n coinIds = [],\n currencies = [VsCurrencyType.USD],\n }: SimplePriceParams): Promise<SimplePriceResponse | undefined> {\n let data: SimplePriceResponse | undefined;\n\n const key = coinIds ? `${arrayHash(coinIds)}-${currencies.toString()}` : `${currencies.toString()}`;\n\n const cacheId = `getSimplePrice-${key}`;\n\n data = this.#storage?.get?.<SimplePriceResponse>(cacheId);\n\n if (data) return data;\n\n try {\n data = await coingeckoRetry((useCoingeckoProxy) =>\n this.simplePrice({\n coinIds,\n currencies,\n marketCap: true,\n vol24: true,\n change24: true,\n useCoingeckoProxy,\n }),\n );\n } catch {\n data = undefined;\n }\n this.#storage?.set?.(cacheId, data);\n return data;\n }\n\n /**\n * Get token price with market data for a list of addresses\n * @param tokenAddresses the token addresses\n * @param assetPlatformId The platform id for all the tokens in the list\n * @param currency the currency to be used\n * @returns a list of token price with market data\n */\n async getPricesByAddresses(\n tokenAddresses: string[],\n assetPlatformId: string,\n currency: VsCurrencyType = VsCurrencyType.USD,\n ): Promise<SimplePriceResponse | undefined> {\n let data: SimplePriceResponse | undefined;\n\n const key = `${arrayHash(tokenAddresses)}-${assetPlatformId}-${currency}`;\n\n const cacheId = `getPricesWithMarketDataByAddresses-${key}`;\n data = this.#storage?.get?.<SimplePriceResponse>(cacheId);\n\n if (data) return data;\n\n try {\n data = await coingeckoRetry((useCoingeckoProxy) =>\n this.fetchPricesByAddresses({\n assetPlatformId,\n tokenAddresses,\n currency,\n useCoingeckoProxy,\n }),\n );\n } catch (err) {\n console.error(err);\n data = undefined;\n }\n this.#storage?.set?.(cacheId, data);\n return data;\n }\n\n private async fetchPricesByAddresses({\n assetPlatformId,\n tokenAddresses,\n currency = VsCurrencyType.USD,\n useCoingeckoProxy = false,\n }: {\n assetPlatformId: string;\n tokenAddresses: string[];\n currency: VsCurrencyType;\n useCoingeckoProxy?: boolean;\n }): Promise<SimplePriceResponse> {\n if (useCoingeckoProxy) {\n const rawData = await new CoingeckoProxyClient(this.#proxyApiUrl, this.#fetchFn).simplePriceByContractAddresses({\n id: assetPlatformId,\n contract_addresses: tokenAddresses,\n vs_currencies: [currency],\n include_market_cap: true,\n include_24hr_vol: true,\n include_24hr_change: true,\n });\n return this.transformSimplePriceResponse(rawData, [currency]);\n }\n\n return simpleTokenPrice(this.#coingeckoBasicClient, {\n assetPlatformId,\n tokenAddresses,\n currencies: [currency],\n marketCap: true,\n vol24: true,\n change24: true,\n });\n }\n\n private async simplePrice({\n coinIds = [],\n currencies = [VsCurrencyType.USD],\n marketCap = false,\n vol24 = false,\n change24 = false,\n lastUpdated = false,\n useCoingeckoProxy = false,\n shouldThrow = true,\n }: SimplePriceParams & { useCoingeckoProxy?: boolean }): Promise<SimplePriceResponse> {\n if (useCoingeckoProxy) {\n const rawData = await new CoingeckoProxyClient(this.#proxyApiUrl, this.#fetchFn).simplePrice({\n ids: coinIds,\n vs_currencies: currencies,\n include_market_cap: marketCap,\n include_24hr_vol: vol24,\n include_24hr_change: change24,\n include_last_updated_at: lastUpdated,\n });\n return this.transformSimplePriceResponse(rawData, currencies);\n }\n return simplePrice(this.#coingeckoBasicClient, {\n coinIds,\n currencies,\n marketCap,\n vol24,\n change24,\n lastUpdated,\n shouldThrow,\n });\n }\n\n private transformSimplePriceResponse = (\n data: RawSimplePriceResponse,\n currencies = [VsCurrencyType.USD],\n ): SimplePriceResponse => {\n const formattedData: SimplePriceResponse = {};\n Object.keys(data).forEach((id) => {\n const tokenData = data[id];\n formattedData[id] = {};\n currencies.forEach((currency: VsCurrencyType) => {\n formattedData[id] = {\n [currency]: {\n price: tokenData?.[currency],\n change24: tokenData?.[`${currency}_24h_change`],\n vol24: tokenData?.[`${currency}_24h_vol`],\n marketCap: tokenData?.[`${currency}_market_cap`],\n },\n };\n });\n });\n return formattedData;\n };\n}\n","export function charsum(s: string): number {\n let i,\n sum = 0;\n for (i = 0; i < s.length; i++) {\n sum += s.charCodeAt(i) * (i + 1);\n }\n return sum;\n}\n","import { charsum } from './charsum';\n\n// from https://stackoverflow.com/a/25105589\nexport function arrayHash(array: string[]): string {\n let i,\n sum = 0;\n for (i = 0; i < array.length; i++) {\n const cs = charsum(array[i] ?? '');\n sum = sum + 65027 / cs;\n }\n return ('' + sum).slice(0, 16);\n}\n","const DEFAULT_MAX_RETRIES = 10;\n\ntype RetryParams<T> = {\n operation: (retryIndex: number) => Promise<T>;\n isSuccess: (result: T) => boolean;\n maxRetries?: number;\n backoffPolicy?: RetryBackoffPolicyInterface;\n};\n/*\n * Retries an operation with defined backoff policy.\n *\n * @param operation - The operation to retry.\n * @param isSuccess - The predicate to check if the operation succeeded.\n * @param maxRetries - The maximum number of retries.\n * @param backoffPolicy - Function to generate delay time based on current retry count.\n *\n * @returns The result of the operation.\n * @throws An error if the operation fails after the maximum number of retries.\n *\n * @example\n * const result = await retry(\n * async () => {\n * const response = await fetch('https://example.com')\n * return response.json()\n * },\n * result => result.status === 200\n * )\n */\nexport const retry = async <T>({\n operation,\n isSuccess,\n maxRetries = DEFAULT_MAX_RETRIES,\n backoffPolicy = RetryBackoffPolicy.exponential(),\n}: RetryParams<T>): Promise<T> => {\n let backoffPeriodMillis = 0;\n let retries = 0;\n let lastError: unknown;\n\n while (retries < maxRetries) {\n if (retries > 0) {\n await delay(backoffPeriodMillis);\n }\n\n try {\n const result = await operation(retries);\n\n if (isSuccess(result)) {\n return result;\n }\n } catch (err) {\n // when the operation throws an error, we still retry\n lastError = err;\n }\n\n backoffPeriodMillis = backoffPolicy(retries);\n retries++;\n }\n\n const errorMessage = lastError ? `Max retry exceeded. ${lastError}` : 'Max retry exceeded.';\n\n throw new Error(errorMessage);\n};\n\ntype RetryBackoffPolicyInterface = (retryIndex: number) => number;\n\nexport class RetryBackoffPolicy {\n static exponential(): RetryBackoffPolicyInterface {\n return (retryIndex: number): number => {\n return Math.pow(2, retryIndex) * 1000;\n };\n }\n\n static constant(secondsToDelay: number): RetryBackoffPolicyInterface {\n return (_: number): number => {\n return secondsToDelay * 1000;\n };\n }\n\n static constantMs(msToDelay: number): RetryBackoffPolicyInterface {\n return (_: number): number => {\n return msToDelay;\n };\n }\n\n /**\n * linearThenExponential backoff:\n * - First `linearCount` retries: linear increase by `linearStepMs`\n * - After that: increment grows exponentially based on `linearStepMs`\n * Example (linearCount=4, linearStepMs=1000):\n * 1s, 2s, 3s, 4s, 6s, 10s, 18s, 34s...\n */\n static linearThenExponential(linearCount: number, linearStepMs: number): RetryBackoffPolicyInterface {\n return (retryIndex: number): number => {\n if (retryIndex < linearCount) {\n // Linear phase: (i+1) * step\n return (retryIndex + 1) * linearStepMs;\n }\n // Exponential-increment phase (closed form):\n // n = number of exponential increments applied\n // base = linearCount * step\n // increment sum = 2*step * (2^n - 1)\n const n = retryIndex - linearCount + 1;\n const base = linearCount * linearStepMs;\n const incSum = 2 * linearStepMs * (Math.pow(2, n) - 1);\n return base + incSum;\n };\n }\n}\n\nfunction delay(ms: number) {\n return new Promise((r) => setTimeout(r, ms));\n}\n","import { RetryBackoffPolicy, retry } from './retry';\n\ntype Error = {\n status: {\n error_code: number;\n error_message: string;\n };\n};\n\nexport const coingeckoRetry = <T>(\n operation: (useCoingeckoProxy: boolean) => Promise<T | Error>,\n): Promise<T | undefined> => {\n return retry({\n operation: (retryIndex: number) => operation(retryIndex > 0),\n maxRetries: 2,\n backoffPolicy: RetryBackoffPolicy.constant(1),\n isSuccess: (response: T | Error) => {\n const errorStatus = (response as Error)?.status;\n return errorStatus?.error_code !== 429;\n },\n }) as Promise<T | undefined>;\n};\n","import { RawSimplePriceResponseSchema } from '@avalabs/vm-module-types';\nimport { fetchAndVerify } from '../../utils/fetch-and-verify';\n\nexport class CoingeckoProxyClient {\n constructor(\n private proxyApiUrl: string,\n private fetchFn?: typeof fetch,\n ) {}\n\n simplePrice(params: {\n ids: string[];\n vs_currencies: string[];\n include_market_cap?: boolean;\n include_24hr_vol?: boolean;\n include_24hr_change?: boolean;\n include_last_updated_at?: boolean;\n }) {\n // casting params as any since typing does not allow boolean and other non-string values\n // even though NodeJS does not have this restriction itself: https://nodejs.org/api/url.html#new-urlsearchparamsobj\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const queryParams = new URLSearchParams(params as any);\n return fetchAndVerify(\n [\n `${this.proxyApiUrl}/proxy/coingecko/simple/price?${queryParams}`,\n {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n },\n ],\n RawSimplePriceResponseSchema,\n this.fetchFn,\n );\n }\n\n simplePriceByContractAddresses(params: {\n id: string;\n contract_addresses: string[];\n vs_currencies?: string[];\n include_market_cap?: boolean;\n include_24hr_vol?: boolean;\n include_24hr_change?: boolean;\n }) {\n const { id, ...rawQueryParams } = params;\n\n // casting params as any since typing does not allow boolean and other non-string values\n // even though NodeJS does not have this restriction itself: https://nodejs.org/api/url.html#new-urlsearchparamsobj\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const queryParams = new URLSearchParams(rawQueryParams as any);\n\n return fetchAndVerify(\n [\n `${this.proxyApiUrl}/proxy/coingecko/simple/token_price/${id}?${queryParams}`,\n {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n },\n ],\n RawSimplePriceResponseSchema,\n this.fetchFn,\n );\n }\n}\n","import type { ZodSchema } from 'zod';\nimport z from 'zod';\n\nexport async function fetchAndVerify<T extends ZodSchema>(\n fetchOptions: Parameters<typeof fetch>,\n schema: T,\n fetchFn: typeof fetch = fetch,\n): Promise<z.infer<T>> {\n const response = await fetchFn(...fetchOptions);\n\n if (!response.ok) {\n throw new Error(`Request failed with status ${response.status}`);\n }\n\n const responseJson = await response.json();\n return schema.parse(responseJson);\n}\n","import { fetchAndVerify } from '../../utils/fetch-and-verify';\nimport { z } from 'zod';\n\nconst WatchlistTokenResponseSchema = z.array(\n z.object({\n // the object has more properties than the ones listed here, but we only need these at the moment\n internalId: z.string(),\n id: z.string(),\n symbol: z.string(),\n name: z.string(),\n image: z.string().optional().nullable(),\n current_price: z.number().optional().nullable(),\n price_change_percentage_24h: z.number().optional().nullable(),\n market_cap: z.number().optional().nullable(),\n total_volume: z.number().optional().nullable(),\n platforms: z.record(z.string(), z.string()),\n }),\n);\n\nexport class WatchlistProxyClient {\n constructor(private proxyApiUrl: string) {}\n\n watchlistToken(params: { tokens: string; currency: string }) {\n // casting params as any since typing does not allow boolean and other non-string values\n // even though NodeJS does not have this restriction itself: https://nodejs.org/api/url.html#new-urlsearchparamsobj\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const queryParams = new URLSearchParams(params as any);\n return fetchAndVerify(\n [\n `${this.proxyApiUrl}/watchlist/tokens?${queryParams}`,\n {\n method: 'GET',\n headers: {\n 'Content-Type': 'application/json',\n },\n },\n ],\n WatchlistTokenResponseSchema,\n );\n }\n}\n","import z, { number, object, record, string } from 'zod';\nimport { fetchAndVerify } from '../../utils/fetch-and-verify';\n\nconst CURRENCY_EXCHANGE_RATES_URL =\n 'https://cdn.jsdelivr.net/npm/@fawazahmed0/currency-api@latest/v1/currencies/usd.min.json';\n\nconst CURRENCY_EXCHANGE_RATES_FALLBACK_URL = 'https://latest.currency-api.pages.dev/v1/currencies/usd.min.json';\n\nconst ExchangeRateSchema = object({\n date: string(),\n usd: record(number()),\n});\n\ntype ExchangeRate = z.infer<typeof ExchangeRateSchema>;\n\nexport const getExchangeRates = async (): Promise<ExchangeRate> => {\n try {\n return await fetchAndVerify([CURRENCY_EXCHANGE_RATES_URL], ExchangeRateSchema);\n } catch {\n return await fetchAndVerify([CURRENCY_EXCHANGE_RATES_FALLBACK_URL], ExchangeRateSchema);\n }\n};\n","import {\n type AddressItem,\n type CurrencyItem,\n type NodeIDItem,\n type TextItem,\n type DataItem,\n type DateItem,\n type LinkItemValue,\n DetailItemType,\n type LinkItem,\n type FundsRecipientItem,\n type AddressListItem,\n type NetworkItemValue,\n type NetworkItem,\n} from '@avalabs/vm-module-types';\n\nexport const fundsRecipientItem = (\n address: string,\n amount: bigint,\n maxDecimals: number,\n symbol: string,\n): FundsRecipientItem => ({\n type: DetailItemType.FUNDS_RECIPIENT,\n label: address,\n amount,\n maxDecimals,\n symbol,\n});\n\nexport const currencyItem = (label: string, value: bigint, maxDecimals: number, symbol: string): CurrencyItem => ({\n label,\n type: DetailItemType.CURRENCY,\n value,\n maxDecimals,\n symbol,\n});\n\nexport const textItem = (\n label: string,\n value: string,\n alignment: 'horizontal' | 'vertical' = 'horizontal',\n): TextItem => ({\n label,\n alignment,\n type: DetailItemType.TEXT,\n value,\n});\n\nexport const linkItem = (label: string, value: LinkItemValue): LinkItem => ({\n label,\n value,\n type: DetailItemType.LINK,\n});\n\nexport const addressItem = (label: string, value: string): AddressItem => ({\n label,\n type: DetailItemType.ADDRESS,\n value,\n});\n\nexport const addressListItem = (label: string, value: string[]): AddressListItem => ({\n label,\n type: DetailItemType.ADDRESS_LIST,\n value,\n});\n\nexport const nodeIDItem = (label: string, value: string): NodeIDItem => ({\n label,\n type: DetailItemType.NODE_ID,\n value,\n});\n\nexport const dataItem = (label: string, value: string): DataItem => ({\n label,\n type: DetailItemType.DATA,\n value,\n});\n\nexport const dateItem = (label: string, value: string): DateItem => ({\n label,\n type: DetailItemType.DATE,\n value,\n});\n\nexport const networkItem = (label: string, value: NetworkItemValue): NetworkItem => ({\n label,\n type: DetailItemType.NETWORK,\n value,\n});\n","import { AppName, type AppInfo } from '@avalabs/vm-module-types';\n\nexport const getCoreHeaders = ({ name, version }: AppInfo): Record<string, string> | undefined => {\n switch (name) {\n case AppName.CORE_MOBILE_IOS:\n case AppName.CORE_MOBILE_ANDROID:\n case AppName.CORE_WEB:\n case AppName.CORE_EXTENSION:\n case AppName.EXPLORER:\n return {\n 'x-application-name': name,\n 'x-application-version': version,\n };\n case AppName.OTHER:\n return undefined;\n }\n};\n","export const GLACIER_API_KEY = process.env.GLACIER_API_KEY;\n","import { GLACIER_API_KEY } from '../consts';\n\n// this key is only needed in development to bypass rate limit\n// it should never be used in production\nexport const getGlacierApiKey = (): string | undefined => {\n return GLACIER_API_KEY;\n};\n","import {\n ApiError,\n type ApiRequestOptions,\n CancelablePromise,\n FetchHttpRequest,\n type OpenAPIConfig,\n} from '@avalabs/glacier-sdk';\nimport { getGlacierApiKey } from './get-glacier-api-key';\nimport { RetryBackoffPolicy } from './retry';\n\nconst GLOBAL_QUERY_PARAMS: Record<string, string | undefined> = {\n rltoken: getGlacierApiKey(),\n};\n\n/**\n * Custom HTTP request handler that automatically appends the Glacier API key (if present)\n * to bypass rate limits in development environments.\n */\nexport class GlacierFetchHttpRequest extends FetchHttpRequest {\n #failedRequests = 0;\n #getDelay = RetryBackoffPolicy.exponential();\n\n constructor(config: OpenAPIConfig) {\n super(config);\n }\n\n public override request<T>(options: ApiRequestOptions): CancelablePromise<T> {\n // Merge global query parameters with request-specific ones\n const mergedQuery = {\n ...GLOBAL_QUERY_PARAMS,\n ...(options.query || {}), // Request-specific params (override globals if same key)\n };\n\n // Create modified options with merged query\n const modifiedOptions: ApiRequestOptions = {\n ...options,\n query: Object.keys(mergedQuery).length > 0 ? mergedQuery : undefined,\n };\n\n const getRequest = () => super.request<T>(modifiedOptions);\n return this.#failedRequests > 0 ? this.#postponeRequest<T>(getRequest) : this.#request<T>(getRequest);\n }\n\n #request<T>(getRequest: () => CancelablePromise<T>): CancelablePromise<T> {\n const inner = getRequest();\n return new CancelablePromise((resolve, reject, onCancel) => {\n onCancel(() => inner.cancel());\n inner\n .then((response) => {\n this.#failedRequests = 0;\n resolve(response);\n })\n .catch((err) => {\n if (err instanceof ApiError) {\n const isHttpTooManyRequests = err.status === 429;\n const isHttpInternalServerError = err.status >= 500 && err.status < 600;\n this.#failedRequests += Number(isHttpTooManyRequests || isHttpInternalServerError);\n }\n reject(err);\n });\n });\n }\n\n #postponeRequest<T>(getRequest: () => CancelablePromise<T>): CancelablePromise<T> {\n const delay = this.#getDelay(this.#failedRequests);\n return new CancelablePromise<T>((resolve, reject, onCancel) => {\n const timeout = setTimeout(() => {\n const inner = getRequest();\n onCancel(() => {\n inner.cancel();\n clearTimeout(timeout);\n });\n inner.then(resolve).catch(reject);\n }, delay);\n });\n }\n}\n","/**\n * Builds the options object for `rpcErrors.internal()` / `rpcErrors.invalidParams()` etc.\n * Ensures the actual error message appears in the top-level `message` field,\n * which is what viem exposes as `error.details` to dapps.\n */\nexport const rpcErrorOpts = (message: string, cause: unknown) => ({\n message: `${message}${cause instanceof Error ? `: ${cause.message}` : ''}`,\n data: { cause },\n});\n","{\n \"name\": \"Avalanche\",\n \"description\": \"\",\n \"version\": \"0.0.1\",\n \"sources\": {\n \"module\": {\n \"checksum\": \"\",\n \"location\": {\n \"npm\": {\n \"filePath\": \"dist/index.js\",\n \"packageName\": \"@avalabs/avalanche-module\",\n \"registry\": \"https://registry.npmjs.org\"\n }\n }\n }\n },\n \"network\": {\n \"chainIds\": [\n \"avax:8aDU0Kqh-5d23op-B-r-4YbQFRbsgF9a\",\n \"avax:YRLfeDBJpfEqUWe2FYR1OpXsnDDZeKWd\",\n \"avax:Rr9hnPVPxuUvrdCul-vjEsU1zmqKqRDo\",\n \"avax:Sj7NVE3jXTbJvwFAiu7OEUo_8g8ctXMG\",\n \"avax:imji8papUf2EhV3le337w1vgFauqkJg-\",\n \"avax:8AJTpRj3SAqv1e80Mtl9em08LhvKEbkl\",\n \"avax:N5PeRoKwDDREF0awn2GPsb9sHnGRzdEX\"\n ],\n \"namespaces\": [\"avax\"]\n },\n \"cointype\": \"9000\",\n \"permissions\": {\n \"rpc\": {\n \"dapps\": true,\n \"methods\": [\"avalanche_sendTransaction\", \"avalanche_signTransaction\", \"avalanche_signMessage\"],\n \"nonRestrictedMethods\": []\n }\n },\n \"manifestVersion\": \"0.1\"\n}\n","import { Environment } from '@avalabs/vm-module-types';\n\ntype Env = {\n glacierApiUrl: string;\n proxyApiUrl: string;\n};\n\nexport const prodEnv: Env = {\n glacierApiUrl: 'https://core-proxy-api.avax.network/v1/proxy/glacier',\n proxyApiUrl: 'https://proxy-api.avax.network',\n};\n\nexport const devEnv: Env = {\n glacierApiUrl: 'https://core-proxy-api.avax-test.network/v1/proxy/glacier',\n proxyApiUrl: 'https://proxy-api-dev.avax.network',\n};\n\nexport const getEnv = (environment: Environment): Env => {\n switch (environment) {\n case Environment.PRODUCTION:\n return prodEnv;\n case Environment.DEV:\n return devEnv;\n }\n};\n","import {\n type SigningData,\n type Network,\n type ApprovalController,\n type DisplayData,\n type RpcRequest,\n RpcMethod,\n type SigningResult,\n type Hex,\n type AppInfo,\n} from '@avalabs/vm-module-types';\nimport { Network as GlacierNetwork } from '@avalabs/glacier-sdk';\nimport { parseRequestParams } from './schema';\nimport { rpcErrors } from '@metamask/rpc-errors';\nimport { Avalanche } from '@avalabs/core-wallets-sdk';\nimport { avaxSerial, AVM, EVMUnsignedTx, PVM, UnsignedTx, utils } from '@avalabs/avalanchejs';\nimport { getProvider } from '../../utils/get-provider';\nimport { resolveUtxos } from '../../utils/resolve-utxos';\nimport { getCrossChainRecipients } from '../../utils/get-cross-chain-recipients';\nimport { parseTxDetails } from '../../utils/parse-tx-details';\nimport { parseTxDisplayTitle } from './utils/parse-tx-display-title';\nimport { getCoreHeaders, retry, rpcErrorOpts } from '@internal/utils';\nimport { getAddressesByIndices } from './utils/get-addresses-by-indices';\nimport { getTransactionDetailSections } from '../../utils/get-transaction-detail-sections';\nimport { getExplorerAddressByNetwork } from '../get-transaction-history/utils';\nimport { getAccountFromContext } from '../../utils/get-account-from-context';\n\nexport const avalancheSendTransaction = async ({\n request,\n network,\n approvalController,\n glacierApiUrl,\n appInfo,\n getAuthHeaders,\n}: {\n request: RpcRequest;\n network: Network;\n approvalController: ApprovalController;\n glacierApiUrl: string;\n appInfo: AppInfo;\n getAuthHeaders?: () => Promise<Record<string, string>>;\n}) => {\n const result = parseRequestParams(request.params);\n\n if (!result.success) {\n return {\n error: rpcErrors.invalidParams(rpcErrorOpts('Transaction params are invalid', result.error)),\n };\n }\n\n try {\n const { transactionHex, chainAlias, externalIndices, internalIndices, utxos: providedUtxoHexes } = result.data;\n const vm = Avalanche.getVmByChainAlias(chainAlias);\n const txBytes = utils.hexToBuffer(transactionHex);\n const isTestnet = network.isTestnet ?? false;\n const provider = await getProvider(network);\n const contextResult = getAccountFromContext(request.context);\n\n if (!contextResult.success) {\n return {\n error: rpcErrors.invalidParams(contextResult.error),\n };\n }\n\n const { xpAddress: currentAddress, xpubXP, externalXPAddresses } = contextResult.data;\n\n const utxos = await resolveUtxos({\n utxoHexes: providedUtxoHexes,\n vm,\n getIndexedUtxos: async () =>\n Avalanche.getUtxosByTxFromGlacier({\n transactionHex,\n chainAlias,\n network: isTestnet ? GlacierNetwork.FUJI : GlacierNetwork.MAINNET,\n url: glacierApiUrl,\n headers: { ...getCoreHeaders(appInfo), ...(await getAuthHeaders?.()) },\n }),\n });\n\n let unsignedTx: UnsignedTx | EVMUnsignedTx;\n if (chainAlias === 'C') {\n unsignedTx = await Avalanche.createAvalancheEvmUnsignedTx({\n txBytes,\n vm,\n utxos,\n fromAddress: currentAddress,\n });\n } else {\n const tx = utils.unpackWithManager(vm, txBytes) as avaxSerial.AvaxTx;\n\n if (xpubXP !== undefined && typeof xpubXP !== 'string') {\n return {\n error: rpcErrors.invalidParams('xpubXP must be a string'),\n };\n }\n\n const externalAddresses = await getAddressesByIndices({\n indices: externalIndices ?? [],\n chainAlias,\n isChange: false,\n network,\n xpubXP,\n externalXPAddresses,\n });\n\n const internalAddresses = await getAddressesByIndices({\n indices: internalIndices ?? [],\n chainAlias,\n isChange: true,\n network,\n xpubXP,\n externalXPAddresses,\n });\n\n const fromAddresses = [...new Set([currentAddress, ...externalAddresses, ...internalAddresses])];\n\n const fromAddressBytes = fromAddresses.map((address) => utils.parse(address)[2]);\n\n unsignedTx = await Avalanche.createAvalancheUnsignedTx({\n tx,\n utxos,\n provider,\n fromAddressBytes,\n });\n }\n\n const txData = await Avalanche.parseAvalancheTx(unsignedTx, provider, currentAddress);\n\n const txDetails = parseTxDetails(txData);\n const title = parseTxDisplayTitle(txData);\n\n // Throw an error if we can't parse the transaction\n if (txData.type === 'unknown' || txDetails === undefined) {\n return {\n error: rpcErrors.internal('Unable to parse transaction data. Unsupported tx type'),\n };\n }\n\n const signingData: SigningData = {\n type: RpcMethod.AVALANCHE_SEND_TRANSACTION,\n unsignedTxJson: JSON.stringify(unsignedTx.toJSON()),\n data: txData,\n vm,\n externalIndices,\n internalIndices,\n };\n\n const details = getTransactionDetailSections(txDetails, network.networkToken.symbol, {\n network,\n signerAccount: currentAddress,\n recipients: getCrossChainRecipients(unsignedTx.getTx(), txDetails, isTestnet),\n });\n\n // Throw an error if we can't parse the transaction details\n if (details === undefined) {\n return {\n error: rpcErrors.internal('Unable to parse transaction display data. Unsupported tx type'),\n };\n }\n\n const displayData: DisplayData = {\n title,\n network: {\n chainId: network.chainId,\n name: network.chainName,\n logoUri: network.logoUri,\n },\n details,\n networkFeeSelector: false,\n };\n\n // prompt user for approval\n const response = await approvalController.requestApproval({ request, displayData, signingData });\n\n if ('error' in response) {\n return {\n error: response.error,\n };\n }\n\n let txHash: Hex;\n\n try {\n txHash = (await getTxHash(provider, response, vm)) as Hex;\n } catch (error) {\n return {\n error: rpcErrors.internal(rpcErrorOpts('Unable to broadcast transaction', error)),\n };\n }\n\n waitForTransactionReceipt({\n explorerUrl: network.explorerUrl ?? '',\n provider,\n txHash,\n vm,\n onTransactionPending: approvalController.onTransactionPending,\n onTransactionConfirmed: approvalController.onTransactionConfirmed,\n onTransactionReverted: approvalController.onTransactionReverted,\n request: request,\n });\n\n return { result: txHash };\n } catch (error) {\n console.error(error);\n return {\n error: rpcErrors.internal(rpcErrorOpts('Unable to create transaction', error)),\n };\n }\n};\n\nconst getTxHash = async (provider: Avalanche.JsonRpcProvider, response: SigningResult, vm: 'EVM' | 'AVM' | 'PVM') => {\n if ('txHash' in response) {\n return response.txHash;\n }\n\n // broadcast the signed transaction\n const { txID } = await provider.issueTxHex(response.signedData, vm);\n return txID;\n};\n\nconst waitForTransactionReceipt = async ({\n explorerUrl,\n provider,\n txHash,\n vm,\n onTransactionPending,\n onTransactionConfirmed,\n onTransactionReverted,\n request,\n}: {\n explorerUrl: string;\n provider: Avalanche.JsonRpcProvider;\n txHash: Hex;\n vm: 'EVM' | 'AVM' | 'PVM';\n onTransactionPending: ({\n txHash,\n request,\n explorerLink,\n }: {\n txHash: Hex;\n request: RpcRequest;\n explorerLink: string;\n }) => void;\n onTransactionConfirmed: ({\n txHash,\n explorerLink,\n request,\n }: {\n txHash: Hex;\n explorerLink: string;\n request: RpcRequest;\n }) => void;\n onTransactionReverted: ({ txHash, request }: { txHash: Hex; request: RpcRequest }) => void;\n request: RpcRequest;\n}) => {\n const maxTransactionStatusCheckRetries = 7;\n\n const explorerLink = getExplorerAddressByNetwork(explorerUrl, txHash);\n\n try {\n onTransactionPending({ txHash, request, explorerLink });\n\n if (vm === PVM) {\n // https://docs.avax.network/api-reference/p-chain/api#platformgettxstatus\n const result = await retry({\n operation: () => provider.getApiP().getTxStatus({ txID: txHash }),\n isSuccess: (result) => ['Committed', 'Dropped'].includes(result.status),\n maxRetries: maxTransactionStatusCheckRetries,\n });\n\n if (result.status === 'Committed') {\n onTransactionConfirmed({ txHash, explorerLink, request });\n } else {\n onTransactionReverted({ txHash, request });\n }\n } else if (vm === AVM) {\n // https://docs.avax.network/api-reference/x-chain/api#avmgettxstatus\n const result = await retry({\n operation: () => provider.getApiX().getTxStatus({ txID: txHash }),\n isSuccess: (result) => ['Accepted', 'Rejected'].includes(result.status),\n maxRetries: maxTransactionStatusCheckRetries,\n });\n\n if (result.status === 'Accepted') {\n onTransactionConfirmed({ txHash, explorerLink, request });\n } else {\n onTransactionReverted({ txHash, request });\n }\n } else {\n // https://docs.avax.network/api-reference/c-chain/api#avaxgetatomictxstatus\n const result = await retry({\n operation: () => provider.getApiC().getAtomicTxStatus(txHash),\n isSuccess: (result) => ['Accepted', 'Dropped'].includes(result.status),\n maxRetries: maxTransactionStatusCheckRetries,\n });\n\n if (result.status === 'Accepted') {\n onTransactionConfirmed({ txHash, explorerLink, request });\n } else {\n onTransactionReverted({ txHash, request });\n }\n }\n } catch (error) {\n console.error(error);\n if (error instanceof Error && error.message.startsWith('Max retry exceeded.')) {\n // in the future, we may want to handle this timeout situation differently\n } else {\n onTransactionReverted({ txHash, request });\n }\n }\n};\n","import { z } from 'zod';\n\nconst paramsSchema = z.object({\n transactionHex: z.string(),\n chainAlias: z.enum(['X', 'P', 'C']),\n externalIndices: z.number().array().optional(),\n internalIndices: z.number().array().optional(),\n utxos: z.string().array().optional(),\n});\n\nexport const parseRequestParams = (params: unknown) => {\n return paramsSchema.safeParse(params);\n};\n\nexport type AvalancheSendTransactionParams = z.infer<typeof paramsSchema>;\n","import { Avalanche } from '@avalabs/core-wallets-sdk';\nimport type { Network } from '@avalabs/vm-module-types';\n\nexport const getProvider = async (network: Network): Promise<Avalanche.JsonRpcProvider> => {\n const { isTestnet, isDevnet, rpcUrl, customRpcHeaders } = network;\n const fetchOptions: RequestInit | undefined = customRpcHeaders ? { headers: customRpcHeaders } : undefined;\n\n if (isDevnet) {\n return Avalanche.JsonRpcProvider.fromBaseURL(rpcUrl);\n }\n\n return isTestnet\n ? Avalanche.JsonRpcProvider.getDefaultFujiProvider(fetchOptions)\n : Avalanche.JsonRpcProvider.getDefaultMainnetProvider(fetchOptions);\n};\n","import { Utxo, type VM, utils } from '@avalabs/avalanchejs';\n\nexport const getProvidedUtxos = ({ utxoHexes = [], vm }: { utxoHexes?: string[]; vm: VM }): Utxo[] => {\n try {\n const codec = utils.getManagerForVM(vm).getDefaultCodec();\n return utxoHexes.map((utxoHex) => {\n const utxoBytes = utils.hexToBuffer(utxoHex);\n return Utxo.fromBytes(utxoBytes, codec)[0];\n });\n } catch (err) {\n console.error('Error getting provided utxos', err);\n return [];\n }\n};\n","import type { Utxo, VM } from '@avalabs/avalanchejs';\n\nimport { getProvidedUtxos } from './get-provided-utxos';\n\n/**\n * Resolves the UTXOs a transaction spends, preferring the indexer's copy over the caller's.\n */\nexport const resolveUtxos = async ({\n utxoHexes,\n vm,\n getIndexedUtxos,\n}: {\n utxoHexes?: string[];\n vm: VM;\n getIndexedUtxos: () => Promise<Utxo[]>;\n}): Promise<Utxo[]> => {\n const providedUtxos = getProvidedUtxos({ utxoHexes, vm });\n\n if (!providedUtxos.length) {\n return getIndexedUtxos();\n }\n\n let indexedUtxos: Utxo[] = [];\n\n try {\n indexedUtxos = await getIndexedUtxos();\n } catch (err) {\n console.error('Unable to fetch UTXOs from the indexer, falling back to the provided ones', err);\n return providedUtxos;\n }\n\n const utxoKey = (utxo: Utxo) => `${utxo.utxoId.txID.toString()}:${utxo.utxoId.outputIdx.value()}`;\n const indexedKeys = new Set(indexedUtxos.map(utxoKey));\n\n return [...indexedUtxos, ...providedUtxos.filter((utxo) => !indexedKeys.has(utxoKey(utxo)))];\n};\n","import { networkIDs, utils } from '@avalabs/avalanchejs';\nimport { NetworkVMType, TxType, type VM } from '@avalabs/vm-module-types';\n\n/**\n * Reads the addresses that receive the funds of an export or import transaction.\n *\n * The parsed transaction details only carry the amount and the two chains, so an export whose\n * exported output belongs to somebody else was displayed exactly like one that pays the user\n * back on the other chain. These are part of the signed bytes, so they are read straight from\n * the transaction rather than from anything the request supplied alongside it.\n *\n * Returns an empty list for a shape we don't recognise: showing no recipient is what the\n * screen did before, whereas showing a wrong one would be worse than showing none.\n */\n\nconst CHAIN_ALIASES: Record<VM, string> = {\n [NetworkVMType.AVM]: 'X',\n [NetworkVMType.PVM]: 'P',\n [NetworkVMType.EVM]: 'C',\n};\n\ntype Amounter = { getOwners?: () => Uint8Array[] };\ntype TransferableOutputLike = { output: Amounter };\ntype EvmOutputLike = { address: { toHex: () => string } };\n\nconst hasOwners = (output: unknown): output is TransferableOutputLike =>\n typeof (output as TransferableOutputLike)?.output?.getOwners === 'function';\n\nconst isEvmOutput = (output: unknown): output is EvmOutputLike =>\n typeof (output as EvmOutputLike)?.address?.toHex === 'function';\n\nconst formatOwners = (outputs: readonly unknown[], chainAlias: string, hrp: string): string[] => {\n const recipients = outputs.flatMap((output) => {\n if (isEvmOutput(output)) {\n // C-Chain outputs are plain EVM addresses rather than bech32 ones.\n return [output.address.toHex()];\n }\n\n if (!hasOwners(output)) {\n return [];\n }\n\n return (output.output.getOwners?.() ?? []).map((owner) => utils.format(chainAlias, hrp, owner));\n });\n\n return [...new Set(recipients)];\n};\n\n// Any avalanchejs transaction. The four export/import shapes differ per chain and the fields\n// we read are checked structurally, so this deliberately does not name a union that would\n// have to track the library's class hierarchy.\ntype CrossChainTx = object;\n\nexport const getExportRecipients = ({\n tx,\n destination,\n isTestnet,\n}: {\n tx: CrossChainTx;\n destination: VM;\n isTestnet: boolean;\n}): string[] => {\n // P/X-Chain exports keep the exported outputs in `outs`, the C-Chain in `exportedOutputs`.\n // Neither includes the change that stays behind on the source chain.\n const candidate = tx as unknown as { outs?: readonly unknown[]; exportedOutputs?: readonly unknown[] };\n const outputs = candidate.exportedOutputs ?? candidate.outs;\n\n if (!Array.isArray(outputs)) {\n return [];\n }\n\n return formatOwners(\n outputs,\n CHAIN_ALIASES[destination],\n networkIDs.getHRP(isTestnet ? networkIDs.FujiID : networkIDs.MainnetID),\n );\n};\n\nexport const getImportRecipients = ({\n tx,\n chain,\n isTestnet,\n}: {\n tx: CrossChainTx;\n chain: VM;\n isTestnet: boolean;\n}): string[] => {\n // Imported funds land in the base transaction's outputs on P/X, and in `Outs` on the\n // C-Chain.\n const candidate = tx as unknown as { Outs?: readonly unknown[]; baseTx?: { outputs?: readonly unknown[] } };\n const outputs = candidate.Outs ?? candidate.baseTx?.outputs;\n\n if (!Array.isArray(outputs)) {\n return [];\n }\n\n return formatOwners(\n outputs,\n CHAIN_ALIASES[chain],\n networkIDs.getHRP(isTestnet ? networkIDs.FujiID : networkIDs.MainnetID),\n );\n};\n\n/**\n * Picks the right recipient lookup for a transaction's type, or undefined when the type does\n * not move funds across chains.\n */\nexport const getCrossChainRecipients = (\n tx: CrossChainTx,\n txDetails: { type: TxType; chain?: VM; destination?: VM },\n isTestnet: boolean,\n): string[] | undefined => {\n if (txDetails.type === TxType.Export && txDetails.destination) {\n return getExportRecipients({ tx, destination: txDetails.destination, isTestnet });\n }\n\n if (txDetails.type === TxType.Import && txDetails.chain) {\n return getImportRecipients({ tx, chain: txDetails.chain, isTestnet });\n }\n\n return undefined;\n};\n","import type { Avalanche } from '@avalabs/core-wallets-sdk';\nimport { type VM, TxType, type TxDetails } from '@avalabs/vm-module-types';\n\nexport const parseTxDetails = (tx: Avalanche.Tx): TxDetails | undefined => {\n switch (tx.type) {\n case TxType.AddPermissionlessDelegator:\n return { ...tx, type: TxType.AddPermissionlessDelegator };\n case TxType.AddPermissionlessValidator:\n return { ...tx, type: TxType.AddPermissionlessValidator };\n case TxType.AddSubnetValidator:\n return { ...tx, type: TxType.AddSubnetValidator };\n case TxType.CreateChain:\n return { ...tx, type: TxType.CreateChain };\n case TxType.CreateSubnet:\n return { ...tx, type: TxType.CreateSubnet };\n case TxType.RemoveSubnetValidator:\n return { ...tx, type: TxType.RemoveSubnetValidator };\n case TxType.AddAutoRenewedValidator:\n return { ...tx, type: TxType.AddAutoRenewedValidator };\n case TxType.SetAutoRenewedValidatorConfig:\n return { ...tx, type: TxType.SetAutoRenewedValidatorConfig };\n case TxType.ConvertSubnetToL1:\n return { ...tx, type: TxType.ConvertSubnetToL1, chain: tx.chain as VM };\n case TxType.SetL1ValidatorWeight:\n return { ...tx, type: TxType.SetL1ValidatorWeight, chain: tx.chain as VM };\n case TxType.DisableL1Validator:\n return { ...tx, type: TxType.DisableL1Validator, chain: tx.chain as VM };\n case TxType.IncreaseL1ValidatorBalance:\n return {\n ...tx,\n type: TxType.IncreaseL1ValidatorBalance,\n chain: tx.chain as VM,\n };\n case TxType.RegisterL1Validator:\n return { ...tx, type: TxType.RegisterL1Validator, chain: tx.chain as VM };\n case TxType.Export:\n return {\n ...tx,\n type: TxType.Export,\n chain: tx.chain as VM,\n destination: tx.destination as VM,\n };\n case TxType.Import:\n return {\n ...tx,\n type: TxType.Import,\n chain: tx.chain as VM,\n source: tx.source as VM,\n };\n case TxType.Base:\n return {\n ...tx,\n type: TxType.Base,\n chain: tx.chain as VM,\n };\n default:\n return undefined;\n }\n};\n","import type { Avalanche } from '@avalabs/core-wallets-sdk';\nimport { TxType } from '@avalabs/vm-module-types';\n\nexport const parseTxDisplayTitle = (tx: Avalanche.Tx): string => {\n switch (tx.type) {\n case TxType.AddPermissionlessDelegator:\n return 'Do you want to add this delegator?';\n case TxType.AddPermissionlessValidator:\n return 'Do you want to add this validator?';\n case TxType.Export:\n return 'Do you approve this export?';\n case TxType.Import:\n return 'Do you approve this import?';\n case TxType.Base:\n return 'Do you approve this transaction?';\n case TxType.AddSubnetValidator:\n return 'Do you want to add this subnet validator?';\n case TxType.CreateChain:\n return 'Do you want to create this chain?';\n case TxType.CreateSubnet:\n return 'Do you want to create this L1?';\n case TxType.RemoveSubnetValidator:\n return 'Do you want to remove this subnet validator?';\n case TxType.ConvertSubnetToL1:\n return 'Do you want to convert this subnet?';\n case TxType.DisableL1Validator:\n return 'Do you want to disable this validator?';\n case TxType.IncreaseL1ValidatorBalance:\n return 'Do you want to increase this validator balance?';\n case TxType.RegisterL1Validator:\n return 'Do you want to register this validator?';\n case TxType.SetL1ValidatorWeight:\n return 'Do you want to set this validator weight?';\n case TxType.AddAutoRenewedValidator:\n return 'Do you want to add this auto-renewed validator?';\n case TxType.SetAutoRenewedValidatorConfig:\n return 'Do you want to update this auto-renewed validator config?';\n default:\n return 'Sign Message';\n }\n};\n","import { Avalanche } from '@avalabs/core-wallets-sdk';\nimport type { Network } from '@avalabs/vm-module-types';\nimport { getProvider } from '../../../utils/get-provider';\n\nexport const getAddressesByIndices = async ({\n indices,\n chainAlias,\n isChange,\n network,\n xpubXP,\n externalXPAddresses,\n}: {\n indices: number[];\n chainAlias: 'X' | 'P';\n isChange: boolean;\n network: Network;\n xpubXP?: string;\n externalXPAddresses?: { index: number; address: string }[];\n}): Promise<string[]> => {\n if (xpubXP) {\n const provider = await getProvider(network);\n\n return indices.map((index) => Avalanche.getAddressFromXpub(xpubXP, index, provider, chainAlias, isChange));\n }\n\n if (externalXPAddresses && Array.isArray(externalXPAddresses)) {\n const accounts = indices\n .map((index) => externalXPAddresses.find((address) => address.index === index))\n .filter((acc) => acc !== undefined);\n\n return accounts.map((account) => account.address);\n }\n\n return [];\n};\n","import { type Network, type TxDetails } from '@avalabs/vm-module-types';\nimport {\n isAddAutoRenewedValidatorTx,\n isAddPermissionlessDelegatorTx,\n isAddPermissionlessValidatorTx,\n isAddSubnetValidatorTx,\n isBlockchainDetails,\n isExportTx,\n isImportTx,\n isRemoveSubnetValidatorTx,\n isSetAutoRenewedValidatorConfigTx,\n isSubnetDetails,\n isConvertSubnetToL1Tx,\n isDisableL1ValidatorTx,\n isIncreaseL1ValidatorBalanceTx,\n isRegisterL1ValidatorTx,\n isSetL1ValidatorWeightTx,\n isChainDetails,\n} from '../handlers/avalanche-send-transaction/typeguards';\nimport {\n addAutoRenewedValidatorDetailSection,\n convertSubnetToL1DetailSection,\n addSubnetValidatorDetailSection,\n removeSubnetValidatorDetailSection,\n addPermissionlessValidatorDetailSection,\n blockChainDetailSection,\n subnetDetailSection,\n chainDetailSection,\n exportDetailSection,\n importDetailSection,\n addPermissionlessDelegatorDetailSection,\n disableL1ValidatorDetailSection,\n increaseL1ValidatorBalanceDetailSection,\n registerL1ValidatorDetailSection,\n setAutoRenewedValidatorConfigDetailSection,\n setL1ValidatorWeightDetailSection,\n} from './transaction-detail-sections';\n\nexport type GetTransactionDetailSectionsContext = {\n network: Network;\n signerAccount: string;\n /** Addresses receiving the funds of a cross-chain transfer - see getExportRecipients. */\n recipients?: string[];\n};\n\nexport const getTransactionDetailSections = (\n txDetails: TxDetails,\n symbol: string,\n context?: GetTransactionDetailSectionsContext,\n) => {\n if (isChainDetails(txDetails)) {\n return chainDetailSection(txDetails, symbol);\n } else if (isExportTx(txDetails)) {\n return exportDetailSection(txDetails, symbol, context?.recipients);\n } else if (isImportTx(txDetails)) {\n return importDetailSection(txDetails, symbol, context?.recipients);\n } else if (isSubnetDetails(txDetails)) {\n return subnetDetailSection(txDetails, symbol);\n } else if (isAddPermissionlessDelegatorTx(txDetails)) {\n if (!context) throw new Error('context (network, signerAccount) is required for AddPermissionlessDelegator');\n return addPermissionlessDelegatorDetailSection({\n tx: txDetails,\n symbol,\n network: context.network,\n signerAccount: context.signerAccount,\n });\n } else if (isAddPermissionlessValidatorTx(txDetails)) {\n if (!context) throw new Error('context (network, signerAccount) is required for AddPermissionlessValidator');\n return addPermissionlessValidatorDetailSection({\n tx: txDetails,\n symbol,\n network: context.network,\n signerAccount: context.signerAccount,\n });\n } else if (isBlockchainDetails(txDetails)) {\n return blockChainDetailSection(txDetails, symbol);\n } else if (isAddSubnetValidatorTx(txDetails)) {\n return addSubnetValidatorDetailSection(txDetails, symbol);\n } else if (isRemoveSubnetValidatorTx(txDetails)) {\n return removeSubnetValidatorDetailSection(txDetails, symbol);\n } else if (isConvertSubnetToL1Tx(txDetails)) {\n return convertSubnetToL1DetailSection(txDetails, symbol);\n } else if (isDisableL1ValidatorTx(txDetails)) {\n return disableL1ValidatorDetailSection(txDetails, symbol);\n } else if (isIncreaseL1ValidatorBalanceTx(txDetails)) {\n return increaseL1ValidatorBalanceDetailSection(txDetails, symbol);\n } else if (isRegisterL1ValidatorTx(txDetails)) {\n return registerL1ValidatorDetailSection(txDetails, symbol);\n } else if (isSetL1ValidatorWeightTx(txDetails)) {\n return setL1ValidatorWeightDetailSection(txDetails, symbol);\n } else if (isAddAutoRenewedValidatorTx(txDetails)) {\n if (!context) throw new Error('context (network, signerAccount) is required for AddAutoRenewedValidator');\n return addAutoRenewedValidatorDetailSection({\n tx: txDetails,\n symbol,\n network: context.network,\n signerAccount: context.signerAccount,\n });\n } else if (isSetAutoRenewedValidatorConfigTx(txDetails)) {\n return setAutoRenewedValidatorConfigDetailSection(txDetails, symbol);\n }\n};\n","import {\n TxType,\n type AddAutoRenewedValidatorTx,\n type AddPermissionlessDelegatorTx,\n type AddPermissionlessValidatorTx,\n type AddSubnetValidatorTx,\n type BaseTx,\n type BlockchainDetails,\n type ChainDetails,\n type ConvertSubnetToL1Tx,\n type CreateChainTx,\n type CreateSubnetTx,\n type DisableL1ValidatorTx,\n type ExportImportTxDetails,\n type ExportTx,\n type ImportTx,\n type IncreaseL1ValidatorBalanceTx,\n type RegisterL1ValidatorTx,\n type RemoveSubnetValidatorTx,\n type SetAutoRenewedValidatorConfigTx,\n type SetL1ValidatorWeightTx,\n type StakingDetails,\n type SubnetDetails,\n type TxDetails,\n} from '@avalabs/vm-module-types';\n\nexport const isAddPermissionlessDelegatorTx = (tx: TxDetails): tx is AddPermissionlessDelegatorTx =>\n tx.type === TxType.AddPermissionlessDelegator;\nexport const isAddPermissionlessValidatorTx = (tx: TxDetails): tx is AddPermissionlessValidatorTx =>\n tx.type === TxType.AddPermissionlessValidator;\nexport const isExportTx = (tx: TxDetails): tx is ExportTx => tx.type === TxType.Export;\nexport const isImportTx = (tx: TxDetails): tx is ImportTx => tx.type === TxType.Import;\nexport const isBaseTx = (tx: TxDetails): tx is BaseTx => tx.type === TxType.Base;\nexport const isAddSubnetValidatorTx = (tx: TxDetails): tx is AddSubnetValidatorTx =>\n tx.type === TxType.AddSubnetValidator;\nexport const isCreateChainTx = (tx: TxDetails): tx is CreateChainTx => tx.type === TxType.CreateChain;\nexport const isCreateSubnetTx = (tx: TxDetails): tx is CreateSubnetTx => tx.type === TxType.CreateSubnet;\nexport const isRemoveSubnetValidatorTx = (tx: TxDetails): tx is RemoveSubnetValidatorTx =>\n tx.type === TxType.RemoveSubnetValidator;\nexport const isConvertSubnetToL1Tx = (tx: TxDetails): tx is ConvertSubnetToL1Tx => tx.type === TxType.ConvertSubnetToL1;\nexport const isDisableL1ValidatorTx = (tx: TxDetails): tx is DisableL1ValidatorTx =>\n tx.type === TxType.DisableL1Validator;\nexport const isIncreaseL1ValidatorBalanceTx = (tx: TxDetails): tx is IncreaseL1ValidatorBalanceTx =>\n tx.type === TxType.IncreaseL1ValidatorBalance;\nexport const isRegisterL1ValidatorTx = (tx: TxDetails): tx is RegisterL1ValidatorTx =>\n tx.type === TxType.RegisterL1Validator;\nexport const isSetL1ValidatorWeightTx = (tx: TxDetails): tx is SetL1ValidatorWeightTx =>\n tx.type === TxType.SetL1ValidatorWeight;\nexport const isAddAutoRenewedValidatorTx = (tx: TxDetails): tx is AddAutoRenewedValidatorTx =>\n tx.type === TxType.AddAutoRenewedValidator;\nexport const isSetAutoRenewedValidatorConfigTx = (tx: TxDetails): tx is SetAutoRenewedValidatorConfigTx =>\n tx.type === TxType.SetAutoRenewedValidatorConfig;\n\nexport const isStakingDetails = (tx: TxDetails): tx is StakingDetails =>\n isAddPermissionlessDelegatorTx(tx) ||\n isAddPermissionlessValidatorTx(tx) ||\n isAddSubnetValidatorTx(tx) ||\n isRemoveSubnetValidatorTx(tx) ||\n isAddAutoRenewedValidatorTx(tx) ||\n isSetAutoRenewedValidatorConfigTx(tx);\nexport const isExportImportTxDetails = (tx: TxDetails): tx is ExportImportTxDetails => isExportTx(tx) || isImportTx(tx);\nexport const isChainDetails = (tx: TxDetails): tx is ChainDetails => isBaseTx(tx);\nexport const isBlockchainDetails = (tx: TxDetails): tx is BlockchainDetails => isCreateChainTx(tx);\nexport const isSubnetDetails = (tx: TxDetails): tx is SubnetDetails => isCreateSubnetTx(tx);\n","export const AVAX_NONEVM_DENOMINATION = 9;\n\nexport enum AvalancheChainStrings {\n AVM = 'X-Chain',\n PVM = 'P-Chain',\n EVM = 'C-Chain',\n}\n","import type { AddPermissionlessDelegatorTx, DetailItem, DetailSection, Network } from '@avalabs/vm-module-types';\nimport { addressItem, currencyItem, dateItem, nodeIDItem } from '@internal/utils';\nimport { AVAX_NONEVM_DENOMINATION } from '../../constants';\nimport { networkItem } from '@internal/utils/src/utils/detail-item';\n\ntype AddPermissionlessDelegatorDetailSectionProps = {\n tx: AddPermissionlessDelegatorTx;\n symbol: string;\n network: Network;\n signerAccount: string;\n};\n\nexport const addPermissionlessDelegatorDetailSection = ({\n tx,\n symbol,\n network,\n signerAccount,\n}: AddPermissionlessDelegatorDetailSectionProps) => {\n const details: DetailSection[] = [];\n const { txFee, nodeID, subnetID, start, end, stake } = tx;\n\n const basicInfo: DetailSection = {\n items: [\n addressItem('Account', signerAccount),\n networkItem('Network', {\n name: network.chainName,\n logoUri: network.logoUri,\n }),\n ],\n };\n\n details.push(basicInfo);\n\n const items: DetailItem[] = [\n nodeIDItem('Node', nodeID),\n // Delegating on an arbitrary subnet is not the same commitment as the primary network,\n // and the node id alone does not say which one this is.\n nodeIDItem('Subnet ID', subnetID),\n currencyItem('Stake Amount', stake, AVAX_NONEVM_DENOMINATION, symbol),\n dateItem('Start', start),\n dateItem('End', end),\n ];\n\n details.push({\n title: 'Staking Details',\n items,\n });\n if (txFee) {\n details.push({\n title: 'Network Fee',\n items: [currencyItem('Fee Amount', txFee, AVAX_NONEVM_DENOMINATION, symbol)],\n });\n }\n return details;\n};\n","import type { AddPermissionlessValidatorTx, DetailItem, DetailSection, Network } from '@avalabs/vm-module-types';\nimport { addressItem, currencyItem, dateItem, nodeIDItem, textItem } from '@internal/utils';\nimport { AVAX_NONEVM_DENOMINATION } from '../../constants';\nimport { networkItem } from '@internal/utils/src/utils/detail-item';\n\ntype AddPermissionlessValidatorDetailSectionProps = {\n tx: AddPermissionlessValidatorTx;\n symbol: string;\n network: Network;\n signerAccount: string;\n};\n\nexport const addPermissionlessValidatorDetailSection = ({\n tx,\n symbol,\n network,\n signerAccount,\n}: AddPermissionlessValidatorDetailSectionProps) => {\n const details: DetailSection[] = [];\n const { txFee, nodeID, subnetID, delegationFee, start, end, stake } = tx;\n\n const basicInfo: DetailSection = {\n items: [\n addressItem('Account', signerAccount),\n networkItem('Network', {\n name: network.chainName,\n logoUri: network.logoUri,\n }),\n ],\n };\n\n details.push(basicInfo);\n\n // Staking on an arbitrary subnet is not the same commitment as the primary network, and\n // the node id alone does not say which one this is.\n const items: DetailItem[] = [nodeIDItem('Node', nodeID), nodeIDItem('Subnet ID', subnetID)];\n\n items.push(\n currencyItem('Stake Amount', stake, AVAX_NONEVM_DENOMINATION, symbol),\n textItem('Delegation Fee', `${delegationFee / 10000} %`),\n dateItem('Start', start),\n dateItem('End', end),\n );\n\n details.push({\n title: 'Staking Details',\n items,\n });\n\n if (txFee) {\n details.push({\n title: 'Network Fee',\n items: [currencyItem('Fee Amount', txFee, AVAX_NONEVM_DENOMINATION, symbol)],\n });\n }\n\n return details;\n};\n","import type { AddSubnetValidatorTx, DetailItem, DetailSection } from '@avalabs/vm-module-types';\nimport { currencyItem, dateItem, nodeIDItem } from '@internal/utils';\nimport { AVAX_NONEVM_DENOMINATION } from '../../constants';\n\nexport const addSubnetValidatorDetailSection = (tx: AddSubnetValidatorTx, symbol: string) => {\n const details: DetailSection[] = [];\n const { txFee, nodeID, start, end, subnetID } = tx;\n\n const items: DetailItem[] = [\n nodeIDItem('Subnet ID', subnetID),\n nodeIDItem('Node ID', nodeID),\n dateItem('Start Date', start),\n dateItem('End Date', end),\n ];\n\n details.push({\n title: 'Staking Details',\n items,\n });\n\n if (txFee) {\n details.push({\n title: 'Network Fee',\n items: [currencyItem('Fee Amount', txFee, AVAX_NONEVM_DENOMINATION, symbol)],\n });\n }\n return details;\n};\n","import type { ConvertSubnetToL1Tx, DetailItem, DetailSection } from '@avalabs/vm-module-types';\nimport { addressItem, currencyItem, nodeIDItem, textItem } from '@internal/utils';\nimport { AVAX_NONEVM_DENOMINATION } from '../../constants';\n\nexport const convertSubnetToL1DetailSection = (tx: ConvertSubnetToL1Tx, symbol: string) => {\n const details: DetailSection[] = [];\n const { txFee, chainID, managerAddress, subnetID, validators } = tx;\n\n const subnetItems: DetailItem[] = [\n nodeIDItem('Subnet ID', subnetID),\n nodeIDItem('Chain ID', chainID),\n addressItem('Manager Address', managerAddress),\n ];\n\n details.push({\n title: 'L1 Details',\n items: subnetItems,\n });\n\n validators.forEach(({ balance, stake, nodeId, remainingBalanceOwners, deactivationOwners }, index) => {\n const validatorItem: DetailItem[] = [\n nodeIDItem('Node ID', nodeId),\n currencyItem('Balance', balance, AVAX_NONEVM_DENOMINATION, symbol),\n currencyItem('Stake', stake, AVAX_NONEVM_DENOMINATION, symbol),\n ];\n if (deactivationOwners.length > 0) {\n validatorItem.push(\n textItem(\n `${deactivationOwners.length > 1 ? 'Owners' : 'Owner'} Able to Deactivate`,\n deactivationOwners.join('\\n'),\n 'vertical',\n ),\n );\n }\n if (remainingBalanceOwners.length > 0) {\n validatorItem.push(\n textItem(\n `${remainingBalanceOwners.length > 1 ? 'Owners' : 'Owner'} of the Remaining Balance`,\n remainingBalanceOwners.join('\\n'),\n 'vertical',\n ),\n );\n }\n\n details.push({\n title: index === 0 ? 'Validators' : undefined,\n items: validatorItem,\n });\n });\n\n if (txFee) {\n details.push({\n title: 'Network Fee',\n items: [currencyItem('Fee Amount', txFee, AVAX_NONEVM_DENOMINATION, symbol)],\n });\n }\n\n return details;\n};\n","import type { DetailSection, ExportTx } from '@avalabs/vm-module-types';\nimport { addressItem, currencyItem, textItem } from '@internal/utils';\nimport { AvalancheChainStrings, AVAX_NONEVM_DENOMINATION } from '../../constants';\n\nexport const exportDetailSection = (tx: ExportTx, symbol: string, recipients: string[] = []) => {\n const details: DetailSection[] = [];\n const { txFee, amount, chain, destination, type } = tx;\n\n details.push({\n items: [\n textItem('Source Chain', `Avalanche ${AvalancheChainStrings[chain]}`),\n textItem('Target Chain', `Avalanche ${AvalancheChainStrings[destination]}`),\n ],\n });\n\n details.push({\n items: [\n textItem('Transaction Type', type ? (type[0] || '').toUpperCase() + type.slice(1) : ''),\n currencyItem('Amount', amount, AVAX_NONEVM_DENOMINATION, symbol),\n // Who receives the funds on the target chain is signed but was not shown, so an export\n // paying somebody else looked exactly like one paying the user back.\n ...recipients.map((recipient) => addressItem('To', recipient)),\n ],\n });\n if (txFee) {\n details.push({\n title: 'Network Fee',\n items: [currencyItem('Fee Amount', txFee, AVAX_NONEVM_DENOMINATION, symbol)],\n });\n }\n return details;\n};\n","import type { DetailSection, ImportTx } from '@avalabs/vm-module-types';\nimport { addressItem, currencyItem, textItem } from '@internal/utils';\nimport { AvalancheChainStrings, AVAX_NONEVM_DENOMINATION } from '../../constants';\n\nexport const importDetailSection = (tx: ImportTx, symbol: string, recipients: string[] = []) => {\n const details: DetailSection[] = [];\n const { txFee, amount, chain, source, type } = tx;\n details.push({\n items: [\n textItem('Source Chain', `Avalanche ${AvalancheChainStrings[source]}`),\n textItem('Destination Chain', `Avalanche ${AvalancheChainStrings[chain]}`),\n ],\n });\n\n details.push({\n items: [\n textItem('Transaction Type', type ? (type[0] || '').toUpperCase() + type.slice(1) : ''),\n currencyItem('Amount', amount, AVAX_NONEVM_DENOMINATION, symbol),\n // Who receives the imported funds is signed but was not shown.\n ...recipients.map((recipient) => addressItem('To', recipient)),\n ],\n });\n if (txFee) {\n details.push({\n title: 'Network Fee',\n items: [currencyItem('Fee Amount', txFee, AVAX_NONEVM_DENOMINATION, symbol)],\n });\n }\n return details;\n};\n","import type { DetailItem, DetailSection, RemoveSubnetValidatorTx } from '@avalabs/vm-module-types';\nimport { currencyItem, nodeIDItem } from '@internal/utils';\nimport { AVAX_NONEVM_DENOMINATION } from '../../constants';\n\nexport const removeSubnetValidatorDetailSection = (tx: RemoveSubnetValidatorTx, symbol: string) => {\n const details: DetailSection[] = [];\n const { txFee, nodeID, subnetID } = tx;\n\n const items: DetailItem[] = [nodeIDItem('Node ID', nodeID), nodeIDItem('Subnet ID', subnetID)];\n\n details.push({\n title: 'Staking Details',\n items,\n });\n\n if (txFee) {\n details.push({\n title: 'Network Fee',\n items: [currencyItem('Fee Amount', txFee, AVAX_NONEVM_DENOMINATION, symbol)],\n });\n }\n return details;\n};\n","import type { BaseTx, DetailItem, DetailSection } from '@avalabs/vm-module-types';\nimport { addressItem, currencyItem, textItem } from '@internal/utils';\nimport { AvalancheChainStrings, AVAX_NONEVM_DENOMINATION } from '../../constants';\nimport { PVM } from '@avalabs/avalanchejs';\n\ntype Output = BaseTx['outputs'][number];\n\n/**\n * Renders the amount in the asset the output actually moves.\n *\n * The X-Chain carries arbitrary Avalanche Native Tokens, and every output was previously\n * labelled with the network token's symbol and denomination - so a transfer of some other\n * asset was shown to the user as if it were AVAX, at AVAX's scale. When the asset is not the\n * network token and the chain did not describe it, the raw amount and the asset id are shown\n * instead of a number that would only look like a familiar unit.\n */\nconst amountItems = (output: Output, symbol: string): DetailItem[] => {\n if (output.isAvax) {\n return [currencyItem('Amount', output.amount, AVAX_NONEVM_DENOMINATION, symbol)];\n }\n\n if (output.assetDescription) {\n return [\n currencyItem('Amount', output.amount, output.assetDescription.denomination, output.assetDescription.symbol),\n textItem('Asset', output.assetDescription.name),\n ];\n }\n\n return [textItem('Amount', `${output.amount} (smallest unit)`), textItem('Asset', output.assetId, 'vertical')];\n};\n\nexport const chainDetailSection = (tx: BaseTx, symbol: string) => {\n const details: DetailSection[] = [];\n const { txFee, chain, outputs, memo } = tx;\n\n details.push({\n title: 'Chain Details',\n items: [textItem('Active chain', `Avalanche ${AvalancheChainStrings[chain]}`)],\n });\n\n outputs.forEach((output, index) => {\n const balanceChangeItems: DetailItem[] = output.owners.flatMap((ownerAddress) => [\n addressItem('To', ownerAddress),\n ...amountItems(output, symbol),\n ]);\n\n if (output.owners.length > 1) {\n balanceChangeItems.push(textItem('Threshold', output.threshold.toString()));\n }\n\n // A locked output cannot be spent until its locktime passes, which is not something the\n // amount alone conveys. A locktime already in the past places no restriction on the\n // funds, so it is left out rather than shown as a condition.\n const lockedUntilMs = Number(output.locktime) * 1000;\n\n if (lockedUntilMs > Date.now()) {\n balanceChangeItems.push(textItem('Locked until', new Date(lockedUntilMs).toUTCString()));\n }\n\n details.push({\n title: index === 0 ? 'Balance Change' : undefined,\n items: balanceChangeItems,\n });\n });\n\n if (chain !== PVM && !!memo) {\n details.push({\n title: 'Memo',\n items: [memo],\n });\n }\n if (txFee) {\n details.push({\n title: 'Network Fee',\n items: [currencyItem('Fee Amount', txFee, AVAX_NONEVM_DENOMINATION, symbol)],\n });\n }\n\n return details;\n};\n","import type { CreateSubnetTx, DetailSection } from '@avalabs/vm-module-types';\nimport { currencyItem, textItem } from '@internal/utils';\nimport { AVAX_NONEVM_DENOMINATION } from '../../constants';\nimport { addressListItem } from '@internal/utils/src/utils/detail-item';\n\nexport const subnetDetailSection = (tx: CreateSubnetTx, symbol: string) => {\n const details: DetailSection[] = [];\n const { txFee, threshold, controlKeys } = tx;\n\n details.push({\n title: 'L1 Details',\n items: [\n addressListItem(controlKeys.length > 1 ? 'Owners' : 'Owner', controlKeys),\n textItem('Signature Threshold', `${threshold}/${controlKeys.length}`, 'horizontal'),\n ],\n });\n if (txFee) {\n details.push({\n title: 'Network Fee',\n items: [currencyItem('Fee Amount', txFee, AVAX_NONEVM_DENOMINATION, symbol)],\n });\n }\n\n return details;\n};\n","import type { CreateChainTx, DetailItem, DetailSection } from '@avalabs/vm-module-types';\nimport { currencyItem, dataItem, textItem } from '@internal/utils';\nimport { AVAX_NONEVM_DENOMINATION } from '../../constants';\n\nconst formatGenesisData = (genesisData: string): string => {\n try {\n // Parse and re-stringify with formatting\n const genesisParsed = JSON.parse(genesisData);\n return JSON.stringify(genesisParsed, null, 2);\n } catch (error) {\n // If parsing fails, return original string (don't break approval)\n console.error('Failed to format genesis data:', error);\n return genesisData;\n }\n};\n\nexport const blockChainDetailSection = (tx: CreateChainTx, symbol: string) => {\n const details: DetailSection[] = [];\n // handle genesis data similarly to how we handle data in transaction details\n const { txFee, chainID, chainName, vmID, genesisData } = tx;\n\n const items: DetailItem[] = [\n textItem('Blockchain name', chainName, 'vertical'),\n textItem('Blockchain ID', chainID, 'vertical'),\n textItem('Virtual Machine ID', vmID, 'vertical'),\n dataItem('Genesis Data', formatGenesisData(genesisData)),\n ];\n\n details.push({\n title: 'Blockchain Details',\n items,\n });\n if (txFee) {\n details.push({\n title: 'Network Fee',\n items: [currencyItem('Fee Amount', txFee, AVAX_NONEVM_DENOMINATION, symbol)],\n });\n }\n\n return details;\n};\n","import type { DetailItem, DetailSection, DisableL1ValidatorTx } from '@avalabs/vm-module-types';\nimport { currencyItem, nodeIDItem } from '@internal/utils';\nimport { AVAX_NONEVM_DENOMINATION } from '../../constants';\n\nexport const disableL1ValidatorDetailSection = (tx: DisableL1ValidatorTx, symbol: string) => {\n const details: DetailSection[] = [];\n\n const { txFee, validationId } = tx;\n\n const items: DetailItem[] = [nodeIDItem('Validation ID', validationId)];\n\n details.push({\n title: 'L1 Details',\n items: items,\n });\n\n if (txFee) {\n details.push({\n title: 'Network Fee',\n items: [currencyItem('Fee Amount', txFee, AVAX_NONEVM_DENOMINATION, symbol)],\n });\n }\n\n return details;\n};\n","import type { DetailItem, DetailSection, IncreaseL1ValidatorBalanceTx } from '@avalabs/vm-module-types';\nimport { currencyItem, nodeIDItem } from '@internal/utils';\nimport { AVAX_NONEVM_DENOMINATION } from '../../constants';\n\nexport const increaseL1ValidatorBalanceDetailSection = (tx: IncreaseL1ValidatorBalanceTx, symbol: string) => {\n const details: DetailSection[] = [];\n\n const { txFee, balance, validationId } = tx;\n\n const items: DetailItem[] = [\n nodeIDItem('Validation ID', validationId),\n currencyItem('Increase by amount', balance, AVAX_NONEVM_DENOMINATION, symbol),\n ];\n\n details.push({\n title: 'L1 Details',\n items: items,\n });\n\n if (txFee) {\n details.push({\n title: 'Network Fee',\n items: [currencyItem('Fee Amount', txFee, AVAX_NONEVM_DENOMINATION, symbol)],\n });\n }\n\n return details;\n};\n","import type { DetailItem, DetailSection, RegisterL1ValidatorTx } from '@avalabs/vm-module-types';\nimport { currencyItem } from '@internal/utils';\nimport { AVAX_NONEVM_DENOMINATION } from '../../constants';\n\nexport const registerL1ValidatorDetailSection = (tx: RegisterL1ValidatorTx, symbol: string) => {\n const details: DetailSection[] = [];\n\n const { txFee, balance } = tx;\n\n const items: DetailItem[] = [currencyItem('Initial balance', balance, AVAX_NONEVM_DENOMINATION, symbol)];\n\n details.push({\n title: 'L1 Details',\n items: items,\n });\n\n if (txFee) {\n details.push({\n title: 'Network Fee',\n items: [currencyItem('Fee Amount', txFee, AVAX_NONEVM_DENOMINATION, symbol)],\n });\n }\n\n return details;\n};\n","import type { DetailSection, SetL1ValidatorWeightTx } from '@avalabs/vm-module-types';\nimport { currencyItem } from '@internal/utils';\nimport { AVAX_NONEVM_DENOMINATION } from '../../constants';\n\nexport const setL1ValidatorWeightDetailSection = (tx: SetL1ValidatorWeightTx, symbol: string) => {\n const details: DetailSection[] = [];\n\n const { txFee } = tx;\n\n if (txFee) {\n details.push({\n title: 'Network Fee',\n items: [currencyItem('Fee Amount', txFee, AVAX_NONEVM_DENOMINATION, symbol)],\n });\n }\n\n return details;\n};\n","import type { AddAutoRenewedValidatorTx, DetailItem, DetailSection, Network } from '@avalabs/vm-module-types';\nimport { addressItem, currencyItem, nodeIDItem, textItem } from '@internal/utils';\nimport { AVAX_NONEVM_DENOMINATION } from '../../constants';\nimport { networkItem } from '@internal/utils/src/utils/detail-item';\n\ntype AddAutoRenewedValidatorDetailSectionProps = {\n tx: AddAutoRenewedValidatorTx;\n symbol: string;\n network: Network;\n signerAccount: string;\n};\n\n// Auto-renewal cycle (`period`) is provided in seconds.\nconst SECONDS_IN_DAY = 60 * 60 * 24;\n\n// `delegationFee` and `autoCompoundRewardShares` are stored in millionths\n// (percentage × 10,000), per ACP-236 — i.e. 1,000,000 = 100%, 300,000 = 30%.\n// Dividing by 10,000 converts the raw value directly to a percentage.\nconst PPM_TO_PERCENT_DIVISOR = 10_000;\n\nexport const addAutoRenewedValidatorDetailSection = ({\n tx,\n symbol,\n network,\n signerAccount,\n}: AddAutoRenewedValidatorDetailSectionProps) => {\n const details: DetailSection[] = [];\n const { txFee, nodeID, stake, delegationFee, autoCompoundRewardShares, period } = tx;\n\n const basicInfo: DetailSection = {\n items: [\n addressItem('Account', signerAccount),\n networkItem('Network', {\n name: network.chainName,\n logoUri: network.logoUri,\n }),\n ],\n };\n\n details.push(basicInfo);\n\n const items: DetailItem[] = [\n nodeIDItem('Node', nodeID),\n currencyItem('Stake Amount', stake, AVAX_NONEVM_DENOMINATION, symbol),\n textItem('Delegation fee', `${delegationFee / PPM_TO_PERCENT_DIVISOR} %`),\n textItem('Cycle duration', `${Number(period) / SECONDS_IN_DAY} days`),\n textItem('Compound rewards percentage', `${autoCompoundRewardShares / PPM_TO_PERCENT_DIVISOR} %`),\n ];\n\n details.push({\n title: 'Staking Details',\n items,\n });\n\n if (txFee) {\n details.push({\n title: 'Network Fee',\n items: [currencyItem('Fee Amount', txFee, AVAX_NONEVM_DENOMINATION, symbol)],\n });\n }\n\n return details;\n};\n","import type { DetailItem, DetailSection, SetAutoRenewedValidatorConfigTx } from '@avalabs/vm-module-types';\nimport { currencyItem, nodeIDItem, textItem } from '@internal/utils';\nimport { AVAX_NONEVM_DENOMINATION } from '../../constants';\n\nconst SECONDS_IN_DAY = 60 * 60 * 24;\n// `autoCompoundRewardShares` is stored in millionths (percentage × 10,000) per\n// ACP-236 — i.e. 1,000,000 = 100%. Dividing by 10,000 yields the percentage.\nconst PPM_TO_PERCENT_DIVISOR = 10_000;\n\nexport const setAutoRenewedValidatorConfigDetailSection = (tx: SetAutoRenewedValidatorConfigTx, symbol: string) => {\n const details: DetailSection[] = [];\n\n const { txFee, txId, autoCompoundRewardShares, period } = tx;\n\n const items: DetailItem[] = [\n nodeIDItem('Validator Tx ID', txId),\n textItem('Cycle duration', `${Number(period) / SECONDS_IN_DAY} days`),\n textItem('Compound rewards percentage', `${autoCompoundRewardShares / PPM_TO_PERCENT_DIVISOR} %`),\n ];\n\n details.push({\n title: 'Staking Details',\n items: items,\n });\n\n if (txFee) {\n details.push({\n title: 'Network Fee',\n items: [currencyItem('Fee Amount', txFee, AVAX_NONEVM_DENOMINATION, symbol)],\n });\n }\n\n return details;\n};\n","import {\n PrimaryNetworkChainName,\n type ListCChainAtomicTransactionsResponse,\n type ListPChainTransactionsResponse,\n type ListXChainTransactionsResponse,\n} from '@avalabs/glacier-sdk';\nimport Big from 'big.js';\n\nexport const isPChainTransactions = (\n value: ListPChainTransactionsResponse | ListXChainTransactionsResponse | ListCChainAtomicTransactionsResponse,\n): value is ListPChainTransactionsResponse => {\n return value.chainInfo.chainName === PrimaryNetworkChainName.P_CHAIN;\n};\n\nexport const isXChainTransactions = (\n value: ListPChainTransactionsResponse | ListXChainTransactionsResponse | ListCChainAtomicTransactionsResponse,\n): value is ListXChainTransactionsResponse => {\n return value.chainInfo.chainName === PrimaryNetworkChainName.X_CHAIN;\n};\n\nexport function getExplorerAddressByNetwork(\n explorerUrl: string,\n hash: string,\n hashType: 'address' | 'tx' = 'tx',\n): string {\n return `${explorerUrl}/${hashType}/${hash}`;\n}\n\nexport function getTokenValue({ amount, decimals }: { decimals: number; amount?: number }): Big {\n return amount === undefined ? new Big(0) : new Big(amount / 10 ** decimals);\n}\n","import { z } from 'zod';\n\nimport type { RpcRequest } from '@avalabs/vm-module-types';\n\nexport type CurrentAvalancheAccount = {\n xpAddress: string;\n evmAddress?: string;\n xpubXP?: string;\n externalXPAddresses: {\n index: number;\n address: string;\n }[];\n};\n\nconst LegacyAvalancheTxContextSchema = z.object({\n currentAddress: z.string({ required_error: 'No active account found' }),\n currentEvmAddress: z.string().optional(),\n xpubXP: z.string({ invalid_type_error: 'xpubXP must be a string' }).optional(),\n});\n\nconst NewAvalancheTxContextSchema = z.object({\n account: z.object({\n xpAddress: z.string({\n required_error: 'XP address is required',\n invalid_type_error: 'XP address must be a string',\n }),\n evmAddress: z.string().optional(),\n xpubXP: z.string({ invalid_type_error: 'xpubXP must be a string' }).optional(),\n externalXPAddresses: z.array(\n z.object({\n index: z.number(),\n address: z.string(),\n }),\n ),\n }),\n});\n\ntype NewAvalancheTxContextType = z.infer<typeof NewAvalancheTxContextSchema>;\ntype LegacyAvalancheTxContextType = z.infer<typeof LegacyAvalancheTxContextSchema>;\n\nconst getAccountFromLegacyContext = (context: LegacyAvalancheTxContextType): CurrentAvalancheAccount => {\n return {\n xpAddress: context.currentAddress,\n evmAddress: context.currentEvmAddress,\n xpubXP: context.xpubXP,\n externalXPAddresses: [],\n };\n};\n\nconst getAccountFromNewContext = (context: NewAvalancheTxContextType): CurrentAvalancheAccount => {\n return context.account;\n};\n\ntype GetAccountFromContextResult =\n | {\n success: true;\n data: CurrentAvalancheAccount;\n }\n | {\n success: false;\n error: string;\n };\n\ntype RpcContextWithAccount = RpcRequest['context'] & {\n account: Record<string, unknown>;\n};\n\nconst hasAccountField = (context: RpcRequest['context']): context is RpcContextWithAccount => {\n return (\n context != null &&\n typeof context === 'object' &&\n 'account' in context &&\n context.account != null &&\n typeof context.account === 'object'\n );\n};\n\nexport const getAccountFromContext = (context: RpcRequest['context']): GetAccountFromContextResult => {\n if (!context) {\n return {\n success: false,\n error: 'Missing Avalanche transaction context',\n };\n }\n\n // If `account` field is present, we treat & validate the context as a new Avalanche transaction context.\n if (hasAccountField(context)) {\n const { success, data, error } = NewAvalancheTxContextSchema.safeParse(context);\n\n if (!success) {\n return {\n success: false,\n error: error.errors[0]?.message || 'Invalid or missing Avalanche transaction context',\n };\n }\n\n return {\n success: true,\n data: getAccountFromNewContext(data),\n };\n }\n\n const { success, data, error } = LegacyAvalancheTxContextSchema.safeParse(context);\n\n if (!success) {\n return {\n success: false,\n error: error.errors[0]?.message || 'Invalid or missing Avalanche transaction context',\n };\n }\n\n return {\n success: true,\n data: getAccountFromLegacyContext(data),\n };\n};\n","import {\n type SigningData,\n type Network,\n type ApprovalController,\n type DisplayData,\n type RpcRequest,\n RpcMethod,\n} from '@avalabs/vm-module-types';\nimport { parseRequestParams } from './schemas/parse-request-params/parse-request-params';\nimport { rpcErrors } from '@metamask/rpc-errors';\nimport { rpcErrorOpts } from '@internal/utils';\n\nexport const avalancheSignMessage = async ({\n request,\n network,\n approvalController,\n}: {\n request: RpcRequest;\n network: Network;\n approvalController: ApprovalController;\n}) => {\n const result = parseRequestParams(request.params);\n\n if (!result.success) {\n console.error('invalid params', result.error);\n\n return {\n error: rpcErrors.invalidParams(rpcErrorOpts('Params are invalid', result.error)),\n };\n }\n const [message, accountIndex] = result.data;\n const msgHex = Buffer.from(message, 'utf-8').toString('hex');\n const signingData: SigningData = {\n type: RpcMethod.AVALANCHE_SIGN_MESSAGE,\n data: msgHex,\n accountIndex,\n };\n\n const displayData: DisplayData = {\n title: 'Sign Message',\n dAppInfo: {\n name: request.dappInfo.name,\n action: `${request.dappInfo.name} is requesting to sign the following message`,\n logoUri: request.dappInfo.icon,\n },\n network: {\n chainId: network.chainId,\n name: network.chainName,\n logoUri: network.logoUri,\n },\n details: [\n {\n title: 'Message',\n items: [message],\n },\n ],\n };\n\n // prompt user for approval\n const response = await approvalController.requestApproval({ request, displayData, signingData });\n\n if ('error' in response) {\n return {\n error: response.error,\n };\n }\n\n if (!('signedData' in response)) {\n return {\n error: rpcErrors.internal('No signed data returned'),\n };\n }\n\n return { result: response.signedData };\n};\n","import { z } from 'zod';\n\nconst paramsSchema = z.union([\n z.tuple([z.string()]).describe('message to sign'),\n z.tuple([z.string().describe('message to sign'), z.number().nonnegative().describe('account index')]),\n]);\n\nexport const parseRequestParams = (\n params: unknown,\n): z.SafeParseReturnType<[string, number], [string, number] | [string]> => {\n return paramsSchema.safeParse(params);\n};\n","import {\n type SigningData,\n type Network,\n type ApprovalController,\n type DisplayData,\n type RpcRequest,\n RpcMethod,\n type AppInfo,\n} from '@avalabs/vm-module-types';\nimport { utils } from '@avalabs/avalanchejs';\nimport { rpcErrors } from '@metamask/rpc-errors';\nimport { Avalanche } from '@avalabs/core-wallets-sdk';\nimport { Network as GlacierNetwork } from '@avalabs/glacier-sdk';\n\nimport { getCoreHeaders } from '@internal/utils';\n\nimport { getProvider } from '../../utils/get-provider';\nimport { parseTxDetails } from '../../utils/parse-tx-details';\nimport { resolveUtxos } from '../../utils/resolve-utxos';\nimport { getCrossChainRecipients } from '../../utils/get-cross-chain-recipients';\nimport { getTransactionDetailSections } from '../../utils/get-transaction-detail-sections';\n\nimport { parseRequestParams } from './schemas/parse-request-params/parse-request-params';\nimport { getUnsignedOrPartiallySignedTx } from './util/get-unsigned-or-partially-signed-tx';\nimport { getAccountFromContext } from '../../utils/get-account-from-context';\n\nexport const avalancheSignTransaction = async ({\n request,\n network,\n approvalController,\n glacierApiUrl,\n appInfo,\n getAuthHeaders,\n}: {\n request: RpcRequest;\n network: Network;\n approvalController: ApprovalController;\n glacierApiUrl: string;\n appInfo: AppInfo;\n getAuthHeaders?: () => Promise<Record<string, string>>;\n}) => {\n const result = parseRequestParams(request.params);\n\n if (!result.success) {\n console.error('invalid params', result.error);\n\n return {\n error: rpcErrors.invalidParams('Params are invalid'),\n };\n }\n const { transactionHex, chainAlias, from, utxos: providedUtxoHexes } = result.data;\n\n const vm = Avalanche.getVmByChainAlias(chainAlias);\n const isTestnet = network.isTestnet ?? false;\n const provider = await getProvider(network);\n\n const contextParserResult = getAccountFromContext(request.context);\n\n if (!contextParserResult.success) {\n return {\n error: rpcErrors.invalidParams(contextParserResult.error),\n };\n }\n\n const { xpAddress: currentAddress, evmAddress: currentEvmAddress } = contextParserResult.data;\n\n const utxos = await resolveUtxos({\n utxoHexes: providedUtxoHexes,\n vm,\n getIndexedUtxos: async () =>\n Avalanche.getUtxosByTxFromGlacier({\n transactionHex,\n chainAlias,\n network: isTestnet ? GlacierNetwork.FUJI : GlacierNetwork.MAINNET,\n url: glacierApiUrl,\n headers: { ...getCoreHeaders(appInfo), ...(await getAuthHeaders?.()) },\n }),\n });\n\n const unsignedOrPartiallySignedTx = await getUnsignedOrPartiallySignedTx({\n txBytes: utils.hexToBuffer(transactionHex),\n vm,\n utxos,\n currentAddress,\n currentEvmAddress,\n provider,\n });\n\n // check if the current account's signature is needed\n const signerAddress = utils.addressesFromBytes([utils.parse(from ?? currentAddress)[2]])[0];\n\n if (!signerAddress) {\n return {\n error: rpcErrors.invalidRequest('Missing signer address'),\n };\n }\n\n const ownSignatureIndices = unsignedOrPartiallySignedTx.getSigIndicesForAddress(signerAddress);\n\n if (!ownSignatureIndices) {\n return {\n error: rpcErrors.invalidRequest('This account has nothing to sign'),\n };\n }\n\n const sigIndices = unsignedOrPartiallySignedTx.getSigIndices();\n const needsToSign = ownSignatureIndices.some(([inputIndex, sigIndex]) => sigIndices[inputIndex]?.includes(sigIndex));\n\n if (!needsToSign) {\n return {\n error: rpcErrors.invalidRequest('This account has nothing to sign'),\n };\n }\n const signerAccount = from ?? currentAddress;\n\n // get display data for the UI\n const txData = await Avalanche.parseAvalancheTx(unsignedOrPartiallySignedTx, provider, from ?? currentAddress);\n const txDetails = parseTxDetails(txData);\n\n if (txData.type === 'unknown' || txDetails === undefined) {\n return {\n error: rpcErrors.invalidParams('Unable to parse transaction data. Unsupported tx type'),\n };\n }\n\n const signingData: SigningData = {\n type: RpcMethod.AVALANCHE_SIGN_TRANSACTION,\n data: txData,\n vm,\n unsignedTxJson: JSON.stringify(unsignedOrPartiallySignedTx.toJSON()),\n ownSignatureIndices,\n };\n\n const details = getTransactionDetailSections(txDetails, network.networkToken.symbol, {\n network,\n signerAccount,\n recipients: getCrossChainRecipients(unsignedOrPartiallySignedTx.getTx(), txDetails, isTestnet),\n });\n\n // Throw an error if we can't parse the transaction details\n if (details === undefined) {\n return {\n error: rpcErrors.internal('Unable to parse transaction display data. Unsupported tx type'),\n };\n }\n\n const displayData: DisplayData = {\n title: 'Do you approve this transaction?',\n dAppInfo: {\n name: request.dappInfo.name,\n action: `${request.dappInfo.name} requests you to sign the following transaction`,\n logoUri: request.dappInfo.icon,\n },\n network: {\n chainId: network.chainId,\n name: network.chainName,\n logoUri: network.logoUri,\n },\n details,\n };\n\n // prompt user for approval\n const response = await approvalController.requestApproval({ request, displayData, signingData });\n\n if ('error' in response) {\n return {\n error: response.error,\n };\n }\n\n if (!('signedData' in response)) {\n return {\n error: rpcErrors.invalidRequest('No signed data returned'),\n };\n }\n return { result: response.signedData };\n};\n","import { z } from 'zod';\n\nconst paramsSchema = z.object({\n from: z.string().optional().describe('Avalanche receiving address'),\n transactionHex: z.string(),\n chainAlias: z.enum(['X', 'P', 'C']),\n utxos: z.string().array().optional(),\n});\n\nexport const parseRequestParams = (params: unknown) => {\n return paramsSchema.safeParse(params);\n};\n","import {\n avaxSerial,\n evmSerial,\n utils,\n type EVMUnsignedTx,\n type UnsignedTx,\n type Utxo,\n type VM,\n Credential,\n} from '@avalabs/avalanchejs';\nimport { Avalanche } from '@avalabs/core-wallets-sdk';\nimport { rpcErrors } from '@metamask/rpc-errors';\n\nexport const getUnsignedOrPartiallySignedTx = async ({\n vm,\n txBytes,\n utxos,\n currentAddress,\n currentEvmAddress,\n provider,\n}: {\n txBytes: Uint8Array<ArrayBufferLike>;\n vm: VM;\n utxos: Utxo[];\n currentAddress: string;\n currentEvmAddress?: string;\n provider: Avalanche.JsonRpcProvider;\n}) => {\n let credentials: Credential[] | undefined = undefined;\n let parsedTxInstance: UnsignedTx | EVMUnsignedTx;\n const tx = utils.unpackWithManager(vm, txBytes) as avaxSerial.AvaxTx;\n\n if (evmSerial.isExportTx(tx)) {\n const spenderAddress = tx.ins[0]?.address.toHex();\n\n if (!currentEvmAddress) {\n throw rpcErrors.invalidRequest('Missing EVM address');\n }\n\n if (spenderAddress?.toLowerCase() !== currentEvmAddress.toLowerCase()) {\n throw new Error('This account has nothing to sign');\n }\n\n return Avalanche.createAvalancheEvmUnsignedTx({\n txBytes,\n vm,\n utxos,\n fromAddress: currentAddress,\n });\n }\n\n try {\n const codecManager = utils.getManagerForVM(vm);\n const signedTx = codecManager.unpack(txBytes, avaxSerial.SignedTx);\n\n if (evmSerial.isImportTx(tx)) {\n parsedTxInstance = await Avalanche.createAvalancheEvmUnsignedTx({\n txBytes,\n vm,\n utxos,\n fromAddress: currentAddress,\n });\n } else {\n parsedTxInstance = await Avalanche.createAvalancheUnsignedTx({\n tx,\n provider,\n credentials: signedTx.getCredentials(),\n utxos,\n });\n }\n\n // transaction has been already (partially) signed, but it may have gaps in its signatures arrays\n // so we fill these gaps with placeholder signatures if needed\n credentials = tx.getSigIndices().map(\n (sigIndices, credentialIndex) =>\n new Credential(\n Avalanche.populateCredential(sigIndices, {\n unsignedTx: parsedTxInstance,\n credentialIndex,\n }),\n ),\n );\n } catch (_err) {\n // transaction hasn't been signed yet thus we continue with a custom list of empty credentials\n // to ensure it contains a signature slot for all signature indices from the inputs\n credentials = tx.getSigIndices().map((indicies) => new Credential(Avalanche.populateCredential(indicies)));\n }\n\n return Avalanche.createAvalancheUnsignedTx({\n tx,\n provider,\n credentials,\n utxos,\n });\n};\n","import {\n NetworkVMType,\n type BuildDerivationPathParams,\n type BuildDerivationPathResponse,\n} from '@avalabs/vm-module-types';\nimport { rpcErrors } from '@metamask/rpc-errors';\n\nexport const buildDerivationPath = ({\n accountIndex,\n derivationPathType,\n addressIndex = 0,\n}: BuildDerivationPathParams): Pick<BuildDerivationPathResponse, NetworkVMType.AVM | NetworkVMType.CoreEth> => {\n if (accountIndex < 0) {\n throw rpcErrors.invalidParams('Account index must be a non-negative integer');\n }\n\n if (addressIndex !== undefined && addressIndex < 0) {\n throw rpcErrors.invalidParams('Address index must be a non-negative integer');\n }\n\n switch (derivationPathType) {\n case 'bip44':\n return {\n [NetworkVMType.AVM]: `m/44'/9000'/${accountIndex}'/0/${addressIndex}`,\n [NetworkVMType.CoreEth]: `m/44'/60'/0'/0/${accountIndex}`, // Must match the derivation path used by the EMV Module\n };\n\n case 'ledger_live':\n return {\n [NetworkVMType.AVM]: `m/44'/9000'/${accountIndex}'/0/${addressIndex}`,\n [NetworkVMType.CoreEth]: `m/44'/60'/${accountIndex}'/0/0`, // Must match the derivation path used by the EMV Module\n };\n\n default:\n throw rpcErrors.invalidParams(`Unsupported derivation path type: ${derivationPathType}`);\n }\n};\n","import type { ApprovalController, DeriveAddressParams, DeriveAddressResponse } from '@avalabs/vm-module-types';\nimport { NetworkVMType } from '@avalabs/vm-module-types';\n\nimport { hasDerivationDetails } from '@internal/utils/src/utils/address-derivation';\n\nimport { getProvider } from '../../utils/get-provider';\nimport { buildDerivationPath } from '../build-derivation-path/build-derivation-path';\n\nexport const deriveAddress = async (\n params: DeriveAddressParams & { approvalController: ApprovalController },\n): Promise<DeriveAddressResponse> => {\n const { approvalController, network, secretId } = params;\n\n // When dealing with single-account private keys, we don't need the derivation path any more.\n const xpDerivationPath = hasDerivationDetails(params) ? buildDerivationPath(params).AVM : undefined;\n const coreEthDerivationPath = hasDerivationDetails(params) ? buildDerivationPath(params).CoreEth : undefined;\n const provXP = await getProvider(network);\n\n const xpPublicKeyHex = await approvalController\n .requestPublicKey({\n curve: 'secp256k1',\n secretId,\n derivationPath: xpDerivationPath,\n })\n .catch(() => null);\n const coreEthPublicKeyHex = await approvalController\n .requestPublicKey({\n curve: 'secp256k1',\n secretId,\n derivationPath: coreEthDerivationPath,\n })\n .catch(() => null);\n\n // Resolve CoreEth address even if X/P public keys are not available\n const coreEthAddress = coreEthPublicKeyHex\n ? {\n [NetworkVMType.CoreEth]: provXP.getAddress(Buffer.from(coreEthPublicKeyHex, 'hex'), 'C'),\n }\n : {};\n\n const xpAddresses = xpPublicKeyHex\n ? {\n [NetworkVMType.AVM]: provXP.getAddress(Buffer.from(xpPublicKeyHex, 'hex'), 'X'),\n [NetworkVMType.PVM]: provXP.getAddress(Buffer.from(xpPublicKeyHex, 'hex'), 'P'),\n }\n : {};\n\n return {\n ...coreEthAddress,\n ...xpAddresses,\n };\n};\n","import type { DeriveAddressParams, DetailedDeriveAddressParams } from '@avalabs/vm-module-types';\n\nexport const hasDerivationDetails = (params: DeriveAddressParams): params is DetailedDeriveAddressParams =>\n 'derivationPathType' in params &&\n 'accountIndex' in params &&\n typeof params.accountIndex === 'number' &&\n typeof params.derivationPathType === 'string';\n","import type { ApprovalController, DeriveAddressesParams, DeriveAddressesResponse } from '@avalabs/vm-module-types';\nimport { NetworkVMType } from '@avalabs/vm-module-types';\nimport { deriveAddressesForAvalanche, init } from '@avalabs/crypto-sdk';\n\nimport { buildDerivationPath } from '../build-derivation-path/build-derivation-path';\n\nexport const deriveAddresses = async (\n params: DeriveAddressesParams & { approvalController: ApprovalController },\n): Promise<DeriveAddressesResponse> => {\n const { approvalController, network, secretId, accountIndices, derivationPathType, addressIndex } = params;\n\n if (accountIndices.length === 0) {\n return [];\n }\n\n await init();\n\n // crypto-sdk's deriveAddressesForAvalanche needs the X/P pubkey AND the EVM\n // pubkey (the latter drives the CoreEth bech32 — same path as the EVM module).\n // The avalanche buildDerivationPath's CoreEth entry already returns that EVM path.\n const pubkeyPairs = await Promise.all(\n accountIndices.map(async (accountIndex) => {\n const paths = buildDerivationPath({ accountIndex, derivationPathType, addressIndex });\n const [xpHex, evmHex] = await Promise.all([\n approvalController.requestPublicKey({\n curve: 'secp256k1',\n secretId,\n derivationPath: paths.AVM,\n }),\n approvalController.requestPublicKey({\n curve: 'secp256k1',\n secretId,\n derivationPath: paths.CoreEth,\n }),\n ]);\n return {\n xp: Uint8Array.from(Buffer.from(xpHex, 'hex')),\n evm: Uint8Array.from(Buffer.from(evmHex, 'hex')),\n };\n }),\n );\n\n const bundles = await deriveAddressesForAvalanche(\n pubkeyPairs.map((p) => p.xp),\n pubkeyPairs.map((p) => p.evm),\n Boolean(network.isTestnet),\n );\n\n return bundles.map((b) => ({\n [NetworkVMType.AVM]: b.x,\n [NetworkVMType.PVM]: b.p,\n [NetworkVMType.CoreEth]: b.coreEth,\n }));\n};\n","import type { GetAddressParams, GetAddressResponse } from '@avalabs/vm-module-types';\nimport { Avalanche } from '@avalabs/core-wallets-sdk';\nimport { NetworkVMType, WalletType } from '@avalabs/vm-module-types';\nimport { rpcErrors } from '@metamask/rpc-errors';\nimport { getProvider } from '../../utils/get-provider';\n\ntype GetAddress = Omit<GetAddressParams, 'xpub'>;\n\nexport const getAddress = async ({\n accountIndex,\n xpubXP,\n walletType,\n network,\n}: GetAddress): Promise<GetAddressResponse> => {\n if (!network) {\n throw rpcErrors.invalidParams('network is required to get address');\n }\n\n if (xpubXP === undefined) {\n throw rpcErrors.invalidParams('xpubXP is required to get address');\n }\n\n const provXP = await getProvider(network);\n let xpPub: Buffer;\n\n switch (walletType) {\n case WalletType.Mnemonic:\n case WalletType.Ledger:\n case WalletType.Keystone: {\n // X and P addresses different derivation path m/44'/9000'/0'...\n xpPub = Avalanche.getAddressPublicKeyFromXpub(xpubXP, accountIndex);\n break;\n }\n case WalletType.LedgerLive:\n case WalletType.Seedless: {\n xpPub = Buffer.from(xpubXP, 'hex');\n break;\n }\n default:\n throw rpcErrors.invalidParams(`Unsupported wallet type: ${walletType}`);\n }\n\n return {\n [NetworkVMType.AVM]: provXP.getAddress(xpPub, 'X'),\n [NetworkVMType.PVM]: provXP.getAddress(xpPub, 'P'),\n };\n};\n","import {\n NetworkVMType,\n type GetBalancesParams,\n type TokenWithBalanceAVM,\n type TokenWithBalancePVM,\n} from '@avalabs/vm-module-types';\nimport { type AvalancheGlacierService } from '../../services/glacier-service/glacier-service';\nimport {\n BlockchainId,\n Network,\n type ListPChainBalancesResponse,\n type ListXChainBalancesResponse,\n} from '@avalabs/glacier-sdk';\nimport type { TokenService } from '@internal/utils';\nimport { VsCurrencyType } from '@avalabs/core-coingecko-sdk';\nimport { isPchainBalance, isXchainBalance } from './utils';\nimport { convertPChainBalance } from './convert-p-chain-balance';\nimport { convertXChainBalance } from './covnert-x-chain-balance';\nimport { getProvider } from '../../utils/get-provider';\n\ntype GetAvalancheBalancesResponse = Record<string, Record<string, TokenWithBalanceAVM | TokenWithBalancePVM>>;\n\nexport const getBalances = async ({\n addresses,\n currency,\n network,\n glacierService,\n tokenService,\n}: GetBalancesParams & {\n glacierService: AvalancheGlacierService;\n tokenService: TokenService;\n}): Promise<GetAvalancheBalancesResponse> => {\n const provider = await getProvider(network);\n const isHealthy = glacierService.isHealthy();\n if (!isHealthy) {\n return Promise.reject('Glacier is unhealthy. Try again later.');\n }\n\n const lowercaseCurrency = currency.toLowerCase();\n const address = addresses[0] ?? '';\n const networkToken = network.networkToken;\n const coingeckoId = network.pricingProviders?.coingecko.nativeTokenId;\n\n const blockchainId = network.vmName === NetworkVMType.PVM ? BlockchainId.P_CHAIN : BlockchainId.X_CHAIN;\n const glacierNetwork = network.isDevnet ? null : network.isTestnet ? Network.FUJI : Network.MAINNET;\n\n if (!glacierNetwork) {\n return Promise.reject('Glacier does not supported local devnets');\n }\n\n const chainBalances = await glacierService\n .getChainBalance({\n blockchainId,\n network: glacierNetwork,\n addresses: addresses.join(','),\n })\n .then((value) => (value as ListPChainBalancesResponse | ListXChainBalancesResponse).balances);\n\n const priceData = await tokenService.getWatchlistDataForToken({\n tokenDetails: {\n symbol: network.networkToken.symbol,\n isNative: true,\n caip2Id: network.caipId ?? '',\n },\n currency: lowercaseCurrency as VsCurrencyType,\n });\n\n let balance: TokenWithBalanceAVM | TokenWithBalancePVM;\n if (isPchainBalance(chainBalances)) {\n balance = convertPChainBalance({\n balance: chainBalances,\n networkToken,\n priceInCurrency: priceData.priceInCurrency ?? undefined,\n marketCap: priceData.marketCap ?? undefined,\n vol24: priceData.vol24 ?? undefined,\n change24: priceData.change24 ?? undefined,\n coingeckoId: coingeckoId ?? '',\n avaxAssetId: provider.getContext().avaxAssetID,\n });\n\n return {\n [address]: {\n [networkToken.symbol]: balance,\n },\n };\n }\n\n if (isXchainBalance(chainBalances)) {\n balance = convertXChainBalance({\n balance: chainBalances,\n networkToken,\n priceInCurrency: priceData.priceInCurrency ?? undefined,\n marketCap: priceData.marketCap ?? undefined,\n vol24: priceData.vol24 ?? undefined,\n change24: priceData.change24 ?? undefined,\n coingeckoId: coingeckoId ?? '',\n avaxAssetId: provider.getContext().avaxAssetID,\n });\n return {\n [address]: {\n [networkToken.symbol]: balance,\n },\n };\n }\n return Promise.reject('Incorrect type balance was returned from glacier');\n};\n","import {\n BlockchainId,\n Glacier,\n type ListCChainAtomicBalancesResponse,\n type ListCChainAtomicTransactionsResponse,\n type ListPChainBalancesResponse,\n type ListPChainTransactionsResponse,\n type ListXChainBalancesResponse,\n type ListXChainTransactionsResponse,\n Network,\n PrimaryNetworkTxType,\n SortOrder,\n} from '@avalabs/glacier-sdk';\nimport { GlacierFetchHttpRequest } from '@internal/utils';\n\nclass GlacierUnhealthyError extends Error {\n override message = 'Glacier is unhealthy. Try again later.';\n}\n\nexport class AvalancheGlacierService {\n glacierSdk: Glacier;\n isGlacierHealthy = true;\n\n constructor({\n glacierApiUrl,\n headers,\n getAuthHeaders,\n }: {\n glacierApiUrl: string;\n headers?: Record<string, string>;\n /**\n * Resolves per-request auth headers (e.g. a Firebase AppCheck token) required\n * by the Glacier proxy. Merged over the static `headers`.\n */\n getAuthHeaders?: () => Promise<Record<string, string> | undefined>;\n }) {\n this.glacierSdk = new Glacier(\n {\n BASE: glacierApiUrl,\n HEADERS: getAuthHeaders ? async () => ({ ...headers, ...(await getAuthHeaders()) }) : headers,\n },\n GlacierFetchHttpRequest,\n );\n }\n\n isHealthy = (): boolean => this.isGlacierHealthy;\n\n setGlacierToUnhealthy(): void {\n this.isGlacierHealthy = false;\n setTimeout(\n () => {\n this.isGlacierHealthy = true;\n },\n 5 * 60 * 1000,\n ); // 5 minutes\n }\n\n async listLatestPrimaryNetworkTransactions(params: {\n blockchainId: BlockchainId;\n network: Network;\n addresses?: string;\n txTypes?: Array<PrimaryNetworkTxType>;\n startTimestamp?: number;\n endTimestamp?: number;\n pageToken?: string;\n pageSize?: number;\n sortOrder?: SortOrder;\n }): Promise<ListPChainTransactionsResponse | ListXChainTransactionsResponse | ListCChainAtomicTransactionsResponse> {\n try {\n return this.glacierSdk.primaryNetworkTransactions.listLatestPrimaryNetworkTransactions(params);\n } catch (error) {\n if (error instanceof GlacierUnhealthyError) {\n this.setGlacierToUnhealthy();\n }\n throw error;\n }\n }\n\n async getChainBalance(params: {\n blockchainId: BlockchainId;\n network: Network;\n blockTimestamp?: number;\n addresses?: string;\n }): Promise<ListPChainBalancesResponse | ListXChainBalancesResponse | ListCChainAtomicBalancesResponse> {\n try {\n return this.glacierSdk.primaryNetworkBalances.getBalancesByAddresses(params);\n } catch (error) {\n if (error instanceof GlacierUnhealthyError) {\n this.setGlacierToUnhealthy();\n }\n throw error;\n }\n }\n}\n","import type {\n AggregatedAssetAmount,\n PChainBalance,\n PChainSharedAsset,\n XChainBalances,\n XChainSharedAssetBalance,\n} from '@avalabs/glacier-sdk';\n\nexport const isPchainBalance = (balanceResult: PChainBalance | XChainBalances): balanceResult is PChainBalance => {\n return Object.keys(balanceResult).includes('unlockedUnstaked');\n};\n\nexport const isXchainBalance = (balanceResult: PChainBalance | XChainBalances): balanceResult is XChainBalances => {\n return Object.keys(balanceResult).includes('locked');\n};\n\ntype BalanceAsset = AggregatedAssetAmount | PChainSharedAsset | XChainSharedAssetBalance;\n\nconst sumAvaxFromAssets = (assets: BalanceAsset[] | undefined, avaxAssetId: string): bigint => {\n if (!assets?.length) {\n return 0n;\n }\n\n return assets.reduce((total, asset) => {\n if (asset.assetId !== avaxAssetId) {\n return total;\n }\n\n return total + BigInt(asset.amount);\n }, 0n);\n};\n\nexport function calculateAvaxTotalBalance(balances: PChainBalance | XChainBalances, avaxAssetId: string): bigint {\n if (isPchainBalance(balances)) {\n const balanceArrays = [\n ...(balances.unlockedUnstaked || []),\n ...(balances.unlockedStaked || []),\n ...(balances.pendingStaked || []),\n ...(balances.lockedStaked || []),\n ...(balances.lockedStakeable || []),\n ...(balances.lockedPlatform || []),\n ...(balances.atomicMemoryLocked || []),\n ...(balances.atomicMemoryUnlocked || []),\n ];\n\n const arrayTotal = sumAvaxFromAssets(balanceArrays, avaxAssetId);\n\n const restakedRewards = balances.restakedRewards ? BigInt(balances.restakedRewards) : 0n;\n\n return arrayTotal + restakedRewards;\n }\n\n const balanceArrays = [\n ...(balances.unlocked || []),\n ...(balances.locked || []),\n ...(balances.atomicMemoryUnlocked || []),\n ...(balances.atomicMemoryLocked || []),\n ];\n\n return sumAvaxFromAssets(balanceArrays, avaxAssetId);\n}\n","import type { AggregatedAssetAmount, PChainBalance } from '@avalabs/glacier-sdk';\nimport { TokenUnit } from '@avalabs/core-utils-sdk';\nimport { calculateAvaxTotalBalance } from './utils';\nimport { type NetworkToken, TokenType, type TokenWithBalancePVM } from '@avalabs/vm-module-types';\n\nexport const convertPChainBalance = ({\n balance,\n networkToken,\n priceInCurrency,\n marketCap,\n vol24,\n change24,\n coingeckoId,\n avaxAssetId,\n}: {\n balance: PChainBalance;\n networkToken: NetworkToken;\n priceInCurrency?: number;\n marketCap?: number;\n vol24?: number;\n change24?: number;\n coingeckoId: string;\n avaxAssetId: string;\n}): TokenWithBalancePVM => {\n const balancePerType: Record<string, bigint> = {};\n\n const balanceTypes: Record<string, AggregatedAssetAmount[]> = {\n unlockedUnstaked: balance.unlockedUnstaked,\n unlockedStaked: balance.unlockedStaked,\n pendingStaked: balance.pendingStaked,\n lockedStaked: balance.lockedStaked,\n lockedStakeable: balance.lockedStakeable,\n lockedPlatform: balance.lockedPlatform,\n atomicMemoryLocked: balance.atomicMemoryLocked,\n atomicMemoryUnlocked: balance.atomicMemoryUnlocked,\n };\n\n for (const balanceType in balanceTypes) {\n const balancesToAdd = balanceTypes[balanceType];\n if (!balancesToAdd || !balancesToAdd.length) {\n balancePerType[balanceType] = 0n;\n continue;\n }\n\n balancesToAdd.forEach((utxo: AggregatedAssetAmount) => {\n if (utxo.assetId !== avaxAssetId) {\n return;\n }\n const previousBalance = balancePerType[balanceType] ?? 0n;\n const newBalance = previousBalance + BigInt(utxo.amount);\n balancePerType[balanceType] = newBalance;\n });\n }\n\n const available = new TokenUnit(\n balancePerType['unlockedUnstaked'] ? balancePerType['unlockedUnstaked'] : 0n,\n networkToken.decimals,\n networkToken.symbol,\n );\n const availableInCurrency = priceInCurrency\n ? available.mul(priceInCurrency).toDisplay({ fixedDp: 2, asNumber: true })\n : undefined;\n const totalBalance = new TokenUnit(\n calculateAvaxTotalBalance(balance, avaxAssetId),\n networkToken.decimals,\n networkToken.symbol,\n );\n const balanceInCurrency = priceInCurrency\n ? totalBalance.mul(priceInCurrency).toDisplay({ fixedDp: 2, asNumber: true })\n : undefined;\n\n return {\n ...networkToken,\n type: TokenType.NATIVE,\n priceInCurrency,\n balance: totalBalance.toSubUnit(),\n balanceInCurrency,\n balanceDisplayValue: totalBalance.toDisplay(),\n balanceCurrencyDisplayValue: balanceInCurrency?.toFixed(2),\n available: available.toSubUnit(),\n availableInCurrency,\n availableDisplayValue: available.toDisplay(),\n availableCurrencyDisplayValue: availableInCurrency?.toFixed(2),\n utxos: balance,\n balancePerType: {\n lockedStaked: balancePerType['lockedStaked'],\n lockedStakeable: balancePerType['lockedStakeable'],\n lockedPlatform: balancePerType['lockedPlatform'],\n atomicMemoryLocked: balancePerType['atomicMemoryLocked'],\n atomicMemoryUnlocked: balancePerType['atomicMemoryUnlocked'],\n unlockedUnstaked: balancePerType['unlockedUnstaked'],\n unlockedStaked: balancePerType['unlockedStaked'],\n pendingStaked: balancePerType['pendingStaked'],\n },\n marketCap,\n vol24,\n change24,\n coingeckoId,\n };\n};\n","import type { AggregatedAssetAmount, XChainBalances } from '@avalabs/glacier-sdk';\nimport { TokenUnit } from '@avalabs/core-utils-sdk';\nimport { calculateAvaxTotalBalance } from './utils';\nimport { TokenType, type NetworkToken, type TokenWithBalanceAVM } from '@avalabs/vm-module-types';\n\nexport const convertXChainBalance = ({\n balance,\n networkToken,\n priceInCurrency,\n marketCap,\n vol24,\n change24,\n coingeckoId,\n avaxAssetId,\n}: {\n balance: XChainBalances;\n networkToken: NetworkToken;\n priceInCurrency?: number;\n marketCap?: number;\n vol24?: number;\n change24?: number;\n coingeckoId: string;\n avaxAssetId: string;\n}): TokenWithBalanceAVM => {\n const balancePerType: Record<string, bigint> = {};\n\n const balanceTypes: Record<string, AggregatedAssetAmount[]> = {\n unlocked: balance.unlocked,\n locked: balance.locked,\n atomicMemoryUnlocked: balance.atomicMemoryUnlocked,\n atomicMemoryLocked: balance.atomicMemoryLocked,\n };\n\n for (const balanceType in balanceTypes) {\n const balancesToAdd = balanceTypes[balanceType];\n if (!balancesToAdd || !balancesToAdd.length) {\n balancePerType[balanceType] = 0n;\n continue;\n }\n\n balancesToAdd.forEach((utxo: AggregatedAssetAmount) => {\n // Skip non-AVAX assets\n if (utxo.assetId !== avaxAssetId) {\n return;\n }\n const previousBalance = balancePerType[balanceType] ?? 0n;\n const newBalance = previousBalance + BigInt(utxo.amount);\n balancePerType[balanceType] = newBalance;\n });\n }\n\n const available = new TokenUnit(\n balancePerType['unlocked'] ? balancePerType['unlocked'] : 0n,\n networkToken.decimals,\n networkToken.symbol,\n );\n const availableInCurrency = priceInCurrency\n ? available.mul(priceInCurrency).toDisplay({ fixedDp: 2, asNumber: true })\n : undefined;\n const totalBalance = new TokenUnit(\n calculateAvaxTotalBalance(balance, avaxAssetId),\n networkToken.decimals,\n networkToken.symbol,\n );\n const balanceInCurrency = priceInCurrency !== undefined ? totalBalance.mul(priceInCurrency) : undefined;\n\n return {\n ...networkToken,\n coingeckoId,\n type: TokenType.NATIVE,\n priceInCurrency,\n balance: totalBalance.toSubUnit(),\n balanceInCurrency: balanceInCurrency?.toDisplay({ fixedDp: 2, asNumber: true }),\n balanceDisplayValue: totalBalance.toDisplay(),\n balanceCurrencyDisplayValue: balanceInCurrency?.toDisplay({ fixedDp: 2 }),\n available: available.toSubUnit(),\n availableInCurrency,\n availableDisplayValue: available.toDisplay(),\n availableCurrencyDisplayValue: availableInCurrency?.toFixed(2),\n utxos: balance,\n balancePerType: {\n unlocked: balancePerType['unlocked'],\n locked: balancePerType['locked'],\n atomicMemoryUnlocked: balancePerType['atomicMemoryUnlocked'],\n atomicMemoryLocked: balancePerType['atomicMemoryLocked'],\n },\n marketCap,\n vol24,\n change24,\n };\n};\n","import { NetworkVMType, type Network, type NetworkFees } from '@avalabs/vm-module-types';\nimport { getProvider } from '../../utils/get-provider';\n\n/**\n * Returns {@link NetworkFees} based on a fixed fee.\n */\nexport async function getNetworkFee(network: Network): Promise<NetworkFees> {\n const { vmName } = network;\n const provider = await getProvider(network);\n\n // Return static fees for X-Chain\n if (vmName === NetworkVMType.AVM) {\n // this is 0.001 Avax denominated in nAvax, taken from https://docs.avax.network/reference/standards/guides/txn-fees#fee-schedule\n return {\n baseFee: BigInt(1000000),\n low: {\n maxFeePerGas: BigInt(1000000),\n },\n medium: {\n maxFeePerGas: BigInt(1000000),\n },\n high: {\n maxFeePerGas: BigInt(1000000),\n },\n isFixedFee: true,\n };\n }\n\n const { price } = await provider.getApiP().getFeeState();\n\n // This represents how much (percentage-wise) you need to bump the base fee\n // to get to the next integer (since we operate with BigInts here)\n const minimumPercentageBump = 100 / Number(price) / 100;\n\n // Added percentages for faster presets\n const fastPCentage = Math.min(1, Math.max(minimumPercentageBump, 0.15));\n const instPCentage = Math.min(1, Math.max(minimumPercentageBump * 2, 0.3));\n\n const fastMultiplier = 1 + fastPCentage; // Adds between 15 and 100%\n const instantMultiplier = 1 + instPCentage; // Adds between 30 and 100%\n\n // Even though the hard-coded percentages would end up being integers after\n // multiplying by 100x, we still need to round due to floating point precision errors.\n return {\n baseFee: price,\n low: {\n maxFeePerGas: price,\n },\n medium: {\n maxFeePerGas: (price * BigInt(Math.round(100 * fastMultiplier))) / 100n,\n },\n high: {\n maxFeePerGas: (price * BigInt(Math.round(100 * instantMultiplier))) / 100n,\n },\n isFixedFee: false,\n };\n}\n","import type { GetTransactionHistory, Transaction, TransactionHistoryResponse } from '@avalabs/vm-module-types';\nimport { BlockchainId, Network, SortOrder } from '@avalabs/glacier-sdk';\nimport { isPChainTransactions, isXChainTransactions } from './utils';\nimport { convertPChainTransaction } from './convert-p-chain-transaction';\nimport { convertXChainTransaction } from './convert-x-chain-transaction';\nimport type { AvalancheGlacierService } from '../../services/glacier-service/glacier-service';\n\nexport const getTransactionHistory = async ({\n address,\n nextPageToken,\n offset,\n network,\n glacierService,\n}: GetTransactionHistory & { glacierService: AvalancheGlacierService }): Promise<TransactionHistoryResponse> => {\n const { isTestnet, networkToken, explorerUrl, chainId } = network;\n const isHealthy = glacierService.isHealthy();\n if (!isHealthy) {\n return {\n transactions: [],\n nextPageToken: '',\n };\n }\n\n const glacierNetwork = network.isTestnet ? Network.FUJI : Network.MAINNET;\n const response = await glacierService.listLatestPrimaryNetworkTransactions({\n addresses: address,\n blockchainId: getBlockchainIdByAddress(address),\n network: glacierNetwork,\n pageSize: offset,\n pageToken: nextPageToken,\n sortOrder: SortOrder.DESC,\n });\n\n let transactions: Transaction[] = [];\n if (isPChainTransactions(response)) {\n transactions = response.transactions.map((value) =>\n convertPChainTransaction({ tx: value, isTestnet, address, networkToken, explorerUrl, chainId }),\n );\n }\n if (isXChainTransactions(response)) {\n transactions = response.transactions.map((value) =>\n convertXChainTransaction({ tx: value, isTestnet, address, networkToken, explorerUrl, chainId }),\n );\n }\n\n return {\n transactions,\n nextPageToken: response.nextPageToken,\n };\n};\n\nconst getBlockchainIdByAddress = (address: string) => {\n // A comma separated list of X-Chain or P-Chain wallet addresses,\n // starting with \"avax\"/\"fuji\", \"P-avax\"/\"P-fuji\" or \"X-avax\"/\"X-fuji\"\n const firstAddress = address.split(',')[0];\n if (firstAddress?.toLowerCase().startsWith('p-')) {\n return BlockchainId.P_CHAIN;\n }\n return BlockchainId.X_CHAIN;\n};\n","import { type PChainTransaction, type NetworkToken } from '@avalabs/glacier-sdk';\nimport Big from 'big.js';\nimport { Avalanche } from '@avalabs/core-wallets-sdk';\nimport { TokenType, type Transaction } from '@avalabs/vm-module-types';\nimport { getExplorerAddressByNetwork, getTokenValue } from './utils';\n\nexport function convertPChainTransaction({\n tx,\n address,\n networkToken,\n chainId,\n explorerUrl,\n isTestnet,\n}: {\n tx: PChainTransaction;\n address: string;\n networkToken: NetworkToken;\n chainId: number;\n explorerUrl?: string;\n isTestnet?: boolean;\n}): Transaction {\n const froms = new Set(tx.consumedUtxos.flatMap((utxo) => utxo.addresses) || []);\n const tos = new Set(tx.emittedUtxos.flatMap((utxo) => utxo.addresses) || []);\n\n const amount = getAmount({\n tx,\n isTestnet,\n networkToken,\n froms,\n });\n\n const avaxBurnedAmount = getBurnedAmount({ tx, isTestnet, networkToken });\n const chainAddress = address.toLowerCase().startsWith('p-') ? address.slice(2) : address;\n const isSender = froms.has(chainAddress);\n\n return {\n hash: tx.txHash,\n isContractCall: false,\n isIncoming: !isSender,\n isOutgoing: isSender,\n from: [...froms.values()].join(','),\n to: [...tos.values()].join(','),\n isSender,\n timestamp: tx.blockTimestamp * 1000, // to millis\n tokens: [\n {\n decimal: networkToken.decimals.toString(),\n name: networkToken.name,\n symbol: networkToken.symbol,\n type: TokenType.NATIVE,\n amount: amount.toString(),\n },\n ],\n gasUsed: avaxBurnedAmount.toString(),\n explorerLink: getExplorerAddressByNetwork(explorerUrl ?? '', tx.txHash, 'tx'),\n txType: tx.txType,\n chainId: chainId.toString(),\n };\n}\n\nfunction getAmount({\n tx,\n isTestnet,\n networkToken,\n froms,\n}: {\n tx: PChainTransaction;\n isTestnet?: boolean;\n networkToken: NetworkToken;\n froms: Set<string>;\n}): Big {\n const isImportExport = ['ImportTx', 'ExportTx'].includes(tx.txType);\n const isBaseTx = tx.txType === 'BaseTx';\n\n const nonChangeEmittedUtxosAmt = tx.emittedUtxos\n .filter(\n (utxo) => utxo.asset.assetId === getAvaxAssetId(!!isTestnet) && !utxo.addresses.some((addr) => froms.has(addr)),\n )\n .reduce((agg, utxo) => agg.add(utxo.asset.amount), new Big(0));\n const txValue = tx.value.find((val) => val.assetId === getAvaxAssetId(!!isTestnet))?.amount;\n // This ternary attempts to cover the case where users send themselves AVAX\n // in which case the senders are the recipients and we should use the total tx value.\n const baseTxValue = nonChangeEmittedUtxosAmt.gt(new Big(0))\n ? nonChangeEmittedUtxosAmt\n : txValue\n ? new Big(txValue)\n : new Big(0) ?? new Big(0);\n\n const pBlockchainId = isTestnet ? Avalanche.FujiContext.pBlockchainID : Avalanche.MainnetContext.pBlockchainID;\n\n const importExportAmount = tx.emittedUtxos\n .filter(\n (utxo) =>\n utxo.asset.assetId === getAvaxAssetId(!!isTestnet) &&\n ((tx.txType === 'ImportTx' && utxo.consumedOnChainId === pBlockchainId) ||\n (tx.txType === 'ExportTx' && utxo.consumedOnChainId !== pBlockchainId)),\n )\n .reduce((agg, utxo) => agg.add(utxo.amount), new Big(0));\n const nAvaxAmount = isBaseTx\n ? baseTxValue\n : isImportExport\n ? importExportAmount\n : tx.amountStaked.length === 0\n ? aggregateValue(tx.value, !!isTestnet)\n : aggregateValue(tx.amountStaked, !!isTestnet);\n return getTokenValue({ amount: nAvaxAmount?.toNumber(), decimals: networkToken.decimals });\n}\n\nfunction getBurnedAmount({\n tx,\n isTestnet,\n networkToken,\n}: {\n tx: PChainTransaction;\n isTestnet?: boolean;\n networkToken: NetworkToken;\n}): Big {\n const nAvaxFee = tx.amountBurned\n ?.filter((value) => value.assetId === getAvaxAssetId(!!isTestnet))\n .reduce((accumulator, value) => accumulator.add(value.amount), new Big(0));\n return getTokenValue({ amount: nAvaxFee?.toNumber(), decimals: networkToken.decimals });\n}\n\nfunction aggregateValue(value: PChainTransaction['value'], isTestnet: boolean): Big | undefined {\n return value\n .filter((value_) => value_.assetId === getAvaxAssetId(isTestnet))\n .reduce((accumulator, value_) => accumulator.add(value_.amount), new Big(0));\n}\n\nfunction getAvaxAssetId(isTestnet: boolean): string {\n return isTestnet ? Avalanche.FujiContext.avaxAssetID : Avalanche.MainnetContext.avaxAssetID;\n}\n","import { type NetworkToken, XChainNonLinearTransaction, XChainLinearTransaction } from '@avalabs/glacier-sdk';\nimport Big from 'big.js';\nimport { Avalanche } from '@avalabs/core-wallets-sdk';\nimport { TokenType, type Transaction } from '@avalabs/vm-module-types';\nimport { getExplorerAddressByNetwork, getTokenValue } from './utils';\n\nexport function convertXChainTransaction({\n tx,\n address,\n networkToken,\n chainId,\n explorerUrl,\n isTestnet,\n}: {\n tx: XChainNonLinearTransaction | XChainLinearTransaction;\n address: string;\n networkToken: NetworkToken;\n chainId: number;\n isTestnet?: boolean;\n explorerUrl?: string;\n}): Transaction {\n const froms = new Set(tx.consumedUtxos.flatMap((utxo) => utxo.addresses) || []);\n const tos = new Set(tx.emittedUtxos.flatMap((utxo) => utxo.addresses) || []);\n const chainAddress = address.toLowerCase().startsWith('x-') ? address.slice(2) : address;\n const isImportExport = ['ImportTx', 'ExportTx'].includes(tx.txType);\n\n const { amount: amountSpent, isSender } = getAmount({\n tx,\n isTestnet,\n networkToken,\n chainAddress,\n isImportExport,\n });\n const avaxBurnedAmount = getBurnedAmount({ isTestnet, tx, networkToken });\n const amountToDisplay = isImportExport\n ? amountSpent.toString()\n : isSender\n ? amountSpent.minus(avaxBurnedAmount).toString()\n : amountSpent.toString();\n\n return {\n hash: tx.txHash,\n isContractCall: false,\n isIncoming: !isSender,\n isOutgoing: isSender,\n from: [...froms.values()].join(','),\n to: [...tos.values()].join(','),\n isSender,\n timestamp: tx.timestamp * 1000, // to millis\n tokens: [\n {\n decimal: networkToken.decimals.toString(),\n name: networkToken.name,\n symbol: networkToken.symbol,\n type: TokenType.NATIVE,\n amount: amountToDisplay,\n },\n ],\n gasUsed: avaxBurnedAmount.toString(),\n explorerLink: getExplorerAddressByNetwork(explorerUrl ?? '', tx.txHash, 'tx'),\n txType: tx.txType,\n chainId: chainId.toString(),\n };\n}\n\nfunction getAmount({\n tx,\n isTestnet,\n networkToken,\n chainAddress,\n isImportExport,\n}: {\n tx: XChainNonLinearTransaction | XChainLinearTransaction;\n isTestnet?: boolean;\n networkToken: NetworkToken;\n chainAddress: string;\n isImportExport: boolean;\n}): { amount: Big; isSender: boolean } {\n if (isImportExport) {\n const xBlockchainId = isTestnet ? Avalanche.FujiContext.xBlockchainID : Avalanche.MainnetContext.xBlockchainID;\n const amount = tx.emittedUtxos\n .filter(\n (utxo) =>\n utxo.asset.assetId === getAvaxAssetId(!!isTestnet) &&\n ((tx.txType === 'ImportTx' && utxo.consumedOnChainId === xBlockchainId) ||\n (tx.txType === 'ExportTx' && utxo.consumedOnChainId !== xBlockchainId)),\n )\n .reduce((agg, utxo) => agg.add(utxo.asset.amount), new Big(0));\n\n return { amount: getTokenValue({ amount: amount.toNumber(), decimals: networkToken.decimals }), isSender: true };\n }\n\n const consumedAmountOfAddress = tx.consumedUtxos\n .filter((utxo) => utxo.asset.assetId === getAvaxAssetId(!!isTestnet) && utxo.addresses.includes(chainAddress))\n .reduce((accumulator, utxo) => accumulator.add(utxo.asset.amount), new Big(0));\n\n const changeAmountOfAddress = tx.emittedUtxos\n .filter((utxo) => utxo.asset.assetId === getAvaxAssetId(!!isTestnet) && utxo.addresses.includes(chainAddress))\n .reduce((accumulator, utxo) => accumulator.add(utxo.asset.amount), new Big(0));\n\n const isSender = consumedAmountOfAddress.gte(changeAmountOfAddress);\n const amount = isSender\n ? consumedAmountOfAddress.minus(changeAmountOfAddress)\n : changeAmountOfAddress.minus(consumedAmountOfAddress);\n\n return {\n amount: getTokenValue({\n amount: amount.toNumber(),\n decimals: networkToken.decimals,\n }),\n isSender,\n };\n}\n\nfunction getBurnedAmount({\n isTestnet,\n tx,\n networkToken,\n}: {\n isTestnet?: boolean;\n tx: XChainNonLinearTransaction | XChainLinearTransaction;\n networkToken: NetworkToken;\n}): Big {\n const totalAmountUnlocked = tx.amountUnlocked\n .filter((asset) => asset.assetId === getAvaxAssetId(!!isTestnet))\n .reduce((accumulator, asset) => accumulator.add(asset.amount), new Big(0));\n const totalAmountCreated = tx.amountCreated\n .filter((asset) => asset.assetId === getAvaxAssetId(!!isTestnet))\n .reduce((accumulator, asset) => accumulator.add(asset.amount), new Big(0));\n const nAvaxFee = totalAmountUnlocked.minus(totalAmountCreated);\n return getTokenValue({ amount: nAvaxFee.toNumber(), decimals: networkToken.decimals });\n}\n\nfunction getAvaxAssetId(isTestnet: boolean): string {\n return isTestnet ? Avalanche.FujiContext.avaxAssetID : Avalanche.MainnetContext.avaxAssetID;\n}\n","import Crypto from 'crypto';\n\n//github.com/gergelylovas/chain-agnostic-namespaces/pull/1/files#diff-cf7185539a48e85d069d194c1c17d7cfa0317b3caa3a89c92e797e3717e49d59R40\nexport function hashBlockchainId({ blockchainId, isTestnet }: { blockchainId: string; isTestnet?: boolean }): string {\n const blockChainIdWithPrefix = isTestnet ? 'fuji' + blockchainId : blockchainId;\n const base64 = Crypto.createHash('sha256').update(blockChainIdWithPrefix).digest('base64');\n const hash = convertBase64ToBase64Url(base64).substring(0, 32);\n return 'avax:' + hash;\n}\n\nconst convertBase64ToBase64Url = (base64: string) => base64.replace(/\\+/g, '-').replace(/\\//g, '_').replace(/=/g, '');\n","import type { TokenWithBalance, TokenWithBalanceAVM, TokenWithBalancePVM } from '@avalabs/vm-module-types';\n\nexport const isTokenWithBalancePVM = (token: TokenWithBalance): token is TokenWithBalancePVM => {\n return 'balancePerType' in token && 'unlockedUnstaked' in token.balancePerType;\n};\n\nexport const isTokenWithBalanceAVM = (token: TokenWithBalance): token is TokenWithBalanceAVM => {\n return 'balancePerType' in token && 'unlocked' in token.balancePerType;\n};\n"]}