@avalabs/evm-module 3.14.0 → 4.0.0
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 +2 -2
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +6 -1
- package/dist/index.d.ts +6 -1
- package/dist/index.js +2 -2
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/module.ts","../../../packages-internal/utils/src/services/token-service/token-service.ts","../../../packages-internal/utils/src/utils/charsum.ts","../../../packages-internal/utils/src/utils/array-hash.ts","../../../packages-internal/utils/src/utils/retry.ts","../../../packages-internal/utils/src/utils/coingecko-retry.ts","../../../packages-internal/utils/src/services/token-service/coingecko-proxy-client.ts","../../../packages-internal/utils/src/utils/fetch-and-verify.ts","../../../packages-internal/utils/src/services/token-service/watchlist-proxy-client.ts","../../../packages-internal/utils/src/services/pricing-service/exchange-rates.ts","../../../packages-internal/utils/src/utils/detail-item.ts","../../../packages-internal/utils/src/utils/get-core-headers.ts","../../../packages-internal/utils/src/consts.ts","../../../packages-internal/utils/src/utils/get-glacier-api-key.ts","../../../packages-internal/utils/src/utils/add-glacier-api-key-if-needed.ts","../../../packages-internal/utils/src/utils/glacier-fetch-http-request.ts","../../../packages-internal/utils/src/utils/rpc-error-opts.ts","../manifest.json","../src/constants.ts","../src/env.ts","../src/handlers/build-derivation-path/build-derivation-path.ts","../src/handlers/avalanche-declare-agent-identity/avalanche-declare-agent-identity.ts","../src/utils/resolve-agent-identity.ts","../src/utils/get-provider.ts","../src/handlers/derive-address/derive-address.ts","../../../packages-internal/utils/src/utils/address-derivation.ts","../src/handlers/derive-addresses/derive-addresses.ts","../src/handlers/eth-send-transaction-batch/eth-send-transaction-batch.ts","../src/handlers/eth-send-transaction-batch/schema.ts","../src/utils/transaction-schema.ts","../src/utils/get-nonce.ts","../src/handlers/eth-send-transaction-batch/utils/ensure-proper-nonces.ts","../src/utils/build-tx-approval-request.ts","../src/utils/build-agent-identity-detail-section.ts","../src/types.ts","../src/utils/parse-erc20-transaction-type.ts","../src/utils/get-recipient-address.ts","../src/utils/classify-transaction.ts","../src/utils/parse-eerc-transaction.ts","../src/utils/eerc-abi.ts","../src/utils/get-tx-hash.ts","../src/handlers/get-transaction-history/utils/get-explorer-address-by-network.ts","../src/utils/wait-for-transaction-receipt.ts","../src/utils/evm-tx-batch-updater.ts","../src/handlers/eth-send-transaction-batch/utils/process-transaction-batch-simulation.ts","../src/utils/type-utils.ts","../src/utils/process-transaction-simulation.ts","../src/utils/scan-transaction.ts","../src/utils/parse-erc20-tx.ts","../src/utils/transaction-alerts.ts","../src/utils/get-agent-identity-from-context.ts","../src/handlers/eth-send-transaction/eth-send-transaction.ts","../src/utils/evm-tx-updater.ts","../src/utils/encode-erc20-approval.ts","../src/utils/estimate-gas-limit.ts","../src/handlers/eth-send-transaction/schema.ts","../src/handlers/eth-sign/eth-sign.ts","../src/handlers/eth-sign/utils/beautify-message/beautify-message.ts","../src/handlers/eth-sign/schemas/parse-request-params/parse-request-params.ts","../src/handlers/eth-sign/schemas/eth-sign.ts","../src/handlers/eth-sign/schemas/shared.ts","../src/handlers/eth-sign/schemas/eth-sign-typed-data.ts","../src/handlers/eth-sign/schemas/personal-sign.ts","../src/handlers/eth-sign/utils/typeguards.ts","../src/handlers/eth-sign/utils/is-typed-data-valid.ts","../src/handlers/forward-to-rpc-node/forward-to-rpc-node.ts","../src/handlers/get-address/get-address.ts","../src/handlers/get-balances/get-balances.ts","../src/services/rpc-service/rpc-service.ts","../src/utils/id-promise.ts","../src/handlers/get-tokens/get-tokens.ts","../src/utils/find-async.ts","../src/handlers/get-network-fee/get-network-fee.ts","../src/handlers/get-transaction-history/converters/moralis-transaction-converter/convert-moralis-transaction.ts","../src/handlers/get-transaction-history/converters/evm-transaction-converter/get-tx-type.ts","../src/handlers/get-transaction-history/converters/moralis-transaction-converter/get-transactions-from-moralis.ts","../src/handlers/get-transaction-history/utils/moralis-chain-ids.ts","../src/handlers/get-transaction-history/converters/evm-transaction-converter/get-sender-info.ts","../src/handlers/get-transaction-history/converters/evm-transaction-converter/get-tokens.ts","../src/handlers/get-transaction-history/utils/resolve.ts","../src/handlers/get-transaction-history/utils/ipfs-resolver-with-fallback.ts","../src/handlers/get-transaction-history/converters/evm-transaction-converter/get-nft-metadata.ts","../src/handlers/get-transaction-history/utils/get-small-image-for-nft.ts","../src/handlers/get-transaction-history/converters/evm-transaction-converter/convert-transaction.ts","../src/handlers/get-transaction-history/converters/evm-transaction-converter/get-transactions-from-glacier.ts","../src/handlers/get-transaction-history/converters/hyperevm-transaction-converter/get-transactions-from-hyperevm.ts","../src/handlers/get-transaction-history/get-transaction-history.ts","../src/services/debank-service/debank-service.ts","../src/utils/ipsf-resolver-with-fallback.ts","../src/utils/get-small-image-for-nft.ts","../src/services/debank-service/de-bank.ts","../src/services/glacier-service/glacier-service.ts","../src/services/hyperevm-etherscan-client/hyperevm-etherscan-client.ts","../src/services/hyperevm-etherscan-client/schemas.ts"],"names":["parseManifest","RpcMethod","Blockaid","VsCurrencyType","getBasicCoingeckoHttp","simplePrice","simpleTokenPrice","charsum","s","i","sum","__name","arrayHash","array","cs","retry","operation","isSuccess","maxRetries","backoffPolicy","RetryBackoffPolicy","backoffPeriodMillis","retries","lastError","delay","result","err","errorMessage","_RetryBackoffPolicy","retryIndex","secondsToDelay","_","msToDelay","linearCount","linearStepMs","n","base","incSum","ms","r","coingeckoRetry","response","RawSimplePriceResponseSchema","fetchAndVerify","fetchOptions","schema","fetchFn","responseJson","_CoingeckoProxyClient","proxyApiUrl","params","queryParams","id","rawQueryParams","CoingeckoProxyClient","z","WatchlistTokenResponseSchema","_WatchlistProxyClient","WatchlistProxyClient","_storage","_proxyApiUrl","_fetchFn","_coingeckoBasicClient","_TokenService","storage","fetch","__privateAdd","__publicField","data","currencies","formattedData","tokenData","currency","__privateSet","__privateGet","tokenDetails","token","tokenInfo","coinIds","cacheId","useCoingeckoProxy","tokenAddresses","assetPlatformId","rawData","marketCap","vol24","change24","lastUpdated","shouldThrow","TokenService","number","object","record","string","CURRENCY_EXCHANGE_RATES_URL","CURRENCY_EXCHANGE_RATES_FALLBACK_URL","ExchangeRateSchema","getExchangeRates","DetailItemType","textItem","label","value","alignment","linkItem","addressItem","networkItem","AppName","getCoreHeaders","name","version","GLACIER_API_KEY","getGlacierApiKey","knownHosts","addGlacierAPIKeyIfNeeded","url","urlObj","glacierApiKey","search_params","ApiError","CancelablePromise","FetchHttpRequest","GLOBAL_QUERY_PARAMS","_failedRequests","_getDelay","_request","request_fn","_postponeRequest","postponeRequest_fn","_GlacierFetchHttpRequest","config","options","mergedQuery","modifiedOptions","getRequest","__privateMethod","inner","resolve","reject","onCancel","isHttpTooManyRequests","isHttpInternalServerError","timeout","GlacierFetchHttpRequest","rpcErrorOpts","message","cause","rpcErrors","manifest_default","BLOCKAID_API_KEY","Environment","prodEnv","devEnv","getEnv","environment","NetworkVMType","buildDerivationPath","accountIndex","derivationPathType","Contract","getAddress","toUtf8String","JsonRpcBatchInternal","FetchRequest","EVMNetwork","getProvider","chainId","chainName","rpcUrl","multiContractAddress","pollingInterval","customRpcHeaders","urlOrFetchRequest","fetchRequest","provider","FIVE_MINUTES_MS","DEFAULT_REPUTATION_REGISTRIES","IDENTITY_ABI","REPUTATION_ABI","cache","getTrustLevel","score","clampScore","toNumber","numeric","scaleFixedPoint","decimals","numericValue","numericDecimals","isReputationSummaryTuple","summary","isReputationFeedbackTuple","feedback","getSummaryValue","getFeedbackValues","values","valueDecimals","tag1s","tag2s","revoked","index","averageScores","scores","filtered","STARRED_TAG","dedupeAddresses","addresses","seen","deduped","address","normalized","getFeedbackClients","resolveReputationScore","reputationContract","parsedRegistryAddress","agentId","feedbackResult","entry","clientAddresses","parseAgentRegistry","agentRegistry","namespace","parsedChainId","buildFallback","declaration","callFirst","calls","results","call","decodeMetadata","resolveAgentIdentity","cached","parsedRegistry","normalizedDeclaration","fallback","identityContract","reputationRegistry","owner","metadataUri","reputationScore","normalizedReputationScore","resolved","avalancheDeclareAgentIdentity","request","network","parsed","computeAddress","hasDerivationDetails","deriveAddress","secretId","approvalController","derivationPath","publicKeyHex","deriveAddressesForEvm","init","deriveAddresses","accountIndices","publicKeys","transactionSchema","transactionArraySchema","transactions","areAllEqualByProp","areAllEmptyByProp","areAllDifferentByProp","batchOptionsSchema","transactionBatchSchema","elements","prop","el","parseRequestParams","getNonce","from","ensureProperNonces","nonce","transaction","isNavigableMetadataUri","isEmbeddedDataUri","buildAgentIdentityDetailSection","agentIdentity","items","TransactionType","NonContractCallTypes","ERC20TransactionType","TransactionKind","Interface","ERC20","parseERC20TransactionType","description","functionName","isERC20TransactionType","getRecipientAddress","recipient","classifyTransaction","erc20Type","EERC_ABI","EercOperation","eercInterface","parseEercTransaction","isEercOperation","buildTxApprovalRequest","isSimulationSuccessful","balanceChange","tokenApprovals","alert","eercDisplayEnabled","dappInfo","transactionType","title","recipientAddress","transactionDetails","item","transactionClassification","eercTransaction","displayData","signingData","getTxHash","broadcast","getExplorerAddressByNetwork","explorerUrl","hash","hashType","waitForTransactionReceipt","txHash","onTransactionPending","onTransactionConfirmed","onTransactionReverted","explorerLink","error","requests","getTxBatchUpdater","requestId","signingRequests","maxFeeRate","maxTipRate","txIndex","updatedRequest","signingRequest","AlertType","TokenType","isNetworkToken","isERC20Token","hasToField","supportsBatchApprovals","controller","isBalanceChange","input","isTokenApprovals","isEmpty","balanceToDisplayValue","numberToBN","isHexString","MaxUint256","scanTransactionBatch","domain","withGasEstimation","blockaid","scanTransaction","scanJsonRpc","accountAddress","xss","ethers","TokenUnit","parseWithErc20Abi","contract","contractCalls","symbol","iface","calledFunction","decodeFunctionData","transactionAlerts","simulateTransaction","rpcMethod","dAppUrl","simulationResult","processTransactionSimulation","estimatedGasLimit","validation","simulation","gasEstimation","processTokenApprovals","processBalanceChange","erc20ParseResult","isExposureTrace","trace","normalizeAddresses","spender","assetAddress","mapExposureTracesToSpenderAsset","traces","accumulator","accountSummary","mappedExposureTraces","approvals","convertAssetToNetworkContractToken","tokenApproval","raw_value","usd_price","amount","accountSummaryAssetsDiffs","ins","processAssetDiffs","outs","type","assetDiff","a","b","asset","convertNativeAssetToToken","diff","displayValue","valueBN","logoUri","tokenId","x","processJsonRpcSimulation","simulateTransactionBatch","populateMissingGas","simulationResults","scans","matchingTx","processedResult","scan","getHighestAlert","aggregateBalanceChange","aggregateTokenApprovals","alertPrio","highest","aggregatedTokenApprovals","appr","aggregatedApproval","aggrApproval","clearSpentApprovals","aggregated","aggregatedBalanceChange","aggregatedDiff","findTokenDiff","diffs","lookupDiff","approval","latestApprovalState","isAgentIdentityDeclaration","candidate","getAgentIdentityFromContext","ethSendTransactionBatch","parsedParams","success","transactionRequests","skipIntermediateTxs","allTransactionPayloadsHaveGas","tx","cleanup","updateTx","txHashes","isLast","encodeApprovalLimit","tokenAddress","spenderAddress","limit","getTxUpdater","approvalLimit","gasLimit","newSigningData","newDisplayData","ensureTokenApprovalCanBeEdited","ensureApproveWasCalled","txData","estimateGasLimit","to","accessList","paramsSchema","ethSendTransaction","eercEnabled","shouldRetry","beautifyComplexMessage","key","toUnicodeBold","subKey","beautifySimpleMessage","str","boldMap","char","messageSchema","addressSchema","ethSignSchema","messageTypeSchema","typedDataSchema","typedDataV1Schema","combinedTypedDataSchema","dataSchema","combinedDataSchema","ethSignTypedDataSchema","ethSignTypedDataV1Schema","ethSignTypedDataV3Schema","ethSignTypedDataV4Schema","personalSignSchema","ctx","method","isTypedDataV1","isTypedData","TypedDataEncoder","isTypedDataValid","EIP712Domain","types","e","ethSign","typedDataValidationResult","messageDetails","primaryType","messageToDisplay","forwardToRpcNode","rpcError","WalletType","getAddressFromXPub","getEvmAddressFromPubKey","xpub","walletType","pubKeyBuffer","addIdToPromise","promise","reason","settleAllIdPromises","promises","acc","PROXY_API_CONTRACT_TYPE_TO_TOKEN_TYPE","ContractTypeSchema","raw","mapped","ProxyApiTokenSchema","ProxyApiTokensSchema","tokens","getTokens","_network","_customTokens","_fetch","_RpcService","customTokens","coingeckoTokenId","networkToken","tokenService","simplePriceResponse","priceInCurrency","balance","balanceUnit","balanceInCurrency","customTokensOnly","coingeckoPlatformId","erc20TokenList","getTokenWithBalance","tokenBalancePromises","tokenBalancesResults","tokenIds","erc20TokenBalances","tokenBalance","RpcService","findAsync","asyncCallback","found","getBalances","tokenTypes","balanceServices","rpcService","services","resolvedTokenTypes","supportingService","balanceService","balances","nativeTokenPromises","erc20TokenPromises","nftTokenPromises","nativeBalance","avaxMarketData","nativeTokenBalances","nftTokenBalances","balanceOrError","tokenSymbol","balancesOrError","ChainId","DEFAULT_PRESETS","BASE_PRIORITY_FEE_WEI","isCChain","POLYGON_MAINNET_CHAIN_ID","POLYGON_AMOY_CHAIN_ID","isPolygon","POLYGON_GAS_STATION_URL","gweiToWei","gwei","getPolygonGasStationFees","getNetworkFee","caipId","suggestedFees","suggestPriceOptions","lastBlock","baseFeePerGas","gasMultiplier","getGasMultiplier","multiplier","baseFee","maxPriorityFeePerGas","maxFee","lowMaxTip","mediumMaxTip","highMaxTip","respond","multipliers","startCase","isNftTokenType","convertTransactionType","txType","isSender","walletAddress","normalizedWallet","userReceivedNft","userSentNft","receiveLike","sendLike","getTxType","nativeTransaction","erc20Transfers","erc721Transfers","erc1155Transfers","userAddress","nativeOnly","parseRawMethod","isSwap","isNativeSend","isNativeReceive","isNFTPurchase","isApprove","isTransfer","isAirdrop","isUnwrap","isFillOrder","provisionalTxType","isTxSigner","convertMoralisTransaction","timestamp","getMoralisTransactionType","isContractCall","NON_CONTRACT_CALL_CATEGORIES","buildTokens","CATEGORY_TO_TX_TYPE","category","getTransferAddress","trimOrEmpty","shortenHexAddress","getErc20DisplaySymbol","transfer","fromSymbol","fromName","nativeTokens","buildNativeToken","erc20Tokens","buildErc20Token","buildNftToken","buildFallbackNativeToken","displaySymbol","displayName","tokenType","displayAmount","MORALIS_PROXY_BASE_URL","getTransactionsFromMoralis","nextPageToken","offset","chainHex","MORALIS_SUPPORTED_CHAIN_IDS","isMoralisSupportedChain","getSenderInfo","isOutgoingByTxType","isIncomingByTxType","isOutgoing","isIncoming","res","ipfsResolver","CLOUDFLARE_IPFS_URL","ipfsResolverWithFallback","sourceUrl","desiredGatewayPrefix","fetchWithTimeout","uri","getNftMetadata","tokenUri","json","COVALENT_IMG_SIZER","getSmallImageForNFT","imgUrl","imageSize","decimal","amountDisplayValue","erc20Transfer","erc721Transfer","imageUri","getImageUri","erc1155Transfer","metadata","convertTransaction","blockTimestamp","gasPrice","gasUsed","getTransactionsFromGlacier","glacierService","tranasaction","getTransactionsFromHyperEvm","client","page","getPage","normal","erc20","internal","aggregates","aggregate","getAggregate","nativeToken","erc20Token","internalToken","toTransaction","hasNextPage","list","existing","wallet","hasIncoming","hasOutgoing","HYPEREVM_CHAIN_ID","getTransactionHistory","hyperEvmEtherscanClient","NftTokenMetadataStatus","IPFS_URL","_supportedChainIds","_DeBank","baseUrl","chain","tokenBalanceResponse","chainListResponse","DeBankNftTokenListSchema","DeBank","BaseDeBankTokenSchema","DeBankNftTokenSchema","_deBank","_getChainInfo","getChainInfo_fn","_mapNftList","mapNftList_fn","_DeBankService","chainInfo","chainIdString","nativeTokenBalance","tokenUnit","balanceDisplayValue","usdToCurrencyRate","balanceCurrencyDisplayValue","tokenBalances","exchangeRates","nftList","deBankNftList","DeBankService","Erc1155Token","Erc721Token","Glacier","_GlacierUnhealthyError","GlacierUnhealthyError","CHAINS_TO_FILTER","_EvmGlacierService","glacierApiUrl","headers","supportedChains","coingeckoId","entries","tokenlist","tokensWithBalance","convertErc20TokenWithBalanceToTokenWithBalance","convertErc20TokenToTokenWithBalance","pageToken","pageSize","EvmGlacierService","hyperEvmNormalTransactionSchema","hyperEvmErc20TransferSchema","hyperEvmInternalTransactionSchema","resolveFetch","_apiUrl","_list","list_fn","_HyperEvmEtherscanClient","action","HyperEvmEtherscanClient","_glacierService","_deBankService","_approvalController","_blockaid","_runtime","_hyperEvmEtherscanClient","_EvmModule","appInfo","runtime","utilityAddresses","shouldForwardToRpcNode","EvmModule"],"mappings":"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","sourcesContent":["import type { JsonRpcBatchInternal } from '@avalabs/core-wallets-sdk';\nimport {\n parseManifest,\n RpcMethod,\n type ApprovalController,\n type BuildDerivationPathParams,\n type ConstructorParams,\n type DeriveAddressesParams,\n type DeriveAddressesResponse,\n type DeriveAddressParams,\n type DeriveAddressResponse,\n type GetAddressParams,\n type GetAddressResponse,\n type GetBalancesParams,\n type GetBalancesResponse,\n type GetTransactionHistory,\n type Manifest,\n type Module,\n type Network,\n type NetworkFeeParam,\n type NetworkFees,\n type RpcRequest,\n type RuntimeParams,\n} from '@avalabs/vm-module-types';\nimport Blockaid from '@blockaid/client';\nimport { getCoreHeaders, TokenService } from '@internal/utils';\nimport { rpcErrors } from '@metamask/rpc-errors';\nimport ManifestJson from '../manifest.json';\nimport { BLOCKAID_API_KEY } from './constants';\nimport { getEnv } from './env';\nimport { buildDerivationPath } from './handlers/build-derivation-path/build-derivation-path';\nimport { avalancheDeclareAgentIdentity } from './handlers/avalanche-declare-agent-identity/avalanche-declare-agent-identity';\nimport { deriveAddress } from './handlers/derive-address/derive-address';\nimport { deriveAddresses } from './handlers/derive-addresses/derive-addresses';\nimport { ethSendTransactionBatch } from './handlers/eth-send-transaction-batch/eth-send-transaction-batch';\nimport { ethSendTransaction } from './handlers/eth-send-transaction/eth-send-transaction';\nimport { ethSign } from './handlers/eth-sign/eth-sign';\nimport { forwardToRpcNode } from './handlers/forward-to-rpc-node/forward-to-rpc-node';\nimport { getAddress } from './handlers/get-address/get-address';\nimport { getBalances } from './handlers/get-balances/get-balances';\nimport { getNetworkFee } from './handlers/get-network-fee/get-network-fee';\nimport { getTokens } from './handlers/get-tokens/get-tokens';\nimport { getTransactionHistory } from './handlers/get-transaction-history/get-transaction-history';\nimport { DeBankService } from './services/debank-service/debank-service';\nimport { EvmGlacierService } from './services/glacier-service/glacier-service';\nimport { getProvider } from './utils/get-provider';\nimport { supportsBatchApprovals } from './utils/type-utils';\nimport { HyperEvmEtherscanClient } from './services/hyperevm-etherscan-client/hyperevm-etherscan-client';\n\n/** EVM-specific feature toggles, resolved from the consumer's feature-flag source. */\ntype EvmModuleFeatures = {\n encryptedERCs: boolean;\n};\n\n/** EVM module runtime params: the shared ones plus EVM-specific feature toggles. */\ntype EvmRuntimeParams = RuntimeParams & {\n features?: Partial<EvmModuleFeatures>;\n};\n\ntype EvmConstructorParams = Omit<ConstructorParams, 'runtime'> & {\n runtime?: EvmRuntimeParams;\n};\n\nexport class EvmModule implements Module {\n #glacierService: EvmGlacierService;\n #deBankService: DeBankService;\n #proxyApiUrl: string;\n #approvalController: ApprovalController;\n #blockaid: Blockaid;\n #runtime?: EvmRuntimeParams;\n #hyperEvmEtherscanClient: HyperEvmEtherscanClient;\n\n constructor({ approvalController, environment, appInfo, runtime }: EvmConstructorParams) {\n const { glacierApiUrl, proxyApiUrl } = getEnv(environment);\n this.#runtime = runtime;\n this.#glacierService = new EvmGlacierService({\n glacierApiUrl,\n headers: getCoreHeaders(appInfo),\n });\n this.#deBankService = new DeBankService({ proxyApiUrl, fetch: this.#runtime?.fetch });\n this.#proxyApiUrl = proxyApiUrl;\n this.#hyperEvmEtherscanClient = new HyperEvmEtherscanClient({\n proxyApiUrl,\n fetch: this.#runtime?.fetch,\n });\n this.#approvalController = approvalController;\n this.#blockaid = new Blockaid({\n baseURL: proxyApiUrl + '/proxy/blockaid/',\n apiKey: BLOCKAID_API_KEY,\n httpAgent: runtime?.httpAgent,\n fetch: runtime?.fetch,\n });\n }\n\n /**\n * Applies a partial update to the module's runtime params, overriding only the\n * provided keys (nested `features` are merged, not replaced). The module is\n * constructed once, so the consumer uses this to push later changes (e.g. flags).\n */\n updateRuntimeParams(params: Partial<EvmRuntimeParams>): void {\n this.#runtime = {\n ...this.#runtime,\n ...params,\n features: {\n ...this.#runtime?.features,\n ...params.features,\n },\n };\n }\n\n getProvider(network: Network): Promise<JsonRpcBatchInternal> {\n return getProvider({\n chainId: network.chainId,\n chainName: network.chainName,\n rpcUrl: network.rpcUrl,\n multiContractAddress: network.utilityAddresses?.multicall,\n pollingInterval: 1000,\n customRpcHeaders: network.customRpcHeaders,\n });\n }\n\n getAddress({ accountIndex, xpub, walletType }: GetAddressParams): Promise<GetAddressResponse> {\n return getAddress({ accountIndex, xpub, walletType });\n }\n\n buildDerivationPath(params: BuildDerivationPathParams) {\n return buildDerivationPath(params);\n }\n\n deriveAddress(params: DeriveAddressParams): Promise<DeriveAddressResponse> {\n return deriveAddress({\n ...params,\n approvalController: this.#approvalController,\n });\n }\n\n deriveAddresses(params: DeriveAddressesParams): Promise<DeriveAddressesResponse> {\n return deriveAddresses({\n ...params,\n approvalController: this.#approvalController,\n });\n }\n\n getBalances({\n addresses,\n network,\n currency,\n customTokens,\n storage,\n tokenTypes,\n customTokensOnly,\n }: GetBalancesParams): Promise<GetBalancesResponse> {\n const tokenService = new TokenService({ storage, proxyApiUrl: this.#proxyApiUrl, fetch: this.#runtime?.fetch });\n return getBalances({\n addresses,\n currency,\n network,\n proxyApiUrl: this.#proxyApiUrl,\n customTokens,\n customTokensOnly,\n balanceServices: [this.#glacierService, this.#deBankService],\n storage,\n tokenTypes,\n tokenService,\n fetch: this.#runtime?.fetch,\n });\n }\n\n getManifest(): Manifest | undefined {\n const result = parseManifest(ManifestJson);\n return result.success ? result.data : undefined;\n }\n\n getNetworkFee(network: NetworkFeeParam): Promise<NetworkFees> {\n const { chainId, chainName, rpcUrl, utilityAddresses, caipId, customRpcHeaders } = network;\n return getNetworkFee({\n chainId,\n chainName,\n rpcUrl,\n multiContractAddress: utilityAddresses?.multicall,\n caipId,\n proxyApiUrl: this.#proxyApiUrl,\n customRpcHeaders,\n });\n }\n\n getTransactionHistory(params: GetTransactionHistory) {\n const { network, address, nextPageToken, offset } = params;\n const { chainId, networkToken, explorerUrl = '' } = network;\n\n return getTransactionHistory({\n chainId,\n networkToken,\n explorerUrl,\n address,\n nextPageToken,\n offset,\n glacierService: this.#glacierService,\n hyperEvmEtherscanClient: this.#hyperEvmEtherscanClient,\n });\n }\n\n getTokens(network: Network) {\n const { chainId } = network;\n return getTokens({ chainId, proxyApiUrl: this.#proxyApiUrl });\n }\n\n async onRpcRequest(request: RpcRequest, network: Network) {\n switch (request.method) {\n case RpcMethod.ETH_SEND_TRANSACTION:\n return ethSendTransaction({\n request,\n network,\n approvalController: this.#approvalController,\n blockaid: this.#blockaid,\n eercEnabled: this.#runtime?.features?.encryptedERCs === true,\n });\n case RpcMethod.ETH_SEND_TRANSACTION_BATCH: {\n if (!supportsBatchApprovals(this.#approvalController)) {\n return {\n error: rpcErrors.methodNotSupported(`Method ${request.method} requires BatchApprovalController`),\n };\n }\n\n return ethSendTransactionBatch({\n request,\n network,\n approvalController: this.#approvalController,\n blockaid: this.#blockaid,\n });\n }\n case RpcMethod.AVALANCHE_DECLARE_AGENT_IDENTITY:\n return avalancheDeclareAgentIdentity({\n request,\n network,\n });\n case RpcMethod.PERSONAL_SIGN:\n case RpcMethod.ETH_SIGN:\n case RpcMethod.SIGN_TYPED_DATA:\n case RpcMethod.SIGN_TYPED_DATA_V1:\n case RpcMethod.SIGN_TYPED_DATA_V3:\n case RpcMethod.SIGN_TYPED_DATA_V4:\n return ethSign({\n request,\n network,\n approvalController: this.#approvalController,\n blockaid: this.#blockaid,\n });\n default:\n if (shouldForwardToRpcNode(request.method)) {\n return forwardToRpcNode(request, network);\n }\n\n return { error: rpcErrors.methodNotSupported(`Method ${request.method} not supported`) };\n }\n }\n}\n\nconst shouldForwardToRpcNode = (method: RpcMethod) => {\n return (\n method.startsWith('eth_') ||\n ['web3_clientVersion', 'web3_sha3', 'net_version', 'net_peerCount', 'net_listening'].includes(method)\n );\n};\n","import {\n VsCurrencyType,\n getBasicCoingeckoHttp,\n simplePrice,\n simpleTokenPrice,\n type SimplePriceParams,\n} from '@avalabs/core-coingecko-sdk';\nimport type { RawSimplePriceResponse, SimplePriceResponse, Storage } from '@avalabs/vm-module-types';\nimport { arrayHash } from '../../utils/array-hash';\nimport { coingeckoRetry } from '../../utils/coingecko-retry';\nimport { CoingeckoProxyClient } from './coingecko-proxy-client';\nimport { WatchlistProxyClient } from './watchlist-proxy-client';\n\ntype FetchFn = typeof globalThis.fetch;\n\ntype ConstructorParams = {\n storage?: Storage;\n proxyApiUrl: string;\n fetch?: FetchFn;\n};\n\nexport class TokenService {\n #storage?: Storage;\n #proxyApiUrl: string;\n #fetchFn: FetchFn;\n #coingeckoBasicClient: ReturnType<typeof getBasicCoingeckoHttp>;\n\n constructor({ storage, proxyApiUrl, fetch }: ConstructorParams) {\n this.#storage = storage;\n this.#proxyApiUrl = proxyApiUrl;\n this.#fetchFn = fetch ?? globalThis.fetch;\n this.#coingeckoBasicClient = getBasicCoingeckoHttp(undefined, this.#fetchFn);\n }\n\n async getWatchlistDataForToken({\n tokenDetails,\n currency = VsCurrencyType.USD,\n }: {\n tokenDetails: {\n symbol: string;\n isNative: boolean;\n caip2Id: string;\n address?: string;\n };\n currency: VsCurrencyType;\n }): Promise<{\n priceInCurrency: number;\n change24: number;\n marketCap: number;\n vol24: number;\n }> {\n const data = (\n await new WatchlistProxyClient(this.#proxyApiUrl).watchlistToken({\n tokens: tokenDetails.symbol,\n currency: currency,\n })\n ).filter((token) => {\n return tokenDetails.isNative\n ? token.internalId === `NATIVE-${tokenDetails.symbol.toLowerCase()}`\n : token.platforms[tokenDetails.caip2Id] === tokenDetails.address;\n });\n\n const [tokenInfo] = data;\n\n if (!tokenInfo) {\n return {\n priceInCurrency: 0,\n change24: 0,\n marketCap: 0,\n vol24: 0,\n };\n }\n\n return {\n priceInCurrency: tokenInfo.current_price ?? 0,\n change24: tokenInfo.price_change_percentage_24h ?? 0,\n marketCap: tokenInfo.market_cap ?? 0,\n vol24: tokenInfo.total_volume ?? 0,\n };\n }\n\n /**\n * Get token price with market data first on coingecko (free tier) directly,\n * if we get 429 error, retry it on coingecko proxy (paid service)\n * @returns token price with market data\n */\n async getSimplePrice({\n coinIds = [],\n currencies = [VsCurrencyType.USD],\n }: SimplePriceParams): Promise<SimplePriceResponse | undefined> {\n let data: SimplePriceResponse | undefined;\n\n const key = coinIds ? `${arrayHash(coinIds)}-${currencies.toString()}` : `${currencies.toString()}`;\n\n const cacheId = `getSimplePrice-${key}`;\n\n data = this.#storage?.get?.<SimplePriceResponse>(cacheId);\n\n if (data) return data;\n\n try {\n data = await coingeckoRetry((useCoingeckoProxy) =>\n this.simplePrice({\n coinIds,\n currencies,\n marketCap: true,\n vol24: true,\n change24: true,\n useCoingeckoProxy,\n }),\n );\n } catch {\n data = undefined;\n }\n this.#storage?.set?.(cacheId, data);\n return data;\n }\n\n /**\n * Get token price with market data for a list of addresses\n * @param tokenAddresses the token addresses\n * @param assetPlatformId The platform id for all the tokens in the list\n * @param currency the currency to be used\n * @returns a list of token price with market data\n */\n async getPricesByAddresses(\n tokenAddresses: string[],\n assetPlatformId: string,\n currency: VsCurrencyType = VsCurrencyType.USD,\n ): Promise<SimplePriceResponse | undefined> {\n let data: SimplePriceResponse | undefined;\n\n const key = `${arrayHash(tokenAddresses)}-${assetPlatformId}-${currency}`;\n\n const cacheId = `getPricesWithMarketDataByAddresses-${key}`;\n data = this.#storage?.get?.<SimplePriceResponse>(cacheId);\n\n if (data) return data;\n\n try {\n data = await coingeckoRetry((useCoingeckoProxy) =>\n this.fetchPricesByAddresses({\n assetPlatformId,\n tokenAddresses,\n currency,\n useCoingeckoProxy,\n }),\n );\n } catch (err) {\n console.error(err);\n data = undefined;\n }\n this.#storage?.set?.(cacheId, data);\n return data;\n }\n\n private async fetchPricesByAddresses({\n assetPlatformId,\n tokenAddresses,\n currency = VsCurrencyType.USD,\n useCoingeckoProxy = false,\n }: {\n assetPlatformId: string;\n tokenAddresses: string[];\n currency: VsCurrencyType;\n useCoingeckoProxy?: boolean;\n }): Promise<SimplePriceResponse> {\n if (useCoingeckoProxy) {\n const rawData = await new CoingeckoProxyClient(this.#proxyApiUrl, this.#fetchFn).simplePriceByContractAddresses({\n id: assetPlatformId,\n contract_addresses: tokenAddresses,\n vs_currencies: [currency],\n include_market_cap: true,\n include_24hr_vol: true,\n include_24hr_change: true,\n });\n return this.transformSimplePriceResponse(rawData, [currency]);\n }\n\n return simpleTokenPrice(this.#coingeckoBasicClient, {\n assetPlatformId,\n tokenAddresses,\n currencies: [currency],\n marketCap: true,\n vol24: true,\n change24: true,\n });\n }\n\n private async simplePrice({\n coinIds = [],\n currencies = [VsCurrencyType.USD],\n marketCap = false,\n vol24 = false,\n change24 = false,\n lastUpdated = false,\n useCoingeckoProxy = false,\n shouldThrow = true,\n }: SimplePriceParams & { useCoingeckoProxy?: boolean }): Promise<SimplePriceResponse> {\n if (useCoingeckoProxy) {\n const rawData = await new CoingeckoProxyClient(this.#proxyApiUrl, this.#fetchFn).simplePrice({\n ids: coinIds,\n vs_currencies: currencies,\n include_market_cap: marketCap,\n include_24hr_vol: vol24,\n include_24hr_change: change24,\n include_last_updated_at: lastUpdated,\n });\n return this.transformSimplePriceResponse(rawData, currencies);\n }\n return simplePrice(this.#coingeckoBasicClient, {\n coinIds,\n currencies,\n marketCap,\n vol24,\n change24,\n lastUpdated,\n shouldThrow,\n });\n }\n\n private transformSimplePriceResponse = (\n data: RawSimplePriceResponse,\n currencies = [VsCurrencyType.USD],\n ): SimplePriceResponse => {\n const formattedData: SimplePriceResponse = {};\n Object.keys(data).forEach((id) => {\n const tokenData = data[id];\n formattedData[id] = {};\n currencies.forEach((currency: VsCurrencyType) => {\n formattedData[id] = {\n [currency]: {\n price: tokenData?.[currency],\n change24: tokenData?.[`${currency}_24h_change`],\n vol24: tokenData?.[`${currency}_24h_vol`],\n marketCap: tokenData?.[`${currency}_market_cap`],\n },\n };\n });\n });\n return formattedData;\n };\n}\n","export function charsum(s: string): number {\n let i,\n sum = 0;\n for (i = 0; i < s.length; i++) {\n sum += s.charCodeAt(i) * (i + 1);\n }\n return sum;\n}\n","import { charsum } from './charsum';\n\n// from https://stackoverflow.com/a/25105589\nexport function arrayHash(array: string[]): string {\n let i,\n sum = 0;\n for (i = 0; i < array.length; i++) {\n const cs = charsum(array[i] ?? '');\n sum = sum + 65027 / cs;\n }\n return ('' + sum).slice(0, 16);\n}\n","const DEFAULT_MAX_RETRIES = 10;\n\ntype RetryParams<T> = {\n operation: (retryIndex: number) => Promise<T>;\n isSuccess: (result: T) => boolean;\n maxRetries?: number;\n backoffPolicy?: RetryBackoffPolicyInterface;\n};\n/*\n * Retries an operation with defined backoff policy.\n *\n * @param operation - The operation to retry.\n * @param isSuccess - The predicate to check if the operation succeeded.\n * @param maxRetries - The maximum number of retries.\n * @param backoffPolicy - Function to generate delay time based on current retry count.\n *\n * @returns The result of the operation.\n * @throws An error if the operation fails after the maximum number of retries.\n *\n * @example\n * const result = await retry(\n * async () => {\n * const response = await fetch('https://example.com')\n * return response.json()\n * },\n * result => result.status === 200\n * )\n */\nexport const retry = async <T>({\n operation,\n isSuccess,\n maxRetries = DEFAULT_MAX_RETRIES,\n backoffPolicy = RetryBackoffPolicy.exponential(),\n}: RetryParams<T>): Promise<T> => {\n let backoffPeriodMillis = 0;\n let retries = 0;\n let lastError: unknown;\n\n while (retries < maxRetries) {\n if (retries > 0) {\n await delay(backoffPeriodMillis);\n }\n\n try {\n const result = await operation(retries);\n\n if (isSuccess(result)) {\n return result;\n }\n } catch (err) {\n // when the operation throws an error, we still retry\n lastError = err;\n }\n\n backoffPeriodMillis = backoffPolicy(retries);\n retries++;\n }\n\n const errorMessage = lastError ? `Max retry exceeded. ${lastError}` : 'Max retry exceeded.';\n\n throw new Error(errorMessage);\n};\n\ntype RetryBackoffPolicyInterface = (retryIndex: number) => number;\n\nexport class RetryBackoffPolicy {\n static exponential(): RetryBackoffPolicyInterface {\n return (retryIndex: number): number => {\n return Math.pow(2, retryIndex) * 1000;\n };\n }\n\n static constant(secondsToDelay: number): RetryBackoffPolicyInterface {\n return (_: number): number => {\n return secondsToDelay * 1000;\n };\n }\n\n static constantMs(msToDelay: number): RetryBackoffPolicyInterface {\n return (_: number): number => {\n return msToDelay;\n };\n }\n\n /**\n * linearThenExponential backoff:\n * - First `linearCount` retries: linear increase by `linearStepMs`\n * - After that: increment grows exponentially based on `linearStepMs`\n * Example (linearCount=4, linearStepMs=1000):\n * 1s, 2s, 3s, 4s, 6s, 10s, 18s, 34s...\n */\n static linearThenExponential(linearCount: number, linearStepMs: number): RetryBackoffPolicyInterface {\n return (retryIndex: number): number => {\n if (retryIndex < linearCount) {\n // Linear phase: (i+1) * step\n return (retryIndex + 1) * linearStepMs;\n }\n // Exponential-increment phase (closed form):\n // n = number of exponential increments applied\n // base = linearCount * step\n // increment sum = 2*step * (2^n - 1)\n const n = retryIndex - linearCount + 1;\n const base = linearCount * linearStepMs;\n const incSum = 2 * linearStepMs * (Math.pow(2, n) - 1);\n return base + incSum;\n };\n }\n}\n\nfunction delay(ms: number) {\n return new Promise((r) => setTimeout(r, ms));\n}\n","import { RetryBackoffPolicy, retry } from './retry';\n\ntype Error = {\n status: {\n error_code: number;\n error_message: string;\n };\n};\n\nexport const coingeckoRetry = <T>(\n operation: (useCoingeckoProxy: boolean) => Promise<T | Error>,\n): Promise<T | undefined> => {\n return retry({\n operation: (retryIndex: number) => operation(retryIndex > 0),\n maxRetries: 2,\n backoffPolicy: RetryBackoffPolicy.constant(1),\n isSuccess: (response: T | Error) => {\n const errorStatus = (response as Error)?.status;\n return errorStatus?.error_code !== 429;\n },\n }) as Promise<T | undefined>;\n};\n","import { RawSimplePriceResponseSchema } from '@avalabs/vm-module-types';\nimport { fetchAndVerify } from '../../utils/fetch-and-verify';\n\nexport class CoingeckoProxyClient {\n constructor(\n private proxyApiUrl: string,\n private fetchFn?: typeof fetch,\n ) {}\n\n simplePrice(params: {\n ids: string[];\n vs_currencies: string[];\n include_market_cap?: boolean;\n include_24hr_vol?: boolean;\n include_24hr_change?: boolean;\n include_last_updated_at?: boolean;\n }) {\n // casting params as any since typing does not allow boolean and other non-string values\n // even though NodeJS does not have this restriction itself: https://nodejs.org/api/url.html#new-urlsearchparamsobj\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const queryParams = new URLSearchParams(params as any);\n return fetchAndVerify(\n [\n `${this.proxyApiUrl}/proxy/coingecko/simple/price?${queryParams}`,\n {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n },\n ],\n RawSimplePriceResponseSchema,\n this.fetchFn,\n );\n }\n\n simplePriceByContractAddresses(params: {\n id: string;\n contract_addresses: string[];\n vs_currencies?: string[];\n include_market_cap?: boolean;\n include_24hr_vol?: boolean;\n include_24hr_change?: boolean;\n }) {\n const { id, ...rawQueryParams } = params;\n\n // casting params as any since typing does not allow boolean and other non-string values\n // even though NodeJS does not have this restriction itself: https://nodejs.org/api/url.html#new-urlsearchparamsobj\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const queryParams = new URLSearchParams(rawQueryParams as any);\n\n return fetchAndVerify(\n [\n `${this.proxyApiUrl}/proxy/coingecko/simple/token_price/${id}?${queryParams}`,\n {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n },\n ],\n RawSimplePriceResponseSchema,\n this.fetchFn,\n );\n }\n}\n","import type { ZodSchema } from 'zod';\nimport z from 'zod';\n\nexport async function fetchAndVerify<T extends ZodSchema>(\n fetchOptions: Parameters<typeof fetch>,\n schema: T,\n fetchFn: typeof fetch = fetch,\n): Promise<z.infer<T>> {\n const response = await fetchFn(...fetchOptions);\n\n if (!response.ok) {\n throw new Error(`Request failed with status ${response.status}`);\n }\n\n const responseJson = await response.json();\n return schema.parse(responseJson);\n}\n","import { fetchAndVerify } from '../../utils/fetch-and-verify';\nimport { z } from 'zod';\n\nconst WatchlistTokenResponseSchema = z.array(\n z.object({\n // the object has more properties than the ones listed here, but we only need these at the moment\n internalId: z.string(),\n id: z.string(),\n symbol: z.string(),\n name: z.string(),\n image: z.string().optional().nullable(),\n current_price: z.number().optional().nullable(),\n price_change_percentage_24h: z.number().optional().nullable(),\n market_cap: z.number().optional().nullable(),\n total_volume: z.number().optional().nullable(),\n platforms: z.record(z.string(), z.string()),\n }),\n);\n\nexport class WatchlistProxyClient {\n constructor(private proxyApiUrl: string) {}\n\n watchlistToken(params: { tokens: string; currency: string }) {\n // casting params as any since typing does not allow boolean and other non-string values\n // even though NodeJS does not have this restriction itself: https://nodejs.org/api/url.html#new-urlsearchparamsobj\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const queryParams = new URLSearchParams(params as any);\n return fetchAndVerify(\n [\n `${this.proxyApiUrl}/watchlist/tokens?${queryParams}`,\n {\n method: 'GET',\n headers: {\n 'Content-Type': 'application/json',\n },\n },\n ],\n WatchlistTokenResponseSchema,\n );\n }\n}\n","import z, { number, object, record, string } from 'zod';\nimport { fetchAndVerify } from '../../utils/fetch-and-verify';\n\nconst CURRENCY_EXCHANGE_RATES_URL =\n 'https://cdn.jsdelivr.net/npm/@fawazahmed0/currency-api@latest/v1/currencies/usd.min.json';\n\nconst CURRENCY_EXCHANGE_RATES_FALLBACK_URL = 'https://latest.currency-api.pages.dev/v1/currencies/usd.min.json';\n\nconst ExchangeRateSchema = object({\n date: string(),\n usd: record(number()),\n});\n\ntype ExchangeRate = z.infer<typeof ExchangeRateSchema>;\n\nexport const getExchangeRates = async (): Promise<ExchangeRate> => {\n try {\n return await fetchAndVerify([CURRENCY_EXCHANGE_RATES_URL], ExchangeRateSchema);\n } catch {\n return await fetchAndVerify([CURRENCY_EXCHANGE_RATES_FALLBACK_URL], ExchangeRateSchema);\n }\n};\n","import {\n type AddressItem,\n type CurrencyItem,\n type NodeIDItem,\n type TextItem,\n type DataItem,\n type DateItem,\n type LinkItemValue,\n DetailItemType,\n type LinkItem,\n type FundsRecipientItem,\n type AddressListItem,\n type NetworkItemValue,\n type NetworkItem,\n} from '@avalabs/vm-module-types';\n\nexport const fundsRecipientItem = (\n address: string,\n amount: bigint,\n maxDecimals: number,\n symbol: string,\n): FundsRecipientItem => ({\n type: DetailItemType.FUNDS_RECIPIENT,\n label: address,\n amount,\n maxDecimals,\n symbol,\n});\n\nexport const currencyItem = (label: string, value: bigint, maxDecimals: number, symbol: string): CurrencyItem => ({\n label,\n type: DetailItemType.CURRENCY,\n value,\n maxDecimals,\n symbol,\n});\n\nexport const textItem = (\n label: string,\n value: string,\n alignment: 'horizontal' | 'vertical' = 'horizontal',\n): TextItem => ({\n label,\n alignment,\n type: DetailItemType.TEXT,\n value,\n});\n\nexport const linkItem = (label: string, value: LinkItemValue): LinkItem => ({\n label,\n value,\n type: DetailItemType.LINK,\n});\n\nexport const addressItem = (label: string, value: string): AddressItem => ({\n label,\n type: DetailItemType.ADDRESS,\n value,\n});\n\nexport const addressListItem = (label: string, value: string[]): AddressListItem => ({\n label,\n type: DetailItemType.ADDRESS_LIST,\n value,\n});\n\nexport const nodeIDItem = (label: string, value: string): NodeIDItem => ({\n label,\n type: DetailItemType.NODE_ID,\n value,\n});\n\nexport const dataItem = (label: string, value: string): DataItem => ({\n label,\n type: DetailItemType.DATA,\n value,\n});\n\nexport const dateItem = (label: string, value: string): DateItem => ({\n label,\n type: DetailItemType.DATE,\n value,\n});\n\nexport const networkItem = (label: string, value: NetworkItemValue): NetworkItem => ({\n label,\n type: DetailItemType.NETWORK,\n value,\n});\n","import { AppName, type AppInfo } from '@avalabs/vm-module-types';\n\nexport const getCoreHeaders = ({ name, version }: AppInfo): Record<string, string> | undefined => {\n switch (name) {\n case AppName.CORE_MOBILE_IOS:\n case AppName.CORE_MOBILE_ANDROID:\n case AppName.CORE_WEB:\n case AppName.CORE_EXTENSION:\n case AppName.EXPLORER:\n return {\n 'x-application-name': name,\n 'x-application-version': version,\n };\n case AppName.OTHER:\n return undefined;\n }\n};\n","export const GLACIER_API_KEY = process.env.GLACIER_API_KEY;\n","import { GLACIER_API_KEY } from '../consts';\n\n// this key is only needed in development to bypass rate limit\n// it should never be used in production\nexport const getGlacierApiKey = (): string | undefined => {\n return GLACIER_API_KEY;\n};\n","import { getGlacierApiKey } from './get-glacier-api-key';\n\n// RPC urls returned in the token list are always using the production URL\nconst knownHosts = ['glacier-api.avax.network', 'proxy-api.avax.network', 'proxy-api-dev.avax.network'];\n\n/**\n * Glacier needs an API key for development, this adds the key if needed.\n */\nexport function addGlacierAPIKeyIfNeeded(url: string): string {\n const urlObj = new URL(url);\n const glacierApiKey = getGlacierApiKey();\n\n if (glacierApiKey && knownHosts.includes(urlObj.hostname)) {\n const search_params = urlObj.searchParams; // copy, does not update the URL\n search_params.set('token', glacierApiKey);\n urlObj.search = search_params.toString();\n return urlObj.toString();\n }\n return url;\n}\n","import {\n ApiError,\n type ApiRequestOptions,\n CancelablePromise,\n FetchHttpRequest,\n type OpenAPIConfig,\n} from '@avalabs/glacier-sdk';\nimport { getGlacierApiKey } from './get-glacier-api-key';\nimport { RetryBackoffPolicy } from './retry';\n\nconst GLOBAL_QUERY_PARAMS: Record<string, string | undefined> = {\n rltoken: getGlacierApiKey(),\n};\n\n/**\n * Custom HTTP request handler that automatically appends the Glacier API key (if present)\n * to bypass rate limits in development environments.\n */\nexport class GlacierFetchHttpRequest extends FetchHttpRequest {\n #failedRequests = 0;\n #getDelay = RetryBackoffPolicy.exponential();\n\n constructor(config: OpenAPIConfig) {\n super(config);\n }\n\n public override request<T>(options: ApiRequestOptions): CancelablePromise<T> {\n // Merge global query parameters with request-specific ones\n const mergedQuery = {\n ...GLOBAL_QUERY_PARAMS,\n ...(options.query || {}), // Request-specific params (override globals if same key)\n };\n\n // Create modified options with merged query\n const modifiedOptions: ApiRequestOptions = {\n ...options,\n query: Object.keys(mergedQuery).length > 0 ? mergedQuery : undefined,\n };\n\n const getRequest = () => super.request<T>(modifiedOptions);\n return this.#failedRequests > 0 ? this.#postponeRequest<T>(getRequest) : this.#request<T>(getRequest);\n }\n\n #request<T>(getRequest: () => CancelablePromise<T>): CancelablePromise<T> {\n const inner = getRequest();\n return new CancelablePromise((resolve, reject, onCancel) => {\n onCancel(() => inner.cancel());\n inner\n .then((response) => {\n this.#failedRequests = 0;\n resolve(response);\n })\n .catch((err) => {\n if (err instanceof ApiError) {\n const isHttpTooManyRequests = err.status === 429;\n const isHttpInternalServerError = err.status >= 500 && err.status < 600;\n this.#failedRequests += Number(isHttpTooManyRequests || isHttpInternalServerError);\n }\n reject(err);\n });\n });\n }\n\n #postponeRequest<T>(getRequest: () => CancelablePromise<T>): CancelablePromise<T> {\n const delay = this.#getDelay(this.#failedRequests);\n return new CancelablePromise<T>((resolve, reject, onCancel) => {\n const timeout = setTimeout(() => {\n const inner = getRequest();\n onCancel(() => {\n inner.cancel();\n clearTimeout(timeout);\n });\n inner.then(resolve).catch(reject);\n }, delay);\n });\n }\n}\n","/**\n * Builds the options object for `rpcErrors.internal()` / `rpcErrors.invalidParams()` etc.\n * Ensures the actual error message appears in the top-level `message` field,\n * which is what viem exposes as `error.details` to dapps.\n */\nexport const rpcErrorOpts = (message: string, cause: unknown) => ({\n message: `${message}${cause instanceof Error ? `: ${cause.message}` : ''}`,\n data: { cause },\n});\n","{\n \"name\": \"EVM\",\n \"description\": \"\",\n \"version\": \"0.0.1\",\n \"sources\": {\n \"module\": {\n \"checksum\": \"\",\n \"location\": {\n \"npm\": {\n \"filePath\": \"dist/index.js\",\n \"packageName\": \"@avalabs/evm-module\",\n \"registry\": \"https://registry.npmjs.org\"\n }\n }\n },\n \"provider\": {\n \"checksum\": \"\",\n \"location\": {\n \"npm\": {\n \"filePath\": \"dist/provider/index.js\",\n \"packageName\": \"@avalabs/evm-module\",\n \"registry\": \"https://registry.npmjs.org\"\n }\n }\n }\n },\n \"network\": {\n \"chainIds\": [],\n \"namespaces\": [\"eip155\"]\n },\n \"cointype\": \"60\",\n \"permissions\": {\n \"rpc\": {\n \"dapps\": true,\n \"methods\": [\n \"personal_sign\",\n \"avalanche_declareAgentIdentity\",\n \"eth_sendTransaction\",\n \"eth_sendTransactionBatch\",\n \"eth_*\",\n \"web3_clientVersion\",\n \"web3_sha3\",\n \"net_version\",\n \"net_peerCount\",\n \"net_listening\"\n ],\n \"nonRestrictedMethods\": [\n \"eth_requestAccounts\",\n \"eth_decrypt\",\n \"eth_getEncryptionPublicKey\",\n \"eth_subscribe\",\n \"eth_unsubscribe\",\n \"eth_blockNumber\",\n \"eth_call\",\n \"eth_chainId\",\n \"eth_coinbase\",\n \"eth_estimateGas\",\n \"eth_feeHistory\",\n \"eth_gasPrice\",\n \"eth_getBalance\",\n \"eth_getBlockByHash\",\n \"eth_getBlockByNumber\",\n \"eth_getBlockTransactionCountByHash\",\n \"eth_getBlockTransactionCountByNumber\",\n \"eth_getCode\",\n \"eth_getFilterChanges\",\n \"eth_getFilterLogs\",\n \"eth_getLogs\",\n \"eth_getProof\",\n \"eth_getStorageAt\",\n \"eth_getTransactionByBlockHashAndIndex\",\n \"eth_getTransactionByBlockNumberAndIndex\",\n \"eth_getTransactionByHash\",\n \"eth_getTransactionCount\",\n \"eth_getTransactionReceipt\",\n \"eth_getUncleCountByBlockHash\",\n \"eth_getUncleCountByBlockNumber\",\n \"eth_newBlockFilter\",\n \"eth_newFilter\",\n \"eth_newPendingTransactionFilter\",\n \"eth_syncing\",\n \"eth_uninstallFilter\",\n \"net_version\",\n \"net_peerCount\",\n \"net_listening\",\n \"web3_sha3\",\n \"web3_clientVersion\"\n ]\n }\n },\n \"manifestVersion\": \"0.1\"\n}\n","export const DEFAULT_DECIMALS = 18;\n\nexport const BLOCKAID_API_KEY = 'DUMMY_API_KEY'; // since we're using our own proxy and api key is handled there, we can use a dummy key here\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 { rpcErrors } from '@metamask/rpc-errors';\nimport {\n NetworkVMType,\n type BuildDerivationPathParams,\n type BuildDerivationPathResponse,\n} from '@avalabs/vm-module-types';\n\nexport const buildDerivationPath = ({\n accountIndex,\n derivationPathType,\n}: BuildDerivationPathParams): Pick<BuildDerivationPathResponse, NetworkVMType.EVM> => {\n if (accountIndex < 0) {\n throw rpcErrors.invalidParams('Account index must be a non-negative integer');\n }\n\n switch (derivationPathType) {\n case 'bip44':\n return {\n [NetworkVMType.EVM]: `m/44'/60'/0'/0/${accountIndex}`,\n };\n\n case 'ledger_live':\n return {\n [NetworkVMType.EVM]: `m/44'/60'/${accountIndex}'/0/0`,\n };\n\n default:\n throw rpcErrors.invalidParams(`Unsupported derivation path type: ${derivationPathType}`);\n }\n};\n","import type { Network, RpcRequest } from '@avalabs/vm-module-types';\nimport { rpcErrors } from '@metamask/rpc-errors';\nimport { z } from 'zod';\n\nimport { resolveAgentIdentity } from '../../utils/resolve-agent-identity';\n\nconst schema = z.object({\n agentId: z.coerce.string().regex(/^\\d+$/),\n agentRegistry: z.string().min(1),\n});\n\n/**\n * Prefetch-only helper for agent identity resolution.\n * This does not persist per-dApp state; callers must still pass context.agentIdentity\n * on signing / transaction requests when they want identity shown in approvals.\n */\nexport const avalancheDeclareAgentIdentity = async ({\n request,\n network,\n}: {\n request: RpcRequest;\n network: Network;\n}) => {\n const parsed = schema.safeParse(request.params);\n\n if (!parsed.success) {\n console.error('invalid params', parsed.error);\n return {\n error: rpcErrors.invalidParams({\n message: 'Agent identity params are invalid',\n data: { cause: parsed.error.flatten() },\n }),\n };\n }\n\n return {\n result: await resolveAgentIdentity({\n declaration: parsed.data,\n rpcUrl: network.rpcUrl,\n chainId: network.chainId,\n chainName: network.chainName,\n customRpcHeaders: network.customRpcHeaders,\n }),\n };\n};\n","import type { AgentIdentity, AgentIdentityDeclaration } from '@avalabs/vm-module-types';\nimport { Contract, getAddress, toUtf8String } from 'ethers';\n\nimport { getProvider } from './get-provider';\n\nconst FIVE_MINUTES_MS = 5 * 60 * 1000;\nconst DEFAULT_REPUTATION_REGISTRIES: Record<number, string> = {\n 43114: '0x8004BAa17C55a88189AE136b182e5fdA19dE9b63',\n};\n\nconst IDENTITY_ABI = [\n 'function ownerOf(uint256 tokenId) view returns (address)',\n 'function tokenURI(uint256 tokenId) view returns (string)',\n 'function agentURI(uint256 agentId) view returns (string)',\n 'function getMetadata(uint256 agentId, string metadataKey) view returns (bytes)',\n] as const;\n\nconst REPUTATION_ABI = [\n 'function getSummary(uint256 agentId, address[] clientAddresses, string tag1, string tag2) view returns (uint64 count, int128 summaryValue, uint8 summaryValueDecimals)',\n 'function readAllFeedback(uint256 agentId, address[] clientAddresses, string tag1, string tag2, bool includeRevoked) view returns (address[] clients, uint64[] feedbackIndexes, int128[] values, uint8[] valueDecimals, string[] tag1s, string[] tag2s, bool[] isRevoked)',\n 'function getIdentityRegistry() view returns (address)',\n] as const;\n\ntype IdentityContract = Contract & {\n ownerOf: (tokenId: bigint) => Promise<string>;\n tokenURI: (tokenId: bigint) => Promise<string>;\n agentURI: (agentId: bigint) => Promise<string>;\n getMetadata: (agentId: bigint, metadataKey: string) => Promise<string>;\n};\n\ntype ReputationSummary = {\n count: bigint | number;\n summaryValue: bigint | number;\n summaryValueDecimals: bigint | number;\n};\n\ntype ReputationFeedback = {\n value: bigint | number;\n valueDecimals: bigint | number;\n tag1?: string;\n tag2?: string;\n isRevoked?: boolean;\n};\n\ntype ReputationSummaryTuple = readonly [bigint | number, bigint | number, bigint | number];\ntype ReputationFeedbackTuple = readonly [\n string[],\n (bigint | number)[],\n (bigint | number)[],\n (bigint | number)[],\n string[],\n string[],\n boolean[],\n];\n\ntype ReputationFeedbackResult =\n | ReputationFeedbackTuple\n | {\n clients: string[];\n feedbackIndexes: (bigint | number)[];\n values: (bigint | number)[];\n valueDecimals: (bigint | number)[];\n tag1s: string[];\n tag2s: string[];\n isRevoked: boolean[];\n };\n\ntype ReputationContract = Contract & {\n getIdentityRegistry: () => Promise<string>;\n getSummary: (\n agentId: bigint,\n clientAddresses: string[],\n tag1: string,\n tag2: string,\n ) => Promise<ReputationSummaryTuple | ReputationSummary>;\n readAllFeedback: (\n agentId: bigint,\n clientAddresses: string[],\n tag1: string,\n tag2: string,\n includeRevoked: boolean,\n ) => Promise<ReputationFeedbackResult>;\n};\n\nconst cache = new Map<string, { expiresAt: number; value: AgentIdentity }>();\n\nconst getTrustLevel = (score: number | null): AgentIdentity['trustLevel'] => {\n if (score === null) return 'unknown';\n if (score >= 75) return 'high';\n if (score >= 40) return 'medium';\n return 'low';\n};\n\nconst clampScore = (value: number | null): number | null => {\n if (value === null) return null;\n if (!Number.isFinite(value)) return null;\n return Math.max(0, Math.min(100, Math.trunc(value)));\n};\n\nconst toNumber = (value: bigint | number): number | null => {\n const numeric = typeof value === 'bigint' ? Number(value) : value;\n return Number.isFinite(numeric) ? numeric : null;\n};\n\nconst scaleFixedPoint = (value: bigint | number, decimals: bigint | number): number | null => {\n const numericValue = toNumber(value);\n const numericDecimals = toNumber(decimals);\n\n if (numericValue === null || numericDecimals === null || numericDecimals < 0) {\n return null;\n }\n\n return numericValue / 10 ** numericDecimals;\n};\n\nconst isReputationSummaryTuple = (\n summary: ReputationSummaryTuple | ReputationSummary,\n): summary is ReputationSummaryTuple => Array.isArray(summary);\n\nconst isReputationFeedbackTuple = (feedback: ReputationFeedbackResult): feedback is ReputationFeedbackTuple =>\n Array.isArray(feedback);\n\nconst getSummaryValue = (summary: ReputationSummaryTuple | ReputationSummary): ReputationSummary => {\n if (isReputationSummaryTuple(summary)) {\n return {\n count: summary[0],\n summaryValue: summary[1],\n summaryValueDecimals: summary[2],\n };\n }\n\n return summary;\n};\n\nconst getFeedbackValues = (feedback: ReputationFeedbackResult): ReputationFeedback[] => {\n const values = isReputationFeedbackTuple(feedback) ? feedback[2] : feedback.values;\n const valueDecimals = isReputationFeedbackTuple(feedback) ? feedback[3] : feedback.valueDecimals;\n const tag1s = isReputationFeedbackTuple(feedback) ? feedback[4] : feedback.tag1s;\n const tag2s = isReputationFeedbackTuple(feedback) ? feedback[5] : feedback.tag2s;\n const revoked = isReputationFeedbackTuple(feedback) ? feedback[6] : feedback.isRevoked;\n\n return values.map((value: bigint | number, index: number) => ({\n value,\n valueDecimals: valueDecimals[index] ?? 0,\n tag1: tag1s[index],\n tag2: tag2s[index],\n isRevoked: revoked[index],\n }));\n};\n\nconst averageScores = (scores: Array<number | null>): number | null => {\n const filtered = scores.filter((score): score is number => score !== null);\n if (!filtered.length) return null;\n return filtered.reduce((sum, score) => sum + score, 0) / filtered.length;\n};\n\nconst STARRED_TAG = 'starred';\n\nconst dedupeAddresses = (addresses: string[]): string[] => {\n const seen = new Set<string>();\n const deduped: string[] = [];\n\n for (const address of addresses) {\n try {\n const normalized = getAddress(address);\n if (!seen.has(normalized)) {\n seen.add(normalized);\n deduped.push(normalized);\n }\n } catch {\n continue;\n }\n }\n\n return deduped;\n};\n\nconst getFeedbackClients = (feedback: ReputationFeedbackResult): string[] =>\n isReputationFeedbackTuple(feedback) ? feedback[0] : feedback.clients;\n\nconst resolveReputationScore = async (\n reputationContract: ReputationContract,\n parsedRegistryAddress: string,\n agentId: bigint,\n): Promise<number | null> => {\n try {\n const identityRegistry = getAddress(await reputationContract.getIdentityRegistry());\n if (identityRegistry !== parsedRegistryAddress) {\n return null;\n }\n\n const feedbackResult = await reputationContract.readAllFeedback(agentId, [], STARRED_TAG, '', false);\n const feedback = getFeedbackValues(feedbackResult)\n .filter((entry) => entry.tag1 === undefined || entry.tag1 === STARRED_TAG)\n .filter((entry) => !entry.isRevoked);\n\n const clientAddresses = dedupeAddresses(getFeedbackClients(feedbackResult));\n if (clientAddresses.length) {\n try {\n const summary = getSummaryValue(await reputationContract.getSummary(agentId, clientAddresses, STARRED_TAG, ''));\n const count = toNumber(summary.count);\n if (count) {\n return scaleFixedPoint(summary.summaryValue, summary.summaryValueDecimals);\n }\n } catch {\n // Ignore summary lookup failures and fall back to raw feedback averaging.\n }\n }\n\n return averageScores(feedback.map((entry) => scaleFixedPoint(entry.value, entry.valueDecimals)));\n } catch {\n return null;\n }\n};\n\nconst parseAgentRegistry = (agentRegistry: string) => {\n const [namespace, chainId, address] = agentRegistry.split(':');\n if (namespace !== 'eip155' || !chainId || !address) {\n return null;\n }\n\n const parsedChainId = Number(chainId);\n if (!Number.isInteger(parsedChainId)) {\n return null;\n }\n\n try {\n return { chainId: parsedChainId, address: getAddress(address) };\n } catch {\n return null;\n }\n};\n\nconst buildFallback = (declaration: AgentIdentityDeclaration): AgentIdentity => ({\n agentId: declaration.agentId,\n agentRegistry: declaration.agentRegistry,\n owner: null,\n reputationScore: null,\n metadataUri: null,\n trustLevel: 'unknown',\n});\n\nconst callFirst = async <T>(calls: (() => Promise<T>)[]): Promise<T | null> => {\n const results = await Promise.allSettled(calls.map((call) => call()));\n for (const result of results) {\n if (result.status === 'fulfilled' && result.value != null) {\n return result.value;\n }\n }\n return null;\n};\n\nconst decodeMetadata = (value: string): string | null => {\n if (!value || value === '0x') return null;\n try {\n return toUtf8String(value);\n } catch {\n return null;\n }\n};\n\nexport const resolveAgentIdentity = async ({\n declaration,\n rpcUrl,\n chainId,\n chainName,\n customRpcHeaders,\n}: {\n declaration: AgentIdentityDeclaration;\n rpcUrl: string;\n chainId: number;\n chainName: string;\n customRpcHeaders?: Record<string, string>;\n}): Promise<AgentIdentity> => {\n const cached = cache.get(`${rpcUrl}:${declaration.agentRegistry}:${declaration.agentId}`);\n if (cached && cached.expiresAt > Date.now()) {\n return cached.value;\n }\n\n const parsedRegistry = parseAgentRegistry(declaration.agentRegistry);\n if (!parsedRegistry) {\n return buildFallback(declaration);\n }\n\n if (!/^\\d+$/.test(declaration.agentId)) {\n return buildFallback({\n ...declaration,\n agentRegistry: `eip155:${parsedRegistry.chainId}:${parsedRegistry.address}`,\n });\n }\n\n const normalizedDeclaration = {\n ...declaration,\n agentRegistry: `eip155:${parsedRegistry.chainId}:${parsedRegistry.address}`,\n };\n\n const fallback = buildFallback(normalizedDeclaration);\n\n const provider = await getProvider({\n chainId,\n chainName,\n rpcUrl,\n customRpcHeaders,\n });\n const identityContract = new Contract(parsedRegistry.address, IDENTITY_ABI, provider) as IdentityContract;\n\n const reputationRegistry = DEFAULT_REPUTATION_REGISTRIES[parsedRegistry.chainId];\n const reputationContract = reputationRegistry\n ? (new Contract(reputationRegistry, REPUTATION_ABI, provider) as ReputationContract)\n : null;\n\n const [owner, metadataUri, reputationScore] = await Promise.all([\n callFirst<string | null>([async () => getAddress(await identityContract.ownerOf(BigInt(declaration.agentId)))]),\n callFirst<string | null>([\n async () => await identityContract.tokenURI(BigInt(declaration.agentId)),\n async () => await identityContract.agentURI(BigInt(declaration.agentId)),\n async () => decodeMetadata(await identityContract.getMetadata(BigInt(declaration.agentId), 'agentURI')),\n async () => decodeMetadata(await identityContract.getMetadata(BigInt(declaration.agentId), 'uri')),\n ]),\n reputationContract\n ? resolveReputationScore(reputationContract, parsedRegistry.address, BigInt(declaration.agentId))\n : Promise.resolve(null),\n ]);\n\n const normalizedReputationScore = clampScore(reputationScore ?? null);\n\n const resolved: AgentIdentity = {\n ...fallback,\n owner: owner ?? null,\n metadataUri: metadataUri ?? null,\n reputationScore: normalizedReputationScore,\n trustLevel: getTrustLevel(normalizedReputationScore),\n };\n\n cache.set(`${rpcUrl}:${declaration.agentRegistry}:${declaration.agentId}`, {\n expiresAt: Date.now() + FIVE_MINUTES_MS,\n value: resolved,\n });\n\n return resolved;\n};\n","import { JsonRpcBatchInternal } from '@avalabs/core-wallets-sdk';\nimport { addGlacierAPIKeyIfNeeded } from '@internal/utils';\nimport { FetchRequest, Network as EVMNetwork } from 'ethers';\n\ntype ProviderParams = {\n chainId: number;\n chainName: string;\n rpcUrl: string;\n multiContractAddress?: string;\n pollingInterval?: number;\n customRpcHeaders?: Record<string, string>;\n};\n\nexport const getProvider = async (params: ProviderParams): Promise<JsonRpcBatchInternal> => {\n const { chainId, chainName, rpcUrl, multiContractAddress, pollingInterval = 2000, customRpcHeaders } = params;\n\n const url = addGlacierAPIKeyIfNeeded(rpcUrl);\n let urlOrFetchRequest: string | FetchRequest = url;\n\n if (customRpcHeaders) {\n const fetchRequest = new FetchRequest(url);\n\n for (const [name, value] of Object.entries(customRpcHeaders)) {\n fetchRequest.setHeader(name, value);\n }\n\n urlOrFetchRequest = fetchRequest;\n }\n\n const provider = new JsonRpcBatchInternal(\n { maxCalls: 40, multiContractAddress },\n urlOrFetchRequest,\n new EVMNetwork(chainName, chainId),\n );\n\n provider.pollingInterval = pollingInterval;\n\n return provider;\n};\n","import {\n NetworkVMType,\n type ApprovalController,\n type DeriveAddressParams,\n type DeriveAddressResponse,\n} from '@avalabs/vm-module-types';\nimport { computeAddress } from 'ethers';\n\nimport { hasDerivationDetails } from '@internal/utils/src/utils/address-derivation';\nimport { buildDerivationPath } from '../build-derivation-path/build-derivation-path';\n\nexport const deriveAddress = async (\n params: DeriveAddressParams & { approvalController: ApprovalController },\n): Promise<DeriveAddressResponse> => {\n const { secretId, approvalController } = params;\n\n // When dealing with single-account private keys, we don't need the derivation path any more.\n const derivationPath = hasDerivationDetails(params) ? buildDerivationPath(params).EVM : undefined;\n const publicKeyHex = await approvalController.requestPublicKey({\n curve: 'secp256k1',\n secretId,\n derivationPath,\n });\n\n return {\n [NetworkVMType.EVM]: computeAddress(`0x${publicKeyHex}`), // ApprovalController does not return the 0x prefix\n };\n};\n","import type { DeriveAddressParams, DetailedDeriveAddressParams } from '@avalabs/vm-module-types';\n\nexport const hasDerivationDetails = (params: DeriveAddressParams): params is DetailedDeriveAddressParams =>\n 'derivationPathType' in params &&\n 'accountIndex' in params &&\n typeof params.accountIndex === 'number' &&\n typeof params.derivationPathType === 'string';\n","import {\n NetworkVMType,\n type ApprovalController,\n type DeriveAddressesParams,\n type DeriveAddressesResponse,\n} from '@avalabs/vm-module-types';\nimport { deriveAddressesForEvm, init } from '@avalabs/crypto-sdk';\n\nimport { buildDerivationPath } from '../build-derivation-path/build-derivation-path';\n\nexport const deriveAddresses = async (\n params: DeriveAddressesParams & { approvalController: ApprovalController },\n): Promise<DeriveAddressesResponse> => {\n const { approvalController, secretId, accountIndices, derivationPathType } = params;\n\n if (accountIndices.length === 0) {\n return [];\n }\n\n await init();\n\n const publicKeys = await Promise.all(\n accountIndices.map(async (accountIndex) => {\n const derivationPath = buildDerivationPath({ accountIndex, derivationPathType }).EVM;\n const publicKeyHex = await approvalController.requestPublicKey({\n curve: 'secp256k1',\n secretId,\n derivationPath,\n });\n return Uint8Array.from(Buffer.from(publicKeyHex, 'hex'));\n }),\n );\n\n const addresses = await deriveAddressesForEvm(publicKeys);\n\n return addresses.map((address) => ({ [NetworkVMType.EVM]: address }));\n};\n","import {\n type Network,\n type RpcRequest,\n type DisplayData,\n type BatchApprovalController,\n type Hex,\n} from '@avalabs/vm-module-types';\nimport { rpcErrors } from '@metamask/rpc-errors';\n\nimport { getProvider } from '../../utils/get-provider';\n\nimport { parseRequestParams } from './schema';\nimport { ensureProperNonces } from './utils/ensure-proper-nonces';\nimport { buildTxApprovalRequest } from '../../utils/build-tx-approval-request';\nimport { getTxHash } from '../../utils/get-tx-hash';\nimport { waitForTransactionReceipt } from '../../utils/wait-for-transaction-receipt';\nimport { getTxBatchUpdater } from '../../utils/evm-tx-batch-updater';\nimport { simulateTransactionBatch } from './utils/process-transaction-batch-simulation';\nimport { addressItem, linkItem, networkItem } from '@internal/utils/src/utils/detail-item';\nimport { rpcErrorOpts } from '@internal/utils';\nimport type Blockaid from '@blockaid/client';\nimport { getAgentIdentityFromContext } from '../../utils/get-agent-identity-from-context';\nimport { resolveAgentIdentity } from '../../utils/resolve-agent-identity';\nimport { buildAgentIdentityDetailSection } from '../../utils/build-agent-identity-detail-section';\n\nexport const ethSendTransactionBatch = async ({\n request,\n network,\n approvalController,\n blockaid,\n}: {\n request: RpcRequest;\n network: Network;\n approvalController: BatchApprovalController;\n blockaid: Blockaid;\n}) => {\n const { params } = request;\n const { data: parsedParams, success, error } = parseRequestParams(params);\n\n if (!success) {\n console.error('invalid params', error);\n return {\n error: rpcErrors.invalidParams(rpcErrorOpts('Transaction params are invalid', error)),\n };\n }\n\n const { transactions: transactionRequests, options = {} } = parsedParams;\n const { skipIntermediateTxs = false } = options;\n\n const provider = await getProvider({\n chainId: network.chainId,\n chainName: network.chainName,\n rpcUrl: network.rpcUrl,\n multiContractAddress: network.utilityAddresses?.multicall,\n pollingInterval: 1000,\n customRpcHeaders: network.customRpcHeaders,\n });\n\n // Ensure all transactions in the batch have the nonce set\n try {\n await ensureProperNonces(transactionRequests, provider);\n } catch (error) {\n console.error('Unable to calculate nonce', error);\n return {\n error: rpcErrors.internal(rpcErrorOpts('Unable to calculate nonce', error)),\n };\n }\n\n const allTransactionPayloadsHaveGas = transactionRequests.every((tx) => Number(tx.gas) > 0);\n const { alert, balanceChange, isSimulationSuccessful, tokenApprovals, scans } = await simulateTransactionBatch({\n rpcMethod: request.method,\n chainId: network.chainId,\n params: transactionRequests,\n dAppUrl: request.dappInfo.url,\n provider,\n populateMissingGas: !allTransactionPayloadsHaveGas,\n blockaid,\n });\n const allTransactionsHaveGas = scans.every(({ transaction }) => Number(transaction.gas) > 0);\n\n if (!allTransactionsHaveGas) {\n console.error('Gas limit is missing in some transactions');\n return {\n error: rpcErrors.internal({\n message: 'Gas limit is missing in some transactions',\n }),\n };\n }\n\n const declaration = getAgentIdentityFromContext(request);\n const agentIdentity = declaration\n ? await resolveAgentIdentity({\n declaration,\n rpcUrl: network.rpcUrl,\n chainId: network.chainId,\n chainName: network.chainName,\n customRpcHeaders: network.customRpcHeaders,\n })\n : undefined;\n\n const displayData: DisplayData = {\n title: 'Do you approve these transactions?',\n details: [\n {\n title: 'Transaction Details',\n items: [\n addressItem('Account', transactionRequests[0].from),\n networkItem('Network', {\n name: network.chainName,\n logoUri: network.logoUri,\n }),\n linkItem('Website', request.dappInfo),\n ],\n },\n ...(agentIdentity ? [buildAgentIdentityDetailSection(agentIdentity)] : []),\n ],\n isSimulationSuccessful,\n balanceChange,\n alert,\n tokenApprovals,\n networkFeeSelector: true,\n };\n\n const signingRequests = scans.map((scan) =>\n buildTxApprovalRequest(request, network, scan.transaction, scan, agentIdentity),\n );\n const { cleanup, updateTx } = getTxBatchUpdater(request.requestId, signingRequests, displayData);\n\n const response = await approvalController.requestBatchApproval({ request, signingRequests, displayData, updateTx });\n\n cleanup();\n\n if ('error' in response) {\n return {\n error: response.error,\n };\n }\n\n if (response.result.length !== transactionRequests.length) {\n return {\n error: rpcErrors.internal({\n message: `Invalid number of signatures. Expected ${transactionRequests.length}, got ${response.result.length}`,\n }),\n };\n }\n\n const txHashes: Hex[] = [];\n\n for (const [index, result] of response.result.entries()) {\n const isLast = index === response.result.length - 1;\n const txHash = await getTxHash(provider, result);\n\n // For the last tx: fire-and-forget receipt tracking (for UI callbacks)\n if (isLast) {\n waitForTransactionReceipt({\n explorerUrl: network.explorerUrl ?? '',\n provider,\n txHash,\n onTransactionPending: approvalController.onTransactionPending,\n onTransactionConfirmed: approvalController.onTransactionConfirmed,\n onTransactionReverted: approvalController.onTransactionReverted,\n request,\n });\n }\n\n // For intermediate txs: wait for receipt before broadcasting next (unless skipIntermediateTxs)\n if (!isLast && !skipIntermediateTxs) {\n const isSuccess = await waitForTransactionReceipt({\n explorerUrl: network.explorerUrl ?? '',\n provider,\n txHash,\n onTransactionPending: approvalController.onTransactionPending,\n onTransactionConfirmed: approvalController.onTransactionConfirmed,\n onTransactionReverted: approvalController.onTransactionReverted,\n request,\n });\n\n if (!isSuccess) {\n return {\n error: rpcErrors.internal({\n message: `Transaction ${index + 1} failed! Batch execution stopped`,\n }),\n };\n }\n }\n\n txHashes.push(txHash);\n }\n\n return {\n result: txHashes,\n };\n};\n","import { z } from 'zod';\nimport { transactionSchema } from '../../utils/transaction-schema';\n\nexport const transactionArraySchema = z\n .tuple([transactionSchema, transactionSchema])\n .rest(transactionSchema)\n .refine((transactions) => areAllEqualByProp(transactions, 'chainId'), {\n message: 'All transactions must use the same \"chainId\"',\n })\n .refine((transactions) => areAllEqualByProp(transactions, 'from'), {\n message: 'All transactions must use the same \"from\" address',\n })\n .refine((transactions) => areAllEmptyByProp(transactions, 'nonce') || areAllDifferentByProp(transactions, 'nonce'), {\n message: `Each transaction needs a different \"nonce\". Make them different, or leave them empty for all transactions.`,\n });\n\nexport const batchOptionsSchema = z.object({\n /**\n * When true, skips waiting for intermediate transaction receipts.\n * All transactions are broadcasted immediately without waiting for each to confirm.\n *\n * This is useful for one-click swaps (approve + swap) where we want fast response.\n * The network guarantees ordering via sequential nonces.\n *\n * Default: false (wait for each transaction's receipt before broadcasting the next)\n */\n skipIntermediateTxs: z.boolean().optional(),\n});\n\nexport type BatchOptions = z.infer<typeof batchOptionsSchema>;\n\n/**\n * Support both legacy array format and new object format with options:\n * - Legacy: [tx1, tx2, ...]\n * - New: { transactions: [tx1, tx2, ...], options?: { onlyWaitForLastTx?: boolean } }\n */\nexport const transactionBatchSchema = z.union([\n transactionArraySchema,\n z.object({\n transactions: transactionArraySchema,\n options: batchOptionsSchema.optional(),\n }),\n]);\n\nfunction areAllDifferentByProp<T>(elements: T[], prop: keyof T) {\n return !areAllEqualByProp(elements, prop);\n}\n\nfunction areAllEmptyByProp<T>(elements: T[], prop: keyof T) {\n return elements.every((el) => el[prop] === undefined || el[prop] === '');\n}\n\nfunction areAllEqualByProp<T>(elements: T[], prop: keyof T) {\n const uniqValues = new Set(elements.map((el) => el[prop]));\n\n return uniqValues.size === 1;\n}\n\n/** Input type for batch transaction params - either array or object format */\nexport type TransactionBatchInput = z.input<typeof transactionBatchSchema>;\n\n/** Normalized output after parsing - always has transactions, options is optional */\nexport type ParsedParams = {\n transactions: z.infer<typeof transactionArraySchema>;\n options?: BatchOptions;\n};\n\nexport const parseRequestParams = (params: unknown): z.SafeParseReturnType<TransactionBatchInput, ParsedParams> => {\n const result = transactionBatchSchema.safeParse(params);\n\n if (!result.success) {\n return result;\n }\n\n // Normalize to the new format\n if (Array.isArray(result.data)) {\n return {\n success: true,\n data: {\n transactions: result.data,\n options: {},\n },\n };\n }\n\n return {\n success: true,\n data: {\n transactions: result.data.transactions,\n options: result.data.options ?? {},\n },\n };\n};\n","import { z } from 'zod';\n\nexport const transactionSchema = z.object({\n from: z.string().length(42),\n to: z.string().length(42).optional(),\n data: z.string().optional(),\n value: z.string().startsWith('0x').optional(),\n gas: z.string().startsWith('0x').optional(),\n gasPrice: z.string().startsWith('0x').optional(),\n maxFeePerGas: z.string().startsWith('0x').optional(),\n maxPriorityFeePerGas: z.string().startsWith('0x').optional(),\n nonce: z.string().optional(),\n chainId: z.string().optional().or(z.number().optional()),\n accessList: z\n .array(\n z.object({\n address: z.string().startsWith('0x'),\n storageKeys: z.array(z.string()),\n }),\n )\n .optional(),\n});\n\nexport type TransactionParams = z.infer<typeof transactionSchema>;\n","import { JsonRpcBatchInternal } from '@avalabs/core-wallets-sdk';\n\nexport const getNonce = async ({\n from,\n provider,\n}: {\n from: string;\n provider: JsonRpcBatchInternal;\n}): Promise<number> => {\n return provider.getTransactionCount(from);\n};\n","import type { JsonRpcBatchInternal } from '@avalabs/core-wallets-sdk';\n\nimport { getNonce } from '../../../utils/get-nonce';\nimport type { TransactionBatchParams } from '../../../types';\n\nexport const ensureProperNonces = async (transactions: TransactionBatchParams, provider: JsonRpcBatchInternal) => {\n // The parameters schema ensures all transactions have empty or different nonces,\n // so if we find the first one is populated, we know the rest should be both populated & unique.\n if (transactions[0].nonce) {\n return;\n }\n const nonce = await getNonce({\n from: transactions[0].from,\n provider,\n });\n\n return Promise.all(\n transactions.map(async (transaction, index) => {\n transaction.nonce = String(nonce + index);\n }),\n );\n};\n","import {\n RpcMethod,\n type AgentIdentity,\n type DetailItem,\n type DisplayData,\n type Network,\n type RpcRequest,\n type SigningData,\n type TransactionSimulationResult,\n} from '@avalabs/vm-module-types';\n\nimport { addressItem, linkItem, networkItem, textItem } from '@internal/utils/src/utils/detail-item';\n\nimport { buildAgentIdentityDetailSection } from './build-agent-identity-detail-section';\n\nimport { ERC20TransactionType, TransactionKind } from '../types';\nimport type { TransactionParams } from './transaction-schema';\nimport { parseERC20TransactionType } from './parse-erc20-transaction-type';\nimport { getRecipientAddress } from './get-recipient-address';\nimport { classifyTransaction } from '@src/utils/classify-transaction';\nimport { parseEercTransaction } from './parse-eerc-transaction';\n\nexport const buildTxApprovalRequest = (\n request: RpcRequest,\n network: Network,\n transaction: TransactionParams,\n { isSimulationSuccessful, balanceChange, tokenApprovals, alert }: TransactionSimulationResult,\n agentIdentity?: AgentIdentity,\n eercDisplayEnabled = false,\n) => {\n const { dappInfo } = request;\n const transactionType = parseERC20TransactionType(transaction);\n\n // generate display and signing data\n let title = 'Do you approve this transaction?';\n if (transactionType === ERC20TransactionType.APPROVE) {\n title = 'Do you approve this spend limit?';\n }\n\n const recipientAddress = getRecipientAddress(transaction);\n\n const transactionDetails: DetailItem[] = [\n addressItem('Account', transaction.from),\n networkItem('Network', {\n name: network.chainName,\n logoUri: network.logoUri,\n }),\n linkItem('Website', dappInfo),\n ].filter((item) => !!item);\n\n const transactionClassification = classifyTransaction(transaction);\n\n if (transactionClassification !== TransactionKind.CONTRACT_CALL && recipientAddress) {\n transactionDetails.push(addressItem('To', recipientAddress));\n }\n\n if (\n transaction.to &&\n [TransactionKind.ERC20_TRANSFER, TransactionKind.CONTRACT_CALL].includes(transactionClassification)\n ) {\n transactionDetails.push(addressItem('Contract', transaction.to));\n }\n\n if (eercDisplayEnabled) {\n const eercTransaction = parseEercTransaction(transaction);\n\n if (eercTransaction) {\n transactionDetails.push(textItem('Operation', eercTransaction.operation));\n transactionDetails.push(textItem('Privacy', 'eERC20'));\n }\n }\n\n const displayData: DisplayData = {\n title,\n details: [\n {\n title: 'Transaction Details',\n items: transactionDetails,\n },\n ...(agentIdentity ? [buildAgentIdentityDetailSection(agentIdentity)] : []),\n ],\n networkFeeSelector: true,\n alert,\n balanceChange,\n tokenApprovals,\n isSimulationSuccessful,\n };\n\n const signingData: SigningData = {\n type: RpcMethod.ETH_SEND_TRANSACTION,\n account: transaction.from,\n data: {\n type: 2, // hardcoding to 2 for now as we only support EIP-1559\n nonce: Number(transaction.nonce),\n gasLimit: Number(transaction.gas),\n maxFeePerGas: transaction.maxFeePerGas,\n maxPriorityFeePerGas: transaction.maxPriorityFeePerGas,\n to: transaction.to,\n from: transaction.from,\n data: transaction.data,\n value: transaction.value,\n chainId: transaction.chainId ?? network.chainId,\n accessList: transaction.accessList,\n },\n };\n\n return {\n displayData,\n signingData,\n };\n};\n","import type { AgentIdentity, DetailItem, DetailSection } from '@avalabs/vm-module-types';\nimport { addressItem, linkItem, textItem } from '@internal/utils/src/utils/detail-item';\n\nconst isNavigableMetadataUri = (metadataUri: string) =>\n metadataUri.startsWith('https://') || metadataUri.startsWith('http://') || metadataUri.startsWith('ipfs://');\n\nconst isEmbeddedDataUri = (metadataUri: string) => metadataUri.startsWith('data:');\n\nexport const buildAgentIdentityDetailSection = (agentIdentity: AgentIdentity): DetailSection => {\n const items: DetailItem[] = [\n textItem('Agent ID', agentIdentity.agentId),\n textItem('Registry', agentIdentity.agentRegistry, 'vertical'),\n textItem('Trust level', agentIdentity.trustLevel),\n ];\n\n if (agentIdentity.reputationScore !== null) {\n items.push(textItem('Reputation score', String(agentIdentity.reputationScore)));\n }\n\n if (agentIdentity.owner) {\n items.push(addressItem('Owner', agentIdentity.owner));\n }\n\n if (agentIdentity.metadataUri) {\n items.push(\n isNavigableMetadataUri(agentIdentity.metadataUri)\n ? linkItem('Metadata', { url: agentIdentity.metadataUri, name: agentIdentity.metadataUri })\n : isEmbeddedDataUri(agentIdentity.metadataUri)\n ? textItem('Metadata', 'Embedded data URI', 'vertical')\n : textItem('Metadata', agentIdentity.metadataUri, 'vertical'),\n );\n }\n\n return {\n title: 'Agent Identity',\n items,\n };\n};\n","import type { z } from 'zod';\nimport { TransactionType } from '@avalabs/vm-module-types';\n\nimport type { transactionSchema } from './utils/transaction-schema';\nimport type { transactionArraySchema } from './handlers/eth-send-transaction-batch/schema';\n\nexport const NonContractCallTypes = [\n TransactionType.SEND,\n TransactionType.RECEIVE,\n TransactionType.TRANSFER,\n TransactionType.NFT_SEND,\n TransactionType.NFT_RECEIVE,\n];\n\nexport type TransactionParams = z.infer<typeof transactionSchema>;\n\nexport type RequiredBy<T, K extends keyof T> = T & Required<Pick<T, K>>;\n\nexport type TransactionBatchParams = z.infer<typeof transactionArraySchema>;\n\nexport enum ERC20TransactionType {\n TOTAL_SUPPLY = 'totalSupply',\n BALANCE_OF = 'balanceOf',\n TRANSFER = 'transfer',\n TRANSFER_FROM = 'transferFrom',\n APPROVE = 'approve',\n ALLOWANCE = 'allowance',\n}\n\nexport enum TransactionKind {\n NATIVE_TRANSFER = 'native_transfer',\n ERC20_TRANSFER = 'erc20_transfer',\n CONTRACT_CALL = 'contract_call',\n}\n","import { Interface } from 'ethers';\nimport ERC20 from '@openzeppelin/contracts/build/contracts/ERC20.json';\nimport { ERC20TransactionType } from '../types';\n\nexport const parseERC20TransactionType = (transaction: {\n data?: string;\n value?: string;\n}): ERC20TransactionType | undefined => {\n if (!transaction.data) {\n return undefined;\n }\n\n try {\n const contractInterface = new Interface(ERC20.abi);\n\n const description = contractInterface.parseTransaction({\n data: transaction.data,\n value: transaction.value,\n });\n\n const functionName = description?.name ?? description?.fragment?.name;\n\n if (functionName && isERC20TransactionType(functionName)) {\n return functionName;\n }\n\n return undefined;\n } catch (e) {\n return undefined;\n }\n};\n\nfunction isERC20TransactionType(value: string): value is ERC20TransactionType {\n return Object.values(ERC20TransactionType).includes(value as ERC20TransactionType);\n}\n","import { Interface } from 'ethers';\nimport ERC20 from '@openzeppelin/contracts/build/contracts/ERC20.json';\n\nimport { ERC20TransactionType } from '../types';\nimport type { TransactionParams } from './transaction-schema';\n\n/**\n * Resolves the actual recipient of a transaction.\n *\n * For native transfers the recipient is the transaction's `to` field. For ERC20\n * `transfer`/`transferFrom` calls the `to` field is the token contract, so the real\n * recipient has to be decoded from the calldata using the ERC20 ABI.\n */\nexport const getRecipientAddress = (\n transaction: Pick<TransactionParams, 'to' | 'data' | 'value'>,\n): string | undefined => {\n if (transaction.data) {\n try {\n const iface = new Interface(ERC20.abi);\n const parsed = iface.parseTransaction({ data: transaction.data, value: transaction.value });\n const functionName = parsed?.name ?? parsed?.fragment?.name;\n\n if (functionName === ERC20TransactionType.TRANSFER || functionName === ERC20TransactionType.TRANSFER_FROM) {\n const recipient = parsed?.args['to'];\n if (typeof recipient === 'string') {\n return recipient;\n }\n }\n } catch {\n // Not a parseable ERC20 call; fall back to the transaction's `to`.\n }\n }\n\n return transaction.to;\n};\n","import { ERC20TransactionType, TransactionKind } from '../types';\nimport type { TransactionParams } from './transaction-schema';\nimport { parseERC20TransactionType } from './parse-erc20-transaction-type';\n\n/**\n * Classifies a transaction as a native transfer, an ERC20 transfer or a generic\n * contract call.\n *\n * This is a calldata-based heuristic:\n * - No calldata → native (value) transfer.\n * - Calldata that decodes as ERC20 `transfer`/`transferFrom` → ERC20 transfer.\n * - Any other calldata → contract call.\n *\n * Note: a matching 4-byte selector doesn't guarantee the `to` is a real ERC20\n * token. Verifying that requires an on-chain lookup (e.g. calling `decimals()`).\n */\nexport const classifyTransaction = (transaction: Pick<TransactionParams, 'data' | 'value'>): TransactionKind => {\n const hasCallData = Boolean(transaction.data && transaction.data !== '0x');\n\n if (!hasCallData) {\n return TransactionKind.NATIVE_TRANSFER;\n }\n\n const erc20Type = parseERC20TransactionType(transaction);\n if (erc20Type === ERC20TransactionType.TRANSFER || erc20Type === ERC20TransactionType.TRANSFER_FROM) {\n return TransactionKind.ERC20_TRANSFER;\n }\n\n return TransactionKind.CONTRACT_CALL;\n};\n","import { Interface } from 'ethers';\n\nimport { EERC_ABI } from './eerc-abi';\n\nexport enum EercOperation {\n REGISTER = 'register',\n DEPOSIT = 'deposit',\n TRANSFER = 'transfer',\n WITHDRAW = 'withdraw',\n PRIVATE_MINT = 'privateMint',\n SET_AUDITOR_PUBLIC_KEY = 'setAuditorPublicKey',\n}\n\nconst eercInterface = new Interface(EERC_ABI);\n\n/**\n * Recognizes an eERC (Encrypted ERC) transaction by matching its 4-byte function\n * selector against the bundled eERC ABI. Recognition is interface-based and\n * address-agnostic (there is no canonical eERC contract registry) and performs no\n * network calls. A selector match is a decode hint, not a trust signal.\n */\nexport const parseEercTransaction = (transaction: {\n data?: string;\n value?: string;\n}): { operation: EercOperation } | undefined => {\n if (!transaction.data || transaction.data === '0x') {\n return undefined;\n }\n\n try {\n const description = eercInterface.parseTransaction({\n data: transaction.data,\n value: transaction.value,\n });\n\n const functionName = description?.name ?? description?.fragment?.name;\n\n if (functionName && isEercOperation(functionName)) {\n return { operation: functionName };\n }\n\n return undefined;\n } catch {\n return undefined;\n }\n};\n\nfunction isEercOperation(value: string): value is EercOperation {\n return Object.values(EercOperation).includes(value as EercOperation);\n}\n","// Human-readable ABI fragments for the eERC (Encrypted ERC) operations Core recognizes.\n//\n// Kept local (not pulled from a package): the eERC contracts repo is not published to\n// npm, and the eERC SDK (@avalabs/eerc-sdk) does not export its ABIs and drags in\n// snarkjs/react/wagmi, which I deemed too heavy to pull into this repo.\n//\n// Signatures are transcribed from the canonical sources (pinned commits):\n// EncryptedERC.abi.ts: https://github.com/ava-labs/eerc-sdk/blob/b7cb0a59735e1d28c1aa21dfd18bdc61738c0ca5/src/utils/EncryptedERC.abi.ts\n// Registrar.abi.ts: https://github.com/ava-labs/eerc-sdk/blob/b7cb0a59735e1d28c1aa21dfd18bdc61738c0ca5/src/utils/Registrar.abi.ts\n// Contracts: https://github.com/ava-labs/EncryptedERC/blob/c7eb0e09bc9315e68c35d3c09f5dce4b794d0485/contracts/EncryptedERC.sol\n\nexport const EERC_ABI = [\n // Registrar\n 'function register(((uint256[2],uint256[2][2],uint256[2]),uint256[5]) proof)',\n // EncryptedERC\n 'function setAuditorPublicKey(address user)',\n 'function privateMint(address user, ((uint256[2],uint256[2][2],uint256[2]),uint256[24]) proof)',\n 'function privateMint(address user, ((uint256[2],uint256[2][2],uint256[2]),uint256[24]) proof, bytes message)',\n 'function deposit(uint256 amount, address tokenAddress, uint256[7] amountPCT)',\n 'function deposit(uint256 amount, address tokenAddress, uint256[7] amountPCT, bytes message)',\n 'function transfer(address to, uint256 tokenId, ((uint256[2],uint256[2][2],uint256[2]),uint256[32]) proof, uint256[7] balancePCT)',\n 'function transfer(address to, uint256 tokenId, ((uint256[2],uint256[2][2],uint256[2]),uint256[32]) proof, uint256[7] balancePCT, bytes message)',\n 'function withdraw(uint256 tokenId, ((uint256[2],uint256[2][2],uint256[2]),uint256[16]) proof, uint256[7] balancePCT)',\n 'function withdraw(uint256 tokenId, ((uint256[2],uint256[2][2],uint256[2]),uint256[16]) proof, uint256[7] balancePCT, bytes message)',\n] as const;\n","import type { SigningResult } from '@avalabs/vm-module-types';\nimport type { JsonRpcBatchInternal } from '@avalabs/core-wallets-sdk';\nimport { retry, RetryBackoffPolicy } from '@internal/utils';\n\nexport const getTxHash = async (\n provider: JsonRpcBatchInternal,\n response: SigningResult,\n options?: { shouldRetry?: boolean },\n) => {\n if ('txHash' in response) {\n return response.txHash;\n }\n\n const broadcast = () => provider.send('eth_sendRawTransaction', [response.signedData]);\n\n if (!options?.shouldRetry) {\n return broadcast();\n }\n\n return retry({\n operation: () => broadcast(),\n isSuccess: () => true,\n maxRetries: 6,\n backoffPolicy: RetryBackoffPolicy.linearThenExponential(4, 1000),\n });\n};\n","export function getExplorerAddressByNetwork(\n explorerUrl: string,\n hash: string,\n hashType: 'address' | 'tx' = 'tx',\n): string {\n return `${explorerUrl}/${hashType}/${hash}`;\n}\n","import type { Hex, RpcRequest } from '@avalabs/vm-module-types';\nimport type { JsonRpcBatchInternal } from '@avalabs/core-wallets-sdk';\nimport { getExplorerAddressByNetwork } from '../handlers/get-transaction-history/utils/get-explorer-address-by-network';\nimport type { TransactionReceipt } from 'ethers';\nimport { retry, RetryBackoffPolicy } from '@internal/utils';\n\nexport const waitForTransactionReceipt = async ({\n explorerUrl,\n provider,\n txHash,\n onTransactionPending,\n onTransactionConfirmed,\n onTransactionReverted,\n request,\n}: {\n explorerUrl: string;\n provider: JsonRpcBatchInternal;\n txHash: Hex;\n onTransactionPending: ({\n txHash,\n request,\n explorerLink,\n }: {\n txHash: Hex;\n request: RpcRequest;\n explorerLink: string;\n }) => void;\n onTransactionConfirmed: ({\n txHash,\n explorerLink,\n request,\n }: {\n txHash: Hex;\n explorerLink: string;\n request: RpcRequest;\n }) => void;\n onTransactionReverted: ({ txHash, request }: { txHash: Hex; request: RpcRequest }) => void;\n request: RpcRequest;\n}) => {\n try {\n const explorerLink = getExplorerAddressByNetwork(explorerUrl, txHash);\n onTransactionPending({ txHash, request, explorerLink });\n\n const receipt = await retry<TransactionReceipt | null>({\n operation: async () => provider.getTransactionReceipt(txHash),\n isSuccess: (r): r is TransactionReceipt => !!r, // success when receipt is present (>= 1 confirmation)\n backoffPolicy: RetryBackoffPolicy.linearThenExponential(15, 750),\n maxRetries: 20,\n });\n\n const success = receipt?.status === 1; // 1 indicates success, 0 indicates revert\n\n if (success) {\n onTransactionConfirmed({ txHash, explorerLink, request });\n return true;\n }\n } catch (error) {\n console.error(error);\n }\n\n onTransactionReverted({ txHash, request });\n\n return false;\n};\n","import { rpcErrors } from '@metamask/rpc-errors';\nimport type { DisplayData, EvmTxBatchUpdateFn, SigningData_EthSendTx } from '@avalabs/vm-module-types';\n\ntype SigningRequests = {\n displayData: DisplayData;\n signingData: SigningData_EthSendTx;\n}[];\n\nconst requests = new Map<\n string,\n {\n signingRequests: SigningRequests;\n displayData: DisplayData;\n }\n>();\n\nexport const getTxBatchUpdater = (\n requestId: string,\n signingRequests: SigningRequests,\n displayData: DisplayData,\n): { updateTx: EvmTxBatchUpdateFn; cleanup: () => void } => {\n requests.set(requestId, { signingRequests, displayData });\n\n return {\n updateTx: ({ maxFeeRate, maxTipRate }, txIndex) => {\n const request = requests.get(requestId);\n\n if (!request) {\n throw rpcErrors.resourceNotFound();\n }\n\n const { signingRequests } = request;\n\n const newSigningRequests = signingRequests.map((signingRequest, index) => {\n if (txIndex === undefined || txIndex === index) {\n const { signingData } = signingRequest;\n const newSigningData = {\n ...signingData,\n data: {\n ...signingData.data,\n maxFeePerGas: maxFeeRate ?? signingData.data.maxFeePerGas,\n maxPriorityFeePerGas: maxTipRate ?? signingData.data.maxPriorityFeePerGas,\n },\n };\n\n return { signingData: newSigningData, displayData: signingRequest.displayData };\n }\n\n return signingRequest;\n });\n\n const updatedRequest = { signingRequests: newSigningRequests, displayData };\n\n requests.set(requestId, updatedRequest);\n return updatedRequest;\n },\n cleanup: () => requests.delete(requestId),\n };\n};\n","import {\n AlertType,\n RpcMethod,\n type Alert,\n type BalanceChange,\n type TokenApprovals,\n type TokenDiff,\n type TransactionSimulationResult,\n} from '@avalabs/vm-module-types';\nimport type { JsonRpcBatchInternal } from '@avalabs/core-wallets-sdk';\n\nimport type { TransactionBatchParams, TransactionParams } from '../../../types';\nimport { isEmpty, isNetworkToken } from '../../../utils/type-utils';\nimport { processTransactionSimulation } from '../../../utils/process-transaction-simulation';\nimport { scanTransactionBatch } from '../../../utils/scan-transaction';\nimport { transactionAlerts } from '../../../utils/transaction-alerts';\nimport type Blockaid from '@blockaid/client';\n\nexport const simulateTransactionBatch = async ({\n rpcMethod,\n dAppUrl,\n params,\n chainId,\n provider,\n populateMissingGas,\n blockaid,\n}: {\n rpcMethod: RpcMethod;\n dAppUrl?: string;\n params: TransactionBatchParams;\n chainId: number;\n provider: JsonRpcBatchInternal;\n populateMissingGas?: boolean;\n blockaid: Blockaid;\n}): Promise<\n TransactionSimulationResult & { scans: (TransactionSimulationResult & { transaction: TransactionParams })[] }\n> => {\n let simulationResults;\n\n try {\n simulationResults = await scanTransactionBatch({\n chainId,\n params,\n domain: dAppUrl,\n withGasEstimation: populateMissingGas,\n blockaid,\n });\n } catch (error) {\n console.error('simulateTransactionBatch error', error);\n return {\n isSimulationSuccessful: false,\n alert: transactionAlerts[AlertType.WARNING],\n scans: [],\n };\n }\n\n const scans = await Promise.all(\n simulationResults.map(async (simulationResult, index) => {\n const matchingTx = params[index]!;\n const processedResult = await processTransactionSimulation({\n chainId,\n params: params[index]!,\n provider,\n rpcMethod,\n simulationResult,\n });\n\n if (populateMissingGas && !matchingTx.gas && processedResult.estimatedGasLimit) {\n matchingTx.gas = `0x${processedResult.estimatedGasLimit.toString(16)}`;\n }\n\n return {\n transaction: matchingTx,\n ...processedResult,\n };\n }),\n );\n\n // Make sure `isSimulatioSuccessful` is only true for a batch if all nested transactions were simulated successfully\n const isSimulationSuccessful = scans.every((scan) => scan.isSimulationSuccessful);\n // Make sure the alert in the aggregated view is of the upmost priority (DANGER -> WARNING -> INFO)\n const alert = getHighestAlert(scans);\n const balanceChange = aggregateBalanceChange(scans);\n const tokenApprovals = aggregateTokenApprovals(scans);\n\n return {\n isSimulationSuccessful,\n alert,\n balanceChange,\n tokenApprovals,\n // For now, we're disabling the editing of approvals in the aggregated view since\n // it could disrupt the execution of the entire batch.\n scans: scans.map((scan) => {\n if (!scan.tokenApprovals) {\n return scan;\n }\n\n scan.tokenApprovals.isEditable = false;\n return scan;\n }),\n };\n};\n\nconst getHighestAlert = (scans: { alert?: Alert }[]): Alert | undefined => {\n const alertPrio = {\n [AlertType.INFO]: 0,\n [AlertType.WARNING]: 1,\n [AlertType.DANGER]: 2,\n };\n\n return scans.reduce(\n (highest, { alert }) => {\n if (!alert) return highest;\n if (!highest || alertPrio[alert.type] > alertPrio[highest.type]) {\n return alert;\n }\n return highest;\n },\n undefined as Alert | undefined,\n );\n};\n\nconst aggregateTokenApprovals = (scans: TransactionSimulationResult[]): TokenApprovals | undefined => {\n const tokenApprovals = scans.reduce(\n (aggregatedTokenApprovals, { tokenApprovals }) => {\n if (!tokenApprovals) {\n return aggregatedTokenApprovals;\n }\n\n tokenApprovals.approvals.forEach((appr) => {\n const aggregatedApproval = aggregatedTokenApprovals.approvals.find(\n (aggrApproval) =>\n appr.token.address === aggrApproval.token.address && appr.spenderAddress === aggrApproval.spenderAddress,\n );\n\n if (!aggregatedApproval) {\n aggregatedTokenApprovals.approvals.push({ ...appr });\n return;\n }\n\n // Replace with new values\n aggregatedApproval.value = appr.value;\n aggregatedApproval.usdPrice = appr.usdPrice;\n });\n\n return aggregatedTokenApprovals;\n },\n {\n approvals: [],\n isEditable: false,\n } as TokenApprovals,\n );\n\n clearSpentApprovals(tokenApprovals, scans);\n\n return isEmpty(tokenApprovals) ? undefined : tokenApprovals;\n};\n\nconst aggregateBalanceChange = (scans: TransactionSimulationResult[]): BalanceChange | undefined => {\n const aggregated = scans.reduce(\n (aggregatedBalanceChange, { balanceChange }) => {\n if (!balanceChange) {\n return aggregatedBalanceChange;\n }\n\n balanceChange.ins.forEach((diff) => {\n const aggregatedDiff = findTokenDiff(aggregatedBalanceChange.ins, diff);\n\n if (aggregatedDiff) {\n aggregatedDiff.items.push(...diff.items);\n } else {\n aggregatedBalanceChange.ins.push(diff);\n }\n });\n\n balanceChange.outs.forEach((diff) => {\n const aggregatedDiff = findTokenDiff(aggregatedBalanceChange.outs, diff);\n\n if (aggregatedDiff) {\n aggregatedDiff.items.push(...diff.items);\n } else {\n aggregatedBalanceChange.outs.push({ ...diff });\n }\n });\n\n return aggregatedBalanceChange;\n },\n {\n ins: [],\n outs: [],\n } as BalanceChange,\n );\n\n return isEmpty(aggregated) ? undefined : aggregated;\n};\n\nconst findTokenDiff = (diffs: TokenDiff[], lookupDiff: TokenDiff): TokenDiff | undefined =>\n diffs.find((diff) => {\n if (isNetworkToken(diff.token) && isNetworkToken(lookupDiff.token)) {\n return diff.token.symbol === lookupDiff.token.symbol;\n }\n\n if (!isNetworkToken(diff.token) && !isNetworkToken(lookupDiff.token)) {\n return diff.token.address === lookupDiff.token.address;\n }\n\n return false;\n });\n\nconst clearSpentApprovals = (tokenApprovals: TokenApprovals, scans: TransactionSimulationResult[]) => {\n // Go through each transaction. If the approvals were spent, remove them from the aggregated token approvals:\n for (const approval of tokenApprovals.approvals) {\n for (const scan of scans) {\n if (!scan.isSimulationSuccessful || !scan.balanceChange) {\n continue;\n }\n\n const touchesApproval = scan.balanceChange.outs.some((diff) => {\n return (\n !isNetworkToken(diff.token) &&\n !isNetworkToken(approval.token) &&\n diff.token.address === approval.token.address\n );\n });\n\n if (!touchesApproval) {\n continue;\n }\n\n if (!scan.tokenApprovals) {\n // Allowance was completely spent, remove the approval from aggregated view\n //\n // NOTE: With the current implementation of the BlockAid API, this is just an assumption on our part!\n // It's possible that the next transaction simply does not touch the approval at all.\n // Since we're initially be using this handler for the Swap feature, though, most of the time the allowance\n // will be spent completely.\n //\n // The BlockAid team is working to update their API to provide more accurate data.\n tokenApprovals.approvals = tokenApprovals.approvals.filter(\n (appr) => appr.spenderAddress !== approval.spenderAddress && approval.token.address !== appr.token.address,\n );\n } else {\n const latestApprovalState = scan.tokenApprovals.approvals.find(\n (appr) => appr.spenderAddress === approval.spenderAddress && appr.token.address === approval.token.address,\n );\n\n if (!latestApprovalState) {\n continue;\n }\n approval.usdPrice = latestApprovalState.usdPrice;\n approval.value = latestApprovalState.value;\n }\n }\n }\n};\n","import {\n TokenType,\n type ApprovalController,\n type BalanceChange,\n type BatchApprovalController,\n type ERC1155Token,\n type ERC20Token,\n type ERC721Token,\n type NetworkContractToken,\n type NetworkToken,\n type TokenApprovals,\n} from '@avalabs/vm-module-types';\nimport type { RequiredBy, TransactionParams } from '../types';\n\nexport function isNetworkToken(token: NetworkContractToken | NetworkToken): token is NetworkToken {\n return !('type' in token);\n}\n\nexport function isERC20Token(token: NetworkContractToken): token is ERC20Token {\n return token.type === TokenType.ERC20;\n}\n\nexport function isNftToken(token: NetworkContractToken): token is ERC1155Token | ERC721Token {\n return token.type === TokenType.ERC1155 || token.type === TokenType.ERC721;\n}\n\nexport function hasToField(params: TransactionParams): params is RequiredBy<TransactionParams, 'to'> {\n return typeof params.to === 'string';\n}\n\nexport function supportsBatchApprovals(\n controller: ApprovalController | BatchApprovalController,\n): controller is BatchApprovalController {\n return 'requestBatchApproval' in controller && typeof controller.requestBatchApproval === 'function';\n}\n\nexport function isBalanceChange(input: unknown): input is BalanceChange {\n return (\n typeof input === 'object' &&\n input !== null &&\n 'ins' in input &&\n 'outs' in input &&\n Array.isArray(input.ins) &&\n Array.isArray(input.outs)\n );\n}\n\nexport function isTokenApprovals(input: unknown): input is TokenApprovals {\n return (\n typeof input === 'object' &&\n input !== null &&\n 'approvals' in input &&\n 'isEditable' in input &&\n Array.isArray(input.approvals)\n );\n}\n\nexport function isEmpty(input: unknown): boolean {\n if (isBalanceChange(input)) {\n return input.ins.length === 0 && input.outs.length === 0;\n }\n\n if (isTokenApprovals(input)) {\n return input.approvals.length === 0;\n }\n\n return false;\n}\n","import Blockaid from '@blockaid/client';\nimport type { TransactionParams } from '../types';\nimport {\n type NetworkContractToken,\n type NetworkToken,\n TokenType,\n AlertType,\n type Alert,\n type BalanceChange,\n type TokenApproval,\n type TokenDiff,\n type TokenDiffItem,\n type TokenApprovals,\n type RpcRequest,\n RpcMethod,\n type TransactionSimulationResult,\n} from '@avalabs/vm-module-types';\nimport { balanceToDisplayValue, numberToBN } from '@avalabs/core-utils-sdk';\nimport { isHexString, MaxUint256 } from 'ethers';\nimport { scanJsonRpc, scanTransaction } from './scan-transaction';\nimport type { JsonRpcBatchInternal } from '@avalabs/core-wallets-sdk';\nimport { parseWithErc20Abi } from './parse-erc20-tx';\nimport { hasToField } from './type-utils';\nimport { transactionAlerts } from './transaction-alerts';\n\ntype Erc20ExposureTrace = Blockaid.Evm.AccountSummary.Erc20ExposureTrace;\ntype Erc721ExposureTrace = Blockaid.Evm.AccountSummary.Erc721ExposureTrace;\ntype Erc1155ExposureTrace = Blockaid.Evm.AccountSummary.Erc1155ExposureTrace;\n\n/*\n * Although in the type definition they don't specify it, but for traces they are returning the asset as well:\n * https://docs.blockaid.io/changelog/november-12-2024#account-traces\n * */\ntype ExposureTrace =\n | (Erc20ExposureTrace & { asset: Blockaid.Evm.Erc20TokenDetails })\n | (Erc721ExposureTrace & { asset: Blockaid.Evm.Erc721TokenDetails })\n | (Erc1155ExposureTrace & { asset: Blockaid.Evm.Erc1155TokenDetails });\ntype Trace = Blockaid.Evm.AccountSummary['traces']['0'];\nexport type AssetDiffs = Blockaid.Evm.AccountSummary['assets_diffs'];\n\nexport const simulateTransaction = async ({\n rpcMethod,\n dAppUrl,\n params,\n chainId,\n provider,\n blockaid,\n}: {\n rpcMethod: RpcMethod;\n dAppUrl?: string;\n params: TransactionParams;\n chainId: number;\n provider: JsonRpcBatchInternal;\n blockaid: Blockaid;\n}) => {\n let simulationResult: Pick<Blockaid.TransactionScanResponse, 'simulation' | 'validation'> | undefined;\n\n try {\n simulationResult = await scanTransaction({\n chainId,\n params,\n domain: dAppUrl,\n blockaid,\n });\n } catch (error) {\n console.error('simulateTransaction error', error);\n }\n\n return processTransactionSimulation({ rpcMethod, params, chainId, provider, simulationResult });\n};\n\nexport const processTransactionSimulation = async ({\n rpcMethod,\n params,\n chainId,\n provider,\n simulationResult,\n}: {\n rpcMethod: RpcMethod;\n params: TransactionParams;\n chainId: number;\n provider: JsonRpcBatchInternal;\n simulationResult?: Pick<Blockaid.TransactionScanResponse, 'simulation' | 'validation' | 'gas_estimation'>;\n}): Promise<TransactionSimulationResult> => {\n let alert: Alert | undefined;\n let balanceChange: BalanceChange | undefined;\n let tokenApprovals: TokenApprovals | undefined;\n let isSimulationSuccessful = false;\n let estimatedGasLimit: number | undefined;\n\n if (simulationResult) {\n const { validation, simulation, gas_estimation: gasEstimation } = simulationResult;\n\n // Only surface an alert when Blockaid returns a genuine verdict. A missing\n // validation or `result_type === 'Error'` is not a security signal\n if (validation?.result_type === 'Warning') {\n alert = transactionAlerts[AlertType.WARNING];\n } else if (validation?.result_type === 'Malicious') {\n alert = transactionAlerts[AlertType.DANGER];\n }\n\n if (simulation?.status === 'Success') {\n isSimulationSuccessful = true;\n tokenApprovals = processTokenApprovals(rpcMethod, simulation.account_summary);\n balanceChange = processBalanceChange(simulation.account_summary.assets_diffs);\n }\n\n if (gasEstimation?.status === 'Success') {\n estimatedGasLimit = Number(gasEstimation.estimate);\n }\n }\n\n // If debank parsing failed, check if toAddress is a known ERC20\n if (!isSimulationSuccessful && hasToField(params)) {\n const erc20ParseResult = await parseWithErc20Abi(params, chainId, provider);\n balanceChange = erc20ParseResult.balanceChange;\n tokenApprovals = erc20ParseResult.tokenApprovals;\n }\n\n return { alert, balanceChange, tokenApprovals, isSimulationSuccessful, estimatedGasLimit };\n};\n\nconst isExposureTrace = (trace: Trace): trace is ExposureTrace => {\n return (trace as ExposureTrace).trace_type === 'ExposureTrace';\n};\n\nconst normalizeAddresses = (spender: string, assetAddress: string): string =>\n `${spender.toLowerCase()}.${assetAddress.toLowerCase()}`;\n\nconst mapExposureTracesToSpenderAsset = (traces: Trace[]): Record<string, ExposureTrace> => {\n if (traces === undefined || traces.length === 0) {\n return {};\n }\n\n return traces.reduce(\n (accumulator, trace) => {\n if (!isExposureTrace(trace)) {\n return accumulator;\n }\n return {\n [normalizeAddresses(trace.spender, trace.asset.address)]: trace,\n };\n },\n {} as Record<string, ExposureTrace>,\n );\n};\n\nconst processTokenApprovals = (\n rpcMethod: RpcMethod,\n accountSummary: Blockaid.Evm.AccountSummary,\n): TokenApprovals | undefined => {\n const { traces } = accountSummary;\n\n const mappedExposureTraces = mapExposureTracesToSpenderAsset(traces);\n\n const approvals = Object.entries(mappedExposureTraces)\n .map(([_, trace]) => {\n const token = convertAssetToNetworkContractToken(trace.asset);\n if (!token) {\n return;\n }\n\n const tokenApproval: TokenApproval = {\n token,\n spenderAddress: trace.spender,\n logoUri: token.logoUri,\n };\n\n if (trace.type === 'ERC20ExposureTrace') {\n const {\n exposed: { raw_value, value, usd_price },\n } = trace as Erc20ExposureTrace;\n\n // Only show approval when the spender's exposure increases.\n // Skips retries (0 change) and reduced allowances (negative change).\n if (!value || value <= 0) {\n return;\n }\n\n tokenApproval.value = raw_value;\n tokenApproval.usdPrice = `${usd_price}`;\n }\n\n if (trace.type === 'ERC721ExposureTrace') {\n // When dApp attempts to call setApprovalForAll(), the \"exposed\" field is not present.\n // However, the result of such transaction is that the spender gets approval for all\n // tokens in the NFT collection, so we treat it the same as \"Unlimited\" approval for ERC-20.\n if (!trace.exposed) {\n tokenApproval.value = `0x${MaxUint256.toString(16)}`;\n } else {\n const { usd_price, amount } = trace.exposed;\n\n tokenApproval.value = `${amount}`;\n tokenApproval.usdPrice = `${usd_price}`;\n }\n }\n\n return tokenApproval;\n })\n .filter(Boolean) as TokenApproval[];\n\n if (approvals.length === 0) {\n return undefined;\n }\n\n const isEditable =\n approvals.length === 1 &&\n approvals[0]?.token.type === TokenType.ERC20 &&\n rpcMethod === RpcMethod.ETH_SEND_TRANSACTION;\n\n return { isEditable, approvals };\n};\n\nexport const processBalanceChange = (accountSummaryAssetsDiffs: AssetDiffs): BalanceChange | undefined => {\n const ins = processAssetDiffs(accountSummaryAssetsDiffs, 'in');\n const outs = processAssetDiffs(accountSummaryAssetsDiffs, 'out');\n\n if (ins.length === 0 && outs.length === 0) {\n return undefined;\n }\n\n return { ins, outs };\n};\n\nconst processAssetDiffs = (accountSummaryAssetsDiffs: AssetDiffs, type: 'in' | 'out'): TokenDiff[] => {\n return (\n accountSummaryAssetsDiffs\n .filter((assetDiff) => assetDiff[type].length > 0)\n // sort asset diffs by length of in/out array\n // this is done to ensure that the token with multiple in/out values are displayed last,\n // to put them in groups with appropriate UI(i.e. accordion), after single in/out tokens\n .sort((a, b) => a[type].length - b[type].length)\n .map((assetDiff) => {\n const asset = assetDiff.asset;\n // convert blockaid asset to network token\n const token: NetworkToken | NetworkContractToken | undefined =\n 'address' in asset ? convertAssetToNetworkContractToken(asset) : convertNativeAssetToToken(asset);\n if (!token) {\n return undefined;\n }\n\n const items = assetDiff[type]\n .map((diff) => {\n let displayValue;\n if ('value' in diff && diff.value) {\n if ('decimals' in token) {\n const valueBN = numberToBN(diff.value, token.decimals);\n displayValue = balanceToDisplayValue(valueBN, token.decimals);\n } else if (isHexString(diff.value)) {\n // for some token (like ERC1155) blockaid returns value in hex format\n displayValue = parseInt(diff.value, 16).toString();\n }\n } else if ('type' in token && token.type === TokenType.ERC721) {\n // for ERC721 type token, we just display 1 to indicate that a single NFT will be transferred\n displayValue = '1';\n }\n\n if (!displayValue) {\n return undefined;\n }\n\n const logoUri = 'logo_url' in diff ? diff.logo_url : undefined;\n const tokenId = 'token_id' in diff ? diff.token_id : undefined;\n\n const item: TokenDiffItem = {\n displayValue,\n usdPrice: diff.usd_price,\n ...(logoUri !== undefined && { logoUri }),\n ...(tokenId !== undefined && { tokenId }),\n };\n return item;\n })\n .filter((x): x is TokenDiffItem => x !== undefined);\n\n return { token, items };\n })\n .filter((x): x is TokenDiff => x !== undefined)\n );\n};\n\nconst convertAssetToNetworkContractToken = (\n asset:\n | Blockaid.Erc20TokenDetails\n | Blockaid.Erc1155TokenDetails\n | Blockaid.Erc721TokenDetails\n | Blockaid.NonercTokenDetails,\n): NetworkContractToken | undefined => {\n let token: NetworkContractToken | undefined;\n if (asset.type === 'ERC20') {\n token = {\n type: TokenType.ERC20,\n address: asset.address,\n decimals: asset.decimals,\n name: asset.name ?? asset.symbol ?? '',\n symbol: asset.symbol ?? '',\n logoUri: asset.logo_url,\n };\n } else if (asset.type === 'ERC1155') {\n token = {\n type: TokenType.ERC1155,\n address: asset.address,\n logoUri: asset.logo_url,\n name: asset.name,\n symbol: asset.symbol,\n };\n } else if (asset.type === 'ERC721') {\n token = {\n type: TokenType.ERC721,\n address: asset.address,\n logoUri: asset.logo_url,\n name: asset.name,\n symbol: asset.symbol,\n };\n } else if (asset.type === 'NONERC') {\n token = {\n type: TokenType.NONERC,\n address: asset.address,\n logoUri: asset.logo_url,\n name: asset.name,\n symbol: asset.symbol,\n };\n }\n\n return token;\n};\n\nconst convertNativeAssetToToken = (asset: Blockaid.NativeAssetDetails): NetworkToken => {\n return {\n name: asset.name ?? '',\n symbol: asset.symbol ?? '',\n decimals: asset.decimals,\n description: '',\n logoUri: asset.logo_url,\n };\n};\n\nexport const processJsonRpcSimulation = async ({\n request,\n dAppUrl,\n accountAddress,\n chainId,\n data,\n blockaid,\n}: {\n request: RpcRequest;\n dAppUrl?: string;\n accountAddress: string;\n data: { method: string; params: unknown };\n chainId: number;\n blockaid: Blockaid;\n}) => {\n let alert: Alert | undefined;\n let balanceChange: BalanceChange | undefined;\n let tokenApprovals: TokenApprovals | undefined;\n\n try {\n const { validation, simulation } = await scanJsonRpc({\n chainId,\n accountAddress,\n data: data as Blockaid.Evm.JsonRpcScanParams.Data,\n domain: dAppUrl,\n blockaid,\n });\n\n // Only surface an alert when Blockaid returns a genuine verdict. A missing\n // validation or `result_type === 'Error'` is not a security signal\n if (validation?.result_type === 'Warning') {\n alert = transactionAlerts[AlertType.WARNING];\n } else if (validation?.result_type === 'Malicious') {\n alert = transactionAlerts[AlertType.DANGER];\n }\n\n if (simulation?.status === 'Success') {\n tokenApprovals = processTokenApprovals(request.method, simulation.account_summary);\n balanceChange = processBalanceChange(simulation.account_summary.assets_diffs);\n }\n } catch (error) {\n console.error('processJsonRpcSimulation error', error);\n alert = transactionAlerts[AlertType.WARNING];\n }\n\n return { alert, balanceChange, tokenApprovals };\n};\n","import Blockaid from '@blockaid/client';\nimport type { TransactionBulkScanParams } from '@blockaid/client/resources/evm/transaction-bulk';\n\nimport type { TransactionBatchParams, TransactionParams } from '../types';\n\nexport const scanTransactionBatch = async ({\n chainId,\n params,\n domain,\n withGasEstimation,\n blockaid,\n}: {\n chainId: number;\n params: TransactionBatchParams;\n domain?: string;\n withGasEstimation?: boolean;\n blockaid: Blockaid;\n}): Promise<Blockaid.TransactionScanResponse[]> => {\n const options: TransactionBulkScanParams['options'] = ['validation', 'simulation'];\n\n if (withGasEstimation) {\n options.push('gas_estimation');\n }\n\n return blockaid.evm.transactionBulk.scan({\n chain: chainId.toString(),\n options,\n data: params,\n metadata: (domain && domain.length > 0 ? { domain } : { non_dapp: true }) as Blockaid.Evm.MetadataParam,\n });\n};\n\nexport const scanTransaction = async ({\n chainId,\n params,\n domain,\n blockaid,\n}: {\n chainId: number;\n params: TransactionParams;\n domain?: string;\n blockaid: Blockaid;\n}): Promise<Blockaid.TransactionScanResponse> => {\n return blockaid.evm.transaction.scan({\n account_address: params.from,\n chain: chainId.toString(),\n options: ['validation', 'simulation'],\n data: {\n from: params.from,\n to: params.to,\n data: params.data,\n value: params.value,\n gas: params.gas,\n gas_price: params.gasPrice,\n // TODO: provide accessList once Blockaid supports it\n // access_list: params.accessList\n },\n metadata: (domain && domain.length > 0 ? { domain } : { non_dapp: true }) as Blockaid.Evm.MetadataParam,\n });\n};\n\nexport const scanJsonRpc = async ({\n chainId,\n accountAddress,\n data,\n domain,\n blockaid,\n}: {\n chainId: number;\n accountAddress: string;\n data: Blockaid.Evm.JsonRpcScanParams.Data;\n domain?: string;\n blockaid: Blockaid;\n}): Promise<Blockaid.TransactionScanResponse> => {\n return blockaid.evm.jsonRpc.scan({\n chain: chainId.toString(),\n options: ['validation', 'simulation'],\n account_address: accountAddress,\n data,\n metadata: (domain && domain.length > 0 ? { domain } : { non_dapp: true }) as Blockaid.Evm.MetadataParam,\n });\n};\n","import xss from 'xss';\nimport { ethers } from 'ethers';\nimport { TokenType } from '@avalabs/vm-module-types';\nimport { TokenUnit } from '@avalabs/core-utils-sdk';\nimport ERC20 from '@openzeppelin/contracts/build/contracts/ERC20.json';\nimport type { JsonRpcBatchInternal } from '@avalabs/core-wallets-sdk';\n\nimport { ERC20TransactionType, type RequiredBy, type TransactionParams } from '../types';\n\nexport const parseWithErc20Abi = async (\n params: RequiredBy<TransactionParams, 'to'>,\n chainId: number,\n provider: JsonRpcBatchInternal,\n) => {\n if (!params.data) {\n return {\n tokenApprovals: undefined,\n balanceChange: undefined,\n };\n }\n\n try {\n const contract = new ethers.Contract(params.to, ERC20.abi, provider);\n const contractCalls = await Promise.all([contract.name?.(), contract.symbol?.(), contract.decimals?.()]);\n // Purify the values for XSS protection\n const name = xss(contractCalls[0]);\n const symbol = xss(contractCalls[1]);\n const decimals = parseInt(contractCalls[2]);\n const token = {\n type: TokenType.ERC20,\n name,\n chainId,\n symbol,\n decimals,\n address: params.to,\n contractType: 'ERC-20',\n } as const;\n\n const iface = new ethers.Interface(ERC20.abi);\n const calledFunction = iface.getFunction(params.data.slice(0, 10));\n\n const decodeFunctionData = iface.decodeFunctionData(params.data.slice(0, 10), params.data);\n if (calledFunction?.name === ERC20TransactionType.TRANSFER) {\n return {\n balanceChange: {\n outs: [\n {\n items: [\n {\n displayValue: new TokenUnit(decodeFunctionData['amount'], token.decimals, token.symbol).toDisplay(),\n usdPrice: undefined,\n },\n ],\n token,\n },\n ],\n ins: [],\n },\n };\n } else if (calledFunction?.name === ERC20TransactionType.APPROVE) {\n return {\n tokenApprovals: {\n isEditable: true,\n approvals: [\n {\n token,\n spenderAddress: decodeFunctionData['spender'],\n value: decodeFunctionData['amount'],\n },\n ],\n },\n };\n }\n } catch (error) {\n console.error('parseErc20Tx error', error);\n }\n\n return {\n tokenApprovals: undefined,\n balanceChange: undefined,\n };\n};\n","import { AlertType } from '@avalabs/vm-module-types';\n\nexport const transactionAlerts = {\n [AlertType.WARNING]: {\n type: AlertType.WARNING,\n details: {\n title: 'Suspicious transaction',\n description: 'Use caution, this transaction might be malicious.',\n },\n },\n [AlertType.DANGER]: {\n type: AlertType.DANGER,\n details: {\n title: 'Scam transaction',\n description: 'This transaction has been flagged as malicious, I understand the risk.',\n body: ['This transaction is malicious', 'do not proceed'],\n actionTitles: {\n reject: 'Reject Transaction',\n proceed: 'Proceed Anyway',\n },\n },\n },\n};\n","import type { AgentIdentityDeclaration, RpcRequest } from '@avalabs/vm-module-types';\n\nconst isAgentIdentityDeclaration = (value: unknown): value is AgentIdentityDeclaration => {\n if (!value || typeof value !== 'object') {\n return false;\n }\n\n const candidate = value as Record<string, unknown>;\n return typeof candidate.agentId === 'string' && typeof candidate.agentRegistry === 'string';\n};\n\nexport const getAgentIdentityFromContext = (request: RpcRequest): AgentIdentityDeclaration | null => {\n const candidate = request.context?.agentIdentity;\n return isAgentIdentityDeclaration(candidate) ? candidate : null;\n};\n","import { type Network, type RpcRequest, type ApprovalController } from '@avalabs/vm-module-types';\nimport { rpcErrors } from '@metamask/rpc-errors';\n\nimport { getNonce } from '../../utils/get-nonce';\nimport { getProvider } from '../../utils/get-provider';\nimport { getTxUpdater } from '../../utils/evm-tx-updater';\nimport { estimateGasLimit } from '../../utils/estimate-gas-limit';\nimport { buildTxApprovalRequest } from '../../utils/build-tx-approval-request';\nimport { simulateTransaction } from '../../utils/process-transaction-simulation';\nimport { getAgentIdentityFromContext } from '../../utils/get-agent-identity-from-context';\nimport { resolveAgentIdentity } from '../../utils/resolve-agent-identity';\nimport { rpcErrorOpts } from '@internal/utils';\n\nimport { parseRequestParams } from './schema';\nimport { waitForTransactionReceipt } from '../../utils/wait-for-transaction-receipt';\nimport { getTxHash } from '../../utils/get-tx-hash';\nimport type Blockaid from '@blockaid/client';\n\nexport const ethSendTransaction = async ({\n request,\n network,\n approvalController,\n blockaid,\n eercEnabled = false,\n}: {\n request: RpcRequest;\n network: Network;\n approvalController: ApprovalController;\n blockaid: Blockaid;\n eercEnabled?: boolean;\n}) => {\n const { params } = request;\n\n // validate params\n const { data, error, success } = parseRequestParams(params);\n\n if (!success) {\n console.error('invalid params', error);\n return {\n error: rpcErrors.invalidParams(rpcErrorOpts('Transaction params are invalid', error)),\n };\n }\n\n const [transaction] = data;\n\n const provider = await getProvider({\n chainId: network.chainId,\n chainName: network.chainName,\n rpcUrl: network.rpcUrl,\n multiContractAddress: network.utilityAddresses?.multicall,\n pollingInterval: 1000,\n customRpcHeaders: network.customRpcHeaders,\n });\n\n // calculate gas limit if not provided/invalid\n if (!transaction.gas || Number(transaction.gas) < 0) {\n try {\n const gasLimit = await estimateGasLimit({\n transactionParams: {\n from: transaction.from,\n to: transaction.to,\n data: transaction.data,\n value: transaction.value,\n accessList: transaction.accessList,\n },\n provider,\n });\n\n transaction.gas = '0x' + gasLimit.toString(16);\n } catch (error) {\n return {\n error: rpcErrors.internal(rpcErrorOpts('Unable to calculate gas limit', error)),\n };\n }\n }\n\n // calculate nonce if not provided\n if (!transaction.nonce) {\n try {\n const nonce = await getNonce({\n from: transaction.from,\n provider,\n });\n transaction.nonce = String(nonce);\n } catch (error) {\n return {\n error: rpcErrors.internal(rpcErrorOpts('Unable to calculate nonce', error)),\n };\n }\n }\n\n const declaration = getAgentIdentityFromContext(request);\n const agentIdentity = declaration\n ? await resolveAgentIdentity({\n declaration,\n rpcUrl: network.rpcUrl,\n chainId: network.chainId,\n chainName: network.chainName,\n customRpcHeaders: network.customRpcHeaders,\n })\n : undefined;\n\n const scan = await simulateTransaction({\n rpcMethod: request.method,\n chainId: network.chainId,\n params: transaction,\n dAppUrl: request.dappInfo.url,\n provider,\n blockaid,\n });\n\n const { displayData, signingData } = buildTxApprovalRequest(\n request,\n network,\n transaction,\n scan,\n agentIdentity,\n eercEnabled,\n );\n\n const { updateTx, cleanup } = getTxUpdater(request.requestId, signingData, displayData);\n // prompt user for approval\n const response = await approvalController.requestApproval({ request, displayData, signingData, updateTx });\n\n cleanup();\n\n if ('error' in response) {\n return {\n error: response.error,\n };\n }\n\n let txHash;\n\n // Read shouldRetry AFTER approval, so mutations during approval flow are respected\n const shouldRetry = request.context?.shouldRetry === true;\n\n try {\n txHash = await getTxHash(provider, response, { shouldRetry });\n } catch (error) {\n return {\n error: rpcErrors.internal(rpcErrorOpts('Unable to get transaction hash', error)),\n };\n }\n\n waitForTransactionReceipt({\n explorerUrl: network.explorerUrl ?? '',\n provider,\n txHash,\n onTransactionPending: approvalController.onTransactionPending,\n onTransactionConfirmed: approvalController.onTransactionConfirmed,\n onTransactionReverted: approvalController.onTransactionReverted,\n request,\n });\n\n return { result: txHash };\n};\n","import { rpcErrors } from '@metamask/rpc-errors';\nimport type { DisplayData, EvmTxUpdateFn, SigningData_EthSendTx, TokenApprovals } from '@avalabs/vm-module-types';\n\nimport { ERC20TransactionType } from '../types';\nimport { parseERC20TransactionType } from './parse-erc20-transaction-type';\nimport { encodeApprovalLimit } from './encode-erc20-approval';\n\nconst requests = new Map<string, { displayData: DisplayData; signingData: SigningData_EthSendTx }>();\n\nexport const getTxUpdater = (\n requestId: string,\n signingData: SigningData_EthSendTx,\n displayData: DisplayData,\n): { updateTx: EvmTxUpdateFn; cleanup: () => void } => {\n requests.set(requestId, { signingData, displayData });\n\n return {\n updateTx: ({ maxFeeRate, maxTipRate, approvalLimit, gasLimit }) => {\n const request = requests.get(requestId);\n\n if (!request) {\n throw rpcErrors.resourceNotFound();\n }\n\n const { signingData, displayData } = request;\n\n const newSigningData = {\n ...signingData,\n data: {\n ...signingData.data,\n gasLimit: gasLimit ?? signingData.data.gasLimit,\n maxFeePerGas: maxFeeRate ?? signingData.data.maxFeePerGas,\n maxPriorityFeePerGas: maxTipRate ?? signingData.data.maxPriorityFeePerGas,\n },\n };\n\n const newDisplayData = { ...displayData };\n\n if (typeof approvalLimit === 'string') {\n if (!approvalLimit.startsWith('0x')) {\n throw rpcErrors.invalidInput('Expected approvalLimit to be a hexadecimal number (0x-prefixed)');\n }\n\n const tokenApprovals = displayData.tokenApprovals;\n\n ensureTokenApprovalCanBeEdited(tokenApprovals);\n ensureApproveWasCalled(signingData.data.data);\n\n const approval = tokenApprovals.approvals[0]!;\n\n newSigningData.data.data = encodeApprovalLimit(approval.token.address, approval.spenderAddress, approvalLimit);\n newDisplayData.tokenApprovals = {\n approvals: [\n {\n ...approval,\n value: approvalLimit,\n },\n ],\n isEditable: true,\n };\n }\n\n const updatedRequest = { signingData: newSigningData, displayData: newDisplayData };\n\n requests.set(requestId, updatedRequest);\n\n return updatedRequest;\n },\n cleanup: () => requests.delete(requestId),\n };\n};\n\nfunction ensureTokenApprovalCanBeEdited(\n tokenApprovals?: TokenApprovals,\n): asserts tokenApprovals is TokenApprovals & { isEditable: true } {\n if (!tokenApprovals || !tokenApprovals.isEditable || tokenApprovals.approvals.length !== 1) {\n throw rpcErrors.invalidInput(\n 'Cannot edit the token approval for this request. Please start a new request instead.',\n );\n }\n}\n\nfunction ensureApproveWasCalled(txData?: string | null) {\n const previousMethod = !txData || txData === '0x' ? null : parseERC20TransactionType({ data: txData ?? undefined });\n\n // If original tx was not setting any approvals, do not allow it to be set later on.\n if (previousMethod !== ERC20TransactionType.APPROVE) {\n throw rpcErrors.invalidInput(\n 'Cannot change invoked method for requests in progress. Please start a new request instead.',\n );\n }\n}\n","import { ethers } from 'ethers';\nimport ERC20 from '@openzeppelin/contracts/build/contracts/ERC20.json';\nimport { ERC20TransactionType } from '../types';\n\nexport function encodeApprovalLimit(tokenAddress: string, spenderAddress: string, limit: string) {\n const contract = new ethers.Contract(tokenAddress, ERC20.abi);\n\n return contract.interface.encodeFunctionData(ERC20TransactionType.APPROVE, [spenderAddress, limit]);\n}\n","import { JsonRpcBatchInternal } from '@avalabs/core-wallets-sdk';\nimport type { AccessList, BigNumberish } from 'ethers';\n\nexport const estimateGasLimit = async ({\n transactionParams: { from, to, data, value, accessList },\n provider,\n}: {\n transactionParams: {\n from: string;\n to?: string;\n data?: string;\n value?: BigNumberish;\n accessList?: AccessList;\n };\n provider: JsonRpcBatchInternal;\n}): Promise<number> => {\n const nonce = await provider.getTransactionCount(from);\n\n return Number(\n await provider.estimateGas({\n from,\n to,\n nonce,\n data,\n value,\n accessList,\n }),\n );\n};\n","import { z } from 'zod';\n\nimport { transactionSchema } from '../../utils/transaction-schema';\n\nconst paramsSchema = z.tuple([transactionSchema]);\n\nexport const parseRequestParams = (params: unknown) => {\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 Alert,\n AlertType,\n} from '@avalabs/vm-module-types';\nimport { rpcErrors } from '@metamask/rpc-errors';\nimport { toUtf8String } from 'ethers';\nimport { beautifySimpleMessage, beautifyComplexMessage } from './utils/beautify-message/beautify-message';\nimport { parseRequestParams } from './schemas/parse-request-params/parse-request-params';\nimport { isTypedDataV1 } from './utils/typeguards';\nimport { isTypedDataValid } from './utils/is-typed-data-valid';\nimport { processJsonRpcSimulation } from '../../utils/process-transaction-simulation';\nimport { textItem } from '@internal/utils/src/utils/detail-item';\nimport { rpcErrorOpts } from '@internal/utils';\nimport type Blockaid from '@blockaid/client';\nimport { getAgentIdentityFromContext } from '../../utils/get-agent-identity-from-context';\nimport { resolveAgentIdentity } from '../../utils/resolve-agent-identity';\nimport { buildAgentIdentityDetailSection } from '../../utils/build-agent-identity-detail-section';\n\nexport const ethSign = async ({\n request,\n network,\n approvalController,\n blockaid,\n}: {\n request: RpcRequest;\n network: Network;\n approvalController: ApprovalController;\n blockaid: Blockaid;\n}) => {\n const result = parseRequestParams({ method: request.method, params: request.params });\n\n if (!result.success) {\n console.error('invalid params', result.error);\n\n return {\n success: false,\n error: rpcErrors.invalidParams(rpcErrorOpts('Params are invalid', result.error)),\n };\n }\n const { method, data, address } = result.data;\n\n // validate typed data\n let typedDataValidationResult: ReturnType<typeof isTypedDataValid> | undefined;\n\n if (method === RpcMethod.SIGN_TYPED_DATA_V3 || method === RpcMethod.SIGN_TYPED_DATA_V4) {\n typedDataValidationResult = isTypedDataValid(data);\n }\n\n // generate display data and signing data\n let signingData: SigningData | undefined;\n let messageDetails: string | undefined;\n let alert: Alert | undefined;\n\n if (typedDataValidationResult && !typedDataValidationResult.isValid) {\n alert = {\n type: AlertType.INFO,\n details: {\n title: 'Warning: Verify Message Content',\n description: 'This message contains non-standard elements. Please verify message content!',\n detailedDescription: (typedDataValidationResult.error as Error).toString(),\n },\n };\n }\n\n if (method === RpcMethod.ETH_SIGN) {\n signingData = {\n type: method,\n account: address,\n data: data,\n };\n\n messageDetails = data;\n } else if (method === RpcMethod.PERSONAL_SIGN) {\n signingData = {\n type: method,\n account: address,\n data: data,\n };\n\n messageDetails = toUtf8String(data);\n } else if (method === RpcMethod.SIGN_TYPED_DATA || method === RpcMethod.SIGN_TYPED_DATA_V1) {\n signingData = {\n type: method,\n account: address,\n data: data,\n };\n\n messageDetails = isTypedDataV1(data) ? beautifySimpleMessage(data) : beautifyComplexMessage(data);\n } else if (method === RpcMethod.SIGN_TYPED_DATA_V3 || method === RpcMethod.SIGN_TYPED_DATA_V4) {\n signingData = {\n type: method,\n account: address,\n data: data,\n };\n\n const { types, primaryType, ...messageToDisplay } = data;\n messageDetails = beautifyComplexMessage(messageToDisplay);\n }\n\n if (!signingData || !messageDetails) {\n return {\n success: false,\n error: rpcErrors.internal('Unable to generate signing data'),\n };\n }\n\n const simulationResult = await processJsonRpcSimulation({\n request,\n accountAddress: address,\n chainId: network.chainId,\n data: { method, params: request.params },\n dAppUrl: request.dappInfo.url,\n blockaid,\n });\n\n const declaration = getAgentIdentityFromContext(request);\n const agentIdentity = declaration\n ? await resolveAgentIdentity({\n declaration,\n rpcUrl: network.rpcUrl,\n chainId: network.chainId,\n chainName: network.chainName,\n customRpcHeaders: network.customRpcHeaders,\n })\n : undefined;\n\n const displayData: DisplayData = {\n title: 'Sign Message',\n dAppInfo: {\n name: request.dappInfo.name,\n action: `${request.dappInfo.name} is requesting to sign the following message`,\n logoUri: request.dappInfo.icon,\n },\n network: {\n chainId: network.chainId,\n name: network.chainName,\n logoUri: network.logoUri,\n },\n account: address,\n details: [\n {\n title: 'Message',\n items: [textItem('Message', messageDetails, 'vertical')],\n },\n ...(agentIdentity ? [buildAgentIdentityDetailSection(agentIdentity)] : []),\n ],\n alert: simulationResult?.alert ?? alert,\n balanceChange: simulationResult?.balanceChange,\n tokenApprovals: simulationResult?.tokenApprovals,\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","/* eslint-disable @typescript-eslint/no-explicit-any */\nexport const beautifyComplexMessage = (data: { domain: Record<string, any>; message: Record<string, any> }) => {\n let result = '';\n\n result += 'Domain\\n';\n for (const key in data.domain) {\n result += ` ${key}: ${toUnicodeBold(String(data.domain[key]))}\\n`;\n }\n\n result += '\\nMessage\\n';\n for (const key in data.message) {\n if (typeof data.message[key] === 'object' && !Array.isArray(data.message[key])) {\n result += ` ${key}: \\n`;\n for (const subKey in data.message[key]) {\n if (Array.isArray(data.message[key][subKey])) {\n result += ` ${subKey}: \\n`;\n data.message[key][subKey].forEach((item: any, index: number) => {\n result += ` ${index}: ${toUnicodeBold(item)}\\n`;\n });\n } else {\n result += ` ${subKey}: ${toUnicodeBold(String(data.message[key][subKey]))}\\n`;\n }\n }\n } else if (Array.isArray(data.message[key])) {\n result += ` ${key}: \\n`;\n data.message[key].forEach((item: any, index: number) => {\n result += ` ${index}: \\n`;\n for (const subKey in item) {\n if (Array.isArray(item[subKey])) {\n result += ` ${subKey}: \\n`;\n item[subKey].forEach((item: any, index: number) => {\n result += ` ${index}: ${toUnicodeBold(item)}\\n`;\n });\n } else {\n result += ` ${subKey}: ${toUnicodeBold(String(item[subKey]))}\\n`;\n }\n }\n });\n } else {\n result += ` ${key}: ${toUnicodeBold(String(data.message[key]))}\\n`;\n }\n }\n\n return result;\n};\n\nexport const beautifySimpleMessage = (\n data: {\n name: string;\n type: string;\n value: any;\n }[],\n) => {\n let result = '';\n\n data.forEach((item) => {\n result += `${item.name}:\\n`;\n result += `${toUnicodeBold(String(item.value))}\\n\\n`;\n });\n\n return result;\n};\n\nconst toUnicodeBold = (str: string) => {\n const boldMap: Record<string, string> = {\n '0': '𝟬',\n '1': '𝟭',\n '2': '𝟮',\n '3': '𝟯',\n '4': '𝟰',\n '5': '𝟱',\n '6': '𝟲',\n '7': '𝟳',\n '8': '𝟴',\n '9': '𝟵',\n a: '𝗮',\n b: '𝗯',\n c: '𝗰',\n d: '𝗱',\n e: '𝗲',\n f: '𝗳',\n g: '𝗴',\n h: '𝗵',\n i: '𝗶',\n j: '𝗷',\n k: '𝗸',\n l: '𝗹',\n m: '𝗺',\n n: '𝗻',\n o: '𝗼',\n p: '𝗽',\n q: '𝗾',\n r: '𝗿',\n s: '𝘀',\n t: '𝘁',\n u: '𝘂',\n v: '𝘃',\n w: '𝘄',\n x: '𝘅',\n y: '𝘆',\n z: '𝘇',\n A: '𝗔',\n B: '𝗕',\n C: '𝗖',\n D: '𝗗',\n E: '𝗘',\n F: '𝗙',\n G: '𝗚',\n H: '𝗛',\n I: '𝗜',\n J: '𝗝',\n K: '𝗞',\n L: '𝗟',\n M: '𝗠',\n N: '𝗡',\n O: '𝗢',\n P: '𝗣',\n Q: '𝗤',\n R: '𝗥',\n S: '𝗦',\n T: '𝗧',\n U: '𝗨',\n V: '𝗩',\n W: '𝗪',\n X: '𝗫',\n Y: '𝗬',\n Z: '𝗭',\n };\n\n return str\n .split('')\n .map((char) => boldMap[char] || char)\n .join('');\n};\n","import { z } from 'zod';\nimport { ethSignSchema } from '../eth-sign';\nimport {\n combinedTypedDataSchema,\n ethSignTypedDataSchema,\n ethSignTypedDataV1Schema,\n ethSignTypedDataV3Schema,\n ethSignTypedDataV4Schema,\n typedDataSchema,\n} from '../eth-sign-typed-data';\nimport { personalSignSchema } from '../personal-sign';\nimport { RpcMethod } from '@avalabs/vm-module-types';\n\nconst paramsSchema = z\n .discriminatedUnion('method', [\n personalSignSchema,\n ethSignSchema,\n ethSignTypedDataSchema,\n ethSignTypedDataV1Schema,\n ethSignTypedDataV3Schema,\n ethSignTypedDataV4Schema,\n ])\n .transform((value, ctx) => {\n const { method, params } = value;\n\n switch (method) {\n case RpcMethod.PERSONAL_SIGN:\n return {\n data: params[0],\n address: params[1],\n method,\n };\n case RpcMethod.ETH_SIGN:\n return {\n data: params[1],\n address: params[0],\n method,\n };\n case RpcMethod.SIGN_TYPED_DATA:\n case RpcMethod.SIGN_TYPED_DATA_V1: {\n const address = params[0];\n const data = params[1];\n\n if (typeof data !== 'string') return { data, address, method };\n\n try {\n const parsed = JSON.parse(data);\n const result = combinedTypedDataSchema.parse(parsed);\n\n return {\n data: result,\n address,\n method,\n };\n } catch (e) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: 'param is not a valid json',\n });\n\n return z.NEVER;\n }\n }\n case RpcMethod.SIGN_TYPED_DATA_V3:\n case RpcMethod.SIGN_TYPED_DATA_V4: {\n const address = params[0];\n const data = params[1];\n\n if (typeof data !== 'string') return { data, address, method };\n\n try {\n const parsed = JSON.parse(data);\n const result = typedDataSchema.parse(parsed);\n\n return {\n data: result,\n address,\n method,\n };\n } catch (e) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: 'param is not a valid json',\n });\n\n return z.NEVER;\n }\n }\n }\n });\n\nexport function parseRequestParams(params: { method: RpcMethod; params: unknown }) {\n return paramsSchema.safeParse(params);\n}\n","import { z } from 'zod';\nimport { addressSchema, messageSchema } from './shared';\nimport { RpcMethod } from '@avalabs/vm-module-types';\n\n// https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_sign\nexport const ethSignSchema = z.object({\n method: z.literal(RpcMethod.ETH_SIGN),\n params: z.tuple([addressSchema, messageSchema]),\n});\n","import { z } from 'zod';\n\nexport const messageSchema = z.string().describe('message');\n\nexport const addressSchema = z.string().describe('address');\n","import { z } from 'zod';\nimport { addressSchema } from './shared';\nimport { RpcMethod } from '@avalabs/vm-module-types';\n\n/**\n * For the different eth_signTypedData methods, the payload differs based on the version.\n *\n * V1 is based upon [an early version of EIP-712](https://github.com/ethereum/EIPs/pull/712/commits/21abe254fe0452d8583d5b132b1d7be87c0439ca)\n * that lacked some later security improvements, and should generally be neglected in favor of\n * later versions.\n *\n * V3 is based on [EIP-712](https://eips.ethereum.org/EIPS/eip-712), except that arrays and\n * recursive data structures are not supported.\n *\n * V4 is based on [EIP-712](https://eips.ethereum.org/EIPS/eip-712), and includes full support of\n * arrays and recursive data structures.\n *\n * References:\n * - https://eips.ethereum.org/EIPS/eip-712#specification-of-the-eth_signtypeddata-json-rpc\n * - https://docs.metamask.io/guide/signing-data.html#signtypeddata-v4\n */\nconst messageTypeSchema = z.object({ name: z.string(), type: z.string() });\n\nexport const typedDataSchema = z.object({\n types: z.object({ EIP712Domain: z.array(messageTypeSchema) }).catchall(z.array(messageTypeSchema)),\n primaryType: z.string(),\n domain: z.record(z.any()),\n message: z.record(z.any()),\n});\n\nexport const typedDataV1Schema = z\n .array(\n z.object({\n type: z.string(),\n name: z.string(),\n value: z.union([z.string(), z.number(), z.boolean(), z.object({}).passthrough(), z.array(z.unknown()), z.null()]),\n }),\n )\n .nonempty();\n\nexport const combinedTypedDataSchema = typedDataSchema.or(typedDataV1Schema);\n\nconst dataSchema = z.union([z.string().describe('data string'), typedDataSchema]);\n\nexport const combinedDataSchema = z.union([z.string().describe('data string'), combinedTypedDataSchema]);\n\nexport const ethSignTypedDataSchema = z.object({\n method: z.literal(RpcMethod.SIGN_TYPED_DATA),\n params: z.tuple([addressSchema, combinedDataSchema]),\n});\n\nexport const ethSignTypedDataV1Schema = z.object({\n method: z.literal(RpcMethod.SIGN_TYPED_DATA_V1),\n params: z.tuple([addressSchema, combinedDataSchema]),\n});\n\nexport const ethSignTypedDataV3Schema = z.object({\n method: z.literal(RpcMethod.SIGN_TYPED_DATA_V3),\n params: z.tuple([addressSchema, dataSchema]),\n});\n\nexport const ethSignTypedDataV4Schema = z.object({\n method: z.literal(RpcMethod.SIGN_TYPED_DATA_V4),\n params: z.tuple([addressSchema, dataSchema]),\n});\n","import { z } from 'zod';\nimport { addressSchema, messageSchema } from './shared';\nimport { RpcMethod } from '@avalabs/vm-module-types';\n\n// https://github.com/ethereum/go-ethereum/pull/2940\nexport const personalSignSchema = z.object({\n method: z.literal(RpcMethod.PERSONAL_SIGN),\n params: z.union([\n z.tuple([messageSchema, addressSchema]),\n z.tuple([messageSchema, addressSchema, z.string().optional().describe('password')]),\n ]),\n});\n","import type { TypedDataV1, TypedData, MessageTypes } from '@avalabs/vm-module-types';\nimport { typedDataSchema, typedDataV1Schema } from '../schemas/eth-sign-typed-data';\n\nexport const isTypedDataV1 = (data: unknown): data is TypedDataV1 => {\n return typedDataV1Schema.safeParse(data).success;\n};\n\nexport const isTypedData = (data: unknown): data is TypedData<MessageTypes> => {\n return typedDataSchema.safeParse(data).success;\n};\n","import { type TypedData, type MessageTypes } from '@avalabs/vm-module-types';\nimport { TypedDataEncoder } from 'ethers';\n\ntype Result = { isValid: true } | { isValid: false; error: unknown };\n\nexport const isTypedDataValid = (data: TypedData<MessageTypes>): Result => {\n try {\n // getPayload verifies the types and the content of the message throwing an error if the data is not valid.\n // We don't want to immediately reject the request even if there are errors for compatiblity reasons.\n // dApps tend to make small mistakes in the message format like leaving the verifyingContract emptry,\n // in which cases we should be able to continue just like other wallets do (even if it's technically incorrect).\n\n // remove EIP712Domain from types since ethers.js handles it separately\n const { EIP712Domain, ...types } = data.types;\n TypedDataEncoder.getPayload(data.domain, types, data.message);\n\n return {\n isValid: true,\n };\n } catch (e) {\n return {\n isValid: false,\n error: e,\n };\n }\n};\n","import type { Network, RpcRequest } from '@avalabs/vm-module-types';\nimport { rpcErrors } from '@metamask/rpc-errors';\nimport { getProvider } from '../../utils/get-provider';\n\nexport const forwardToRpcNode = async (request: RpcRequest, network: Network) => {\n try {\n // IMPORTANT: do NOT pass `multiContractAddress` here. It makes the provider\n // transparently re-route eth_calls through Multicall3's `aggregate`, which\n // rewrites `msg.sender` to the Multicall3 contract. For dApp reads that depend\n // on the caller (e.g. Uniswap-style `collect`, permit/allowance checks,\n // owner-gated views) that breaks the call — it reverts as \"Multicall3: call\n // failed\" even though the same call succeeds as a direct eth_call with the\n // dApp-provided `from`. We are a verbatim passthrough for dApp requests, so\n // each call must hit the node as-is to preserve caller semantics.\n const provider = await getProvider({\n chainId: network.chainId,\n chainName: network.chainName,\n rpcUrl: network.rpcUrl,\n pollingInterval: 1000,\n customRpcHeaders: network.customRpcHeaders,\n });\n\n const response = await provider.send(request.method, request.params as unknown[]);\n return { result: response };\n } catch (error) {\n // For read methods we are a transparent RPC passthrough, so relay the node's\n // original JSON-RPC error verbatim — its `code` (e.g. 3 = execution reverted),\n // `message` and revert `data`. ethers stores that raw payload under\n // `error.info.error` for a reverted call. Re-coding it as a generic internal\n // error (-32603) or stripping `data`/`code` makes dApps treat an *expected*\n // revert (e.g. eth_call/eth_estimateGas fee & quote simulations) as a fatal\n // failure instead of decoding the revert reason like a direct RPC connection\n // would.\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const rpcError = (error as any).info?.error ?? (error as any).error;\n if (rpcError && typeof rpcError.code === 'number') {\n return { error: rpcError };\n }\n\n return { error: rpcErrors.internal((error as Error).message) };\n }\n};\n","import { NetworkVMType, WalletType, type GetAddressParams, type GetAddressResponse } from '@avalabs/vm-module-types';\nimport { getAddressFromXPub, getEvmAddressFromPubKey } from '@avalabs/core-wallets-sdk';\nimport { rpcErrors } from '@metamask/rpc-errors';\n\ntype GetAddress = Omit<GetAddressParams, 'isTestnet' | 'xpubXP'>;\n\nexport const getAddress = async ({ accountIndex, xpub, walletType }: GetAddress): Promise<GetAddressResponse> => {\n switch (walletType) {\n case WalletType.Mnemonic:\n case WalletType.Ledger:\n case WalletType.Keystone: {\n return {\n [NetworkVMType.EVM]: getAddressFromXPub(xpub, accountIndex),\n };\n }\n case WalletType.LedgerLive:\n case WalletType.Seedless: {\n const pubKeyBuffer = Buffer.from(xpub, 'hex');\n return {\n [NetworkVMType.EVM]: getEvmAddressFromPubKey(pubKeyBuffer),\n };\n }\n default:\n throw rpcErrors.invalidParams(`Unsupported wallet type: ${walletType}`);\n }\n};\n","import type { VsCurrencyType } from '@avalabs/core-coingecko-sdk';\nimport type { CurrencyCode } from '@avalabs/glacier-sdk';\nimport {\n type Error,\n type GetBalancesParams,\n type NetworkTokenWithBalance,\n type NftTokenWithBalance,\n type Storage,\n TokenType,\n type TokenWithBalanceEVM,\n} from '@avalabs/vm-module-types';\nimport type { TokenService } from '@internal/utils';\nimport { RpcService } from '../../services/rpc-service/rpc-service';\nimport { findAsync } from '../../utils/find-async';\nimport { addIdToPromise, type IdPromise, settleAllIdPromises } from '../../utils/id-promise';\nimport { isERC20Token } from '../../utils/type-utils';\nimport type { BalanceServiceInterface } from './balance-service-interface';\n\ntype AccountAddress = string;\ntype TokenSymbol = string;\ntype GetEvmBalancesResponse = Record<AccountAddress, Record<TokenSymbol, TokenWithBalanceEVM | Error> | Error>;\n\nexport const getBalances = async ({\n addresses,\n currency,\n network,\n proxyApiUrl,\n tokenTypes = [TokenType.NATIVE, TokenType.ERC20, TokenType.ERC721, TokenType.ERC1155],\n customTokens = [],\n customTokensOnly = false,\n storage,\n balanceServices = [],\n tokenService,\n fetch,\n}: GetBalancesParams & {\n proxyApiUrl: string;\n balanceServices: BalanceServiceInterface[];\n storage?: Storage;\n tokenService: TokenService;\n fetch?: typeof globalThis.fetch;\n}): Promise<GetEvmBalancesResponse> => {\n const chainId = network.chainId;\n // When only custom tokens are requested we bypass indexed providers (which\n // return a zero-balance polyfill for tokens they don't index) and query the\n // chain directly via RPC to get the real on-chain balances.\n const rpcService = new RpcService({ network, storage, proxyApiUrl, customTokens, fetch });\n const services: BalanceServiceInterface[] = customTokensOnly ? [rpcService] : [...balanceServices, rpcService];\n\n const resolvedTokenTypes = customTokensOnly ? [TokenType.ERC20] : tokenTypes;\n\n const supportingService: BalanceServiceInterface | undefined = await findAsync(\n services,\n (balanceService: BalanceServiceInterface) => balanceService.isNetworkSupported(network.chainId),\n );\n\n const balances: GetEvmBalancesResponse = {};\n if (supportingService) {\n const nativeTokenPromises: Promise<IdPromise<NetworkTokenWithBalance>>[] = [];\n const erc20TokenPromises: Promise<IdPromise<Record<string, TokenWithBalanceEVM | Error>>>[] = [];\n const nftTokenPromises: Promise<IdPromise<Record<string, NftTokenWithBalance | Error>>>[] = [];\n addresses.forEach((address) => {\n if (resolvedTokenTypes.includes(TokenType.NATIVE)) {\n nativeTokenPromises.push(\n addIdToPromise(\n supportingService\n .getNativeBalance({\n address,\n currency: currency.toUpperCase() as CurrencyCode,\n chainId,\n })\n .then(async (nativeBalance) => {\n if (nativeBalance.symbol === 'AVAX') {\n // we want to standardise AVAX price across the chains\n const avaxMarketData = await tokenService.getWatchlistDataForToken({\n tokenDetails: {\n symbol: network.networkToken.symbol,\n isNative: true,\n caip2Id: network.caipId ?? '',\n },\n currency: currency.toUpperCase() as VsCurrencyType,\n });\n\n return {\n ...nativeBalance,\n priceInCurrency: avaxMarketData.priceInCurrency,\n marketCap: avaxMarketData.marketCap,\n vol24: avaxMarketData.vol24,\n change24: avaxMarketData.change24,\n };\n }\n\n return nativeBalance;\n }),\n address,\n ),\n );\n }\n\n if (resolvedTokenTypes.includes(TokenType.ERC20)) {\n erc20TokenPromises.push(\n addIdToPromise(\n supportingService.listErc20Balances({\n customTokens: customTokens.filter(isERC20Token),\n customTokensOnly,\n currency: currency.toUpperCase() as CurrencyCode,\n chainId,\n address,\n pageSize: 100,\n }),\n address,\n ),\n );\n }\n\n if (resolvedTokenTypes.includes(TokenType.ERC721) || resolvedTokenTypes.includes(TokenType.ERC1155)) {\n nftTokenPromises.push(\n addIdToPromise(\n supportingService.listNftBalances({\n chainId,\n address,\n }),\n address,\n ),\n );\n }\n });\n const nativeTokenBalances = await settleAllIdPromises(nativeTokenPromises);\n const erc20TokenBalances = await settleAllIdPromises(erc20TokenPromises);\n const nftTokenBalances = await settleAllIdPromises(nftTokenPromises);\n Object.keys(nativeTokenBalances).forEach((address) => {\n const balanceOrError = nativeTokenBalances[address];\n if (!balanceOrError || 'error' in balanceOrError) {\n balances[address] = {\n error: `getNativeBalance failed: ${balanceOrError?.error ?? 'unknown error'}`,\n } as Error;\n return;\n }\n const tokenSymbol = balanceOrError.symbol as string;\n balances[address] = {\n [tokenSymbol]: balanceOrError,\n };\n });\n Object.keys(erc20TokenBalances).forEach((address) => {\n const balancesOrError = erc20TokenBalances[address];\n if (!balancesOrError || ('error' in balancesOrError && typeof balancesOrError.error !== 'string')) {\n balances[address] = {\n ...balances[address],\n error: `listErc20Balances failed: unknown error`,\n };\n } else if ('error' in balancesOrError && typeof balancesOrError.error === 'string') {\n balances[address] = {\n ...balances[address],\n error: `listErc20Balances failed: ${balancesOrError.error}`,\n };\n } else {\n balances[address] = {\n ...balances[address],\n ...balancesOrError,\n };\n }\n });\n Object.keys(nftTokenBalances).forEach((address) => {\n const balancesOrError = nftTokenBalances[address];\n if (!balancesOrError || ('error' in balancesOrError && typeof balancesOrError.error !== 'string')) {\n balances[address] = {\n ...balances[address],\n error: `listNftBalances failed: unknown error`,\n };\n } else if ('error' in balancesOrError && typeof balancesOrError.error === 'string') {\n balances[address] = {\n ...balances[address],\n error: `listNftBalances failed: ${balancesOrError.error}`,\n };\n } else {\n balances[address] = {\n ...balances[address],\n ...balancesOrError,\n };\n }\n });\n } else {\n addresses.forEach((address) => {\n balances[address] = {\n error: 'unsupported network',\n };\n });\n }\n\n return balances;\n};\n","import { CurrencyCode } from '@avalabs/glacier-sdk';\nimport type { BalanceServiceInterface, TokenId } from '../../handlers/get-balances/balance-service-interface';\nimport {\n type ERC20Token,\n type Network,\n type NetworkContractToken,\n type NetworkTokenWithBalance,\n type Storage,\n type Error,\n TokenType,\n type TokenWithBalanceEVM,\n type NftTokenWithBalance,\n} from '@avalabs/vm-module-types';\nimport { addIdToPromise, settleAllIdPromises } from '../../utils/id-promise';\nimport type { VsCurrencyType } from '@avalabs/core-coingecko-sdk';\nimport { TokenUnit } from '@avalabs/core-utils-sdk';\nimport { ethers } from 'ethers';\nimport ERC20 from '@openzeppelin/contracts/build/contracts/ERC20.json';\nimport { getProvider } from '../../utils/get-provider';\nimport { TokenService } from '@internal/utils';\nimport { getTokens } from '../../handlers/get-tokens/get-tokens';\nimport { isERC20Token } from '../../utils/type-utils';\n\nexport class RpcService implements BalanceServiceInterface {\n #network: Network;\n #storage: Storage | undefined;\n #proxyApiUrl: string;\n #customTokens: NetworkContractToken[];\n #fetch?: typeof globalThis.fetch;\n\n constructor({\n network,\n storage,\n proxyApiUrl,\n customTokens,\n fetch,\n }: {\n network: Network;\n storage?: Storage;\n proxyApiUrl: string;\n customTokens: NetworkContractToken[];\n fetch?: typeof globalThis.fetch;\n }) {\n this.#network = network;\n this.#storage = storage;\n this.#proxyApiUrl = proxyApiUrl;\n this.#customTokens = customTokens;\n this.#fetch = fetch;\n }\n\n async isNetworkSupported(): Promise<boolean> {\n return true;\n }\n\n async getNativeBalance({\n chainId,\n address,\n currency,\n }: {\n chainId: number;\n address: string;\n currency: CurrencyCode;\n }): Promise<NetworkTokenWithBalance> {\n const provider = await getProvider({\n chainId,\n chainName: this.#network.chainName,\n rpcUrl: this.#network.rpcUrl,\n multiContractAddress: this.#network.utilityAddresses?.multicall,\n customRpcHeaders: this.#network.customRpcHeaders,\n });\n\n const coingeckoTokenId = this.#network.pricingProviders?.coingecko.nativeTokenId;\n const networkToken = this.#network.networkToken;\n const tokenService = new TokenService({\n storage: this.#storage,\n proxyApiUrl: this.#proxyApiUrl,\n fetch: this.#fetch,\n });\n const simplePriceResponse = coingeckoTokenId\n ? await tokenService.getSimplePrice({\n coinIds: [coingeckoTokenId],\n currencies: [currency] as unknown as VsCurrencyType[],\n })\n : {};\n\n const priceInCurrency = simplePriceResponse?.[coingeckoTokenId ?? '']?.[currency]?.price ?? undefined;\n const marketCap = simplePriceResponse?.[coingeckoTokenId ?? '']?.[currency]?.marketCap ?? undefined;\n const vol24 = simplePriceResponse?.[coingeckoTokenId ?? '']?.[currency]?.vol24 ?? undefined;\n const change24 = simplePriceResponse?.[coingeckoTokenId ?? '']?.[currency]?.change24 ?? undefined;\n\n const balance = await provider.getBalance(address);\n const balanceUnit = new TokenUnit(balance, networkToken.decimals, networkToken.symbol);\n const balanceInCurrency = priceInCurrency !== undefined ? balanceUnit.mul(priceInCurrency) : undefined;\n\n return {\n ...networkToken,\n coingeckoId: coingeckoTokenId ?? '',\n type: TokenType.NATIVE,\n balance,\n balanceDisplayValue: balanceUnit.toDisplay(),\n balanceInCurrency: balanceInCurrency?.toDisplay({ fixedDp: 2, asNumber: true }),\n balanceCurrencyDisplayValue: balanceInCurrency?.toDisplay({ fixedDp: 2 }),\n priceInCurrency,\n marketCap,\n vol24,\n change24,\n };\n }\n\n async listErc20Balances({\n chainId,\n address,\n currency,\n customTokensOnly = false,\n }: {\n chainId: number;\n address: string;\n currency: CurrencyCode;\n pageSize: number;\n pageToken?: string;\n customTokensOnly?: boolean;\n }): Promise<Record<TokenId, TokenWithBalanceEVM | Error>> {\n const provider = await getProvider({\n chainId,\n chainName: this.#network.chainName,\n rpcUrl: this.#network.rpcUrl,\n multiContractAddress: this.#network.utilityAddresses?.multicall,\n customRpcHeaders: this.#network.customRpcHeaders,\n });\n\n const coingeckoPlatformId = this.#network.pricingProviders?.coingecko.assetPlatformId;\n const coingeckoTokenId = this.#network.pricingProviders?.coingecko.nativeTokenId;\n // When only custom tokens are requested, skip fetching the full curated\n // token list to keep the query cheap and targeted.\n const tokens = customTokensOnly\n ? []\n : await getTokens({ chainId: Number(chainId), proxyApiUrl: this.#proxyApiUrl });\n const tokenAddresses = tokens.map((token) => token.address);\n const erc20TokenList = [...tokens, ...this.#customTokens].filter(isERC20Token);\n\n const getTokenWithBalance = async (token: ERC20Token) => {\n const contract = new ethers.Contract(token.address, ERC20.abi, provider);\n const balanceBig: bigint = await contract.balanceOf?.(address);\n const balance = balanceBig || 0n;\n\n return {\n ...token,\n balance,\n };\n };\n\n const tokenBalancePromises = erc20TokenList.map((token) => {\n return addIdToPromise(getTokenWithBalance(token), token.address);\n });\n const tokenBalancesResults = await settleAllIdPromises(tokenBalancePromises);\n const tokenService = new TokenService({\n storage: this.#storage,\n proxyApiUrl: this.#proxyApiUrl,\n fetch: this.#fetch,\n });\n const simplePriceResponse =\n (coingeckoPlatformId &&\n (await tokenService.getPricesByAddresses(\n tokenAddresses,\n coingeckoPlatformId,\n currency as unknown as VsCurrencyType,\n ))) ||\n {};\n\n const tokenIds = Object.keys(tokenBalancesResults);\n const erc20TokenBalances: Record<TokenId, TokenWithBalanceEVM | Error> = {};\n for (let i = 0; i < tokenIds.length; i++) {\n const tokenId = tokenIds[i];\n if (tokenId === undefined) continue;\n const tokenBalance = tokenBalancesResults[tokenId];\n if (tokenBalance === undefined || 'error' in tokenBalance) {\n erc20TokenBalances[tokenId] = {\n error: `rpcService:getTokenWithBalance failed: ${tokenBalance?.error ?? 'unknown error'}`,\n };\n continue;\n }\n\n const priceInCurrency = simplePriceResponse?.[coingeckoTokenId ?? '']?.[currency]?.price ?? undefined;\n const marketCap = simplePriceResponse?.[coingeckoTokenId ?? '']?.[currency]?.marketCap ?? undefined;\n const vol24 = simplePriceResponse?.[coingeckoTokenId ?? '']?.[currency]?.vol24 ?? undefined;\n const change24 = simplePriceResponse?.[coingeckoTokenId ?? '']?.[currency]?.change24 ?? undefined;\n\n const balance = new TokenUnit(tokenBalance.balance, tokenBalance.decimals, tokenBalance.symbol);\n const balanceInCurrency = priceInCurrency !== undefined ? balance.mul(priceInCurrency) : undefined;\n\n erc20TokenBalances[tokenBalance.address.toLowerCase()] = {\n ...tokenBalance,\n type: TokenType.ERC20,\n balance: tokenBalance.balance,\n balanceDisplayValue: balance.toDisplay(),\n balanceInCurrency: balanceInCurrency?.toDisplay({ fixedDp: 2, asNumber: true }),\n balanceCurrencyDisplayValue: balanceInCurrency?.toDisplay({ fixedDp: 2 }),\n priceInCurrency,\n marketCap,\n change24,\n vol24,\n reputation: null,\n };\n }\n return erc20TokenBalances;\n }\n\n async listNftBalances(): Promise<Record<string, NftTokenWithBalance | Error>> {\n // the token list does not maintain a list of NFTs\n return {};\n }\n}\n","import { type Error } from '@avalabs/vm-module-types';\n\ntype Id = string;\nexport type IdPromise<T> =\n | { id: string; status: 'fulfilled'; value: T }\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n | { id: string; status: 'rejected'; reason: any };\n\n/**\n * The addIdToPromise function takes an existing promise and an id string as input and returns a new promise that\n * resolves to an object containing the id, the status of the original promise (either 'fulfilled' or 'rejected'),\n * and the result or error of the original promise.\n *\n * Usage:\n * This function is useful for tracking the status and outcome of multiple promises when used with Promise.allSettled\n *\n * @param promise The original promise that resolves to a value of type T.\n * @param id A unique identifier associated with the promise.\n */\nexport function addIdToPromise<T>(promise: Promise<T>, id: string): Promise<IdPromise<T>> {\n return promise\n .then((value) => ({ id, status: 'fulfilled', value }) as IdPromise<T>)\n .catch((reason) => ({ id, status: 'rejected', reason }) as IdPromise<T>);\n}\n\n/**\n * The settleAllIdPromises function processes an array of promises that return IdPromise objects,\n * resolving all of them and organizing the results into a record.\n *\n * Usage:\n * Use {@link addIdToPromise} to get array of promises\n *\n * @param promises An array of promises that each resolve to an IdPromise<T> object.\n */\nexport async function settleAllIdPromises<T>(promises: Promise<IdPromise<T>>[]): Promise<Record<Id, T | Error>> {\n return await Promise.allSettled(promises).then((results) => {\n return results.reduce(\n (acc, result) => {\n if (result.status === 'fulfilled') {\n const value = result.value;\n if (value.status === 'fulfilled') {\n acc[value.id] = value.value;\n } else {\n acc[value.id] = { error: value.reason };\n }\n }\n return acc;\n },\n {} as Record<Id, T | Error>,\n );\n });\n}\n","import { z } from 'zod';\nimport { TokenType, type NetworkContractToken } from '@avalabs/vm-module-types';\nimport { fetchAndVerify } from '@internal/utils';\n\n// Proxy API emits `contractType` with dashes (e.g. \"ERC-20\"),\n// while the `TokenType` enum uses the dash-less form (e.g. \"ERC20\").\nconst PROXY_API_CONTRACT_TYPE_TO_TOKEN_TYPE: Record<string, TokenType> = {\n 'ERC-20': TokenType.ERC20,\n 'ERC-721': TokenType.ERC721,\n 'ERC-1155': TokenType.ERC1155,\n 'NON-ERC': TokenType.NONERC,\n SPL: TokenType.SPL,\n};\n\nconst ContractTypeSchema = z.string().transform((raw, ctx) => {\n const mapped = PROXY_API_CONTRACT_TYPE_TO_TOKEN_TYPE[raw];\n if (!mapped) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: `Unknown contractType: ${raw}`,\n });\n return z.NEVER;\n }\n return mapped;\n});\n\nconst ProxyApiTokenSchema = z.object({\n address: z.string(),\n chainId: z.number(),\n contractType: ContractTypeSchema,\n decimals: z.number(),\n internalId: z.string().nullish(),\n isNative: z.boolean(),\n logoUri: z.string().nullish(),\n name: z.string(),\n symbol: z.string(),\n caip2Id: z.string().nullish(),\n color: z.string().nullish(),\n});\n\ntype ProxyApiToken = z.infer<typeof ProxyApiTokenSchema>;\n\n// Validate each token independently and drop the ones that don't match the\n// schema, so a single malformed entry doesn't discard the entire list.\nconst ProxyApiTokensSchema = z.array(z.unknown()).transform((tokens): ProxyApiToken[] =>\n tokens.flatMap((token) => {\n const result = ProxyApiTokenSchema.safeParse(token);\n return result.success ? [result.data] : [];\n }),\n);\n\nexport async function getTokens({\n chainId,\n proxyApiUrl,\n}: {\n chainId: number;\n proxyApiUrl: string;\n}): Promise<NetworkContractToken[]> {\n const rawTokens = await fetchAndVerify([`${proxyApiUrl}/tokens?evmChainId=${chainId}`], ProxyApiTokensSchema);\n\n return rawTokens.map((token) => ({ ...token, type: token.contractType }) as NetworkContractToken);\n}\n","/**\n * Asynchronously searches through an array to find the first element that satisfies the provided async callback function.\n *\n * @param {T[]} array - The array to search through.\n * @param {(item: T) => Promise<boolean>} asyncCallback - An async function that takes an element of the array and returns a Promise resolving to a boolean.\n * @returns {Promise<T | undefined>} - A Promise that resolves to the first element in the array that satisfies the asyncCallback function, or undefined if no such element is found.\n *\n * @example\n * ```ts\n * const array = [1, 2, 3, 4];\n * const asyncCallback = async (num) => {\n * return new Promise((resolve) => {\n * setTimeout(() => {\n * resolve(num % 2 === 0);\n * }, 100);\n * });\n * };\n *\n * findAsync(array, asyncCallback).then((result) => {\n * console.log(result); // Output: 2 (the first even number)\n * });\n * ```\n */\nexport async function findAsync<T>(array: T[], asyncCallback: (item: T) => Promise<boolean>): Promise<T | undefined> {\n const promises = array.map(async (item, index) => ({\n index,\n result: await asyncCallback(item),\n }));\n\n const results = await Promise.allSettled(promises);\n\n const found = results\n .filter((item) => item.status === 'fulfilled')\n .map((item) => item as PromiseFulfilledResult<{ index: number; result: boolean }>)\n .find((item) => {\n return item.value.result;\n });\n return found ? array[found.value.index] : undefined;\n}\n","import type { NetworkFees, SuggestGasPriceOptionsResponse } from '@avalabs/vm-module-types';\nimport { getProvider } from '../../utils/get-provider';\nimport { rpcErrors } from '@metamask/rpc-errors';\nimport { TokenUnit } from '@avalabs/core-utils-sdk';\nimport { ChainId } from '@avalabs/core-chains-sdk';\nimport type { JsonRpcBatchInternal } from '@avalabs/core-wallets-sdk';\n\nconst DEFAULT_PRESETS = {\n LOW: 1n,\n MEDIUM: 4n,\n HIGH: 6n,\n};\n\nconst BASE_PRIORITY_FEE_WEI = 500000000n; //0.5 GWei\n\nconst isCChain = (chainId: number) =>\n chainId === ChainId.AVALANCHE_TESTNET_ID || chainId === ChainId.AVALANCHE_MAINNET_ID;\n\nconst POLYGON_MAINNET_CHAIN_ID = 137;\nconst POLYGON_AMOY_CHAIN_ID = 80002;\n\nconst isPolygon = (chainId: number) => chainId === POLYGON_MAINNET_CHAIN_ID || chainId === POLYGON_AMOY_CHAIN_ID;\n\nconst POLYGON_GAS_STATION_URL: Record<number, string> = {\n [POLYGON_MAINNET_CHAIN_ID]: 'https://gasstation.polygon.technology/v2',\n [POLYGON_AMOY_CHAIN_ID]: 'https://gasstation.polygon.technology/amoy',\n};\n\ntype PolygonGasStationResponse = {\n safeLow: { maxPriorityFee: number; maxFee: number };\n standard: { maxPriorityFee: number; maxFee: number };\n fast: { maxPriorityFee: number; maxFee: number };\n estimatedBaseFee: number;\n};\n\nfunction gweiToWei(gwei: number): bigint {\n return BigInt(Math.round(gwei * 1e9));\n}\n\nasync function getPolygonGasStationFees(chainId: number): Promise<NetworkFees> {\n const url = POLYGON_GAS_STATION_URL[chainId];\n if (!url) throw new Error(`No gas station URL for Polygon chain ${chainId}`);\n\n const response = await fetch(url);\n if (!response.ok) throw new Error(`Polygon Gas Station returned ${response.status}`);\n\n const data: PolygonGasStationResponse = await response.json();\n\n return {\n baseFee: gweiToWei(data.estimatedBaseFee),\n low: {\n maxFeePerGas: gweiToWei(data.safeLow.maxFee),\n maxPriorityFeePerGas: gweiToWei(data.safeLow.maxPriorityFee),\n },\n medium: {\n maxFeePerGas: gweiToWei(data.standard.maxFee),\n maxPriorityFeePerGas: gweiToWei(data.standard.maxPriorityFee),\n },\n high: {\n maxFeePerGas: gweiToWei(data.fast.maxFee),\n maxPriorityFeePerGas: gweiToWei(data.fast.maxPriorityFee),\n },\n isFixedFee: false,\n displayDecimals: 9,\n };\n}\n\n/**\n * Returns {@link NetworkFees} based on {@link DEFAULT_PRESETS} multipliers.\n * @throws Error if provider does not support eip-1559\n */\nexport async function getNetworkFee({\n chainId,\n chainName,\n rpcUrl,\n multiContractAddress,\n caipId,\n proxyApiUrl,\n customRpcHeaders,\n}: {\n chainId: number;\n chainName: string;\n rpcUrl: string;\n proxyApiUrl?: string;\n multiContractAddress?: string;\n caipId?: string;\n customRpcHeaders?: Record<string, string>;\n}): Promise<NetworkFees> {\n const provider = await getProvider({\n chainId,\n chainName,\n rpcUrl,\n multiContractAddress,\n customRpcHeaders,\n });\n\n if (!proxyApiUrl) {\n throw rpcErrors.internal('Proxy API URL is needed');\n }\n\n if (isCChain(chainId)) {\n try {\n const suggestedFees = await suggestPriceOptions(provider);\n\n return {\n ...suggestedFees,\n baseFee: suggestedFees.medium.maxFeePerGas,\n displayDecimals: 9,\n isFixedFee: false,\n };\n } catch (err) {\n console.error('eth_suggestPriceOptions call failed, falling back to legacy fee fetching');\n }\n }\n\n if (isPolygon(chainId)) {\n try {\n return await getPolygonGasStationFees(chainId);\n } catch (err) {\n console.error('Polygon Gas Station call failed, falling back to generic fee fetching');\n }\n }\n\n const lastBlock = await provider.getBlock('latest', false);\n\n if (!lastBlock) {\n throw rpcErrors.internal('There is no block');\n }\n const baseFeePerGas = lastBlock.baseFeePerGas;\n\n if (!baseFeePerGas) {\n throw rpcErrors.internal('Pre-EIP-1559 networks are not supported');\n }\n\n const gasMultiplier = await getGasMultiplier(proxyApiUrl, caipId);\n\n const multiplier = new TokenUnit(gasMultiplier, 0, '');\n\n const baseFee = new TokenUnit(baseFeePerGas, 0, '');\n const maxPriorityFeePerGas = BigInt('1000000000');\n\n const maxFee = baseFee.mul(multiplier).add(maxPriorityFeePerGas).toSubUnit();\n\n const lowMaxTip = BASE_PRIORITY_FEE_WEI * DEFAULT_PRESETS.LOW;\n const mediumMaxTip = BASE_PRIORITY_FEE_WEI * DEFAULT_PRESETS.MEDIUM;\n const highMaxTip = BASE_PRIORITY_FEE_WEI * DEFAULT_PRESETS.HIGH;\n return {\n baseFee: maxFee,\n low: {\n maxFeePerGas: maxFee + lowMaxTip,\n maxPriorityFeePerGas: lowMaxTip,\n },\n medium: {\n maxFeePerGas: maxFee + mediumMaxTip,\n maxPriorityFeePerGas: mediumMaxTip,\n },\n high: {\n maxFeePerGas: maxFee + highMaxTip,\n maxPriorityFeePerGas: highMaxTip,\n },\n isFixedFee: false,\n displayDecimals: 9,\n };\n}\n\nasync function suggestPriceOptions(\n provider: JsonRpcBatchInternal,\n): Promise<Pick<NetworkFees, 'low' | 'medium' | 'high'>> {\n const options: SuggestGasPriceOptionsResponse = await provider.send('eth_suggestPriceOptions', []);\n\n return {\n low: {\n maxFeePerGas: BigInt(options.slow.maxFeePerGas),\n maxPriorityFeePerGas: BigInt(options.slow.maxPriorityFeePerGas),\n },\n medium: {\n maxFeePerGas: BigInt(options.normal.maxFeePerGas),\n maxPriorityFeePerGas: BigInt(options.normal.maxPriorityFeePerGas),\n },\n high: {\n maxFeePerGas: BigInt(options.fast.maxFeePerGas),\n maxPriorityFeePerGas: BigInt(options.fast.maxPriorityFeePerGas),\n },\n };\n}\n\nasync function getGasMultiplier(proxyApiUrl: string, caipId?: string) {\n const defaultMultiplier = 1.5;\n if (!caipId) {\n return defaultMultiplier;\n }\n\n try {\n const respond = await fetch(`${proxyApiUrl}/gas/multiplier`);\n\n if (!respond.ok) {\n throw new Error(respond.statusText);\n }\n const multipliers = await respond.json();\n\n return multipliers[caipId] ?? multipliers.default;\n } catch (e) {\n return defaultMultiplier;\n }\n}\n","import {\n TokenType,\n TransactionType,\n type NetworkToken,\n type Transaction,\n type TxToken,\n} from '@avalabs/vm-module-types';\nimport { TokenUnit } from '@avalabs/core-utils-sdk';\nimport { getExplorerAddressByNetwork } from '../../utils/get-explorer-address-by-network';\nimport { convertTransactionType } from '../evm-transaction-converter/get-tx-type';\nimport type {\n MoralisCategory,\n MoralisTransaction,\n MoralisErc20Transfer,\n MoralisNativeTransfer,\n MoralisNftTransfer,\n} from './moralis-types';\n\ntype ConvertMoralisTransactionParams = {\n tx: MoralisTransaction;\n networkToken: NetworkToken;\n explorerUrl: string;\n chainId: number;\n address: string;\n};\n\nexport function convertMoralisTransaction({\n tx,\n networkToken,\n explorerUrl,\n chainId,\n address,\n}: ConvertMoralisTransactionParams): Transaction {\n const isSender = tx.from_address.toLowerCase() === address.toLowerCase();\n const timestamp = new Date(tx.block_timestamp).getTime();\n let txType = getMoralisTransactionType(tx.category);\n const isContractCall = !NON_CONTRACT_CALL_CATEGORIES.has(tx.category);\n\n const tokens = buildTokens(tx, networkToken, address);\n const explorerLink = getExplorerAddressByNetwork(explorerUrl, tx.hash);\n\n txType = convertTransactionType({\n txType,\n isSender,\n walletAddress: address,\n tokens,\n });\n\n return {\n isContractCall,\n isIncoming: !isSender,\n isOutgoing: isSender,\n isSender,\n timestamp,\n hash: tx.hash,\n from: tx.from_address,\n to: tx.to_address ?? '',\n tokens,\n gasPrice: tx.gas_price,\n gasUsed: tx.receipt_gas_used,\n chainId: chainId.toString(),\n txType,\n method: tx.method_label ?? undefined,\n explorerLink,\n };\n}\n\nconst NON_CONTRACT_CALL_CATEGORIES = new Set<MoralisCategory>(['send', 'receive', 'token send', 'token receive']);\n\nconst CATEGORY_TO_TX_TYPE: Record<MoralisCategory, TransactionType> = {\n send: TransactionType.SEND,\n receive: TransactionType.RECEIVE,\n 'token send': TransactionType.SEND,\n 'token receive': TransactionType.RECEIVE,\n 'nft send': TransactionType.NFT_SEND,\n 'nft receive': TransactionType.NFT_RECEIVE,\n 'token swap': TransactionType.SWAP,\n 'nft purchase': TransactionType.NFT_BUY,\n 'nft sale': TransactionType.NFT_SEND,\n airdrop: TransactionType.AIRDROP,\n mint: TransactionType.NFT_BUY,\n burn: TransactionType.UNKNOWN,\n deposit: TransactionType.UNKNOWN,\n withdraw: TransactionType.UNKNOWN,\n borrow: TransactionType.UNKNOWN,\n 'contract interaction': TransactionType.UNKNOWN,\n};\n\nfunction getMoralisTransactionType(category: MoralisCategory): TransactionType {\n return CATEGORY_TO_TX_TYPE[category] ?? TransactionType.UNKNOWN;\n}\n\nfunction getTransferAddress(address: string | null | undefined): { address: string } | undefined {\n if (address == null || address === '') {\n return undefined;\n }\n return { address };\n}\n\nfunction trimOrEmpty(value: string | null | undefined): string {\n return value?.trim() ?? '';\n}\n\nfunction shortenHexAddress(address: string): string {\n const normalized = address.trim().toLowerCase();\n if (!normalized.startsWith('0x') || normalized.length < 12) {\n return address.trim();\n }\n return `${normalized.slice(0, 6)}…${normalized.slice(-4)}`;\n}\n\nfunction getErc20DisplaySymbol(transfer: MoralisErc20Transfer): string {\n const fromSymbol = trimOrEmpty(transfer.token_symbol);\n if (fromSymbol !== '') {\n return fromSymbol;\n }\n const fromName = trimOrEmpty(transfer.token_name);\n if (fromName !== '') {\n return fromName;\n }\n return shortenHexAddress(transfer.address);\n}\n\nfunction buildTokens(tx: MoralisTransaction, networkToken: NetworkToken, address: string): TxToken[] {\n const tokens: TxToken[] = [];\n const nativeTokens = tx.native_transfers.map((transfer) => buildNativeToken(transfer, networkToken));\n const erc20Tokens = tx.erc20_transfers.map((transfer) => buildErc20Token(transfer));\n\n tokens.push(...nativeTokens, ...erc20Tokens);\n\n for (const transfer of tx.nft_transfers) {\n tokens.push(buildNftToken(transfer));\n }\n\n if (tokens.length === 0) {\n tokens.push(buildFallbackNativeToken(tx, networkToken, address));\n }\n\n return tokens;\n}\n\nfunction buildNativeToken(transfer: MoralisNativeTransfer, networkToken: NetworkToken): TxToken {\n const displaySymbol = trimOrEmpty(transfer.token_symbol) || networkToken.symbol;\n const amount = new TokenUnit(transfer.value, networkToken.decimals, displaySymbol);\n\n return {\n decimal: networkToken.decimals.toString(),\n name: networkToken.name,\n symbol: displaySymbol,\n amount: amount.toDisplay(),\n from: getTransferAddress(transfer.from_address),\n to: getTransferAddress(transfer.to_address),\n type: TokenType.NATIVE,\n };\n}\n\nfunction buildErc20Token(transfer: MoralisErc20Transfer): TxToken {\n const decimals = Number(transfer.token_decimals);\n const displaySymbol = getErc20DisplaySymbol(transfer);\n const amount = new TokenUnit(transfer.value, decimals, displaySymbol);\n const displayName = trimOrEmpty(transfer.token_name) || displaySymbol;\n\n return {\n decimal: transfer.token_decimals,\n name: displayName,\n symbol: displaySymbol,\n amount: amount.toDisplay(),\n from: getTransferAddress(transfer.from_address),\n to: getTransferAddress(transfer.to_address),\n type: TokenType.ERC20,\n address: transfer.address,\n };\n}\n\nfunction buildNftToken(transfer: MoralisNftTransfer): TxToken {\n const tokenType = transfer.contract_type === 'ERC1155' ? TokenType.ERC1155 : TokenType.ERC721;\n\n return {\n name: '',\n symbol: '',\n amount: transfer.amount,\n collectableTokenId: transfer.token_id,\n from: getTransferAddress(transfer.from_address),\n to: getTransferAddress(transfer.to_address),\n type: tokenType,\n address: transfer.token_address,\n };\n}\n\nfunction buildFallbackNativeToken(tx: MoralisTransaction, networkToken: NetworkToken, address: string): TxToken {\n const amount = new TokenUnit(tx.value, networkToken.decimals, networkToken.symbol);\n const isSender = tx.from_address.toLowerCase() === address.toLowerCase();\n const displayAmount = isSender ? `-${amount.toDisplay()}` : amount.toDisplay();\n\n return {\n decimal: networkToken.decimals.toString(),\n name: networkToken.name,\n symbol: networkToken.symbol,\n amount: displayAmount,\n from: getTransferAddress(tx.from_address),\n to: getTransferAddress(tx.to_address),\n type: TokenType.NATIVE,\n };\n}\n","import type { TransactionDetails } from '@avalabs/glacier-sdk';\nimport { TokenType, TransactionType, type TxToken } from '@avalabs/vm-module-types';\nimport startCase from 'lodash.startcase';\n\nfunction isNftTokenType(type: TokenType): boolean {\n return type === TokenType.ERC721 || type === TokenType.ERC1155;\n}\n\n/**\n * After a provisional {@link TransactionType} (e.g. Moralis category or Glacier heuristics below),\n * returns the same type or promotes generic classifications to `NFT_SEND` / `NFT_RECEIVE`\n * when `tokens` shows the wallet sent or received an ERC-721/1155 (often not `tokens[0]` because rows\n * are ordered native → ERC-20 → NFTs). Includes {@link TransactionType.AIRDROP} because Moralis labels\n * many bulk ERC-721/1155 mint/receive spam txs as `airdrop`; without promotion the UI falls back to\n * fungible `mainToken` (“1 received”). Exported for Moralis, which does not use {@link getTxType}.\n */\nexport function convertTransactionType(params: {\n txType: TransactionType;\n isSender: boolean;\n walletAddress: string;\n tokens: TxToken[];\n}): TransactionType {\n const { txType, isSender, walletAddress, tokens } = params;\n if (tokens.length === 0) {\n return txType;\n }\n\n const normalizedWallet = walletAddress.toLowerCase();\n const userReceivedNft = tokens.some(\n (token) => isNftTokenType(token.type) && token.to?.address?.toLowerCase() === normalizedWallet,\n );\n const userSentNft = tokens.some(\n (token) => isNftTokenType(token.type) && token.from?.address?.toLowerCase() === normalizedWallet,\n );\n\n const receiveLike =\n txType === TransactionType.RECEIVE ||\n txType === TransactionType.UNKNOWN ||\n txType === TransactionType.TRANSFER ||\n txType === TransactionType.AIRDROP;\n const sendLike =\n txType === TransactionType.SEND ||\n txType === TransactionType.UNKNOWN ||\n txType === TransactionType.TRANSFER ||\n txType === TransactionType.AIRDROP;\n\n if (!isSender && userReceivedNft && receiveLike) {\n return TransactionType.NFT_RECEIVE;\n }\n if (isSender && userSentNft && sendLike) {\n return TransactionType.NFT_SEND;\n }\n return txType;\n}\n\n/**\n * Glacier history: classify from decoded method + transfer lists, then apply {@link convertTransactionType}\n * so NFT legs are not missed when fungible tokens appear first in `tokens`.\n */\nexport const getTxType = (\n { nativeTransaction, erc20Transfers, erc721Transfers, erc1155Transfers }: TransactionDetails,\n userAddress: string,\n tokens: TxToken[],\n): TransactionType => {\n const nativeOnly = !erc20Transfers && !erc721Transfers && !erc1155Transfers;\n const method = parseRawMethod(nativeTransaction.method?.methodName);\n\n const address = userAddress.toLowerCase();\n\n const isSwap = method.toLowerCase().includes('swap');\n const isNativeSend = nativeOnly && nativeTransaction.from.address.toLowerCase() === address;\n const isNativeReceive = nativeOnly && nativeTransaction.to.address.toLowerCase() === address;\n const isNFTPurchase = method === 'Market Buy Orders With Eth' || method === 'Buy NFT';\n const isApprove = method === 'Approve';\n const isTransfer = method.toLowerCase().includes('transfer');\n const isAirdrop = method.toLowerCase().includes('airdrop');\n const isUnwrap = method.toLowerCase().includes('unwrap');\n const isFillOrder = method === 'Fill Order';\n\n let provisionalTxType: TransactionType;\n if (isSwap) {\n provisionalTxType = TransactionType.SWAP;\n } else if (isNativeSend) {\n provisionalTxType = TransactionType.SEND;\n } else if (isNativeReceive) {\n provisionalTxType = TransactionType.RECEIVE;\n } else if (isNFTPurchase) {\n provisionalTxType = TransactionType.NFT_BUY;\n } else if (isApprove) {\n provisionalTxType = TransactionType.APPROVE;\n } else if (isTransfer) {\n provisionalTxType = TransactionType.TRANSFER;\n } else if (isAirdrop) {\n provisionalTxType = TransactionType.AIRDROP;\n } else if (isUnwrap) {\n provisionalTxType = TransactionType.UNWRAP;\n } else if (isFillOrder) {\n provisionalTxType = TransactionType.FILL_ORDER;\n } else {\n provisionalTxType = TransactionType.UNKNOWN;\n }\n\n const isTxSigner = nativeTransaction.from.address.toLowerCase() === address;\n return convertTransactionType({\n txType: provisionalTxType,\n isSender: isTxSigner,\n walletAddress: userAddress,\n tokens,\n });\n};\n\nconst parseRawMethod = (method = ''): string => {\n if (method.includes('(')) {\n return startCase(method.split('(', 1)[0]);\n }\n return method;\n};\n","import type { NetworkToken, TransactionHistoryResponse } from '@avalabs/vm-module-types';\nimport { convertMoralisTransaction } from './convert-moralis-transaction';\nimport type { MoralisWalletHistoryResponse } from './moralis-types';\n\nconst MORALIS_PROXY_BASE_URL = 'https://proxy-api.avax.network/proxy/moralis-evm';\n\ntype GetTransactionsFromMoralisParams = {\n chainId: number;\n networkToken: NetworkToken;\n explorerUrl: string;\n address: string;\n nextPageToken?: string;\n offset?: number;\n};\n\nexport async function getTransactionsFromMoralis({\n chainId,\n networkToken,\n explorerUrl,\n address,\n nextPageToken,\n offset,\n}: GetTransactionsFromMoralisParams): Promise<TransactionHistoryResponse> {\n try {\n const chainHex = `0x${chainId.toString(16)}`;\n const params = new URLSearchParams({\n chain: chainHex,\n limit: (offset ?? 25).toString(),\n });\n\n if (nextPageToken) {\n params.set('cursor', nextPageToken);\n }\n\n const url = `${MORALIS_PROXY_BASE_URL}/wallets/${address}/history?${params.toString()}`;\n const response = await fetch(url);\n\n if (!response.ok) {\n return { transactions: [], nextPageToken: '' };\n }\n\n const data = (await response.json()) as MoralisWalletHistoryResponse;\n\n if (!Array.isArray(data.result)) {\n return { transactions: [], nextPageToken: '' };\n }\n\n const transactions = data.result\n .filter((tx) => tx.receipt_status === '1')\n .map((tx) =>\n convertMoralisTransaction({\n tx,\n networkToken,\n explorerUrl,\n chainId,\n address,\n }),\n );\n\n return {\n transactions,\n nextPageToken: data.cursor ?? '',\n };\n } catch {\n return { transactions: [], nextPageToken: '' };\n }\n}\n","const MORALIS_SUPPORTED_CHAIN_IDS = new Set([\n 1, // Ethereum\n 4, // Ethereum test — Rinkeby\n 5, // Ethereum test — Goerli\n 11155111, // Ethereum test — Sepolia\n 8453, // Base\n 42161, // Arbitrum One\n 10, // Optimism\n]);\n\nexport function isMoralisSupportedChain(chainId: number): boolean {\n return MORALIS_SUPPORTED_CHAIN_IDS.has(chainId);\n}\n","import type { TransactionDetails } from '@avalabs/glacier-sdk';\nimport { TransactionType } from '@avalabs/vm-module-types';\n\nexport const getSenderInfo = (\n txType: TransactionType,\n { nativeTransaction, erc20Transfers, erc721Transfers }: TransactionDetails,\n address: string,\n): { isOutgoing: boolean; isIncoming: boolean; isSender: boolean; from: string; to: string } => {\n const isTransfer = txType === TransactionType.TRANSFER;\n // Glacier: SEND/RECEIVE are already “direction known from tx type” (historically native-only).\n // NFT_SEND/NFT_RECEIVE are the same idea for one-sided NFT transfers — not “native”.\n const isOutgoingByTxType = txType === TransactionType.SEND || txType === TransactionType.NFT_SEND;\n const isIncomingByTxType = txType === TransactionType.RECEIVE || txType === TransactionType.NFT_RECEIVE;\n let from = nativeTransaction?.from?.address;\n let to = nativeTransaction?.to?.address;\n\n // Until multi tokens transaction is supported in UI, using from and to of the only token is helpful for UI\n if (isTransfer && erc20Transfers && erc20Transfers[0]) {\n from = erc20Transfers[0].from.address;\n to = erc20Transfers[0].to.address;\n }\n\n if (isTransfer && erc721Transfers && erc721Transfers[0]) {\n from = erc721Transfers[0].from.address;\n to = erc721Transfers[0].to.address;\n }\n\n const isOutgoing = isOutgoingByTxType || (isTransfer && from.toLowerCase() === address.toLowerCase());\n const isIncoming = isIncomingByTxType || (isTransfer && to.toLowerCase() === address.toLowerCase());\n\n const isSender = from === address;\n\n return {\n isOutgoing,\n isIncoming,\n isSender,\n from,\n to,\n };\n};\n","import type { TransactionDetails } from '@avalabs/glacier-sdk';\nimport { TokenUnit } from '@avalabs/core-utils-sdk';\nimport type { TxToken, NetworkToken } from '@avalabs/vm-module-types';\nimport { TokenType } from '@avalabs/vm-module-types';\nimport { resolve } from '../../utils/resolve';\nimport { getNftMetadata } from './get-nft-metadata';\nimport { getSmallImageForNFT } from '../../utils/get-small-image-for-nft';\nimport { ipfsResolverWithFallback } from '../../utils/ipfs-resolver-with-fallback';\n\nexport const getTokens = async (\n { nativeTransaction, erc20Transfers, erc721Transfers, erc1155Transfers }: TransactionDetails,\n networkToken: NetworkToken,\n): Promise<TxToken[]> => {\n const result: TxToken[] = [];\n\n if (nativeTransaction.value !== '0') {\n const decimal = networkToken.decimals;\n const amount = new TokenUnit(nativeTransaction.value, networkToken.decimals, networkToken.symbol);\n const amountDisplayValue = amount.toDisplay();\n result.push({\n decimal: decimal.toString(),\n name: networkToken.name,\n symbol: networkToken.symbol,\n amount: amountDisplayValue,\n from: nativeTransaction.from,\n to: nativeTransaction.to,\n type: TokenType.NATIVE,\n });\n }\n\n erc20Transfers?.forEach((erc20Transfer) => {\n const decimals = erc20Transfer.erc20Token.decimals;\n const amount = new TokenUnit(erc20Transfer.value, decimals, erc20Transfer.erc20Token.symbol);\n const amountDisplayValue = amount.toDisplay();\n\n result.push({\n decimal: decimals.toString(),\n address: erc20Transfer.erc20Token.address,\n name: erc20Transfer.erc20Token.name,\n symbol: erc20Transfer.erc20Token.symbol,\n amount: amountDisplayValue,\n from: erc20Transfer.from,\n to: erc20Transfer.to,\n imageUri: erc20Transfer.erc20Token.logoUri,\n type: TokenType.ERC20,\n });\n });\n\n if (erc721Transfers) {\n await Promise.allSettled(\n erc721Transfers.map(async (erc721Transfer) => {\n const token = erc721Transfer.erc721Token;\n const imageUri = await getImageUri(token.tokenUri, token.metadata.imageUri);\n\n result.push({\n name: erc721Transfer.erc721Token.name,\n symbol: erc721Transfer.erc721Token.symbol,\n address: erc721Transfer.erc721Token.address,\n amount: '1',\n imageUri,\n from: erc721Transfer.from,\n to: erc721Transfer.to,\n collectableTokenId: erc721Transfer.erc721Token.tokenId,\n type: TokenType.ERC721,\n });\n }),\n );\n }\n\n if (erc1155Transfers) {\n await Promise.allSettled(\n erc1155Transfers.map(async (erc1155Transfer) => {\n const token = erc1155Transfer.erc1155Token;\n const imageUri = await getImageUri(token.tokenUri, token.metadata.imageUri);\n\n result.push({\n name: erc1155Transfer.erc1155Token.metadata.name ?? '',\n symbol: erc1155Transfer.erc1155Token.metadata.symbol ?? '',\n address: erc1155Transfer.erc1155Token.address,\n amount: erc1155Transfer.value,\n imageUri,\n from: erc1155Transfer.from,\n to: erc1155Transfer.to,\n collectableTokenId: erc1155Transfer.erc1155Token.tokenId,\n type: TokenType.ERC1155,\n });\n }),\n );\n }\n\n return result;\n};\n\nconst getImageUri = async (tokenUri: string, imageUri?: string): Promise<string> => {\n if (imageUri) {\n if (imageUri.startsWith('ipfs://')) {\n return ipfsResolverWithFallback(imageUri);\n } else {\n return imageUri;\n }\n } else {\n const [metadata, error] = await resolve(getNftMetadata(tokenUri));\n if (error) {\n return '';\n } else {\n return metadata.image ? getSmallImageForNFT(metadata.image) : '';\n }\n }\n};\n","export async function resolve<T = unknown>(promise: Promise<T>) {\n try {\n return promise.then((res) => [res, null]).catch((err) => [null, err]);\n } catch (err) {\n return Promise.resolve([null, err]);\n }\n}\n","import { ipfsResolver } from '@avalabs/core-utils-sdk';\n\nexport const CLOUDFLARE_IPFS_URL = 'https://ipfs.io';\n\nexport function ipfsResolverWithFallback(\n sourceUrl: string | undefined,\n desiredGatewayPrefix: string = CLOUDFLARE_IPFS_URL,\n) {\n if (!sourceUrl) {\n return '';\n }\n\n try {\n return ipfsResolver(sourceUrl, desiredGatewayPrefix);\n } catch {\n return sourceUrl;\n }\n}\n","import { ipfsResolverWithFallback } from '../../utils/ipfs-resolver-with-fallback';\n\ninterface NftMetadata {\n attributes?: string;\n name?: string;\n image?: string;\n description?: string;\n}\n\nasync function fetchWithTimeout(uri: string, timeout = 5000) {\n const controller = new AbortController();\n setTimeout(() => controller.abort(), timeout);\n\n return fetch(uri, { signal: controller.signal });\n}\n\nexport async function getNftMetadata(tokenUri: string) {\n let data: NftMetadata = {};\n if (!tokenUri) {\n return {};\n } else if (tokenUri.startsWith('data:application/json;base64,')) {\n const value = tokenUri.substring(29);\n try {\n const json = Buffer.from(value, 'base64').toString();\n data = JSON.parse(json);\n } catch {\n data = {};\n }\n } else {\n data = await fetchWithTimeout(ipfsResolverWithFallback(tokenUri))\n .then((r) => r.json())\n .catch(() => ({}));\n }\n return data;\n}\n","import { ipfsResolverWithFallback } from './ipfs-resolver-with-fallback';\n\nconst COVALENT_IMG_SIZER = 'https://image-proxy.svc.prod.covalenthq.com/cdn-cgi/image';\n\n/**\n * Covalent has an on the fly image resizer, it resolves image urls then resizes the image.\n *\n * This allows us to request smaller images depending on the UI needs\n *\n * @param imgUrl the url of the image to convert to size\n * @returns The url to the image which is sized at the time of request\n */\nexport function getSmallImageForNFT(imgUrl: string, imageSize: '256' | '512' | '1024' = '256') {\n const url = ipfsResolverWithFallback(imgUrl);\n return `${COVALENT_IMG_SIZER}/width=${imageSize},fit/${url}`;\n}\n","import type { Transaction, NetworkToken } from '@avalabs/vm-module-types';\nimport { getTxType } from './get-tx-type';\nimport { getSenderInfo } from './get-sender-info';\nimport { getTokens } from './get-tokens';\nimport { getExplorerAddressByNetwork } from '../../utils/get-explorer-address-by-network';\nimport type { TransactionDetails } from '@avalabs/glacier-sdk';\nimport { NonContractCallTypes } from '../../../../types';\n\ntype ConvertTransactionParams = {\n transactions: TransactionDetails;\n explorerUrl: string;\n networkToken: NetworkToken;\n chainId: number;\n address: string;\n};\n\nexport const convertTransaction = async ({\n transactions,\n explorerUrl,\n networkToken,\n chainId,\n address,\n}: ConvertTransactionParams): Promise<Transaction> => {\n const tokens = await getTokens(transactions, networkToken);\n const txType = getTxType(transactions, address, tokens);\n const { isOutgoing, isIncoming, isSender, from, to } = getSenderInfo(txType, transactions, address);\n const { blockTimestamp, txHash: hash, gasPrice, gasUsed } = transactions.nativeTransaction;\n const explorerLink = getExplorerAddressByNetwork(explorerUrl, hash);\n const isContractCall = !NonContractCallTypes.includes(txType);\n\n return {\n isContractCall,\n isIncoming,\n isOutgoing,\n isSender,\n timestamp: blockTimestamp * 1000, // s to ms\n hash,\n from,\n to,\n tokens,\n gasPrice,\n gasUsed,\n chainId: chainId.toString(),\n txType,\n explorerLink,\n };\n};\n","import type { NetworkToken, TransactionHistoryResponse } from '@avalabs/vm-module-types';\nimport { convertTransaction } from './convert-transaction';\nimport type { EvmGlacierService } from '../../../../services/glacier-service/glacier-service';\n\nexport const getTransactionsFromGlacier = async ({\n chainId,\n explorerUrl,\n networkToken,\n address,\n nextPageToken,\n offset,\n glacierService,\n}: {\n chainId: number;\n explorerUrl: string;\n networkToken: NetworkToken;\n address: string;\n nextPageToken?: string;\n offset?: number;\n glacierService: EvmGlacierService;\n}): Promise<TransactionHistoryResponse> => {\n try {\n const response = await glacierService.listTransactions({\n chainId: chainId.toString(),\n address,\n pageToken: nextPageToken,\n pageSize: offset,\n });\n\n const convertedTxs = await Promise.all(\n response.transactions\n .filter(\n // Currently not showing failed tx\n (tranasaction) => tranasaction.nativeTransaction.txStatus === '1',\n )\n .map((transactions) =>\n convertTransaction({\n transactions,\n explorerUrl,\n networkToken,\n chainId,\n address,\n }).then((tx) => tx),\n ),\n );\n\n const transactions = convertedTxs.filter(\n // Filtering txs with 0 value since there is no change in balance\n (transaction) => transaction.tokens.find((token) => Number(token.amount) !== 0),\n );\n\n return {\n transactions,\n nextPageToken: response.nextPageToken,\n };\n } catch {\n return {\n transactions: [],\n nextPageToken: '',\n };\n }\n};\n","import { TokenUnit } from '@avalabs/core-utils-sdk';\nimport {\n TokenType,\n TransactionType,\n type NetworkToken,\n type Transaction,\n type TransactionHistoryResponse,\n type TxToken,\n} from '@avalabs/vm-module-types';\nimport type {\n HyperEvmErc20Transfer,\n HyperEvmEtherscanClient,\n HyperEvmInternalTransaction,\n HyperEvmNormalTransaction,\n} from '../../../../services/hyperevm-etherscan-client/hyperevm-etherscan-client';\nimport { getExplorerAddressByNetwork } from '../../utils/get-explorer-address-by-network';\n\ntype Aggregate = {\n hash: string;\n timestamp: number;\n from: string;\n to: string;\n gasPrice?: string;\n gasUsed: string;\n isContractCall: boolean;\n tokens: TxToken[];\n};\n\nexport async function getTransactionsFromHyperEvm({\n client,\n chainId,\n networkToken,\n explorerUrl,\n address,\n nextPageToken,\n offset = 25,\n}: {\n client: Pick<HyperEvmEtherscanClient, 'listNormalTransactions' | 'listErc20Transfers' | 'listInternalTransactions'>;\n chainId: number;\n networkToken: NetworkToken;\n explorerUrl: string;\n address: string;\n nextPageToken?: string;\n offset?: number;\n}): Promise<TransactionHistoryResponse> {\n try {\n const page = getPage(nextPageToken);\n const [normal, erc20, internal] = await Promise.all([\n client.listNormalTransactions(address, { page, offset }),\n client.listErc20Transfers(address, { page, offset }),\n client.listInternalTransactions(address, { page, offset }),\n ]);\n const aggregates = new Map<string, Aggregate>();\n\n for (const transaction of normal) {\n if (transaction.isError !== '0' || transaction.txreceipt_status !== '1') continue;\n const aggregate = getAggregate(aggregates, transaction);\n const token = nativeToken(transaction, networkToken);\n if (token) aggregate.tokens.push(token);\n }\n for (const transfer of erc20) {\n const aggregate = getAggregate(aggregates, transfer);\n aggregate.tokens.push(erc20Token(transfer));\n }\n for (const transaction of internal) {\n if (transaction.isError !== '0') continue;\n const aggregate = getAggregate(aggregates, transaction);\n const token = internalToken(transaction, networkToken);\n if (token) aggregate.tokens.push(token);\n }\n\n const transactions = Array.from(aggregates.values())\n .map((aggregate) => toTransaction(aggregate, address, explorerUrl, networkToken, chainId))\n .sort((a, b) => b.timestamp - a.timestamp);\n const hasNextPage = [normal, erc20, internal].some((list) => list.length === offset);\n\n return { transactions, nextPageToken: hasNextPage ? String(page + 1) : '' };\n } catch {\n return { transactions: [], nextPageToken: '' };\n }\n}\n\nfunction getPage(nextPageToken?: string): number {\n const page = Number(nextPageToken);\n return Number.isSafeInteger(page) && page > 0 ? page : 1;\n}\n\nfunction getAggregate(\n aggregates: Map<string, Aggregate>,\n transaction: HyperEvmNormalTransaction | HyperEvmErc20Transfer | HyperEvmInternalTransaction,\n): Aggregate {\n const existing = aggregates.get(transaction.hash);\n if (existing) return existing;\n\n const aggregate: Aggregate = {\n hash: transaction.hash,\n timestamp: Number(transaction.timeStamp) * 1000,\n from: transaction.from,\n to: transaction.to,\n gasPrice: 'gasPrice' in transaction ? transaction.gasPrice : undefined,\n gasUsed: transaction.gasUsed,\n isContractCall: 'input' in transaction && transaction.input !== '0x',\n tokens: [],\n };\n aggregates.set(transaction.hash, aggregate);\n return aggregate;\n}\n\nfunction nativeToken(transaction: HyperEvmNormalTransaction, networkToken: NetworkToken): TxToken | undefined {\n if (transaction.value === '0') return undefined;\n return {\n decimal: String(networkToken.decimals),\n name: networkToken.name,\n symbol: networkToken.symbol,\n amount: new TokenUnit(transaction.value, networkToken.decimals, networkToken.symbol).toDisplay(),\n from: { address: transaction.from },\n to: { address: transaction.to },\n type: TokenType.NATIVE,\n };\n}\n\nfunction internalToken(transaction: HyperEvmInternalTransaction, networkToken: NetworkToken): TxToken | undefined {\n if (transaction.value === '0') return undefined;\n return {\n decimal: String(networkToken.decimals),\n name: networkToken.name,\n symbol: networkToken.symbol,\n amount: new TokenUnit(transaction.value, networkToken.decimals, networkToken.symbol).toDisplay(),\n from: { address: transaction.from },\n to: { address: transaction.to },\n type: TokenType.NATIVE,\n };\n}\n\nfunction erc20Token(transfer: HyperEvmErc20Transfer): TxToken {\n return {\n decimal: transfer.tokenDecimal,\n name: transfer.tokenName,\n symbol: transfer.tokenSymbol,\n amount: new TokenUnit(transfer.value, Number(transfer.tokenDecimal), transfer.tokenSymbol).toDisplay(),\n from: { address: transfer.from },\n to: { address: transfer.to },\n type: TokenType.ERC20,\n address: transfer.contractAddress,\n };\n}\n\nfunction toTransaction(\n aggregate: Aggregate,\n address: string,\n explorerUrl: string,\n networkToken: NetworkToken,\n chainId: number,\n): Transaction {\n const wallet = address.toLowerCase();\n const hasIncoming = aggregate.tokens.some((token) => token.to?.address.toLowerCase() === wallet);\n const hasOutgoing = aggregate.tokens.some((token) => token.from?.address.toLowerCase() === wallet);\n const isSender = aggregate.from.toLowerCase() === wallet || hasOutgoing;\n const txType =\n hasIncoming && hasOutgoing ? TransactionType.SWAP : isSender ? TransactionType.SEND : TransactionType.RECEIVE;\n\n return {\n isContractCall: aggregate.isContractCall || (hasIncoming && hasOutgoing),\n isIncoming: hasIncoming && !hasOutgoing,\n isOutgoing: hasOutgoing,\n isSender,\n timestamp: aggregate.timestamp,\n hash: aggregate.hash,\n from: aggregate.from,\n to: aggregate.to,\n tokens:\n aggregate.tokens.length > 0\n ? aggregate.tokens\n : [\n {\n decimal: String(networkToken.decimals),\n name: networkToken.name,\n symbol: networkToken.symbol,\n amount: '0',\n type: TokenType.NATIVE,\n },\n ],\n gasPrice: aggregate.gasPrice,\n gasUsed: aggregate.gasUsed,\n chainId: chainId.toString(),\n txType,\n explorerLink: getExplorerAddressByNetwork(explorerUrl, aggregate.hash),\n };\n}\n","import { getTransactionsFromMoralis } from './converters/moralis-transaction-converter/get-transactions-from-moralis';\nimport { isMoralisSupportedChain } from './utils/moralis-chain-ids';\nimport type { NetworkToken, TransactionHistoryResponse } from '@avalabs/vm-module-types';\nimport { getTransactionsFromGlacier } from './converters/evm-transaction-converter/get-transactions-from-glacier';\nimport type { EvmGlacierService } from '../../services/glacier-service/glacier-service';\nimport type { HyperEvmEtherscanClient } from '../../services/hyperevm-etherscan-client/hyperevm-etherscan-client';\nimport { getTransactionsFromHyperEvm } from './converters/hyperevm-transaction-converter/get-transactions-from-hyperevm';\n\nconst HYPEREVM_CHAIN_ID = 999;\n\nexport const getTransactionHistory = async ({\n chainId,\n networkToken,\n explorerUrl,\n address,\n nextPageToken,\n offset,\n glacierService,\n hyperEvmEtherscanClient,\n}: {\n chainId: number;\n networkToken: NetworkToken;\n explorerUrl: string;\n address: string;\n nextPageToken?: string;\n offset?: number;\n glacierService: EvmGlacierService;\n hyperEvmEtherscanClient?: HyperEvmEtherscanClient;\n}): Promise<TransactionHistoryResponse> => {\n if (chainId === HYPEREVM_CHAIN_ID) {\n if (!hyperEvmEtherscanClient) {\n return { transactions: [], nextPageToken: '' };\n }\n\n return getTransactionsFromHyperEvm({\n client: hyperEvmEtherscanClient,\n chainId,\n networkToken,\n explorerUrl,\n address,\n nextPageToken,\n offset,\n });\n }\n\n if (isMoralisSupportedChain(chainId)) {\n return getTransactionsFromMoralis({\n chainId,\n networkToken,\n explorerUrl,\n address,\n nextPageToken,\n offset,\n });\n }\n\n const isHealthy = glacierService.isHealthy();\n if (!isHealthy) {\n return {\n transactions: [],\n nextPageToken: '',\n };\n }\n\n return getTransactionsFromGlacier({\n networkToken,\n explorerUrl,\n chainId,\n address,\n nextPageToken,\n offset,\n glacierService,\n });\n};\n","import { TokenUnit } from '@avalabs/core-utils-sdk';\nimport { CurrencyCode, NftTokenMetadataStatus } from '@avalabs/glacier-sdk';\nimport {\n type Error,\n type NetworkTokenWithBalance,\n type NftTokenWithBalance,\n TokenType,\n type TokenWithBalanceEVM,\n} from '@avalabs/vm-module-types';\nimport { getExchangeRates } from '@internal/utils';\nimport { rpcErrors } from '@metamask/rpc-errors';\nimport type { BalanceServiceInterface, TokenId } from '@src/handlers/get-balances/balance-service-interface';\nimport { getSmallImageForNFT } from '@src/utils/get-small-image-for-nft';\nimport { isHexString } from 'ethers';\nimport { DeBank, type DeBankChainInfo, type DeBankNftToken } from './de-bank';\n\nexport class DeBankService implements BalanceServiceInterface {\n #deBank: DeBank;\n\n constructor({ proxyApiUrl, fetch }: { proxyApiUrl: string; fetch?: typeof globalThis.fetch }) {\n this.#deBank = new DeBank(`${proxyApiUrl}/proxy/debank`, fetch);\n }\n\n async isNetworkSupported(chainId: number): Promise<boolean> {\n return this.#deBank.isNetworkSupported(chainId);\n }\n\n async #getChainInfo(chainId: number): Promise<{ chainInfo: DeBankChainInfo; chainIdString: string }> {\n const chainList = await this.#deBank.getChainList();\n const chainIdString = chainList.find((value) => value.community_id === chainId)?.id;\n if (!chainIdString) {\n throw rpcErrors.invalidParams('getNativeBalance: not valid chainId: ' + chainId);\n }\n\n const chainInfo = await this.#deBank.getChainInfo({ chainId: chainIdString });\n\n if (!chainInfo) {\n throw rpcErrors.invalidParams('getNativeBalance: not valid chainId: ' + chainId);\n }\n\n return {\n chainInfo,\n chainIdString,\n };\n }\n\n async getNativeBalance({\n chainId,\n address,\n currency,\n }: {\n chainId: number;\n address: string;\n currency: CurrencyCode;\n }): Promise<NetworkTokenWithBalance> {\n if (!isHexString(address)) throw rpcErrors.invalidParams('getNativeBalance: not valid address: ' + address);\n const { chainInfo, chainIdString } = await this.#getChainInfo(chainId);\n\n const tokenId = chainInfo.native_token_id;\n const nativeTokenBalance = await this.#deBank.getTokenBalance({ address, chainId: chainIdString, tokenId });\n const tokenUnit = new TokenUnit(\n nativeTokenBalance.raw_amount,\n nativeTokenBalance.decimals,\n nativeTokenBalance.symbol,\n );\n const balanceDisplayValue = tokenUnit.toDisplay();\n const exchangeRates = await getExchangeRates();\n const usdToCurrencyRate = exchangeRates.usd[currency.toLowerCase()];\n const priceInCurrency = usdToCurrencyRate ? usdToCurrencyRate * nativeTokenBalance.price : undefined;\n const balanceCurrencyDisplayValue = priceInCurrency\n ? tokenUnit.mul(priceInCurrency).toDisplay({ fixedDp: 2 })\n : undefined;\n const balanceInCurrency = priceInCurrency\n ? tokenUnit.mul(priceInCurrency).toDisplay({ fixedDp: 2, asNumber: true })\n : undefined;\n\n return {\n name: nativeTokenBalance.name,\n symbol: nativeTokenBalance.symbol,\n decimals: nativeTokenBalance.decimals,\n type: TokenType.NATIVE,\n logoUri: nativeTokenBalance.logo_url,\n balance: tokenUnit.toSubUnit(),\n balanceDisplayValue,\n balanceInCurrency,\n balanceCurrencyDisplayValue,\n priceInCurrency,\n } as NetworkTokenWithBalance;\n }\n\n async listErc20Balances({\n chainId,\n address,\n currency,\n }: {\n chainId: number;\n address: string;\n currency: CurrencyCode;\n pageSize: number;\n pageToken?: string;\n }): Promise<Record<TokenId, TokenWithBalanceEVM | Error>> {\n if (!isHexString(address)) throw rpcErrors.invalidParams('listErc20Balances: not valid address');\n const { chainInfo, chainIdString } = await this.#getChainInfo(chainId);\n\n const tokenBalances = await this.#deBank.getTokensBalanceOnChain({ chainId: chainIdString, address });\n const exchangeRates = await getExchangeRates();\n\n const erc20TokenBalances: Record<TokenId, TokenWithBalanceEVM | Error> = {};\n for (const tokenBalance of tokenBalances) {\n // skip native token or tokens which are not core tokens\n if (tokenBalance.id === chainInfo.native_token_id || tokenBalance.is_core === false) {\n continue;\n }\n\n const tokenUnit = new TokenUnit(tokenBalance.raw_amount, tokenBalance.decimals, tokenBalance.symbol);\n const balanceDisplayValue = tokenUnit.toDisplay();\n const usdToCurrencyRate = exchangeRates.usd[currency.toLowerCase()];\n const priceInCurrency = usdToCurrencyRate ? usdToCurrencyRate * tokenBalance.price : undefined;\n const balanceCurrencyDisplayValue = priceInCurrency\n ? tokenUnit.mul(priceInCurrency).toDisplay({ fixedDp: 2 })\n : undefined;\n const balanceInCurrency = priceInCurrency\n ? tokenUnit.mul(priceInCurrency).toDisplay({ fixedDp: 2, asNumber: true })\n : undefined;\n\n erc20TokenBalances[tokenBalance.id] = {\n chainId: chainInfo.community_id,\n address: tokenBalance.id,\n name: tokenBalance.name,\n symbol: tokenBalance.symbol,\n decimals: tokenBalance.decimals,\n logoUri: tokenBalance.logo_url,\n balance: tokenUnit.toSubUnit(),\n balanceCurrencyDisplayValue,\n balanceDisplayValue,\n balanceInCurrency,\n priceInCurrency,\n type: TokenType.ERC20,\n reputation: null,\n };\n }\n\n return erc20TokenBalances;\n }\n\n #mapNftList(deBankNftList: DeBankNftToken[], chainId: number): Record<string, NftTokenWithBalance | Error> {\n return deBankNftList.reduce(\n (accumulator, token) => ({\n ...accumulator,\n [`${token.contract_id}-${token.id}`]: {\n chainId,\n address: token.contract_id,\n description: token.description ?? '',\n logoUri: token.thumbnail_url,\n logoSmall: getSmallImageForNFT(token.content),\n name: token.name,\n symbol: '',\n tokenId: `${token.inner_id}`,\n tokenUri: token.detail_url,\n collectionName: token.collection_name,\n balance: BigInt(token.amount),\n balanceDisplayValue: `${token.amount}`,\n type: token.is_erc721 ? TokenType.ERC721 : TokenType.ERC1155,\n metadata: {\n indexStatus: NftTokenMetadataStatus.UNINDEXED,\n description: token.description ?? '',\n properties: '',\n },\n },\n }),\n {} as Record<string, NftTokenWithBalance>,\n );\n }\n\n async listNftBalances({\n chainId,\n address,\n }: {\n chainId: number;\n address: string;\n }): Promise<Record<string, NftTokenWithBalance | Error>> {\n if (!isHexString(address)) {\n throw rpcErrors.invalidParams('listNftBalances: not valid address');\n }\n const { chainIdString } = await this.#getChainInfo(chainId);\n\n const nftList = await this.#deBank.getNftList({ chainId: chainIdString, address });\n return this.#mapNftList(nftList, chainId);\n }\n}\n","import { ipfsResolver } from '@avalabs/core-utils-sdk';\n\nexport const IPFS_URL = 'https://ipfs.io';\n\nexport function ipfsResolverWithFallback(sourceUrl: string | undefined, desiredGatewayPrefix: string = IPFS_URL) {\n if (!sourceUrl) {\n return '';\n }\n\n try {\n return ipfsResolver(sourceUrl, desiredGatewayPrefix);\n } catch {\n return sourceUrl;\n }\n}\n","import { ipfsResolverWithFallback } from './ipsf-resolver-with-fallback';\n\nconst COVALENT_IMG_SIZER = 'https://image-proxy.svc.prod.covalenthq.com/cdn-cgi/image';\n\n/**\n * Covalent has an on the fly image resizer, it resolves image urls then resizes the image.\n *\n * This allows us to request smaller images depending on the UI needs\n *\n * @param imgUrl the url of the image to convert to size\n * @param imageSize the resize dimension\n * @returns The url to the image which is sized at the time of request\n */\nexport function getSmallImageForNFT(imgUrl: string, imageSize: '256' | '512' | '1024' = '256') {\n const url = ipfsResolverWithFallback(imgUrl);\n return `${COVALENT_IMG_SIZER}/width=${imageSize},fit/${url}`;\n}\n","import type { Hex } from '@avalabs/vm-module-types';\nimport { fetchAndVerify } from '@internal/utils';\nimport { isHexString } from 'ethers';\nimport { z } from 'zod';\n\nexport class DeBank {\n #supportedChainIds: DeBankChainInfo[] = [];\n #fetchFn: typeof fetch;\n\n constructor(\n private baseUrl: string,\n fetchFn?: typeof fetch,\n ) {\n this.#fetchFn = fetchFn ?? fetch;\n }\n\n async isNetworkSupported(chainId: number): Promise<boolean> {\n const chainList: DeBankChainInfo[] = await this.getChainList();\n return chainList.some((value) => value.community_id === chainId);\n }\n\n /**\n * @param chainId - DeBank chain id (ex. \"base\", \"eth\")\n */\n async getChainInfo({ chainId }: { chainId: string }): Promise<DeBankChainInfo | undefined> {\n const chainList = await this.getChainList();\n return chainList.find((chain) => chain.id === chainId);\n }\n\n /**\n * @param chainId - DeBank chain id (ex. \"base\", \"eth\")\n * @param address - account address\n * @param tokenId - The address of the token contract or a native token id (eth, matic, bsc)\n */\n async getTokenBalance({\n chainId,\n address,\n tokenId,\n }: {\n chainId: string;\n address: Hex;\n tokenId: Hex | string;\n }): Promise<DeBankToken> {\n const tokenBalanceResponse = await this.#fetchFn(\n `${this.baseUrl}/v1/user/token?id=${address}&chain_id=${chainId}&token_id=${tokenId}`,\n );\n if (tokenBalanceResponse.ok) {\n return await tokenBalanceResponse.json();\n } else {\n throw new Error(`${tokenBalanceResponse.status}:${tokenBalanceResponse.statusText}`);\n }\n }\n\n /**\n * @param chainId - DeBank chain id (ex. \"base\", \"eth\")\n * @param address - account address\n */\n async getTokensBalanceOnChain({ chainId, address }: { chainId: string; address: Hex }): Promise<DeBankToken[]> {\n const tokenBalanceResponse = await this.#fetchFn(\n `${this.baseUrl}/v1/user/token_list?id=${address}&chain_id=${chainId}`,\n );\n if (tokenBalanceResponse.ok) {\n return await tokenBalanceResponse.json();\n } else {\n throw new Error(`${tokenBalanceResponse.status}:${tokenBalanceResponse.statusText}`);\n }\n }\n\n /**\n * @param chainId - DeBank chain id (ex. \"base\", \"eth\")\n * @param address - account address\n */\n async getTokenList({ chainId, address }: { chainId: string; address: Hex }): Promise<DeBankToken[]> {\n const response = await (this.#fetchFn ?? globalThis.fetch)(\n `${this.baseUrl}/v1/user/token_list?id=${address}&chain_id=${chainId}`,\n );\n if (response.ok) {\n return await response.json();\n } else {\n throw new Error(`${response.status}:${response.statusText}`);\n }\n }\n\n /**\n * @returns Cached chain list if there is any, or tries to fetch it from API\n */\n async getChainList(): Promise<DeBankChainInfo[]> {\n if (this.#supportedChainIds.length === 0) {\n const chainListResponse = await this.#fetchFn(`${this.baseUrl}/v1/chain/list`);\n if (chainListResponse.ok) {\n this.#supportedChainIds = await chainListResponse.json();\n } else {\n throw new Error(`${chainListResponse.status}:${chainListResponse.statusText}`);\n }\n }\n return this.#supportedChainIds;\n }\n\n /**\n * @param chainId - DeBank chain id (ex. \"base\", \"eth\")\n * @param address - account address\n */\n async getNftList({ address, chainId }: { chainId: string; address: Hex }): Promise<DeBankNftToken[]> {\n return fetchAndVerify<typeof DeBankNftTokenListSchema>(\n [`${this.baseUrl}/v1/user/nft_list?id=${address}&chain_id=${chainId}`],\n DeBankNftTokenListSchema,\n this.#fetchFn,\n );\n }\n}\n\nconst BaseDeBankTokenSchema = z.object({\n id: z.union([z.custom<string>(isHexString), z.string()]), //address or native token id (eth, matic, bsc)\n chain: z.string(),\n name: z.string(),\n});\n\ntype BaseDeBankToken = z.infer<typeof BaseDeBankTokenSchema>;\n\n/**\n * Example:\n * ```json\n * {\n * \"id\": \"0x19225f002b65eefb22950b9739fc8b448d900d44\",\n * \"chain\": \"base\",\n * \"name\": \"BASE\",\n * \"symbol\": \"Collect on: swap-based.com\",\n * \"display_symbol\": null,\n * \"optimized_symbol\": \"Collect on: swap-based.com\",\n * \"decimals\": 0,\n * \"logo_url\": null,\n * \"protocol_id\": \"\",\n * \"price\": 0,\n * \"price_24h_change\": null,\n * \"is_verified\": false,\n * \"is_core\": false,\n * \"is_wallet\": false,\n * \"time_at\": 1712662101,\n * \"amount\": 250000,\n * \"raw_amount\": 250000,\n * \"raw_amount_hex_str\": \"0x3d090\"\n * }\n * ```\n */\n\n// TODO: create zod schema\nexport type DeBankToken = BaseDeBankToken & {\n symbol: string;\n optimized_symbol: string;\n decimals: number;\n logo_url: string;\n protocol_id: string;\n price: number;\n is_core: boolean;\n is_wallet: boolean;\n time_at: number;\n amount: bigint;\n raw_amount: bigint;\n};\n\n/**\n * Example:\n * ```json\n * {\n * \"id\": \"eth\",\n * \"community_id\": 1,\n * \"name\": \"Ethereum\",\n * \"native_token_id\": \"eth\",\n * \"logo_url\": \"https://static.debank.com/image/chain/logo_url/eth/42ba589cd077e7bdd97db6480b0ff61d.png\",\n * \"wrapped_token_id\": \"0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2\",\n * \"is_support_pre_exec\": true\n * }\n * ```\n */\n// TODO: create zod schema\nexport type DeBankChainInfo = {\n id: string;\n community_id: number;\n name: string;\n native_token_id: string;\n logo_url: string;\n wrapped_token_id: Hex;\n is_support_pre_exec: boolean;\n};\n\n/**\n * Example:\n * ```json\n * {\n * \"id\": \"defc948fbe6d3b138b49bf981e276f0b\",\n * \"contract_id\": \"0x495f947276749ce646f68ac8c248420045cb7b5e\",\n * \"inner_id\": \"55575360221028374465659771733000318579577403829328624053715758637886677712897\",\n * \"chain\": \"eth\",\n * \"name\": \"A New Era has begun\",\n * \"description\": \"3 of 9\\n\\nOn February 8, 2021, one of the most influential men in the world decided to invest in Bitcoin. Elon Musk, owner of Tesl\",\n * \"content_type\": \"image_url\",\n * \"content\": \"https://lh3.googleusercontent.com/WQnK8JxSSPj5YIxegh9iaprMaMmv-JswrcnTp9Mi5PXKDWmigkOzTBBIAkhdXtLPe7EwIe6Q1gi2gdtLzV08d2y67rMVTHx0Ei0S\",\n * \"detail_url\": \"https://opensea.io/assets/0x495f947276749ce646f68ac8c248420045cb7b5e/55575360221028374465659771733000318579577403829328624053715758637886677712897\",\n * \"contract_name\": \"OpenSea Shared Storefront\",\n * \"is_erc1155\": true,\n * \"amount\": 1,\n * \"protocol\": {\n * \"id\": \"opensea\",\n * \"chain\": \"eth\",\n * \"name\": \"OpenSea\",\n * \"site_url\": \"https://opensea.io\",\n * \"logo_url\": \"https://static.debank.com/image/project/logo_url/opensea/4b23246fac2d4ce53bd8e8079844821c.png\",\n * \"has_supported_portfolio\": false,\n * \"tvl\": 114295.77061458935\n * },\n * \"pay_token\": {\n * \"id\": \"eth\",\n * \"chain\": \"eth\",\n * \"name\": \"ETH\",\n * \"symbol\": \"ETH\",\n * \"display_symbol\": null,\n * \"optimized_symbol\": \"ETH\",\n * \"decimals\": 18,\n * \"logo_url\": \"https://static.debank.com/image/token/logo_url/eth/935ae4e4d1d12d59a99717a24f2540b5.png\",\n * \"protocol_id\": \"\",\n * \"price\": 2510.46,\n * \"is_verified\": true,\n * \"is_core\": true,\n * \"is_wallet\": true,\n * \"time_at\": 1628248886,\n * \"amount\": 0.0178,\n * \"date_at\": \"2021-08-06\"\n * },\n * \"attributes\": [\n * {\n * \"trait_type\": \"Artist\",\n * \"value\": \"SpaceTurtleShip\"\n * },\n * {\n * \"trait_type\": \"Edition\",\n * \"value\": \"1\"\n * }\n * ],\n * \"usd_price\": 51.492552,\n * \"collection_id\": null\n * }\n * ```\n * */\n\nconst DeBankNftTokenSchema = BaseDeBankTokenSchema.merge(\n z.object({\n contract_id: z.string(),\n description: z.string().nullable(),\n content_type: z.string().nullable(),\n content: z.string(),\n thumbnail_url: z.string(),\n total_supply: z.number(),\n detail_url: z.string(),\n collection_id: z.string(),\n is_core: z.boolean(),\n inner_id: z.string(),\n collection_name: z.string(),\n contract_name: z.string(),\n amount: z.number(),\n usd_price: z.number().optional(),\n is_erc721: z.boolean().optional(),\n is_erc1155: z.boolean().optional(),\n }),\n);\n\nconst DeBankNftTokenListSchema = z.array(DeBankNftTokenSchema);\n\nexport type DeBankNftToken = z.infer<typeof DeBankNftTokenSchema>;\n","import { TokenUnit } from '@avalabs/core-utils-sdk';\nimport {\n CurrencyCode,\n Erc1155Token,\n Erc1155TokenBalance,\n Erc20TokenBalance,\n Erc721Token,\n Erc721TokenBalance,\n Glacier,\n} from '@avalabs/glacier-sdk';\nimport {\n type ERC20Token,\n type Error,\n type NetworkTokenWithBalance,\n type NftTokenWithBalance,\n TokenType,\n type TokenWithBalanceERC20,\n type TokenWithBalanceEVM,\n} from '@avalabs/vm-module-types';\n\nimport { ChainId } from '@avalabs/core-chains-sdk';\nimport { GlacierFetchHttpRequest } from '@internal/utils';\nimport { DEFAULT_DECIMALS } from '@src/constants';\nimport type { BalanceServiceInterface } from '@src/handlers/get-balances/balance-service-interface';\nimport { getSmallImageForNFT } from '@src/utils/get-small-image-for-nft';\n\nclass GlacierUnhealthyError extends Error {\n override message = 'Glacier is unhealthy. Try again later.';\n}\n\nconst CHAINS_TO_FILTER = [ChainId.ETHEREUM_HOMESTEAD];\n\ntype GlacierServiceConfig = {\n glacierApiUrl: string;\n headers?: Record<string, string>;\n};\n\nexport class EvmGlacierService implements BalanceServiceInterface {\n glacierSdk: Glacier;\n isGlacierHealthy = true;\n supportedChainIds: string[] = [];\n\n constructor({ glacierApiUrl, headers }: GlacierServiceConfig) {\n this.glacierSdk = new Glacier(\n {\n BASE: glacierApiUrl,\n HEADERS: headers,\n },\n GlacierFetchHttpRequest,\n );\n /**\n * This is for performance, basically we just cache the health of glacier every 5 seconds and\n * go off of that instead of every request\n */\n this.getSupportedChainIds().catch(() => {\n // Noop. It will be retried by .isSupportedNetwork calls upon unlocking if necessary.\n });\n }\n\n isHealthy = (): boolean => this.isGlacierHealthy;\n\n setGlacierToUnhealthy(): void {\n this.isGlacierHealthy = false;\n setTimeout(\n () => {\n this.isGlacierHealthy = true;\n },\n 5 * 60 * 1000,\n ); // 5 minutes\n }\n\n async isNetworkSupported(chainId: number): Promise<boolean> {\n const chainIds = await this.getSupportedChainIds();\n return chainIds.some((id) => id === chainId.toString());\n }\n\n async getSupportedChainIds(): Promise<string[]> {\n if (this.supportedChainIds.length) {\n return this.supportedChainIds;\n }\n\n try {\n const supportedChains = await this.glacierSdk.evmChains.supportedChains({});\n /*\n * https://ava-labs.atlassian.net/browse/CP-9855\n * We are removing the support for Ethereum chain, so it is queried from DeBank instead\n */\n this.supportedChainIds = supportedChains.chains\n .map((chain) => chain.chainId)\n .filter((chainId) => !CHAINS_TO_FILTER.includes(Number(chainId)));\n return this.supportedChainIds;\n } catch {\n return [];\n }\n }\n\n async reindexNft({\n address,\n chainId,\n tokenId,\n }: {\n address: string;\n chainId: string;\n tokenId: string;\n }): Promise<void> {\n try {\n await this.glacierSdk.nfTs.reindexNft({\n address,\n chainId,\n tokenId,\n });\n } catch (error) {\n if (error instanceof GlacierUnhealthyError) {\n this.setGlacierToUnhealthy();\n }\n throw error;\n }\n }\n\n async getTokenDetails({\n address,\n chainId,\n tokenId,\n }: {\n address: string;\n chainId: string;\n tokenId: string;\n }): Promise<Erc721Token | Erc1155Token> {\n try {\n return this.glacierSdk.nfTs.getTokenDetails({\n address,\n chainId,\n tokenId,\n });\n } catch (error) {\n if (error instanceof GlacierUnhealthyError) {\n this.setGlacierToUnhealthy();\n }\n throw error;\n }\n }\n\n async getNativeBalance({\n chainId,\n address,\n currency,\n coingeckoId,\n }: {\n chainId: number;\n address: string;\n currency: CurrencyCode;\n coingeckoId?: string;\n }): Promise<NetworkTokenWithBalance> {\n try {\n const nativeBalance = await this.glacierSdk.evmBalances.getNativeBalance({\n chainId: chainId.toString(),\n address,\n currency: currency.toLocaleLowerCase() as CurrencyCode,\n });\n\n const nativeTokenBalance = nativeBalance.nativeTokenBalance;\n const balance = new TokenUnit(nativeTokenBalance.balance, nativeTokenBalance.decimals, nativeTokenBalance.symbol);\n const priceInCurrency = nativeTokenBalance.price?.value;\n const balanceInCurrency = priceInCurrency !== undefined ? balance.mul(priceInCurrency) : undefined;\n\n return {\n name: nativeTokenBalance.name,\n symbol: nativeTokenBalance.symbol,\n decimals: nativeTokenBalance.decimals,\n type: TokenType.NATIVE,\n logoUri: nativeTokenBalance.logoUri,\n balance: balance.toSubUnit(),\n balanceDisplayValue: balance.toDisplay(),\n balanceInCurrency: balanceInCurrency?.toDisplay({ fixedDp: 2, asNumber: true }),\n balanceCurrencyDisplayValue: balanceInCurrency?.toDisplay({ fixedDp: 2 }),\n priceInCurrency,\n coingeckoId: coingeckoId ?? '',\n };\n } catch (error) {\n if (error instanceof GlacierUnhealthyError) {\n this.setGlacierToUnhealthy();\n }\n throw error;\n }\n }\n\n async listErc721Balances({ chainId, address }: { chainId: string; address: string }): Promise<Erc721TokenBalance[]> {\n /**\n * Load all pages to make sure we have all the tokens with balances\n */\n let nextPageToken: string | undefined = undefined;\n const tokens: Erc721TokenBalance[] = [];\n do {\n try {\n const response = await this.glacierSdk.evmBalances.listErc721Balances({\n chainId,\n address,\n pageSize: 100,\n pageToken: nextPageToken,\n });\n\n tokens.push(...response.erc721TokenBalances);\n\n nextPageToken = response.nextPageToken;\n } catch (error) {\n if (error instanceof GlacierUnhealthyError) {\n this.setGlacierToUnhealthy();\n }\n throw error;\n }\n } while (nextPageToken);\n\n return tokens;\n }\n\n async listErc1155Balances({\n chainId,\n address,\n }: {\n chainId: string;\n address: string;\n }): Promise<Erc1155TokenBalance[]> {\n /**\n * Load all pages to make sure we have all the tokens with balances\n */\n let nextPageToken: string | undefined = undefined;\n const tokens: Erc1155TokenBalance[] = [];\n do {\n try {\n const response = await this.glacierSdk.evmBalances.listErc1155Balances({\n chainId,\n address,\n pageSize: 100,\n pageToken: nextPageToken,\n });\n\n tokens.push(...response.erc1155TokenBalances);\n\n nextPageToken = response.nextPageToken;\n } catch (error) {\n if (error instanceof GlacierUnhealthyError) {\n this.setGlacierToUnhealthy();\n }\n throw error;\n }\n } while (nextPageToken);\n\n return tokens;\n }\n\n async listNftBalances({\n chainId,\n address,\n }: {\n chainId: number;\n address: string;\n }): Promise<Record<string, NftTokenWithBalance | Error>> {\n const balances = await Promise.allSettled([\n this.listErc721Balances({ chainId: chainId.toString(), address }),\n this.listErc1155Balances({ chainId: chainId.toString(), address }),\n ]);\n\n const entries = balances\n .filter(\n (\n tokenlist,\n ): tokenlist is PromiseFulfilledResult<Erc721TokenBalance[]> | PromiseFulfilledResult<Erc1155TokenBalance[]> =>\n tokenlist.status === 'fulfilled',\n )\n .flatMap((tokenlist) => {\n return (\n tokenlist.value\n // We filter out erc1155s with 0 balance, which Glacier returns for some reason\n .filter((token) => token.ercType === Erc721Token.ercType.ERC_721 || BigInt(token.balance) > 0n)\n .map((token) => {\n return [\n `${token.address}-${token.tokenId}`,\n {\n address: token.address,\n description: token.metadata.description ?? '',\n logoUri: token.metadata.imageUri ?? '',\n logoSmall: getSmallImageForNFT(token.metadata.imageUri ?? ''),\n name: token.metadata.name ?? '',\n symbol: token.metadata.symbol ?? '',\n tokenId: token.tokenId,\n tokenUri: token.tokenUri,\n chainId,\n // glacier does not provide the collection name information\n collectionName: 'Unknown',\n balance: token.ercType === Erc1155Token.ercType.ERC_1155 ? BigInt(token.balance) : 1,\n balanceDisplayValue: token.ercType === Erc1155Token.ercType.ERC_1155 ? token.balance : '1',\n type: token.ercType === Erc721Token.ercType.ERC_721 ? TokenType.ERC721 : TokenType.ERC1155,\n metadata: {\n indexStatus: token.metadata.indexStatus,\n description: token.metadata.description,\n lastUpdatedTimestamp: token.metadata.metadataLastUpdatedTimestamp,\n properties:\n token.ercType === Erc721Token.ercType.ERC_721\n ? token.metadata.attributes\n : token.metadata.properties,\n },\n },\n ];\n })\n );\n });\n\n return Object.fromEntries(entries);\n }\n\n async listErc20Balances({\n chainId,\n address,\n currency,\n customTokens,\n }: {\n chainId: number;\n address: string;\n currency: CurrencyCode;\n customTokens: ERC20Token[];\n }): Promise<Record<string, TokenWithBalanceEVM | Error>> {\n try {\n const tokensWithBalance: TokenWithBalanceERC20[] = [];\n /**\n * Load all pages to make sure we have all the tokens with balances\n */\n let nextPageToken: string | undefined = undefined;\n do {\n const response = await this.glacierSdk.evmBalances.listErc20Balances({\n chainId: chainId.toString(),\n address,\n currency: currency.toLocaleLowerCase() as CurrencyCode,\n pageSize: 100, // glacier has a cap on page size of 100\n pageToken: nextPageToken,\n });\n\n tokensWithBalance.push(\n ...convertErc20TokenWithBalanceToTokenWithBalance(response.erc20TokenBalances, Number(chainId)),\n );\n nextPageToken = response.nextPageToken;\n } while (nextPageToken);\n\n /**\n * Glacier doesnt return tokens without balances so we need to polyfill that list\n * from our own list of tokens. We just set the balance to 0, these zero balance\n * tokens are only used for swap, bridge and tx parsing.\n */\n return [\n ...convertErc20TokenToTokenWithBalance(customTokens),\n ...tokensWithBalance, // this needs to be second in the list so it overwrites its zero balance counterpart if there is one\n ].reduce(\n (acc, token) => {\n return { ...acc, [token.address.toLowerCase()]: token };\n },\n {} as Record<string, TokenWithBalanceEVM>,\n );\n } catch (error) {\n if (error instanceof GlacierUnhealthyError) {\n this.setGlacierToUnhealthy();\n }\n throw error;\n }\n }\n\n async listTransactions({\n chainId,\n address,\n pageToken,\n pageSize,\n }: {\n chainId: string;\n address: string;\n pageToken?: string;\n pageSize?: number;\n }) {\n try {\n return this.glacierSdk.evmTransactions.listTransactionsV2({\n chainId,\n address,\n pageToken,\n pageSize,\n filterSpamTokens: true,\n });\n } catch (error) {\n if (error instanceof GlacierUnhealthyError) {\n this.setGlacierToUnhealthy();\n }\n throw error;\n }\n }\n}\n\nconst convertErc20TokenToTokenWithBalance = (tokens: ERC20Token[]): TokenWithBalanceERC20[] => {\n return tokens.map((token) => {\n return {\n ...token,\n decimals: token.decimals ?? DEFAULT_DECIMALS,\n type: TokenType.ERC20,\n balance: 0n,\n balanceInCurrency: 0,\n balanceDisplayValue: '0',\n balanceCurrencyDisplayValue: '0',\n priceInCurrency: 0,\n marketCap: 0,\n change24: 0,\n vol24: 0,\n reputation: null,\n };\n });\n};\n\nconst convertErc20TokenWithBalanceToTokenWithBalance = (\n tokenBalances: Erc20TokenBalance[],\n chainId: number,\n): TokenWithBalanceERC20[] => {\n return tokenBalances.map((token: Erc20TokenBalance): TokenWithBalanceERC20 => {\n const balance = new TokenUnit(token.balance, token.decimals, token.symbol);\n const balanceDisplayValue = balance.toDisplay();\n const balanceCurrencyDisplayValue = token.balanceValue?.value.toString();\n const priceInCurrency = token.price?.value;\n const balanceInCurrency =\n priceInCurrency !== undefined\n ? balance.mul(priceInCurrency).toDisplay({ fixedDp: 2, asNumber: true })\n : undefined;\n\n return {\n chainId,\n address: token.address,\n name: token.name,\n symbol: token.symbol,\n decimals: token.decimals,\n logoUri: token.logoUri,\n balance: balance.toSubUnit(),\n balanceCurrencyDisplayValue,\n balanceDisplayValue,\n balanceInCurrency,\n priceInCurrency,\n reputation: token.tokenReputation,\n type: TokenType.ERC20,\n };\n });\n};\n","import { z } from 'zod';\nimport {\n hyperEvmErc20TransferSchema,\n hyperEvmInternalTransactionSchema,\n hyperEvmNormalTransactionSchema,\n type HyperEvmErc20Transfer,\n type HyperEvmInternalTransaction,\n type HyperEvmNormalTransaction,\n} from './schemas';\n\ntype EtherscanAction = 'txlist' | 'tokentx' | 'txlistinternal';\n\ntype EtherscanPageOptions = {\n page?: number;\n offset?: number;\n};\n\nexport type HyperEvmEtherscanClientConfig = {\n proxyApiUrl: string;\n fetch?: typeof globalThis.fetch;\n};\n\nconst resolveFetch = (fetchFn?: typeof globalThis.fetch) => {\n if (fetchFn) {\n return fetchFn;\n }\n\n if (typeof globalThis.fetch === 'function') {\n return globalThis.fetch.bind(globalThis);\n }\n\n throw new Error('HyperEvmEtherscanClient requires a fetch implementation');\n};\n\nexport class HyperEvmEtherscanClient {\n readonly #apiUrl: string;\n readonly #fetch: typeof globalThis.fetch;\n\n constructor({ proxyApiUrl, fetch }: HyperEvmEtherscanClientConfig) {\n this.#apiUrl = `${proxyApiUrl}/proxy/etherscan/hyperevm/api`;\n this.#fetch = resolveFetch(fetch);\n }\n\n listNormalTransactions(address: string, options?: EtherscanPageOptions) {\n return this.#list('txlist', address, hyperEvmNormalTransactionSchema, options);\n }\n\n listErc20Transfers(address: string, options?: EtherscanPageOptions) {\n return this.#list('tokentx', address, hyperEvmErc20TransferSchema, options);\n }\n\n listInternalTransactions(address: string, options?: EtherscanPageOptions) {\n return this.#list('txlistinternal', address, hyperEvmInternalTransactionSchema, options);\n }\n\n async #list<T>(\n action: EtherscanAction,\n address: string,\n schema: z.ZodType<T>,\n options?: EtherscanPageOptions,\n ): Promise<T[]> {\n const params = new URLSearchParams({\n module: 'account',\n action,\n address,\n page: (options?.page ?? 1).toString(),\n offset: (options?.offset ?? 25).toString(),\n sort: 'desc',\n });\n const response = await this.#fetch(`${this.#apiUrl}?${params.toString()}`);\n\n if (!response.ok) {\n throw new Error(`HyperEVM explorer request failed: ${response.status} ${response.statusText}`);\n }\n\n const json: unknown = await response.json();\n const parsed = z\n .object({\n status: z.string(),\n message: z.string(),\n result: z.union([z.array(schema), z.string()]),\n })\n .parse(json);\n\n if (Array.isArray(parsed.result)) {\n return parsed.result;\n }\n\n if (parsed.status === '0' && parsed.message === 'No transactions found') {\n return [];\n }\n\n throw new Error(parsed.result);\n }\n}\n\nexport type { HyperEvmErc20Transfer, HyperEvmInternalTransaction, HyperEvmNormalTransaction };\n","import { z } from 'zod';\n\nexport const hyperEvmNormalTransactionSchema = z.object({\n blockNumber: z.string(),\n timeStamp: z.string(),\n hash: z.string(),\n nonce: z.string(),\n blockHash: z.string(),\n transactionIndex: z.string(),\n from: z.string(),\n to: z.string(),\n value: z.string(),\n gas: z.string(),\n gasPrice: z.string(),\n isError: z.string(),\n txreceipt_status: z.string(),\n input: z.string(),\n contractAddress: z.string(),\n cumulativeGasUsed: z.string(),\n gasUsed: z.string(),\n confirmations: z.string(),\n});\n\nexport const hyperEvmErc20TransferSchema = z.object({\n blockNumber: z.string(),\n timeStamp: z.string(),\n hash: z.string(),\n nonce: z.string(),\n blockHash: z.string(),\n from: z.string(),\n contractAddress: z.string(),\n to: z.string(),\n value: z.string(),\n tokenName: z.string(),\n tokenSymbol: z.string(),\n tokenDecimal: z.string(),\n transactionIndex: z.string(),\n gas: z.string(),\n gasPrice: z.string(),\n gasUsed: z.string(),\n cumulativeGasUsed: z.string(),\n input: z.string(),\n confirmations: z.string(),\n});\n\nexport const hyperEvmInternalTransactionSchema = z.object({\n blockNumber: z.string(),\n timeStamp: z.string(),\n hash: z.string(),\n from: z.string(),\n to: z.string(),\n value: z.string(),\n contractAddress: z.string(),\n input: z.string(),\n type: z.string(),\n gas: z.string(),\n gasUsed: z.string(),\n traceId: z.string(),\n isError: z.string(),\n errCode: z.string(),\n});\n\nexport type HyperEvmNormalTransaction = z.infer<typeof hyperEvmNormalTransactionSchema>;\nexport type HyperEvmErc20Transfer = z.infer<typeof hyperEvmErc20TransferSchema>;\nexport type HyperEvmInternalTransaction = z.infer<typeof hyperEvmInternalTransactionSchema>;\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/module.ts","../../../packages-internal/utils/src/services/token-service/token-service.ts","../../../packages-internal/utils/src/utils/charsum.ts","../../../packages-internal/utils/src/utils/array-hash.ts","../../../packages-internal/utils/src/utils/retry.ts","../../../packages-internal/utils/src/utils/coingecko-retry.ts","../../../packages-internal/utils/src/services/token-service/coingecko-proxy-client.ts","../../../packages-internal/utils/src/utils/fetch-and-verify.ts","../../../packages-internal/utils/src/services/token-service/watchlist-proxy-client.ts","../../../packages-internal/utils/src/services/pricing-service/exchange-rates.ts","../../../packages-internal/utils/src/utils/detail-item.ts","../../../packages-internal/utils/src/utils/get-core-headers.ts","../../../packages-internal/utils/src/consts.ts","../../../packages-internal/utils/src/utils/get-glacier-api-key.ts","../../../packages-internal/utils/src/utils/add-glacier-api-key-if-needed.ts","../../../packages-internal/utils/src/utils/glacier-fetch-http-request.ts","../../../packages-internal/utils/src/utils/rpc-error-opts.ts","../manifest.json","../src/constants.ts","../src/env.ts","../src/handlers/build-derivation-path/build-derivation-path.ts","../src/handlers/avalanche-declare-agent-identity/avalanche-declare-agent-identity.ts","../src/utils/resolve-agent-identity.ts","../src/utils/get-provider.ts","../src/handlers/derive-address/derive-address.ts","../../../packages-internal/utils/src/utils/address-derivation.ts","../src/handlers/derive-addresses/derive-addresses.ts","../src/handlers/eth-send-transaction-batch/eth-send-transaction-batch.ts","../src/handlers/eth-send-transaction-batch/schema.ts","../src/utils/transaction-schema.ts","../src/utils/get-nonce.ts","../src/handlers/eth-send-transaction-batch/utils/ensure-proper-nonces.ts","../src/utils/build-tx-approval-request.ts","../src/utils/build-agent-identity-detail-section.ts","../src/types.ts","../src/utils/parse-erc20-transaction-type.ts","../src/utils/get-recipient-address.ts","../src/utils/classify-transaction.ts","../src/utils/parse-eerc-transaction.ts","../src/utils/eerc-abi.ts","../src/utils/get-tx-hash.ts","../src/handlers/get-transaction-history/utils/get-explorer-address-by-network.ts","../src/utils/wait-for-transaction-receipt.ts","../src/utils/evm-tx-batch-updater.ts","../src/handlers/eth-send-transaction-batch/utils/process-transaction-batch-simulation.ts","../src/utils/type-utils.ts","../src/utils/process-transaction-simulation.ts","../src/utils/scan-transaction.ts","../src/utils/parse-erc20-tx.ts","../src/utils/transaction-alerts.ts","../src/utils/get-agent-identity-from-context.ts","../src/handlers/eth-send-transaction/eth-send-transaction.ts","../src/utils/evm-tx-updater.ts","../src/utils/encode-erc20-approval.ts","../src/utils/estimate-gas-limit.ts","../src/handlers/eth-send-transaction/schema.ts","../src/handlers/eth-sign/eth-sign.ts","../src/handlers/eth-sign/utils/beautify-message/beautify-message.ts","../src/handlers/eth-sign/schemas/parse-request-params/parse-request-params.ts","../src/handlers/eth-sign/schemas/eth-sign.ts","../src/handlers/eth-sign/schemas/shared.ts","../src/handlers/eth-sign/schemas/eth-sign-typed-data.ts","../src/handlers/eth-sign/schemas/personal-sign.ts","../src/handlers/eth-sign/utils/typeguards.ts","../src/handlers/eth-sign/utils/is-typed-data-valid.ts","../src/handlers/forward-to-rpc-node/forward-to-rpc-node.ts","../src/handlers/get-address/get-address.ts","../src/handlers/get-balances/get-balances.ts","../src/services/rpc-service/rpc-service.ts","../src/utils/id-promise.ts","../src/handlers/get-tokens/get-tokens.ts","../src/utils/find-async.ts","../src/handlers/get-network-fee/get-network-fee.ts","../src/handlers/get-transaction-history/converters/moralis-transaction-converter/convert-moralis-transaction.ts","../src/handlers/get-transaction-history/converters/evm-transaction-converter/get-tx-type.ts","../src/handlers/get-transaction-history/converters/moralis-transaction-converter/get-transactions-from-moralis.ts","../src/handlers/get-transaction-history/utils/moralis-chain-ids.ts","../src/handlers/get-transaction-history/converters/evm-transaction-converter/get-sender-info.ts","../src/handlers/get-transaction-history/converters/evm-transaction-converter/get-tokens.ts","../src/handlers/get-transaction-history/utils/resolve.ts","../src/handlers/get-transaction-history/utils/ipfs-resolver-with-fallback.ts","../src/handlers/get-transaction-history/converters/evm-transaction-converter/get-nft-metadata.ts","../src/handlers/get-transaction-history/utils/get-small-image-for-nft.ts","../src/handlers/get-transaction-history/converters/evm-transaction-converter/convert-transaction.ts","../src/handlers/get-transaction-history/converters/evm-transaction-converter/get-transactions-from-glacier.ts","../src/handlers/get-transaction-history/converters/hyperevm-transaction-converter/get-transactions-from-hyperevm.ts","../src/handlers/get-transaction-history/get-transaction-history.ts","../src/services/debank-service/debank-service.ts","../src/utils/ipsf-resolver-with-fallback.ts","../src/utils/get-small-image-for-nft.ts","../src/services/debank-service/de-bank.ts","../src/services/glacier-service/glacier-service.ts","../src/services/hyperevm-etherscan-client/hyperevm-etherscan-client.ts","../src/services/hyperevm-etherscan-client/schemas.ts"],"names":["parseManifest","RpcMethod","Blockaid","VsCurrencyType","getBasicCoingeckoHttp","simplePrice","simpleTokenPrice","charsum","s","i","sum","__name","arrayHash","array","cs","retry","operation","isSuccess","maxRetries","backoffPolicy","RetryBackoffPolicy","backoffPeriodMillis","retries","lastError","delay","result","err","errorMessage","_RetryBackoffPolicy","retryIndex","secondsToDelay","_","msToDelay","linearCount","linearStepMs","n","base","incSum","ms","r","coingeckoRetry","response","RawSimplePriceResponseSchema","fetchAndVerify","fetchOptions","schema","fetchFn","responseJson","_CoingeckoProxyClient","proxyApiUrl","params","queryParams","id","rawQueryParams","CoingeckoProxyClient","z","WatchlistTokenResponseSchema","_WatchlistProxyClient","WatchlistProxyClient","_storage","_proxyApiUrl","_fetchFn","_coingeckoBasicClient","_TokenService","storage","fetch","__privateAdd","__publicField","data","currencies","formattedData","tokenData","currency","__privateSet","__privateGet","tokenDetails","token","tokenInfo","coinIds","cacheId","useCoingeckoProxy","tokenAddresses","assetPlatformId","rawData","marketCap","vol24","change24","lastUpdated","shouldThrow","TokenService","number","object","record","string","CURRENCY_EXCHANGE_RATES_URL","CURRENCY_EXCHANGE_RATES_FALLBACK_URL","ExchangeRateSchema","getExchangeRates","DetailItemType","textItem","label","value","alignment","linkItem","addressItem","networkItem","AppName","getCoreHeaders","name","version","GLACIER_API_KEY","getGlacierApiKey","knownHosts","addGlacierAPIKeyIfNeeded","url","urlObj","glacierApiKey","search_params","ApiError","CancelablePromise","FetchHttpRequest","GLOBAL_QUERY_PARAMS","_failedRequests","_getDelay","_request","request_fn","_postponeRequest","postponeRequest_fn","_GlacierFetchHttpRequest","config","options","mergedQuery","modifiedOptions","getRequest","__privateMethod","inner","resolve","reject","onCancel","isHttpTooManyRequests","isHttpInternalServerError","timeout","GlacierFetchHttpRequest","rpcErrorOpts","message","cause","rpcErrors","manifest_default","BLOCKAID_API_KEY","Environment","prodEnv","devEnv","getEnv","environment","NetworkVMType","buildDerivationPath","accountIndex","derivationPathType","Contract","getAddress","toUtf8String","JsonRpcBatchInternal","FetchRequest","EVMNetwork","getProvider","chainId","chainName","rpcUrl","multiContractAddress","pollingInterval","customRpcHeaders","urlOrFetchRequest","fetchRequest","provider","FIVE_MINUTES_MS","DEFAULT_REPUTATION_REGISTRIES","IDENTITY_ABI","REPUTATION_ABI","cache","getTrustLevel","score","clampScore","toNumber","numeric","scaleFixedPoint","decimals","numericValue","numericDecimals","isReputationSummaryTuple","summary","isReputationFeedbackTuple","feedback","getSummaryValue","getFeedbackValues","values","valueDecimals","tag1s","tag2s","revoked","index","averageScores","scores","filtered","STARRED_TAG","dedupeAddresses","addresses","seen","deduped","address","normalized","getFeedbackClients","resolveReputationScore","reputationContract","parsedRegistryAddress","agentId","feedbackResult","entry","clientAddresses","parseAgentRegistry","agentRegistry","namespace","parsedChainId","buildFallback","declaration","callFirst","calls","results","call","decodeMetadata","resolveAgentIdentity","cached","parsedRegistry","normalizedDeclaration","fallback","identityContract","reputationRegistry","owner","metadataUri","reputationScore","normalizedReputationScore","resolved","avalancheDeclareAgentIdentity","request","network","parsed","computeAddress","hasDerivationDetails","deriveAddress","secretId","approvalController","derivationPath","publicKeyHex","deriveAddressesForEvm","init","deriveAddresses","accountIndices","publicKeys","transactionSchema","transactionArraySchema","transactions","areAllEqualByProp","areAllEmptyByProp","areAllDifferentByProp","batchOptionsSchema","transactionBatchSchema","elements","prop","el","parseRequestParams","getNonce","from","ensureProperNonces","nonce","transaction","isNavigableMetadataUri","isEmbeddedDataUri","buildAgentIdentityDetailSection","agentIdentity","items","TransactionType","NonContractCallTypes","ERC20TransactionType","TransactionKind","Interface","ERC20","parseERC20TransactionType","description","functionName","isERC20TransactionType","getRecipientAddress","recipient","classifyTransaction","erc20Type","EERC_ABI","EercOperation","eercInterface","parseEercTransaction","isEercOperation","buildTxApprovalRequest","isSimulationSuccessful","balanceChange","tokenApprovals","alert","eercDisplayEnabled","dappInfo","transactionType","title","recipientAddress","transactionDetails","item","transactionClassification","eercTransaction","displayData","signingData","getTxHash","broadcast","getExplorerAddressByNetwork","explorerUrl","hash","hashType","waitForTransactionReceipt","txHash","onTransactionPending","onTransactionConfirmed","onTransactionReverted","explorerLink","error","requests","getTxBatchUpdater","requestId","signingRequests","maxFeeRate","maxTipRate","txIndex","updatedRequest","signingRequest","AlertType","TokenType","isNetworkToken","isERC20Token","hasToField","supportsBatchApprovals","controller","isBalanceChange","input","isTokenApprovals","isEmpty","balanceToDisplayValue","numberToBN","isHexString","MaxUint256","scanTransactionBatch","domain","withGasEstimation","blockaid","scanTransaction","scanJsonRpc","accountAddress","xss","ethers","TokenUnit","parseWithErc20Abi","contract","contractCalls","symbol","iface","calledFunction","decodeFunctionData","transactionAlerts","simulateTransaction","rpcMethod","dAppUrl","simulationResult","processTransactionSimulation","estimatedGasLimit","validation","simulation","gasEstimation","processTokenApprovals","processBalanceChange","erc20ParseResult","isExposureTrace","trace","normalizeAddresses","spender","assetAddress","mapExposureTracesToSpenderAsset","traces","accumulator","accountSummary","mappedExposureTraces","approvals","convertAssetToNetworkContractToken","tokenApproval","raw_value","usd_price","amount","accountSummaryAssetsDiffs","ins","processAssetDiffs","outs","type","assetDiff","a","b","asset","convertNativeAssetToToken","diff","displayValue","valueBN","logoUri","tokenId","x","processJsonRpcSimulation","simulateTransactionBatch","populateMissingGas","simulationResults","scans","matchingTx","processedResult","scan","getHighestAlert","aggregateBalanceChange","aggregateTokenApprovals","alertPrio","highest","aggregatedTokenApprovals","appr","aggregatedApproval","aggrApproval","clearSpentApprovals","aggregated","aggregatedBalanceChange","aggregatedDiff","findTokenDiff","diffs","lookupDiff","approval","latestApprovalState","isAgentIdentityDeclaration","candidate","getAgentIdentityFromContext","ethSendTransactionBatch","parsedParams","success","transactionRequests","skipIntermediateTxs","allTransactionPayloadsHaveGas","tx","cleanup","updateTx","txHashes","isLast","encodeApprovalLimit","tokenAddress","spenderAddress","limit","getTxUpdater","approvalLimit","gasLimit","newSigningData","newDisplayData","ensureTokenApprovalCanBeEdited","ensureApproveWasCalled","txData","estimateGasLimit","to","accessList","paramsSchema","ethSendTransaction","eercEnabled","shouldRetry","beautifyComplexMessage","key","toUnicodeBold","subKey","beautifySimpleMessage","str","boldMap","char","messageSchema","addressSchema","ethSignSchema","messageTypeSchema","typedDataSchema","typedDataV1Schema","combinedTypedDataSchema","dataSchema","combinedDataSchema","ethSignTypedDataSchema","ethSignTypedDataV1Schema","ethSignTypedDataV3Schema","ethSignTypedDataV4Schema","personalSignSchema","ctx","method","isTypedDataV1","isTypedData","TypedDataEncoder","isTypedDataValid","EIP712Domain","types","e","ethSign","typedDataValidationResult","messageDetails","primaryType","messageToDisplay","forwardToRpcNode","rpcError","WalletType","getAddressFromXPub","getEvmAddressFromPubKey","xpub","walletType","pubKeyBuffer","addIdToPromise","promise","reason","settleAllIdPromises","promises","acc","PROXY_API_CONTRACT_TYPE_TO_TOKEN_TYPE","ContractTypeSchema","raw","mapped","ProxyApiTokenSchema","ProxyApiTokensSchema","tokens","getTokens","_network","_customTokens","_fetch","_RpcService","customTokens","coingeckoTokenId","networkToken","tokenService","simplePriceResponse","priceInCurrency","balance","balanceUnit","balanceInCurrency","customTokensOnly","coingeckoPlatformId","erc20TokenList","getTokenWithBalance","tokenBalancePromises","tokenBalancesResults","tokenIds","erc20TokenBalances","tokenBalance","RpcService","findAsync","asyncCallback","found","getBalances","tokenTypes","balanceServices","rpcService","services","resolvedTokenTypes","supportingService","balanceService","balances","nativeTokenPromises","erc20TokenPromises","nftTokenPromises","nativeBalance","avaxMarketData","nativeTokenBalances","nftTokenBalances","balanceOrError","tokenSymbol","balancesOrError","ChainId","DEFAULT_PRESETS","BASE_PRIORITY_FEE_WEI","isCChain","POLYGON_MAINNET_CHAIN_ID","POLYGON_AMOY_CHAIN_ID","isPolygon","POLYGON_GAS_STATION_URL","gweiToWei","gwei","getPolygonGasStationFees","getNetworkFee","caipId","suggestedFees","suggestPriceOptions","lastBlock","baseFeePerGas","gasMultiplier","getGasMultiplier","multiplier","baseFee","maxPriorityFeePerGas","maxFee","lowMaxTip","mediumMaxTip","highMaxTip","respond","multipliers","startCase","isNftTokenType","convertTransactionType","txType","isSender","walletAddress","normalizedWallet","userReceivedNft","userSentNft","receiveLike","sendLike","getTxType","nativeTransaction","erc20Transfers","erc721Transfers","erc1155Transfers","userAddress","nativeOnly","parseRawMethod","isSwap","isNativeSend","isNativeReceive","isNFTPurchase","isApprove","isTransfer","isAirdrop","isUnwrap","isFillOrder","provisionalTxType","isTxSigner","convertMoralisTransaction","timestamp","getMoralisTransactionType","isContractCall","NON_CONTRACT_CALL_CATEGORIES","buildTokens","CATEGORY_TO_TX_TYPE","category","getTransferAddress","trimOrEmpty","shortenHexAddress","getErc20DisplaySymbol","transfer","fromSymbol","fromName","nativeTokens","buildNativeToken","erc20Tokens","buildErc20Token","buildNftToken","buildFallbackNativeToken","displaySymbol","displayName","tokenType","displayAmount","MORALIS_PROXY_BASE_URL","getTransactionsFromMoralis","nextPageToken","offset","chainHex","MORALIS_SUPPORTED_CHAIN_IDS","isMoralisSupportedChain","getSenderInfo","isOutgoingByTxType","isIncomingByTxType","isOutgoing","isIncoming","res","ipfsResolver","CLOUDFLARE_IPFS_URL","ipfsResolverWithFallback","sourceUrl","desiredGatewayPrefix","fetchWithTimeout","uri","getNftMetadata","tokenUri","json","COVALENT_IMG_SIZER","getSmallImageForNFT","imgUrl","imageSize","decimal","amountDisplayValue","erc20Transfer","erc721Transfer","imageUri","getImageUri","erc1155Transfer","metadata","convertTransaction","blockTimestamp","gasPrice","gasUsed","getTransactionsFromGlacier","glacierService","tranasaction","getTransactionsFromHyperEvm","client","page","getPage","normal","erc20","internal","aggregates","aggregate","getAggregate","nativeToken","erc20Token","internalToken","toTransaction","hasNextPage","list","existing","wallet","hasIncoming","hasOutgoing","HYPEREVM_CHAIN_ID","getTransactionHistory","hyperEvmEtherscanClient","NftTokenMetadataStatus","IPFS_URL","_supportedChainIds","_DeBank","baseUrl","chain","tokenBalanceResponse","chainListResponse","DeBankNftTokenListSchema","DeBank","BaseDeBankTokenSchema","DeBankNftTokenSchema","_deBank","_getChainInfo","getChainInfo_fn","_mapNftList","mapNftList_fn","_DeBankService","chainInfo","chainIdString","nativeTokenBalance","tokenUnit","balanceDisplayValue","usdToCurrencyRate","balanceCurrencyDisplayValue","tokenBalances","exchangeRates","nftList","deBankNftList","DeBankService","Erc1155Token","Erc721Token","Glacier","_GlacierUnhealthyError","GlacierUnhealthyError","CHAINS_TO_FILTER","_EvmGlacierService","glacierApiUrl","headers","getAuthHeaders","supportedChains","coingeckoId","entries","tokenlist","tokensWithBalance","convertErc20TokenWithBalanceToTokenWithBalance","convertErc20TokenToTokenWithBalance","pageToken","pageSize","EvmGlacierService","hyperEvmNormalTransactionSchema","hyperEvmErc20TransferSchema","hyperEvmInternalTransactionSchema","resolveFetch","_apiUrl","_list","list_fn","_HyperEvmEtherscanClient","action","HyperEvmEtherscanClient","_glacierService","_deBankService","_approvalController","_blockaid","_runtime","_hyperEvmEtherscanClient","_EvmModule","appInfo","runtime","utilityAddresses","shouldForwardToRpcNode","EvmModule"],"mappings":"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","sourcesContent":["import type { JsonRpcBatchInternal } from '@avalabs/core-wallets-sdk';\nimport {\n parseManifest,\n RpcMethod,\n type ApprovalController,\n type BuildDerivationPathParams,\n type ConstructorParams,\n type DeriveAddressesParams,\n type DeriveAddressesResponse,\n type DeriveAddressParams,\n type DeriveAddressResponse,\n type GetAddressParams,\n type GetAddressResponse,\n type GetBalancesParams,\n type GetBalancesResponse,\n type GetTransactionHistory,\n type Manifest,\n type Module,\n type Network,\n type NetworkFeeParam,\n type NetworkFees,\n type RpcRequest,\n type RuntimeParams,\n} from '@avalabs/vm-module-types';\nimport Blockaid from '@blockaid/client';\nimport { getCoreHeaders, TokenService } from '@internal/utils';\nimport { rpcErrors } from '@metamask/rpc-errors';\nimport ManifestJson from '../manifest.json';\nimport { BLOCKAID_API_KEY } from './constants';\nimport { getEnv } from './env';\nimport { buildDerivationPath } from './handlers/build-derivation-path/build-derivation-path';\nimport { avalancheDeclareAgentIdentity } from './handlers/avalanche-declare-agent-identity/avalanche-declare-agent-identity';\nimport { deriveAddress } from './handlers/derive-address/derive-address';\nimport { deriveAddresses } from './handlers/derive-addresses/derive-addresses';\nimport { ethSendTransactionBatch } from './handlers/eth-send-transaction-batch/eth-send-transaction-batch';\nimport { ethSendTransaction } from './handlers/eth-send-transaction/eth-send-transaction';\nimport { ethSign } from './handlers/eth-sign/eth-sign';\nimport { forwardToRpcNode } from './handlers/forward-to-rpc-node/forward-to-rpc-node';\nimport { getAddress } from './handlers/get-address/get-address';\nimport { getBalances } from './handlers/get-balances/get-balances';\nimport { getNetworkFee } from './handlers/get-network-fee/get-network-fee';\nimport { getTokens } from './handlers/get-tokens/get-tokens';\nimport { getTransactionHistory } from './handlers/get-transaction-history/get-transaction-history';\nimport { DeBankService } from './services/debank-service/debank-service';\nimport { EvmGlacierService } from './services/glacier-service/glacier-service';\nimport { getProvider } from './utils/get-provider';\nimport { supportsBatchApprovals } from './utils/type-utils';\nimport { HyperEvmEtherscanClient } from './services/hyperevm-etherscan-client/hyperevm-etherscan-client';\n\n/** EVM-specific feature toggles, resolved from the consumer's feature-flag source. */\ntype EvmModuleFeatures = {\n encryptedERCs: boolean;\n};\n\n/** EVM module runtime params: the shared ones plus EVM-specific feature toggles. */\ntype EvmRuntimeParams = RuntimeParams & {\n features?: Partial<EvmModuleFeatures>;\n};\n\ntype EvmConstructorParams = Omit<ConstructorParams, 'runtime'> & {\n /**\n * Required: the module's internal Glacier calls (EVM balances, transaction\n * history) go through core-proxy-api, which rejects requests without auth\n * headers (Firebase AppCheck) — so `getAuthHeaders` must be supplied.\n */\n runtime: EvmRuntimeParams & Required<Pick<RuntimeParams, 'getAuthHeaders'>>;\n};\n\nexport class EvmModule implements Module {\n #glacierService: EvmGlacierService;\n #deBankService: DeBankService;\n #proxyApiUrl: string;\n #approvalController: ApprovalController;\n #blockaid: Blockaid;\n #runtime?: EvmRuntimeParams;\n #hyperEvmEtherscanClient: HyperEvmEtherscanClient;\n\n constructor({ approvalController, environment, appInfo, runtime }: EvmConstructorParams) {\n const { glacierApiUrl, proxyApiUrl } = getEnv(environment);\n this.#runtime = runtime;\n this.#glacierService = new EvmGlacierService({\n glacierApiUrl,\n headers: getCoreHeaders(appInfo),\n // Reads #runtime at call time so updateRuntimeParams() is respected.\n getAuthHeaders: async () => this.#runtime?.getAuthHeaders?.(),\n });\n this.#deBankService = new DeBankService({ proxyApiUrl, fetch: this.#runtime?.fetch });\n this.#proxyApiUrl = proxyApiUrl;\n this.#hyperEvmEtherscanClient = new HyperEvmEtherscanClient({\n proxyApiUrl,\n fetch: this.#runtime?.fetch,\n });\n this.#approvalController = approvalController;\n this.#blockaid = new Blockaid({\n baseURL: proxyApiUrl + '/proxy/blockaid/',\n apiKey: BLOCKAID_API_KEY,\n httpAgent: runtime?.httpAgent,\n fetch: runtime?.fetch,\n });\n }\n\n /**\n * Applies a partial update to the module's runtime params, overriding only the\n * provided keys (nested `features` are merged, not replaced). The module is\n * constructed once, so the consumer uses this to push later changes (e.g. flags).\n */\n updateRuntimeParams(params: Partial<EvmRuntimeParams>): void {\n this.#runtime = {\n ...this.#runtime,\n ...params,\n features: {\n ...this.#runtime?.features,\n ...params.features,\n },\n };\n }\n\n getProvider(network: Network): Promise<JsonRpcBatchInternal> {\n return getProvider({\n chainId: network.chainId,\n chainName: network.chainName,\n rpcUrl: network.rpcUrl,\n multiContractAddress: network.utilityAddresses?.multicall,\n pollingInterval: 1000,\n customRpcHeaders: network.customRpcHeaders,\n });\n }\n\n getAddress({ accountIndex, xpub, walletType }: GetAddressParams): Promise<GetAddressResponse> {\n return getAddress({ accountIndex, xpub, walletType });\n }\n\n buildDerivationPath(params: BuildDerivationPathParams) {\n return buildDerivationPath(params);\n }\n\n deriveAddress(params: DeriveAddressParams): Promise<DeriveAddressResponse> {\n return deriveAddress({\n ...params,\n approvalController: this.#approvalController,\n });\n }\n\n deriveAddresses(params: DeriveAddressesParams): Promise<DeriveAddressesResponse> {\n return deriveAddresses({\n ...params,\n approvalController: this.#approvalController,\n });\n }\n\n getBalances({\n addresses,\n network,\n currency,\n customTokens,\n storage,\n tokenTypes,\n customTokensOnly,\n }: GetBalancesParams): Promise<GetBalancesResponse> {\n const tokenService = new TokenService({ storage, proxyApiUrl: this.#proxyApiUrl, fetch: this.#runtime?.fetch });\n return getBalances({\n addresses,\n currency,\n network,\n proxyApiUrl: this.#proxyApiUrl,\n customTokens,\n customTokensOnly,\n balanceServices: [this.#glacierService, this.#deBankService],\n storage,\n tokenTypes,\n tokenService,\n fetch: this.#runtime?.fetch,\n });\n }\n\n getManifest(): Manifest | undefined {\n const result = parseManifest(ManifestJson);\n return result.success ? result.data : undefined;\n }\n\n getNetworkFee(network: NetworkFeeParam): Promise<NetworkFees> {\n const { chainId, chainName, rpcUrl, utilityAddresses, caipId, customRpcHeaders } = network;\n return getNetworkFee({\n chainId,\n chainName,\n rpcUrl,\n multiContractAddress: utilityAddresses?.multicall,\n caipId,\n proxyApiUrl: this.#proxyApiUrl,\n customRpcHeaders,\n });\n }\n\n getTransactionHistory(params: GetTransactionHistory) {\n const { network, address, nextPageToken, offset } = params;\n const { chainId, networkToken, explorerUrl = '' } = network;\n\n return getTransactionHistory({\n chainId,\n networkToken,\n explorerUrl,\n address,\n nextPageToken,\n offset,\n glacierService: this.#glacierService,\n hyperEvmEtherscanClient: this.#hyperEvmEtherscanClient,\n });\n }\n\n getTokens(network: Network) {\n const { chainId } = network;\n return getTokens({ chainId, proxyApiUrl: this.#proxyApiUrl });\n }\n\n async onRpcRequest(request: RpcRequest, network: Network) {\n switch (request.method) {\n case RpcMethod.ETH_SEND_TRANSACTION:\n return ethSendTransaction({\n request,\n network,\n approvalController: this.#approvalController,\n blockaid: this.#blockaid,\n eercEnabled: this.#runtime?.features?.encryptedERCs === true,\n });\n case RpcMethod.ETH_SEND_TRANSACTION_BATCH: {\n if (!supportsBatchApprovals(this.#approvalController)) {\n return {\n error: rpcErrors.methodNotSupported(`Method ${request.method} requires BatchApprovalController`),\n };\n }\n\n return ethSendTransactionBatch({\n request,\n network,\n approvalController: this.#approvalController,\n blockaid: this.#blockaid,\n });\n }\n case RpcMethod.AVALANCHE_DECLARE_AGENT_IDENTITY:\n return avalancheDeclareAgentIdentity({\n request,\n network,\n });\n case RpcMethod.PERSONAL_SIGN:\n case RpcMethod.ETH_SIGN:\n case RpcMethod.SIGN_TYPED_DATA:\n case RpcMethod.SIGN_TYPED_DATA_V1:\n case RpcMethod.SIGN_TYPED_DATA_V3:\n case RpcMethod.SIGN_TYPED_DATA_V4:\n return ethSign({\n request,\n network,\n approvalController: this.#approvalController,\n blockaid: this.#blockaid,\n });\n default:\n if (shouldForwardToRpcNode(request.method)) {\n return forwardToRpcNode(request, network);\n }\n\n return { error: rpcErrors.methodNotSupported(`Method ${request.method} not supported`) };\n }\n }\n}\n\nconst shouldForwardToRpcNode = (method: RpcMethod) => {\n return (\n method.startsWith('eth_') ||\n ['web3_clientVersion', 'web3_sha3', 'net_version', 'net_peerCount', 'net_listening'].includes(method)\n );\n};\n","import {\n VsCurrencyType,\n getBasicCoingeckoHttp,\n simplePrice,\n simpleTokenPrice,\n type SimplePriceParams,\n} from '@avalabs/core-coingecko-sdk';\nimport type { RawSimplePriceResponse, SimplePriceResponse, Storage } from '@avalabs/vm-module-types';\nimport { arrayHash } from '../../utils/array-hash';\nimport { coingeckoRetry } from '../../utils/coingecko-retry';\nimport { CoingeckoProxyClient } from './coingecko-proxy-client';\nimport { WatchlistProxyClient } from './watchlist-proxy-client';\n\ntype FetchFn = typeof globalThis.fetch;\n\ntype ConstructorParams = {\n storage?: Storage;\n proxyApiUrl: string;\n fetch?: FetchFn;\n};\n\nexport class TokenService {\n #storage?: Storage;\n #proxyApiUrl: string;\n #fetchFn: FetchFn;\n #coingeckoBasicClient: ReturnType<typeof getBasicCoingeckoHttp>;\n\n constructor({ storage, proxyApiUrl, fetch }: ConstructorParams) {\n this.#storage = storage;\n this.#proxyApiUrl = proxyApiUrl;\n this.#fetchFn = fetch ?? globalThis.fetch;\n this.#coingeckoBasicClient = getBasicCoingeckoHttp(undefined, this.#fetchFn);\n }\n\n async getWatchlistDataForToken({\n tokenDetails,\n currency = VsCurrencyType.USD,\n }: {\n tokenDetails: {\n symbol: string;\n isNative: boolean;\n caip2Id: string;\n address?: string;\n };\n currency: VsCurrencyType;\n }): Promise<{\n priceInCurrency: number;\n change24: number;\n marketCap: number;\n vol24: number;\n }> {\n const data = (\n await new WatchlistProxyClient(this.#proxyApiUrl).watchlistToken({\n tokens: tokenDetails.symbol,\n currency: currency,\n })\n ).filter((token) => {\n return tokenDetails.isNative\n ? token.internalId === `NATIVE-${tokenDetails.symbol.toLowerCase()}`\n : token.platforms[tokenDetails.caip2Id] === tokenDetails.address;\n });\n\n const [tokenInfo] = data;\n\n if (!tokenInfo) {\n return {\n priceInCurrency: 0,\n change24: 0,\n marketCap: 0,\n vol24: 0,\n };\n }\n\n return {\n priceInCurrency: tokenInfo.current_price ?? 0,\n change24: tokenInfo.price_change_percentage_24h ?? 0,\n marketCap: tokenInfo.market_cap ?? 0,\n vol24: tokenInfo.total_volume ?? 0,\n };\n }\n\n /**\n * Get token price with market data first on coingecko (free tier) directly,\n * if we get 429 error, retry it on coingecko proxy (paid service)\n * @returns token price with market data\n */\n async getSimplePrice({\n coinIds = [],\n currencies = [VsCurrencyType.USD],\n }: SimplePriceParams): Promise<SimplePriceResponse | undefined> {\n let data: SimplePriceResponse | undefined;\n\n const key = coinIds ? `${arrayHash(coinIds)}-${currencies.toString()}` : `${currencies.toString()}`;\n\n const cacheId = `getSimplePrice-${key}`;\n\n data = this.#storage?.get?.<SimplePriceResponse>(cacheId);\n\n if (data) return data;\n\n try {\n data = await coingeckoRetry((useCoingeckoProxy) =>\n this.simplePrice({\n coinIds,\n currencies,\n marketCap: true,\n vol24: true,\n change24: true,\n useCoingeckoProxy,\n }),\n );\n } catch {\n data = undefined;\n }\n this.#storage?.set?.(cacheId, data);\n return data;\n }\n\n /**\n * Get token price with market data for a list of addresses\n * @param tokenAddresses the token addresses\n * @param assetPlatformId The platform id for all the tokens in the list\n * @param currency the currency to be used\n * @returns a list of token price with market data\n */\n async getPricesByAddresses(\n tokenAddresses: string[],\n assetPlatformId: string,\n currency: VsCurrencyType = VsCurrencyType.USD,\n ): Promise<SimplePriceResponse | undefined> {\n let data: SimplePriceResponse | undefined;\n\n const key = `${arrayHash(tokenAddresses)}-${assetPlatformId}-${currency}`;\n\n const cacheId = `getPricesWithMarketDataByAddresses-${key}`;\n data = this.#storage?.get?.<SimplePriceResponse>(cacheId);\n\n if (data) return data;\n\n try {\n data = await coingeckoRetry((useCoingeckoProxy) =>\n this.fetchPricesByAddresses({\n assetPlatformId,\n tokenAddresses,\n currency,\n useCoingeckoProxy,\n }),\n );\n } catch (err) {\n console.error(err);\n data = undefined;\n }\n this.#storage?.set?.(cacheId, data);\n return data;\n }\n\n private async fetchPricesByAddresses({\n assetPlatformId,\n tokenAddresses,\n currency = VsCurrencyType.USD,\n useCoingeckoProxy = false,\n }: {\n assetPlatformId: string;\n tokenAddresses: string[];\n currency: VsCurrencyType;\n useCoingeckoProxy?: boolean;\n }): Promise<SimplePriceResponse> {\n if (useCoingeckoProxy) {\n const rawData = await new CoingeckoProxyClient(this.#proxyApiUrl, this.#fetchFn).simplePriceByContractAddresses({\n id: assetPlatformId,\n contract_addresses: tokenAddresses,\n vs_currencies: [currency],\n include_market_cap: true,\n include_24hr_vol: true,\n include_24hr_change: true,\n });\n return this.transformSimplePriceResponse(rawData, [currency]);\n }\n\n return simpleTokenPrice(this.#coingeckoBasicClient, {\n assetPlatformId,\n tokenAddresses,\n currencies: [currency],\n marketCap: true,\n vol24: true,\n change24: true,\n });\n }\n\n private async simplePrice({\n coinIds = [],\n currencies = [VsCurrencyType.USD],\n marketCap = false,\n vol24 = false,\n change24 = false,\n lastUpdated = false,\n useCoingeckoProxy = false,\n shouldThrow = true,\n }: SimplePriceParams & { useCoingeckoProxy?: boolean }): Promise<SimplePriceResponse> {\n if (useCoingeckoProxy) {\n const rawData = await new CoingeckoProxyClient(this.#proxyApiUrl, this.#fetchFn).simplePrice({\n ids: coinIds,\n vs_currencies: currencies,\n include_market_cap: marketCap,\n include_24hr_vol: vol24,\n include_24hr_change: change24,\n include_last_updated_at: lastUpdated,\n });\n return this.transformSimplePriceResponse(rawData, currencies);\n }\n return simplePrice(this.#coingeckoBasicClient, {\n coinIds,\n currencies,\n marketCap,\n vol24,\n change24,\n lastUpdated,\n shouldThrow,\n });\n }\n\n private transformSimplePriceResponse = (\n data: RawSimplePriceResponse,\n currencies = [VsCurrencyType.USD],\n ): SimplePriceResponse => {\n const formattedData: SimplePriceResponse = {};\n Object.keys(data).forEach((id) => {\n const tokenData = data[id];\n formattedData[id] = {};\n currencies.forEach((currency: VsCurrencyType) => {\n formattedData[id] = {\n [currency]: {\n price: tokenData?.[currency],\n change24: tokenData?.[`${currency}_24h_change`],\n vol24: tokenData?.[`${currency}_24h_vol`],\n marketCap: tokenData?.[`${currency}_market_cap`],\n },\n };\n });\n });\n return formattedData;\n };\n}\n","export function charsum(s: string): number {\n let i,\n sum = 0;\n for (i = 0; i < s.length; i++) {\n sum += s.charCodeAt(i) * (i + 1);\n }\n return sum;\n}\n","import { charsum } from './charsum';\n\n// from https://stackoverflow.com/a/25105589\nexport function arrayHash(array: string[]): string {\n let i,\n sum = 0;\n for (i = 0; i < array.length; i++) {\n const cs = charsum(array[i] ?? '');\n sum = sum + 65027 / cs;\n }\n return ('' + sum).slice(0, 16);\n}\n","const DEFAULT_MAX_RETRIES = 10;\n\ntype RetryParams<T> = {\n operation: (retryIndex: number) => Promise<T>;\n isSuccess: (result: T) => boolean;\n maxRetries?: number;\n backoffPolicy?: RetryBackoffPolicyInterface;\n};\n/*\n * Retries an operation with defined backoff policy.\n *\n * @param operation - The operation to retry.\n * @param isSuccess - The predicate to check if the operation succeeded.\n * @param maxRetries - The maximum number of retries.\n * @param backoffPolicy - Function to generate delay time based on current retry count.\n *\n * @returns The result of the operation.\n * @throws An error if the operation fails after the maximum number of retries.\n *\n * @example\n * const result = await retry(\n * async () => {\n * const response = await fetch('https://example.com')\n * return response.json()\n * },\n * result => result.status === 200\n * )\n */\nexport const retry = async <T>({\n operation,\n isSuccess,\n maxRetries = DEFAULT_MAX_RETRIES,\n backoffPolicy = RetryBackoffPolicy.exponential(),\n}: RetryParams<T>): Promise<T> => {\n let backoffPeriodMillis = 0;\n let retries = 0;\n let lastError: unknown;\n\n while (retries < maxRetries) {\n if (retries > 0) {\n await delay(backoffPeriodMillis);\n }\n\n try {\n const result = await operation(retries);\n\n if (isSuccess(result)) {\n return result;\n }\n } catch (err) {\n // when the operation throws an error, we still retry\n lastError = err;\n }\n\n backoffPeriodMillis = backoffPolicy(retries);\n retries++;\n }\n\n const errorMessage = lastError ? `Max retry exceeded. ${lastError}` : 'Max retry exceeded.';\n\n throw new Error(errorMessage);\n};\n\ntype RetryBackoffPolicyInterface = (retryIndex: number) => number;\n\nexport class RetryBackoffPolicy {\n static exponential(): RetryBackoffPolicyInterface {\n return (retryIndex: number): number => {\n return Math.pow(2, retryIndex) * 1000;\n };\n }\n\n static constant(secondsToDelay: number): RetryBackoffPolicyInterface {\n return (_: number): number => {\n return secondsToDelay * 1000;\n };\n }\n\n static constantMs(msToDelay: number): RetryBackoffPolicyInterface {\n return (_: number): number => {\n return msToDelay;\n };\n }\n\n /**\n * linearThenExponential backoff:\n * - First `linearCount` retries: linear increase by `linearStepMs`\n * - After that: increment grows exponentially based on `linearStepMs`\n * Example (linearCount=4, linearStepMs=1000):\n * 1s, 2s, 3s, 4s, 6s, 10s, 18s, 34s...\n */\n static linearThenExponential(linearCount: number, linearStepMs: number): RetryBackoffPolicyInterface {\n return (retryIndex: number): number => {\n if (retryIndex < linearCount) {\n // Linear phase: (i+1) * step\n return (retryIndex + 1) * linearStepMs;\n }\n // Exponential-increment phase (closed form):\n // n = number of exponential increments applied\n // base = linearCount * step\n // increment sum = 2*step * (2^n - 1)\n const n = retryIndex - linearCount + 1;\n const base = linearCount * linearStepMs;\n const incSum = 2 * linearStepMs * (Math.pow(2, n) - 1);\n return base + incSum;\n };\n }\n}\n\nfunction delay(ms: number) {\n return new Promise((r) => setTimeout(r, ms));\n}\n","import { RetryBackoffPolicy, retry } from './retry';\n\ntype Error = {\n status: {\n error_code: number;\n error_message: string;\n };\n};\n\nexport const coingeckoRetry = <T>(\n operation: (useCoingeckoProxy: boolean) => Promise<T | Error>,\n): Promise<T | undefined> => {\n return retry({\n operation: (retryIndex: number) => operation(retryIndex > 0),\n maxRetries: 2,\n backoffPolicy: RetryBackoffPolicy.constant(1),\n isSuccess: (response: T | Error) => {\n const errorStatus = (response as Error)?.status;\n return errorStatus?.error_code !== 429;\n },\n }) as Promise<T | undefined>;\n};\n","import { RawSimplePriceResponseSchema } from '@avalabs/vm-module-types';\nimport { fetchAndVerify } from '../../utils/fetch-and-verify';\n\nexport class CoingeckoProxyClient {\n constructor(\n private proxyApiUrl: string,\n private fetchFn?: typeof fetch,\n ) {}\n\n simplePrice(params: {\n ids: string[];\n vs_currencies: string[];\n include_market_cap?: boolean;\n include_24hr_vol?: boolean;\n include_24hr_change?: boolean;\n include_last_updated_at?: boolean;\n }) {\n // casting params as any since typing does not allow boolean and other non-string values\n // even though NodeJS does not have this restriction itself: https://nodejs.org/api/url.html#new-urlsearchparamsobj\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const queryParams = new URLSearchParams(params as any);\n return fetchAndVerify(\n [\n `${this.proxyApiUrl}/proxy/coingecko/simple/price?${queryParams}`,\n {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n },\n ],\n RawSimplePriceResponseSchema,\n this.fetchFn,\n );\n }\n\n simplePriceByContractAddresses(params: {\n id: string;\n contract_addresses: string[];\n vs_currencies?: string[];\n include_market_cap?: boolean;\n include_24hr_vol?: boolean;\n include_24hr_change?: boolean;\n }) {\n const { id, ...rawQueryParams } = params;\n\n // casting params as any since typing does not allow boolean and other non-string values\n // even though NodeJS does not have this restriction itself: https://nodejs.org/api/url.html#new-urlsearchparamsobj\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const queryParams = new URLSearchParams(rawQueryParams as any);\n\n return fetchAndVerify(\n [\n `${this.proxyApiUrl}/proxy/coingecko/simple/token_price/${id}?${queryParams}`,\n {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n },\n ],\n RawSimplePriceResponseSchema,\n this.fetchFn,\n );\n }\n}\n","import type { ZodSchema } from 'zod';\nimport z from 'zod';\n\nexport async function fetchAndVerify<T extends ZodSchema>(\n fetchOptions: Parameters<typeof fetch>,\n schema: T,\n fetchFn: typeof fetch = fetch,\n): Promise<z.infer<T>> {\n const response = await fetchFn(...fetchOptions);\n\n if (!response.ok) {\n throw new Error(`Request failed with status ${response.status}`);\n }\n\n const responseJson = await response.json();\n return schema.parse(responseJson);\n}\n","import { fetchAndVerify } from '../../utils/fetch-and-verify';\nimport { z } from 'zod';\n\nconst WatchlistTokenResponseSchema = z.array(\n z.object({\n // the object has more properties than the ones listed here, but we only need these at the moment\n internalId: z.string(),\n id: z.string(),\n symbol: z.string(),\n name: z.string(),\n image: z.string().optional().nullable(),\n current_price: z.number().optional().nullable(),\n price_change_percentage_24h: z.number().optional().nullable(),\n market_cap: z.number().optional().nullable(),\n total_volume: z.number().optional().nullable(),\n platforms: z.record(z.string(), z.string()),\n }),\n);\n\nexport class WatchlistProxyClient {\n constructor(private proxyApiUrl: string) {}\n\n watchlistToken(params: { tokens: string; currency: string }) {\n // casting params as any since typing does not allow boolean and other non-string values\n // even though NodeJS does not have this restriction itself: https://nodejs.org/api/url.html#new-urlsearchparamsobj\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const queryParams = new URLSearchParams(params as any);\n return fetchAndVerify(\n [\n `${this.proxyApiUrl}/watchlist/tokens?${queryParams}`,\n {\n method: 'GET',\n headers: {\n 'Content-Type': 'application/json',\n },\n },\n ],\n WatchlistTokenResponseSchema,\n );\n }\n}\n","import z, { number, object, record, string } from 'zod';\nimport { fetchAndVerify } from '../../utils/fetch-and-verify';\n\nconst CURRENCY_EXCHANGE_RATES_URL =\n 'https://cdn.jsdelivr.net/npm/@fawazahmed0/currency-api@latest/v1/currencies/usd.min.json';\n\nconst CURRENCY_EXCHANGE_RATES_FALLBACK_URL = 'https://latest.currency-api.pages.dev/v1/currencies/usd.min.json';\n\nconst ExchangeRateSchema = object({\n date: string(),\n usd: record(number()),\n});\n\ntype ExchangeRate = z.infer<typeof ExchangeRateSchema>;\n\nexport const getExchangeRates = async (): Promise<ExchangeRate> => {\n try {\n return await fetchAndVerify([CURRENCY_EXCHANGE_RATES_URL], ExchangeRateSchema);\n } catch {\n return await fetchAndVerify([CURRENCY_EXCHANGE_RATES_FALLBACK_URL], ExchangeRateSchema);\n }\n};\n","import {\n type AddressItem,\n type CurrencyItem,\n type NodeIDItem,\n type TextItem,\n type DataItem,\n type DateItem,\n type LinkItemValue,\n DetailItemType,\n type LinkItem,\n type FundsRecipientItem,\n type AddressListItem,\n type NetworkItemValue,\n type NetworkItem,\n} from '@avalabs/vm-module-types';\n\nexport const fundsRecipientItem = (\n address: string,\n amount: bigint,\n maxDecimals: number,\n symbol: string,\n): FundsRecipientItem => ({\n type: DetailItemType.FUNDS_RECIPIENT,\n label: address,\n amount,\n maxDecimals,\n symbol,\n});\n\nexport const currencyItem = (label: string, value: bigint, maxDecimals: number, symbol: string): CurrencyItem => ({\n label,\n type: DetailItemType.CURRENCY,\n value,\n maxDecimals,\n symbol,\n});\n\nexport const textItem = (\n label: string,\n value: string,\n alignment: 'horizontal' | 'vertical' = 'horizontal',\n): TextItem => ({\n label,\n alignment,\n type: DetailItemType.TEXT,\n value,\n});\n\nexport const linkItem = (label: string, value: LinkItemValue): LinkItem => ({\n label,\n value,\n type: DetailItemType.LINK,\n});\n\nexport const addressItem = (label: string, value: string): AddressItem => ({\n label,\n type: DetailItemType.ADDRESS,\n value,\n});\n\nexport const addressListItem = (label: string, value: string[]): AddressListItem => ({\n label,\n type: DetailItemType.ADDRESS_LIST,\n value,\n});\n\nexport const nodeIDItem = (label: string, value: string): NodeIDItem => ({\n label,\n type: DetailItemType.NODE_ID,\n value,\n});\n\nexport const dataItem = (label: string, value: string): DataItem => ({\n label,\n type: DetailItemType.DATA,\n value,\n});\n\nexport const dateItem = (label: string, value: string): DateItem => ({\n label,\n type: DetailItemType.DATE,\n value,\n});\n\nexport const networkItem = (label: string, value: NetworkItemValue): NetworkItem => ({\n label,\n type: DetailItemType.NETWORK,\n value,\n});\n","import { AppName, type AppInfo } from '@avalabs/vm-module-types';\n\nexport const getCoreHeaders = ({ name, version }: AppInfo): Record<string, string> | undefined => {\n switch (name) {\n case AppName.CORE_MOBILE_IOS:\n case AppName.CORE_MOBILE_ANDROID:\n case AppName.CORE_WEB:\n case AppName.CORE_EXTENSION:\n case AppName.EXPLORER:\n return {\n 'x-application-name': name,\n 'x-application-version': version,\n };\n case AppName.OTHER:\n return undefined;\n }\n};\n","export const GLACIER_API_KEY = process.env.GLACIER_API_KEY;\n","import { GLACIER_API_KEY } from '../consts';\n\n// this key is only needed in development to bypass rate limit\n// it should never be used in production\nexport const getGlacierApiKey = (): string | undefined => {\n return GLACIER_API_KEY;\n};\n","import { getGlacierApiKey } from './get-glacier-api-key';\n\n// RPC urls returned in the token list are always using the production URL\nconst knownHosts = [\n 'glacier-api.avax.network',\n 'proxy-api.avax.network',\n 'proxy-api-dev.avax.network',\n 'core-proxy-api.avax.network',\n 'core-proxy-api.avax-test.network',\n];\n\n/**\n * Glacier needs an API key for development, this adds the key if needed.\n */\nexport function addGlacierAPIKeyIfNeeded(url: string): string {\n const urlObj = new URL(url);\n const glacierApiKey = getGlacierApiKey();\n\n if (glacierApiKey && knownHosts.includes(urlObj.hostname)) {\n const search_params = urlObj.searchParams; // copy, does not update the URL\n search_params.set('token', glacierApiKey);\n urlObj.search = search_params.toString();\n return urlObj.toString();\n }\n return url;\n}\n","import {\n ApiError,\n type ApiRequestOptions,\n CancelablePromise,\n FetchHttpRequest,\n type OpenAPIConfig,\n} from '@avalabs/glacier-sdk';\nimport { getGlacierApiKey } from './get-glacier-api-key';\nimport { RetryBackoffPolicy } from './retry';\n\nconst GLOBAL_QUERY_PARAMS: Record<string, string | undefined> = {\n rltoken: getGlacierApiKey(),\n};\n\n/**\n * Custom HTTP request handler that automatically appends the Glacier API key (if present)\n * to bypass rate limits in development environments.\n */\nexport class GlacierFetchHttpRequest extends FetchHttpRequest {\n #failedRequests = 0;\n #getDelay = RetryBackoffPolicy.exponential();\n\n constructor(config: OpenAPIConfig) {\n super(config);\n }\n\n public override request<T>(options: ApiRequestOptions): CancelablePromise<T> {\n // Merge global query parameters with request-specific ones\n const mergedQuery = {\n ...GLOBAL_QUERY_PARAMS,\n ...(options.query || {}), // Request-specific params (override globals if same key)\n };\n\n // Create modified options with merged query\n const modifiedOptions: ApiRequestOptions = {\n ...options,\n query: Object.keys(mergedQuery).length > 0 ? mergedQuery : undefined,\n };\n\n const getRequest = () => super.request<T>(modifiedOptions);\n return this.#failedRequests > 0 ? this.#postponeRequest<T>(getRequest) : this.#request<T>(getRequest);\n }\n\n #request<T>(getRequest: () => CancelablePromise<T>): CancelablePromise<T> {\n const inner = getRequest();\n return new CancelablePromise((resolve, reject, onCancel) => {\n onCancel(() => inner.cancel());\n inner\n .then((response) => {\n this.#failedRequests = 0;\n resolve(response);\n })\n .catch((err) => {\n if (err instanceof ApiError) {\n const isHttpTooManyRequests = err.status === 429;\n const isHttpInternalServerError = err.status >= 500 && err.status < 600;\n this.#failedRequests += Number(isHttpTooManyRequests || isHttpInternalServerError);\n }\n reject(err);\n });\n });\n }\n\n #postponeRequest<T>(getRequest: () => CancelablePromise<T>): CancelablePromise<T> {\n const delay = this.#getDelay(this.#failedRequests);\n return new CancelablePromise<T>((resolve, reject, onCancel) => {\n const timeout = setTimeout(() => {\n const inner = getRequest();\n onCancel(() => {\n inner.cancel();\n clearTimeout(timeout);\n });\n inner.then(resolve).catch(reject);\n }, delay);\n });\n }\n}\n","/**\n * Builds the options object for `rpcErrors.internal()` / `rpcErrors.invalidParams()` etc.\n * Ensures the actual error message appears in the top-level `message` field,\n * which is what viem exposes as `error.details` to dapps.\n */\nexport const rpcErrorOpts = (message: string, cause: unknown) => ({\n message: `${message}${cause instanceof Error ? `: ${cause.message}` : ''}`,\n data: { cause },\n});\n","{\n \"name\": \"EVM\",\n \"description\": \"\",\n \"version\": \"0.0.1\",\n \"sources\": {\n \"module\": {\n \"checksum\": \"\",\n \"location\": {\n \"npm\": {\n \"filePath\": \"dist/index.js\",\n \"packageName\": \"@avalabs/evm-module\",\n \"registry\": \"https://registry.npmjs.org\"\n }\n }\n },\n \"provider\": {\n \"checksum\": \"\",\n \"location\": {\n \"npm\": {\n \"filePath\": \"dist/provider/index.js\",\n \"packageName\": \"@avalabs/evm-module\",\n \"registry\": \"https://registry.npmjs.org\"\n }\n }\n }\n },\n \"network\": {\n \"chainIds\": [],\n \"namespaces\": [\"eip155\"]\n },\n \"cointype\": \"60\",\n \"permissions\": {\n \"rpc\": {\n \"dapps\": true,\n \"methods\": [\n \"personal_sign\",\n \"avalanche_declareAgentIdentity\",\n \"eth_sendTransaction\",\n \"eth_sendTransactionBatch\",\n \"eth_*\",\n \"web3_clientVersion\",\n \"web3_sha3\",\n \"net_version\",\n \"net_peerCount\",\n \"net_listening\"\n ],\n \"nonRestrictedMethods\": [\n \"eth_requestAccounts\",\n \"eth_decrypt\",\n \"eth_getEncryptionPublicKey\",\n \"eth_subscribe\",\n \"eth_unsubscribe\",\n \"eth_blockNumber\",\n \"eth_call\",\n \"eth_chainId\",\n \"eth_coinbase\",\n \"eth_estimateGas\",\n \"eth_feeHistory\",\n \"eth_gasPrice\",\n \"eth_getBalance\",\n \"eth_getBlockByHash\",\n \"eth_getBlockByNumber\",\n \"eth_getBlockTransactionCountByHash\",\n \"eth_getBlockTransactionCountByNumber\",\n \"eth_getCode\",\n \"eth_getFilterChanges\",\n \"eth_getFilterLogs\",\n \"eth_getLogs\",\n \"eth_getProof\",\n \"eth_getStorageAt\",\n \"eth_getTransactionByBlockHashAndIndex\",\n \"eth_getTransactionByBlockNumberAndIndex\",\n \"eth_getTransactionByHash\",\n \"eth_getTransactionCount\",\n \"eth_getTransactionReceipt\",\n \"eth_getUncleCountByBlockHash\",\n \"eth_getUncleCountByBlockNumber\",\n \"eth_newBlockFilter\",\n \"eth_newFilter\",\n \"eth_newPendingTransactionFilter\",\n \"eth_syncing\",\n \"eth_uninstallFilter\",\n \"net_version\",\n \"net_peerCount\",\n \"net_listening\",\n \"web3_sha3\",\n \"web3_clientVersion\"\n ]\n }\n },\n \"manifestVersion\": \"0.1\"\n}\n","export const DEFAULT_DECIMALS = 18;\n\nexport const BLOCKAID_API_KEY = 'DUMMY_API_KEY'; // since we're using our own proxy and api key is handled there, we can use a dummy key here\n","import { Environment } from '@avalabs/vm-module-types';\n\ntype Env = {\n glacierApiUrl: string;\n proxyApiUrl: string;\n};\n\nexport const prodEnv: Env = {\n glacierApiUrl: 'https://core-proxy-api.avax.network/v1/proxy/glacier',\n proxyApiUrl: 'https://proxy-api.avax.network',\n};\n\nexport const devEnv: Env = {\n glacierApiUrl: 'https://core-proxy-api.avax-test.network/v1/proxy/glacier',\n proxyApiUrl: 'https://proxy-api-dev.avax.network',\n};\n\nexport const getEnv = (environment: Environment): Env => {\n switch (environment) {\n case Environment.PRODUCTION:\n return prodEnv;\n case Environment.DEV:\n return devEnv;\n }\n};\n","import { rpcErrors } from '@metamask/rpc-errors';\nimport {\n NetworkVMType,\n type BuildDerivationPathParams,\n type BuildDerivationPathResponse,\n} from '@avalabs/vm-module-types';\n\nexport const buildDerivationPath = ({\n accountIndex,\n derivationPathType,\n}: BuildDerivationPathParams): Pick<BuildDerivationPathResponse, NetworkVMType.EVM> => {\n if (accountIndex < 0) {\n throw rpcErrors.invalidParams('Account index must be a non-negative integer');\n }\n\n switch (derivationPathType) {\n case 'bip44':\n return {\n [NetworkVMType.EVM]: `m/44'/60'/0'/0/${accountIndex}`,\n };\n\n case 'ledger_live':\n return {\n [NetworkVMType.EVM]: `m/44'/60'/${accountIndex}'/0/0`,\n };\n\n default:\n throw rpcErrors.invalidParams(`Unsupported derivation path type: ${derivationPathType}`);\n }\n};\n","import type { Network, RpcRequest } from '@avalabs/vm-module-types';\nimport { rpcErrors } from '@metamask/rpc-errors';\nimport { z } from 'zod';\n\nimport { resolveAgentIdentity } from '../../utils/resolve-agent-identity';\n\nconst schema = z.object({\n agentId: z.coerce.string().regex(/^\\d+$/),\n agentRegistry: z.string().min(1),\n});\n\n/**\n * Prefetch-only helper for agent identity resolution.\n * This does not persist per-dApp state; callers must still pass context.agentIdentity\n * on signing / transaction requests when they want identity shown in approvals.\n */\nexport const avalancheDeclareAgentIdentity = async ({\n request,\n network,\n}: {\n request: RpcRequest;\n network: Network;\n}) => {\n const parsed = schema.safeParse(request.params);\n\n if (!parsed.success) {\n console.error('invalid params', parsed.error);\n return {\n error: rpcErrors.invalidParams({\n message: 'Agent identity params are invalid',\n data: { cause: parsed.error.flatten() },\n }),\n };\n }\n\n return {\n result: await resolveAgentIdentity({\n declaration: parsed.data,\n rpcUrl: network.rpcUrl,\n chainId: network.chainId,\n chainName: network.chainName,\n customRpcHeaders: network.customRpcHeaders,\n }),\n };\n};\n","import type { AgentIdentity, AgentIdentityDeclaration } from '@avalabs/vm-module-types';\nimport { Contract, getAddress, toUtf8String } from 'ethers';\n\nimport { getProvider } from './get-provider';\n\nconst FIVE_MINUTES_MS = 5 * 60 * 1000;\nconst DEFAULT_REPUTATION_REGISTRIES: Record<number, string> = {\n 43114: '0x8004BAa17C55a88189AE136b182e5fdA19dE9b63',\n};\n\nconst IDENTITY_ABI = [\n 'function ownerOf(uint256 tokenId) view returns (address)',\n 'function tokenURI(uint256 tokenId) view returns (string)',\n 'function agentURI(uint256 agentId) view returns (string)',\n 'function getMetadata(uint256 agentId, string metadataKey) view returns (bytes)',\n] as const;\n\nconst REPUTATION_ABI = [\n 'function getSummary(uint256 agentId, address[] clientAddresses, string tag1, string tag2) view returns (uint64 count, int128 summaryValue, uint8 summaryValueDecimals)',\n 'function readAllFeedback(uint256 agentId, address[] clientAddresses, string tag1, string tag2, bool includeRevoked) view returns (address[] clients, uint64[] feedbackIndexes, int128[] values, uint8[] valueDecimals, string[] tag1s, string[] tag2s, bool[] isRevoked)',\n 'function getIdentityRegistry() view returns (address)',\n] as const;\n\ntype IdentityContract = Contract & {\n ownerOf: (tokenId: bigint) => Promise<string>;\n tokenURI: (tokenId: bigint) => Promise<string>;\n agentURI: (agentId: bigint) => Promise<string>;\n getMetadata: (agentId: bigint, metadataKey: string) => Promise<string>;\n};\n\ntype ReputationSummary = {\n count: bigint | number;\n summaryValue: bigint | number;\n summaryValueDecimals: bigint | number;\n};\n\ntype ReputationFeedback = {\n value: bigint | number;\n valueDecimals: bigint | number;\n tag1?: string;\n tag2?: string;\n isRevoked?: boolean;\n};\n\ntype ReputationSummaryTuple = readonly [bigint | number, bigint | number, bigint | number];\ntype ReputationFeedbackTuple = readonly [\n string[],\n (bigint | number)[],\n (bigint | number)[],\n (bigint | number)[],\n string[],\n string[],\n boolean[],\n];\n\ntype ReputationFeedbackResult =\n | ReputationFeedbackTuple\n | {\n clients: string[];\n feedbackIndexes: (bigint | number)[];\n values: (bigint | number)[];\n valueDecimals: (bigint | number)[];\n tag1s: string[];\n tag2s: string[];\n isRevoked: boolean[];\n };\n\ntype ReputationContract = Contract & {\n getIdentityRegistry: () => Promise<string>;\n getSummary: (\n agentId: bigint,\n clientAddresses: string[],\n tag1: string,\n tag2: string,\n ) => Promise<ReputationSummaryTuple | ReputationSummary>;\n readAllFeedback: (\n agentId: bigint,\n clientAddresses: string[],\n tag1: string,\n tag2: string,\n includeRevoked: boolean,\n ) => Promise<ReputationFeedbackResult>;\n};\n\nconst cache = new Map<string, { expiresAt: number; value: AgentIdentity }>();\n\nconst getTrustLevel = (score: number | null): AgentIdentity['trustLevel'] => {\n if (score === null) return 'unknown';\n if (score >= 75) return 'high';\n if (score >= 40) return 'medium';\n return 'low';\n};\n\nconst clampScore = (value: number | null): number | null => {\n if (value === null) return null;\n if (!Number.isFinite(value)) return null;\n return Math.max(0, Math.min(100, Math.trunc(value)));\n};\n\nconst toNumber = (value: bigint | number): number | null => {\n const numeric = typeof value === 'bigint' ? Number(value) : value;\n return Number.isFinite(numeric) ? numeric : null;\n};\n\nconst scaleFixedPoint = (value: bigint | number, decimals: bigint | number): number | null => {\n const numericValue = toNumber(value);\n const numericDecimals = toNumber(decimals);\n\n if (numericValue === null || numericDecimals === null || numericDecimals < 0) {\n return null;\n }\n\n return numericValue / 10 ** numericDecimals;\n};\n\nconst isReputationSummaryTuple = (\n summary: ReputationSummaryTuple | ReputationSummary,\n): summary is ReputationSummaryTuple => Array.isArray(summary);\n\nconst isReputationFeedbackTuple = (feedback: ReputationFeedbackResult): feedback is ReputationFeedbackTuple =>\n Array.isArray(feedback);\n\nconst getSummaryValue = (summary: ReputationSummaryTuple | ReputationSummary): ReputationSummary => {\n if (isReputationSummaryTuple(summary)) {\n return {\n count: summary[0],\n summaryValue: summary[1],\n summaryValueDecimals: summary[2],\n };\n }\n\n return summary;\n};\n\nconst getFeedbackValues = (feedback: ReputationFeedbackResult): ReputationFeedback[] => {\n const values = isReputationFeedbackTuple(feedback) ? feedback[2] : feedback.values;\n const valueDecimals = isReputationFeedbackTuple(feedback) ? feedback[3] : feedback.valueDecimals;\n const tag1s = isReputationFeedbackTuple(feedback) ? feedback[4] : feedback.tag1s;\n const tag2s = isReputationFeedbackTuple(feedback) ? feedback[5] : feedback.tag2s;\n const revoked = isReputationFeedbackTuple(feedback) ? feedback[6] : feedback.isRevoked;\n\n return values.map((value: bigint | number, index: number) => ({\n value,\n valueDecimals: valueDecimals[index] ?? 0,\n tag1: tag1s[index],\n tag2: tag2s[index],\n isRevoked: revoked[index],\n }));\n};\n\nconst averageScores = (scores: Array<number | null>): number | null => {\n const filtered = scores.filter((score): score is number => score !== null);\n if (!filtered.length) return null;\n return filtered.reduce((sum, score) => sum + score, 0) / filtered.length;\n};\n\nconst STARRED_TAG = 'starred';\n\nconst dedupeAddresses = (addresses: string[]): string[] => {\n const seen = new Set<string>();\n const deduped: string[] = [];\n\n for (const address of addresses) {\n try {\n const normalized = getAddress(address);\n if (!seen.has(normalized)) {\n seen.add(normalized);\n deduped.push(normalized);\n }\n } catch {\n continue;\n }\n }\n\n return deduped;\n};\n\nconst getFeedbackClients = (feedback: ReputationFeedbackResult): string[] =>\n isReputationFeedbackTuple(feedback) ? feedback[0] : feedback.clients;\n\nconst resolveReputationScore = async (\n reputationContract: ReputationContract,\n parsedRegistryAddress: string,\n agentId: bigint,\n): Promise<number | null> => {\n try {\n const identityRegistry = getAddress(await reputationContract.getIdentityRegistry());\n if (identityRegistry !== parsedRegistryAddress) {\n return null;\n }\n\n const feedbackResult = await reputationContract.readAllFeedback(agentId, [], STARRED_TAG, '', false);\n const feedback = getFeedbackValues(feedbackResult)\n .filter((entry) => entry.tag1 === undefined || entry.tag1 === STARRED_TAG)\n .filter((entry) => !entry.isRevoked);\n\n const clientAddresses = dedupeAddresses(getFeedbackClients(feedbackResult));\n if (clientAddresses.length) {\n try {\n const summary = getSummaryValue(await reputationContract.getSummary(agentId, clientAddresses, STARRED_TAG, ''));\n const count = toNumber(summary.count);\n if (count) {\n return scaleFixedPoint(summary.summaryValue, summary.summaryValueDecimals);\n }\n } catch {\n // Ignore summary lookup failures and fall back to raw feedback averaging.\n }\n }\n\n return averageScores(feedback.map((entry) => scaleFixedPoint(entry.value, entry.valueDecimals)));\n } catch {\n return null;\n }\n};\n\nconst parseAgentRegistry = (agentRegistry: string) => {\n const [namespace, chainId, address] = agentRegistry.split(':');\n if (namespace !== 'eip155' || !chainId || !address) {\n return null;\n }\n\n const parsedChainId = Number(chainId);\n if (!Number.isInteger(parsedChainId)) {\n return null;\n }\n\n try {\n return { chainId: parsedChainId, address: getAddress(address) };\n } catch {\n return null;\n }\n};\n\nconst buildFallback = (declaration: AgentIdentityDeclaration): AgentIdentity => ({\n agentId: declaration.agentId,\n agentRegistry: declaration.agentRegistry,\n owner: null,\n reputationScore: null,\n metadataUri: null,\n trustLevel: 'unknown',\n});\n\nconst callFirst = async <T>(calls: (() => Promise<T>)[]): Promise<T | null> => {\n const results = await Promise.allSettled(calls.map((call) => call()));\n for (const result of results) {\n if (result.status === 'fulfilled' && result.value != null) {\n return result.value;\n }\n }\n return null;\n};\n\nconst decodeMetadata = (value: string): string | null => {\n if (!value || value === '0x') return null;\n try {\n return toUtf8String(value);\n } catch {\n return null;\n }\n};\n\nexport const resolveAgentIdentity = async ({\n declaration,\n rpcUrl,\n chainId,\n chainName,\n customRpcHeaders,\n}: {\n declaration: AgentIdentityDeclaration;\n rpcUrl: string;\n chainId: number;\n chainName: string;\n customRpcHeaders?: Record<string, string>;\n}): Promise<AgentIdentity> => {\n const cached = cache.get(`${rpcUrl}:${declaration.agentRegistry}:${declaration.agentId}`);\n if (cached && cached.expiresAt > Date.now()) {\n return cached.value;\n }\n\n const parsedRegistry = parseAgentRegistry(declaration.agentRegistry);\n if (!parsedRegistry) {\n return buildFallback(declaration);\n }\n\n if (!/^\\d+$/.test(declaration.agentId)) {\n return buildFallback({\n ...declaration,\n agentRegistry: `eip155:${parsedRegistry.chainId}:${parsedRegistry.address}`,\n });\n }\n\n const normalizedDeclaration = {\n ...declaration,\n agentRegistry: `eip155:${parsedRegistry.chainId}:${parsedRegistry.address}`,\n };\n\n const fallback = buildFallback(normalizedDeclaration);\n\n const provider = await getProvider({\n chainId,\n chainName,\n rpcUrl,\n customRpcHeaders,\n });\n const identityContract = new Contract(parsedRegistry.address, IDENTITY_ABI, provider) as IdentityContract;\n\n const reputationRegistry = DEFAULT_REPUTATION_REGISTRIES[parsedRegistry.chainId];\n const reputationContract = reputationRegistry\n ? (new Contract(reputationRegistry, REPUTATION_ABI, provider) as ReputationContract)\n : null;\n\n const [owner, metadataUri, reputationScore] = await Promise.all([\n callFirst<string | null>([async () => getAddress(await identityContract.ownerOf(BigInt(declaration.agentId)))]),\n callFirst<string | null>([\n async () => await identityContract.tokenURI(BigInt(declaration.agentId)),\n async () => await identityContract.agentURI(BigInt(declaration.agentId)),\n async () => decodeMetadata(await identityContract.getMetadata(BigInt(declaration.agentId), 'agentURI')),\n async () => decodeMetadata(await identityContract.getMetadata(BigInt(declaration.agentId), 'uri')),\n ]),\n reputationContract\n ? resolveReputationScore(reputationContract, parsedRegistry.address, BigInt(declaration.agentId))\n : Promise.resolve(null),\n ]);\n\n const normalizedReputationScore = clampScore(reputationScore ?? null);\n\n const resolved: AgentIdentity = {\n ...fallback,\n owner: owner ?? null,\n metadataUri: metadataUri ?? null,\n reputationScore: normalizedReputationScore,\n trustLevel: getTrustLevel(normalizedReputationScore),\n };\n\n cache.set(`${rpcUrl}:${declaration.agentRegistry}:${declaration.agentId}`, {\n expiresAt: Date.now() + FIVE_MINUTES_MS,\n value: resolved,\n });\n\n return resolved;\n};\n","import { JsonRpcBatchInternal } from '@avalabs/core-wallets-sdk';\nimport { addGlacierAPIKeyIfNeeded } from '@internal/utils';\nimport { FetchRequest, Network as EVMNetwork } from 'ethers';\n\ntype ProviderParams = {\n chainId: number;\n chainName: string;\n rpcUrl: string;\n multiContractAddress?: string;\n pollingInterval?: number;\n customRpcHeaders?: Record<string, string>;\n};\n\nexport const getProvider = async (params: ProviderParams): Promise<JsonRpcBatchInternal> => {\n const { chainId, chainName, rpcUrl, multiContractAddress, pollingInterval = 2000, customRpcHeaders } = params;\n\n const url = addGlacierAPIKeyIfNeeded(rpcUrl);\n let urlOrFetchRequest: string | FetchRequest = url;\n\n if (customRpcHeaders) {\n const fetchRequest = new FetchRequest(url);\n\n for (const [name, value] of Object.entries(customRpcHeaders)) {\n fetchRequest.setHeader(name, value);\n }\n\n urlOrFetchRequest = fetchRequest;\n }\n\n const provider = new JsonRpcBatchInternal(\n { maxCalls: 40, multiContractAddress },\n urlOrFetchRequest,\n new EVMNetwork(chainName, chainId),\n );\n\n provider.pollingInterval = pollingInterval;\n\n return provider;\n};\n","import {\n NetworkVMType,\n type ApprovalController,\n type DeriveAddressParams,\n type DeriveAddressResponse,\n} from '@avalabs/vm-module-types';\nimport { computeAddress } from 'ethers';\n\nimport { hasDerivationDetails } from '@internal/utils/src/utils/address-derivation';\nimport { buildDerivationPath } from '../build-derivation-path/build-derivation-path';\n\nexport const deriveAddress = async (\n params: DeriveAddressParams & { approvalController: ApprovalController },\n): Promise<DeriveAddressResponse> => {\n const { secretId, approvalController } = params;\n\n // When dealing with single-account private keys, we don't need the derivation path any more.\n const derivationPath = hasDerivationDetails(params) ? buildDerivationPath(params).EVM : undefined;\n const publicKeyHex = await approvalController.requestPublicKey({\n curve: 'secp256k1',\n secretId,\n derivationPath,\n });\n\n return {\n [NetworkVMType.EVM]: computeAddress(`0x${publicKeyHex}`), // ApprovalController does not return the 0x prefix\n };\n};\n","import type { DeriveAddressParams, DetailedDeriveAddressParams } from '@avalabs/vm-module-types';\n\nexport const hasDerivationDetails = (params: DeriveAddressParams): params is DetailedDeriveAddressParams =>\n 'derivationPathType' in params &&\n 'accountIndex' in params &&\n typeof params.accountIndex === 'number' &&\n typeof params.derivationPathType === 'string';\n","import {\n NetworkVMType,\n type ApprovalController,\n type DeriveAddressesParams,\n type DeriveAddressesResponse,\n} from '@avalabs/vm-module-types';\nimport { deriveAddressesForEvm, init } from '@avalabs/crypto-sdk';\n\nimport { buildDerivationPath } from '../build-derivation-path/build-derivation-path';\n\nexport const deriveAddresses = async (\n params: DeriveAddressesParams & { approvalController: ApprovalController },\n): Promise<DeriveAddressesResponse> => {\n const { approvalController, secretId, accountIndices, derivationPathType } = params;\n\n if (accountIndices.length === 0) {\n return [];\n }\n\n await init();\n\n const publicKeys = await Promise.all(\n accountIndices.map(async (accountIndex) => {\n const derivationPath = buildDerivationPath({ accountIndex, derivationPathType }).EVM;\n const publicKeyHex = await approvalController.requestPublicKey({\n curve: 'secp256k1',\n secretId,\n derivationPath,\n });\n return Uint8Array.from(Buffer.from(publicKeyHex, 'hex'));\n }),\n );\n\n const addresses = await deriveAddressesForEvm(publicKeys);\n\n return addresses.map((address) => ({ [NetworkVMType.EVM]: address }));\n};\n","import {\n type Network,\n type RpcRequest,\n type DisplayData,\n type BatchApprovalController,\n type Hex,\n} from '@avalabs/vm-module-types';\nimport { rpcErrors } from '@metamask/rpc-errors';\n\nimport { getProvider } from '../../utils/get-provider';\n\nimport { parseRequestParams } from './schema';\nimport { ensureProperNonces } from './utils/ensure-proper-nonces';\nimport { buildTxApprovalRequest } from '../../utils/build-tx-approval-request';\nimport { getTxHash } from '../../utils/get-tx-hash';\nimport { waitForTransactionReceipt } from '../../utils/wait-for-transaction-receipt';\nimport { getTxBatchUpdater } from '../../utils/evm-tx-batch-updater';\nimport { simulateTransactionBatch } from './utils/process-transaction-batch-simulation';\nimport { addressItem, linkItem, networkItem } from '@internal/utils/src/utils/detail-item';\nimport { rpcErrorOpts } from '@internal/utils';\nimport type Blockaid from '@blockaid/client';\nimport { getAgentIdentityFromContext } from '../../utils/get-agent-identity-from-context';\nimport { resolveAgentIdentity } from '../../utils/resolve-agent-identity';\nimport { buildAgentIdentityDetailSection } from '../../utils/build-agent-identity-detail-section';\n\nexport const ethSendTransactionBatch = async ({\n request,\n network,\n approvalController,\n blockaid,\n}: {\n request: RpcRequest;\n network: Network;\n approvalController: BatchApprovalController;\n blockaid: Blockaid;\n}) => {\n const { params } = request;\n const { data: parsedParams, success, error } = parseRequestParams(params);\n\n if (!success) {\n console.error('invalid params', error);\n return {\n error: rpcErrors.invalidParams(rpcErrorOpts('Transaction params are invalid', error)),\n };\n }\n\n const { transactions: transactionRequests, options = {} } = parsedParams;\n const { skipIntermediateTxs = false } = options;\n\n const provider = await getProvider({\n chainId: network.chainId,\n chainName: network.chainName,\n rpcUrl: network.rpcUrl,\n multiContractAddress: network.utilityAddresses?.multicall,\n pollingInterval: 1000,\n customRpcHeaders: network.customRpcHeaders,\n });\n\n // Ensure all transactions in the batch have the nonce set\n try {\n await ensureProperNonces(transactionRequests, provider);\n } catch (error) {\n console.error('Unable to calculate nonce', error);\n return {\n error: rpcErrors.internal(rpcErrorOpts('Unable to calculate nonce', error)),\n };\n }\n\n const allTransactionPayloadsHaveGas = transactionRequests.every((tx) => Number(tx.gas) > 0);\n const { alert, balanceChange, isSimulationSuccessful, tokenApprovals, scans } = await simulateTransactionBatch({\n rpcMethod: request.method,\n chainId: network.chainId,\n params: transactionRequests,\n dAppUrl: request.dappInfo.url,\n provider,\n populateMissingGas: !allTransactionPayloadsHaveGas,\n blockaid,\n });\n const allTransactionsHaveGas = scans.every(({ transaction }) => Number(transaction.gas) > 0);\n\n if (!allTransactionsHaveGas) {\n console.error('Gas limit is missing in some transactions');\n return {\n error: rpcErrors.internal({\n message: 'Gas limit is missing in some transactions',\n }),\n };\n }\n\n const declaration = getAgentIdentityFromContext(request);\n const agentIdentity = declaration\n ? await resolveAgentIdentity({\n declaration,\n rpcUrl: network.rpcUrl,\n chainId: network.chainId,\n chainName: network.chainName,\n customRpcHeaders: network.customRpcHeaders,\n })\n : undefined;\n\n const displayData: DisplayData = {\n title: 'Do you approve these transactions?',\n details: [\n {\n title: 'Transaction Details',\n items: [\n addressItem('Account', transactionRequests[0].from),\n networkItem('Network', {\n name: network.chainName,\n logoUri: network.logoUri,\n }),\n linkItem('Website', request.dappInfo),\n ],\n },\n ...(agentIdentity ? [buildAgentIdentityDetailSection(agentIdentity)] : []),\n ],\n isSimulationSuccessful,\n balanceChange,\n alert,\n tokenApprovals,\n networkFeeSelector: true,\n };\n\n const signingRequests = scans.map((scan) =>\n buildTxApprovalRequest(request, network, scan.transaction, scan, agentIdentity),\n );\n const { cleanup, updateTx } = getTxBatchUpdater(request.requestId, signingRequests, displayData);\n\n const response = await approvalController.requestBatchApproval({ request, signingRequests, displayData, updateTx });\n\n cleanup();\n\n if ('error' in response) {\n return {\n error: response.error,\n };\n }\n\n if (response.result.length !== transactionRequests.length) {\n return {\n error: rpcErrors.internal({\n message: `Invalid number of signatures. Expected ${transactionRequests.length}, got ${response.result.length}`,\n }),\n };\n }\n\n const txHashes: Hex[] = [];\n\n for (const [index, result] of response.result.entries()) {\n const isLast = index === response.result.length - 1;\n const txHash = await getTxHash(provider, result);\n\n // For the last tx: fire-and-forget receipt tracking (for UI callbacks)\n if (isLast) {\n waitForTransactionReceipt({\n explorerUrl: network.explorerUrl ?? '',\n provider,\n txHash,\n onTransactionPending: approvalController.onTransactionPending,\n onTransactionConfirmed: approvalController.onTransactionConfirmed,\n onTransactionReverted: approvalController.onTransactionReverted,\n request,\n });\n }\n\n // For intermediate txs: wait for receipt before broadcasting next (unless skipIntermediateTxs)\n if (!isLast && !skipIntermediateTxs) {\n const isSuccess = await waitForTransactionReceipt({\n explorerUrl: network.explorerUrl ?? '',\n provider,\n txHash,\n onTransactionPending: approvalController.onTransactionPending,\n onTransactionConfirmed: approvalController.onTransactionConfirmed,\n onTransactionReverted: approvalController.onTransactionReverted,\n request,\n });\n\n if (!isSuccess) {\n return {\n error: rpcErrors.internal({\n message: `Transaction ${index + 1} failed! Batch execution stopped`,\n }),\n };\n }\n }\n\n txHashes.push(txHash);\n }\n\n return {\n result: txHashes,\n };\n};\n","import { z } from 'zod';\nimport { transactionSchema } from '../../utils/transaction-schema';\n\nexport const transactionArraySchema = z\n .tuple([transactionSchema, transactionSchema])\n .rest(transactionSchema)\n .refine((transactions) => areAllEqualByProp(transactions, 'chainId'), {\n message: 'All transactions must use the same \"chainId\"',\n })\n .refine((transactions) => areAllEqualByProp(transactions, 'from'), {\n message: 'All transactions must use the same \"from\" address',\n })\n .refine((transactions) => areAllEmptyByProp(transactions, 'nonce') || areAllDifferentByProp(transactions, 'nonce'), {\n message: `Each transaction needs a different \"nonce\". Make them different, or leave them empty for all transactions.`,\n });\n\nexport const batchOptionsSchema = z.object({\n /**\n * When true, skips waiting for intermediate transaction receipts.\n * All transactions are broadcasted immediately without waiting for each to confirm.\n *\n * This is useful for one-click swaps (approve + swap) where we want fast response.\n * The network guarantees ordering via sequential nonces.\n *\n * Default: false (wait for each transaction's receipt before broadcasting the next)\n */\n skipIntermediateTxs: z.boolean().optional(),\n});\n\nexport type BatchOptions = z.infer<typeof batchOptionsSchema>;\n\n/**\n * Support both legacy array format and new object format with options:\n * - Legacy: [tx1, tx2, ...]\n * - New: { transactions: [tx1, tx2, ...], options?: { onlyWaitForLastTx?: boolean } }\n */\nexport const transactionBatchSchema = z.union([\n transactionArraySchema,\n z.object({\n transactions: transactionArraySchema,\n options: batchOptionsSchema.optional(),\n }),\n]);\n\nfunction areAllDifferentByProp<T>(elements: T[], prop: keyof T) {\n return !areAllEqualByProp(elements, prop);\n}\n\nfunction areAllEmptyByProp<T>(elements: T[], prop: keyof T) {\n return elements.every((el) => el[prop] === undefined || el[prop] === '');\n}\n\nfunction areAllEqualByProp<T>(elements: T[], prop: keyof T) {\n const uniqValues = new Set(elements.map((el) => el[prop]));\n\n return uniqValues.size === 1;\n}\n\n/** Input type for batch transaction params - either array or object format */\nexport type TransactionBatchInput = z.input<typeof transactionBatchSchema>;\n\n/** Normalized output after parsing - always has transactions, options is optional */\nexport type ParsedParams = {\n transactions: z.infer<typeof transactionArraySchema>;\n options?: BatchOptions;\n};\n\nexport const parseRequestParams = (params: unknown): z.SafeParseReturnType<TransactionBatchInput, ParsedParams> => {\n const result = transactionBatchSchema.safeParse(params);\n\n if (!result.success) {\n return result;\n }\n\n // Normalize to the new format\n if (Array.isArray(result.data)) {\n return {\n success: true,\n data: {\n transactions: result.data,\n options: {},\n },\n };\n }\n\n return {\n success: true,\n data: {\n transactions: result.data.transactions,\n options: result.data.options ?? {},\n },\n };\n};\n","import { z } from 'zod';\n\nexport const transactionSchema = z.object({\n from: z.string().length(42),\n to: z.string().length(42).optional(),\n data: z.string().optional(),\n value: z.string().startsWith('0x').optional(),\n gas: z.string().startsWith('0x').optional(),\n gasPrice: z.string().startsWith('0x').optional(),\n maxFeePerGas: z.string().startsWith('0x').optional(),\n maxPriorityFeePerGas: z.string().startsWith('0x').optional(),\n nonce: z.string().optional(),\n chainId: z.string().optional().or(z.number().optional()),\n accessList: z\n .array(\n z.object({\n address: z.string().startsWith('0x'),\n storageKeys: z.array(z.string()),\n }),\n )\n .optional(),\n});\n\nexport type TransactionParams = z.infer<typeof transactionSchema>;\n","import { JsonRpcBatchInternal } from '@avalabs/core-wallets-sdk';\n\nexport const getNonce = async ({\n from,\n provider,\n}: {\n from: string;\n provider: JsonRpcBatchInternal;\n}): Promise<number> => {\n return provider.getTransactionCount(from);\n};\n","import type { JsonRpcBatchInternal } from '@avalabs/core-wallets-sdk';\n\nimport { getNonce } from '../../../utils/get-nonce';\nimport type { TransactionBatchParams } from '../../../types';\n\nexport const ensureProperNonces = async (transactions: TransactionBatchParams, provider: JsonRpcBatchInternal) => {\n // The parameters schema ensures all transactions have empty or different nonces,\n // so if we find the first one is populated, we know the rest should be both populated & unique.\n if (transactions[0].nonce) {\n return;\n }\n const nonce = await getNonce({\n from: transactions[0].from,\n provider,\n });\n\n return Promise.all(\n transactions.map(async (transaction, index) => {\n transaction.nonce = String(nonce + index);\n }),\n );\n};\n","import {\n RpcMethod,\n type AgentIdentity,\n type DetailItem,\n type DisplayData,\n type Network,\n type RpcRequest,\n type SigningData,\n type TransactionSimulationResult,\n} from '@avalabs/vm-module-types';\n\nimport { addressItem, linkItem, networkItem, textItem } from '@internal/utils/src/utils/detail-item';\n\nimport { buildAgentIdentityDetailSection } from './build-agent-identity-detail-section';\n\nimport { ERC20TransactionType, TransactionKind } from '../types';\nimport type { TransactionParams } from './transaction-schema';\nimport { parseERC20TransactionType } from './parse-erc20-transaction-type';\nimport { getRecipientAddress } from './get-recipient-address';\nimport { classifyTransaction } from '@src/utils/classify-transaction';\nimport { parseEercTransaction } from './parse-eerc-transaction';\n\nexport const buildTxApprovalRequest = (\n request: RpcRequest,\n network: Network,\n transaction: TransactionParams,\n { isSimulationSuccessful, balanceChange, tokenApprovals, alert }: TransactionSimulationResult,\n agentIdentity?: AgentIdentity,\n eercDisplayEnabled = false,\n) => {\n const { dappInfo } = request;\n const transactionType = parseERC20TransactionType(transaction);\n\n // generate display and signing data\n let title = 'Do you approve this transaction?';\n if (transactionType === ERC20TransactionType.APPROVE) {\n title = 'Do you approve this spend limit?';\n }\n\n const recipientAddress = getRecipientAddress(transaction);\n\n const transactionDetails: DetailItem[] = [\n addressItem('Account', transaction.from),\n networkItem('Network', {\n name: network.chainName,\n logoUri: network.logoUri,\n }),\n linkItem('Website', dappInfo),\n ].filter((item) => !!item);\n\n const transactionClassification = classifyTransaction(transaction);\n\n if (transactionClassification !== TransactionKind.CONTRACT_CALL && recipientAddress) {\n transactionDetails.push(addressItem('To', recipientAddress));\n }\n\n if (\n transaction.to &&\n [TransactionKind.ERC20_TRANSFER, TransactionKind.CONTRACT_CALL].includes(transactionClassification)\n ) {\n transactionDetails.push(addressItem('Contract', transaction.to));\n }\n\n if (eercDisplayEnabled) {\n const eercTransaction = parseEercTransaction(transaction);\n\n if (eercTransaction) {\n transactionDetails.push(textItem('Operation', eercTransaction.operation));\n transactionDetails.push(textItem('Privacy', 'eERC20'));\n }\n }\n\n const displayData: DisplayData = {\n title,\n details: [\n {\n title: 'Transaction Details',\n items: transactionDetails,\n },\n ...(agentIdentity ? [buildAgentIdentityDetailSection(agentIdentity)] : []),\n ],\n networkFeeSelector: true,\n alert,\n balanceChange,\n tokenApprovals,\n isSimulationSuccessful,\n };\n\n const signingData: SigningData = {\n type: RpcMethod.ETH_SEND_TRANSACTION,\n account: transaction.from,\n data: {\n type: 2, // hardcoding to 2 for now as we only support EIP-1559\n nonce: Number(transaction.nonce),\n gasLimit: Number(transaction.gas),\n maxFeePerGas: transaction.maxFeePerGas,\n maxPriorityFeePerGas: transaction.maxPriorityFeePerGas,\n to: transaction.to,\n from: transaction.from,\n data: transaction.data,\n value: transaction.value,\n chainId: transaction.chainId ?? network.chainId,\n accessList: transaction.accessList,\n },\n };\n\n return {\n displayData,\n signingData,\n };\n};\n","import type { AgentIdentity, DetailItem, DetailSection } from '@avalabs/vm-module-types';\nimport { addressItem, linkItem, textItem } from '@internal/utils/src/utils/detail-item';\n\nconst isNavigableMetadataUri = (metadataUri: string) =>\n metadataUri.startsWith('https://') || metadataUri.startsWith('http://') || metadataUri.startsWith('ipfs://');\n\nconst isEmbeddedDataUri = (metadataUri: string) => metadataUri.startsWith('data:');\n\nexport const buildAgentIdentityDetailSection = (agentIdentity: AgentIdentity): DetailSection => {\n const items: DetailItem[] = [\n textItem('Agent ID', agentIdentity.agentId),\n textItem('Registry', agentIdentity.agentRegistry, 'vertical'),\n textItem('Trust level', agentIdentity.trustLevel),\n ];\n\n if (agentIdentity.reputationScore !== null) {\n items.push(textItem('Reputation score', String(agentIdentity.reputationScore)));\n }\n\n if (agentIdentity.owner) {\n items.push(addressItem('Owner', agentIdentity.owner));\n }\n\n if (agentIdentity.metadataUri) {\n items.push(\n isNavigableMetadataUri(agentIdentity.metadataUri)\n ? linkItem('Metadata', { url: agentIdentity.metadataUri, name: agentIdentity.metadataUri })\n : isEmbeddedDataUri(agentIdentity.metadataUri)\n ? textItem('Metadata', 'Embedded data URI', 'vertical')\n : textItem('Metadata', agentIdentity.metadataUri, 'vertical'),\n );\n }\n\n return {\n title: 'Agent Identity',\n items,\n };\n};\n","import type { z } from 'zod';\nimport { TransactionType } from '@avalabs/vm-module-types';\n\nimport type { transactionSchema } from './utils/transaction-schema';\nimport type { transactionArraySchema } from './handlers/eth-send-transaction-batch/schema';\n\nexport const NonContractCallTypes = [\n TransactionType.SEND,\n TransactionType.RECEIVE,\n TransactionType.TRANSFER,\n TransactionType.NFT_SEND,\n TransactionType.NFT_RECEIVE,\n];\n\nexport type TransactionParams = z.infer<typeof transactionSchema>;\n\nexport type RequiredBy<T, K extends keyof T> = T & Required<Pick<T, K>>;\n\nexport type TransactionBatchParams = z.infer<typeof transactionArraySchema>;\n\nexport enum ERC20TransactionType {\n TOTAL_SUPPLY = 'totalSupply',\n BALANCE_OF = 'balanceOf',\n TRANSFER = 'transfer',\n TRANSFER_FROM = 'transferFrom',\n APPROVE = 'approve',\n ALLOWANCE = 'allowance',\n}\n\nexport enum TransactionKind {\n NATIVE_TRANSFER = 'native_transfer',\n ERC20_TRANSFER = 'erc20_transfer',\n CONTRACT_CALL = 'contract_call',\n}\n","import { Interface } from 'ethers';\nimport ERC20 from '@openzeppelin/contracts/build/contracts/ERC20.json';\nimport { ERC20TransactionType } from '../types';\n\nexport const parseERC20TransactionType = (transaction: {\n data?: string;\n value?: string;\n}): ERC20TransactionType | undefined => {\n if (!transaction.data) {\n return undefined;\n }\n\n try {\n const contractInterface = new Interface(ERC20.abi);\n\n const description = contractInterface.parseTransaction({\n data: transaction.data,\n value: transaction.value,\n });\n\n const functionName = description?.name ?? description?.fragment?.name;\n\n if (functionName && isERC20TransactionType(functionName)) {\n return functionName;\n }\n\n return undefined;\n } catch (e) {\n return undefined;\n }\n};\n\nfunction isERC20TransactionType(value: string): value is ERC20TransactionType {\n return Object.values(ERC20TransactionType).includes(value as ERC20TransactionType);\n}\n","import { Interface } from 'ethers';\nimport ERC20 from '@openzeppelin/contracts/build/contracts/ERC20.json';\n\nimport { ERC20TransactionType } from '../types';\nimport type { TransactionParams } from './transaction-schema';\n\n/**\n * Resolves the actual recipient of a transaction.\n *\n * For native transfers the recipient is the transaction's `to` field. For ERC20\n * `transfer`/`transferFrom` calls the `to` field is the token contract, so the real\n * recipient has to be decoded from the calldata using the ERC20 ABI.\n */\nexport const getRecipientAddress = (\n transaction: Pick<TransactionParams, 'to' | 'data' | 'value'>,\n): string | undefined => {\n if (transaction.data) {\n try {\n const iface = new Interface(ERC20.abi);\n const parsed = iface.parseTransaction({ data: transaction.data, value: transaction.value });\n const functionName = parsed?.name ?? parsed?.fragment?.name;\n\n if (functionName === ERC20TransactionType.TRANSFER || functionName === ERC20TransactionType.TRANSFER_FROM) {\n const recipient = parsed?.args['to'];\n if (typeof recipient === 'string') {\n return recipient;\n }\n }\n } catch {\n // Not a parseable ERC20 call; fall back to the transaction's `to`.\n }\n }\n\n return transaction.to;\n};\n","import { ERC20TransactionType, TransactionKind } from '../types';\nimport type { TransactionParams } from './transaction-schema';\nimport { parseERC20TransactionType } from './parse-erc20-transaction-type';\n\n/**\n * Classifies a transaction as a native transfer, an ERC20 transfer or a generic\n * contract call.\n *\n * This is a calldata-based heuristic:\n * - No calldata → native (value) transfer.\n * - Calldata that decodes as ERC20 `transfer`/`transferFrom` → ERC20 transfer.\n * - Any other calldata → contract call.\n *\n * Note: a matching 4-byte selector doesn't guarantee the `to` is a real ERC20\n * token. Verifying that requires an on-chain lookup (e.g. calling `decimals()`).\n */\nexport const classifyTransaction = (transaction: Pick<TransactionParams, 'data' | 'value'>): TransactionKind => {\n const hasCallData = Boolean(transaction.data && transaction.data !== '0x');\n\n if (!hasCallData) {\n return TransactionKind.NATIVE_TRANSFER;\n }\n\n const erc20Type = parseERC20TransactionType(transaction);\n if (erc20Type === ERC20TransactionType.TRANSFER || erc20Type === ERC20TransactionType.TRANSFER_FROM) {\n return TransactionKind.ERC20_TRANSFER;\n }\n\n return TransactionKind.CONTRACT_CALL;\n};\n","import { Interface } from 'ethers';\n\nimport { EERC_ABI } from './eerc-abi';\n\nexport enum EercOperation {\n REGISTER = 'register',\n DEPOSIT = 'deposit',\n TRANSFER = 'transfer',\n WITHDRAW = 'withdraw',\n PRIVATE_MINT = 'privateMint',\n SET_AUDITOR_PUBLIC_KEY = 'setAuditorPublicKey',\n}\n\nconst eercInterface = new Interface(EERC_ABI);\n\n/**\n * Recognizes an eERC (Encrypted ERC) transaction by matching its 4-byte function\n * selector against the bundled eERC ABI. Recognition is interface-based and\n * address-agnostic (there is no canonical eERC contract registry) and performs no\n * network calls. A selector match is a decode hint, not a trust signal.\n */\nexport const parseEercTransaction = (transaction: {\n data?: string;\n value?: string;\n}): { operation: EercOperation } | undefined => {\n if (!transaction.data || transaction.data === '0x') {\n return undefined;\n }\n\n try {\n const description = eercInterface.parseTransaction({\n data: transaction.data,\n value: transaction.value,\n });\n\n const functionName = description?.name ?? description?.fragment?.name;\n\n if (functionName && isEercOperation(functionName)) {\n return { operation: functionName };\n }\n\n return undefined;\n } catch {\n return undefined;\n }\n};\n\nfunction isEercOperation(value: string): value is EercOperation {\n return Object.values(EercOperation).includes(value as EercOperation);\n}\n","// Human-readable ABI fragments for the eERC (Encrypted ERC) operations Core recognizes.\n//\n// Kept local (not pulled from a package): the eERC contracts repo is not published to\n// npm, and the eERC SDK (@avalabs/eerc-sdk) does not export its ABIs and drags in\n// snarkjs/react/wagmi, which I deemed too heavy to pull into this repo.\n//\n// Signatures are transcribed from the canonical sources (pinned commits):\n// EncryptedERC.abi.ts: https://github.com/ava-labs/eerc-sdk/blob/b7cb0a59735e1d28c1aa21dfd18bdc61738c0ca5/src/utils/EncryptedERC.abi.ts\n// Registrar.abi.ts: https://github.com/ava-labs/eerc-sdk/blob/b7cb0a59735e1d28c1aa21dfd18bdc61738c0ca5/src/utils/Registrar.abi.ts\n// Contracts: https://github.com/ava-labs/EncryptedERC/blob/c7eb0e09bc9315e68c35d3c09f5dce4b794d0485/contracts/EncryptedERC.sol\n\nexport const EERC_ABI = [\n // Registrar\n 'function register(((uint256[2],uint256[2][2],uint256[2]),uint256[5]) proof)',\n // EncryptedERC\n 'function setAuditorPublicKey(address user)',\n 'function privateMint(address user, ((uint256[2],uint256[2][2],uint256[2]),uint256[24]) proof)',\n 'function privateMint(address user, ((uint256[2],uint256[2][2],uint256[2]),uint256[24]) proof, bytes message)',\n 'function deposit(uint256 amount, address tokenAddress, uint256[7] amountPCT)',\n 'function deposit(uint256 amount, address tokenAddress, uint256[7] amountPCT, bytes message)',\n 'function transfer(address to, uint256 tokenId, ((uint256[2],uint256[2][2],uint256[2]),uint256[32]) proof, uint256[7] balancePCT)',\n 'function transfer(address to, uint256 tokenId, ((uint256[2],uint256[2][2],uint256[2]),uint256[32]) proof, uint256[7] balancePCT, bytes message)',\n 'function withdraw(uint256 tokenId, ((uint256[2],uint256[2][2],uint256[2]),uint256[16]) proof, uint256[7] balancePCT)',\n 'function withdraw(uint256 tokenId, ((uint256[2],uint256[2][2],uint256[2]),uint256[16]) proof, uint256[7] balancePCT, bytes message)',\n] as const;\n","import type { SigningResult } from '@avalabs/vm-module-types';\nimport type { JsonRpcBatchInternal } from '@avalabs/core-wallets-sdk';\nimport { retry, RetryBackoffPolicy } from '@internal/utils';\n\nexport const getTxHash = async (\n provider: JsonRpcBatchInternal,\n response: SigningResult,\n options?: { shouldRetry?: boolean },\n) => {\n if ('txHash' in response) {\n return response.txHash;\n }\n\n const broadcast = () => provider.send('eth_sendRawTransaction', [response.signedData]);\n\n if (!options?.shouldRetry) {\n return broadcast();\n }\n\n return retry({\n operation: () => broadcast(),\n isSuccess: () => true,\n maxRetries: 6,\n backoffPolicy: RetryBackoffPolicy.linearThenExponential(4, 1000),\n });\n};\n","export function getExplorerAddressByNetwork(\n explorerUrl: string,\n hash: string,\n hashType: 'address' | 'tx' = 'tx',\n): string {\n return `${explorerUrl}/${hashType}/${hash}`;\n}\n","import type { Hex, RpcRequest } from '@avalabs/vm-module-types';\nimport type { JsonRpcBatchInternal } from '@avalabs/core-wallets-sdk';\nimport { getExplorerAddressByNetwork } from '../handlers/get-transaction-history/utils/get-explorer-address-by-network';\nimport type { TransactionReceipt } from 'ethers';\nimport { retry, RetryBackoffPolicy } from '@internal/utils';\n\nexport const waitForTransactionReceipt = async ({\n explorerUrl,\n provider,\n txHash,\n onTransactionPending,\n onTransactionConfirmed,\n onTransactionReverted,\n request,\n}: {\n explorerUrl: string;\n provider: JsonRpcBatchInternal;\n txHash: Hex;\n onTransactionPending: ({\n txHash,\n request,\n explorerLink,\n }: {\n txHash: Hex;\n request: RpcRequest;\n explorerLink: string;\n }) => void;\n onTransactionConfirmed: ({\n txHash,\n explorerLink,\n request,\n }: {\n txHash: Hex;\n explorerLink: string;\n request: RpcRequest;\n }) => void;\n onTransactionReverted: ({ txHash, request }: { txHash: Hex; request: RpcRequest }) => void;\n request: RpcRequest;\n}) => {\n try {\n const explorerLink = getExplorerAddressByNetwork(explorerUrl, txHash);\n onTransactionPending({ txHash, request, explorerLink });\n\n const receipt = await retry<TransactionReceipt | null>({\n operation: async () => provider.getTransactionReceipt(txHash),\n isSuccess: (r): r is TransactionReceipt => !!r, // success when receipt is present (>= 1 confirmation)\n backoffPolicy: RetryBackoffPolicy.linearThenExponential(15, 750),\n maxRetries: 20,\n });\n\n const success = receipt?.status === 1; // 1 indicates success, 0 indicates revert\n\n if (success) {\n onTransactionConfirmed({ txHash, explorerLink, request });\n return true;\n }\n } catch (error) {\n console.error(error);\n }\n\n onTransactionReverted({ txHash, request });\n\n return false;\n};\n","import { rpcErrors } from '@metamask/rpc-errors';\nimport type { DisplayData, EvmTxBatchUpdateFn, SigningData_EthSendTx } from '@avalabs/vm-module-types';\n\ntype SigningRequests = {\n displayData: DisplayData;\n signingData: SigningData_EthSendTx;\n}[];\n\nconst requests = new Map<\n string,\n {\n signingRequests: SigningRequests;\n displayData: DisplayData;\n }\n>();\n\nexport const getTxBatchUpdater = (\n requestId: string,\n signingRequests: SigningRequests,\n displayData: DisplayData,\n): { updateTx: EvmTxBatchUpdateFn; cleanup: () => void } => {\n requests.set(requestId, { signingRequests, displayData });\n\n return {\n updateTx: ({ maxFeeRate, maxTipRate }, txIndex) => {\n const request = requests.get(requestId);\n\n if (!request) {\n throw rpcErrors.resourceNotFound();\n }\n\n const { signingRequests } = request;\n\n const newSigningRequests = signingRequests.map((signingRequest, index) => {\n if (txIndex === undefined || txIndex === index) {\n const { signingData } = signingRequest;\n const newSigningData = {\n ...signingData,\n data: {\n ...signingData.data,\n maxFeePerGas: maxFeeRate ?? signingData.data.maxFeePerGas,\n maxPriorityFeePerGas: maxTipRate ?? signingData.data.maxPriorityFeePerGas,\n },\n };\n\n return { signingData: newSigningData, displayData: signingRequest.displayData };\n }\n\n return signingRequest;\n });\n\n const updatedRequest = { signingRequests: newSigningRequests, displayData };\n\n requests.set(requestId, updatedRequest);\n return updatedRequest;\n },\n cleanup: () => requests.delete(requestId),\n };\n};\n","import {\n AlertType,\n RpcMethod,\n type Alert,\n type BalanceChange,\n type TokenApprovals,\n type TokenDiff,\n type TransactionSimulationResult,\n} from '@avalabs/vm-module-types';\nimport type { JsonRpcBatchInternal } from '@avalabs/core-wallets-sdk';\n\nimport type { TransactionBatchParams, TransactionParams } from '../../../types';\nimport { isEmpty, isNetworkToken } from '../../../utils/type-utils';\nimport { processTransactionSimulation } from '../../../utils/process-transaction-simulation';\nimport { scanTransactionBatch } from '../../../utils/scan-transaction';\nimport { transactionAlerts } from '../../../utils/transaction-alerts';\nimport type Blockaid from '@blockaid/client';\n\nexport const simulateTransactionBatch = async ({\n rpcMethod,\n dAppUrl,\n params,\n chainId,\n provider,\n populateMissingGas,\n blockaid,\n}: {\n rpcMethod: RpcMethod;\n dAppUrl?: string;\n params: TransactionBatchParams;\n chainId: number;\n provider: JsonRpcBatchInternal;\n populateMissingGas?: boolean;\n blockaid: Blockaid;\n}): Promise<\n TransactionSimulationResult & { scans: (TransactionSimulationResult & { transaction: TransactionParams })[] }\n> => {\n let simulationResults;\n\n try {\n simulationResults = await scanTransactionBatch({\n chainId,\n params,\n domain: dAppUrl,\n withGasEstimation: populateMissingGas,\n blockaid,\n });\n } catch (error) {\n console.error('simulateTransactionBatch error', error);\n return {\n isSimulationSuccessful: false,\n alert: transactionAlerts[AlertType.WARNING],\n scans: [],\n };\n }\n\n const scans = await Promise.all(\n simulationResults.map(async (simulationResult, index) => {\n const matchingTx = params[index]!;\n const processedResult = await processTransactionSimulation({\n chainId,\n params: params[index]!,\n provider,\n rpcMethod,\n simulationResult,\n });\n\n if (populateMissingGas && !matchingTx.gas && processedResult.estimatedGasLimit) {\n matchingTx.gas = `0x${processedResult.estimatedGasLimit.toString(16)}`;\n }\n\n return {\n transaction: matchingTx,\n ...processedResult,\n };\n }),\n );\n\n // Make sure `isSimulatioSuccessful` is only true for a batch if all nested transactions were simulated successfully\n const isSimulationSuccessful = scans.every((scan) => scan.isSimulationSuccessful);\n // Make sure the alert in the aggregated view is of the upmost priority (DANGER -> WARNING -> INFO)\n const alert = getHighestAlert(scans);\n const balanceChange = aggregateBalanceChange(scans);\n const tokenApprovals = aggregateTokenApprovals(scans);\n\n return {\n isSimulationSuccessful,\n alert,\n balanceChange,\n tokenApprovals,\n // For now, we're disabling the editing of approvals in the aggregated view since\n // it could disrupt the execution of the entire batch.\n scans: scans.map((scan) => {\n if (!scan.tokenApprovals) {\n return scan;\n }\n\n scan.tokenApprovals.isEditable = false;\n return scan;\n }),\n };\n};\n\nconst getHighestAlert = (scans: { alert?: Alert }[]): Alert | undefined => {\n const alertPrio = {\n [AlertType.INFO]: 0,\n [AlertType.WARNING]: 1,\n [AlertType.DANGER]: 2,\n };\n\n return scans.reduce(\n (highest, { alert }) => {\n if (!alert) return highest;\n if (!highest || alertPrio[alert.type] > alertPrio[highest.type]) {\n return alert;\n }\n return highest;\n },\n undefined as Alert | undefined,\n );\n};\n\nconst aggregateTokenApprovals = (scans: TransactionSimulationResult[]): TokenApprovals | undefined => {\n const tokenApprovals = scans.reduce(\n (aggregatedTokenApprovals, { tokenApprovals }) => {\n if (!tokenApprovals) {\n return aggregatedTokenApprovals;\n }\n\n tokenApprovals.approvals.forEach((appr) => {\n const aggregatedApproval = aggregatedTokenApprovals.approvals.find(\n (aggrApproval) =>\n appr.token.address === aggrApproval.token.address && appr.spenderAddress === aggrApproval.spenderAddress,\n );\n\n if (!aggregatedApproval) {\n aggregatedTokenApprovals.approvals.push({ ...appr });\n return;\n }\n\n // Replace with new values\n aggregatedApproval.value = appr.value;\n aggregatedApproval.usdPrice = appr.usdPrice;\n });\n\n return aggregatedTokenApprovals;\n },\n {\n approvals: [],\n isEditable: false,\n } as TokenApprovals,\n );\n\n clearSpentApprovals(tokenApprovals, scans);\n\n return isEmpty(tokenApprovals) ? undefined : tokenApprovals;\n};\n\nconst aggregateBalanceChange = (scans: TransactionSimulationResult[]): BalanceChange | undefined => {\n const aggregated = scans.reduce(\n (aggregatedBalanceChange, { balanceChange }) => {\n if (!balanceChange) {\n return aggregatedBalanceChange;\n }\n\n balanceChange.ins.forEach((diff) => {\n const aggregatedDiff = findTokenDiff(aggregatedBalanceChange.ins, diff);\n\n if (aggregatedDiff) {\n aggregatedDiff.items.push(...diff.items);\n } else {\n aggregatedBalanceChange.ins.push(diff);\n }\n });\n\n balanceChange.outs.forEach((diff) => {\n const aggregatedDiff = findTokenDiff(aggregatedBalanceChange.outs, diff);\n\n if (aggregatedDiff) {\n aggregatedDiff.items.push(...diff.items);\n } else {\n aggregatedBalanceChange.outs.push({ ...diff });\n }\n });\n\n return aggregatedBalanceChange;\n },\n {\n ins: [],\n outs: [],\n } as BalanceChange,\n );\n\n return isEmpty(aggregated) ? undefined : aggregated;\n};\n\nconst findTokenDiff = (diffs: TokenDiff[], lookupDiff: TokenDiff): TokenDiff | undefined =>\n diffs.find((diff) => {\n if (isNetworkToken(diff.token) && isNetworkToken(lookupDiff.token)) {\n return diff.token.symbol === lookupDiff.token.symbol;\n }\n\n if (!isNetworkToken(diff.token) && !isNetworkToken(lookupDiff.token)) {\n return diff.token.address === lookupDiff.token.address;\n }\n\n return false;\n });\n\nconst clearSpentApprovals = (tokenApprovals: TokenApprovals, scans: TransactionSimulationResult[]) => {\n // Go through each transaction. If the approvals were spent, remove them from the aggregated token approvals:\n for (const approval of tokenApprovals.approvals) {\n for (const scan of scans) {\n if (!scan.isSimulationSuccessful || !scan.balanceChange) {\n continue;\n }\n\n const touchesApproval = scan.balanceChange.outs.some((diff) => {\n return (\n !isNetworkToken(diff.token) &&\n !isNetworkToken(approval.token) &&\n diff.token.address === approval.token.address\n );\n });\n\n if (!touchesApproval) {\n continue;\n }\n\n if (!scan.tokenApprovals) {\n // Allowance was completely spent, remove the approval from aggregated view\n //\n // NOTE: With the current implementation of the BlockAid API, this is just an assumption on our part!\n // It's possible that the next transaction simply does not touch the approval at all.\n // Since we're initially be using this handler for the Swap feature, though, most of the time the allowance\n // will be spent completely.\n //\n // The BlockAid team is working to update their API to provide more accurate data.\n tokenApprovals.approvals = tokenApprovals.approvals.filter(\n (appr) => appr.spenderAddress !== approval.spenderAddress && approval.token.address !== appr.token.address,\n );\n } else {\n const latestApprovalState = scan.tokenApprovals.approvals.find(\n (appr) => appr.spenderAddress === approval.spenderAddress && appr.token.address === approval.token.address,\n );\n\n if (!latestApprovalState) {\n continue;\n }\n approval.usdPrice = latestApprovalState.usdPrice;\n approval.value = latestApprovalState.value;\n }\n }\n }\n};\n","import {\n TokenType,\n type ApprovalController,\n type BalanceChange,\n type BatchApprovalController,\n type ERC1155Token,\n type ERC20Token,\n type ERC721Token,\n type NetworkContractToken,\n type NetworkToken,\n type TokenApprovals,\n} from '@avalabs/vm-module-types';\nimport type { RequiredBy, TransactionParams } from '../types';\n\nexport function isNetworkToken(token: NetworkContractToken | NetworkToken): token is NetworkToken {\n return !('type' in token);\n}\n\nexport function isERC20Token(token: NetworkContractToken): token is ERC20Token {\n return token.type === TokenType.ERC20;\n}\n\nexport function isNftToken(token: NetworkContractToken): token is ERC1155Token | ERC721Token {\n return token.type === TokenType.ERC1155 || token.type === TokenType.ERC721;\n}\n\nexport function hasToField(params: TransactionParams): params is RequiredBy<TransactionParams, 'to'> {\n return typeof params.to === 'string';\n}\n\nexport function supportsBatchApprovals(\n controller: ApprovalController | BatchApprovalController,\n): controller is BatchApprovalController {\n return 'requestBatchApproval' in controller && typeof controller.requestBatchApproval === 'function';\n}\n\nexport function isBalanceChange(input: unknown): input is BalanceChange {\n return (\n typeof input === 'object' &&\n input !== null &&\n 'ins' in input &&\n 'outs' in input &&\n Array.isArray(input.ins) &&\n Array.isArray(input.outs)\n );\n}\n\nexport function isTokenApprovals(input: unknown): input is TokenApprovals {\n return (\n typeof input === 'object' &&\n input !== null &&\n 'approvals' in input &&\n 'isEditable' in input &&\n Array.isArray(input.approvals)\n );\n}\n\nexport function isEmpty(input: unknown): boolean {\n if (isBalanceChange(input)) {\n return input.ins.length === 0 && input.outs.length === 0;\n }\n\n if (isTokenApprovals(input)) {\n return input.approvals.length === 0;\n }\n\n return false;\n}\n","import Blockaid from '@blockaid/client';\nimport type { TransactionParams } from '../types';\nimport {\n type NetworkContractToken,\n type NetworkToken,\n TokenType,\n AlertType,\n type Alert,\n type BalanceChange,\n type TokenApproval,\n type TokenDiff,\n type TokenDiffItem,\n type TokenApprovals,\n type RpcRequest,\n RpcMethod,\n type TransactionSimulationResult,\n} from '@avalabs/vm-module-types';\nimport { balanceToDisplayValue, numberToBN } from '@avalabs/core-utils-sdk';\nimport { isHexString, MaxUint256 } from 'ethers';\nimport { scanJsonRpc, scanTransaction } from './scan-transaction';\nimport type { JsonRpcBatchInternal } from '@avalabs/core-wallets-sdk';\nimport { parseWithErc20Abi } from './parse-erc20-tx';\nimport { hasToField } from './type-utils';\nimport { transactionAlerts } from './transaction-alerts';\n\ntype Erc20ExposureTrace = Blockaid.Evm.AccountSummary.Erc20ExposureTrace;\ntype Erc721ExposureTrace = Blockaid.Evm.AccountSummary.Erc721ExposureTrace;\ntype Erc1155ExposureTrace = Blockaid.Evm.AccountSummary.Erc1155ExposureTrace;\n\n/*\n * Although in the type definition they don't specify it, but for traces they are returning the asset as well:\n * https://docs.blockaid.io/changelog/november-12-2024#account-traces\n * */\ntype ExposureTrace =\n | (Erc20ExposureTrace & { asset: Blockaid.Evm.Erc20TokenDetails })\n | (Erc721ExposureTrace & { asset: Blockaid.Evm.Erc721TokenDetails })\n | (Erc1155ExposureTrace & { asset: Blockaid.Evm.Erc1155TokenDetails });\ntype Trace = Blockaid.Evm.AccountSummary['traces']['0'];\nexport type AssetDiffs = Blockaid.Evm.AccountSummary['assets_diffs'];\n\nexport const simulateTransaction = async ({\n rpcMethod,\n dAppUrl,\n params,\n chainId,\n provider,\n blockaid,\n}: {\n rpcMethod: RpcMethod;\n dAppUrl?: string;\n params: TransactionParams;\n chainId: number;\n provider: JsonRpcBatchInternal;\n blockaid: Blockaid;\n}) => {\n let simulationResult: Pick<Blockaid.TransactionScanResponse, 'simulation' | 'validation'> | undefined;\n\n try {\n simulationResult = await scanTransaction({\n chainId,\n params,\n domain: dAppUrl,\n blockaid,\n });\n } catch (error) {\n console.error('simulateTransaction error', error);\n }\n\n return processTransactionSimulation({ rpcMethod, params, chainId, provider, simulationResult });\n};\n\nexport const processTransactionSimulation = async ({\n rpcMethod,\n params,\n chainId,\n provider,\n simulationResult,\n}: {\n rpcMethod: RpcMethod;\n params: TransactionParams;\n chainId: number;\n provider: JsonRpcBatchInternal;\n simulationResult?: Pick<Blockaid.TransactionScanResponse, 'simulation' | 'validation' | 'gas_estimation'>;\n}): Promise<TransactionSimulationResult> => {\n let alert: Alert | undefined;\n let balanceChange: BalanceChange | undefined;\n let tokenApprovals: TokenApprovals | undefined;\n let isSimulationSuccessful = false;\n let estimatedGasLimit: number | undefined;\n\n if (simulationResult) {\n const { validation, simulation, gas_estimation: gasEstimation } = simulationResult;\n\n // Only surface an alert when Blockaid returns a genuine verdict. A missing\n // validation or `result_type === 'Error'` is not a security signal\n if (validation?.result_type === 'Warning') {\n alert = transactionAlerts[AlertType.WARNING];\n } else if (validation?.result_type === 'Malicious') {\n alert = transactionAlerts[AlertType.DANGER];\n }\n\n if (simulation?.status === 'Success') {\n isSimulationSuccessful = true;\n tokenApprovals = processTokenApprovals(rpcMethod, simulation.account_summary);\n balanceChange = processBalanceChange(simulation.account_summary.assets_diffs);\n }\n\n if (gasEstimation?.status === 'Success') {\n estimatedGasLimit = Number(gasEstimation.estimate);\n }\n }\n\n // If debank parsing failed, check if toAddress is a known ERC20\n if (!isSimulationSuccessful && hasToField(params)) {\n const erc20ParseResult = await parseWithErc20Abi(params, chainId, provider);\n balanceChange = erc20ParseResult.balanceChange;\n tokenApprovals = erc20ParseResult.tokenApprovals;\n }\n\n return { alert, balanceChange, tokenApprovals, isSimulationSuccessful, estimatedGasLimit };\n};\n\nconst isExposureTrace = (trace: Trace): trace is ExposureTrace => {\n return (trace as ExposureTrace).trace_type === 'ExposureTrace';\n};\n\nconst normalizeAddresses = (spender: string, assetAddress: string): string =>\n `${spender.toLowerCase()}.${assetAddress.toLowerCase()}`;\n\nconst mapExposureTracesToSpenderAsset = (traces: Trace[]): Record<string, ExposureTrace> => {\n if (traces === undefined || traces.length === 0) {\n return {};\n }\n\n return traces.reduce(\n (accumulator, trace) => {\n if (!isExposureTrace(trace)) {\n return accumulator;\n }\n return {\n [normalizeAddresses(trace.spender, trace.asset.address)]: trace,\n };\n },\n {} as Record<string, ExposureTrace>,\n );\n};\n\nconst processTokenApprovals = (\n rpcMethod: RpcMethod,\n accountSummary: Blockaid.Evm.AccountSummary,\n): TokenApprovals | undefined => {\n const { traces } = accountSummary;\n\n const mappedExposureTraces = mapExposureTracesToSpenderAsset(traces);\n\n const approvals = Object.entries(mappedExposureTraces)\n .map(([_, trace]) => {\n const token = convertAssetToNetworkContractToken(trace.asset);\n if (!token) {\n return;\n }\n\n const tokenApproval: TokenApproval = {\n token,\n spenderAddress: trace.spender,\n logoUri: token.logoUri,\n };\n\n if (trace.type === 'ERC20ExposureTrace') {\n const {\n exposed: { raw_value, value, usd_price },\n } = trace as Erc20ExposureTrace;\n\n // Only show approval when the spender's exposure increases.\n // Skips retries (0 change) and reduced allowances (negative change).\n if (!value || value <= 0) {\n return;\n }\n\n tokenApproval.value = raw_value;\n tokenApproval.usdPrice = `${usd_price}`;\n }\n\n if (trace.type === 'ERC721ExposureTrace') {\n // When dApp attempts to call setApprovalForAll(), the \"exposed\" field is not present.\n // However, the result of such transaction is that the spender gets approval for all\n // tokens in the NFT collection, so we treat it the same as \"Unlimited\" approval for ERC-20.\n if (!trace.exposed) {\n tokenApproval.value = `0x${MaxUint256.toString(16)}`;\n } else {\n const { usd_price, amount } = trace.exposed;\n\n tokenApproval.value = `${amount}`;\n tokenApproval.usdPrice = `${usd_price}`;\n }\n }\n\n return tokenApproval;\n })\n .filter(Boolean) as TokenApproval[];\n\n if (approvals.length === 0) {\n return undefined;\n }\n\n const isEditable =\n approvals.length === 1 &&\n approvals[0]?.token.type === TokenType.ERC20 &&\n rpcMethod === RpcMethod.ETH_SEND_TRANSACTION;\n\n return { isEditable, approvals };\n};\n\nexport const processBalanceChange = (accountSummaryAssetsDiffs: AssetDiffs): BalanceChange | undefined => {\n const ins = processAssetDiffs(accountSummaryAssetsDiffs, 'in');\n const outs = processAssetDiffs(accountSummaryAssetsDiffs, 'out');\n\n if (ins.length === 0 && outs.length === 0) {\n return undefined;\n }\n\n return { ins, outs };\n};\n\nconst processAssetDiffs = (accountSummaryAssetsDiffs: AssetDiffs, type: 'in' | 'out'): TokenDiff[] => {\n return (\n accountSummaryAssetsDiffs\n .filter((assetDiff) => assetDiff[type].length > 0)\n // sort asset diffs by length of in/out array\n // this is done to ensure that the token with multiple in/out values are displayed last,\n // to put them in groups with appropriate UI(i.e. accordion), after single in/out tokens\n .sort((a, b) => a[type].length - b[type].length)\n .map((assetDiff) => {\n const asset = assetDiff.asset;\n // convert blockaid asset to network token\n const token: NetworkToken | NetworkContractToken | undefined =\n 'address' in asset ? convertAssetToNetworkContractToken(asset) : convertNativeAssetToToken(asset);\n if (!token) {\n return undefined;\n }\n\n const items = assetDiff[type]\n .map((diff) => {\n let displayValue;\n if ('value' in diff && diff.value) {\n if ('decimals' in token) {\n const valueBN = numberToBN(diff.value, token.decimals);\n displayValue = balanceToDisplayValue(valueBN, token.decimals);\n } else if (isHexString(diff.value)) {\n // for some token (like ERC1155) blockaid returns value in hex format\n displayValue = parseInt(diff.value, 16).toString();\n }\n } else if ('type' in token && token.type === TokenType.ERC721) {\n // for ERC721 type token, we just display 1 to indicate that a single NFT will be transferred\n displayValue = '1';\n }\n\n if (!displayValue) {\n return undefined;\n }\n\n const logoUri = 'logo_url' in diff ? diff.logo_url : undefined;\n const tokenId = 'token_id' in diff ? diff.token_id : undefined;\n\n const item: TokenDiffItem = {\n displayValue,\n usdPrice: diff.usd_price,\n ...(logoUri !== undefined && { logoUri }),\n ...(tokenId !== undefined && { tokenId }),\n };\n return item;\n })\n .filter((x): x is TokenDiffItem => x !== undefined);\n\n return { token, items };\n })\n .filter((x): x is TokenDiff => x !== undefined)\n );\n};\n\nconst convertAssetToNetworkContractToken = (\n asset:\n | Blockaid.Erc20TokenDetails\n | Blockaid.Erc1155TokenDetails\n | Blockaid.Erc721TokenDetails\n | Blockaid.NonercTokenDetails,\n): NetworkContractToken | undefined => {\n let token: NetworkContractToken | undefined;\n if (asset.type === 'ERC20') {\n token = {\n type: TokenType.ERC20,\n address: asset.address,\n decimals: asset.decimals,\n name: asset.name ?? asset.symbol ?? '',\n symbol: asset.symbol ?? '',\n logoUri: asset.logo_url,\n };\n } else if (asset.type === 'ERC1155') {\n token = {\n type: TokenType.ERC1155,\n address: asset.address,\n logoUri: asset.logo_url,\n name: asset.name,\n symbol: asset.symbol,\n };\n } else if (asset.type === 'ERC721') {\n token = {\n type: TokenType.ERC721,\n address: asset.address,\n logoUri: asset.logo_url,\n name: asset.name,\n symbol: asset.symbol,\n };\n } else if (asset.type === 'NONERC') {\n token = {\n type: TokenType.NONERC,\n address: asset.address,\n logoUri: asset.logo_url,\n name: asset.name,\n symbol: asset.symbol,\n };\n }\n\n return token;\n};\n\nconst convertNativeAssetToToken = (asset: Blockaid.NativeAssetDetails): NetworkToken => {\n return {\n name: asset.name ?? '',\n symbol: asset.symbol ?? '',\n decimals: asset.decimals,\n description: '',\n logoUri: asset.logo_url,\n };\n};\n\nexport const processJsonRpcSimulation = async ({\n request,\n dAppUrl,\n accountAddress,\n chainId,\n data,\n blockaid,\n}: {\n request: RpcRequest;\n dAppUrl?: string;\n accountAddress: string;\n data: { method: string; params: unknown };\n chainId: number;\n blockaid: Blockaid;\n}) => {\n let alert: Alert | undefined;\n let balanceChange: BalanceChange | undefined;\n let tokenApprovals: TokenApprovals | undefined;\n\n try {\n const { validation, simulation } = await scanJsonRpc({\n chainId,\n accountAddress,\n data: data as Blockaid.Evm.JsonRpcScanParams.Data,\n domain: dAppUrl,\n blockaid,\n });\n\n // Only surface an alert when Blockaid returns a genuine verdict. A missing\n // validation or `result_type === 'Error'` is not a security signal\n if (validation?.result_type === 'Warning') {\n alert = transactionAlerts[AlertType.WARNING];\n } else if (validation?.result_type === 'Malicious') {\n alert = transactionAlerts[AlertType.DANGER];\n }\n\n if (simulation?.status === 'Success') {\n tokenApprovals = processTokenApprovals(request.method, simulation.account_summary);\n balanceChange = processBalanceChange(simulation.account_summary.assets_diffs);\n }\n } catch (error) {\n console.error('processJsonRpcSimulation error', error);\n alert = transactionAlerts[AlertType.WARNING];\n }\n\n return { alert, balanceChange, tokenApprovals };\n};\n","import Blockaid from '@blockaid/client';\nimport type { TransactionBulkScanParams } from '@blockaid/client/resources/evm/transaction-bulk';\n\nimport type { TransactionBatchParams, TransactionParams } from '../types';\n\nexport const scanTransactionBatch = async ({\n chainId,\n params,\n domain,\n withGasEstimation,\n blockaid,\n}: {\n chainId: number;\n params: TransactionBatchParams;\n domain?: string;\n withGasEstimation?: boolean;\n blockaid: Blockaid;\n}): Promise<Blockaid.TransactionScanResponse[]> => {\n const options: TransactionBulkScanParams['options'] = ['validation', 'simulation'];\n\n if (withGasEstimation) {\n options.push('gas_estimation');\n }\n\n return blockaid.evm.transactionBulk.scan({\n chain: chainId.toString(),\n options,\n data: params,\n metadata: (domain && domain.length > 0 ? { domain } : { non_dapp: true }) as Blockaid.Evm.MetadataParam,\n });\n};\n\nexport const scanTransaction = async ({\n chainId,\n params,\n domain,\n blockaid,\n}: {\n chainId: number;\n params: TransactionParams;\n domain?: string;\n blockaid: Blockaid;\n}): Promise<Blockaid.TransactionScanResponse> => {\n return blockaid.evm.transaction.scan({\n account_address: params.from,\n chain: chainId.toString(),\n options: ['validation', 'simulation'],\n data: {\n from: params.from,\n to: params.to,\n data: params.data,\n value: params.value,\n gas: params.gas,\n gas_price: params.gasPrice,\n // TODO: provide accessList once Blockaid supports it\n // access_list: params.accessList\n },\n metadata: (domain && domain.length > 0 ? { domain } : { non_dapp: true }) as Blockaid.Evm.MetadataParam,\n });\n};\n\nexport const scanJsonRpc = async ({\n chainId,\n accountAddress,\n data,\n domain,\n blockaid,\n}: {\n chainId: number;\n accountAddress: string;\n data: Blockaid.Evm.JsonRpcScanParams.Data;\n domain?: string;\n blockaid: Blockaid;\n}): Promise<Blockaid.TransactionScanResponse> => {\n return blockaid.evm.jsonRpc.scan({\n chain: chainId.toString(),\n options: ['validation', 'simulation'],\n account_address: accountAddress,\n data,\n metadata: (domain && domain.length > 0 ? { domain } : { non_dapp: true }) as Blockaid.Evm.MetadataParam,\n });\n};\n","import xss from 'xss';\nimport { ethers } from 'ethers';\nimport { TokenType } from '@avalabs/vm-module-types';\nimport { TokenUnit } from '@avalabs/core-utils-sdk';\nimport ERC20 from '@openzeppelin/contracts/build/contracts/ERC20.json';\nimport type { JsonRpcBatchInternal } from '@avalabs/core-wallets-sdk';\n\nimport { ERC20TransactionType, type RequiredBy, type TransactionParams } from '../types';\n\nexport const parseWithErc20Abi = async (\n params: RequiredBy<TransactionParams, 'to'>,\n chainId: number,\n provider: JsonRpcBatchInternal,\n) => {\n if (!params.data) {\n return {\n tokenApprovals: undefined,\n balanceChange: undefined,\n };\n }\n\n try {\n const contract = new ethers.Contract(params.to, ERC20.abi, provider);\n const contractCalls = await Promise.all([contract.name?.(), contract.symbol?.(), contract.decimals?.()]);\n // Purify the values for XSS protection\n const name = xss(contractCalls[0]);\n const symbol = xss(contractCalls[1]);\n const decimals = parseInt(contractCalls[2]);\n const token = {\n type: TokenType.ERC20,\n name,\n chainId,\n symbol,\n decimals,\n address: params.to,\n contractType: 'ERC-20',\n } as const;\n\n const iface = new ethers.Interface(ERC20.abi);\n const calledFunction = iface.getFunction(params.data.slice(0, 10));\n\n const decodeFunctionData = iface.decodeFunctionData(params.data.slice(0, 10), params.data);\n if (calledFunction?.name === ERC20TransactionType.TRANSFER) {\n return {\n balanceChange: {\n outs: [\n {\n items: [\n {\n displayValue: new TokenUnit(decodeFunctionData['amount'], token.decimals, token.symbol).toDisplay(),\n usdPrice: undefined,\n },\n ],\n token,\n },\n ],\n ins: [],\n },\n };\n } else if (calledFunction?.name === ERC20TransactionType.APPROVE) {\n return {\n tokenApprovals: {\n isEditable: true,\n approvals: [\n {\n token,\n spenderAddress: decodeFunctionData['spender'],\n value: decodeFunctionData['amount'],\n },\n ],\n },\n };\n }\n } catch (error) {\n console.error('parseErc20Tx error', error);\n }\n\n return {\n tokenApprovals: undefined,\n balanceChange: undefined,\n };\n};\n","import { AlertType } from '@avalabs/vm-module-types';\n\nexport const transactionAlerts = {\n [AlertType.WARNING]: {\n type: AlertType.WARNING,\n details: {\n title: 'Suspicious transaction',\n description: 'Use caution, this transaction might be malicious.',\n },\n },\n [AlertType.DANGER]: {\n type: AlertType.DANGER,\n details: {\n title: 'Scam transaction',\n description: 'This transaction has been flagged as malicious, I understand the risk.',\n body: ['This transaction is malicious', 'do not proceed'],\n actionTitles: {\n reject: 'Reject Transaction',\n proceed: 'Proceed Anyway',\n },\n },\n },\n};\n","import type { AgentIdentityDeclaration, RpcRequest } from '@avalabs/vm-module-types';\n\nconst isAgentIdentityDeclaration = (value: unknown): value is AgentIdentityDeclaration => {\n if (!value || typeof value !== 'object') {\n return false;\n }\n\n const candidate = value as Record<string, unknown>;\n return typeof candidate.agentId === 'string' && typeof candidate.agentRegistry === 'string';\n};\n\nexport const getAgentIdentityFromContext = (request: RpcRequest): AgentIdentityDeclaration | null => {\n const candidate = request.context?.agentIdentity;\n return isAgentIdentityDeclaration(candidate) ? candidate : null;\n};\n","import { type Network, type RpcRequest, type ApprovalController } from '@avalabs/vm-module-types';\nimport { rpcErrors } from '@metamask/rpc-errors';\n\nimport { getNonce } from '../../utils/get-nonce';\nimport { getProvider } from '../../utils/get-provider';\nimport { getTxUpdater } from '../../utils/evm-tx-updater';\nimport { estimateGasLimit } from '../../utils/estimate-gas-limit';\nimport { buildTxApprovalRequest } from '../../utils/build-tx-approval-request';\nimport { simulateTransaction } from '../../utils/process-transaction-simulation';\nimport { getAgentIdentityFromContext } from '../../utils/get-agent-identity-from-context';\nimport { resolveAgentIdentity } from '../../utils/resolve-agent-identity';\nimport { rpcErrorOpts } from '@internal/utils';\n\nimport { parseRequestParams } from './schema';\nimport { waitForTransactionReceipt } from '../../utils/wait-for-transaction-receipt';\nimport { getTxHash } from '../../utils/get-tx-hash';\nimport type Blockaid from '@blockaid/client';\n\nexport const ethSendTransaction = async ({\n request,\n network,\n approvalController,\n blockaid,\n eercEnabled = false,\n}: {\n request: RpcRequest;\n network: Network;\n approvalController: ApprovalController;\n blockaid: Blockaid;\n eercEnabled?: boolean;\n}) => {\n const { params } = request;\n\n // validate params\n const { data, error, success } = parseRequestParams(params);\n\n if (!success) {\n console.error('invalid params', error);\n return {\n error: rpcErrors.invalidParams(rpcErrorOpts('Transaction params are invalid', error)),\n };\n }\n\n const [transaction] = data;\n\n const provider = await getProvider({\n chainId: network.chainId,\n chainName: network.chainName,\n rpcUrl: network.rpcUrl,\n multiContractAddress: network.utilityAddresses?.multicall,\n pollingInterval: 1000,\n customRpcHeaders: network.customRpcHeaders,\n });\n\n // calculate gas limit if not provided/invalid\n if (!transaction.gas || Number(transaction.gas) < 0) {\n try {\n const gasLimit = await estimateGasLimit({\n transactionParams: {\n from: transaction.from,\n to: transaction.to,\n data: transaction.data,\n value: transaction.value,\n accessList: transaction.accessList,\n },\n provider,\n });\n\n transaction.gas = '0x' + gasLimit.toString(16);\n } catch (error) {\n return {\n error: rpcErrors.internal(rpcErrorOpts('Unable to calculate gas limit', error)),\n };\n }\n }\n\n // calculate nonce if not provided\n if (!transaction.nonce) {\n try {\n const nonce = await getNonce({\n from: transaction.from,\n provider,\n });\n transaction.nonce = String(nonce);\n } catch (error) {\n return {\n error: rpcErrors.internal(rpcErrorOpts('Unable to calculate nonce', error)),\n };\n }\n }\n\n const declaration = getAgentIdentityFromContext(request);\n const agentIdentity = declaration\n ? await resolveAgentIdentity({\n declaration,\n rpcUrl: network.rpcUrl,\n chainId: network.chainId,\n chainName: network.chainName,\n customRpcHeaders: network.customRpcHeaders,\n })\n : undefined;\n\n const scan = await simulateTransaction({\n rpcMethod: request.method,\n chainId: network.chainId,\n params: transaction,\n dAppUrl: request.dappInfo.url,\n provider,\n blockaid,\n });\n\n const { displayData, signingData } = buildTxApprovalRequest(\n request,\n network,\n transaction,\n scan,\n agentIdentity,\n eercEnabled,\n );\n\n const { updateTx, cleanup } = getTxUpdater(request.requestId, signingData, displayData);\n // prompt user for approval\n const response = await approvalController.requestApproval({ request, displayData, signingData, updateTx });\n\n cleanup();\n\n if ('error' in response) {\n return {\n error: response.error,\n };\n }\n\n let txHash;\n\n // Read shouldRetry AFTER approval, so mutations during approval flow are respected\n const shouldRetry = request.context?.shouldRetry === true;\n\n try {\n txHash = await getTxHash(provider, response, { shouldRetry });\n } catch (error) {\n return {\n error: rpcErrors.internal(rpcErrorOpts('Unable to get transaction hash', error)),\n };\n }\n\n waitForTransactionReceipt({\n explorerUrl: network.explorerUrl ?? '',\n provider,\n txHash,\n onTransactionPending: approvalController.onTransactionPending,\n onTransactionConfirmed: approvalController.onTransactionConfirmed,\n onTransactionReverted: approvalController.onTransactionReverted,\n request,\n });\n\n return { result: txHash };\n};\n","import { rpcErrors } from '@metamask/rpc-errors';\nimport type { DisplayData, EvmTxUpdateFn, SigningData_EthSendTx, TokenApprovals } from '@avalabs/vm-module-types';\n\nimport { ERC20TransactionType } from '../types';\nimport { parseERC20TransactionType } from './parse-erc20-transaction-type';\nimport { encodeApprovalLimit } from './encode-erc20-approval';\n\nconst requests = new Map<string, { displayData: DisplayData; signingData: SigningData_EthSendTx }>();\n\nexport const getTxUpdater = (\n requestId: string,\n signingData: SigningData_EthSendTx,\n displayData: DisplayData,\n): { updateTx: EvmTxUpdateFn; cleanup: () => void } => {\n requests.set(requestId, { signingData, displayData });\n\n return {\n updateTx: ({ maxFeeRate, maxTipRate, approvalLimit, gasLimit }) => {\n const request = requests.get(requestId);\n\n if (!request) {\n throw rpcErrors.resourceNotFound();\n }\n\n const { signingData, displayData } = request;\n\n const newSigningData = {\n ...signingData,\n data: {\n ...signingData.data,\n gasLimit: gasLimit ?? signingData.data.gasLimit,\n maxFeePerGas: maxFeeRate ?? signingData.data.maxFeePerGas,\n maxPriorityFeePerGas: maxTipRate ?? signingData.data.maxPriorityFeePerGas,\n },\n };\n\n const newDisplayData = { ...displayData };\n\n if (typeof approvalLimit === 'string') {\n if (!approvalLimit.startsWith('0x')) {\n throw rpcErrors.invalidInput('Expected approvalLimit to be a hexadecimal number (0x-prefixed)');\n }\n\n const tokenApprovals = displayData.tokenApprovals;\n\n ensureTokenApprovalCanBeEdited(tokenApprovals);\n ensureApproveWasCalled(signingData.data.data);\n\n const approval = tokenApprovals.approvals[0]!;\n\n newSigningData.data.data = encodeApprovalLimit(approval.token.address, approval.spenderAddress, approvalLimit);\n newDisplayData.tokenApprovals = {\n approvals: [\n {\n ...approval,\n value: approvalLimit,\n },\n ],\n isEditable: true,\n };\n }\n\n const updatedRequest = { signingData: newSigningData, displayData: newDisplayData };\n\n requests.set(requestId, updatedRequest);\n\n return updatedRequest;\n },\n cleanup: () => requests.delete(requestId),\n };\n};\n\nfunction ensureTokenApprovalCanBeEdited(\n tokenApprovals?: TokenApprovals,\n): asserts tokenApprovals is TokenApprovals & { isEditable: true } {\n if (!tokenApprovals || !tokenApprovals.isEditable || tokenApprovals.approvals.length !== 1) {\n throw rpcErrors.invalidInput(\n 'Cannot edit the token approval for this request. Please start a new request instead.',\n );\n }\n}\n\nfunction ensureApproveWasCalled(txData?: string | null) {\n const previousMethod = !txData || txData === '0x' ? null : parseERC20TransactionType({ data: txData ?? undefined });\n\n // If original tx was not setting any approvals, do not allow it to be set later on.\n if (previousMethod !== ERC20TransactionType.APPROVE) {\n throw rpcErrors.invalidInput(\n 'Cannot change invoked method for requests in progress. Please start a new request instead.',\n );\n }\n}\n","import { ethers } from 'ethers';\nimport ERC20 from '@openzeppelin/contracts/build/contracts/ERC20.json';\nimport { ERC20TransactionType } from '../types';\n\nexport function encodeApprovalLimit(tokenAddress: string, spenderAddress: string, limit: string) {\n const contract = new ethers.Contract(tokenAddress, ERC20.abi);\n\n return contract.interface.encodeFunctionData(ERC20TransactionType.APPROVE, [spenderAddress, limit]);\n}\n","import { JsonRpcBatchInternal } from '@avalabs/core-wallets-sdk';\nimport type { AccessList, BigNumberish } from 'ethers';\n\nexport const estimateGasLimit = async ({\n transactionParams: { from, to, data, value, accessList },\n provider,\n}: {\n transactionParams: {\n from: string;\n to?: string;\n data?: string;\n value?: BigNumberish;\n accessList?: AccessList;\n };\n provider: JsonRpcBatchInternal;\n}): Promise<number> => {\n const nonce = await provider.getTransactionCount(from);\n\n return Number(\n await provider.estimateGas({\n from,\n to,\n nonce,\n data,\n value,\n accessList,\n }),\n );\n};\n","import { z } from 'zod';\n\nimport { transactionSchema } from '../../utils/transaction-schema';\n\nconst paramsSchema = z.tuple([transactionSchema]);\n\nexport const parseRequestParams = (params: unknown) => {\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 Alert,\n AlertType,\n} from '@avalabs/vm-module-types';\nimport { rpcErrors } from '@metamask/rpc-errors';\nimport { toUtf8String } from 'ethers';\nimport { beautifySimpleMessage, beautifyComplexMessage } from './utils/beautify-message/beautify-message';\nimport { parseRequestParams } from './schemas/parse-request-params/parse-request-params';\nimport { isTypedDataV1 } from './utils/typeguards';\nimport { isTypedDataValid } from './utils/is-typed-data-valid';\nimport { processJsonRpcSimulation } from '../../utils/process-transaction-simulation';\nimport { textItem } from '@internal/utils/src/utils/detail-item';\nimport { rpcErrorOpts } from '@internal/utils';\nimport type Blockaid from '@blockaid/client';\nimport { getAgentIdentityFromContext } from '../../utils/get-agent-identity-from-context';\nimport { resolveAgentIdentity } from '../../utils/resolve-agent-identity';\nimport { buildAgentIdentityDetailSection } from '../../utils/build-agent-identity-detail-section';\n\nexport const ethSign = async ({\n request,\n network,\n approvalController,\n blockaid,\n}: {\n request: RpcRequest;\n network: Network;\n approvalController: ApprovalController;\n blockaid: Blockaid;\n}) => {\n const result = parseRequestParams({ method: request.method, params: request.params });\n\n if (!result.success) {\n console.error('invalid params', result.error);\n\n return {\n success: false,\n error: rpcErrors.invalidParams(rpcErrorOpts('Params are invalid', result.error)),\n };\n }\n const { method, data, address } = result.data;\n\n // validate typed data\n let typedDataValidationResult: ReturnType<typeof isTypedDataValid> | undefined;\n\n if (method === RpcMethod.SIGN_TYPED_DATA_V3 || method === RpcMethod.SIGN_TYPED_DATA_V4) {\n typedDataValidationResult = isTypedDataValid(data);\n }\n\n // generate display data and signing data\n let signingData: SigningData | undefined;\n let messageDetails: string | undefined;\n let alert: Alert | undefined;\n\n if (typedDataValidationResult && !typedDataValidationResult.isValid) {\n alert = {\n type: AlertType.INFO,\n details: {\n title: 'Warning: Verify Message Content',\n description: 'This message contains non-standard elements. Please verify message content!',\n detailedDescription: (typedDataValidationResult.error as Error).toString(),\n },\n };\n }\n\n if (method === RpcMethod.ETH_SIGN) {\n signingData = {\n type: method,\n account: address,\n data: data,\n };\n\n messageDetails = data;\n } else if (method === RpcMethod.PERSONAL_SIGN) {\n signingData = {\n type: method,\n account: address,\n data: data,\n };\n\n messageDetails = toUtf8String(data);\n } else if (method === RpcMethod.SIGN_TYPED_DATA || method === RpcMethod.SIGN_TYPED_DATA_V1) {\n signingData = {\n type: method,\n account: address,\n data: data,\n };\n\n messageDetails = isTypedDataV1(data) ? beautifySimpleMessage(data) : beautifyComplexMessage(data);\n } else if (method === RpcMethod.SIGN_TYPED_DATA_V3 || method === RpcMethod.SIGN_TYPED_DATA_V4) {\n signingData = {\n type: method,\n account: address,\n data: data,\n };\n\n const { types, primaryType, ...messageToDisplay } = data;\n messageDetails = beautifyComplexMessage(messageToDisplay);\n }\n\n if (!signingData || !messageDetails) {\n return {\n success: false,\n error: rpcErrors.internal('Unable to generate signing data'),\n };\n }\n\n const simulationResult = await processJsonRpcSimulation({\n request,\n accountAddress: address,\n chainId: network.chainId,\n data: { method, params: request.params },\n dAppUrl: request.dappInfo.url,\n blockaid,\n });\n\n const declaration = getAgentIdentityFromContext(request);\n const agentIdentity = declaration\n ? await resolveAgentIdentity({\n declaration,\n rpcUrl: network.rpcUrl,\n chainId: network.chainId,\n chainName: network.chainName,\n customRpcHeaders: network.customRpcHeaders,\n })\n : undefined;\n\n const displayData: DisplayData = {\n title: 'Sign Message',\n dAppInfo: {\n name: request.dappInfo.name,\n action: `${request.dappInfo.name} is requesting to sign the following message`,\n logoUri: request.dappInfo.icon,\n },\n network: {\n chainId: network.chainId,\n name: network.chainName,\n logoUri: network.logoUri,\n },\n account: address,\n details: [\n {\n title: 'Message',\n items: [textItem('Message', messageDetails, 'vertical')],\n },\n ...(agentIdentity ? [buildAgentIdentityDetailSection(agentIdentity)] : []),\n ],\n alert: simulationResult?.alert ?? alert,\n balanceChange: simulationResult?.balanceChange,\n tokenApprovals: simulationResult?.tokenApprovals,\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","/* eslint-disable @typescript-eslint/no-explicit-any */\nexport const beautifyComplexMessage = (data: { domain: Record<string, any>; message: Record<string, any> }) => {\n let result = '';\n\n result += 'Domain\\n';\n for (const key in data.domain) {\n result += ` ${key}: ${toUnicodeBold(String(data.domain[key]))}\\n`;\n }\n\n result += '\\nMessage\\n';\n for (const key in data.message) {\n if (typeof data.message[key] === 'object' && !Array.isArray(data.message[key])) {\n result += ` ${key}: \\n`;\n for (const subKey in data.message[key]) {\n if (Array.isArray(data.message[key][subKey])) {\n result += ` ${subKey}: \\n`;\n data.message[key][subKey].forEach((item: any, index: number) => {\n result += ` ${index}: ${toUnicodeBold(item)}\\n`;\n });\n } else {\n result += ` ${subKey}: ${toUnicodeBold(String(data.message[key][subKey]))}\\n`;\n }\n }\n } else if (Array.isArray(data.message[key])) {\n result += ` ${key}: \\n`;\n data.message[key].forEach((item: any, index: number) => {\n result += ` ${index}: \\n`;\n for (const subKey in item) {\n if (Array.isArray(item[subKey])) {\n result += ` ${subKey}: \\n`;\n item[subKey].forEach((item: any, index: number) => {\n result += ` ${index}: ${toUnicodeBold(item)}\\n`;\n });\n } else {\n result += ` ${subKey}: ${toUnicodeBold(String(item[subKey]))}\\n`;\n }\n }\n });\n } else {\n result += ` ${key}: ${toUnicodeBold(String(data.message[key]))}\\n`;\n }\n }\n\n return result;\n};\n\nexport const beautifySimpleMessage = (\n data: {\n name: string;\n type: string;\n value: any;\n }[],\n) => {\n let result = '';\n\n data.forEach((item) => {\n result += `${item.name}:\\n`;\n result += `${toUnicodeBold(String(item.value))}\\n\\n`;\n });\n\n return result;\n};\n\nconst toUnicodeBold = (str: string) => {\n const boldMap: Record<string, string> = {\n '0': '𝟬',\n '1': '𝟭',\n '2': '𝟮',\n '3': '𝟯',\n '4': '𝟰',\n '5': '𝟱',\n '6': '𝟲',\n '7': '𝟳',\n '8': '𝟴',\n '9': '𝟵',\n a: '𝗮',\n b: '𝗯',\n c: '𝗰',\n d: '𝗱',\n e: '𝗲',\n f: '𝗳',\n g: '𝗴',\n h: '𝗵',\n i: '𝗶',\n j: '𝗷',\n k: '𝗸',\n l: '𝗹',\n m: '𝗺',\n n: '𝗻',\n o: '𝗼',\n p: '𝗽',\n q: '𝗾',\n r: '𝗿',\n s: '𝘀',\n t: '𝘁',\n u: '𝘂',\n v: '𝘃',\n w: '𝘄',\n x: '𝘅',\n y: '𝘆',\n z: '𝘇',\n A: '𝗔',\n B: '𝗕',\n C: '𝗖',\n D: '𝗗',\n E: '𝗘',\n F: '𝗙',\n G: '𝗚',\n H: '𝗛',\n I: '𝗜',\n J: '𝗝',\n K: '𝗞',\n L: '𝗟',\n M: '𝗠',\n N: '𝗡',\n O: '𝗢',\n P: '𝗣',\n Q: '𝗤',\n R: '𝗥',\n S: '𝗦',\n T: '𝗧',\n U: '𝗨',\n V: '𝗩',\n W: '𝗪',\n X: '𝗫',\n Y: '𝗬',\n Z: '𝗭',\n };\n\n return str\n .split('')\n .map((char) => boldMap[char] || char)\n .join('');\n};\n","import { z } from 'zod';\nimport { ethSignSchema } from '../eth-sign';\nimport {\n combinedTypedDataSchema,\n ethSignTypedDataSchema,\n ethSignTypedDataV1Schema,\n ethSignTypedDataV3Schema,\n ethSignTypedDataV4Schema,\n typedDataSchema,\n} from '../eth-sign-typed-data';\nimport { personalSignSchema } from '../personal-sign';\nimport { RpcMethod } from '@avalabs/vm-module-types';\n\nconst paramsSchema = z\n .discriminatedUnion('method', [\n personalSignSchema,\n ethSignSchema,\n ethSignTypedDataSchema,\n ethSignTypedDataV1Schema,\n ethSignTypedDataV3Schema,\n ethSignTypedDataV4Schema,\n ])\n .transform((value, ctx) => {\n const { method, params } = value;\n\n switch (method) {\n case RpcMethod.PERSONAL_SIGN:\n return {\n data: params[0],\n address: params[1],\n method,\n };\n case RpcMethod.ETH_SIGN:\n return {\n data: params[1],\n address: params[0],\n method,\n };\n case RpcMethod.SIGN_TYPED_DATA:\n case RpcMethod.SIGN_TYPED_DATA_V1: {\n const address = params[0];\n const data = params[1];\n\n if (typeof data !== 'string') return { data, address, method };\n\n try {\n const parsed = JSON.parse(data);\n const result = combinedTypedDataSchema.parse(parsed);\n\n return {\n data: result,\n address,\n method,\n };\n } catch (e) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: 'param is not a valid json',\n });\n\n return z.NEVER;\n }\n }\n case RpcMethod.SIGN_TYPED_DATA_V3:\n case RpcMethod.SIGN_TYPED_DATA_V4: {\n const address = params[0];\n const data = params[1];\n\n if (typeof data !== 'string') return { data, address, method };\n\n try {\n const parsed = JSON.parse(data);\n const result = typedDataSchema.parse(parsed);\n\n return {\n data: result,\n address,\n method,\n };\n } catch (e) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: 'param is not a valid json',\n });\n\n return z.NEVER;\n }\n }\n }\n });\n\nexport function parseRequestParams(params: { method: RpcMethod; params: unknown }) {\n return paramsSchema.safeParse(params);\n}\n","import { z } from 'zod';\nimport { addressSchema, messageSchema } from './shared';\nimport { RpcMethod } from '@avalabs/vm-module-types';\n\n// https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_sign\nexport const ethSignSchema = z.object({\n method: z.literal(RpcMethod.ETH_SIGN),\n params: z.tuple([addressSchema, messageSchema]),\n});\n","import { z } from 'zod';\n\nexport const messageSchema = z.string().describe('message');\n\nexport const addressSchema = z.string().describe('address');\n","import { z } from 'zod';\nimport { addressSchema } from './shared';\nimport { RpcMethod } from '@avalabs/vm-module-types';\n\n/**\n * For the different eth_signTypedData methods, the payload differs based on the version.\n *\n * V1 is based upon [an early version of EIP-712](https://github.com/ethereum/EIPs/pull/712/commits/21abe254fe0452d8583d5b132b1d7be87c0439ca)\n * that lacked some later security improvements, and should generally be neglected in favor of\n * later versions.\n *\n * V3 is based on [EIP-712](https://eips.ethereum.org/EIPS/eip-712), except that arrays and\n * recursive data structures are not supported.\n *\n * V4 is based on [EIP-712](https://eips.ethereum.org/EIPS/eip-712), and includes full support of\n * arrays and recursive data structures.\n *\n * References:\n * - https://eips.ethereum.org/EIPS/eip-712#specification-of-the-eth_signtypeddata-json-rpc\n * - https://docs.metamask.io/guide/signing-data.html#signtypeddata-v4\n */\nconst messageTypeSchema = z.object({ name: z.string(), type: z.string() });\n\nexport const typedDataSchema = z.object({\n types: z.object({ EIP712Domain: z.array(messageTypeSchema) }).catchall(z.array(messageTypeSchema)),\n primaryType: z.string(),\n domain: z.record(z.any()),\n message: z.record(z.any()),\n});\n\nexport const typedDataV1Schema = z\n .array(\n z.object({\n type: z.string(),\n name: z.string(),\n value: z.union([z.string(), z.number(), z.boolean(), z.object({}).passthrough(), z.array(z.unknown()), z.null()]),\n }),\n )\n .nonempty();\n\nexport const combinedTypedDataSchema = typedDataSchema.or(typedDataV1Schema);\n\nconst dataSchema = z.union([z.string().describe('data string'), typedDataSchema]);\n\nexport const combinedDataSchema = z.union([z.string().describe('data string'), combinedTypedDataSchema]);\n\nexport const ethSignTypedDataSchema = z.object({\n method: z.literal(RpcMethod.SIGN_TYPED_DATA),\n params: z.tuple([addressSchema, combinedDataSchema]),\n});\n\nexport const ethSignTypedDataV1Schema = z.object({\n method: z.literal(RpcMethod.SIGN_TYPED_DATA_V1),\n params: z.tuple([addressSchema, combinedDataSchema]),\n});\n\nexport const ethSignTypedDataV3Schema = z.object({\n method: z.literal(RpcMethod.SIGN_TYPED_DATA_V3),\n params: z.tuple([addressSchema, dataSchema]),\n});\n\nexport const ethSignTypedDataV4Schema = z.object({\n method: z.literal(RpcMethod.SIGN_TYPED_DATA_V4),\n params: z.tuple([addressSchema, dataSchema]),\n});\n","import { z } from 'zod';\nimport { addressSchema, messageSchema } from './shared';\nimport { RpcMethod } from '@avalabs/vm-module-types';\n\n// https://github.com/ethereum/go-ethereum/pull/2940\nexport const personalSignSchema = z.object({\n method: z.literal(RpcMethod.PERSONAL_SIGN),\n params: z.union([\n z.tuple([messageSchema, addressSchema]),\n z.tuple([messageSchema, addressSchema, z.string().optional().describe('password')]),\n ]),\n});\n","import type { TypedDataV1, TypedData, MessageTypes } from '@avalabs/vm-module-types';\nimport { typedDataSchema, typedDataV1Schema } from '../schemas/eth-sign-typed-data';\n\nexport const isTypedDataV1 = (data: unknown): data is TypedDataV1 => {\n return typedDataV1Schema.safeParse(data).success;\n};\n\nexport const isTypedData = (data: unknown): data is TypedData<MessageTypes> => {\n return typedDataSchema.safeParse(data).success;\n};\n","import { type TypedData, type MessageTypes } from '@avalabs/vm-module-types';\nimport { TypedDataEncoder } from 'ethers';\n\ntype Result = { isValid: true } | { isValid: false; error: unknown };\n\nexport const isTypedDataValid = (data: TypedData<MessageTypes>): Result => {\n try {\n // getPayload verifies the types and the content of the message throwing an error if the data is not valid.\n // We don't want to immediately reject the request even if there are errors for compatiblity reasons.\n // dApps tend to make small mistakes in the message format like leaving the verifyingContract emptry,\n // in which cases we should be able to continue just like other wallets do (even if it's technically incorrect).\n\n // remove EIP712Domain from types since ethers.js handles it separately\n const { EIP712Domain, ...types } = data.types;\n TypedDataEncoder.getPayload(data.domain, types, data.message);\n\n return {\n isValid: true,\n };\n } catch (e) {\n return {\n isValid: false,\n error: e,\n };\n }\n};\n","import type { Network, RpcRequest } from '@avalabs/vm-module-types';\nimport { rpcErrors } from '@metamask/rpc-errors';\nimport { getProvider } from '../../utils/get-provider';\n\nexport const forwardToRpcNode = async (request: RpcRequest, network: Network) => {\n try {\n // IMPORTANT: do NOT pass `multiContractAddress` here. It makes the provider\n // transparently re-route eth_calls through Multicall3's `aggregate`, which\n // rewrites `msg.sender` to the Multicall3 contract. For dApp reads that depend\n // on the caller (e.g. Uniswap-style `collect`, permit/allowance checks,\n // owner-gated views) that breaks the call — it reverts as \"Multicall3: call\n // failed\" even though the same call succeeds as a direct eth_call with the\n // dApp-provided `from`. We are a verbatim passthrough for dApp requests, so\n // each call must hit the node as-is to preserve caller semantics.\n const provider = await getProvider({\n chainId: network.chainId,\n chainName: network.chainName,\n rpcUrl: network.rpcUrl,\n pollingInterval: 1000,\n customRpcHeaders: network.customRpcHeaders,\n });\n\n const response = await provider.send(request.method, request.params as unknown[]);\n return { result: response };\n } catch (error) {\n // For read methods we are a transparent RPC passthrough, so relay the node's\n // original JSON-RPC error verbatim — its `code` (e.g. 3 = execution reverted),\n // `message` and revert `data`. ethers stores that raw payload under\n // `error.info.error` for a reverted call. Re-coding it as a generic internal\n // error (-32603) or stripping `data`/`code` makes dApps treat an *expected*\n // revert (e.g. eth_call/eth_estimateGas fee & quote simulations) as a fatal\n // failure instead of decoding the revert reason like a direct RPC connection\n // would.\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const rpcError = (error as any).info?.error ?? (error as any).error;\n if (rpcError && typeof rpcError.code === 'number') {\n return { error: rpcError };\n }\n\n return { error: rpcErrors.internal((error as Error).message) };\n }\n};\n","import { NetworkVMType, WalletType, type GetAddressParams, type GetAddressResponse } from '@avalabs/vm-module-types';\nimport { getAddressFromXPub, getEvmAddressFromPubKey } from '@avalabs/core-wallets-sdk';\nimport { rpcErrors } from '@metamask/rpc-errors';\n\ntype GetAddress = Omit<GetAddressParams, 'isTestnet' | 'xpubXP'>;\n\nexport const getAddress = async ({ accountIndex, xpub, walletType }: GetAddress): Promise<GetAddressResponse> => {\n switch (walletType) {\n case WalletType.Mnemonic:\n case WalletType.Ledger:\n case WalletType.Keystone: {\n return {\n [NetworkVMType.EVM]: getAddressFromXPub(xpub, accountIndex),\n };\n }\n case WalletType.LedgerLive:\n case WalletType.Seedless: {\n const pubKeyBuffer = Buffer.from(xpub, 'hex');\n return {\n [NetworkVMType.EVM]: getEvmAddressFromPubKey(pubKeyBuffer),\n };\n }\n default:\n throw rpcErrors.invalidParams(`Unsupported wallet type: ${walletType}`);\n }\n};\n","import type { VsCurrencyType } from '@avalabs/core-coingecko-sdk';\nimport type { CurrencyCode } from '@avalabs/glacier-sdk';\nimport {\n type Error,\n type GetBalancesParams,\n type NetworkTokenWithBalance,\n type NftTokenWithBalance,\n type Storage,\n TokenType,\n type TokenWithBalanceEVM,\n} from '@avalabs/vm-module-types';\nimport type { TokenService } from '@internal/utils';\nimport { RpcService } from '../../services/rpc-service/rpc-service';\nimport { findAsync } from '../../utils/find-async';\nimport { addIdToPromise, type IdPromise, settleAllIdPromises } from '../../utils/id-promise';\nimport { isERC20Token } from '../../utils/type-utils';\nimport type { BalanceServiceInterface } from './balance-service-interface';\n\ntype AccountAddress = string;\ntype TokenSymbol = string;\ntype GetEvmBalancesResponse = Record<AccountAddress, Record<TokenSymbol, TokenWithBalanceEVM | Error> | Error>;\n\nexport const getBalances = async ({\n addresses,\n currency,\n network,\n proxyApiUrl,\n tokenTypes = [TokenType.NATIVE, TokenType.ERC20, TokenType.ERC721, TokenType.ERC1155],\n customTokens = [],\n customTokensOnly = false,\n storage,\n balanceServices = [],\n tokenService,\n fetch,\n}: GetBalancesParams & {\n proxyApiUrl: string;\n balanceServices: BalanceServiceInterface[];\n storage?: Storage;\n tokenService: TokenService;\n fetch?: typeof globalThis.fetch;\n}): Promise<GetEvmBalancesResponse> => {\n const chainId = network.chainId;\n // When only custom tokens are requested we bypass indexed providers (which\n // return a zero-balance polyfill for tokens they don't index) and query the\n // chain directly via RPC to get the real on-chain balances.\n const rpcService = new RpcService({ network, storage, proxyApiUrl, customTokens, fetch });\n const services: BalanceServiceInterface[] = customTokensOnly ? [rpcService] : [...balanceServices, rpcService];\n\n const resolvedTokenTypes = customTokensOnly ? [TokenType.ERC20] : tokenTypes;\n\n const supportingService: BalanceServiceInterface | undefined = await findAsync(\n services,\n (balanceService: BalanceServiceInterface) => balanceService.isNetworkSupported(network.chainId),\n );\n\n const balances: GetEvmBalancesResponse = {};\n if (supportingService) {\n const nativeTokenPromises: Promise<IdPromise<NetworkTokenWithBalance>>[] = [];\n const erc20TokenPromises: Promise<IdPromise<Record<string, TokenWithBalanceEVM | Error>>>[] = [];\n const nftTokenPromises: Promise<IdPromise<Record<string, NftTokenWithBalance | Error>>>[] = [];\n addresses.forEach((address) => {\n if (resolvedTokenTypes.includes(TokenType.NATIVE)) {\n nativeTokenPromises.push(\n addIdToPromise(\n supportingService\n .getNativeBalance({\n address,\n currency: currency.toUpperCase() as CurrencyCode,\n chainId,\n })\n .then(async (nativeBalance) => {\n if (nativeBalance.symbol === 'AVAX') {\n // we want to standardise AVAX price across the chains\n const avaxMarketData = await tokenService.getWatchlistDataForToken({\n tokenDetails: {\n symbol: network.networkToken.symbol,\n isNative: true,\n caip2Id: network.caipId ?? '',\n },\n currency: currency.toUpperCase() as VsCurrencyType,\n });\n\n return {\n ...nativeBalance,\n priceInCurrency: avaxMarketData.priceInCurrency,\n marketCap: avaxMarketData.marketCap,\n vol24: avaxMarketData.vol24,\n change24: avaxMarketData.change24,\n };\n }\n\n return nativeBalance;\n }),\n address,\n ),\n );\n }\n\n if (resolvedTokenTypes.includes(TokenType.ERC20)) {\n erc20TokenPromises.push(\n addIdToPromise(\n supportingService.listErc20Balances({\n customTokens: customTokens.filter(isERC20Token),\n customTokensOnly,\n currency: currency.toUpperCase() as CurrencyCode,\n chainId,\n address,\n pageSize: 100,\n }),\n address,\n ),\n );\n }\n\n if (resolvedTokenTypes.includes(TokenType.ERC721) || resolvedTokenTypes.includes(TokenType.ERC1155)) {\n nftTokenPromises.push(\n addIdToPromise(\n supportingService.listNftBalances({\n chainId,\n address,\n }),\n address,\n ),\n );\n }\n });\n const nativeTokenBalances = await settleAllIdPromises(nativeTokenPromises);\n const erc20TokenBalances = await settleAllIdPromises(erc20TokenPromises);\n const nftTokenBalances = await settleAllIdPromises(nftTokenPromises);\n Object.keys(nativeTokenBalances).forEach((address) => {\n const balanceOrError = nativeTokenBalances[address];\n if (!balanceOrError || 'error' in balanceOrError) {\n balances[address] = {\n error: `getNativeBalance failed: ${balanceOrError?.error ?? 'unknown error'}`,\n } as Error;\n return;\n }\n const tokenSymbol = balanceOrError.symbol as string;\n balances[address] = {\n [tokenSymbol]: balanceOrError,\n };\n });\n Object.keys(erc20TokenBalances).forEach((address) => {\n const balancesOrError = erc20TokenBalances[address];\n if (!balancesOrError || ('error' in balancesOrError && typeof balancesOrError.error !== 'string')) {\n balances[address] = {\n ...balances[address],\n error: `listErc20Balances failed: unknown error`,\n };\n } else if ('error' in balancesOrError && typeof balancesOrError.error === 'string') {\n balances[address] = {\n ...balances[address],\n error: `listErc20Balances failed: ${balancesOrError.error}`,\n };\n } else {\n balances[address] = {\n ...balances[address],\n ...balancesOrError,\n };\n }\n });\n Object.keys(nftTokenBalances).forEach((address) => {\n const balancesOrError = nftTokenBalances[address];\n if (!balancesOrError || ('error' in balancesOrError && typeof balancesOrError.error !== 'string')) {\n balances[address] = {\n ...balances[address],\n error: `listNftBalances failed: unknown error`,\n };\n } else if ('error' in balancesOrError && typeof balancesOrError.error === 'string') {\n balances[address] = {\n ...balances[address],\n error: `listNftBalances failed: ${balancesOrError.error}`,\n };\n } else {\n balances[address] = {\n ...balances[address],\n ...balancesOrError,\n };\n }\n });\n } else {\n addresses.forEach((address) => {\n balances[address] = {\n error: 'unsupported network',\n };\n });\n }\n\n return balances;\n};\n","import { CurrencyCode } from '@avalabs/glacier-sdk';\nimport type { BalanceServiceInterface, TokenId } from '../../handlers/get-balances/balance-service-interface';\nimport {\n type ERC20Token,\n type Network,\n type NetworkContractToken,\n type NetworkTokenWithBalance,\n type Storage,\n type Error,\n TokenType,\n type TokenWithBalanceEVM,\n type NftTokenWithBalance,\n} from '@avalabs/vm-module-types';\nimport { addIdToPromise, settleAllIdPromises } from '../../utils/id-promise';\nimport type { VsCurrencyType } from '@avalabs/core-coingecko-sdk';\nimport { TokenUnit } from '@avalabs/core-utils-sdk';\nimport { ethers } from 'ethers';\nimport ERC20 from '@openzeppelin/contracts/build/contracts/ERC20.json';\nimport { getProvider } from '../../utils/get-provider';\nimport { TokenService } from '@internal/utils';\nimport { getTokens } from '../../handlers/get-tokens/get-tokens';\nimport { isERC20Token } from '../../utils/type-utils';\n\nexport class RpcService implements BalanceServiceInterface {\n #network: Network;\n #storage: Storage | undefined;\n #proxyApiUrl: string;\n #customTokens: NetworkContractToken[];\n #fetch?: typeof globalThis.fetch;\n\n constructor({\n network,\n storage,\n proxyApiUrl,\n customTokens,\n fetch,\n }: {\n network: Network;\n storage?: Storage;\n proxyApiUrl: string;\n customTokens: NetworkContractToken[];\n fetch?: typeof globalThis.fetch;\n }) {\n this.#network = network;\n this.#storage = storage;\n this.#proxyApiUrl = proxyApiUrl;\n this.#customTokens = customTokens;\n this.#fetch = fetch;\n }\n\n async isNetworkSupported(): Promise<boolean> {\n return true;\n }\n\n async getNativeBalance({\n chainId,\n address,\n currency,\n }: {\n chainId: number;\n address: string;\n currency: CurrencyCode;\n }): Promise<NetworkTokenWithBalance> {\n const provider = await getProvider({\n chainId,\n chainName: this.#network.chainName,\n rpcUrl: this.#network.rpcUrl,\n multiContractAddress: this.#network.utilityAddresses?.multicall,\n customRpcHeaders: this.#network.customRpcHeaders,\n });\n\n const coingeckoTokenId = this.#network.pricingProviders?.coingecko.nativeTokenId;\n const networkToken = this.#network.networkToken;\n const tokenService = new TokenService({\n storage: this.#storage,\n proxyApiUrl: this.#proxyApiUrl,\n fetch: this.#fetch,\n });\n const simplePriceResponse = coingeckoTokenId\n ? await tokenService.getSimplePrice({\n coinIds: [coingeckoTokenId],\n currencies: [currency] as unknown as VsCurrencyType[],\n })\n : {};\n\n const priceInCurrency = simplePriceResponse?.[coingeckoTokenId ?? '']?.[currency]?.price ?? undefined;\n const marketCap = simplePriceResponse?.[coingeckoTokenId ?? '']?.[currency]?.marketCap ?? undefined;\n const vol24 = simplePriceResponse?.[coingeckoTokenId ?? '']?.[currency]?.vol24 ?? undefined;\n const change24 = simplePriceResponse?.[coingeckoTokenId ?? '']?.[currency]?.change24 ?? undefined;\n\n const balance = await provider.getBalance(address);\n const balanceUnit = new TokenUnit(balance, networkToken.decimals, networkToken.symbol);\n const balanceInCurrency = priceInCurrency !== undefined ? balanceUnit.mul(priceInCurrency) : undefined;\n\n return {\n ...networkToken,\n coingeckoId: coingeckoTokenId ?? '',\n type: TokenType.NATIVE,\n balance,\n balanceDisplayValue: balanceUnit.toDisplay(),\n balanceInCurrency: balanceInCurrency?.toDisplay({ fixedDp: 2, asNumber: true }),\n balanceCurrencyDisplayValue: balanceInCurrency?.toDisplay({ fixedDp: 2 }),\n priceInCurrency,\n marketCap,\n vol24,\n change24,\n };\n }\n\n async listErc20Balances({\n chainId,\n address,\n currency,\n customTokensOnly = false,\n }: {\n chainId: number;\n address: string;\n currency: CurrencyCode;\n pageSize: number;\n pageToken?: string;\n customTokensOnly?: boolean;\n }): Promise<Record<TokenId, TokenWithBalanceEVM | Error>> {\n const provider = await getProvider({\n chainId,\n chainName: this.#network.chainName,\n rpcUrl: this.#network.rpcUrl,\n multiContractAddress: this.#network.utilityAddresses?.multicall,\n customRpcHeaders: this.#network.customRpcHeaders,\n });\n\n const coingeckoPlatformId = this.#network.pricingProviders?.coingecko.assetPlatformId;\n const coingeckoTokenId = this.#network.pricingProviders?.coingecko.nativeTokenId;\n // When only custom tokens are requested, skip fetching the full curated\n // token list to keep the query cheap and targeted.\n const tokens = customTokensOnly\n ? []\n : await getTokens({ chainId: Number(chainId), proxyApiUrl: this.#proxyApiUrl });\n const tokenAddresses = tokens.map((token) => token.address);\n const erc20TokenList = [...tokens, ...this.#customTokens].filter(isERC20Token);\n\n const getTokenWithBalance = async (token: ERC20Token) => {\n const contract = new ethers.Contract(token.address, ERC20.abi, provider);\n const balanceBig: bigint = await contract.balanceOf?.(address);\n const balance = balanceBig || 0n;\n\n return {\n ...token,\n balance,\n };\n };\n\n const tokenBalancePromises = erc20TokenList.map((token) => {\n return addIdToPromise(getTokenWithBalance(token), token.address);\n });\n const tokenBalancesResults = await settleAllIdPromises(tokenBalancePromises);\n const tokenService = new TokenService({\n storage: this.#storage,\n proxyApiUrl: this.#proxyApiUrl,\n fetch: this.#fetch,\n });\n const simplePriceResponse =\n (coingeckoPlatformId &&\n (await tokenService.getPricesByAddresses(\n tokenAddresses,\n coingeckoPlatformId,\n currency as unknown as VsCurrencyType,\n ))) ||\n {};\n\n const tokenIds = Object.keys(tokenBalancesResults);\n const erc20TokenBalances: Record<TokenId, TokenWithBalanceEVM | Error> = {};\n for (let i = 0; i < tokenIds.length; i++) {\n const tokenId = tokenIds[i];\n if (tokenId === undefined) continue;\n const tokenBalance = tokenBalancesResults[tokenId];\n if (tokenBalance === undefined || 'error' in tokenBalance) {\n erc20TokenBalances[tokenId] = {\n error: `rpcService:getTokenWithBalance failed: ${tokenBalance?.error ?? 'unknown error'}`,\n };\n continue;\n }\n\n const priceInCurrency = simplePriceResponse?.[coingeckoTokenId ?? '']?.[currency]?.price ?? undefined;\n const marketCap = simplePriceResponse?.[coingeckoTokenId ?? '']?.[currency]?.marketCap ?? undefined;\n const vol24 = simplePriceResponse?.[coingeckoTokenId ?? '']?.[currency]?.vol24 ?? undefined;\n const change24 = simplePriceResponse?.[coingeckoTokenId ?? '']?.[currency]?.change24 ?? undefined;\n\n const balance = new TokenUnit(tokenBalance.balance, tokenBalance.decimals, tokenBalance.symbol);\n const balanceInCurrency = priceInCurrency !== undefined ? balance.mul(priceInCurrency) : undefined;\n\n erc20TokenBalances[tokenBalance.address.toLowerCase()] = {\n ...tokenBalance,\n type: TokenType.ERC20,\n balance: tokenBalance.balance,\n balanceDisplayValue: balance.toDisplay(),\n balanceInCurrency: balanceInCurrency?.toDisplay({ fixedDp: 2, asNumber: true }),\n balanceCurrencyDisplayValue: balanceInCurrency?.toDisplay({ fixedDp: 2 }),\n priceInCurrency,\n marketCap,\n change24,\n vol24,\n reputation: null,\n };\n }\n return erc20TokenBalances;\n }\n\n async listNftBalances(): Promise<Record<string, NftTokenWithBalance | Error>> {\n // the token list does not maintain a list of NFTs\n return {};\n }\n}\n","import { type Error } from '@avalabs/vm-module-types';\n\ntype Id = string;\nexport type IdPromise<T> =\n | { id: string; status: 'fulfilled'; value: T }\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n | { id: string; status: 'rejected'; reason: any };\n\n/**\n * The addIdToPromise function takes an existing promise and an id string as input and returns a new promise that\n * resolves to an object containing the id, the status of the original promise (either 'fulfilled' or 'rejected'),\n * and the result or error of the original promise.\n *\n * Usage:\n * This function is useful for tracking the status and outcome of multiple promises when used with Promise.allSettled\n *\n * @param promise The original promise that resolves to a value of type T.\n * @param id A unique identifier associated with the promise.\n */\nexport function addIdToPromise<T>(promise: Promise<T>, id: string): Promise<IdPromise<T>> {\n return promise\n .then((value) => ({ id, status: 'fulfilled', value }) as IdPromise<T>)\n .catch((reason) => ({ id, status: 'rejected', reason }) as IdPromise<T>);\n}\n\n/**\n * The settleAllIdPromises function processes an array of promises that return IdPromise objects,\n * resolving all of them and organizing the results into a record.\n *\n * Usage:\n * Use {@link addIdToPromise} to get array of promises\n *\n * @param promises An array of promises that each resolve to an IdPromise<T> object.\n */\nexport async function settleAllIdPromises<T>(promises: Promise<IdPromise<T>>[]): Promise<Record<Id, T | Error>> {\n return await Promise.allSettled(promises).then((results) => {\n return results.reduce(\n (acc, result) => {\n if (result.status === 'fulfilled') {\n const value = result.value;\n if (value.status === 'fulfilled') {\n acc[value.id] = value.value;\n } else {\n acc[value.id] = { error: value.reason };\n }\n }\n return acc;\n },\n {} as Record<Id, T | Error>,\n );\n });\n}\n","import { z } from 'zod';\nimport { TokenType, type NetworkContractToken } from '@avalabs/vm-module-types';\nimport { fetchAndVerify } from '@internal/utils';\n\n// Proxy API emits `contractType` with dashes (e.g. \"ERC-20\"),\n// while the `TokenType` enum uses the dash-less form (e.g. \"ERC20\").\nconst PROXY_API_CONTRACT_TYPE_TO_TOKEN_TYPE: Record<string, TokenType> = {\n 'ERC-20': TokenType.ERC20,\n 'ERC-721': TokenType.ERC721,\n 'ERC-1155': TokenType.ERC1155,\n 'NON-ERC': TokenType.NONERC,\n SPL: TokenType.SPL,\n};\n\nconst ContractTypeSchema = z.string().transform((raw, ctx) => {\n const mapped = PROXY_API_CONTRACT_TYPE_TO_TOKEN_TYPE[raw];\n if (!mapped) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: `Unknown contractType: ${raw}`,\n });\n return z.NEVER;\n }\n return mapped;\n});\n\nconst ProxyApiTokenSchema = z.object({\n address: z.string(),\n chainId: z.number(),\n contractType: ContractTypeSchema,\n decimals: z.number(),\n internalId: z.string().nullish(),\n isNative: z.boolean(),\n logoUri: z.string().nullish(),\n name: z.string(),\n symbol: z.string(),\n caip2Id: z.string().nullish(),\n color: z.string().nullish(),\n});\n\ntype ProxyApiToken = z.infer<typeof ProxyApiTokenSchema>;\n\n// Validate each token independently and drop the ones that don't match the\n// schema, so a single malformed entry doesn't discard the entire list.\nconst ProxyApiTokensSchema = z.array(z.unknown()).transform((tokens): ProxyApiToken[] =>\n tokens.flatMap((token) => {\n const result = ProxyApiTokenSchema.safeParse(token);\n return result.success ? [result.data] : [];\n }),\n);\n\nexport async function getTokens({\n chainId,\n proxyApiUrl,\n}: {\n chainId: number;\n proxyApiUrl: string;\n}): Promise<NetworkContractToken[]> {\n const rawTokens = await fetchAndVerify([`${proxyApiUrl}/tokens?evmChainId=${chainId}`], ProxyApiTokensSchema);\n\n return rawTokens.map((token) => ({ ...token, type: token.contractType }) as NetworkContractToken);\n}\n","/**\n * Asynchronously searches through an array to find the first element that satisfies the provided async callback function.\n *\n * @param {T[]} array - The array to search through.\n * @param {(item: T) => Promise<boolean>} asyncCallback - An async function that takes an element of the array and returns a Promise resolving to a boolean.\n * @returns {Promise<T | undefined>} - A Promise that resolves to the first element in the array that satisfies the asyncCallback function, or undefined if no such element is found.\n *\n * @example\n * ```ts\n * const array = [1, 2, 3, 4];\n * const asyncCallback = async (num) => {\n * return new Promise((resolve) => {\n * setTimeout(() => {\n * resolve(num % 2 === 0);\n * }, 100);\n * });\n * };\n *\n * findAsync(array, asyncCallback).then((result) => {\n * console.log(result); // Output: 2 (the first even number)\n * });\n * ```\n */\nexport async function findAsync<T>(array: T[], asyncCallback: (item: T) => Promise<boolean>): Promise<T | undefined> {\n const promises = array.map(async (item, index) => ({\n index,\n result: await asyncCallback(item),\n }));\n\n const results = await Promise.allSettled(promises);\n\n const found = results\n .filter((item) => item.status === 'fulfilled')\n .map((item) => item as PromiseFulfilledResult<{ index: number; result: boolean }>)\n .find((item) => {\n return item.value.result;\n });\n return found ? array[found.value.index] : undefined;\n}\n","import type { NetworkFees, SuggestGasPriceOptionsResponse } from '@avalabs/vm-module-types';\nimport { getProvider } from '../../utils/get-provider';\nimport { rpcErrors } from '@metamask/rpc-errors';\nimport { TokenUnit } from '@avalabs/core-utils-sdk';\nimport { ChainId } from '@avalabs/core-chains-sdk';\nimport type { JsonRpcBatchInternal } from '@avalabs/core-wallets-sdk';\n\nconst DEFAULT_PRESETS = {\n LOW: 1n,\n MEDIUM: 4n,\n HIGH: 6n,\n};\n\nconst BASE_PRIORITY_FEE_WEI = 500000000n; //0.5 GWei\n\nconst isCChain = (chainId: number) =>\n chainId === ChainId.AVALANCHE_TESTNET_ID || chainId === ChainId.AVALANCHE_MAINNET_ID;\n\nconst POLYGON_MAINNET_CHAIN_ID = 137;\nconst POLYGON_AMOY_CHAIN_ID = 80002;\n\nconst isPolygon = (chainId: number) => chainId === POLYGON_MAINNET_CHAIN_ID || chainId === POLYGON_AMOY_CHAIN_ID;\n\nconst POLYGON_GAS_STATION_URL: Record<number, string> = {\n [POLYGON_MAINNET_CHAIN_ID]: 'https://gasstation.polygon.technology/v2',\n [POLYGON_AMOY_CHAIN_ID]: 'https://gasstation.polygon.technology/amoy',\n};\n\ntype PolygonGasStationResponse = {\n safeLow: { maxPriorityFee: number; maxFee: number };\n standard: { maxPriorityFee: number; maxFee: number };\n fast: { maxPriorityFee: number; maxFee: number };\n estimatedBaseFee: number;\n};\n\nfunction gweiToWei(gwei: number): bigint {\n return BigInt(Math.round(gwei * 1e9));\n}\n\nasync function getPolygonGasStationFees(chainId: number): Promise<NetworkFees> {\n const url = POLYGON_GAS_STATION_URL[chainId];\n if (!url) throw new Error(`No gas station URL for Polygon chain ${chainId}`);\n\n const response = await fetch(url);\n if (!response.ok) throw new Error(`Polygon Gas Station returned ${response.status}`);\n\n const data: PolygonGasStationResponse = await response.json();\n\n return {\n baseFee: gweiToWei(data.estimatedBaseFee),\n low: {\n maxFeePerGas: gweiToWei(data.safeLow.maxFee),\n maxPriorityFeePerGas: gweiToWei(data.safeLow.maxPriorityFee),\n },\n medium: {\n maxFeePerGas: gweiToWei(data.standard.maxFee),\n maxPriorityFeePerGas: gweiToWei(data.standard.maxPriorityFee),\n },\n high: {\n maxFeePerGas: gweiToWei(data.fast.maxFee),\n maxPriorityFeePerGas: gweiToWei(data.fast.maxPriorityFee),\n },\n isFixedFee: false,\n displayDecimals: 9,\n };\n}\n\n/**\n * Returns {@link NetworkFees} based on {@link DEFAULT_PRESETS} multipliers.\n * @throws Error if provider does not support eip-1559\n */\nexport async function getNetworkFee({\n chainId,\n chainName,\n rpcUrl,\n multiContractAddress,\n caipId,\n proxyApiUrl,\n customRpcHeaders,\n}: {\n chainId: number;\n chainName: string;\n rpcUrl: string;\n proxyApiUrl?: string;\n multiContractAddress?: string;\n caipId?: string;\n customRpcHeaders?: Record<string, string>;\n}): Promise<NetworkFees> {\n const provider = await getProvider({\n chainId,\n chainName,\n rpcUrl,\n multiContractAddress,\n customRpcHeaders,\n });\n\n if (!proxyApiUrl) {\n throw rpcErrors.internal('Proxy API URL is needed');\n }\n\n if (isCChain(chainId)) {\n try {\n const suggestedFees = await suggestPriceOptions(provider);\n\n return {\n ...suggestedFees,\n baseFee: suggestedFees.medium.maxFeePerGas,\n displayDecimals: 9,\n isFixedFee: false,\n };\n } catch (err) {\n console.error('eth_suggestPriceOptions call failed, falling back to legacy fee fetching');\n }\n }\n\n if (isPolygon(chainId)) {\n try {\n return await getPolygonGasStationFees(chainId);\n } catch (err) {\n console.error('Polygon Gas Station call failed, falling back to generic fee fetching');\n }\n }\n\n const lastBlock = await provider.getBlock('latest', false);\n\n if (!lastBlock) {\n throw rpcErrors.internal('There is no block');\n }\n const baseFeePerGas = lastBlock.baseFeePerGas;\n\n if (!baseFeePerGas) {\n throw rpcErrors.internal('Pre-EIP-1559 networks are not supported');\n }\n\n const gasMultiplier = await getGasMultiplier(proxyApiUrl, caipId);\n\n const multiplier = new TokenUnit(gasMultiplier, 0, '');\n\n const baseFee = new TokenUnit(baseFeePerGas, 0, '');\n const maxPriorityFeePerGas = BigInt('1000000000');\n\n const maxFee = baseFee.mul(multiplier).add(maxPriorityFeePerGas).toSubUnit();\n\n const lowMaxTip = BASE_PRIORITY_FEE_WEI * DEFAULT_PRESETS.LOW;\n const mediumMaxTip = BASE_PRIORITY_FEE_WEI * DEFAULT_PRESETS.MEDIUM;\n const highMaxTip = BASE_PRIORITY_FEE_WEI * DEFAULT_PRESETS.HIGH;\n return {\n baseFee: maxFee,\n low: {\n maxFeePerGas: maxFee + lowMaxTip,\n maxPriorityFeePerGas: lowMaxTip,\n },\n medium: {\n maxFeePerGas: maxFee + mediumMaxTip,\n maxPriorityFeePerGas: mediumMaxTip,\n },\n high: {\n maxFeePerGas: maxFee + highMaxTip,\n maxPriorityFeePerGas: highMaxTip,\n },\n isFixedFee: false,\n displayDecimals: 9,\n };\n}\n\nasync function suggestPriceOptions(\n provider: JsonRpcBatchInternal,\n): Promise<Pick<NetworkFees, 'low' | 'medium' | 'high'>> {\n const options: SuggestGasPriceOptionsResponse = await provider.send('eth_suggestPriceOptions', []);\n\n return {\n low: {\n maxFeePerGas: BigInt(options.slow.maxFeePerGas),\n maxPriorityFeePerGas: BigInt(options.slow.maxPriorityFeePerGas),\n },\n medium: {\n maxFeePerGas: BigInt(options.normal.maxFeePerGas),\n maxPriorityFeePerGas: BigInt(options.normal.maxPriorityFeePerGas),\n },\n high: {\n maxFeePerGas: BigInt(options.fast.maxFeePerGas),\n maxPriorityFeePerGas: BigInt(options.fast.maxPriorityFeePerGas),\n },\n };\n}\n\nasync function getGasMultiplier(proxyApiUrl: string, caipId?: string) {\n const defaultMultiplier = 1.5;\n if (!caipId) {\n return defaultMultiplier;\n }\n\n try {\n const respond = await fetch(`${proxyApiUrl}/gas/multiplier`);\n\n if (!respond.ok) {\n throw new Error(respond.statusText);\n }\n const multipliers = await respond.json();\n\n return multipliers[caipId] ?? multipliers.default;\n } catch (e) {\n return defaultMultiplier;\n }\n}\n","import {\n TokenType,\n TransactionType,\n type NetworkToken,\n type Transaction,\n type TxToken,\n} from '@avalabs/vm-module-types';\nimport { TokenUnit } from '@avalabs/core-utils-sdk';\nimport { getExplorerAddressByNetwork } from '../../utils/get-explorer-address-by-network';\nimport { convertTransactionType } from '../evm-transaction-converter/get-tx-type';\nimport type {\n MoralisCategory,\n MoralisTransaction,\n MoralisErc20Transfer,\n MoralisNativeTransfer,\n MoralisNftTransfer,\n} from './moralis-types';\n\ntype ConvertMoralisTransactionParams = {\n tx: MoralisTransaction;\n networkToken: NetworkToken;\n explorerUrl: string;\n chainId: number;\n address: string;\n};\n\nexport function convertMoralisTransaction({\n tx,\n networkToken,\n explorerUrl,\n chainId,\n address,\n}: ConvertMoralisTransactionParams): Transaction {\n const isSender = tx.from_address.toLowerCase() === address.toLowerCase();\n const timestamp = new Date(tx.block_timestamp).getTime();\n let txType = getMoralisTransactionType(tx.category);\n const isContractCall = !NON_CONTRACT_CALL_CATEGORIES.has(tx.category);\n\n const tokens = buildTokens(tx, networkToken, address);\n const explorerLink = getExplorerAddressByNetwork(explorerUrl, tx.hash);\n\n txType = convertTransactionType({\n txType,\n isSender,\n walletAddress: address,\n tokens,\n });\n\n return {\n isContractCall,\n isIncoming: !isSender,\n isOutgoing: isSender,\n isSender,\n timestamp,\n hash: tx.hash,\n from: tx.from_address,\n to: tx.to_address ?? '',\n tokens,\n gasPrice: tx.gas_price,\n gasUsed: tx.receipt_gas_used,\n chainId: chainId.toString(),\n txType,\n method: tx.method_label ?? undefined,\n explorerLink,\n };\n}\n\nconst NON_CONTRACT_CALL_CATEGORIES = new Set<MoralisCategory>(['send', 'receive', 'token send', 'token receive']);\n\nconst CATEGORY_TO_TX_TYPE: Record<MoralisCategory, TransactionType> = {\n send: TransactionType.SEND,\n receive: TransactionType.RECEIVE,\n 'token send': TransactionType.SEND,\n 'token receive': TransactionType.RECEIVE,\n 'nft send': TransactionType.NFT_SEND,\n 'nft receive': TransactionType.NFT_RECEIVE,\n 'token swap': TransactionType.SWAP,\n 'nft purchase': TransactionType.NFT_BUY,\n 'nft sale': TransactionType.NFT_SEND,\n airdrop: TransactionType.AIRDROP,\n mint: TransactionType.NFT_BUY,\n burn: TransactionType.UNKNOWN,\n deposit: TransactionType.UNKNOWN,\n withdraw: TransactionType.UNKNOWN,\n borrow: TransactionType.UNKNOWN,\n 'contract interaction': TransactionType.UNKNOWN,\n};\n\nfunction getMoralisTransactionType(category: MoralisCategory): TransactionType {\n return CATEGORY_TO_TX_TYPE[category] ?? TransactionType.UNKNOWN;\n}\n\nfunction getTransferAddress(address: string | null | undefined): { address: string } | undefined {\n if (address == null || address === '') {\n return undefined;\n }\n return { address };\n}\n\nfunction trimOrEmpty(value: string | null | undefined): string {\n return value?.trim() ?? '';\n}\n\nfunction shortenHexAddress(address: string): string {\n const normalized = address.trim().toLowerCase();\n if (!normalized.startsWith('0x') || normalized.length < 12) {\n return address.trim();\n }\n return `${normalized.slice(0, 6)}…${normalized.slice(-4)}`;\n}\n\nfunction getErc20DisplaySymbol(transfer: MoralisErc20Transfer): string {\n const fromSymbol = trimOrEmpty(transfer.token_symbol);\n if (fromSymbol !== '') {\n return fromSymbol;\n }\n const fromName = trimOrEmpty(transfer.token_name);\n if (fromName !== '') {\n return fromName;\n }\n return shortenHexAddress(transfer.address);\n}\n\nfunction buildTokens(tx: MoralisTransaction, networkToken: NetworkToken, address: string): TxToken[] {\n const tokens: TxToken[] = [];\n const nativeTokens = tx.native_transfers.map((transfer) => buildNativeToken(transfer, networkToken));\n const erc20Tokens = tx.erc20_transfers.map((transfer) => buildErc20Token(transfer));\n\n tokens.push(...nativeTokens, ...erc20Tokens);\n\n for (const transfer of tx.nft_transfers) {\n tokens.push(buildNftToken(transfer));\n }\n\n if (tokens.length === 0) {\n tokens.push(buildFallbackNativeToken(tx, networkToken, address));\n }\n\n return tokens;\n}\n\nfunction buildNativeToken(transfer: MoralisNativeTransfer, networkToken: NetworkToken): TxToken {\n const displaySymbol = trimOrEmpty(transfer.token_symbol) || networkToken.symbol;\n const amount = new TokenUnit(transfer.value, networkToken.decimals, displaySymbol);\n\n return {\n decimal: networkToken.decimals.toString(),\n name: networkToken.name,\n symbol: displaySymbol,\n amount: amount.toDisplay(),\n from: getTransferAddress(transfer.from_address),\n to: getTransferAddress(transfer.to_address),\n type: TokenType.NATIVE,\n };\n}\n\nfunction buildErc20Token(transfer: MoralisErc20Transfer): TxToken {\n const decimals = Number(transfer.token_decimals);\n const displaySymbol = getErc20DisplaySymbol(transfer);\n const amount = new TokenUnit(transfer.value, decimals, displaySymbol);\n const displayName = trimOrEmpty(transfer.token_name) || displaySymbol;\n\n return {\n decimal: transfer.token_decimals,\n name: displayName,\n symbol: displaySymbol,\n amount: amount.toDisplay(),\n from: getTransferAddress(transfer.from_address),\n to: getTransferAddress(transfer.to_address),\n type: TokenType.ERC20,\n address: transfer.address,\n };\n}\n\nfunction buildNftToken(transfer: MoralisNftTransfer): TxToken {\n const tokenType = transfer.contract_type === 'ERC1155' ? TokenType.ERC1155 : TokenType.ERC721;\n\n return {\n name: '',\n symbol: '',\n amount: transfer.amount,\n collectableTokenId: transfer.token_id,\n from: getTransferAddress(transfer.from_address),\n to: getTransferAddress(transfer.to_address),\n type: tokenType,\n address: transfer.token_address,\n };\n}\n\nfunction buildFallbackNativeToken(tx: MoralisTransaction, networkToken: NetworkToken, address: string): TxToken {\n const amount = new TokenUnit(tx.value, networkToken.decimals, networkToken.symbol);\n const isSender = tx.from_address.toLowerCase() === address.toLowerCase();\n const displayAmount = isSender ? `-${amount.toDisplay()}` : amount.toDisplay();\n\n return {\n decimal: networkToken.decimals.toString(),\n name: networkToken.name,\n symbol: networkToken.symbol,\n amount: displayAmount,\n from: getTransferAddress(tx.from_address),\n to: getTransferAddress(tx.to_address),\n type: TokenType.NATIVE,\n };\n}\n","import type { TransactionDetails } from '@avalabs/glacier-sdk';\nimport { TokenType, TransactionType, type TxToken } from '@avalabs/vm-module-types';\nimport startCase from 'lodash.startcase';\n\nfunction isNftTokenType(type: TokenType): boolean {\n return type === TokenType.ERC721 || type === TokenType.ERC1155;\n}\n\n/**\n * After a provisional {@link TransactionType} (e.g. Moralis category or Glacier heuristics below),\n * returns the same type or promotes generic classifications to `NFT_SEND` / `NFT_RECEIVE`\n * when `tokens` shows the wallet sent or received an ERC-721/1155 (often not `tokens[0]` because rows\n * are ordered native → ERC-20 → NFTs). Includes {@link TransactionType.AIRDROP} because Moralis labels\n * many bulk ERC-721/1155 mint/receive spam txs as `airdrop`; without promotion the UI falls back to\n * fungible `mainToken` (“1 received”). Exported for Moralis, which does not use {@link getTxType}.\n */\nexport function convertTransactionType(params: {\n txType: TransactionType;\n isSender: boolean;\n walletAddress: string;\n tokens: TxToken[];\n}): TransactionType {\n const { txType, isSender, walletAddress, tokens } = params;\n if (tokens.length === 0) {\n return txType;\n }\n\n const normalizedWallet = walletAddress.toLowerCase();\n const userReceivedNft = tokens.some(\n (token) => isNftTokenType(token.type) && token.to?.address?.toLowerCase() === normalizedWallet,\n );\n const userSentNft = tokens.some(\n (token) => isNftTokenType(token.type) && token.from?.address?.toLowerCase() === normalizedWallet,\n );\n\n const receiveLike =\n txType === TransactionType.RECEIVE ||\n txType === TransactionType.UNKNOWN ||\n txType === TransactionType.TRANSFER ||\n txType === TransactionType.AIRDROP;\n const sendLike =\n txType === TransactionType.SEND ||\n txType === TransactionType.UNKNOWN ||\n txType === TransactionType.TRANSFER ||\n txType === TransactionType.AIRDROP;\n\n if (!isSender && userReceivedNft && receiveLike) {\n return TransactionType.NFT_RECEIVE;\n }\n if (isSender && userSentNft && sendLike) {\n return TransactionType.NFT_SEND;\n }\n return txType;\n}\n\n/**\n * Glacier history: classify from decoded method + transfer lists, then apply {@link convertTransactionType}\n * so NFT legs are not missed when fungible tokens appear first in `tokens`.\n */\nexport const getTxType = (\n { nativeTransaction, erc20Transfers, erc721Transfers, erc1155Transfers }: TransactionDetails,\n userAddress: string,\n tokens: TxToken[],\n): TransactionType => {\n const nativeOnly = !erc20Transfers && !erc721Transfers && !erc1155Transfers;\n const method = parseRawMethod(nativeTransaction.method?.methodName);\n\n const address = userAddress.toLowerCase();\n\n const isSwap = method.toLowerCase().includes('swap');\n const isNativeSend = nativeOnly && nativeTransaction.from.address.toLowerCase() === address;\n const isNativeReceive = nativeOnly && nativeTransaction.to.address.toLowerCase() === address;\n const isNFTPurchase = method === 'Market Buy Orders With Eth' || method === 'Buy NFT';\n const isApprove = method === 'Approve';\n const isTransfer = method.toLowerCase().includes('transfer');\n const isAirdrop = method.toLowerCase().includes('airdrop');\n const isUnwrap = method.toLowerCase().includes('unwrap');\n const isFillOrder = method === 'Fill Order';\n\n let provisionalTxType: TransactionType;\n if (isSwap) {\n provisionalTxType = TransactionType.SWAP;\n } else if (isNativeSend) {\n provisionalTxType = TransactionType.SEND;\n } else if (isNativeReceive) {\n provisionalTxType = TransactionType.RECEIVE;\n } else if (isNFTPurchase) {\n provisionalTxType = TransactionType.NFT_BUY;\n } else if (isApprove) {\n provisionalTxType = TransactionType.APPROVE;\n } else if (isTransfer) {\n provisionalTxType = TransactionType.TRANSFER;\n } else if (isAirdrop) {\n provisionalTxType = TransactionType.AIRDROP;\n } else if (isUnwrap) {\n provisionalTxType = TransactionType.UNWRAP;\n } else if (isFillOrder) {\n provisionalTxType = TransactionType.FILL_ORDER;\n } else {\n provisionalTxType = TransactionType.UNKNOWN;\n }\n\n const isTxSigner = nativeTransaction.from.address.toLowerCase() === address;\n return convertTransactionType({\n txType: provisionalTxType,\n isSender: isTxSigner,\n walletAddress: userAddress,\n tokens,\n });\n};\n\nconst parseRawMethod = (method = ''): string => {\n if (method.includes('(')) {\n return startCase(method.split('(', 1)[0]);\n }\n return method;\n};\n","import type { NetworkToken, TransactionHistoryResponse } from '@avalabs/vm-module-types';\nimport { convertMoralisTransaction } from './convert-moralis-transaction';\nimport type { MoralisWalletHistoryResponse } from './moralis-types';\n\nconst MORALIS_PROXY_BASE_URL = 'https://proxy-api.avax.network/proxy/moralis-evm';\n\ntype GetTransactionsFromMoralisParams = {\n chainId: number;\n networkToken: NetworkToken;\n explorerUrl: string;\n address: string;\n nextPageToken?: string;\n offset?: number;\n};\n\nexport async function getTransactionsFromMoralis({\n chainId,\n networkToken,\n explorerUrl,\n address,\n nextPageToken,\n offset,\n}: GetTransactionsFromMoralisParams): Promise<TransactionHistoryResponse> {\n try {\n const chainHex = `0x${chainId.toString(16)}`;\n const params = new URLSearchParams({\n chain: chainHex,\n limit: (offset ?? 25).toString(),\n });\n\n if (nextPageToken) {\n params.set('cursor', nextPageToken);\n }\n\n const url = `${MORALIS_PROXY_BASE_URL}/wallets/${address}/history?${params.toString()}`;\n const response = await fetch(url);\n\n if (!response.ok) {\n return { transactions: [], nextPageToken: '' };\n }\n\n const data = (await response.json()) as MoralisWalletHistoryResponse;\n\n if (!Array.isArray(data.result)) {\n return { transactions: [], nextPageToken: '' };\n }\n\n const transactions = data.result\n .filter((tx) => tx.receipt_status === '1')\n .map((tx) =>\n convertMoralisTransaction({\n tx,\n networkToken,\n explorerUrl,\n chainId,\n address,\n }),\n );\n\n return {\n transactions,\n nextPageToken: data.cursor ?? '',\n };\n } catch {\n return { transactions: [], nextPageToken: '' };\n }\n}\n","const MORALIS_SUPPORTED_CHAIN_IDS = new Set([\n 1, // Ethereum\n 4, // Ethereum test — Rinkeby\n 5, // Ethereum test — Goerli\n 11155111, // Ethereum test — Sepolia\n 8453, // Base\n 42161, // Arbitrum One\n 10, // Optimism\n]);\n\nexport function isMoralisSupportedChain(chainId: number): boolean {\n return MORALIS_SUPPORTED_CHAIN_IDS.has(chainId);\n}\n","import type { TransactionDetails } from '@avalabs/glacier-sdk';\nimport { TransactionType } from '@avalabs/vm-module-types';\n\nexport const getSenderInfo = (\n txType: TransactionType,\n { nativeTransaction, erc20Transfers, erc721Transfers }: TransactionDetails,\n address: string,\n): { isOutgoing: boolean; isIncoming: boolean; isSender: boolean; from: string; to: string } => {\n const isTransfer = txType === TransactionType.TRANSFER;\n // Glacier: SEND/RECEIVE are already “direction known from tx type” (historically native-only).\n // NFT_SEND/NFT_RECEIVE are the same idea for one-sided NFT transfers — not “native”.\n const isOutgoingByTxType = txType === TransactionType.SEND || txType === TransactionType.NFT_SEND;\n const isIncomingByTxType = txType === TransactionType.RECEIVE || txType === TransactionType.NFT_RECEIVE;\n let from = nativeTransaction?.from?.address;\n let to = nativeTransaction?.to?.address;\n\n // Until multi tokens transaction is supported in UI, using from and to of the only token is helpful for UI\n if (isTransfer && erc20Transfers && erc20Transfers[0]) {\n from = erc20Transfers[0].from.address;\n to = erc20Transfers[0].to.address;\n }\n\n if (isTransfer && erc721Transfers && erc721Transfers[0]) {\n from = erc721Transfers[0].from.address;\n to = erc721Transfers[0].to.address;\n }\n\n const isOutgoing = isOutgoingByTxType || (isTransfer && from.toLowerCase() === address.toLowerCase());\n const isIncoming = isIncomingByTxType || (isTransfer && to.toLowerCase() === address.toLowerCase());\n\n const isSender = from === address;\n\n return {\n isOutgoing,\n isIncoming,\n isSender,\n from,\n to,\n };\n};\n","import type { TransactionDetails } from '@avalabs/glacier-sdk';\nimport { TokenUnit } from '@avalabs/core-utils-sdk';\nimport type { TxToken, NetworkToken } from '@avalabs/vm-module-types';\nimport { TokenType } from '@avalabs/vm-module-types';\nimport { resolve } from '../../utils/resolve';\nimport { getNftMetadata } from './get-nft-metadata';\nimport { getSmallImageForNFT } from '../../utils/get-small-image-for-nft';\nimport { ipfsResolverWithFallback } from '../../utils/ipfs-resolver-with-fallback';\n\nexport const getTokens = async (\n { nativeTransaction, erc20Transfers, erc721Transfers, erc1155Transfers }: TransactionDetails,\n networkToken: NetworkToken,\n): Promise<TxToken[]> => {\n const result: TxToken[] = [];\n\n if (nativeTransaction.value !== '0') {\n const decimal = networkToken.decimals;\n const amount = new TokenUnit(nativeTransaction.value, networkToken.decimals, networkToken.symbol);\n const amountDisplayValue = amount.toDisplay();\n result.push({\n decimal: decimal.toString(),\n name: networkToken.name,\n symbol: networkToken.symbol,\n amount: amountDisplayValue,\n from: nativeTransaction.from,\n to: nativeTransaction.to,\n type: TokenType.NATIVE,\n });\n }\n\n erc20Transfers?.forEach((erc20Transfer) => {\n const decimals = erc20Transfer.erc20Token.decimals;\n const amount = new TokenUnit(erc20Transfer.value, decimals, erc20Transfer.erc20Token.symbol);\n const amountDisplayValue = amount.toDisplay();\n\n result.push({\n decimal: decimals.toString(),\n address: erc20Transfer.erc20Token.address,\n name: erc20Transfer.erc20Token.name,\n symbol: erc20Transfer.erc20Token.symbol,\n amount: amountDisplayValue,\n from: erc20Transfer.from,\n to: erc20Transfer.to,\n imageUri: erc20Transfer.erc20Token.logoUri,\n type: TokenType.ERC20,\n });\n });\n\n if (erc721Transfers) {\n await Promise.allSettled(\n erc721Transfers.map(async (erc721Transfer) => {\n const token = erc721Transfer.erc721Token;\n const imageUri = await getImageUri(token.tokenUri, token.metadata.imageUri);\n\n result.push({\n name: erc721Transfer.erc721Token.name,\n symbol: erc721Transfer.erc721Token.symbol,\n address: erc721Transfer.erc721Token.address,\n amount: '1',\n imageUri,\n from: erc721Transfer.from,\n to: erc721Transfer.to,\n collectableTokenId: erc721Transfer.erc721Token.tokenId,\n type: TokenType.ERC721,\n });\n }),\n );\n }\n\n if (erc1155Transfers) {\n await Promise.allSettled(\n erc1155Transfers.map(async (erc1155Transfer) => {\n const token = erc1155Transfer.erc1155Token;\n const imageUri = await getImageUri(token.tokenUri, token.metadata.imageUri);\n\n result.push({\n name: erc1155Transfer.erc1155Token.metadata.name ?? '',\n symbol: erc1155Transfer.erc1155Token.metadata.symbol ?? '',\n address: erc1155Transfer.erc1155Token.address,\n amount: erc1155Transfer.value,\n imageUri,\n from: erc1155Transfer.from,\n to: erc1155Transfer.to,\n collectableTokenId: erc1155Transfer.erc1155Token.tokenId,\n type: TokenType.ERC1155,\n });\n }),\n );\n }\n\n return result;\n};\n\nconst getImageUri = async (tokenUri: string, imageUri?: string): Promise<string> => {\n if (imageUri) {\n if (imageUri.startsWith('ipfs://')) {\n return ipfsResolverWithFallback(imageUri);\n } else {\n return imageUri;\n }\n } else {\n const [metadata, error] = await resolve(getNftMetadata(tokenUri));\n if (error) {\n return '';\n } else {\n return metadata.image ? getSmallImageForNFT(metadata.image) : '';\n }\n }\n};\n","export async function resolve<T = unknown>(promise: Promise<T>) {\n try {\n return promise.then((res) => [res, null]).catch((err) => [null, err]);\n } catch (err) {\n return Promise.resolve([null, err]);\n }\n}\n","import { ipfsResolver } from '@avalabs/core-utils-sdk';\n\nexport const CLOUDFLARE_IPFS_URL = 'https://ipfs.io';\n\nexport function ipfsResolverWithFallback(\n sourceUrl: string | undefined,\n desiredGatewayPrefix: string = CLOUDFLARE_IPFS_URL,\n) {\n if (!sourceUrl) {\n return '';\n }\n\n try {\n return ipfsResolver(sourceUrl, desiredGatewayPrefix);\n } catch {\n return sourceUrl;\n }\n}\n","import { ipfsResolverWithFallback } from '../../utils/ipfs-resolver-with-fallback';\n\ninterface NftMetadata {\n attributes?: string;\n name?: string;\n image?: string;\n description?: string;\n}\n\nasync function fetchWithTimeout(uri: string, timeout = 5000) {\n const controller = new AbortController();\n setTimeout(() => controller.abort(), timeout);\n\n return fetch(uri, { signal: controller.signal });\n}\n\nexport async function getNftMetadata(tokenUri: string) {\n let data: NftMetadata = {};\n if (!tokenUri) {\n return {};\n } else if (tokenUri.startsWith('data:application/json;base64,')) {\n const value = tokenUri.substring(29);\n try {\n const json = Buffer.from(value, 'base64').toString();\n data = JSON.parse(json);\n } catch {\n data = {};\n }\n } else {\n data = await fetchWithTimeout(ipfsResolverWithFallback(tokenUri))\n .then((r) => r.json())\n .catch(() => ({}));\n }\n return data;\n}\n","import { ipfsResolverWithFallback } from './ipfs-resolver-with-fallback';\n\nconst COVALENT_IMG_SIZER = 'https://image-proxy.svc.prod.covalenthq.com/cdn-cgi/image';\n\n/**\n * Covalent has an on the fly image resizer, it resolves image urls then resizes the image.\n *\n * This allows us to request smaller images depending on the UI needs\n *\n * @param imgUrl the url of the image to convert to size\n * @returns The url to the image which is sized at the time of request\n */\nexport function getSmallImageForNFT(imgUrl: string, imageSize: '256' | '512' | '1024' = '256') {\n const url = ipfsResolverWithFallback(imgUrl);\n return `${COVALENT_IMG_SIZER}/width=${imageSize},fit/${url}`;\n}\n","import type { Transaction, NetworkToken } from '@avalabs/vm-module-types';\nimport { getTxType } from './get-tx-type';\nimport { getSenderInfo } from './get-sender-info';\nimport { getTokens } from './get-tokens';\nimport { getExplorerAddressByNetwork } from '../../utils/get-explorer-address-by-network';\nimport type { TransactionDetails } from '@avalabs/glacier-sdk';\nimport { NonContractCallTypes } from '../../../../types';\n\ntype ConvertTransactionParams = {\n transactions: TransactionDetails;\n explorerUrl: string;\n networkToken: NetworkToken;\n chainId: number;\n address: string;\n};\n\nexport const convertTransaction = async ({\n transactions,\n explorerUrl,\n networkToken,\n chainId,\n address,\n}: ConvertTransactionParams): Promise<Transaction> => {\n const tokens = await getTokens(transactions, networkToken);\n const txType = getTxType(transactions, address, tokens);\n const { isOutgoing, isIncoming, isSender, from, to } = getSenderInfo(txType, transactions, address);\n const { blockTimestamp, txHash: hash, gasPrice, gasUsed } = transactions.nativeTransaction;\n const explorerLink = getExplorerAddressByNetwork(explorerUrl, hash);\n const isContractCall = !NonContractCallTypes.includes(txType);\n\n return {\n isContractCall,\n isIncoming,\n isOutgoing,\n isSender,\n timestamp: blockTimestamp * 1000, // s to ms\n hash,\n from,\n to,\n tokens,\n gasPrice,\n gasUsed,\n chainId: chainId.toString(),\n txType,\n explorerLink,\n };\n};\n","import type { NetworkToken, TransactionHistoryResponse } from '@avalabs/vm-module-types';\nimport { convertTransaction } from './convert-transaction';\nimport type { EvmGlacierService } from '../../../../services/glacier-service/glacier-service';\n\nexport const getTransactionsFromGlacier = async ({\n chainId,\n explorerUrl,\n networkToken,\n address,\n nextPageToken,\n offset,\n glacierService,\n}: {\n chainId: number;\n explorerUrl: string;\n networkToken: NetworkToken;\n address: string;\n nextPageToken?: string;\n offset?: number;\n glacierService: EvmGlacierService;\n}): Promise<TransactionHistoryResponse> => {\n try {\n const response = await glacierService.listTransactions({\n chainId: chainId.toString(),\n address,\n pageToken: nextPageToken,\n pageSize: offset,\n });\n\n const convertedTxs = await Promise.all(\n response.transactions\n .filter(\n // Currently not showing failed tx\n (tranasaction) => tranasaction.nativeTransaction.txStatus === '1',\n )\n .map((transactions) =>\n convertTransaction({\n transactions,\n explorerUrl,\n networkToken,\n chainId,\n address,\n }).then((tx) => tx),\n ),\n );\n\n const transactions = convertedTxs.filter(\n // Filtering txs with 0 value since there is no change in balance\n (transaction) => transaction.tokens.find((token) => Number(token.amount) !== 0),\n );\n\n return {\n transactions,\n nextPageToken: response.nextPageToken,\n };\n } catch {\n return {\n transactions: [],\n nextPageToken: '',\n };\n }\n};\n","import { TokenUnit } from '@avalabs/core-utils-sdk';\nimport {\n TokenType,\n TransactionType,\n type NetworkToken,\n type Transaction,\n type TransactionHistoryResponse,\n type TxToken,\n} from '@avalabs/vm-module-types';\nimport type {\n HyperEvmErc20Transfer,\n HyperEvmEtherscanClient,\n HyperEvmInternalTransaction,\n HyperEvmNormalTransaction,\n} from '../../../../services/hyperevm-etherscan-client/hyperevm-etherscan-client';\nimport { getExplorerAddressByNetwork } from '../../utils/get-explorer-address-by-network';\n\ntype Aggregate = {\n hash: string;\n timestamp: number;\n from: string;\n to: string;\n gasPrice?: string;\n gasUsed: string;\n isContractCall: boolean;\n tokens: TxToken[];\n};\n\nexport async function getTransactionsFromHyperEvm({\n client,\n chainId,\n networkToken,\n explorerUrl,\n address,\n nextPageToken,\n offset = 25,\n}: {\n client: Pick<HyperEvmEtherscanClient, 'listNormalTransactions' | 'listErc20Transfers' | 'listInternalTransactions'>;\n chainId: number;\n networkToken: NetworkToken;\n explorerUrl: string;\n address: string;\n nextPageToken?: string;\n offset?: number;\n}): Promise<TransactionHistoryResponse> {\n try {\n const page = getPage(nextPageToken);\n const [normal, erc20, internal] = await Promise.all([\n client.listNormalTransactions(address, { page, offset }),\n client.listErc20Transfers(address, { page, offset }),\n client.listInternalTransactions(address, { page, offset }),\n ]);\n const aggregates = new Map<string, Aggregate>();\n\n for (const transaction of normal) {\n if (transaction.isError !== '0' || transaction.txreceipt_status !== '1') continue;\n const aggregate = getAggregate(aggregates, transaction);\n const token = nativeToken(transaction, networkToken);\n if (token) aggregate.tokens.push(token);\n }\n for (const transfer of erc20) {\n const aggregate = getAggregate(aggregates, transfer);\n aggregate.tokens.push(erc20Token(transfer));\n }\n for (const transaction of internal) {\n if (transaction.isError !== '0') continue;\n const aggregate = getAggregate(aggregates, transaction);\n const token = internalToken(transaction, networkToken);\n if (token) aggregate.tokens.push(token);\n }\n\n const transactions = Array.from(aggregates.values())\n .map((aggregate) => toTransaction(aggregate, address, explorerUrl, networkToken, chainId))\n .sort((a, b) => b.timestamp - a.timestamp);\n const hasNextPage = [normal, erc20, internal].some((list) => list.length === offset);\n\n return { transactions, nextPageToken: hasNextPage ? String(page + 1) : '' };\n } catch {\n return { transactions: [], nextPageToken: '' };\n }\n}\n\nfunction getPage(nextPageToken?: string): number {\n const page = Number(nextPageToken);\n return Number.isSafeInteger(page) && page > 0 ? page : 1;\n}\n\nfunction getAggregate(\n aggregates: Map<string, Aggregate>,\n transaction: HyperEvmNormalTransaction | HyperEvmErc20Transfer | HyperEvmInternalTransaction,\n): Aggregate {\n const existing = aggregates.get(transaction.hash);\n if (existing) return existing;\n\n const aggregate: Aggregate = {\n hash: transaction.hash,\n timestamp: Number(transaction.timeStamp) * 1000,\n from: transaction.from,\n to: transaction.to,\n gasPrice: 'gasPrice' in transaction ? transaction.gasPrice : undefined,\n gasUsed: transaction.gasUsed,\n isContractCall: 'input' in transaction && transaction.input !== '0x',\n tokens: [],\n };\n aggregates.set(transaction.hash, aggregate);\n return aggregate;\n}\n\nfunction nativeToken(transaction: HyperEvmNormalTransaction, networkToken: NetworkToken): TxToken | undefined {\n if (transaction.value === '0') return undefined;\n return {\n decimal: String(networkToken.decimals),\n name: networkToken.name,\n symbol: networkToken.symbol,\n amount: new TokenUnit(transaction.value, networkToken.decimals, networkToken.symbol).toDisplay(),\n from: { address: transaction.from },\n to: { address: transaction.to },\n type: TokenType.NATIVE,\n };\n}\n\nfunction internalToken(transaction: HyperEvmInternalTransaction, networkToken: NetworkToken): TxToken | undefined {\n if (transaction.value === '0') return undefined;\n return {\n decimal: String(networkToken.decimals),\n name: networkToken.name,\n symbol: networkToken.symbol,\n amount: new TokenUnit(transaction.value, networkToken.decimals, networkToken.symbol).toDisplay(),\n from: { address: transaction.from },\n to: { address: transaction.to },\n type: TokenType.NATIVE,\n };\n}\n\nfunction erc20Token(transfer: HyperEvmErc20Transfer): TxToken {\n return {\n decimal: transfer.tokenDecimal,\n name: transfer.tokenName,\n symbol: transfer.tokenSymbol,\n amount: new TokenUnit(transfer.value, Number(transfer.tokenDecimal), transfer.tokenSymbol).toDisplay(),\n from: { address: transfer.from },\n to: { address: transfer.to },\n type: TokenType.ERC20,\n address: transfer.contractAddress,\n };\n}\n\nfunction toTransaction(\n aggregate: Aggregate,\n address: string,\n explorerUrl: string,\n networkToken: NetworkToken,\n chainId: number,\n): Transaction {\n const wallet = address.toLowerCase();\n const hasIncoming = aggregate.tokens.some((token) => token.to?.address.toLowerCase() === wallet);\n const hasOutgoing = aggregate.tokens.some((token) => token.from?.address.toLowerCase() === wallet);\n const isSender = aggregate.from.toLowerCase() === wallet || hasOutgoing;\n const txType =\n hasIncoming && hasOutgoing ? TransactionType.SWAP : isSender ? TransactionType.SEND : TransactionType.RECEIVE;\n\n return {\n isContractCall: aggregate.isContractCall || (hasIncoming && hasOutgoing),\n isIncoming: hasIncoming && !hasOutgoing,\n isOutgoing: hasOutgoing,\n isSender,\n timestamp: aggregate.timestamp,\n hash: aggregate.hash,\n from: aggregate.from,\n to: aggregate.to,\n tokens:\n aggregate.tokens.length > 0\n ? aggregate.tokens\n : [\n {\n decimal: String(networkToken.decimals),\n name: networkToken.name,\n symbol: networkToken.symbol,\n amount: '0',\n type: TokenType.NATIVE,\n },\n ],\n gasPrice: aggregate.gasPrice,\n gasUsed: aggregate.gasUsed,\n chainId: chainId.toString(),\n txType,\n explorerLink: getExplorerAddressByNetwork(explorerUrl, aggregate.hash),\n };\n}\n","import { getTransactionsFromMoralis } from './converters/moralis-transaction-converter/get-transactions-from-moralis';\nimport { isMoralisSupportedChain } from './utils/moralis-chain-ids';\nimport type { NetworkToken, TransactionHistoryResponse } from '@avalabs/vm-module-types';\nimport { getTransactionsFromGlacier } from './converters/evm-transaction-converter/get-transactions-from-glacier';\nimport type { EvmGlacierService } from '../../services/glacier-service/glacier-service';\nimport type { HyperEvmEtherscanClient } from '../../services/hyperevm-etherscan-client/hyperevm-etherscan-client';\nimport { getTransactionsFromHyperEvm } from './converters/hyperevm-transaction-converter/get-transactions-from-hyperevm';\n\nconst HYPEREVM_CHAIN_ID = 999;\n\nexport const getTransactionHistory = async ({\n chainId,\n networkToken,\n explorerUrl,\n address,\n nextPageToken,\n offset,\n glacierService,\n hyperEvmEtherscanClient,\n}: {\n chainId: number;\n networkToken: NetworkToken;\n explorerUrl: string;\n address: string;\n nextPageToken?: string;\n offset?: number;\n glacierService: EvmGlacierService;\n hyperEvmEtherscanClient?: HyperEvmEtherscanClient;\n}): Promise<TransactionHistoryResponse> => {\n if (chainId === HYPEREVM_CHAIN_ID) {\n if (!hyperEvmEtherscanClient) {\n return { transactions: [], nextPageToken: '' };\n }\n\n return getTransactionsFromHyperEvm({\n client: hyperEvmEtherscanClient,\n chainId,\n networkToken,\n explorerUrl,\n address,\n nextPageToken,\n offset,\n });\n }\n\n if (isMoralisSupportedChain(chainId)) {\n return getTransactionsFromMoralis({\n chainId,\n networkToken,\n explorerUrl,\n address,\n nextPageToken,\n offset,\n });\n }\n\n const isHealthy = glacierService.isHealthy();\n if (!isHealthy) {\n return {\n transactions: [],\n nextPageToken: '',\n };\n }\n\n return getTransactionsFromGlacier({\n networkToken,\n explorerUrl,\n chainId,\n address,\n nextPageToken,\n offset,\n glacierService,\n });\n};\n","import { TokenUnit } from '@avalabs/core-utils-sdk';\nimport { CurrencyCode, NftTokenMetadataStatus } from '@avalabs/glacier-sdk';\nimport {\n type Error,\n type NetworkTokenWithBalance,\n type NftTokenWithBalance,\n TokenType,\n type TokenWithBalanceEVM,\n} from '@avalabs/vm-module-types';\nimport { getExchangeRates } from '@internal/utils';\nimport { rpcErrors } from '@metamask/rpc-errors';\nimport type { BalanceServiceInterface, TokenId } from '@src/handlers/get-balances/balance-service-interface';\nimport { getSmallImageForNFT } from '@src/utils/get-small-image-for-nft';\nimport { isHexString } from 'ethers';\nimport { DeBank, type DeBankChainInfo, type DeBankNftToken } from './de-bank';\n\nexport class DeBankService implements BalanceServiceInterface {\n #deBank: DeBank;\n\n constructor({ proxyApiUrl, fetch }: { proxyApiUrl: string; fetch?: typeof globalThis.fetch }) {\n this.#deBank = new DeBank(`${proxyApiUrl}/proxy/debank`, fetch);\n }\n\n async isNetworkSupported(chainId: number): Promise<boolean> {\n return this.#deBank.isNetworkSupported(chainId);\n }\n\n async #getChainInfo(chainId: number): Promise<{ chainInfo: DeBankChainInfo; chainIdString: string }> {\n const chainList = await this.#deBank.getChainList();\n const chainIdString = chainList.find((value) => value.community_id === chainId)?.id;\n if (!chainIdString) {\n throw rpcErrors.invalidParams('getNativeBalance: not valid chainId: ' + chainId);\n }\n\n const chainInfo = await this.#deBank.getChainInfo({ chainId: chainIdString });\n\n if (!chainInfo) {\n throw rpcErrors.invalidParams('getNativeBalance: not valid chainId: ' + chainId);\n }\n\n return {\n chainInfo,\n chainIdString,\n };\n }\n\n async getNativeBalance({\n chainId,\n address,\n currency,\n }: {\n chainId: number;\n address: string;\n currency: CurrencyCode;\n }): Promise<NetworkTokenWithBalance> {\n if (!isHexString(address)) throw rpcErrors.invalidParams('getNativeBalance: not valid address: ' + address);\n const { chainInfo, chainIdString } = await this.#getChainInfo(chainId);\n\n const tokenId = chainInfo.native_token_id;\n const nativeTokenBalance = await this.#deBank.getTokenBalance({ address, chainId: chainIdString, tokenId });\n const tokenUnit = new TokenUnit(\n nativeTokenBalance.raw_amount,\n nativeTokenBalance.decimals,\n nativeTokenBalance.symbol,\n );\n const balanceDisplayValue = tokenUnit.toDisplay();\n const exchangeRates = await getExchangeRates();\n const usdToCurrencyRate = exchangeRates.usd[currency.toLowerCase()];\n const priceInCurrency = usdToCurrencyRate ? usdToCurrencyRate * nativeTokenBalance.price : undefined;\n const balanceCurrencyDisplayValue = priceInCurrency\n ? tokenUnit.mul(priceInCurrency).toDisplay({ fixedDp: 2 })\n : undefined;\n const balanceInCurrency = priceInCurrency\n ? tokenUnit.mul(priceInCurrency).toDisplay({ fixedDp: 2, asNumber: true })\n : undefined;\n\n return {\n name: nativeTokenBalance.name,\n symbol: nativeTokenBalance.symbol,\n decimals: nativeTokenBalance.decimals,\n type: TokenType.NATIVE,\n logoUri: nativeTokenBalance.logo_url,\n balance: tokenUnit.toSubUnit(),\n balanceDisplayValue,\n balanceInCurrency,\n balanceCurrencyDisplayValue,\n priceInCurrency,\n } as NetworkTokenWithBalance;\n }\n\n async listErc20Balances({\n chainId,\n address,\n currency,\n }: {\n chainId: number;\n address: string;\n currency: CurrencyCode;\n pageSize: number;\n pageToken?: string;\n }): Promise<Record<TokenId, TokenWithBalanceEVM | Error>> {\n if (!isHexString(address)) throw rpcErrors.invalidParams('listErc20Balances: not valid address');\n const { chainInfo, chainIdString } = await this.#getChainInfo(chainId);\n\n const tokenBalances = await this.#deBank.getTokensBalanceOnChain({ chainId: chainIdString, address });\n const exchangeRates = await getExchangeRates();\n\n const erc20TokenBalances: Record<TokenId, TokenWithBalanceEVM | Error> = {};\n for (const tokenBalance of tokenBalances) {\n // skip native token or tokens which are not core tokens\n if (tokenBalance.id === chainInfo.native_token_id || tokenBalance.is_core === false) {\n continue;\n }\n\n const tokenUnit = new TokenUnit(tokenBalance.raw_amount, tokenBalance.decimals, tokenBalance.symbol);\n const balanceDisplayValue = tokenUnit.toDisplay();\n const usdToCurrencyRate = exchangeRates.usd[currency.toLowerCase()];\n const priceInCurrency = usdToCurrencyRate ? usdToCurrencyRate * tokenBalance.price : undefined;\n const balanceCurrencyDisplayValue = priceInCurrency\n ? tokenUnit.mul(priceInCurrency).toDisplay({ fixedDp: 2 })\n : undefined;\n const balanceInCurrency = priceInCurrency\n ? tokenUnit.mul(priceInCurrency).toDisplay({ fixedDp: 2, asNumber: true })\n : undefined;\n\n erc20TokenBalances[tokenBalance.id] = {\n chainId: chainInfo.community_id,\n address: tokenBalance.id,\n name: tokenBalance.name,\n symbol: tokenBalance.symbol,\n decimals: tokenBalance.decimals,\n logoUri: tokenBalance.logo_url,\n balance: tokenUnit.toSubUnit(),\n balanceCurrencyDisplayValue,\n balanceDisplayValue,\n balanceInCurrency,\n priceInCurrency,\n type: TokenType.ERC20,\n reputation: null,\n };\n }\n\n return erc20TokenBalances;\n }\n\n #mapNftList(deBankNftList: DeBankNftToken[], chainId: number): Record<string, NftTokenWithBalance | Error> {\n return deBankNftList.reduce(\n (accumulator, token) => ({\n ...accumulator,\n [`${token.contract_id}-${token.id}`]: {\n chainId,\n address: token.contract_id,\n description: token.description ?? '',\n logoUri: token.thumbnail_url,\n logoSmall: getSmallImageForNFT(token.content),\n name: token.name,\n symbol: '',\n tokenId: `${token.inner_id}`,\n tokenUri: token.detail_url,\n collectionName: token.collection_name,\n balance: BigInt(token.amount),\n balanceDisplayValue: `${token.amount}`,\n type: token.is_erc721 ? TokenType.ERC721 : TokenType.ERC1155,\n metadata: {\n indexStatus: NftTokenMetadataStatus.UNINDEXED,\n description: token.description ?? '',\n properties: '',\n },\n },\n }),\n {} as Record<string, NftTokenWithBalance>,\n );\n }\n\n async listNftBalances({\n chainId,\n address,\n }: {\n chainId: number;\n address: string;\n }): Promise<Record<string, NftTokenWithBalance | Error>> {\n if (!isHexString(address)) {\n throw rpcErrors.invalidParams('listNftBalances: not valid address');\n }\n const { chainIdString } = await this.#getChainInfo(chainId);\n\n const nftList = await this.#deBank.getNftList({ chainId: chainIdString, address });\n return this.#mapNftList(nftList, chainId);\n }\n}\n","import { ipfsResolver } from '@avalabs/core-utils-sdk';\n\nexport const IPFS_URL = 'https://ipfs.io';\n\nexport function ipfsResolverWithFallback(sourceUrl: string | undefined, desiredGatewayPrefix: string = IPFS_URL) {\n if (!sourceUrl) {\n return '';\n }\n\n try {\n return ipfsResolver(sourceUrl, desiredGatewayPrefix);\n } catch {\n return sourceUrl;\n }\n}\n","import { ipfsResolverWithFallback } from './ipsf-resolver-with-fallback';\n\nconst COVALENT_IMG_SIZER = 'https://image-proxy.svc.prod.covalenthq.com/cdn-cgi/image';\n\n/**\n * Covalent has an on the fly image resizer, it resolves image urls then resizes the image.\n *\n * This allows us to request smaller images depending on the UI needs\n *\n * @param imgUrl the url of the image to convert to size\n * @param imageSize the resize dimension\n * @returns The url to the image which is sized at the time of request\n */\nexport function getSmallImageForNFT(imgUrl: string, imageSize: '256' | '512' | '1024' = '256') {\n const url = ipfsResolverWithFallback(imgUrl);\n return `${COVALENT_IMG_SIZER}/width=${imageSize},fit/${url}`;\n}\n","import type { Hex } from '@avalabs/vm-module-types';\nimport { fetchAndVerify } from '@internal/utils';\nimport { isHexString } from 'ethers';\nimport { z } from 'zod';\n\nexport class DeBank {\n #supportedChainIds: DeBankChainInfo[] = [];\n #fetchFn: typeof fetch;\n\n constructor(\n private baseUrl: string,\n fetchFn?: typeof fetch,\n ) {\n this.#fetchFn = fetchFn ?? fetch;\n }\n\n async isNetworkSupported(chainId: number): Promise<boolean> {\n const chainList: DeBankChainInfo[] = await this.getChainList();\n return chainList.some((value) => value.community_id === chainId);\n }\n\n /**\n * @param chainId - DeBank chain id (ex. \"base\", \"eth\")\n */\n async getChainInfo({ chainId }: { chainId: string }): Promise<DeBankChainInfo | undefined> {\n const chainList = await this.getChainList();\n return chainList.find((chain) => chain.id === chainId);\n }\n\n /**\n * @param chainId - DeBank chain id (ex. \"base\", \"eth\")\n * @param address - account address\n * @param tokenId - The address of the token contract or a native token id (eth, matic, bsc)\n */\n async getTokenBalance({\n chainId,\n address,\n tokenId,\n }: {\n chainId: string;\n address: Hex;\n tokenId: Hex | string;\n }): Promise<DeBankToken> {\n const tokenBalanceResponse = await this.#fetchFn(\n `${this.baseUrl}/v1/user/token?id=${address}&chain_id=${chainId}&token_id=${tokenId}`,\n );\n if (tokenBalanceResponse.ok) {\n return await tokenBalanceResponse.json();\n } else {\n throw new Error(`${tokenBalanceResponse.status}:${tokenBalanceResponse.statusText}`);\n }\n }\n\n /**\n * @param chainId - DeBank chain id (ex. \"base\", \"eth\")\n * @param address - account address\n */\n async getTokensBalanceOnChain({ chainId, address }: { chainId: string; address: Hex }): Promise<DeBankToken[]> {\n const tokenBalanceResponse = await this.#fetchFn(\n `${this.baseUrl}/v1/user/token_list?id=${address}&chain_id=${chainId}`,\n );\n if (tokenBalanceResponse.ok) {\n return await tokenBalanceResponse.json();\n } else {\n throw new Error(`${tokenBalanceResponse.status}:${tokenBalanceResponse.statusText}`);\n }\n }\n\n /**\n * @param chainId - DeBank chain id (ex. \"base\", \"eth\")\n * @param address - account address\n */\n async getTokenList({ chainId, address }: { chainId: string; address: Hex }): Promise<DeBankToken[]> {\n const response = await (this.#fetchFn ?? globalThis.fetch)(\n `${this.baseUrl}/v1/user/token_list?id=${address}&chain_id=${chainId}`,\n );\n if (response.ok) {\n return await response.json();\n } else {\n throw new Error(`${response.status}:${response.statusText}`);\n }\n }\n\n /**\n * @returns Cached chain list if there is any, or tries to fetch it from API\n */\n async getChainList(): Promise<DeBankChainInfo[]> {\n if (this.#supportedChainIds.length === 0) {\n const chainListResponse = await this.#fetchFn(`${this.baseUrl}/v1/chain/list`);\n if (chainListResponse.ok) {\n this.#supportedChainIds = await chainListResponse.json();\n } else {\n throw new Error(`${chainListResponse.status}:${chainListResponse.statusText}`);\n }\n }\n return this.#supportedChainIds;\n }\n\n /**\n * @param chainId - DeBank chain id (ex. \"base\", \"eth\")\n * @param address - account address\n */\n async getNftList({ address, chainId }: { chainId: string; address: Hex }): Promise<DeBankNftToken[]> {\n return fetchAndVerify<typeof DeBankNftTokenListSchema>(\n [`${this.baseUrl}/v1/user/nft_list?id=${address}&chain_id=${chainId}`],\n DeBankNftTokenListSchema,\n this.#fetchFn,\n );\n }\n}\n\nconst BaseDeBankTokenSchema = z.object({\n id: z.union([z.custom<string>(isHexString), z.string()]), //address or native token id (eth, matic, bsc)\n chain: z.string(),\n name: z.string(),\n});\n\ntype BaseDeBankToken = z.infer<typeof BaseDeBankTokenSchema>;\n\n/**\n * Example:\n * ```json\n * {\n * \"id\": \"0x19225f002b65eefb22950b9739fc8b448d900d44\",\n * \"chain\": \"base\",\n * \"name\": \"BASE\",\n * \"symbol\": \"Collect on: swap-based.com\",\n * \"display_symbol\": null,\n * \"optimized_symbol\": \"Collect on: swap-based.com\",\n * \"decimals\": 0,\n * \"logo_url\": null,\n * \"protocol_id\": \"\",\n * \"price\": 0,\n * \"price_24h_change\": null,\n * \"is_verified\": false,\n * \"is_core\": false,\n * \"is_wallet\": false,\n * \"time_at\": 1712662101,\n * \"amount\": 250000,\n * \"raw_amount\": 250000,\n * \"raw_amount_hex_str\": \"0x3d090\"\n * }\n * ```\n */\n\n// TODO: create zod schema\nexport type DeBankToken = BaseDeBankToken & {\n symbol: string;\n optimized_symbol: string;\n decimals: number;\n logo_url: string;\n protocol_id: string;\n price: number;\n is_core: boolean;\n is_wallet: boolean;\n time_at: number;\n amount: bigint;\n raw_amount: bigint;\n};\n\n/**\n * Example:\n * ```json\n * {\n * \"id\": \"eth\",\n * \"community_id\": 1,\n * \"name\": \"Ethereum\",\n * \"native_token_id\": \"eth\",\n * \"logo_url\": \"https://static.debank.com/image/chain/logo_url/eth/42ba589cd077e7bdd97db6480b0ff61d.png\",\n * \"wrapped_token_id\": \"0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2\",\n * \"is_support_pre_exec\": true\n * }\n * ```\n */\n// TODO: create zod schema\nexport type DeBankChainInfo = {\n id: string;\n community_id: number;\n name: string;\n native_token_id: string;\n logo_url: string;\n wrapped_token_id: Hex;\n is_support_pre_exec: boolean;\n};\n\n/**\n * Example:\n * ```json\n * {\n * \"id\": \"defc948fbe6d3b138b49bf981e276f0b\",\n * \"contract_id\": \"0x495f947276749ce646f68ac8c248420045cb7b5e\",\n * \"inner_id\": \"55575360221028374465659771733000318579577403829328624053715758637886677712897\",\n * \"chain\": \"eth\",\n * \"name\": \"A New Era has begun\",\n * \"description\": \"3 of 9\\n\\nOn February 8, 2021, one of the most influential men in the world decided to invest in Bitcoin. Elon Musk, owner of Tesl\",\n * \"content_type\": \"image_url\",\n * \"content\": \"https://lh3.googleusercontent.com/WQnK8JxSSPj5YIxegh9iaprMaMmv-JswrcnTp9Mi5PXKDWmigkOzTBBIAkhdXtLPe7EwIe6Q1gi2gdtLzV08d2y67rMVTHx0Ei0S\",\n * \"detail_url\": \"https://opensea.io/assets/0x495f947276749ce646f68ac8c248420045cb7b5e/55575360221028374465659771733000318579577403829328624053715758637886677712897\",\n * \"contract_name\": \"OpenSea Shared Storefront\",\n * \"is_erc1155\": true,\n * \"amount\": 1,\n * \"protocol\": {\n * \"id\": \"opensea\",\n * \"chain\": \"eth\",\n * \"name\": \"OpenSea\",\n * \"site_url\": \"https://opensea.io\",\n * \"logo_url\": \"https://static.debank.com/image/project/logo_url/opensea/4b23246fac2d4ce53bd8e8079844821c.png\",\n * \"has_supported_portfolio\": false,\n * \"tvl\": 114295.77061458935\n * },\n * \"pay_token\": {\n * \"id\": \"eth\",\n * \"chain\": \"eth\",\n * \"name\": \"ETH\",\n * \"symbol\": \"ETH\",\n * \"display_symbol\": null,\n * \"optimized_symbol\": \"ETH\",\n * \"decimals\": 18,\n * \"logo_url\": \"https://static.debank.com/image/token/logo_url/eth/935ae4e4d1d12d59a99717a24f2540b5.png\",\n * \"protocol_id\": \"\",\n * \"price\": 2510.46,\n * \"is_verified\": true,\n * \"is_core\": true,\n * \"is_wallet\": true,\n * \"time_at\": 1628248886,\n * \"amount\": 0.0178,\n * \"date_at\": \"2021-08-06\"\n * },\n * \"attributes\": [\n * {\n * \"trait_type\": \"Artist\",\n * \"value\": \"SpaceTurtleShip\"\n * },\n * {\n * \"trait_type\": \"Edition\",\n * \"value\": \"1\"\n * }\n * ],\n * \"usd_price\": 51.492552,\n * \"collection_id\": null\n * }\n * ```\n * */\n\nconst DeBankNftTokenSchema = BaseDeBankTokenSchema.merge(\n z.object({\n contract_id: z.string(),\n description: z.string().nullable(),\n content_type: z.string().nullable(),\n content: z.string(),\n thumbnail_url: z.string(),\n total_supply: z.number(),\n detail_url: z.string(),\n collection_id: z.string(),\n is_core: z.boolean(),\n inner_id: z.string(),\n collection_name: z.string(),\n contract_name: z.string(),\n amount: z.number(),\n usd_price: z.number().optional(),\n is_erc721: z.boolean().optional(),\n is_erc1155: z.boolean().optional(),\n }),\n);\n\nconst DeBankNftTokenListSchema = z.array(DeBankNftTokenSchema);\n\nexport type DeBankNftToken = z.infer<typeof DeBankNftTokenSchema>;\n","import { TokenUnit } from '@avalabs/core-utils-sdk';\nimport {\n CurrencyCode,\n Erc1155Token,\n Erc1155TokenBalance,\n Erc20TokenBalance,\n Erc721Token,\n Erc721TokenBalance,\n Glacier,\n} from '@avalabs/glacier-sdk';\nimport {\n type ERC20Token,\n type Error,\n type NetworkTokenWithBalance,\n type NftTokenWithBalance,\n TokenType,\n type TokenWithBalanceERC20,\n type TokenWithBalanceEVM,\n} from '@avalabs/vm-module-types';\n\nimport { ChainId } from '@avalabs/core-chains-sdk';\nimport { GlacierFetchHttpRequest } from '@internal/utils';\nimport { DEFAULT_DECIMALS } from '@src/constants';\nimport type { BalanceServiceInterface } from '@src/handlers/get-balances/balance-service-interface';\nimport { getSmallImageForNFT } from '@src/utils/get-small-image-for-nft';\n\nclass GlacierUnhealthyError extends Error {\n override message = 'Glacier is unhealthy. Try again later.';\n}\n\nconst CHAINS_TO_FILTER = [ChainId.ETHEREUM_HOMESTEAD];\n\ntype GlacierServiceConfig = {\n glacierApiUrl: string;\n headers?: Record<string, string>;\n /**\n * Resolves per-request auth headers (e.g. a Firebase AppCheck token) required\n * by the Glacier proxy. Merged over the static `headers`.\n */\n getAuthHeaders?: () => Promise<Record<string, string> | undefined>;\n};\n\nexport class EvmGlacierService implements BalanceServiceInterface {\n glacierSdk: Glacier;\n isGlacierHealthy = true;\n supportedChainIds: string[] = [];\n\n constructor({ glacierApiUrl, headers, getAuthHeaders }: GlacierServiceConfig) {\n this.glacierSdk = new Glacier(\n {\n BASE: glacierApiUrl,\n HEADERS: getAuthHeaders ? async () => ({ ...headers, ...(await getAuthHeaders()) }) : headers,\n },\n GlacierFetchHttpRequest,\n );\n /**\n * This is for performance, basically we just cache the health of glacier every 5 seconds and\n * go off of that instead of every request\n */\n this.getSupportedChainIds().catch(() => {\n // Noop. It will be retried by .isSupportedNetwork calls upon unlocking if necessary.\n });\n }\n\n isHealthy = (): boolean => this.isGlacierHealthy;\n\n setGlacierToUnhealthy(): void {\n this.isGlacierHealthy = false;\n setTimeout(\n () => {\n this.isGlacierHealthy = true;\n },\n 5 * 60 * 1000,\n ); // 5 minutes\n }\n\n async isNetworkSupported(chainId: number): Promise<boolean> {\n const chainIds = await this.getSupportedChainIds();\n return chainIds.some((id) => id === chainId.toString());\n }\n\n async getSupportedChainIds(): Promise<string[]> {\n if (this.supportedChainIds.length) {\n return this.supportedChainIds;\n }\n\n try {\n const supportedChains = await this.glacierSdk.evmChains.supportedChains({});\n /*\n * https://ava-labs.atlassian.net/browse/CP-9855\n * We are removing the support for Ethereum chain, so it is queried from DeBank instead\n */\n this.supportedChainIds = supportedChains.chains\n .map((chain) => chain.chainId)\n .filter((chainId) => !CHAINS_TO_FILTER.includes(Number(chainId)));\n return this.supportedChainIds;\n } catch {\n return [];\n }\n }\n\n async reindexNft({\n address,\n chainId,\n tokenId,\n }: {\n address: string;\n chainId: string;\n tokenId: string;\n }): Promise<void> {\n try {\n await this.glacierSdk.nfTs.reindexNft({\n address,\n chainId,\n tokenId,\n });\n } catch (error) {\n if (error instanceof GlacierUnhealthyError) {\n this.setGlacierToUnhealthy();\n }\n throw error;\n }\n }\n\n async getTokenDetails({\n address,\n chainId,\n tokenId,\n }: {\n address: string;\n chainId: string;\n tokenId: string;\n }): Promise<Erc721Token | Erc1155Token> {\n try {\n return this.glacierSdk.nfTs.getTokenDetails({\n address,\n chainId,\n tokenId,\n });\n } catch (error) {\n if (error instanceof GlacierUnhealthyError) {\n this.setGlacierToUnhealthy();\n }\n throw error;\n }\n }\n\n async getNativeBalance({\n chainId,\n address,\n currency,\n coingeckoId,\n }: {\n chainId: number;\n address: string;\n currency: CurrencyCode;\n coingeckoId?: string;\n }): Promise<NetworkTokenWithBalance> {\n try {\n const nativeBalance = await this.glacierSdk.evmBalances.getNativeBalance({\n chainId: chainId.toString(),\n address,\n currency: currency.toLocaleLowerCase() as CurrencyCode,\n });\n\n const nativeTokenBalance = nativeBalance.nativeTokenBalance;\n const balance = new TokenUnit(nativeTokenBalance.balance, nativeTokenBalance.decimals, nativeTokenBalance.symbol);\n const priceInCurrency = nativeTokenBalance.price?.value;\n const balanceInCurrency = priceInCurrency !== undefined ? balance.mul(priceInCurrency) : undefined;\n\n return {\n name: nativeTokenBalance.name,\n symbol: nativeTokenBalance.symbol,\n decimals: nativeTokenBalance.decimals,\n type: TokenType.NATIVE,\n logoUri: nativeTokenBalance.logoUri,\n balance: balance.toSubUnit(),\n balanceDisplayValue: balance.toDisplay(),\n balanceInCurrency: balanceInCurrency?.toDisplay({ fixedDp: 2, asNumber: true }),\n balanceCurrencyDisplayValue: balanceInCurrency?.toDisplay({ fixedDp: 2 }),\n priceInCurrency,\n coingeckoId: coingeckoId ?? '',\n };\n } catch (error) {\n if (error instanceof GlacierUnhealthyError) {\n this.setGlacierToUnhealthy();\n }\n throw error;\n }\n }\n\n async listErc721Balances({ chainId, address }: { chainId: string; address: string }): Promise<Erc721TokenBalance[]> {\n /**\n * Load all pages to make sure we have all the tokens with balances\n */\n let nextPageToken: string | undefined = undefined;\n const tokens: Erc721TokenBalance[] = [];\n do {\n try {\n const response = await this.glacierSdk.evmBalances.listErc721Balances({\n chainId,\n address,\n pageSize: 100,\n pageToken: nextPageToken,\n });\n\n tokens.push(...response.erc721TokenBalances);\n\n nextPageToken = response.nextPageToken;\n } catch (error) {\n if (error instanceof GlacierUnhealthyError) {\n this.setGlacierToUnhealthy();\n }\n throw error;\n }\n } while (nextPageToken);\n\n return tokens;\n }\n\n async listErc1155Balances({\n chainId,\n address,\n }: {\n chainId: string;\n address: string;\n }): Promise<Erc1155TokenBalance[]> {\n /**\n * Load all pages to make sure we have all the tokens with balances\n */\n let nextPageToken: string | undefined = undefined;\n const tokens: Erc1155TokenBalance[] = [];\n do {\n try {\n const response = await this.glacierSdk.evmBalances.listErc1155Balances({\n chainId,\n address,\n pageSize: 100,\n pageToken: nextPageToken,\n });\n\n tokens.push(...response.erc1155TokenBalances);\n\n nextPageToken = response.nextPageToken;\n } catch (error) {\n if (error instanceof GlacierUnhealthyError) {\n this.setGlacierToUnhealthy();\n }\n throw error;\n }\n } while (nextPageToken);\n\n return tokens;\n }\n\n async listNftBalances({\n chainId,\n address,\n }: {\n chainId: number;\n address: string;\n }): Promise<Record<string, NftTokenWithBalance | Error>> {\n const balances = await Promise.allSettled([\n this.listErc721Balances({ chainId: chainId.toString(), address }),\n this.listErc1155Balances({ chainId: chainId.toString(), address }),\n ]);\n\n const entries = balances\n .filter(\n (\n tokenlist,\n ): tokenlist is PromiseFulfilledResult<Erc721TokenBalance[]> | PromiseFulfilledResult<Erc1155TokenBalance[]> =>\n tokenlist.status === 'fulfilled',\n )\n .flatMap((tokenlist) => {\n return (\n tokenlist.value\n // We filter out erc1155s with 0 balance, which Glacier returns for some reason\n .filter((token) => token.ercType === Erc721Token.ercType.ERC_721 || BigInt(token.balance) > 0n)\n .map((token) => {\n return [\n `${token.address}-${token.tokenId}`,\n {\n address: token.address,\n description: token.metadata.description ?? '',\n logoUri: token.metadata.imageUri ?? '',\n logoSmall: getSmallImageForNFT(token.metadata.imageUri ?? ''),\n name: token.metadata.name ?? '',\n symbol: token.metadata.symbol ?? '',\n tokenId: token.tokenId,\n tokenUri: token.tokenUri,\n chainId,\n // glacier does not provide the collection name information\n collectionName: 'Unknown',\n balance: token.ercType === Erc1155Token.ercType.ERC_1155 ? BigInt(token.balance) : 1,\n balanceDisplayValue: token.ercType === Erc1155Token.ercType.ERC_1155 ? token.balance : '1',\n type: token.ercType === Erc721Token.ercType.ERC_721 ? TokenType.ERC721 : TokenType.ERC1155,\n metadata: {\n indexStatus: token.metadata.indexStatus,\n description: token.metadata.description,\n lastUpdatedTimestamp: token.metadata.metadataLastUpdatedTimestamp,\n properties:\n token.ercType === Erc721Token.ercType.ERC_721\n ? token.metadata.attributes\n : token.metadata.properties,\n },\n },\n ];\n })\n );\n });\n\n return Object.fromEntries(entries);\n }\n\n async listErc20Balances({\n chainId,\n address,\n currency,\n customTokens,\n }: {\n chainId: number;\n address: string;\n currency: CurrencyCode;\n customTokens: ERC20Token[];\n }): Promise<Record<string, TokenWithBalanceEVM | Error>> {\n try {\n const tokensWithBalance: TokenWithBalanceERC20[] = [];\n /**\n * Load all pages to make sure we have all the tokens with balances\n */\n let nextPageToken: string | undefined = undefined;\n do {\n const response = await this.glacierSdk.evmBalances.listErc20Balances({\n chainId: chainId.toString(),\n address,\n currency: currency.toLocaleLowerCase() as CurrencyCode,\n pageSize: 100, // glacier has a cap on page size of 100\n pageToken: nextPageToken,\n });\n\n tokensWithBalance.push(\n ...convertErc20TokenWithBalanceToTokenWithBalance(response.erc20TokenBalances, Number(chainId)),\n );\n nextPageToken = response.nextPageToken;\n } while (nextPageToken);\n\n /**\n * Glacier doesnt return tokens without balances so we need to polyfill that list\n * from our own list of tokens. We just set the balance to 0, these zero balance\n * tokens are only used for swap, bridge and tx parsing.\n */\n return [\n ...convertErc20TokenToTokenWithBalance(customTokens),\n ...tokensWithBalance, // this needs to be second in the list so it overwrites its zero balance counterpart if there is one\n ].reduce(\n (acc, token) => {\n return { ...acc, [token.address.toLowerCase()]: token };\n },\n {} as Record<string, TokenWithBalanceEVM>,\n );\n } catch (error) {\n if (error instanceof GlacierUnhealthyError) {\n this.setGlacierToUnhealthy();\n }\n throw error;\n }\n }\n\n async listTransactions({\n chainId,\n address,\n pageToken,\n pageSize,\n }: {\n chainId: string;\n address: string;\n pageToken?: string;\n pageSize?: number;\n }) {\n try {\n return this.glacierSdk.evmTransactions.listTransactionsV2({\n chainId,\n address,\n pageToken,\n pageSize,\n filterSpamTokens: true,\n });\n } catch (error) {\n if (error instanceof GlacierUnhealthyError) {\n this.setGlacierToUnhealthy();\n }\n throw error;\n }\n }\n}\n\nconst convertErc20TokenToTokenWithBalance = (tokens: ERC20Token[]): TokenWithBalanceERC20[] => {\n return tokens.map((token) => {\n return {\n ...token,\n decimals: token.decimals ?? DEFAULT_DECIMALS,\n type: TokenType.ERC20,\n balance: 0n,\n balanceInCurrency: 0,\n balanceDisplayValue: '0',\n balanceCurrencyDisplayValue: '0',\n priceInCurrency: 0,\n marketCap: 0,\n change24: 0,\n vol24: 0,\n reputation: null,\n };\n });\n};\n\nconst convertErc20TokenWithBalanceToTokenWithBalance = (\n tokenBalances: Erc20TokenBalance[],\n chainId: number,\n): TokenWithBalanceERC20[] => {\n return tokenBalances.map((token: Erc20TokenBalance): TokenWithBalanceERC20 => {\n const balance = new TokenUnit(token.balance, token.decimals, token.symbol);\n const balanceDisplayValue = balance.toDisplay();\n const balanceCurrencyDisplayValue = token.balanceValue?.value.toString();\n const priceInCurrency = token.price?.value;\n const balanceInCurrency =\n priceInCurrency !== undefined\n ? balance.mul(priceInCurrency).toDisplay({ fixedDp: 2, asNumber: true })\n : undefined;\n\n return {\n chainId,\n address: token.address,\n name: token.name,\n symbol: token.symbol,\n decimals: token.decimals,\n logoUri: token.logoUri,\n balance: balance.toSubUnit(),\n balanceCurrencyDisplayValue,\n balanceDisplayValue,\n balanceInCurrency,\n priceInCurrency,\n reputation: token.tokenReputation,\n type: TokenType.ERC20,\n };\n });\n};\n","import { z } from 'zod';\nimport {\n hyperEvmErc20TransferSchema,\n hyperEvmInternalTransactionSchema,\n hyperEvmNormalTransactionSchema,\n type HyperEvmErc20Transfer,\n type HyperEvmInternalTransaction,\n type HyperEvmNormalTransaction,\n} from './schemas';\n\ntype EtherscanAction = 'txlist' | 'tokentx' | 'txlistinternal';\n\ntype EtherscanPageOptions = {\n page?: number;\n offset?: number;\n};\n\nexport type HyperEvmEtherscanClientConfig = {\n proxyApiUrl: string;\n fetch?: typeof globalThis.fetch;\n};\n\nconst resolveFetch = (fetchFn?: typeof globalThis.fetch) => {\n if (fetchFn) {\n return fetchFn;\n }\n\n if (typeof globalThis.fetch === 'function') {\n return globalThis.fetch.bind(globalThis);\n }\n\n throw new Error('HyperEvmEtherscanClient requires a fetch implementation');\n};\n\nexport class HyperEvmEtherscanClient {\n readonly #apiUrl: string;\n readonly #fetch: typeof globalThis.fetch;\n\n constructor({ proxyApiUrl, fetch }: HyperEvmEtherscanClientConfig) {\n this.#apiUrl = `${proxyApiUrl}/proxy/etherscan/hyperevm/api`;\n this.#fetch = resolveFetch(fetch);\n }\n\n listNormalTransactions(address: string, options?: EtherscanPageOptions) {\n return this.#list('txlist', address, hyperEvmNormalTransactionSchema, options);\n }\n\n listErc20Transfers(address: string, options?: EtherscanPageOptions) {\n return this.#list('tokentx', address, hyperEvmErc20TransferSchema, options);\n }\n\n listInternalTransactions(address: string, options?: EtherscanPageOptions) {\n return this.#list('txlistinternal', address, hyperEvmInternalTransactionSchema, options);\n }\n\n async #list<T>(\n action: EtherscanAction,\n address: string,\n schema: z.ZodType<T>,\n options?: EtherscanPageOptions,\n ): Promise<T[]> {\n const params = new URLSearchParams({\n module: 'account',\n action,\n address,\n page: (options?.page ?? 1).toString(),\n offset: (options?.offset ?? 25).toString(),\n sort: 'desc',\n });\n const response = await this.#fetch(`${this.#apiUrl}?${params.toString()}`);\n\n if (!response.ok) {\n throw new Error(`HyperEVM explorer request failed: ${response.status} ${response.statusText}`);\n }\n\n const json: unknown = await response.json();\n const parsed = z\n .object({\n status: z.string(),\n message: z.string(),\n result: z.union([z.array(schema), z.string()]),\n })\n .parse(json);\n\n if (Array.isArray(parsed.result)) {\n return parsed.result;\n }\n\n if (parsed.status === '0' && parsed.message === 'No transactions found') {\n return [];\n }\n\n throw new Error(parsed.result);\n }\n}\n\nexport type { HyperEvmErc20Transfer, HyperEvmInternalTransaction, HyperEvmNormalTransaction };\n","import { z } from 'zod';\n\nexport const hyperEvmNormalTransactionSchema = z.object({\n blockNumber: z.string(),\n timeStamp: z.string(),\n hash: z.string(),\n nonce: z.string(),\n blockHash: z.string(),\n transactionIndex: z.string(),\n from: z.string(),\n to: z.string(),\n value: z.string(),\n gas: z.string(),\n gasPrice: z.string(),\n isError: z.string(),\n txreceipt_status: z.string(),\n input: z.string(),\n contractAddress: z.string(),\n cumulativeGasUsed: z.string(),\n gasUsed: z.string(),\n confirmations: z.string(),\n});\n\nexport const hyperEvmErc20TransferSchema = z.object({\n blockNumber: z.string(),\n timeStamp: z.string(),\n hash: z.string(),\n nonce: z.string(),\n blockHash: z.string(),\n from: z.string(),\n contractAddress: z.string(),\n to: z.string(),\n value: z.string(),\n tokenName: z.string(),\n tokenSymbol: z.string(),\n tokenDecimal: z.string(),\n transactionIndex: z.string(),\n gas: z.string(),\n gasPrice: z.string(),\n gasUsed: z.string(),\n cumulativeGasUsed: z.string(),\n input: z.string(),\n confirmations: z.string(),\n});\n\nexport const hyperEvmInternalTransactionSchema = z.object({\n blockNumber: z.string(),\n timeStamp: z.string(),\n hash: z.string(),\n from: z.string(),\n to: z.string(),\n value: z.string(),\n contractAddress: z.string(),\n input: z.string(),\n type: z.string(),\n gas: z.string(),\n gasUsed: z.string(),\n traceId: z.string(),\n isError: z.string(),\n errCode: z.string(),\n});\n\nexport type HyperEvmNormalTransaction = z.infer<typeof hyperEvmNormalTransactionSchema>;\nexport type HyperEvmErc20Transfer = z.infer<typeof hyperEvmErc20TransferSchema>;\nexport type HyperEvmInternalTransaction = z.infer<typeof hyperEvmInternalTransactionSchema>;\n"]}
|