@avalabs/avalanche-module 0.7.2 → 0.7.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +21 -21
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +5 -5
- package/dist/index.js.map +1 -1
- package/package.json +4 -4
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/module.ts","../manifest.json","../src/handlers/get-network-fee/get-network-fee.ts","../src/handlers/get-transaction-history/get-transaction-history.ts","../src/handlers/get-transaction-history/utils.ts","../src/handlers/get-transaction-history/convert-p-chain-transaction.ts","../src/handlers/get-transaction-history/convert-x-chain-transaction.ts","../src/env.ts","../src/services/glacier-service/glacier-service.ts","../../../packages-internal/utils/src/services/token-service/token-service.ts","../../../packages-internal/utils/src/utils/retry.ts","../../../packages-internal/utils/src/utils/coingecko-retry.ts","../../../packages-internal/utils/src/utils/charsum.ts","../../../packages-internal/utils/src/utils/array-hash.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/pricing-service/exchange-rates.ts","../../../packages-internal/utils/src/utils/detail-item.ts","../../../packages-internal/utils/src/utils/get-core-headers.ts","../src/handlers/get-balances/get-balances.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/utils/hash-blockchain-id.ts","../src/handlers/get-address/get-address.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-send-transaction/avalanche-send-transaction.ts","../src/handlers/avalanche-send-transaction/schema.ts","../src/utils/get-provider.ts","../src/handlers/avalanche-send-transaction/utils/get-provided-utxos.ts","../src/handlers/avalanche-send-transaction/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/handlers/avalanche-send-transaction/typeguards.ts","../src/utils/get-transaction-detail-sections.ts","../src/handlers/avalanche-send-transaction/utils/is-primary-subnet.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/get-balances/typeguards.ts"],"names":["parseManifest","RpcMethod","rpcErrors","manifest_default","getNetworkFee","BlockchainId","Network","SortOrder","PrimaryNetworkChainName","Big","isPChainTransactions","value","isXChainTransactions","getExplorerAddressByNetwork","explorerUrl","hash","hashType","getTokenValue","amount","decimals","Avalanche","TokenType","convertPChainTransaction","tx","address","networkToken","chainId","isTestnet","froms","utxo","tos","getAmount","avaxBurnedAmount","getBurnedAmount","chainAddress","isSender","isImportExport","isBaseTx","nonChangeEmittedUtxosAmt","getAvaxAssetId","addr","agg","txValue","val","baseTxValue","pBlockchainId","importExportAmount","nAvaxAmount","aggregateValue","nAvaxFee","accumulator","value_","convertXChainTransaction","xBlockchainId","totalAmountCreated","asset","getTransactionHistory","nextPageToken","offset","network","glacierService","response","getBlockchainIdByAddress","transactions","Environment","prodEnv","devEnv","getEnv","environment","Glacier","GlacierUnhealthyError","__publicField","AvalancheGlacierService","glacierApiUrl","headers","params","error","VsCurrencyType","getBasicCoingeckoHttp","simplePrice","simpleTokenPrice","retry","operation","isSuccess","maxRetries","backoffPolicy","RetryBackoffPolicy","backoffPeriodMillis","retries","lastError","delay","result","err","errorMessage","retryIndex","secondsToDelay","_","msToDelay","ms","r","coingeckoRetry","charsum","s","i","sum","arrayHash","array","cs","RawSimplePriceResponseSchema","SimplePriceResponseSchema","fetchAndVerify","fetchOptions","schema","responseJson","CoingeckoProxyClient","proxyApiUrl","queryParams","id","rawQueryParams","coingeckoBasicClient","_storage","_proxyApiUrl","TokenService","storage","__privateAdd","data","currencies","formattedData","tokenData","currency","__privateSet","coinIds","cacheId","__privateGet","useCoingeckoProxy","tokenAddresses","assetPlatformId","marketCap","vol24","change24","lastUpdated","shouldThrow","rawData","number","object","record","string","ExchangeRateSchema","DetailItemType","currencyItem","label","maxDecimals","symbol","textItem","alignment","addressItem","nodeIDItem","dateItem","AppName","getCoreHeaders","name","version","NetworkVMType","isPchainBalance","balanceResult","isXchainBalance","calculateTotalBalance","uxtos","totalAcc","utxoList","typeSum","typeAcc","balanceToAdd","TokenUnit","convertPChainBalance","balance","priceInCurrency","coingeckoId","balancePerType","balanceTypes","balanceType","balancesToAdd","uxto","newBalance","available","availableInCurrency","totalBalance","balanceInCurrency","convertXChainBalance","getBalances","addresses","tokenService","lowercaseCurrency","blockchainId","networkName","chainBalances","simplePriceResponse","Crypto","hashBlockchainId","blockChainIdWithPrefix","base64","convertBase64ToBase64Url","WalletType","getAddress","accountIndex","xpubXP","walletType","provXP","xpPub","z","paramsSchema","parseRequestParams","avalancheSignMessage","request","approvalController","message","msgHex","signingData","displayData","AVM","PVM","utils","getProvider","Utxo","getProvidedUtxos","utxoHexes","vm","codec","utxoHex","utxoBytes","TxType","parseTxDetails","parseTxDisplayTitle","getAddressesByIndices","indices","chainAlias","isChange","provider","index","isAddPermissionlessDelegatorTx","isAddPermissionlessValidatorTx","isExportTx","isImportTx","isAddSubnetValidatorTx","isCreateChainTx","isCreateSubnetTx","isRemoveSubnetValidatorTx","isStakingDetails","isExportImportTxDetails","isChainDetails","isBlockchainDetails","isSubnetDetails","isPrimarySubnet","subnetId","getTransactionDetailSections","txDetails","details","chain","outputs","memo","AvalancheChainStrings","output","balanceChangeItems","ownerAddress","destination","type","source","threshold","controlKeys","nodeID","start","end","stake","subnetID","items","delegationFee","signature","publicKey","chainID","chainName","vmID","genesisData","txFee","GLACIER_API_KEY","avalancheSendTransaction","appInfo","transactionHex","externalIndices","internalIndices","providedUtxoHexes","txBytes","currentAddress","providedUtxos","utxos","unsignedTx","externalAddresses","internalAddresses","fromAddressBytes","txData","title","txHash","getTxHash","waitForTransactionReceipt","txID","onTransactionConfirmed","onTransactionReverted","requestId","avaxSerial","Credential","avalancheSignTransaction","from","credentials","signedTx","sigIndices","credentialIndex","indicies","signerAddress","ownSignatureIndices","inputIndex","sigIndex","_glacierService","_glacierApiUrl","_approvalController","_appInfo","AvalancheModule","isTokenWithBalancePVM","token","isTokenWithBalanceAVM"],"mappings":"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","sourcesContent":["import type {\n Module,\n Manifest,\n NetworkFees,\n GetTransactionHistory,\n RpcRequest,\n Network,\n GetBalancesParams,\n GetBalancesResponse,\n GetAddressParams,\n GetAddressResponse,\n ApprovalController,\n ConstructorParams,\n AppInfo,\n} from '@avalabs/vm-module-types';\nimport { parseManifest, RpcMethod } from '@avalabs/vm-module-types';\nimport { rpcErrors } from '@metamask/rpc-errors';\nimport ManifestJson from '../manifest.json';\nimport { getNetworkFee } from './handlers/get-network-fee/get-network-fee';\nimport { getTransactionHistory } from './handlers/get-transaction-history/get-transaction-history';\nimport { getEnv } from './env';\nimport { AvalancheGlacierService } from './services/glacier-service/glacier-service';\nimport { getCoreHeaders, TokenService } from '@internal/utils';\nimport { getBalances } from './handlers/get-balances/get-balances';\nimport { hashBlockchainId } from './utils/hash-blockchain-id';\nimport { getAddress } from './handlers/get-address/get-address';\nimport { avalancheSignMessage } from './handlers/avalanche-sign-message/avalanche-sign-message';\nimport { avalancheSendTransaction } from './handlers/avalanche-send-transaction/avalanche-send-transaction';\nimport { avalancheSignTransaction } from './handlers/avalanche-sign-transaction/avalanche-sign-transaction';\nimport type { Avalanche } from '@avalabs/core-wallets-sdk';\nimport { getProvider } from './utils/get-provider';\n\nexport class AvalancheModule implements Module {\n #glacierService: AvalancheGlacierService;\n #proxyApiUrl: string;\n #glacierApiUrl: string;\n #approvalController: ApprovalController;\n #appInfo: AppInfo;\n\n constructor({ approvalController, environment, appInfo }: ConstructorParams) {\n const { glacierApiUrl, proxyApiUrl } = getEnv(environment);\n this.#appInfo = appInfo;\n this.#glacierService = new AvalancheGlacierService({\n glacierApiUrl,\n headers: getCoreHeaders(appInfo),\n });\n this.#proxyApiUrl = proxyApiUrl;\n this.#glacierApiUrl = glacierApiUrl;\n this.#approvalController = approvalController;\n }\n\n getProvider(network: Network): Avalanche.JsonRpcProvider {\n return getProvider({ isTestnet: Boolean(network.isTestnet) });\n }\n\n getAddress({ accountIndex, xpubXP, isTestnet, walletType }: GetAddressParams): Promise<GetAddressResponse> {\n return getAddress({ accountIndex, xpubXP, isTestnet, walletType });\n }\n\n getBalances({ addresses, network, storage, currency }: GetBalancesParams): Promise<GetBalancesResponse> {\n const tokenService = new TokenService({ storage, proxyApiUrl: this.#proxyApiUrl });\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): Promise<NetworkFees> {\n return getNetworkFee();\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 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 });\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 });\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","{\n \"name\": \"Avalanche\",\n \"description\": \"\",\n \"version\": \"0.0.1\",\n \"sources\": {\n \"module\": {\n \"checksum\": \"\",\n \"location\": {\n \"npm\": {\n \"filePath\": \"dist/bundle.js\",\n \"packageName\": \"@avalabs/avalanche-module\",\n \"registry\": \"https://registry.npmjs.org\"\n }\n }\n },\n \"provider\": {\n \"checksum\": \"\",\n \"location\": {\n \"npm\": {\n \"filePath\": \"dist/provider.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 ],\n \"namespaces\": [\"avax\"]\n },\n \"cointype\": \"9000\",\n \"permissions\": {\n \"rpc\": {\n \"dapps\": true,\n \"methods\": [\"avalanche_sendTransaction\", \"avalanche_signTransaction\", \"avalanche_signMessage\"]\n }\n },\n \"manifestVersion\": \"0.0\"\n}\n","import type { NetworkFees } from '@avalabs/vm-module-types';\n\n/**\n * Returns {@link NetworkFees} based on a fixed fee.\n */\nexport async function getNetworkFee(): Promise<NetworkFees> {\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","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 response = await glacierService.listLatestPrimaryNetworkTransactions({\n addresses: address,\n blockchainId: getBlockchainIdByAddress(address),\n network: isTestnet ? Network.FUJI : Network.MAINNET,\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 {\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 { 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\n const amount = getAmount({\n tx,\n isTestnet,\n networkToken,\n });\n const avaxBurnedAmount = getBurnedAmount({ isTestnet, tx, totalAmountCreated: amount, networkToken });\n const chainAddress = address.toLowerCase().startsWith('x-') ? 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.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: 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}: {\n tx: XChainNonLinearTransaction | XChainLinearTransaction;\n isTestnet?: boolean;\n networkToken: NetworkToken;\n}): Big {\n const isImportExport = ['ImportTx', 'ExportTx'].includes(tx.txType);\n const xBlockchainId = isTestnet ? Avalanche.FujiContext.xBlockchainID : Avalanche.MainnetContext.xBlockchainID;\n const importExportAmount = 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 const totalAmountCreated = tx.amountCreated\n .filter((asset) => asset.assetId === getAvaxAssetId(!!isTestnet))\n .reduce((accumulator, asset) => accumulator.add(asset.amount), new Big(0));\n const nAvaxAmt = isImportExport ? importExportAmount : totalAmountCreated;\n return getTokenValue({ amount: nAvaxAmt.toNumber(), decimals: networkToken.decimals });\n}\n\nfunction getBurnedAmount({\n isTestnet,\n tx,\n totalAmountCreated,\n networkToken,\n}: {\n isTestnet?: boolean;\n tx: XChainNonLinearTransaction | XChainLinearTransaction;\n totalAmountCreated: Big;\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 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 { Environment } from '@avalabs/vm-module-types';\n\ntype Env = {\n glacierApiUrl: string;\n proxyApiUrl: string;\n};\n\nexport const prodEnv: Env = {\n glacierApiUrl: 'https://glacier-api.avax.network',\n proxyApiUrl: 'https://proxy-api.avax.network',\n};\n\nexport const devEnv: Env = {\n glacierApiUrl: 'https://glacier-api-dev.avax.network',\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 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';\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({ glacierApiUrl, headers }: { glacierApiUrl: string; headers?: Record<string, string> }) {\n this.glacierSdk = new Glacier({ BASE: glacierApiUrl, HEADERS: headers });\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 {\n VsCurrencyType,\n getBasicCoingeckoHttp,\n simplePrice,\n simpleTokenPrice,\n type SimplePriceParams,\n} from '@avalabs/core-coingecko-sdk';\nimport type { Storage, RawSimplePriceResponse, SimplePriceResponse } from '@avalabs/vm-module-types';\nimport { coingeckoRetry } from '../../utils/coingecko-retry';\nimport { arrayHash } from '../../utils/array-hash';\nimport { CoingeckoProxyClient } from './coingecko-proxy-client';\n\nconst coingeckoBasicClient = getBasicCoingeckoHttp();\n\nexport class TokenService {\n #storage?: Storage;\n #proxyApiUrl: string;\n\n constructor({ storage, proxyApiUrl }: { proxyApiUrl: string; storage?: Storage }) {\n this.#storage = storage;\n this.#proxyApiUrl = proxyApiUrl;\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 {\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 return new CoingeckoProxyClient(this.#proxyApiUrl).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 }\n\n return simpleTokenPrice(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).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(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","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\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","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","import { RawSimplePriceResponseSchema, SimplePriceResponseSchema } from '@avalabs/vm-module-types';\nimport { fetchAndVerify } from '../../utils/fetch-and-verify';\n\nexport class CoingeckoProxyClient {\n constructor(private proxyApiUrl: string) {}\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 );\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 SimplePriceResponseSchema,\n );\n }\n}\n","import type { ZodSchema } from 'zod';\n\nexport async function fetchAndVerify(fetchOptions: Parameters<typeof fetch>, schema: ZodSchema) {\n const response = await fetch(...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 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} from '@avalabs/vm-module-types';\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 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","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","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';\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 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 networkName = network.isTestnet ? Network.FUJI : Network.MAINNET;\n\n const chainBalances = await glacierService\n .getChainBalance({\n blockchainId,\n network: networkName,\n addresses: addresses.join(','),\n })\n .then((value) => (value as ListPChainBalancesResponse | ListXChainBalancesResponse).balances);\n\n const simplePriceResponse = coingeckoId\n ? await tokenService.getSimplePrice({\n coinIds: [coingeckoId],\n currencies: [lowercaseCurrency] as VsCurrencyType[],\n })\n : {};\n\n const priceInCurrency = simplePriceResponse?.[coingeckoId ?? '']?.[lowercaseCurrency]?.price ?? undefined;\n const marketCap = simplePriceResponse?.[coingeckoId ?? '']?.[lowercaseCurrency]?.marketCap ?? undefined;\n const vol24 = simplePriceResponse?.[coingeckoId ?? '']?.[lowercaseCurrency]?.vol24 ?? undefined;\n const change24 = simplePriceResponse?.[coingeckoId ?? '']?.[lowercaseCurrency]?.change24 ?? undefined;\n\n let balance: TokenWithBalanceAVM | TokenWithBalancePVM;\n if (isPchainBalance(chainBalances)) {\n balance = convertPChainBalance({\n balance: chainBalances,\n networkToken,\n priceInCurrency,\n marketCap,\n vol24,\n change24,\n coingeckoId: coingeckoId ?? '',\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,\n marketCap,\n vol24,\n change24,\n coingeckoId: coingeckoId ?? '',\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 type { PChainBalance, XChainBalances } 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\nexport function calculateTotalBalance(uxtos: PChainBalance | XChainBalances): bigint {\n const sum = Object.values(uxtos).reduce(function (totalAcc, utxoList) {\n const typeSum = utxoList.reduce(function (typeAcc, utxo) {\n const balanceToAdd = Number(utxo.amount);\n return typeAcc + balanceToAdd;\n }, 0);\n\n return totalAcc + typeSum;\n }, 0);\n\n return BigInt(sum);\n}\n\nexport function getTokenValue(decimals: number, amount?: number) {\n return amount === undefined ? 0 : amount / 10 ** decimals;\n}\n","import type { AggregatedAssetAmount, PChainBalance } from '@avalabs/glacier-sdk';\nimport { TokenUnit } from '@avalabs/core-utils-sdk';\nimport { calculateTotalBalance, getTokenValue } 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}: {\n balance: PChainBalance;\n networkToken: NetworkToken;\n priceInCurrency?: number;\n marketCap?: number;\n vol24?: number;\n change24?: number;\n coingeckoId: string;\n}): TokenWithBalancePVM => {\n const decimals = networkToken.decimals;\n const balancePerType: Record<string, number> = {};\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] = 0;\n continue;\n }\n\n balancesToAdd.forEach((uxto: AggregatedAssetAmount) => {\n const previousBalance = balancePerType[balanceType] ?? 0;\n const newBalance = previousBalance + Number(uxto.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(calculateTotalBalance(balance), networkToken.decimals, networkToken.symbol);\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: getTokenValue(decimals, balancePerType['lockedStaked']),\n lockedStakeable: getTokenValue(decimals, balancePerType['lockedStakeable']),\n lockedPlatform: getTokenValue(decimals, balancePerType['lockedPlatform']),\n atomicMemoryLocked: getTokenValue(decimals, balancePerType['atomicMemoryLocked']),\n atomicMemoryUnlocked: getTokenValue(decimals, balancePerType['atomicMemoryUnlocked']),\n unlockedUnstaked: getTokenValue(decimals, balancePerType['unlockedUnstaked']),\n unlockedStaked: getTokenValue(decimals, balancePerType['unlockedStaked']),\n pendingStaked: getTokenValue(decimals, 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 { calculateTotalBalance, getTokenValue } 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}: {\n balance: XChainBalances;\n networkToken: NetworkToken;\n priceInCurrency?: number;\n marketCap?: number;\n vol24?: number;\n change24?: number;\n coingeckoId: string;\n}): TokenWithBalanceAVM => {\n const decimals = networkToken.decimals;\n const balancePerType: Record<string, number> = {};\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] = 0;\n continue;\n }\n\n balancesToAdd.forEach((uxto: AggregatedAssetAmount) => {\n const previousBalance = balancePerType[balanceType] ?? 0;\n const newBalance = previousBalance + Number(uxto.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(calculateTotalBalance(balance), networkToken.decimals, networkToken.symbol);\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: getTokenValue(decimals, balancePerType['unlocked']),\n locked: getTokenValue(decimals, balancePerType['locked']),\n atomicMemoryUnlocked: getTokenValue(decimals, balancePerType['atomicMemoryUnlocked']),\n atomicMemoryLocked: getTokenValue(decimals, balancePerType['atomicMemoryLocked']),\n },\n marketCap,\n vol24,\n change24,\n };\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 { 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';\n\ntype GetAddress = Omit<GetAddressParams, 'xpub'>;\n\nexport const getAddress = async ({\n accountIndex,\n isTestnet,\n xpubXP,\n walletType,\n}: GetAddress): Promise<GetAddressResponse> => {\n if (xpubXP === undefined) {\n throw rpcErrors.invalidParams('xpubXP is required to get address');\n }\n\n const provXP = isTestnet\n ? Avalanche.JsonRpcProvider.getDefaultFujiProvider()\n : Avalanche.JsonRpcProvider.getDefaultMainnetProvider();\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 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';\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({ message: 'Params are invalid', data: { cause: 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} requests you 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 SigningResult,\n type Hex,\n type AppInfo,\n} from '@avalabs/vm-module-types';\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 } from '@internal/utils';\nimport { getAddressesByIndices } from './utils/get-addresses-by-indices';\nimport { getTransactionDetailSections } from '../../utils/get-transaction-detail-sections';\n\nconst GLACIER_API_KEY = process.env.GLACIER_API_KEY;\n\nexport const avalancheSendTransaction = async ({\n request,\n network,\n approvalController,\n glacierApiUrl,\n appInfo,\n}: {\n request: RpcRequest;\n network: Network;\n approvalController: ApprovalController;\n glacierApiUrl: string;\n appInfo: AppInfo;\n}) => {\n const result = parseRequestParams(request.params);\n\n if (!result.success) {\n return {\n error: rpcErrors.invalidParams({ message: 'Transaction params are invalid', data: { cause: 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 = getProvider({ isTestnet });\n const currentAddress = request.context?.['currentAddress'];\n\n if (!currentAddress || typeof currentAddress !== 'string') {\n return {\n error: rpcErrors.invalidRequest('No active account found'),\n };\n }\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 isTestnet,\n url: glacierApiUrl,\n token: GLACIER_API_KEY,\n headers: getCoreHeaders(appInfo),\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 const xpubXP = request.context?.['xpubXP'];\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 isTestnet,\n xpubXP,\n });\n\n const internalAddresses = await getAddressesByIndices({\n indices: internalIndices ?? [],\n chainAlias,\n isChange: true,\n isTestnet,\n xpubXP,\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\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 const txHash = (await getTxHash(provider, response, vm)) as Hex;\n\n waitForTransactionReceipt({\n provider,\n txHash,\n vm,\n onTransactionConfirmed: approvalController.onTransactionConfirmed,\n onTransactionReverted: approvalController.onTransactionReverted,\n requestId: request.requestId,\n });\n\n return { result: txHash };\n } catch (error) {\n console.error(error);\n return {\n error: rpcErrors.internal({ message: 'Unable to create transaction', data: { cause: 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 provider,\n txHash,\n vm,\n onTransactionConfirmed,\n onTransactionReverted,\n requestId,\n}: {\n provider: Avalanche.JsonRpcProvider;\n txHash: Hex;\n vm: 'EVM' | 'AVM' | 'PVM';\n onTransactionConfirmed: (txHash: Hex, requestId: string) => void;\n onTransactionReverted: (txHash: Hex, requestId: string) => void;\n requestId: string;\n}) => {\n const maxTransactionStatusCheckRetries = 7;\n\n try {\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, requestId);\n } else {\n onTransactionReverted(txHash, requestId);\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, requestId);\n } else {\n onTransactionReverted(txHash, requestId);\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, requestId);\n } else {\n onTransactionReverted(txHash, requestId);\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, requestId);\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';\n\ntype ProviderParams = {\n isTestnet: boolean;\n};\n\nexport const getProvider = ({ isTestnet }: ProviderParams): Avalanche.JsonRpcProvider => {\n return isTestnet\n ? Avalanche.JsonRpcProvider.getDefaultFujiProvider()\n : Avalanche.JsonRpcProvider.getDefaultMainnetProvider();\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 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 case TxType.AddSubnetValidator:\n case TxType.CreateChain:\n case TxType.CreateSubnet:\n case TxType.RemoveSubnetValidator:\n case TxType.AddPermissionlessValidator:\n return tx;\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 'Add Delegator';\n case TxType.AddPermissionlessValidator:\n return 'Add Validator';\n case TxType.Export:\n return 'Approve Export';\n case TxType.Import:\n return 'Approve Import';\n case TxType.Base:\n return 'Approve Transaction';\n case TxType.AddSubnetValidator:\n return 'Add Subnet Validator';\n case TxType.CreateChain:\n return 'Approve Create Chain';\n case TxType.CreateSubnet:\n return 'Approve Create Subnet';\n case TxType.RemoveSubnetValidator:\n return 'Remove Subnet Validator';\n default:\n return 'Sign Message';\n }\n};\n","import { Avalanche } from '@avalabs/core-wallets-sdk';\nimport { getProvider } from '../../../utils/get-provider';\n\nexport const getAddressesByIndices = async ({\n indices,\n chainAlias,\n isChange,\n isTestnet,\n xpubXP,\n}: {\n indices: number[];\n chainAlias: 'X' | 'P';\n isChange: boolean;\n isTestnet: boolean;\n xpubXP?: string;\n}): Promise<string[]> => {\n if (!xpubXP || (isChange && chainAlias !== 'X')) {\n return [];\n }\n\n const provider = getProvider({ isTestnet });\n\n return indices.map((index) => Avalanche.getAddressFromXpub(xpubXP, index, provider, chainAlias, isChange));\n};\n","import {\n TxType,\n type AddPermissionlessDelegatorTx,\n type AddPermissionlessValidatorTx,\n type AddSubnetValidatorTx,\n type BaseTx,\n type BlockchainDetails,\n type ChainDetails,\n type CreateChainTx,\n type CreateSubnetTx,\n type ExportImportTxDetails,\n type ExportTx,\n type ImportTx,\n type RemoveSubnetValidatorTx,\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;\n\nexport const isStakingDetails = (tx: TxDetails): tx is StakingDetails =>\n isAddPermissionlessDelegatorTx(tx) ||\n isAddPermissionlessValidatorTx(tx) ||\n isAddSubnetValidatorTx(tx) ||\n isRemoveSubnetValidatorTx(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","import type { DetailItem, DetailSection, TxDetails } from '@avalabs/vm-module-types';\nimport {\n isAddPermissionlessDelegatorTx,\n isAddPermissionlessValidatorTx,\n isAddSubnetValidatorTx,\n isBlockchainDetails,\n isChainDetails,\n isExportTx,\n isImportTx,\n isRemoveSubnetValidatorTx,\n isSubnetDetails,\n} from '../handlers/avalanche-send-transaction/typeguards';\nimport { addressItem, currencyItem, nodeIDItem, textItem, dateItem } from '@internal/utils';\nimport { PVM } from '@avalabs/avalanchejs';\nimport { isPrimarySubnet } from '../handlers/avalanche-send-transaction/utils/is-primary-subnet';\nimport { AVAX_NONEVM_DENOMINATION } from '../constants';\n\nexport const getTransactionDetailSections = (txDetails: TxDetails, symbol: string) => {\n const details: DetailSection[] = [];\n\n if (isChainDetails(txDetails)) {\n const { chain, outputs, memo } = txDetails;\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 } else if (isExportTx(txDetails)) {\n const { amount, chain, destination, type } = txDetails;\n\n details.push({\n title: 'Transaction Details',\n items: [\n textItem('Source Chain', `Avalanche ${AvalancheChainStrings[chain]}`),\n textItem('Target Chain', `Avalanche ${AvalancheChainStrings[destination]}`),\n textItem('Transaction Type', type ? (type[0] || '').toUpperCase() + type.slice(1) : ''),\n currencyItem('Amount', amount, AVAX_NONEVM_DENOMINATION, symbol),\n ],\n });\n } else if (isImportTx(txDetails)) {\n const { amount, chain, source, type } = txDetails;\n\n details.push({\n title: 'Transaction Details',\n items: [\n textItem('Source Chain', `Avalanche ${AvalancheChainStrings[source]}`),\n textItem('Destination Chain', `Avalanche ${AvalancheChainStrings[chain]}`),\n textItem('Transaction Type', type ? (type[0] || '').toUpperCase() + type.slice(1) : ''),\n currencyItem('Amount', amount, AVAX_NONEVM_DENOMINATION, symbol),\n ],\n });\n } else if (isSubnetDetails(txDetails)) {\n const { threshold, controlKeys } = txDetails;\n\n details.push({\n title: 'Subnet Details',\n items: [\n textItem(controlKeys.length > 1 ? 'Owners' : 'Owner', controlKeys.join('\\n'), 'vertical'),\n textItem('Signature Threshold', `${threshold}/${controlKeys.length}`, 'vertical'),\n ],\n });\n } else if (isAddPermissionlessDelegatorTx(txDetails)) {\n const { nodeID, start, end, stake, subnetID } = txDetails;\n\n const items: DetailItem[] = [\n nodeIDItem('Node ID', nodeID),\n isPrimarySubnet(subnetID) ? textItem('Subnet ID', 'Primary Network') : nodeIDItem('Subnet ID', subnetID),\n currencyItem('Stake Amount', stake, AVAX_NONEVM_DENOMINATION, symbol),\n dateItem('Start Date', start),\n dateItem('End Date', end),\n ];\n\n details.push({\n title: 'Staking Details',\n items,\n });\n } else if (isAddPermissionlessValidatorTx(txDetails)) {\n const { nodeID, delegationFee, start, end, stake, subnetID, signature, publicKey } = txDetails;\n\n const items: DetailItem[] = [\n nodeIDItem('Node ID', nodeID),\n isPrimarySubnet(subnetID) ? textItem('Subnet ID', 'Primary Network') : nodeIDItem('Subnet ID', subnetID),\n ];\n\n if (publicKey && signature) {\n items.push(nodeIDItem('Public Key', publicKey), nodeIDItem('Proof', signature));\n }\n\n items.push(\n currencyItem('Stake Amount', stake, AVAX_NONEVM_DENOMINATION, symbol),\n textItem('Delegation Fee', `${delegationFee / 10000} %`),\n dateItem('Start Date', start),\n dateItem('End Date', end),\n );\n\n details.push({\n title: 'Staking Details',\n items,\n });\n } else if (isBlockchainDetails(txDetails)) {\n // handle genesis data similarly to how we handle data in transaction details\n const { chainID, chainName, vmID, genesisData } = txDetails;\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 textItem('Genesis Data', genesisData, 'vertical'),\n ];\n\n details.push({\n title: 'Blockchain Details',\n items,\n });\n } else if (isAddSubnetValidatorTx(txDetails)) {\n const { nodeID, start, end, subnetID } = txDetails;\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 } else if (isRemoveSubnetValidatorTx(txDetails)) {\n const { nodeID, subnetID } = txDetails;\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\n const { txFee } = txDetails;\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\nenum AvalancheChainStrings {\n AVM = 'X Chain',\n PVM = 'P Chain',\n EVM = 'C Chain',\n}\n","import { Avalanche } from '@avalabs/core-wallets-sdk';\n\nexport function isPrimarySubnet(subnetId: string): boolean {\n return subnetId === Avalanche.MainnetContext.pBlockchainID;\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 { parseRequestParams } from './schemas/parse-request-params/parse-request-params';\nimport { rpcErrors } from '@metamask/rpc-errors';\nimport { Avalanche } from '@avalabs/core-wallets-sdk';\nimport { avaxSerial, utils, Credential } from '@avalabs/avalanchejs';\nimport { getProvider } from '../../utils/get-provider';\nimport { parseTxDetails } from '../avalanche-send-transaction/utils/parse-tx-details';\nimport { getTransactionDetailSections } from '../../utils/get-transaction-detail-sections';\nimport { getCoreHeaders } from '@internal/utils';\n\nconst GLACIER_API_KEY = process.env.GLACIER_API_KEY;\n\nexport const avalancheSignTransaction = async ({\n request,\n network,\n approvalController,\n glacierApiUrl,\n appInfo,\n}: {\n request: RpcRequest;\n network: Network;\n approvalController: ApprovalController;\n glacierApiUrl: string;\n appInfo: AppInfo;\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 } = result.data;\n const vm = Avalanche.getVmByChainAlias(chainAlias);\n const txBytes = utils.hexToBuffer(transactionHex);\n const isTestnet = network.isTestnet ?? false;\n const provider = getProvider({ isTestnet });\n\n const tx = utils.unpackWithManager(vm, txBytes) as avaxSerial.AvaxTx;\n\n const utxos = await Avalanche.getUtxosByTxFromGlacier({\n transactionHex,\n chainAlias,\n isTestnet,\n url: glacierApiUrl,\n token: GLACIER_API_KEY,\n headers: getCoreHeaders(appInfo),\n });\n\n let credentials: Credential[] | undefined;\n\n try {\n const codecManager = utils.getManagerForVM(vm);\n const signedTx = codecManager.unpack(txBytes, avaxSerial.SignedTx);\n const unsignedTx = await Avalanche.createAvalancheUnsignedTx({\n tx,\n utxos,\n provider,\n credentials: signedTx.getCredentials(),\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,\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 const unsignedTx = await Avalanche.createAvalancheUnsignedTx({\n tx,\n provider,\n credentials,\n utxos,\n });\n\n // check if the current account's signature is needed\n const signerAddress = utils.addressesFromBytes([utils.parse(from)[2]])[0];\n\n if (!signerAddress) {\n return {\n error: rpcErrors.invalidRequest('Missing signer address'),\n };\n }\n\n const ownSignatureIndices = unsignedTx.getSigIndicesForAddress(signerAddress);\n\n if (!ownSignatureIndices) {\n return {\n error: rpcErrors.invalidRequest('This account has nothing to sign'),\n };\n }\n\n const sigIndices = unsignedTx.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\n // get display data for the UI\n const txData = await Avalanche.parseAvalancheTx(unsignedTx, provider, from);\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(unsignedTx.toJSON()),\n ownSignatureIndices,\n };\n\n const details = getTransactionDetailSections(txDetails, network.networkToken.symbol);\n\n const displayData: DisplayData = {\n title: 'Sign 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().describe('Avalanche receiving address'),\n transactionHex: z.string(),\n chainAlias: z.enum(['X', 'P', 'C']),\n});\n\nexport const parseRequestParams = (params: unknown) => {\n return paramsSchema.safeParse(params);\n};\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","../manifest.json","../src/handlers/get-network-fee/get-network-fee.ts","../src/handlers/get-transaction-history/get-transaction-history.ts","../src/handlers/get-transaction-history/utils.ts","../src/handlers/get-transaction-history/convert-p-chain-transaction.ts","../src/handlers/get-transaction-history/convert-x-chain-transaction.ts","../src/env.ts","../src/services/glacier-service/glacier-service.ts","../../../packages-internal/utils/src/services/token-service/token-service.ts","../../../packages-internal/utils/src/utils/retry.ts","../../../packages-internal/utils/src/utils/coingecko-retry.ts","../../../packages-internal/utils/src/utils/charsum.ts","../../../packages-internal/utils/src/utils/array-hash.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/pricing-service/exchange-rates.ts","../../../packages-internal/utils/src/utils/detail-item.ts","../../../packages-internal/utils/src/utils/get-core-headers.ts","../src/handlers/get-balances/get-balances.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/utils/hash-blockchain-id.ts","../src/handlers/get-address/get-address.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-send-transaction/avalanche-send-transaction.ts","../src/handlers/avalanche-send-transaction/schema.ts","../src/utils/get-provider.ts","../src/handlers/avalanche-send-transaction/utils/get-provided-utxos.ts","../src/handlers/avalanche-send-transaction/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/handlers/avalanche-send-transaction/typeguards.ts","../src/utils/get-transaction-detail-sections.ts","../src/handlers/avalanche-send-transaction/utils/is-primary-subnet.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/get-balances/typeguards.ts"],"names":["parseManifest","RpcMethod","rpcErrors","manifest_default","getNetworkFee","BlockchainId","Network","SortOrder","PrimaryNetworkChainName","Big","isPChainTransactions","value","isXChainTransactions","getExplorerAddressByNetwork","explorerUrl","hash","hashType","getTokenValue","amount","decimals","Avalanche","TokenType","convertPChainTransaction","tx","address","networkToken","chainId","isTestnet","froms","utxo","tos","getAmount","avaxBurnedAmount","getBurnedAmount","chainAddress","isSender","isImportExport","isBaseTx","nonChangeEmittedUtxosAmt","getAvaxAssetId","addr","agg","txValue","val","baseTxValue","pBlockchainId","importExportAmount","nAvaxAmount","aggregateValue","nAvaxFee","accumulator","value_","convertXChainTransaction","xBlockchainId","totalAmountCreated","asset","getTransactionHistory","nextPageToken","offset","network","glacierService","response","getBlockchainIdByAddress","transactions","Environment","prodEnv","devEnv","getEnv","environment","Glacier","GlacierUnhealthyError","__publicField","AvalancheGlacierService","glacierApiUrl","headers","params","error","VsCurrencyType","getBasicCoingeckoHttp","simplePrice","simpleTokenPrice","retry","operation","isSuccess","maxRetries","backoffPolicy","RetryBackoffPolicy","backoffPeriodMillis","retries","lastError","delay","result","err","errorMessage","retryIndex","secondsToDelay","_","msToDelay","ms","r","coingeckoRetry","charsum","s","i","sum","arrayHash","array","cs","RawSimplePriceResponseSchema","SimplePriceResponseSchema","fetchAndVerify","fetchOptions","schema","responseJson","CoingeckoProxyClient","proxyApiUrl","queryParams","id","rawQueryParams","coingeckoBasicClient","_storage","_proxyApiUrl","TokenService","storage","__privateAdd","data","currencies","formattedData","tokenData","currency","__privateSet","coinIds","cacheId","__privateGet","useCoingeckoProxy","tokenAddresses","assetPlatformId","marketCap","vol24","change24","lastUpdated","shouldThrow","rawData","number","object","record","string","ExchangeRateSchema","DetailItemType","currencyItem","label","maxDecimals","symbol","textItem","alignment","addressItem","nodeIDItem","dateItem","AppName","getCoreHeaders","name","version","NetworkVMType","isPchainBalance","balanceResult","isXchainBalance","calculateTotalBalance","uxtos","totalAcc","utxoList","typeSum","typeAcc","balanceToAdd","TokenUnit","convertPChainBalance","balance","priceInCurrency","coingeckoId","balancePerType","balanceTypes","balanceType","balancesToAdd","uxto","newBalance","available","availableInCurrency","totalBalance","balanceInCurrency","convertXChainBalance","getBalances","addresses","tokenService","lowercaseCurrency","blockchainId","networkName","chainBalances","simplePriceResponse","Crypto","hashBlockchainId","blockChainIdWithPrefix","base64","convertBase64ToBase64Url","WalletType","getAddress","accountIndex","xpubXP","walletType","provXP","xpPub","z","paramsSchema","parseRequestParams","avalancheSignMessage","request","approvalController","message","msgHex","signingData","displayData","AVM","PVM","utils","getProvider","Utxo","getProvidedUtxos","utxoHexes","vm","codec","utxoHex","utxoBytes","TxType","parseTxDetails","parseTxDisplayTitle","getAddressesByIndices","indices","chainAlias","isChange","provider","index","isAddPermissionlessDelegatorTx","isAddPermissionlessValidatorTx","isExportTx","isImportTx","isAddSubnetValidatorTx","isCreateChainTx","isCreateSubnetTx","isRemoveSubnetValidatorTx","isStakingDetails","isExportImportTxDetails","isChainDetails","isBlockchainDetails","isSubnetDetails","isPrimarySubnet","subnetId","getTransactionDetailSections","txDetails","details","chain","outputs","memo","AvalancheChainStrings","output","balanceChangeItems","ownerAddress","destination","type","source","threshold","controlKeys","nodeID","start","end","stake","subnetID","items","delegationFee","signature","publicKey","chainID","chainName","vmID","genesisData","txFee","GLACIER_API_KEY","avalancheSendTransaction","appInfo","transactionHex","externalIndices","internalIndices","providedUtxoHexes","txBytes","currentAddress","providedUtxos","utxos","unsignedTx","externalAddresses","internalAddresses","fromAddressBytes","txData","title","txHash","getTxHash","waitForTransactionReceipt","txID","onTransactionConfirmed","onTransactionReverted","requestId","avaxSerial","Credential","avalancheSignTransaction","from","credentials","signedTx","sigIndices","credentialIndex","indicies","signerAddress","ownSignatureIndices","inputIndex","sigIndex","_glacierService","_glacierApiUrl","_approvalController","_appInfo","AvalancheModule","isTokenWithBalancePVM","token","isTokenWithBalanceAVM"],"mappings":"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","sourcesContent":["import type {\n Module,\n Manifest,\n NetworkFees,\n GetTransactionHistory,\n RpcRequest,\n Network,\n GetBalancesParams,\n GetBalancesResponse,\n GetAddressParams,\n GetAddressResponse,\n ApprovalController,\n ConstructorParams,\n AppInfo,\n} from '@avalabs/vm-module-types';\nimport { parseManifest, RpcMethod } from '@avalabs/vm-module-types';\nimport { rpcErrors } from '@metamask/rpc-errors';\nimport ManifestJson from '../manifest.json';\nimport { getNetworkFee } from './handlers/get-network-fee/get-network-fee';\nimport { getTransactionHistory } from './handlers/get-transaction-history/get-transaction-history';\nimport { getEnv } from './env';\nimport { AvalancheGlacierService } from './services/glacier-service/glacier-service';\nimport { getCoreHeaders, TokenService } from '@internal/utils';\nimport { getBalances } from './handlers/get-balances/get-balances';\nimport { hashBlockchainId } from './utils/hash-blockchain-id';\nimport { getAddress } from './handlers/get-address/get-address';\nimport { avalancheSignMessage } from './handlers/avalanche-sign-message/avalanche-sign-message';\nimport { avalancheSendTransaction } from './handlers/avalanche-send-transaction/avalanche-send-transaction';\nimport { avalancheSignTransaction } from './handlers/avalanche-sign-transaction/avalanche-sign-transaction';\nimport type { Avalanche } from '@avalabs/core-wallets-sdk';\nimport { getProvider } from './utils/get-provider';\n\nexport class AvalancheModule implements Module {\n #glacierService: AvalancheGlacierService;\n #proxyApiUrl: string;\n #glacierApiUrl: string;\n #approvalController: ApprovalController;\n #appInfo: AppInfo;\n\n constructor({ approvalController, environment, appInfo }: ConstructorParams) {\n const { glacierApiUrl, proxyApiUrl } = getEnv(environment);\n this.#appInfo = appInfo;\n this.#glacierService = new AvalancheGlacierService({\n glacierApiUrl,\n headers: getCoreHeaders(appInfo),\n });\n this.#proxyApiUrl = proxyApiUrl;\n this.#glacierApiUrl = glacierApiUrl;\n this.#approvalController = approvalController;\n }\n\n getProvider(network: Network): Avalanche.JsonRpcProvider {\n return getProvider({ isTestnet: Boolean(network.isTestnet) });\n }\n\n getAddress({ accountIndex, xpubXP, isTestnet, walletType }: GetAddressParams): Promise<GetAddressResponse> {\n return getAddress({ accountIndex, xpubXP, isTestnet, walletType });\n }\n\n getBalances({ addresses, network, storage, currency }: GetBalancesParams): Promise<GetBalancesResponse> {\n const tokenService = new TokenService({ storage, proxyApiUrl: this.#proxyApiUrl });\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): Promise<NetworkFees> {\n return getNetworkFee();\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 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 });\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 });\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","{\n \"name\": \"Avalanche\",\n \"description\": \"\",\n \"version\": \"0.0.1\",\n \"sources\": {\n \"module\": {\n \"checksum\": \"\",\n \"location\": {\n \"npm\": {\n \"filePath\": \"dist/bundle.js\",\n \"packageName\": \"@avalabs/avalanche-module\",\n \"registry\": \"https://registry.npmjs.org\"\n }\n }\n },\n \"provider\": {\n \"checksum\": \"\",\n \"location\": {\n \"npm\": {\n \"filePath\": \"dist/provider.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 ],\n \"namespaces\": [\"avax\"]\n },\n \"cointype\": \"9000\",\n \"permissions\": {\n \"rpc\": {\n \"dapps\": true,\n \"methods\": [\"avalanche_sendTransaction\", \"avalanche_signTransaction\", \"avalanche_signMessage\"]\n }\n },\n \"manifestVersion\": \"0.0\"\n}\n","import type { NetworkFees } from '@avalabs/vm-module-types';\n\n/**\n * Returns {@link NetworkFees} based on a fixed fee.\n */\nexport async function getNetworkFee(): Promise<NetworkFees> {\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","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 response = await glacierService.listLatestPrimaryNetworkTransactions({\n addresses: address,\n blockchainId: getBlockchainIdByAddress(address),\n network: isTestnet ? Network.FUJI : Network.MAINNET,\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 {\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 { 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\n const amount = getAmount({\n tx,\n isTestnet,\n networkToken,\n });\n const avaxBurnedAmount = getBurnedAmount({ isTestnet, tx, totalAmountCreated: amount, networkToken });\n const chainAddress = address.toLowerCase().startsWith('x-') ? 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.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: 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}: {\n tx: XChainNonLinearTransaction | XChainLinearTransaction;\n isTestnet?: boolean;\n networkToken: NetworkToken;\n}): Big {\n const isImportExport = ['ImportTx', 'ExportTx'].includes(tx.txType);\n const xBlockchainId = isTestnet ? Avalanche.FujiContext.xBlockchainID : Avalanche.MainnetContext.xBlockchainID;\n const importExportAmount = 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 const totalAmountCreated = tx.amountCreated\n .filter((asset) => asset.assetId === getAvaxAssetId(!!isTestnet))\n .reduce((accumulator, asset) => accumulator.add(asset.amount), new Big(0));\n const nAvaxAmt = isImportExport ? importExportAmount : totalAmountCreated;\n return getTokenValue({ amount: nAvaxAmt.toNumber(), decimals: networkToken.decimals });\n}\n\nfunction getBurnedAmount({\n isTestnet,\n tx,\n totalAmountCreated,\n networkToken,\n}: {\n isTestnet?: boolean;\n tx: XChainNonLinearTransaction | XChainLinearTransaction;\n totalAmountCreated: Big;\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 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 { Environment } from '@avalabs/vm-module-types';\n\ntype Env = {\n glacierApiUrl: string;\n proxyApiUrl: string;\n};\n\nexport const prodEnv: Env = {\n glacierApiUrl: 'https://glacier-api.avax.network',\n proxyApiUrl: 'https://proxy-api.avax.network',\n};\n\nexport const devEnv: Env = {\n glacierApiUrl: 'https://glacier-api-dev.avax.network',\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 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';\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({ glacierApiUrl, headers }: { glacierApiUrl: string; headers?: Record<string, string> }) {\n this.glacierSdk = new Glacier({ BASE: glacierApiUrl, HEADERS: headers });\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 {\n VsCurrencyType,\n getBasicCoingeckoHttp,\n simplePrice,\n simpleTokenPrice,\n type SimplePriceParams,\n} from '@avalabs/core-coingecko-sdk';\nimport type { Storage, RawSimplePriceResponse, SimplePriceResponse } from '@avalabs/vm-module-types';\nimport { coingeckoRetry } from '../../utils/coingecko-retry';\nimport { arrayHash } from '../../utils/array-hash';\nimport { CoingeckoProxyClient } from './coingecko-proxy-client';\n\nconst coingeckoBasicClient = getBasicCoingeckoHttp();\n\nexport class TokenService {\n #storage?: Storage;\n #proxyApiUrl: string;\n\n constructor({ storage, proxyApiUrl }: { proxyApiUrl: string; storage?: Storage }) {\n this.#storage = storage;\n this.#proxyApiUrl = proxyApiUrl;\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 {\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 return new CoingeckoProxyClient(this.#proxyApiUrl).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 }\n\n return simpleTokenPrice(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).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(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","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\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","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","import { RawSimplePriceResponseSchema, SimplePriceResponseSchema } from '@avalabs/vm-module-types';\nimport { fetchAndVerify } from '../../utils/fetch-and-verify';\n\nexport class CoingeckoProxyClient {\n constructor(private proxyApiUrl: string) {}\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 );\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 SimplePriceResponseSchema,\n );\n }\n}\n","import type { ZodSchema } from 'zod';\n\nexport async function fetchAndVerify(fetchOptions: Parameters<typeof fetch>, schema: ZodSchema) {\n const response = await fetch(...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 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} from '@avalabs/vm-module-types';\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 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","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","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';\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 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 networkName = network.isTestnet ? Network.FUJI : Network.MAINNET;\n\n const chainBalances = await glacierService\n .getChainBalance({\n blockchainId,\n network: networkName,\n addresses: addresses.join(','),\n })\n .then((value) => (value as ListPChainBalancesResponse | ListXChainBalancesResponse).balances);\n\n const simplePriceResponse = coingeckoId\n ? await tokenService.getSimplePrice({\n coinIds: [coingeckoId],\n currencies: [lowercaseCurrency] as VsCurrencyType[],\n })\n : {};\n\n const priceInCurrency = simplePriceResponse?.[coingeckoId ?? '']?.[lowercaseCurrency]?.price ?? undefined;\n const marketCap = simplePriceResponse?.[coingeckoId ?? '']?.[lowercaseCurrency]?.marketCap ?? undefined;\n const vol24 = simplePriceResponse?.[coingeckoId ?? '']?.[lowercaseCurrency]?.vol24 ?? undefined;\n const change24 = simplePriceResponse?.[coingeckoId ?? '']?.[lowercaseCurrency]?.change24 ?? undefined;\n\n let balance: TokenWithBalanceAVM | TokenWithBalancePVM;\n if (isPchainBalance(chainBalances)) {\n balance = convertPChainBalance({\n balance: chainBalances,\n networkToken,\n priceInCurrency,\n marketCap,\n vol24,\n change24,\n coingeckoId: coingeckoId ?? '',\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,\n marketCap,\n vol24,\n change24,\n coingeckoId: coingeckoId ?? '',\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 type { PChainBalance, XChainBalances } 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\nexport function calculateTotalBalance(uxtos: PChainBalance | XChainBalances): bigint {\n const sum = Object.values(uxtos).reduce(function (totalAcc, utxoList) {\n const typeSum = utxoList.reduce(function (typeAcc, utxo) {\n const balanceToAdd = Number(utxo.amount);\n return typeAcc + balanceToAdd;\n }, 0);\n\n return totalAcc + typeSum;\n }, 0);\n\n return BigInt(sum);\n}\n","import type { AggregatedAssetAmount, PChainBalance } from '@avalabs/glacier-sdk';\nimport { TokenUnit } from '@avalabs/core-utils-sdk';\nimport { calculateTotalBalance } 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}: {\n balance: PChainBalance;\n networkToken: NetworkToken;\n priceInCurrency?: number;\n marketCap?: number;\n vol24?: number;\n change24?: number;\n coingeckoId: 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((uxto: AggregatedAssetAmount) => {\n const previousBalance = balancePerType[balanceType] ?? 0n;\n const newBalance = previousBalance + BigInt(uxto.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(calculateTotalBalance(balance), networkToken.decimals, networkToken.symbol);\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 { calculateTotalBalance } 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}: {\n balance: XChainBalances;\n networkToken: NetworkToken;\n priceInCurrency?: number;\n marketCap?: number;\n vol24?: number;\n change24?: number;\n coingeckoId: 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((uxto: AggregatedAssetAmount) => {\n const previousBalance = balancePerType[balanceType] ?? 0n;\n const newBalance = previousBalance + BigInt(uxto.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(calculateTotalBalance(balance), networkToken.decimals, networkToken.symbol);\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 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 { 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';\n\ntype GetAddress = Omit<GetAddressParams, 'xpub'>;\n\nexport const getAddress = async ({\n accountIndex,\n isTestnet,\n xpubXP,\n walletType,\n}: GetAddress): Promise<GetAddressResponse> => {\n if (xpubXP === undefined) {\n throw rpcErrors.invalidParams('xpubXP is required to get address');\n }\n\n const provXP = isTestnet\n ? Avalanche.JsonRpcProvider.getDefaultFujiProvider()\n : Avalanche.JsonRpcProvider.getDefaultMainnetProvider();\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 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';\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({ message: 'Params are invalid', data: { cause: 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} requests you 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 SigningResult,\n type Hex,\n type AppInfo,\n} from '@avalabs/vm-module-types';\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 } from '@internal/utils';\nimport { getAddressesByIndices } from './utils/get-addresses-by-indices';\nimport { getTransactionDetailSections } from '../../utils/get-transaction-detail-sections';\n\nconst GLACIER_API_KEY = process.env.GLACIER_API_KEY;\n\nexport const avalancheSendTransaction = async ({\n request,\n network,\n approvalController,\n glacierApiUrl,\n appInfo,\n}: {\n request: RpcRequest;\n network: Network;\n approvalController: ApprovalController;\n glacierApiUrl: string;\n appInfo: AppInfo;\n}) => {\n const result = parseRequestParams(request.params);\n\n if (!result.success) {\n return {\n error: rpcErrors.invalidParams({ message: 'Transaction params are invalid', data: { cause: 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 = getProvider({ isTestnet });\n const currentAddress = request.context?.['currentAddress'];\n\n if (!currentAddress || typeof currentAddress !== 'string') {\n return {\n error: rpcErrors.invalidRequest('No active account found'),\n };\n }\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 isTestnet,\n url: glacierApiUrl,\n token: GLACIER_API_KEY,\n headers: getCoreHeaders(appInfo),\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 const xpubXP = request.context?.['xpubXP'];\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 isTestnet,\n xpubXP,\n });\n\n const internalAddresses = await getAddressesByIndices({\n indices: internalIndices ?? [],\n chainAlias,\n isChange: true,\n isTestnet,\n xpubXP,\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\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 const txHash = (await getTxHash(provider, response, vm)) as Hex;\n\n waitForTransactionReceipt({\n provider,\n txHash,\n vm,\n onTransactionConfirmed: approvalController.onTransactionConfirmed,\n onTransactionReverted: approvalController.onTransactionReverted,\n requestId: request.requestId,\n });\n\n return { result: txHash };\n } catch (error) {\n console.error(error);\n return {\n error: rpcErrors.internal({ message: 'Unable to create transaction', data: { cause: 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 provider,\n txHash,\n vm,\n onTransactionConfirmed,\n onTransactionReverted,\n requestId,\n}: {\n provider: Avalanche.JsonRpcProvider;\n txHash: Hex;\n vm: 'EVM' | 'AVM' | 'PVM';\n onTransactionConfirmed: (txHash: Hex, requestId: string) => void;\n onTransactionReverted: (txHash: Hex, requestId: string) => void;\n requestId: string;\n}) => {\n const maxTransactionStatusCheckRetries = 7;\n\n try {\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, requestId);\n } else {\n onTransactionReverted(txHash, requestId);\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, requestId);\n } else {\n onTransactionReverted(txHash, requestId);\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, requestId);\n } else {\n onTransactionReverted(txHash, requestId);\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, requestId);\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';\n\ntype ProviderParams = {\n isTestnet: boolean;\n};\n\nexport const getProvider = ({ isTestnet }: ProviderParams): Avalanche.JsonRpcProvider => {\n return isTestnet\n ? Avalanche.JsonRpcProvider.getDefaultFujiProvider()\n : Avalanche.JsonRpcProvider.getDefaultMainnetProvider();\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 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 case TxType.AddSubnetValidator:\n case TxType.CreateChain:\n case TxType.CreateSubnet:\n case TxType.RemoveSubnetValidator:\n case TxType.AddPermissionlessValidator:\n return tx;\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 'Add Delegator';\n case TxType.AddPermissionlessValidator:\n return 'Add Validator';\n case TxType.Export:\n return 'Approve Export';\n case TxType.Import:\n return 'Approve Import';\n case TxType.Base:\n return 'Approve Transaction';\n case TxType.AddSubnetValidator:\n return 'Add Subnet Validator';\n case TxType.CreateChain:\n return 'Approve Create Chain';\n case TxType.CreateSubnet:\n return 'Approve Create Subnet';\n case TxType.RemoveSubnetValidator:\n return 'Remove Subnet Validator';\n default:\n return 'Sign Message';\n }\n};\n","import { Avalanche } from '@avalabs/core-wallets-sdk';\nimport { getProvider } from '../../../utils/get-provider';\n\nexport const getAddressesByIndices = async ({\n indices,\n chainAlias,\n isChange,\n isTestnet,\n xpubXP,\n}: {\n indices: number[];\n chainAlias: 'X' | 'P';\n isChange: boolean;\n isTestnet: boolean;\n xpubXP?: string;\n}): Promise<string[]> => {\n if (!xpubXP || (isChange && chainAlias !== 'X')) {\n return [];\n }\n\n const provider = getProvider({ isTestnet });\n\n return indices.map((index) => Avalanche.getAddressFromXpub(xpubXP, index, provider, chainAlias, isChange));\n};\n","import {\n TxType,\n type AddPermissionlessDelegatorTx,\n type AddPermissionlessValidatorTx,\n type AddSubnetValidatorTx,\n type BaseTx,\n type BlockchainDetails,\n type ChainDetails,\n type CreateChainTx,\n type CreateSubnetTx,\n type ExportImportTxDetails,\n type ExportTx,\n type ImportTx,\n type RemoveSubnetValidatorTx,\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;\n\nexport const isStakingDetails = (tx: TxDetails): tx is StakingDetails =>\n isAddPermissionlessDelegatorTx(tx) ||\n isAddPermissionlessValidatorTx(tx) ||\n isAddSubnetValidatorTx(tx) ||\n isRemoveSubnetValidatorTx(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","import type { DetailItem, DetailSection, TxDetails } from '@avalabs/vm-module-types';\nimport {\n isAddPermissionlessDelegatorTx,\n isAddPermissionlessValidatorTx,\n isAddSubnetValidatorTx,\n isBlockchainDetails,\n isChainDetails,\n isExportTx,\n isImportTx,\n isRemoveSubnetValidatorTx,\n isSubnetDetails,\n} from '../handlers/avalanche-send-transaction/typeguards';\nimport { addressItem, currencyItem, nodeIDItem, textItem, dateItem } from '@internal/utils';\nimport { PVM } from '@avalabs/avalanchejs';\nimport { isPrimarySubnet } from '../handlers/avalanche-send-transaction/utils/is-primary-subnet';\nimport { AVAX_NONEVM_DENOMINATION } from '../constants';\n\nexport const getTransactionDetailSections = (txDetails: TxDetails, symbol: string) => {\n const details: DetailSection[] = [];\n\n if (isChainDetails(txDetails)) {\n const { chain, outputs, memo } = txDetails;\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 } else if (isExportTx(txDetails)) {\n const { amount, chain, destination, type } = txDetails;\n\n details.push({\n title: 'Transaction Details',\n items: [\n textItem('Source Chain', `Avalanche ${AvalancheChainStrings[chain]}`),\n textItem('Target Chain', `Avalanche ${AvalancheChainStrings[destination]}`),\n textItem('Transaction Type', type ? (type[0] || '').toUpperCase() + type.slice(1) : ''),\n currencyItem('Amount', amount, AVAX_NONEVM_DENOMINATION, symbol),\n ],\n });\n } else if (isImportTx(txDetails)) {\n const { amount, chain, source, type } = txDetails;\n\n details.push({\n title: 'Transaction Details',\n items: [\n textItem('Source Chain', `Avalanche ${AvalancheChainStrings[source]}`),\n textItem('Destination Chain', `Avalanche ${AvalancheChainStrings[chain]}`),\n textItem('Transaction Type', type ? (type[0] || '').toUpperCase() + type.slice(1) : ''),\n currencyItem('Amount', amount, AVAX_NONEVM_DENOMINATION, symbol),\n ],\n });\n } else if (isSubnetDetails(txDetails)) {\n const { threshold, controlKeys } = txDetails;\n\n details.push({\n title: 'Subnet Details',\n items: [\n textItem(controlKeys.length > 1 ? 'Owners' : 'Owner', controlKeys.join('\\n'), 'vertical'),\n textItem('Signature Threshold', `${threshold}/${controlKeys.length}`, 'vertical'),\n ],\n });\n } else if (isAddPermissionlessDelegatorTx(txDetails)) {\n const { nodeID, start, end, stake, subnetID } = txDetails;\n\n const items: DetailItem[] = [\n nodeIDItem('Node ID', nodeID),\n isPrimarySubnet(subnetID) ? textItem('Subnet ID', 'Primary Network') : nodeIDItem('Subnet ID', subnetID),\n currencyItem('Stake Amount', stake, AVAX_NONEVM_DENOMINATION, symbol),\n dateItem('Start Date', start),\n dateItem('End Date', end),\n ];\n\n details.push({\n title: 'Staking Details',\n items,\n });\n } else if (isAddPermissionlessValidatorTx(txDetails)) {\n const { nodeID, delegationFee, start, end, stake, subnetID, signature, publicKey } = txDetails;\n\n const items: DetailItem[] = [\n nodeIDItem('Node ID', nodeID),\n isPrimarySubnet(subnetID) ? textItem('Subnet ID', 'Primary Network') : nodeIDItem('Subnet ID', subnetID),\n ];\n\n if (publicKey && signature) {\n items.push(nodeIDItem('Public Key', publicKey), nodeIDItem('Proof', signature));\n }\n\n items.push(\n currencyItem('Stake Amount', stake, AVAX_NONEVM_DENOMINATION, symbol),\n textItem('Delegation Fee', `${delegationFee / 10000} %`),\n dateItem('Start Date', start),\n dateItem('End Date', end),\n );\n\n details.push({\n title: 'Staking Details',\n items,\n });\n } else if (isBlockchainDetails(txDetails)) {\n // handle genesis data similarly to how we handle data in transaction details\n const { chainID, chainName, vmID, genesisData } = txDetails;\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 textItem('Genesis Data', genesisData, 'vertical'),\n ];\n\n details.push({\n title: 'Blockchain Details',\n items,\n });\n } else if (isAddSubnetValidatorTx(txDetails)) {\n const { nodeID, start, end, subnetID } = txDetails;\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 } else if (isRemoveSubnetValidatorTx(txDetails)) {\n const { nodeID, subnetID } = txDetails;\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\n const { txFee } = txDetails;\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\nenum AvalancheChainStrings {\n AVM = 'X Chain',\n PVM = 'P Chain',\n EVM = 'C Chain',\n}\n","import { Avalanche } from '@avalabs/core-wallets-sdk';\n\nexport function isPrimarySubnet(subnetId: string): boolean {\n return subnetId === Avalanche.MainnetContext.pBlockchainID;\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 { parseRequestParams } from './schemas/parse-request-params/parse-request-params';\nimport { rpcErrors } from '@metamask/rpc-errors';\nimport { Avalanche } from '@avalabs/core-wallets-sdk';\nimport { avaxSerial, utils, Credential } from '@avalabs/avalanchejs';\nimport { getProvider } from '../../utils/get-provider';\nimport { parseTxDetails } from '../avalanche-send-transaction/utils/parse-tx-details';\nimport { getTransactionDetailSections } from '../../utils/get-transaction-detail-sections';\nimport { getCoreHeaders } from '@internal/utils';\n\nconst GLACIER_API_KEY = process.env.GLACIER_API_KEY;\n\nexport const avalancheSignTransaction = async ({\n request,\n network,\n approvalController,\n glacierApiUrl,\n appInfo,\n}: {\n request: RpcRequest;\n network: Network;\n approvalController: ApprovalController;\n glacierApiUrl: string;\n appInfo: AppInfo;\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 } = result.data;\n const vm = Avalanche.getVmByChainAlias(chainAlias);\n const txBytes = utils.hexToBuffer(transactionHex);\n const isTestnet = network.isTestnet ?? false;\n const provider = getProvider({ isTestnet });\n\n const tx = utils.unpackWithManager(vm, txBytes) as avaxSerial.AvaxTx;\n\n const utxos = await Avalanche.getUtxosByTxFromGlacier({\n transactionHex,\n chainAlias,\n isTestnet,\n url: glacierApiUrl,\n token: GLACIER_API_KEY,\n headers: getCoreHeaders(appInfo),\n });\n\n let credentials: Credential[] | undefined;\n\n try {\n const codecManager = utils.getManagerForVM(vm);\n const signedTx = codecManager.unpack(txBytes, avaxSerial.SignedTx);\n const unsignedTx = await Avalanche.createAvalancheUnsignedTx({\n tx,\n utxos,\n provider,\n credentials: signedTx.getCredentials(),\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,\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 const unsignedTx = await Avalanche.createAvalancheUnsignedTx({\n tx,\n provider,\n credentials,\n utxos,\n });\n\n // check if the current account's signature is needed\n const signerAddress = utils.addressesFromBytes([utils.parse(from)[2]])[0];\n\n if (!signerAddress) {\n return {\n error: rpcErrors.invalidRequest('Missing signer address'),\n };\n }\n\n const ownSignatureIndices = unsignedTx.getSigIndicesForAddress(signerAddress);\n\n if (!ownSignatureIndices) {\n return {\n error: rpcErrors.invalidRequest('This account has nothing to sign'),\n };\n }\n\n const sigIndices = unsignedTx.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\n // get display data for the UI\n const txData = await Avalanche.parseAvalancheTx(unsignedTx, provider, from);\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(unsignedTx.toJSON()),\n ownSignatureIndices,\n };\n\n const details = getTransactionDetailSections(txDetails, network.networkToken.symbol);\n\n const displayData: DisplayData = {\n title: 'Sign 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().describe('Avalanche receiving address'),\n transactionHex: z.string(),\n chainAlias: z.enum(['X', 'P', 'C']),\n});\n\nexport const parseRequestParams = (params: unknown) => {\n return paramsSchema.safeParse(params);\n};\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"]}
|