@avalabs/evm-module 0.0.18 → 0.0.19
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/.turbo/turbo-build.log +10 -10
- package/.turbo/turbo-lint.log +1 -1
- package/.turbo/turbo-test.log +9 -9
- package/CHANGELOG.md +8 -0
- package/dist/index.cjs +4 -4
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +3 -3
- package/dist/index.js.map +1 -1
- package/package.json +5 -5
- package/src/handlers/eth-send-transaction/eth-send-transaction.test.ts +9 -1
- package/src/handlers/eth-sign/eth-sign.test.ts +2 -1
- package/src/handlers/get-balances/evm-balance-service/get-erc20-balances.ts +8 -6
- package/src/handlers/get-balances/evm-balance-service/get-native-token-balances.test.ts +1 -6
- package/src/handlers/get-balances/evm-balance-service/get-native-token-balances.ts +8 -6
- package/src/handlers/get-balances/get-balances.test.ts +3 -1
- package/src/handlers/get-balances/get-balances.ts +1 -0
- package/src/handlers/get-balances/glacier-balance-service/get-erc20-balances.test.ts +0 -3
- package/src/handlers/get-balances/glacier-balance-service/get-erc20-balances.ts +5 -6
- package/src/handlers/get-balances/glacier-balance-service/get-native-token-balances.test.ts +2 -3
- package/src/handlers/get-balances/glacier-balance-service/get-native-token-balances.ts +8 -7
- package/src/module.ts +8 -1
- package/src/services/glacier-service/glacier-service.ts +0 -21
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/module.ts","../src/handlers/get-tokens/get-tokens.ts","../src/utils/get-provider.ts","../src/handlers/get-network-fee/get-network-fee.ts","../src/handlers/get-transaction-history/converters/etherscan-transaction-converter/convert-transaction-normal.ts","../src/handlers/get-transaction-history/utils/get-explorer-address-by-network.ts","../src/handlers/get-transaction-history/converters/etherscan-transaction-converter/convert-transaction-erc20.ts","../src/handlers/get-transaction-history/converters/etherscan-transaction-converter/get-transaction-from-etherscan.ts","../src/handlers/get-transaction-history/utils/is-ethereum-chain-id.ts","../src/handlers/get-transaction-history/converters/evm-transaction-converter/get-tx-type.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/types.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/get-transaction-history.ts","../manifest.json","../src/handlers/eth-send-transaction/eth-send-transaction.ts","../src/handlers/eth-send-transaction/schema.ts","../src/utils/estimate-gas-limit.ts","../src/utils/get-nonce.ts","../src/utils/process-transaction-simulation.ts","../src/utils/scan-transaction.ts","../src/utils/parse-erc20-transaction-type.ts","../../../node_modules/.pnpm/@openzeppelin+contracts@4.9.3/node_modules/@openzeppelin/contracts/build/contracts/ERC20.json","../src/handlers/get-balances/get-balances.ts","../src/handlers/get-balances/evm-balance-service/get-erc20-balances.ts","../../../packages-internal/utils/src/services/token-service/token-service.ts","../../../packages-internal/utils/src/utils/retry.ts","../../../packages-internal/utils/src/utils/coingecko-retry.ts","../../../packages-internal/utils/src/utils/charsum.ts","../../../packages-internal/utils/src/utils/array-hash.ts","../../../packages-internal/utils/src/services/token-service/coingecko-proxy-client.ts","../src/handlers/get-balances/evm-balance-service/get-native-token-balances.ts","../src/handlers/get-balances/glacier-balance-service/get-native-token-balances.ts","../src/handlers/get-balances/glacier-balance-service/get-erc20-balances.ts","../src/env.ts","../src/services/glacier-service/glacier-service.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"],"names":["rpcErrors","RpcMethod","parseManifest","getTokens","chainId","proxyApiUrl","response","JsonRpcBatchInternal","EVMNetwork","GLACIER_API_KEY","getProvider","params","chainName","rpcUrl","multiContractAddress","pollingInterval","provider","addGlacierAPIKeyIfNeeded","knownHosts","url","glacierApiKey","urlObj","search_params","DEFAULT_PRESETS","BASE_PRIORITY_FEE_WEI","getNetworkFee","maxFeePerGasInWei","lowMaxTip","mediumMaxTip","highMaxTip","TokenType","TransactionType","balanceToDisplayValue","BN","getExplorerAddressByNetwork","explorerUrl","hash","hashType","convertTransactionNormal","tx","networkToken","address","isSender","timestamp","decimals","amountBN","amountDisplayValue","txType","from","to","gasPrice","gasUsed","explorerLink","isContractCall","convertTransactionERC20","tokenDecimal","tokenName","tokenSymbol","getErc20Txs","getNormalTxs","getTransactionFromEtherscan","isTestnet","nextPageToken","offset","parsedPageToken","page","queries","normalHist","erc20Hist","erc20TxHashes","filteredNormalTxs","next","isEthereumChainId","startCase","getTxType","nativeTransaction","erc20Transfers","erc721Transfers","userAddress","tokens","nativeOnly","method","parseRawMethod","isSwap","isNativeSend","isNativeReceive","isNFTPurchase","isApprove","isTransfer","isAirdrop","isUnwrap","isFillOrder","isNFTSend","isNFT","isNFTReceive","tokenType","getSenderInfo","isOutgoing","isIncoming","resolve","promise","res","err","ipfsResolver","CLOUDFLARE_IPFS_URL","ipfsResolverWithFallback","sourceUrl","desiredGatewayPrefix","fetchWithTimeout","uri","timeout","controller","getNftMetadata","tokenUri","data","value","json","COVALENT_IMG_SIZER","getSmallImageForNFT","imgUrl","imageSize","erc1155Transfers","result","decimal","erc20Transfer","erc721Transfer","token","imageUri","getImageUri","erc1155Transfer","metadata","error","NonContractCallTypes","ERC20TransactionType","convertTransaction","transactions","blockTimestamp","getTransactionsFromGlacier","glacierService","tranasaction","transaction","getTransactionHistory","manifest_default","z","transactionSchema","paramsSchema","parseRequestParams","estimateGasLimit","nonce","getNonce","AlertType","numberToBN","isHexString","Blockaid","DUMMY_API_KEY","scanTransaction","domain","scanJsonRpc","accountAddress","processTransactionSimulation","request","dAppUrl","alert","balanceChange","tokenApprovals","validation","simulation","transactionAlerts","processTokenApprovals","processBalanceChange","exposures","approvals","exposurePerAsset","convertAssetToNetworkContractToken","spenderAddress","exposurePerSpender","exposure","assetDiffs","ins","processAssetDiffs","outs","type","assetDiff","a","b","asset","convertNativeAssetToToken","items","diff","displayValue","valueBN","x","processJsonRpcSimulation","Interface","ERC20_default","parseERC20TransactionType","description","functionName","isERC20TransactionType","ethSendTransaction","network","approvalController","dappInfo","gasLimit","transactionType","title","displayData","signingData","txHash","waitForTransactionReceipt","onTransactionConfirmed","onTransactionReverted","bnToBig","ethers","getErc20Balances","tokenService","currency","coingeckoPlatformId","coingeckoTokenId","tokenAddresses","tokensBalances","balanceBig","balance","acc","simplePriceResponse","priceInCurrency","marketCap","vol24","change24","balanceInCurrency","balanceDisplayValue","balanceCurrencyDisplayValue","VsCurrencyType","getBasicCoingeckoHttp","simplePrice","simpleTokenPrice","retry","operation","isSuccess","maxRetries","backoffPolicy","RetryBackoffPolicy","backoffPeriodMillis","retries","lastError","delay","errorMessage","retryIndex","secondsToDelay","_","msToDelay","ms","r","coingeckoRetry","charsum","s","i","sum","arrayHash","array","cs","Zodios","RawSimplePriceResponseSchema","SimplePriceResponseSchema","boolean","string","coingeckoProxyClient","coingeckoBasicClient","_storage","_proxyApiUrl","TokenService","storage","__privateAdd","__publicField","currencies","formattedData","id","tokenData","__privateSet","coinIds","cacheId","__privateGet","useCoingeckoProxy","assetPlatformId","lastUpdated","rawData","bigToBN","bigintToBig","getNativeTokenBalances","balanceBigint","balaceBig","nativeTokenBalance","customTokens","tokensWithBalance","convertErc20TokenWithBalanceToTokenWithBalance","convertErc20TokenToTokenWithBalance","tokenBalances","getBalances","addresses","isNetworkSupported","isHealthy","balances","nativeToken","erc20Tokens","isERC20Token","allTokens","Environment","prodEnv","devEnv","getEnv","environment","Glacier","GlacierUnhealthyError","EvmGlacierService","glacierApiUrl","supportedChains","chain","tokenId","pageSize","pageToken","toUtf8String","beautifyComplexMessage","key","toUnicodeBold","subKey","item","index","beautifySimpleMessage","str","boldMap","char","messageSchema","addressSchema","ethSignSchema","messageTypeSchema","typedDataSchema","typedDataV1Schema","combinedTypedDataSchema","dataSchema","combinedDataSchema","ethSignTypedDataSchema","ethSignTypedDataV1Schema","ethSignTypedDataV3Schema","ethSignTypedDataV4Schema","personalSignSchema","ctx","parsed","isTypedDataV1","isTypedData","TypedDataEncoder","isTypedDataValid","EIP712Domain","types","ethSign","typedDataValidationResult","messageDetails","disclaimer","primaryType","messageToDisplay","prioritizedAlert","_glacierService","_approvalController","EvmModule","utilityAddresses"],"mappings":"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","sourcesContent":["import type {\n Module,\n Manifest,\n NetworkFees,\n GetTransactionHistory,\n RpcRequest,\n Environment,\n Network,\n ApprovalController,\n GetBalancesParams,\n GetBalancesResponse,\n} from '@avalabs/vm-module-types';\nimport { rpcErrors } from '@metamask/rpc-errors';\nimport { RpcMethod, parseManifest } from '@avalabs/vm-module-types';\nimport { getTokens } from './handlers/get-tokens/get-tokens';\nimport { getNetworkFee } from './handlers/get-network-fee/get-network-fee';\nimport { getTransactionHistory } from './handlers/get-transaction-history/get-transaction-history';\nimport ManifestJson from '../manifest.json';\nimport { ethSendTransaction } from './handlers/eth-send-transaction/eth-send-transaction';\nimport { getBalances } from './handlers/get-balances/get-balances';\nimport { getEnv } from './env';\nimport { EvmGlacierService } from './services/glacier-service/glacier-service';\nimport { ethSign } from './handlers/eth-sign/eth-sign';\n\nexport class EvmModule implements Module {\n #glacierService: EvmGlacierService;\n #proxyApiUrl: string;\n #approvalController: ApprovalController;\n\n constructor({\n approvalController,\n environment,\n }: {\n approvalController: ApprovalController;\n environment: Environment;\n }) {\n const { glacierApiUrl, proxyApiUrl } = getEnv(environment);\n this.#glacierService = new EvmGlacierService({ glacierApiUrl });\n this.#proxyApiUrl = proxyApiUrl;\n this.#approvalController = approvalController;\n }\n\n getAddress(): Promise<string> {\n return Promise.resolve('EVM address');\n }\n\n getBalances({ addresses, network, currency, customTokens }: GetBalancesParams): Promise<GetBalancesResponse> {\n return getBalances({\n addresses,\n currency,\n network,\n proxyApiUrl: this.#proxyApiUrl,\n customTokens,\n glacierService: this.#glacierService,\n });\n }\n\n getManifest(): Manifest | undefined {\n const result = parseManifest(ManifestJson);\n return result.success ? result.data : undefined;\n }\n\n getNetworkFee(network: Network): Promise<NetworkFees> {\n const { chainId, chainName, rpcUrl, utilityAddresses } = network;\n return getNetworkFee({\n chainId,\n chainName,\n rpcUrl,\n multiContractAddress: utilityAddresses?.multicall,\n });\n }\n\n getTransactionHistory(params: GetTransactionHistory) {\n const { network, address, nextPageToken, offset } = params;\n const { chainId, isTestnet, networkToken, explorerUrl = '' } = network;\n\n return getTransactionHistory({\n chainId,\n isTestnet,\n networkToken,\n explorerUrl,\n address,\n nextPageToken,\n offset,\n glacierService: this.#glacierService,\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 proxyApiUrl: this.#proxyApiUrl,\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 proxyApiUrl: this.#proxyApiUrl,\n });\n default:\n return { error: rpcErrors.methodNotSupported(`Method ${request.method} not supported`) };\n }\n }\n}\n","import type { NetworkContractToken } from '@avalabs/vm-module-types';\nimport { rpcErrors } from '@metamask/rpc-errors';\n\nexport async function getTokens({\n chainId,\n proxyApiUrl,\n}: {\n chainId: number;\n proxyApiUrl: string;\n}): Promise<NetworkContractToken[]> {\n const response = await fetch(`${proxyApiUrl}/tokens?evmChainId=${chainId}`);\n\n if (!response.ok) {\n throw rpcErrors.internal(`Failed to fetch tokens for chainId ${chainId}`);\n }\n\n return response.json();\n}\n","import { JsonRpcBatchInternal } from '@avalabs/wallets-sdk';\nimport { Network as EVMNetwork } from 'ethers';\n\n// this key is only needed in development to bypass rate limit\n// it should never be used in production\nconst GLACIER_API_KEY = process.env.GLACIER_API_KEY;\n\ntype ProviderParams = {\n chainId: number;\n chainName: string;\n rpcUrl: string;\n multiContractAddress?: string;\n pollingInterval?: number;\n};\n\nexport const getProvider = (params: ProviderParams): JsonRpcBatchInternal => {\n const { chainId, chainName, rpcUrl, multiContractAddress, pollingInterval = 2000 } = params;\n\n const provider = new JsonRpcBatchInternal(\n { maxCalls: 40, multiContractAddress },\n addGlacierAPIKeyIfNeeded(rpcUrl, GLACIER_API_KEY),\n new EVMNetwork(chainName, chainId),\n );\n\n provider.pollingInterval = pollingInterval;\n\n return provider;\n};\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'];\n\n/**\n * Glacier needs an API key for development, this adds the key if needed.\n */\nexport function addGlacierAPIKeyIfNeeded(url: string, glacierApiKey?: string): string {\n const urlObj = new URL(url);\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 type { NetworkFees } from '@avalabs/vm-module-types';\nimport { getProvider } from '../../utils/get-provider';\nimport { rpcErrors } from '@metamask/rpc-errors';\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\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}: {\n chainId: number;\n chainName: string;\n rpcUrl: string;\n multiContractAddress?: string;\n}): Promise<NetworkFees> {\n const provider = getProvider({\n chainId,\n chainName,\n rpcUrl,\n multiContractAddress,\n });\n\n const { maxFeePerGas: maxFeePerGasInWei } = await provider.getFeeData();\n if (!maxFeePerGasInWei) {\n throw rpcErrors.internal('Pre-EIP-1559 networks are not supported');\n }\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: maxFeePerGasInWei,\n low: {\n maxFeePerGas: maxFeePerGasInWei + lowMaxTip,\n maxPriorityFeePerGas: lowMaxTip,\n },\n medium: {\n maxFeePerGas: maxFeePerGasInWei + mediumMaxTip,\n maxPriorityFeePerGas: mediumMaxTip,\n },\n high: {\n maxFeePerGas: maxFeePerGasInWei + highMaxTip,\n maxPriorityFeePerGas: highMaxTip,\n },\n isFixedFee: false,\n };\n}\n","import type { NormalTx } from '@avalabs/etherscan-sdk';\nimport { TokenType, TransactionType, type NetworkToken, type Transaction } from '@avalabs/vm-module-types';\nimport { balanceToDisplayValue } from '@avalabs/utils-sdk';\nimport { BN } from 'bn.js';\nimport { getExplorerAddressByNetwork } from '../../utils/get-explorer-address-by-network';\n\nexport const convertTransactionNormal = ({\n tx,\n networkToken,\n chainId,\n explorerUrl,\n address,\n}: {\n tx: NormalTx;\n networkToken: NetworkToken;\n chainId: number;\n explorerUrl: string;\n address: string;\n}): Transaction => {\n const isSender = tx.from.toLowerCase() === address.toLowerCase();\n const timestamp = parseInt(tx.timeStamp) * 1000;\n const decimals = networkToken.decimals;\n const amountBN = new BN(tx.value);\n const amountDisplayValue = balanceToDisplayValue(amountBN, decimals);\n const txType = isSender ? TransactionType.SEND : TransactionType.RECEIVE;\n\n const { from, to, gasPrice, gasUsed, hash } = tx;\n const explorerLink = getExplorerAddressByNetwork(explorerUrl, hash);\n\n return {\n isIncoming: !isSender,\n isOutgoing: isSender,\n isContractCall: isContractCall(tx),\n timestamp,\n hash,\n isSender,\n from,\n to,\n tokens: [\n {\n decimal: decimals.toString(),\n name: networkToken.name,\n symbol: networkToken.symbol,\n amount: amountDisplayValue,\n type: TokenType.NATIVE,\n },\n ],\n gasUsed,\n gasPrice,\n chainId: chainId.toString(),\n txType,\n explorerLink,\n };\n};\n\nfunction isContractCall(tx: NormalTx): boolean {\n return tx.input !== '0x';\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 { Erc20Tx } from '@avalabs/etherscan-sdk';\nimport { TokenType, TransactionType, type Transaction } from '@avalabs/vm-module-types';\nimport { balanceToDisplayValue } from '@avalabs/utils-sdk';\nimport { getExplorerAddressByNetwork } from '../../utils/get-explorer-address-by-network';\nimport { BN } from 'bn.js';\n\nexport function convertTransactionERC20({\n tx,\n address,\n explorerUrl,\n chainId,\n}: {\n tx: Erc20Tx;\n address: string;\n chainId: number;\n explorerUrl: string;\n}): Transaction {\n const isSender = tx.from.toLowerCase() === address.toLowerCase();\n const timestamp = parseInt(tx.timeStamp) * 1000;\n const decimals = parseInt(tx.tokenDecimal);\n const amountBN = new BN(tx.value);\n const amountDisplayValue = balanceToDisplayValue(amountBN, decimals);\n const { from, to, gasPrice, gasUsed, hash, tokenDecimal, tokenName, tokenSymbol } = tx;\n const txType = isSender ? TransactionType.SEND : TransactionType.RECEIVE;\n const explorerLink = getExplorerAddressByNetwork(explorerUrl, hash);\n\n return {\n isIncoming: !isSender,\n isOutgoing: isSender,\n isContractCall: false,\n timestamp,\n hash,\n isSender,\n from,\n to,\n tokens: [\n {\n decimal: tokenDecimal,\n name: tokenName,\n symbol: tokenSymbol,\n type: TokenType.ERC20,\n amount: amountDisplayValue,\n },\n ],\n gasUsed,\n gasPrice,\n chainId: chainId.toString(),\n txType,\n explorerLink,\n };\n}\n","import { convertTransactionNormal } from './convert-transaction-normal';\nimport { convertTransactionERC20 } from './convert-transaction-erc20';\nimport type { NetworkToken, TransactionHistoryResponse } from '@avalabs/vm-module-types';\nimport { getErc20Txs, getNormalTxs } from '@avalabs/etherscan-sdk';\n\ninterface EtherscanPagination {\n queries: ('normal' | 'erc20')[];\n page?: number;\n}\n\nexport const getTransactionFromEtherscan = async ({\n isTestnet,\n networkToken,\n explorerUrl,\n chainId,\n address,\n nextPageToken,\n offset,\n}: {\n isTestnet?: boolean;\n networkToken: NetworkToken;\n explorerUrl: string;\n chainId: number;\n address: string;\n nextPageToken?: string;\n offset?: number;\n}): Promise<TransactionHistoryResponse> => {\n /*\n Using JSON for nextPageToken because this function is managing both the Normal\n and ERC20 queries. It encodes the current page and the queries that should be\n run. For example, if 'normal' has no more records to fetch then it will be\n excluded from the list and the JSON will be something like:\n { page: 3, queries: ['erc20'] }\n */\n const parsedPageToken = nextPageToken ? (JSON.parse(nextPageToken) as EtherscanPagination) : undefined;\n const page = parsedPageToken?.page || 1;\n const queries = parsedPageToken?.queries || ['normal', 'erc20'];\n\n const normalHist = (queries.includes('normal') ? await getNormalTxs(address, !isTestnet, { page, offset }) : []).map(\n (tx) => convertTransactionNormal({ tx, chainId, networkToken, explorerUrl, address }),\n );\n\n const erc20Hist = (\n queries.includes('erc20')\n ? await getErc20Txs(address, !isTestnet, undefined, {\n page,\n offset,\n })\n : []\n ).map((tx) =>\n convertTransactionERC20({\n tx,\n address,\n explorerUrl,\n chainId,\n }),\n );\n\n // Filter erc20 transactions from normal tx list\n const erc20TxHashes = erc20Hist.map((tx) => tx.hash);\n const filteredNormalTxs = normalHist.filter((tx) => {\n return !erc20TxHashes.includes(tx.hash);\n });\n\n const next: EtherscanPagination = { queries: [], page: page + 1 };\n if (normalHist.length) next.queries.push('normal');\n if (erc20Hist.length) next.queries.push('erc20');\n\n return {\n transactions: [...filteredNormalTxs, ...erc20Hist],\n nextPageToken: next.queries.length ? JSON.stringify(next) : '', // stop pagination\n };\n};\n","enum ChainId {\n ETHEREUM_HOMESTEAD = 1,\n ETHEREUM_TEST_RINKEBY = 4,\n ETHEREUM_TEST_GOERLY = 5,\n ETHEREUM_TEST_SEPOLIA = 11155111,\n}\n\nexport const isEthereumChainId = (chainId: number): boolean => {\n return (\n ChainId.ETHEREUM_HOMESTEAD === chainId ||\n ChainId.ETHEREUM_TEST_GOERLY === chainId ||\n ChainId.ETHEREUM_TEST_RINKEBY === chainId ||\n ChainId.ETHEREUM_TEST_SEPOLIA === chainId\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\nexport const getTxType = (\n { nativeTransaction, erc20Transfers, erc721Transfers }: TransactionDetails,\n userAddress: string,\n tokens: TxToken[],\n): TransactionType => {\n const nativeOnly = !erc20Transfers && !erc721Transfers;\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 const isNFTSend =\n isTransfer && !!tokens[0] && isNFT(tokens[0].type) && tokens[0].from?.address.toLowerCase() === address;\n const isNFTReceive =\n isTransfer && !!tokens[0] && isNFT(tokens[0].type) && tokens[0].to?.address.toLowerCase() === address;\n\n if (isSwap) return TransactionType.SWAP;\n if (isNativeSend) return TransactionType.SEND;\n if (isNativeReceive) return TransactionType.RECEIVE;\n if (isNFTPurchase) return TransactionType.NFT_BUY;\n if (isApprove) return TransactionType.APPROVE;\n if (isNFTSend) return TransactionType.NFT_SEND;\n if (isNFTReceive) return TransactionType.NFT_RECEIVE;\n if (isTransfer) return TransactionType.TRANSFER;\n if (isAirdrop) return TransactionType.AIRDROP;\n if (isUnwrap) return TransactionType.UNWRAP;\n if (isFillOrder) return TransactionType.FILL_ORDER;\n return TransactionType.UNKNOWN;\n};\n\nfunction isNFT(tokenType: TokenType) {\n return tokenType === TokenType.ERC721 || tokenType === TokenType.ERC1155;\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 { 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 const isNativeSend = txType === TransactionType.SEND;\n const isNativeReceive = txType === TransactionType.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 = isNativeSend || (isTransfer && from.toLowerCase() === address.toLowerCase());\n const isIncoming = isNativeReceive || (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 { balanceToDisplayValue } from '@avalabs/utils-sdk';\nimport { BN } from 'bn.js';\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 amountBN = new BN(nativeTransaction.value);\n const amountDisplayValue = balanceToDisplayValue(amountBN, decimal);\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 amountBN = new BN(erc20Transfer.value);\n const amountDisplayValue = balanceToDisplayValue(amountBN, decimals);\n\n result.push({\n decimal: decimals.toString(),\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 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 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/utils-sdk';\n\nexport const CLOUDFLARE_IPFS_URL = 'https://cloudflare-ipfs.com';\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 { TransactionType } from '@avalabs/vm-module-types';\n\nexport const NonContractCallTypes = [TransactionType.SEND, TransactionType.RECEIVE, TransactionType.TRANSFER];\n\nexport type TransactionParams = {\n from: string;\n to: string;\n data?: string;\n value?: string;\n gas?: string;\n gasPrice?: string;\n maxFeePerGas?: string;\n maxPriorityFeePerGas?: string;\n nonce?: string;\n chainId?: string;\n};\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","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 { getTransactionFromEtherscan } from './converters/etherscan-transaction-converter/get-transaction-from-etherscan';\nimport { isEthereumChainId } from './utils/is-ethereum-chain-id';\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';\n\nexport const getTransactionHistory = async ({\n chainId,\n isTestnet,\n networkToken,\n explorerUrl,\n address,\n nextPageToken,\n offset,\n glacierService,\n}: {\n chainId: number;\n isTestnet?: boolean;\n networkToken: NetworkToken;\n explorerUrl: string;\n address: string;\n nextPageToken?: string;\n offset?: number;\n glacierService: EvmGlacierService;\n}): Promise<TransactionHistoryResponse> => {\n if (isEthereumChainId(chainId)) {\n return getTransactionFromEtherscan({\n isTestnet,\n networkToken,\n explorerUrl,\n chainId,\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","{\n \"name\": \"EVM\",\n \"description\": \"\",\n \"version\": \"0.0.1\",\n \"sources\": {\n \"module\": {\n \"checksum\": \"\",\n \"location\": {\n \"npm\": {\n \"filePath\": \"dist/bundle.js\",\n \"packageName\": \"@avalabs/evm-module\",\n \"registry\": \"https://registry.npmjs.org\"\n }\n }\n },\n \"provider\": {\n \"checksum\": \"\",\n \"location\": {\n \"npm\": {\n \"filePath\": \"dist/provider.js\",\n \"packageName\": \"@avalabs/evm-module\",\n \"registry\": \"https://registry.npmjs.org\"\n }\n }\n }\n },\n \"network\": {\n \"chainIds\": [\"eip155:1\", \"eip155:43114\", \"eip155:43113\"],\n \"namespaces\": [\"eip155\"]\n },\n \"cointype\": \"60\",\n \"permissions\": {\n \"rpc\": {\n \"dapps\": true,\n \"methods\": [\"eth_sendTransaction\", \"eth_*\", \"personal_sign\"]\n }\n },\n \"manifestVersion\": \"0.0\"\n}\n","import {\n type Network,\n type Hex,\n type RpcRequest,\n type ApprovalController,\n type DisplayData,\n type SigningData,\n RpcMethod,\n} from '@avalabs/vm-module-types';\nimport { parseRequestParams } from './schema';\nimport { estimateGasLimit } from '../../utils/estimate-gas-limit';\nimport { getNonce } from '../../utils/get-nonce';\nimport { rpcErrors } from '@metamask/rpc-errors';\nimport { getProvider } from '../../utils/get-provider';\nimport type { JsonRpcBatchInternal } from '@avalabs/wallets-sdk';\nimport { processTransactionSimulation } from '../../utils/process-transaction-simulation';\nimport { parseERC20TransactionType } from '../../utils/parse-erc20-transaction-type';\nimport { ERC20TransactionType } from '../../types';\n\nexport const ethSendTransaction = async ({\n request,\n network,\n approvalController,\n proxyApiUrl,\n}: {\n request: RpcRequest;\n network: Network;\n approvalController: ApprovalController;\n proxyApiUrl: string;\n}) => {\n const { dappInfo, params } = request;\n\n // validate params\n const result = parseRequestParams(params);\n\n if (!result.success) {\n console.error('invalid params', result.error);\n return {\n error: rpcErrors.invalidParams('Transaction params are invalid'),\n };\n }\n\n const transaction = result.data[0];\n\n if (!transaction) {\n return {\n error: rpcErrors.invalidParams('Transaction params are invalid'),\n };\n }\n\n const provider = getProvider({\n chainId: network.chainId,\n chainName: network.chainName,\n rpcUrl: network.rpcUrl,\n multiContractAddress: network.utilityAddresses?.multicall,\n pollingInterval: 1000,\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 },\n provider,\n });\n\n transaction.gas = '0x' + gasLimit.toString(16);\n } catch (error) {\n return {\n error: rpcErrors.internal('Unable to calculate gas limit'),\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('Unable to calculate nonce'),\n };\n }\n }\n\n const transactionType = parseERC20TransactionType(transaction);\n\n const { alert, balanceChange, tokenApprovals } = await processTransactionSimulation({\n request,\n proxyApiUrl,\n chainId: network.chainId,\n params: transaction,\n dAppUrl: request.dappInfo.url,\n });\n\n // generate display and signing data\n let title = 'Approve Transaction';\n if (transactionType === ERC20TransactionType.APPROVE) {\n title = 'Token Spend Approval';\n }\n\n const displayData: DisplayData = {\n title,\n network: {\n chainId: network.chainId,\n name: network.chainName,\n logoUri: network.logoUri,\n },\n transactionDetails: {\n website: new URL(dappInfo.url).hostname,\n from: transaction.from,\n to: transaction.to,\n data: transaction.data,\n type: transactionType,\n },\n networkFeeSelector: true,\n alert,\n balanceChange,\n tokenApprovals,\n };\n\n const signingData: SigningData = {\n type: RpcMethod.ETH_SEND_TRANSACTION,\n account: transaction.from,\n chainId: network.chainId,\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 to: transaction.to,\n from: transaction.from,\n data: transaction.data,\n value: transaction.value,\n chainId: transaction.chainId,\n },\n };\n\n // prompt user for approval\n const response = await approvalController.requestApproval({ request, displayData, signingData });\n\n if ('error' in response) {\n return {\n error: response.error,\n };\n }\n\n // broadcast the signed transaction\n const txHash = await provider.send('eth_sendRawTransaction', [response.result]);\n\n waitForTransactionReceipt({\n provider,\n txHash,\n onTransactionConfirmed: approvalController.onTransactionConfirmed,\n onTransactionReverted: approvalController.onTransactionReverted,\n });\n\n return { result: txHash };\n};\n\nconst waitForTransactionReceipt = async ({\n provider,\n txHash,\n onTransactionConfirmed,\n onTransactionReverted,\n}: {\n provider: JsonRpcBatchInternal;\n txHash: Hex;\n onTransactionConfirmed: (txHash: Hex) => void;\n onTransactionReverted: (txHash: Hex) => void;\n}) => {\n const receipt = await provider.waitForTransaction(txHash);\n\n const success = receipt?.status === 1; // 1 indicates success, 0 indicates revert\n\n if (success) {\n onTransactionConfirmed(txHash);\n } else {\n onTransactionReverted(txHash);\n }\n};\n","import { z } from 'zod';\n\nconst transactionSchema = z.object({\n from: z.string().length(42),\n to: z.string().length(42),\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(),\n});\n\nconst paramsSchema = z.array(transactionSchema).length(1);\n\nexport const parseRequestParams = (params: unknown) => {\n return paramsSchema.safeParse(params);\n};\n","import { JsonRpcBatchInternal } from '@avalabs/wallets-sdk';\nimport type { BigNumberish } from 'ethers';\n\nexport const estimateGasLimit = async ({\n transactionParams: { from, to, data, value },\n provider,\n}: {\n transactionParams: {\n from: string;\n to: string;\n data?: string;\n value?: BigNumberish;\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 }),\n );\n};\n","import { JsonRpcBatchInternal } from '@avalabs/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 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} from '@avalabs/vm-module-types';\nimport { balanceToDisplayValue, numberToBN } from '@avalabs/utils-sdk';\nimport { isHexString } from 'ethers';\nimport { scanJsonRpc, scanTransaction } from './scan-transaction';\n\nexport const processTransactionSimulation = async ({\n request,\n dAppUrl,\n params,\n chainId,\n proxyApiUrl,\n}: {\n request: RpcRequest;\n dAppUrl?: string;\n params: TransactionParams;\n chainId: number;\n proxyApiUrl: string;\n}) => {\n let alert: Alert | undefined;\n let balanceChange: BalanceChange | undefined;\n let tokenApprovals: TokenApprovals | undefined;\n\n try {\n const { validation, simulation } = await scanTransaction({\n proxyApiUrl,\n chainId,\n params,\n domain: dAppUrl,\n });\n\n if (!validation || validation.result_type === 'Error' || 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, simulation.account_summary.exposures);\n balanceChange = processBalanceChange(simulation.account_summary.assets_diffs);\n }\n } catch (error) {\n console.error('processTransactionSimulation error', error);\n alert = transactionAlerts[AlertType.WARNING];\n }\n\n return { alert, balanceChange, tokenApprovals };\n};\n\nconst processTokenApprovals = (\n request: RpcRequest,\n exposures: Blockaid.AddressAssetExposure[],\n): TokenApprovals | undefined => {\n const approvals: TokenApproval[] = [];\n\n for (const exposurePerAsset of exposures) {\n const token = convertAssetToNetworkContractToken(exposurePerAsset.asset);\n if (!token) {\n continue;\n }\n\n for (const [spenderAddress, exposurePerSpender] of Object.entries(exposurePerAsset.spenders)) {\n if (exposurePerSpender.exposure.length === 0) {\n approvals.push({\n token,\n spenderAddress,\n logoUri: token.logoUri,\n });\n } else {\n for (const exposure of exposurePerSpender.exposure) {\n if ('raw_value' in exposure) {\n approvals.push({\n token,\n spenderAddress,\n value: exposure.raw_value,\n usdPrice: exposure.usd_price,\n logoUri: token.logoUri,\n });\n } else {\n approvals.push({\n token,\n spenderAddress,\n logoUri: exposure.logo_url,\n usdPrice: exposure.usd_price,\n });\n }\n }\n }\n }\n }\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 request.method === RpcMethod.ETH_SEND_TRANSACTION;\n\n return { isEditable, approvals };\n};\n\nexport const processBalanceChange = (assetDiffs: Blockaid.AssetDiff[]): BalanceChange | undefined => {\n const ins = processAssetDiffs(assetDiffs, 'in');\n const outs = processAssetDiffs(assetDiffs, 'out');\n\n if (ins.length === 0 && outs.length === 0) {\n return undefined;\n }\n\n return { ins, outs };\n};\n\nconst processAssetDiffs = (assetDiffs: Blockaid.AssetDiff[], type: 'in' | 'out'): TokenDiff[] => {\n return (\n assetDiffs\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 return displayValue ? { displayValue, usdPrice: diff.usd_price } : undefined;\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 proxyApiUrl,\n}: {\n request: RpcRequest;\n dAppUrl?: string;\n accountAddress: string;\n data: { method: string; params: unknown };\n chainId: number;\n proxyApiUrl: string;\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 proxyApiUrl,\n chainId,\n accountAddress,\n data: data as Blockaid.Evm.JsonRpcScanParams.Data,\n domain: dAppUrl,\n });\n\n if (!validation || validation.result_type === 'Error' || 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, simulation.account_summary.exposures);\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\nconst transactionAlerts = {\n [AlertType.WARNING]: {\n type: AlertType.WARNING,\n details: {\n title: 'Suspicious Transaction',\n description: 'Use caution, this transaction may be malicious.',\n },\n },\n [AlertType.DANGER]: {\n type: AlertType.DANGER,\n details: {\n title: 'Scam Transaction',\n description: 'This transaction is malicious, do not proceed.',\n actionTitles: {\n reject: 'Reject Transaction',\n proceed: 'Proceed Anyway',\n },\n },\n },\n};\n","import Blockaid from '@blockaid/client';\nimport type { TransactionParams } from '../types';\n\nconst DUMMY_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\nexport const scanTransaction = async ({\n proxyApiUrl,\n chainId,\n params,\n domain,\n}: {\n proxyApiUrl: string;\n chainId: number;\n params: TransactionParams;\n domain?: string;\n}): Promise<Blockaid.TransactionScanResponse> => {\n const blockaid = new Blockaid({\n baseURL: proxyApiUrl + '/proxy/blockaid/',\n apiKey: DUMMY_API_KEY,\n });\n\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 },\n metadata: (domain && domain.length > 0 ? { domain } : { non_dapp: true }) as Blockaid.Evm.Metadata,\n });\n};\n\nexport const scanJsonRpc = async ({\n proxyApiUrl,\n chainId,\n accountAddress,\n data,\n domain,\n}: {\n proxyApiUrl: string;\n chainId: number;\n accountAddress: string;\n data: Blockaid.Evm.JsonRpcScanParams.Data;\n domain?: string;\n}): Promise<Blockaid.TransactionScanResponse> => {\n const blockaid = new Blockaid({\n baseURL: proxyApiUrl + '/proxy/blockaid/',\n apiKey: DUMMY_API_KEY,\n });\n\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.Metadata,\n });\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","{\n \"_format\": \"hh-sol-artifact-1\",\n \"contractName\": \"ERC20\",\n \"sourceName\": \"contracts/token/ERC20/ERC20.sol\",\n \"abi\": [\n {\n \"inputs\": [\n {\n \"internalType\": \"string\",\n \"name\": \"name_\",\n \"type\": \"string\"\n },\n {\n \"internalType\": \"string\",\n \"name\": \"symbol_\",\n \"type\": \"string\"\n }\n ],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"constructor\"\n },\n {\n \"anonymous\": false,\n \"inputs\": [\n {\n \"indexed\": true,\n \"internalType\": \"address\",\n \"name\": \"owner\",\n \"type\": \"address\"\n },\n {\n \"indexed\": true,\n \"internalType\": \"address\",\n \"name\": \"spender\",\n \"type\": \"address\"\n },\n {\n \"indexed\": false,\n \"internalType\": \"uint256\",\n \"name\": \"value\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"Approval\",\n \"type\": \"event\"\n },\n {\n \"anonymous\": false,\n \"inputs\": [\n {\n \"indexed\": true,\n \"internalType\": \"address\",\n \"name\": \"from\",\n \"type\": \"address\"\n },\n {\n \"indexed\": true,\n \"internalType\": \"address\",\n \"name\": \"to\",\n \"type\": \"address\"\n },\n {\n \"indexed\": false,\n \"internalType\": \"uint256\",\n \"name\": \"value\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"Transfer\",\n \"type\": \"event\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"owner\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"address\",\n \"name\": \"spender\",\n \"type\": \"address\"\n }\n ],\n \"name\": \"allowance\",\n \"outputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"\",\n \"type\": \"uint256\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"spender\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"amount\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"approve\",\n \"outputs\": [\n {\n \"internalType\": \"bool\",\n \"name\": \"\",\n \"type\": \"bool\"\n }\n ],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"account\",\n \"type\": \"address\"\n }\n ],\n \"name\": \"balanceOf\",\n \"outputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"\",\n \"type\": \"uint256\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"decimals\",\n \"outputs\": [\n {\n \"internalType\": \"uint8\",\n \"name\": \"\",\n \"type\": \"uint8\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"spender\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"subtractedValue\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"decreaseAllowance\",\n \"outputs\": [\n {\n \"internalType\": \"bool\",\n \"name\": \"\",\n \"type\": \"bool\"\n }\n ],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"spender\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"addedValue\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"increaseAllowance\",\n \"outputs\": [\n {\n \"internalType\": \"bool\",\n \"name\": \"\",\n \"type\": \"bool\"\n }\n ],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"name\",\n \"outputs\": [\n {\n \"internalType\": \"string\",\n \"name\": \"\",\n \"type\": \"string\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"symbol\",\n \"outputs\": [\n {\n \"internalType\": \"string\",\n \"name\": \"\",\n \"type\": \"string\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"totalSupply\",\n \"outputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"\",\n \"type\": \"uint256\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"to\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"amount\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"transfer\",\n \"outputs\": [\n {\n \"internalType\": \"bool\",\n \"name\": \"\",\n \"type\": \"bool\"\n }\n ],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"from\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"address\",\n \"name\": \"to\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"amount\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"transferFrom\",\n \"outputs\": [\n {\n \"internalType\": \"bool\",\n \"name\": \"\",\n \"type\": \"bool\"\n }\n ],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n }\n ],\n \"bytecode\": \"0x60806040523480156200001157600080fd5b5060405162000aed38038062000aed8339810160408190526200003491620001db565b81516200004990600390602085019062000068565b5080516200005f90600490602084019062000068565b50505062000281565b828054620000769062000245565b90600052602060002090601f0160209004810192826200009a5760008555620000e5565b82601f10620000b557805160ff1916838001178555620000e5565b82800160010185558215620000e5579182015b82811115620000e5578251825591602001919060010190620000c8565b50620000f3929150620000f7565b5090565b5b80821115620000f35760008155600101620000f8565b634e487b7160e01b600052604160045260246000fd5b600082601f8301126200013657600080fd5b81516001600160401b03808211156200015357620001536200010e565b604051601f8301601f19908116603f011681019082821181831017156200017e576200017e6200010e565b816040528381526020925086838588010111156200019b57600080fd5b600091505b83821015620001bf5785820183015181830184015290820190620001a0565b83821115620001d15760008385830101525b9695505050505050565b60008060408385031215620001ef57600080fd5b82516001600160401b03808211156200020757600080fd5b620002158683870162000124565b935060208501519150808211156200022c57600080fd5b506200023b8582860162000124565b9150509250929050565b600181811c908216806200025a57607f821691505b6020821081036200027b57634e487b7160e01b600052602260045260246000fd5b50919050565b61085c80620002916000396000f3fe608060405234801561001057600080fd5b50600436106100a95760003560e01c80633950935111610071578063395093511461012357806370a082311461013657806395d89b411461015f578063a457c2d714610167578063a9059cbb1461017a578063dd62ed3e1461018d57600080fd5b806306fdde03146100ae578063095ea7b3146100cc57806318160ddd146100ef57806323b872dd14610101578063313ce56714610114575b600080fd5b6100b66101a0565b6040516100c3919061069a565b60405180910390f35b6100df6100da36600461070b565b610232565b60405190151581526020016100c3565b6002545b6040519081526020016100c3565b6100df61010f366004610735565b61024a565b604051601281526020016100c3565b6100df61013136600461070b565b61026e565b6100f3610144366004610771565b6001600160a01b031660009081526020819052604090205490565b6100b6610290565b6100df61017536600461070b565b61029f565b6100df61018836600461070b565b61031f565b6100f361019b366004610793565b61032d565b6060600380546101af906107c6565b80601f01602080910402602001604051908101604052809291908181526020018280546101db906107c6565b80156102285780601f106101fd57610100808354040283529160200191610228565b820191906000526020600020905b81548152906001019060200180831161020b57829003601f168201915b5050505050905090565b600033610240818585610358565b5060019392505050565b60003361025885828561047c565b6102638585856104f6565b506001949350505050565b600033610240818585610281838361032d565b61028b9190610800565b610358565b6060600480546101af906107c6565b600033816102ad828661032d565b9050838110156103125760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b60648201526084015b60405180910390fd5b6102638286868403610358565b6000336102408185856104f6565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b6001600160a01b0383166103ba5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610309565b6001600160a01b03821661041b5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610309565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6000610488848461032d565b905060001981146104f057818110156104e35760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610309565b6104f08484848403610358565b50505050565b6001600160a01b03831661055a5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610309565b6001600160a01b0382166105bc5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610309565b6001600160a01b038316600090815260208190526040902054818110156106345760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610309565b6001600160a01b03848116600081815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a36104f0565b600060208083528351808285015260005b818110156106c7578581018301518582016040015282016106ab565b818111156106d9576000604083870101525b50601f01601f1916929092016040019392505050565b80356001600160a01b038116811461070657600080fd5b919050565b6000806040838503121561071e57600080fd5b610727836106ef565b946020939093013593505050565b60008060006060848603121561074a57600080fd5b610753846106ef565b9250610761602085016106ef565b9150604084013590509250925092565b60006020828403121561078357600080fd5b61078c826106ef565b9392505050565b600080604083850312156107a657600080fd5b6107af836106ef565b91506107bd602084016106ef565b90509250929050565b600181811c908216806107da57607f821691505b6020821081036107fa57634e487b7160e01b600052602260045260246000fd5b50919050565b6000821982111561082157634e487b7160e01b600052601160045260246000fd5b50019056fea2646970667358221220e7dc257596a973556752e9db5f465b21aad78d068ae819d0395e1f99a95065a964736f6c634300080d0033\",\n \"deployedBytecode\": \"0x608060405234801561001057600080fd5b50600436106100a95760003560e01c80633950935111610071578063395093511461012357806370a082311461013657806395d89b411461015f578063a457c2d714610167578063a9059cbb1461017a578063dd62ed3e1461018d57600080fd5b806306fdde03146100ae578063095ea7b3146100cc57806318160ddd146100ef57806323b872dd14610101578063313ce56714610114575b600080fd5b6100b66101a0565b6040516100c3919061069a565b60405180910390f35b6100df6100da36600461070b565b610232565b60405190151581526020016100c3565b6002545b6040519081526020016100c3565b6100df61010f366004610735565b61024a565b604051601281526020016100c3565b6100df61013136600461070b565b61026e565b6100f3610144366004610771565b6001600160a01b031660009081526020819052604090205490565b6100b6610290565b6100df61017536600461070b565b61029f565b6100df61018836600461070b565b61031f565b6100f361019b366004610793565b61032d565b6060600380546101af906107c6565b80601f01602080910402602001604051908101604052809291908181526020018280546101db906107c6565b80156102285780601f106101fd57610100808354040283529160200191610228565b820191906000526020600020905b81548152906001019060200180831161020b57829003601f168201915b5050505050905090565b600033610240818585610358565b5060019392505050565b60003361025885828561047c565b6102638585856104f6565b506001949350505050565b600033610240818585610281838361032d565b61028b9190610800565b610358565b6060600480546101af906107c6565b600033816102ad828661032d565b9050838110156103125760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b60648201526084015b60405180910390fd5b6102638286868403610358565b6000336102408185856104f6565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b6001600160a01b0383166103ba5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610309565b6001600160a01b03821661041b5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610309565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6000610488848461032d565b905060001981146104f057818110156104e35760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610309565b6104f08484848403610358565b50505050565b6001600160a01b03831661055a5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610309565b6001600160a01b0382166105bc5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610309565b6001600160a01b038316600090815260208190526040902054818110156106345760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610309565b6001600160a01b03848116600081815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a36104f0565b600060208083528351808285015260005b818110156106c7578581018301518582016040015282016106ab565b818111156106d9576000604083870101525b50601f01601f1916929092016040019392505050565b80356001600160a01b038116811461070657600080fd5b919050565b6000806040838503121561071e57600080fd5b610727836106ef565b946020939093013593505050565b60008060006060848603121561074a57600080fd5b610753846106ef565b9250610761602085016106ef565b9150604084013590509250925092565b60006020828403121561078357600080fd5b61078c826106ef565b9392505050565b600080604083850312156107a657600080fd5b6107af836106ef565b91506107bd602084016106ef565b90509250929050565b600181811c908216806107da57607f821691505b6020821081036107fa57634e487b7160e01b600052602260045260246000fd5b50919050565b6000821982111561082157634e487b7160e01b600052601160045260246000fd5b50019056fea2646970667358221220e7dc257596a973556752e9db5f465b21aad78d068ae819d0395e1f99a95065a964736f6c634300080d0033\",\n \"linkReferences\": {},\n \"deployedLinkReferences\": {}\n}\n","import {\n type GetBalancesResponse,\n type GetBalancesParams,\n type Storage,\n TokenType,\n type NetworkContractToken,\n type ERC20Token,\n} from '@avalabs/vm-module-types';\nimport { getErc20Balances } from './evm-balance-service/get-erc20-balances';\nimport { TokenService } from '@internal/utils';\nimport { getProvider } from '../../utils/get-provider';\nimport { getTokens } from '../get-tokens/get-tokens';\nimport { getNativeTokenBalances } from './evm-balance-service/get-native-token-balances';\nimport { getNativeTokenBalances as getNativeTokenBalancesFromGlacier } from './glacier-balance-service/get-native-token-balances';\nimport { getErc20Balances as getErc20BalancesFromGlacier } from './glacier-balance-service/get-erc20-balances';\nimport type { EvmGlacierService } from '../../services/glacier-service/glacier-service';\n\nexport const getBalances = async ({\n addresses,\n currency,\n network,\n proxyApiUrl,\n customTokens = [],\n storage,\n glacierService,\n}: GetBalancesParams & {\n proxyApiUrl: string;\n glacierService: EvmGlacierService;\n storage?: Storage;\n}): Promise<GetBalancesResponse> => {\n const chainId = network.chainId;\n const isNetworkSupported = await glacierService.isNetworkSupported(network.chainId);\n const isHealthy = glacierService.isHealthy();\n\n let balances = [];\n if (isHealthy && isNetworkSupported) {\n balances = await Promise.allSettled(\n addresses.map(async (address) => {\n const nativeToken = await getNativeTokenBalancesFromGlacier({\n address,\n currency,\n chainId,\n glacierService,\n });\n\n const erc20Tokens = await getErc20BalancesFromGlacier({\n customTokens: customTokens.filter(isERC20Token),\n glacierService,\n currency,\n chainId,\n address,\n });\n\n return {\n address,\n balances: {\n [nativeToken.symbol]: nativeToken,\n ...erc20Tokens,\n },\n };\n }),\n );\n } else {\n const tokenService = new TokenService({ storage, proxyApiUrl });\n const tokens = await getTokens({ chainId: Number(chainId), proxyApiUrl });\n const allTokens = [...tokens, ...customTokens];\n const provider = getProvider({\n chainId,\n chainName: network.chainName,\n rpcUrl: network.rpcUrl,\n multiContractAddress: network.utilityAddresses?.multicall,\n });\n\n balances = await Promise.allSettled(\n addresses.map(async (address) => {\n const nativeToken = await getNativeTokenBalances({\n network,\n tokenService,\n address,\n currency,\n provider,\n });\n\n const erc20Tokens = await getErc20Balances({\n provider,\n network,\n tokenService,\n address,\n currency,\n tokens: allTokens.filter(isERC20Token),\n });\n\n return {\n address,\n balances: {\n [nativeToken.symbol]: nativeToken,\n ...erc20Tokens,\n },\n };\n }),\n );\n }\n\n const filterBalances = balances.reduce((acc, result) => {\n if (result.status === 'rejected') {\n return acc;\n }\n\n return {\n ...acc,\n [result.value.address]: result.value.balances,\n };\n }, {} as GetBalancesResponse);\n\n return filterBalances;\n};\n\nfunction isERC20Token(token: NetworkContractToken): token is ERC20Token {\n return token.type === TokenType.ERC20;\n}\n","import { numberToBN, bnToBig, balanceToDisplayValue } from '@avalabs/utils-sdk';\nimport { TokenType, type ERC20Token, type Network, type TokenWithBalance } from '@avalabs/vm-module-types';\nimport { ethers, type Provider } from 'ethers';\nimport ERC20 from '@openzeppelin/contracts/build/contracts/ERC20.json';\nimport type { TokenService } from '@internal/utils';\nimport { VsCurrencyType } from '@avalabs/coingecko-sdk';\nimport BN from 'bn.js';\n\nexport const getErc20Balances = async ({\n provider,\n tokenService,\n address: userAddress,\n currency,\n tokens,\n network,\n}: {\n provider: Provider;\n tokenService: TokenService;\n address: string;\n currency: string;\n tokens: ERC20Token[];\n network: Network;\n}): Promise<Record<string, TokenWithBalance>> => {\n const coingeckoPlatformId = network.pricingProviders?.coingecko.assetPlatformId;\n const coingeckoTokenId = network.pricingProviders?.coingecko.nativeTokenId;\n const tokenAddresses = tokens.map((token) => token.address);\n\n const tokensBalances = await Promise.allSettled(\n tokens.map(async (token) => {\n const contract = new ethers.Contract(token.address, ERC20.abi, provider);\n const balanceBig = await contract.balanceOf?.(userAddress);\n const balance = new BN(balanceBig) || numberToBN(0, token.decimals);\n\n const tokenWithBalance = {\n ...token,\n balance,\n };\n\n return tokenWithBalance;\n }),\n ).then((res) => {\n return res.reduce<(ERC20Token & { balance: BN })[]>((acc, result) => {\n return result.status === 'fulfilled' && !result.value.balance.isZero() ? [...acc, result.value] : acc;\n }, []);\n });\n\n if (!tokensBalances.length) return {};\n\n const simplePriceResponse =\n (coingeckoPlatformId &&\n (await tokenService.getPricesByAddresses(tokenAddresses, coingeckoPlatformId, currency as VsCurrencyType))) ||\n {};\n\n return tokensBalances.reduce(\n (acc, token) => {\n const priceInCurrency = simplePriceResponse?.[coingeckoTokenId ?? '']?.[currency]?.price ?? 0;\n const marketCap = simplePriceResponse?.[coingeckoTokenId ?? '']?.[currency]?.marketCap ?? 0;\n const vol24 = simplePriceResponse?.[coingeckoTokenId ?? '']?.[currency]?.vol24 ?? 0;\n const change24 = simplePriceResponse?.[coingeckoTokenId ?? '']?.[currency]?.change24 ?? 0;\n\n const balanceInCurrency = bnToBig(token.balance, token.decimals).mul(priceInCurrency).toNumber();\n const balanceDisplayValue = balanceToDisplayValue(token.balance, token.decimals);\n const balanceCurrencyDisplayValue = balanceInCurrency.toFixed(2);\n\n return {\n ...acc,\n [token.address.toLowerCase()]: {\n ...token,\n type: TokenType.ERC20,\n balance: token.balance,\n balanceDisplayValue,\n balanceInCurrency,\n balanceCurrencyDisplayValue,\n priceInCurrency,\n marketCap,\n change24,\n vol24,\n },\n };\n },\n {} as Record<string, TokenWithBalance>,\n );\n};\n","import {\n VsCurrencyType,\n getBasicCoingeckoHttp,\n simplePrice,\n simpleTokenPrice,\n type SimplePriceParams,\n} from '@avalabs/coingecko-sdk';\nimport type { Storage, RawSimplePriceResponse, SimplePriceResponse } from '@avalabs/vm-module-types';\nimport { coingeckoRetry } from '../../utils/coingecko-retry';\nimport { arrayHash } from '../../utils/array-hash';\nimport { coingeckoProxyClient } from './coingecko-proxy-client';\n\nconst coingeckoBasicClient = getBasicCoingeckoHttp();\n\nexport class TokenService {\n #storage?: Storage;\n #proxyApiUrl: string;\n\n constructor({ storage, proxyApiUrl }: { proxyApiUrl: string; storage?: Storage }) {\n this.#storage = storage;\n this.#proxyApiUrl = proxyApiUrl;\n }\n\n /**\n * Get token price with market data first on coingecko (free tier) directly,\n * if we get 429 error, retry it on coingecko proxy (paid service)\n * @returns token price with market data\n */\n async getSimplePrice({\n coinIds = [],\n currencies = [VsCurrencyType.USD],\n }: SimplePriceParams): Promise<SimplePriceResponse | undefined> {\n let data: SimplePriceResponse | undefined;\n\n const key = coinIds ? `${arrayHash(coinIds)}-${currencies.toString()}` : `${currencies.toString()}`;\n\n const cacheId = `getSimplePrice-${key}`;\n\n data = this.#storage?.get?.<SimplePriceResponse>(cacheId);\n\n if (data === undefined) {\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 this.#storage?.set?.(cacheId, data);\n }\n\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 === undefined) {\n data = await coingeckoRetry((useCoingeckoProxy) =>\n this.fetchPricesByAddresses({\n assetPlatformId,\n tokenAddresses,\n currency,\n useCoingeckoProxy,\n }),\n );\n this.#storage?.set?.(cacheId, data);\n }\n\n return data;\n }\n\n private async fetchPricesByAddresses({\n assetPlatformId,\n tokenAddresses,\n currency = VsCurrencyType.USD,\n useCoingeckoProxy = false,\n }: {\n assetPlatformId: string;\n tokenAddresses: string[];\n currency: VsCurrencyType;\n useCoingeckoProxy?: boolean;\n }): Promise<SimplePriceResponse> {\n if (useCoingeckoProxy) {\n return coingeckoProxyClient(this.#proxyApiUrl).simplePriceByContractAddresses(undefined, {\n params: {\n id: assetPlatformId,\n },\n queries: {\n contract_addresses: tokenAddresses,\n vs_currencies: [currency],\n include_market_cap: true,\n include_24hr_vol: true,\n include_24hr_change: true,\n },\n });\n }\n\n return simpleTokenPrice(coingeckoBasicClient, {\n assetPlatformId,\n tokenAddresses,\n currencies: [currency],\n marketCap: true,\n vol24: true,\n change24: true,\n });\n }\n\n private async simplePrice({\n coinIds = [],\n currencies = [VsCurrencyType.USD],\n marketCap = false,\n vol24 = false,\n change24 = false,\n lastUpdated = false,\n useCoingeckoProxy = false,\n }: SimplePriceParams & { useCoingeckoProxy?: boolean }): Promise<SimplePriceResponse> {\n if (useCoingeckoProxy) {\n const rawData = await coingeckoProxyClient(this.#proxyApiUrl).simplePrice(undefined, {\n queries: {\n ids: coinIds?.join(','),\n vs_currencies: currencies.join(','),\n include_market_cap: String(marketCap),\n include_24hr_vol: String(vol24),\n include_24hr_change: String(change24),\n include_last_updated_at: String(lastUpdated),\n },\n });\n return this.transformSimplePriceResponse(rawData);\n }\n return simplePrice(coingeckoBasicClient, {\n coinIds,\n currencies,\n marketCap,\n vol24,\n change24,\n lastUpdated,\n shouldThrow: true,\n });\n }\n\n private transformSimplePriceResponse = (\n data: RawSimplePriceResponse,\n currencies = [VsCurrencyType.USD],\n ): SimplePriceResponse => {\n const formattedData: SimplePriceResponse = {};\n Object.keys(data).forEach((id) => {\n const tokenData = data[id];\n formattedData[id] = {};\n currencies.forEach((currency: VsCurrencyType) => {\n formattedData[id] = {\n [currency]: {\n price: tokenData?.[currency],\n change24: tokenData?.[`${currency}_24h_change`],\n vol24: tokenData?.[`${currency}_24h_vol`],\n marketCap: tokenData?.[`${currency}_market_cap`],\n },\n };\n });\n });\n return formattedData;\n };\n}\n","const DEFAULT_MAX_RETRIES = 10;\n\ntype RetryParams<T> = {\n operation: (retryIndex: number) => Promise<T>;\n isSuccess: (result: T) => boolean;\n maxRetries?: number;\n backoffPolicy?: RetryBackoffPolicyInterface;\n};\n/*\n * Retries an operation with defined backoff policy.\n *\n * @param operation - The operation to retry.\n * @param isSuccess - The predicate to check if the operation succeeded.\n * @param maxRetries - The maximum number of retries.\n * @param backoffPolicy - Function to generate delay time based on current retry count.\n *\n * @returns The result of the operation.\n * @throws An error if the operation fails after the maximum number of retries.\n *\n * @example\n * const result = await retry(\n * async () => {\n * const response = await fetch('https://example.com')\n * return response.json()\n * },\n * result => result.status === 200\n * )\n */\nexport const retry = async <T>({\n operation,\n isSuccess,\n maxRetries = DEFAULT_MAX_RETRIES,\n backoffPolicy = RetryBackoffPolicy.exponential(),\n}: RetryParams<T>): Promise<T> => {\n let backoffPeriodMillis = 0;\n let retries = 0;\n let lastError: unknown;\n\n while (retries < maxRetries) {\n if (retries > 0) {\n await delay(backoffPeriodMillis);\n }\n\n try {\n const result = await operation(retries);\n\n if (isSuccess(result)) {\n return result;\n }\n } catch (err) {\n // when the operation throws an error, we still retry\n lastError = err;\n }\n\n backoffPeriodMillis = backoffPolicy(retries);\n retries++;\n }\n\n const errorMessage = lastError ? `Max retry exceeded. ${lastError}` : 'Max retry exceeded.';\n\n throw new Error(errorMessage);\n};\n\ntype RetryBackoffPolicyInterface = (retryIndex: number) => number;\n\nexport class RetryBackoffPolicy {\n static exponential(): RetryBackoffPolicyInterface {\n return (retryIndex: number): number => {\n return Math.pow(2, retryIndex) * 1000;\n };\n }\n\n static constant(secondsToDelay: number): RetryBackoffPolicyInterface {\n return (_: number): number => {\n return secondsToDelay * 1000;\n };\n }\n\n static constantMs(msToDelay: number): RetryBackoffPolicyInterface {\n return (_: number): number => {\n return msToDelay;\n };\n }\n}\n\nfunction delay(ms: number) {\n return new Promise((r) => setTimeout(r, ms));\n}\n","import { RetryBackoffPolicy, retry } from './retry';\n\ntype Error = {\n status: {\n error_code: number;\n error_message: string;\n };\n};\n\nexport const coingeckoRetry = <T>(\n operation: (useCoingeckoProxy: boolean) => Promise<T | Error>,\n): Promise<T | undefined> => {\n return retry({\n operation: (retryIndex: number) => operation(retryIndex > 0),\n maxRetries: 2,\n backoffPolicy: RetryBackoffPolicy.constant(1),\n isSuccess: (response: T | Error) => {\n const errorStatus = (response as Error)?.status;\n return errorStatus?.error_code !== 429;\n },\n }) as Promise<T | undefined>;\n};\n","export function charsum(s: string): number {\n let i,\n sum = 0;\n for (i = 0; i < s.length; i++) {\n sum += s.charCodeAt(i) * (i + 1);\n }\n return sum;\n}\n","import { charsum } from './charsum';\n\n// from https://stackoverflow.com/a/25105589\nexport function arrayHash(array: string[]): string {\n let i,\n sum = 0;\n for (i = 0; i < array.length; i++) {\n const cs = charsum(array[i] ?? '');\n sum = sum + 65027 / cs;\n }\n return ('' + sum).slice(0, 16);\n}\n","import { Zodios } from '@zodios/core';\nimport { RawSimplePriceResponseSchema, SimplePriceResponseSchema } from '@avalabs/vm-module-types';\nimport { boolean, string } from 'zod';\n\nexport const coingeckoProxyClient = (proxyApiUrl: string) =>\n new Zodios(\n `${proxyApiUrl}/proxy/coingecko`,\n [\n {\n method: 'post',\n path: '/simple/price',\n parameters: [\n { name: 'ids', type: 'Query', schema: string() },\n { name: 'vs_currencies', type: 'Query', schema: string() },\n {\n name: 'include_market_cap',\n type: 'Query',\n schema: string().optional(),\n },\n {\n name: 'include_24hr_vol',\n type: 'Query',\n schema: string().optional(),\n },\n {\n name: 'include_24hr_change',\n type: 'Query',\n schema: string().optional(),\n },\n {\n name: 'include_last_updated_at',\n type: 'Query',\n schema: string().optional(),\n },\n ],\n alias: 'simplePrice',\n response: RawSimplePriceResponseSchema,\n },\n {\n method: 'post',\n path: '/simple/token_price/:id',\n parameters: [\n { name: 'id', type: 'Path', schema: string() },\n { name: 'contract_addresses', type: 'Query', schema: string().array() },\n { name: 'vs_currencies', type: 'Query', schema: string().array() },\n {\n name: 'include_market_cap',\n type: 'Query',\n schema: boolean().optional(),\n },\n {\n name: 'include_24hr_vol',\n type: 'Query',\n schema: boolean().optional(),\n },\n {\n name: 'include_24hr_change',\n type: 'Query',\n schema: boolean().optional(),\n },\n ],\n alias: 'simplePriceByContractAddresses',\n response: SimplePriceResponseSchema,\n },\n ],\n {\n axiosConfig: {\n headers: {\n 'Content-Type': 'application/json',\n },\n },\n },\n );\n","import { balanceToDisplayValue, bigToBN, bigintToBig, bnToBig } from '@avalabs/utils-sdk';\nimport { TokenType, type Network, type NetworkTokenWithBalance } from '@avalabs/vm-module-types';\nimport type { VsCurrencyType } from '@avalabs/coingecko-sdk';\nimport { TokenService } from '@internal/utils';\nimport type { Provider } from 'ethers';\n\nexport const getNativeTokenBalances = async ({\n provider,\n tokenService,\n address,\n currency,\n network,\n}: {\n provider: Provider;\n tokenService: TokenService;\n address: string;\n currency: string;\n network: Network;\n}): Promise<NetworkTokenWithBalance> => {\n const coingeckoTokenId = network.pricingProviders?.coingecko.nativeTokenId;\n const networkToken = network.networkToken;\n const simplePriceResponse = coingeckoTokenId\n ? await tokenService.getSimplePrice({\n coinIds: [coingeckoTokenId],\n currencies: [currency] as VsCurrencyType[],\n })\n : {};\n\n const priceInCurrency = simplePriceResponse?.[coingeckoTokenId ?? '']?.[currency]?.price ?? 0;\n const marketCap = simplePriceResponse?.[coingeckoTokenId ?? '']?.[currency]?.marketCap ?? 0;\n const vol24 = simplePriceResponse?.[coingeckoTokenId ?? '']?.[currency]?.vol24 ?? 0;\n const change24 = simplePriceResponse?.[coingeckoTokenId ?? '']?.[currency]?.change24 ?? 0;\n\n const balanceBigint = await provider.getBalance(address);\n const balaceBig = bigintToBig(balanceBigint, networkToken.decimals);\n const balance = bigToBN(balaceBig, networkToken.decimals);\n const balanceDisplayValue = balanceToDisplayValue(balance, networkToken.decimals);\n const balanceInCurrency = bnToBig(balance, networkToken.decimals).mul(priceInCurrency).toNumber();\n const balanceCurrencyDisplayValue = balanceInCurrency.toFixed(2);\n\n return {\n ...networkToken,\n coingeckoId: coingeckoTokenId ?? '',\n type: TokenType.NATIVE,\n balance,\n balanceDisplayValue,\n balanceInCurrency,\n balanceCurrencyDisplayValue,\n priceInCurrency,\n marketCap,\n vol24,\n change24,\n };\n};\n","import type { CurrencyCode } from '@avalabs/glacier-sdk';\nimport { TokenType, type NetworkTokenWithBalance } from '@avalabs/vm-module-types';\nimport { balanceToDisplayValue, bnToBig } from '@avalabs/utils-sdk';\nimport { BN } from 'bn.js';\nimport type { EvmGlacierService } from '../../../services/glacier-service/glacier-service';\n\nexport const getNativeTokenBalances = async ({\n address,\n currency,\n chainId,\n glacierService,\n}: {\n chainId: number;\n address: string;\n currency: string;\n glacierService: EvmGlacierService;\n}): Promise<NetworkTokenWithBalance> => {\n const nativeBalance = await glacierService.getNativeBalance({\n chainId: chainId.toString(),\n address,\n currency: currency.toLocaleLowerCase() as CurrencyCode,\n });\n const nativeTokenBalance = nativeBalance.nativeTokenBalance;\n const balance = new BN(nativeTokenBalance.balance);\n const balanceDisplayValue = balanceToDisplayValue(balance, nativeTokenBalance.decimals);\n const priceInCurrency = nativeTokenBalance.price?.value ?? 0;\n const balanceInCurrency = bnToBig(balance, nativeTokenBalance.decimals).mul(priceInCurrency).toNumber();\n const balanceCurrencyDisplayValue = balanceInCurrency.toFixed(2);\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,\n balanceDisplayValue,\n balanceInCurrency,\n balanceCurrencyDisplayValue,\n priceInCurrency,\n marketCap: 0,\n vol24: 0,\n change24: 0,\n coingeckoId: '',\n };\n};\n","import { balanceToDisplayValue, bnToBig } from '@avalabs/utils-sdk';\nimport {\n TokenType,\n type TokenWithBalanceERC20,\n type TokenWithBalance,\n type ERC20Token,\n} from '@avalabs/vm-module-types';\nimport { CurrencyCode, Erc20TokenBalance } from '@avalabs/glacier-sdk';\nimport BN from 'bn.js';\nimport type { EvmGlacierService } from '../../../services/glacier-service/glacier-service';\nimport { DEFAULT_DECIMALS } from '../../../constants';\n\nexport const getErc20Balances = async ({\n glacierService,\n currency,\n chainId,\n address,\n customTokens,\n}: {\n glacierService: EvmGlacierService;\n address: string;\n currency: string;\n chainId: number;\n customTokens: ERC20Token[];\n}): Promise<Record<string, TokenWithBalance>> => {\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;\n do {\n const response = await glacierService.listErc20Balances({\n chainId: chainId.toString(),\n address,\n currency: currency.toLocaleLowerCase() as CurrencyCode,\n // glacier has a cap on page size of 100\n pageSize: 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, TokenWithBalance>,\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: new BN(0),\n balanceInCurrency: 0,\n balanceDisplayValue: '0',\n balanceCurrencyDisplayValue: '0',\n priceInCurrency: 0,\n marketCap: 0,\n change24: 0,\n vol24: 0,\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 BN(token.balance);\n const balanceDisplayValue = balanceToDisplayValue(balance, token.decimals);\n const balanceCurrencyDisplayValue = token.balanceValue?.value.toString() ?? '0';\n const priceInCurrency = token.price?.value ?? 0;\n const balanceInCurrency = bnToBig(balance, token.decimals).mul(priceInCurrency).toNumber();\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,\n balanceCurrencyDisplayValue,\n balanceDisplayValue,\n balanceInCurrency,\n priceInCurrency,\n type: TokenType.ERC20,\n change24: 0,\n marketCap: 0,\n vol24: 0,\n };\n });\n};\n","import { Environment } from '@avalabs/vm-module-types';\n\ntype Env = {\n glacierApiUrl: string;\n proxyApiUrl: string;\n};\n\nexport const prodEnv: Env = {\n glacierApiUrl: 'https://glacier-api.avax.network',\n proxyApiUrl: 'https://proxy-api.avax.network',\n};\n\nexport const devEnv: Env = {\n glacierApiUrl: 'https://glacier-api-dev.avax.network',\n proxyApiUrl: 'https://proxy-api-dev.avax.network',\n};\n\nexport const getEnv = (environment: Environment): Env => {\n switch (environment) {\n case Environment.PRODUCTION:\n return prodEnv;\n case Environment.DEV:\n return devEnv;\n }\n};\n","import {\n BlockchainId,\n CurrencyCode,\n Erc1155Token,\n Erc721Token,\n type GetNativeBalanceResponse,\n Glacier,\n type ListCChainAtomicBalancesResponse,\n type ListErc1155BalancesResponse,\n type ListErc20BalancesResponse,\n type ListErc721BalancesResponse,\n type ListPChainBalancesResponse,\n type ListXChainBalancesResponse,\n Network,\n} from '@avalabs/glacier-sdk';\n\nclass GlacierUnhealthyError extends Error {\n override message = 'Glacier is unhealthy. Try again later.';\n}\n\nexport class EvmGlacierService {\n glacierSdk: Glacier;\n isGlacierHealthy = true;\n supportedChainIds: string[] = [];\n\n constructor({ glacierApiUrl }: { glacierApiUrl: string }) {\n this.glacierSdk = new Glacier({ BASE: glacierApiUrl });\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 this.supportedChainIds = supportedChains.chains.map((chain) => chain.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 getChainBalance(params: {\n blockchainId: BlockchainId;\n network: Network;\n blockTimestamp?: number;\n addresses?: string;\n }): Promise<ListPChainBalancesResponse | ListXChainBalancesResponse | ListCChainAtomicBalancesResponse> {\n try {\n return this.glacierSdk.primaryNetworkBalances.getBalancesByAddresses(params);\n } catch (error) {\n if (error instanceof GlacierUnhealthyError) {\n this.setGlacierToUnhealthy();\n }\n throw error;\n }\n }\n\n async getNativeBalance({\n chainId,\n address,\n currency,\n }: {\n chainId: string;\n address: string;\n currency: CurrencyCode;\n }): Promise<GetNativeBalanceResponse> {\n try {\n return this.glacierSdk.evmBalances.getNativeBalance({\n chainId,\n address,\n currency: currency.toLocaleLowerCase() as CurrencyCode,\n });\n } catch (error) {\n if (error instanceof GlacierUnhealthyError) {\n this.setGlacierToUnhealthy();\n }\n throw error;\n }\n }\n\n async listErc721Balances({\n chainId,\n address,\n pageSize,\n pageToken,\n }: {\n chainId: string;\n address: string;\n pageSize: number;\n pageToken?: string;\n }): Promise<ListErc721BalancesResponse> {\n try {\n return this.glacierSdk.evmBalances.listErc721Balances({\n chainId,\n address,\n pageSize,\n pageToken,\n });\n } catch (error) {\n if (error instanceof GlacierUnhealthyError) {\n this.setGlacierToUnhealthy();\n }\n throw error;\n }\n }\n\n async listErc1155Balances({\n chainId,\n address,\n pageSize,\n pageToken,\n }: {\n chainId: string;\n address: string;\n pageSize: number;\n pageToken?: string;\n }): Promise<ListErc1155BalancesResponse> {\n try {\n return this.glacierSdk.evmBalances.listErc1155Balances({\n chainId,\n address,\n pageSize,\n pageToken,\n });\n } catch (error) {\n if (error instanceof GlacierUnhealthyError) {\n this.setGlacierToUnhealthy();\n }\n throw error;\n }\n }\n\n async listErc20Balances({\n chainId,\n address,\n currency,\n pageSize,\n pageToken,\n }: {\n chainId: string;\n address: string;\n currency: CurrencyCode;\n pageSize: number;\n pageToken?: string;\n }): Promise<ListErc20BalancesResponse> {\n try {\n return this.glacierSdk.evmBalances.listErc20Balances({\n chainId,\n address,\n currency: currency.toLocaleLowerCase() as CurrencyCode,\n pageSize,\n pageToken,\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.listTransactions({\n chainId,\n address,\n pageToken,\n pageSize,\n });\n } catch (error) {\n if (error instanceof GlacierUnhealthyError) {\n this.setGlacierToUnhealthy();\n }\n throw error;\n }\n }\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';\n\nexport const ethSign = async ({\n request,\n network,\n approvalController,\n proxyApiUrl,\n}: {\n request: RpcRequest;\n network: Network;\n approvalController: ApprovalController;\n proxyApiUrl: string;\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('Params are invalid'),\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 disclaimer: 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.',\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 chainId: network.chainId,\n data: data,\n };\n\n messageDetails = data;\n\n disclaimer =\n \"Signing this message can be dangerous. This signature could potentially perform any operation on your account's behalf, including granting complete control of your account and all of its assets to the requesting site. Only sign this message if you know what you're doing or completely trust the requesting site\";\n } else if (method === RpcMethod.PERSONAL_SIGN) {\n signingData = {\n type: method,\n account: address,\n chainId: network.chainId,\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 chainId: network.chainId,\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 chainId: network.chainId,\n data: data,\n };\n\n const { types, primaryType, ...messageToDisplay } = data;\n messageDetails = beautifyComplexMessage(messageToDisplay);\n }\n\n if (!signingData) {\n return {\n success: false,\n error: rpcErrors.internal('Unable to generate signing data'),\n };\n }\n\n const {\n alert: prioritizedAlert,\n balanceChange,\n tokenApprovals,\n } = await processJsonRpcSimulation({\n request,\n proxyApiUrl,\n accountAddress: address,\n chainId: network.chainId,\n data: { method, params: request.params },\n dAppUrl: request.dappInfo.url,\n });\n\n const displayData: DisplayData = {\n title: 'Sign Message',\n dAppInfo: {\n name: request.dappInfo.name,\n action: `${request.dappInfo.name} requests you to sign the following message`,\n logoUri: request.dappInfo.icon,\n },\n network: {\n chainId: network.chainId,\n name: network.chainName,\n logoUri: network.logoUri,\n },\n account: address,\n messageDetails,\n disclaimer,\n alert: prioritizedAlert ?? alert,\n balanceChange,\n 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 return { result: response.result };\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"]}
|
|
1
|
+
{"version":3,"sources":["../src/module.ts","../src/handlers/get-tokens/get-tokens.ts","../src/utils/get-provider.ts","../src/handlers/get-network-fee/get-network-fee.ts","../src/handlers/get-transaction-history/converters/etherscan-transaction-converter/convert-transaction-normal.ts","../src/handlers/get-transaction-history/utils/get-explorer-address-by-network.ts","../src/handlers/get-transaction-history/converters/etherscan-transaction-converter/convert-transaction-erc20.ts","../src/handlers/get-transaction-history/converters/etherscan-transaction-converter/get-transaction-from-etherscan.ts","../src/handlers/get-transaction-history/utils/is-ethereum-chain-id.ts","../src/handlers/get-transaction-history/converters/evm-transaction-converter/get-tx-type.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/types.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/get-transaction-history.ts","../manifest.json","../src/handlers/eth-send-transaction/eth-send-transaction.ts","../src/handlers/eth-send-transaction/schema.ts","../src/utils/estimate-gas-limit.ts","../src/utils/get-nonce.ts","../src/utils/process-transaction-simulation.ts","../src/utils/scan-transaction.ts","../src/utils/parse-erc20-transaction-type.ts","../../../node_modules/.pnpm/@openzeppelin+contracts@4.9.3/node_modules/@openzeppelin/contracts/build/contracts/ERC20.json","../src/handlers/get-balances/get-balances.ts","../src/handlers/get-balances/evm-balance-service/get-erc20-balances.ts","../../../packages-internal/utils/src/services/token-service/token-service.ts","../../../packages-internal/utils/src/utils/retry.ts","../../../packages-internal/utils/src/utils/coingecko-retry.ts","../../../packages-internal/utils/src/utils/charsum.ts","../../../packages-internal/utils/src/utils/array-hash.ts","../../../packages-internal/utils/src/services/token-service/coingecko-proxy-client.ts","../src/handlers/get-balances/evm-balance-service/get-native-token-balances.ts","../src/handlers/get-balances/glacier-balance-service/get-native-token-balances.ts","../src/handlers/get-balances/glacier-balance-service/get-erc20-balances.ts","../src/env.ts","../src/services/glacier-service/glacier-service.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"],"names":["rpcErrors","RpcMethod","parseManifest","getTokens","chainId","proxyApiUrl","response","JsonRpcBatchInternal","EVMNetwork","GLACIER_API_KEY","getProvider","params","chainName","rpcUrl","multiContractAddress","pollingInterval","provider","addGlacierAPIKeyIfNeeded","knownHosts","url","glacierApiKey","urlObj","search_params","DEFAULT_PRESETS","BASE_PRIORITY_FEE_WEI","getNetworkFee","maxFeePerGasInWei","lowMaxTip","mediumMaxTip","highMaxTip","TokenType","TransactionType","balanceToDisplayValue","BN","getExplorerAddressByNetwork","explorerUrl","hash","hashType","convertTransactionNormal","tx","networkToken","address","isSender","timestamp","decimals","amountBN","amountDisplayValue","txType","from","to","gasPrice","gasUsed","explorerLink","isContractCall","convertTransactionERC20","tokenDecimal","tokenName","tokenSymbol","getErc20Txs","getNormalTxs","getTransactionFromEtherscan","isTestnet","nextPageToken","offset","parsedPageToken","page","queries","normalHist","erc20Hist","erc20TxHashes","filteredNormalTxs","next","isEthereumChainId","startCase","getTxType","nativeTransaction","erc20Transfers","erc721Transfers","userAddress","tokens","nativeOnly","method","parseRawMethod","isSwap","isNativeSend","isNativeReceive","isNFTPurchase","isApprove","isTransfer","isAirdrop","isUnwrap","isFillOrder","isNFTSend","isNFT","isNFTReceive","tokenType","getSenderInfo","isOutgoing","isIncoming","resolve","promise","res","err","ipfsResolver","CLOUDFLARE_IPFS_URL","ipfsResolverWithFallback","sourceUrl","desiredGatewayPrefix","fetchWithTimeout","uri","timeout","controller","getNftMetadata","tokenUri","data","value","json","COVALENT_IMG_SIZER","getSmallImageForNFT","imgUrl","imageSize","erc1155Transfers","result","decimal","erc20Transfer","erc721Transfer","token","imageUri","getImageUri","erc1155Transfer","metadata","error","NonContractCallTypes","ERC20TransactionType","convertTransaction","transactions","blockTimestamp","getTransactionsFromGlacier","glacierService","tranasaction","transaction","getTransactionHistory","manifest_default","z","transactionSchema","paramsSchema","parseRequestParams","estimateGasLimit","nonce","getNonce","AlertType","numberToBN","isHexString","Blockaid","DUMMY_API_KEY","scanTransaction","domain","scanJsonRpc","accountAddress","processTransactionSimulation","request","dAppUrl","alert","balanceChange","tokenApprovals","validation","simulation","transactionAlerts","processTokenApprovals","processBalanceChange","exposures","approvals","exposurePerAsset","convertAssetToNetworkContractToken","spenderAddress","exposurePerSpender","exposure","assetDiffs","ins","processAssetDiffs","outs","type","assetDiff","a","b","asset","convertNativeAssetToToken","items","diff","displayValue","valueBN","x","processJsonRpcSimulation","Interface","ERC20_default","parseERC20TransactionType","description","functionName","isERC20TransactionType","ethSendTransaction","network","approvalController","dappInfo","gasLimit","transactionType","title","displayData","signingData","txHash","waitForTransactionReceipt","onTransactionConfirmed","onTransactionReverted","bnToBig","ethers","getErc20Balances","tokenService","currency","coingeckoPlatformId","coingeckoTokenId","tokenAddresses","tokensBalances","balanceBig","balance","acc","simplePriceResponse","priceInCurrency","marketCap","vol24","change24","balanceInCurrency","balanceDisplayValue","balanceCurrencyDisplayValue","VsCurrencyType","getBasicCoingeckoHttp","simplePrice","simpleTokenPrice","retry","operation","isSuccess","maxRetries","backoffPolicy","RetryBackoffPolicy","backoffPeriodMillis","retries","lastError","delay","errorMessage","retryIndex","secondsToDelay","_","msToDelay","ms","r","coingeckoRetry","charsum","s","i","sum","arrayHash","array","cs","Zodios","RawSimplePriceResponseSchema","SimplePriceResponseSchema","boolean","string","coingeckoProxyClient","coingeckoBasicClient","_storage","_proxyApiUrl","TokenService","storage","__privateAdd","__publicField","currencies","formattedData","id","tokenData","__privateSet","coinIds","cacheId","__privateGet","useCoingeckoProxy","assetPlatformId","lastUpdated","shouldThrow","rawData","bigToBN","bigintToBig","getNativeTokenBalances","balanceBigint","balaceBig","coingeckoId","nativeTokenBalance","customTokens","tokensWithBalance","convertErc20TokenWithBalanceToTokenWithBalance","convertErc20TokenToTokenWithBalance","tokenBalances","getBalances","addresses","isNetworkSupported","isHealthy","balances","nativeToken","erc20Tokens","isERC20Token","allTokens","Environment","prodEnv","devEnv","getEnv","environment","Glacier","GlacierUnhealthyError","EvmGlacierService","glacierApiUrl","supportedChains","chain","tokenId","pageSize","pageToken","toUtf8String","beautifyComplexMessage","key","toUnicodeBold","subKey","item","index","beautifySimpleMessage","str","boldMap","char","messageSchema","addressSchema","ethSignSchema","messageTypeSchema","typedDataSchema","typedDataV1Schema","combinedTypedDataSchema","dataSchema","combinedDataSchema","ethSignTypedDataSchema","ethSignTypedDataV1Schema","ethSignTypedDataV3Schema","ethSignTypedDataV4Schema","personalSignSchema","ctx","parsed","isTypedDataV1","isTypedData","TypedDataEncoder","isTypedDataValid","EIP712Domain","types","ethSign","typedDataValidationResult","messageDetails","disclaimer","primaryType","messageToDisplay","prioritizedAlert","_glacierService","_approvalController","EvmModule","utilityAddresses"],"mappings":"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","sourcesContent":["import type {\n Module,\n Manifest,\n NetworkFees,\n GetTransactionHistory,\n RpcRequest,\n Environment,\n Network,\n ApprovalController,\n GetBalancesParams,\n GetBalancesResponse,\n} from '@avalabs/vm-module-types';\nimport { rpcErrors } from '@metamask/rpc-errors';\nimport { RpcMethod, parseManifest } from '@avalabs/vm-module-types';\nimport { getTokens } from './handlers/get-tokens/get-tokens';\nimport { getNetworkFee } from './handlers/get-network-fee/get-network-fee';\nimport { getTransactionHistory } from './handlers/get-transaction-history/get-transaction-history';\nimport ManifestJson from '../manifest.json';\nimport { ethSendTransaction } from './handlers/eth-send-transaction/eth-send-transaction';\nimport { getBalances } from './handlers/get-balances/get-balances';\nimport { getEnv } from './env';\nimport { EvmGlacierService } from './services/glacier-service/glacier-service';\nimport { ethSign } from './handlers/eth-sign/eth-sign';\n\nexport class EvmModule implements Module {\n #glacierService: EvmGlacierService;\n #proxyApiUrl: string;\n #approvalController: ApprovalController;\n\n constructor({\n approvalController,\n environment,\n }: {\n approvalController: ApprovalController;\n environment: Environment;\n }) {\n const { glacierApiUrl, proxyApiUrl } = getEnv(environment);\n this.#glacierService = new EvmGlacierService({ glacierApiUrl });\n this.#proxyApiUrl = proxyApiUrl;\n this.#approvalController = approvalController;\n }\n\n getAddress(): Promise<string> {\n return Promise.resolve('EVM address');\n }\n\n getBalances({\n addresses,\n network,\n currency,\n customTokens,\n storage,\n }: GetBalancesParams): Promise<GetBalancesResponse> {\n return getBalances({\n addresses,\n currency,\n network,\n proxyApiUrl: this.#proxyApiUrl,\n customTokens,\n glacierService: this.#glacierService,\n storage,\n });\n }\n\n getManifest(): Manifest | undefined {\n const result = parseManifest(ManifestJson);\n return result.success ? result.data : undefined;\n }\n\n getNetworkFee(network: Network): Promise<NetworkFees> {\n const { chainId, chainName, rpcUrl, utilityAddresses } = network;\n return getNetworkFee({\n chainId,\n chainName,\n rpcUrl,\n multiContractAddress: utilityAddresses?.multicall,\n });\n }\n\n getTransactionHistory(params: GetTransactionHistory) {\n const { network, address, nextPageToken, offset } = params;\n const { chainId, isTestnet, networkToken, explorerUrl = '' } = network;\n\n return getTransactionHistory({\n chainId,\n isTestnet,\n networkToken,\n explorerUrl,\n address,\n nextPageToken,\n offset,\n glacierService: this.#glacierService,\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 proxyApiUrl: this.#proxyApiUrl,\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 proxyApiUrl: this.#proxyApiUrl,\n });\n default:\n return { error: rpcErrors.methodNotSupported(`Method ${request.method} not supported`) };\n }\n }\n}\n","import type { NetworkContractToken } from '@avalabs/vm-module-types';\nimport { rpcErrors } from '@metamask/rpc-errors';\n\nexport async function getTokens({\n chainId,\n proxyApiUrl,\n}: {\n chainId: number;\n proxyApiUrl: string;\n}): Promise<NetworkContractToken[]> {\n const response = await fetch(`${proxyApiUrl}/tokens?evmChainId=${chainId}`);\n\n if (!response.ok) {\n throw rpcErrors.internal(`Failed to fetch tokens for chainId ${chainId}`);\n }\n\n return response.json();\n}\n","import { JsonRpcBatchInternal } from '@avalabs/wallets-sdk';\nimport { Network as EVMNetwork } from 'ethers';\n\n// this key is only needed in development to bypass rate limit\n// it should never be used in production\nconst GLACIER_API_KEY = process.env.GLACIER_API_KEY;\n\ntype ProviderParams = {\n chainId: number;\n chainName: string;\n rpcUrl: string;\n multiContractAddress?: string;\n pollingInterval?: number;\n};\n\nexport const getProvider = (params: ProviderParams): JsonRpcBatchInternal => {\n const { chainId, chainName, rpcUrl, multiContractAddress, pollingInterval = 2000 } = params;\n\n const provider = new JsonRpcBatchInternal(\n { maxCalls: 40, multiContractAddress },\n addGlacierAPIKeyIfNeeded(rpcUrl, GLACIER_API_KEY),\n new EVMNetwork(chainName, chainId),\n );\n\n provider.pollingInterval = pollingInterval;\n\n return provider;\n};\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'];\n\n/**\n * Glacier needs an API key for development, this adds the key if needed.\n */\nexport function addGlacierAPIKeyIfNeeded(url: string, glacierApiKey?: string): string {\n const urlObj = new URL(url);\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 type { NetworkFees } from '@avalabs/vm-module-types';\nimport { getProvider } from '../../utils/get-provider';\nimport { rpcErrors } from '@metamask/rpc-errors';\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\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}: {\n chainId: number;\n chainName: string;\n rpcUrl: string;\n multiContractAddress?: string;\n}): Promise<NetworkFees> {\n const provider = getProvider({\n chainId,\n chainName,\n rpcUrl,\n multiContractAddress,\n });\n\n const { maxFeePerGas: maxFeePerGasInWei } = await provider.getFeeData();\n if (!maxFeePerGasInWei) {\n throw rpcErrors.internal('Pre-EIP-1559 networks are not supported');\n }\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: maxFeePerGasInWei,\n low: {\n maxFeePerGas: maxFeePerGasInWei + lowMaxTip,\n maxPriorityFeePerGas: lowMaxTip,\n },\n medium: {\n maxFeePerGas: maxFeePerGasInWei + mediumMaxTip,\n maxPriorityFeePerGas: mediumMaxTip,\n },\n high: {\n maxFeePerGas: maxFeePerGasInWei + highMaxTip,\n maxPriorityFeePerGas: highMaxTip,\n },\n isFixedFee: false,\n };\n}\n","import type { NormalTx } from '@avalabs/etherscan-sdk';\nimport { TokenType, TransactionType, type NetworkToken, type Transaction } from '@avalabs/vm-module-types';\nimport { balanceToDisplayValue } from '@avalabs/utils-sdk';\nimport { BN } from 'bn.js';\nimport { getExplorerAddressByNetwork } from '../../utils/get-explorer-address-by-network';\n\nexport const convertTransactionNormal = ({\n tx,\n networkToken,\n chainId,\n explorerUrl,\n address,\n}: {\n tx: NormalTx;\n networkToken: NetworkToken;\n chainId: number;\n explorerUrl: string;\n address: string;\n}): Transaction => {\n const isSender = tx.from.toLowerCase() === address.toLowerCase();\n const timestamp = parseInt(tx.timeStamp) * 1000;\n const decimals = networkToken.decimals;\n const amountBN = new BN(tx.value);\n const amountDisplayValue = balanceToDisplayValue(amountBN, decimals);\n const txType = isSender ? TransactionType.SEND : TransactionType.RECEIVE;\n\n const { from, to, gasPrice, gasUsed, hash } = tx;\n const explorerLink = getExplorerAddressByNetwork(explorerUrl, hash);\n\n return {\n isIncoming: !isSender,\n isOutgoing: isSender,\n isContractCall: isContractCall(tx),\n timestamp,\n hash,\n isSender,\n from,\n to,\n tokens: [\n {\n decimal: decimals.toString(),\n name: networkToken.name,\n symbol: networkToken.symbol,\n amount: amountDisplayValue,\n type: TokenType.NATIVE,\n },\n ],\n gasUsed,\n gasPrice,\n chainId: chainId.toString(),\n txType,\n explorerLink,\n };\n};\n\nfunction isContractCall(tx: NormalTx): boolean {\n return tx.input !== '0x';\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 { Erc20Tx } from '@avalabs/etherscan-sdk';\nimport { TokenType, TransactionType, type Transaction } from '@avalabs/vm-module-types';\nimport { balanceToDisplayValue } from '@avalabs/utils-sdk';\nimport { getExplorerAddressByNetwork } from '../../utils/get-explorer-address-by-network';\nimport { BN } from 'bn.js';\n\nexport function convertTransactionERC20({\n tx,\n address,\n explorerUrl,\n chainId,\n}: {\n tx: Erc20Tx;\n address: string;\n chainId: number;\n explorerUrl: string;\n}): Transaction {\n const isSender = tx.from.toLowerCase() === address.toLowerCase();\n const timestamp = parseInt(tx.timeStamp) * 1000;\n const decimals = parseInt(tx.tokenDecimal);\n const amountBN = new BN(tx.value);\n const amountDisplayValue = balanceToDisplayValue(amountBN, decimals);\n const { from, to, gasPrice, gasUsed, hash, tokenDecimal, tokenName, tokenSymbol } = tx;\n const txType = isSender ? TransactionType.SEND : TransactionType.RECEIVE;\n const explorerLink = getExplorerAddressByNetwork(explorerUrl, hash);\n\n return {\n isIncoming: !isSender,\n isOutgoing: isSender,\n isContractCall: false,\n timestamp,\n hash,\n isSender,\n from,\n to,\n tokens: [\n {\n decimal: tokenDecimal,\n name: tokenName,\n symbol: tokenSymbol,\n type: TokenType.ERC20,\n amount: amountDisplayValue,\n },\n ],\n gasUsed,\n gasPrice,\n chainId: chainId.toString(),\n txType,\n explorerLink,\n };\n}\n","import { convertTransactionNormal } from './convert-transaction-normal';\nimport { convertTransactionERC20 } from './convert-transaction-erc20';\nimport type { NetworkToken, TransactionHistoryResponse } from '@avalabs/vm-module-types';\nimport { getErc20Txs, getNormalTxs } from '@avalabs/etherscan-sdk';\n\ninterface EtherscanPagination {\n queries: ('normal' | 'erc20')[];\n page?: number;\n}\n\nexport const getTransactionFromEtherscan = async ({\n isTestnet,\n networkToken,\n explorerUrl,\n chainId,\n address,\n nextPageToken,\n offset,\n}: {\n isTestnet?: boolean;\n networkToken: NetworkToken;\n explorerUrl: string;\n chainId: number;\n address: string;\n nextPageToken?: string;\n offset?: number;\n}): Promise<TransactionHistoryResponse> => {\n /*\n Using JSON for nextPageToken because this function is managing both the Normal\n and ERC20 queries. It encodes the current page and the queries that should be\n run. For example, if 'normal' has no more records to fetch then it will be\n excluded from the list and the JSON will be something like:\n { page: 3, queries: ['erc20'] }\n */\n const parsedPageToken = nextPageToken ? (JSON.parse(nextPageToken) as EtherscanPagination) : undefined;\n const page = parsedPageToken?.page || 1;\n const queries = parsedPageToken?.queries || ['normal', 'erc20'];\n\n const normalHist = (queries.includes('normal') ? await getNormalTxs(address, !isTestnet, { page, offset }) : []).map(\n (tx) => convertTransactionNormal({ tx, chainId, networkToken, explorerUrl, address }),\n );\n\n const erc20Hist = (\n queries.includes('erc20')\n ? await getErc20Txs(address, !isTestnet, undefined, {\n page,\n offset,\n })\n : []\n ).map((tx) =>\n convertTransactionERC20({\n tx,\n address,\n explorerUrl,\n chainId,\n }),\n );\n\n // Filter erc20 transactions from normal tx list\n const erc20TxHashes = erc20Hist.map((tx) => tx.hash);\n const filteredNormalTxs = normalHist.filter((tx) => {\n return !erc20TxHashes.includes(tx.hash);\n });\n\n const next: EtherscanPagination = { queries: [], page: page + 1 };\n if (normalHist.length) next.queries.push('normal');\n if (erc20Hist.length) next.queries.push('erc20');\n\n return {\n transactions: [...filteredNormalTxs, ...erc20Hist],\n nextPageToken: next.queries.length ? JSON.stringify(next) : '', // stop pagination\n };\n};\n","enum ChainId {\n ETHEREUM_HOMESTEAD = 1,\n ETHEREUM_TEST_RINKEBY = 4,\n ETHEREUM_TEST_GOERLY = 5,\n ETHEREUM_TEST_SEPOLIA = 11155111,\n}\n\nexport const isEthereumChainId = (chainId: number): boolean => {\n return (\n ChainId.ETHEREUM_HOMESTEAD === chainId ||\n ChainId.ETHEREUM_TEST_GOERLY === chainId ||\n ChainId.ETHEREUM_TEST_RINKEBY === chainId ||\n ChainId.ETHEREUM_TEST_SEPOLIA === chainId\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\nexport const getTxType = (\n { nativeTransaction, erc20Transfers, erc721Transfers }: TransactionDetails,\n userAddress: string,\n tokens: TxToken[],\n): TransactionType => {\n const nativeOnly = !erc20Transfers && !erc721Transfers;\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 const isNFTSend =\n isTransfer && !!tokens[0] && isNFT(tokens[0].type) && tokens[0].from?.address.toLowerCase() === address;\n const isNFTReceive =\n isTransfer && !!tokens[0] && isNFT(tokens[0].type) && tokens[0].to?.address.toLowerCase() === address;\n\n if (isSwap) return TransactionType.SWAP;\n if (isNativeSend) return TransactionType.SEND;\n if (isNativeReceive) return TransactionType.RECEIVE;\n if (isNFTPurchase) return TransactionType.NFT_BUY;\n if (isApprove) return TransactionType.APPROVE;\n if (isNFTSend) return TransactionType.NFT_SEND;\n if (isNFTReceive) return TransactionType.NFT_RECEIVE;\n if (isTransfer) return TransactionType.TRANSFER;\n if (isAirdrop) return TransactionType.AIRDROP;\n if (isUnwrap) return TransactionType.UNWRAP;\n if (isFillOrder) return TransactionType.FILL_ORDER;\n return TransactionType.UNKNOWN;\n};\n\nfunction isNFT(tokenType: TokenType) {\n return tokenType === TokenType.ERC721 || tokenType === TokenType.ERC1155;\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 { 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 const isNativeSend = txType === TransactionType.SEND;\n const isNativeReceive = txType === TransactionType.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 = isNativeSend || (isTransfer && from.toLowerCase() === address.toLowerCase());\n const isIncoming = isNativeReceive || (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 { balanceToDisplayValue } from '@avalabs/utils-sdk';\nimport { BN } from 'bn.js';\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 amountBN = new BN(nativeTransaction.value);\n const amountDisplayValue = balanceToDisplayValue(amountBN, decimal);\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 amountBN = new BN(erc20Transfer.value);\n const amountDisplayValue = balanceToDisplayValue(amountBN, decimals);\n\n result.push({\n decimal: decimals.toString(),\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 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 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/utils-sdk';\n\nexport const CLOUDFLARE_IPFS_URL = 'https://cloudflare-ipfs.com';\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 { TransactionType } from '@avalabs/vm-module-types';\n\nexport const NonContractCallTypes = [TransactionType.SEND, TransactionType.RECEIVE, TransactionType.TRANSFER];\n\nexport type TransactionParams = {\n from: string;\n to: string;\n data?: string;\n value?: string;\n gas?: string;\n gasPrice?: string;\n maxFeePerGas?: string;\n maxPriorityFeePerGas?: string;\n nonce?: string;\n chainId?: string;\n};\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","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 { getTransactionFromEtherscan } from './converters/etherscan-transaction-converter/get-transaction-from-etherscan';\nimport { isEthereumChainId } from './utils/is-ethereum-chain-id';\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';\n\nexport const getTransactionHistory = async ({\n chainId,\n isTestnet,\n networkToken,\n explorerUrl,\n address,\n nextPageToken,\n offset,\n glacierService,\n}: {\n chainId: number;\n isTestnet?: boolean;\n networkToken: NetworkToken;\n explorerUrl: string;\n address: string;\n nextPageToken?: string;\n offset?: number;\n glacierService: EvmGlacierService;\n}): Promise<TransactionHistoryResponse> => {\n if (isEthereumChainId(chainId)) {\n return getTransactionFromEtherscan({\n isTestnet,\n networkToken,\n explorerUrl,\n chainId,\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","{\n \"name\": \"EVM\",\n \"description\": \"\",\n \"version\": \"0.0.1\",\n \"sources\": {\n \"module\": {\n \"checksum\": \"\",\n \"location\": {\n \"npm\": {\n \"filePath\": \"dist/bundle.js\",\n \"packageName\": \"@avalabs/evm-module\",\n \"registry\": \"https://registry.npmjs.org\"\n }\n }\n },\n \"provider\": {\n \"checksum\": \"\",\n \"location\": {\n \"npm\": {\n \"filePath\": \"dist/provider.js\",\n \"packageName\": \"@avalabs/evm-module\",\n \"registry\": \"https://registry.npmjs.org\"\n }\n }\n }\n },\n \"network\": {\n \"chainIds\": [\"eip155:1\", \"eip155:43114\", \"eip155:43113\"],\n \"namespaces\": [\"eip155\"]\n },\n \"cointype\": \"60\",\n \"permissions\": {\n \"rpc\": {\n \"dapps\": true,\n \"methods\": [\"eth_sendTransaction\", \"eth_*\", \"personal_sign\"]\n }\n },\n \"manifestVersion\": \"0.0\"\n}\n","import {\n type Network,\n type Hex,\n type RpcRequest,\n type ApprovalController,\n type DisplayData,\n type SigningData,\n RpcMethod,\n} from '@avalabs/vm-module-types';\nimport { parseRequestParams } from './schema';\nimport { estimateGasLimit } from '../../utils/estimate-gas-limit';\nimport { getNonce } from '../../utils/get-nonce';\nimport { rpcErrors } from '@metamask/rpc-errors';\nimport { getProvider } from '../../utils/get-provider';\nimport type { JsonRpcBatchInternal } from '@avalabs/wallets-sdk';\nimport { processTransactionSimulation } from '../../utils/process-transaction-simulation';\nimport { parseERC20TransactionType } from '../../utils/parse-erc20-transaction-type';\nimport { ERC20TransactionType } from '../../types';\n\nexport const ethSendTransaction = async ({\n request,\n network,\n approvalController,\n proxyApiUrl,\n}: {\n request: RpcRequest;\n network: Network;\n approvalController: ApprovalController;\n proxyApiUrl: string;\n}) => {\n const { dappInfo, params } = request;\n\n // validate params\n const result = parseRequestParams(params);\n\n if (!result.success) {\n console.error('invalid params', result.error);\n return {\n error: rpcErrors.invalidParams('Transaction params are invalid'),\n };\n }\n\n const transaction = result.data[0];\n\n if (!transaction) {\n return {\n error: rpcErrors.invalidParams('Transaction params are invalid'),\n };\n }\n\n const provider = getProvider({\n chainId: network.chainId,\n chainName: network.chainName,\n rpcUrl: network.rpcUrl,\n multiContractAddress: network.utilityAddresses?.multicall,\n pollingInterval: 1000,\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 },\n provider,\n });\n\n transaction.gas = '0x' + gasLimit.toString(16);\n } catch (error) {\n return {\n error: rpcErrors.internal('Unable to calculate gas limit'),\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('Unable to calculate nonce'),\n };\n }\n }\n\n const transactionType = parseERC20TransactionType(transaction);\n\n const { alert, balanceChange, tokenApprovals } = await processTransactionSimulation({\n request,\n proxyApiUrl,\n chainId: network.chainId,\n params: transaction,\n dAppUrl: request.dappInfo.url,\n });\n\n // generate display and signing data\n let title = 'Approve Transaction';\n if (transactionType === ERC20TransactionType.APPROVE) {\n title = 'Token Spend Approval';\n }\n\n const displayData: DisplayData = {\n title,\n network: {\n chainId: network.chainId,\n name: network.chainName,\n logoUri: network.logoUri,\n },\n transactionDetails: {\n website: new URL(dappInfo.url).hostname,\n from: transaction.from,\n to: transaction.to,\n data: transaction.data,\n type: transactionType,\n },\n networkFeeSelector: true,\n alert,\n balanceChange,\n tokenApprovals,\n };\n\n const signingData: SigningData = {\n type: RpcMethod.ETH_SEND_TRANSACTION,\n account: transaction.from,\n chainId: network.chainId,\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 to: transaction.to,\n from: transaction.from,\n data: transaction.data,\n value: transaction.value,\n chainId: transaction.chainId,\n },\n };\n\n // prompt user for approval\n const response = await approvalController.requestApproval({ request, displayData, signingData });\n\n if ('error' in response) {\n return {\n error: response.error,\n };\n }\n\n // broadcast the signed transaction\n const txHash = await provider.send('eth_sendRawTransaction', [response.result]);\n\n waitForTransactionReceipt({\n provider,\n txHash,\n onTransactionConfirmed: approvalController.onTransactionConfirmed,\n onTransactionReverted: approvalController.onTransactionReverted,\n });\n\n return { result: txHash };\n};\n\nconst waitForTransactionReceipt = async ({\n provider,\n txHash,\n onTransactionConfirmed,\n onTransactionReverted,\n}: {\n provider: JsonRpcBatchInternal;\n txHash: Hex;\n onTransactionConfirmed: (txHash: Hex) => void;\n onTransactionReverted: (txHash: Hex) => void;\n}) => {\n const receipt = await provider.waitForTransaction(txHash);\n\n const success = receipt?.status === 1; // 1 indicates success, 0 indicates revert\n\n if (success) {\n onTransactionConfirmed(txHash);\n } else {\n onTransactionReverted(txHash);\n }\n};\n","import { z } from 'zod';\n\nconst transactionSchema = z.object({\n from: z.string().length(42),\n to: z.string().length(42),\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(),\n});\n\nconst paramsSchema = z.array(transactionSchema).length(1);\n\nexport const parseRequestParams = (params: unknown) => {\n return paramsSchema.safeParse(params);\n};\n","import { JsonRpcBatchInternal } from '@avalabs/wallets-sdk';\nimport type { BigNumberish } from 'ethers';\n\nexport const estimateGasLimit = async ({\n transactionParams: { from, to, data, value },\n provider,\n}: {\n transactionParams: {\n from: string;\n to: string;\n data?: string;\n value?: BigNumberish;\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 }),\n );\n};\n","import { JsonRpcBatchInternal } from '@avalabs/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 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} from '@avalabs/vm-module-types';\nimport { balanceToDisplayValue, numberToBN } from '@avalabs/utils-sdk';\nimport { isHexString } from 'ethers';\nimport { scanJsonRpc, scanTransaction } from './scan-transaction';\n\nexport const processTransactionSimulation = async ({\n request,\n dAppUrl,\n params,\n chainId,\n proxyApiUrl,\n}: {\n request: RpcRequest;\n dAppUrl?: string;\n params: TransactionParams;\n chainId: number;\n proxyApiUrl: string;\n}) => {\n let alert: Alert | undefined;\n let balanceChange: BalanceChange | undefined;\n let tokenApprovals: TokenApprovals | undefined;\n\n try {\n const { validation, simulation } = await scanTransaction({\n proxyApiUrl,\n chainId,\n params,\n domain: dAppUrl,\n });\n\n if (!validation || validation.result_type === 'Error' || 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, simulation.account_summary.exposures);\n balanceChange = processBalanceChange(simulation.account_summary.assets_diffs);\n }\n } catch (error) {\n console.error('processTransactionSimulation error', error);\n alert = transactionAlerts[AlertType.WARNING];\n }\n\n return { alert, balanceChange, tokenApprovals };\n};\n\nconst processTokenApprovals = (\n request: RpcRequest,\n exposures: Blockaid.AddressAssetExposure[],\n): TokenApprovals | undefined => {\n const approvals: TokenApproval[] = [];\n\n for (const exposurePerAsset of exposures) {\n const token = convertAssetToNetworkContractToken(exposurePerAsset.asset);\n if (!token) {\n continue;\n }\n\n for (const [spenderAddress, exposurePerSpender] of Object.entries(exposurePerAsset.spenders)) {\n if (exposurePerSpender.exposure.length === 0) {\n approvals.push({\n token,\n spenderAddress,\n logoUri: token.logoUri,\n });\n } else {\n for (const exposure of exposurePerSpender.exposure) {\n if ('raw_value' in exposure) {\n approvals.push({\n token,\n spenderAddress,\n value: exposure.raw_value,\n usdPrice: exposure.usd_price,\n logoUri: token.logoUri,\n });\n } else {\n approvals.push({\n token,\n spenderAddress,\n logoUri: exposure.logo_url,\n usdPrice: exposure.usd_price,\n });\n }\n }\n }\n }\n }\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 request.method === RpcMethod.ETH_SEND_TRANSACTION;\n\n return { isEditable, approvals };\n};\n\nexport const processBalanceChange = (assetDiffs: Blockaid.AssetDiff[]): BalanceChange | undefined => {\n const ins = processAssetDiffs(assetDiffs, 'in');\n const outs = processAssetDiffs(assetDiffs, 'out');\n\n if (ins.length === 0 && outs.length === 0) {\n return undefined;\n }\n\n return { ins, outs };\n};\n\nconst processAssetDiffs = (assetDiffs: Blockaid.AssetDiff[], type: 'in' | 'out'): TokenDiff[] => {\n return (\n assetDiffs\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 return displayValue ? { displayValue, usdPrice: diff.usd_price } : undefined;\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 proxyApiUrl,\n}: {\n request: RpcRequest;\n dAppUrl?: string;\n accountAddress: string;\n data: { method: string; params: unknown };\n chainId: number;\n proxyApiUrl: string;\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 proxyApiUrl,\n chainId,\n accountAddress,\n data: data as Blockaid.Evm.JsonRpcScanParams.Data,\n domain: dAppUrl,\n });\n\n if (!validation || validation.result_type === 'Error' || 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, simulation.account_summary.exposures);\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\nconst transactionAlerts = {\n [AlertType.WARNING]: {\n type: AlertType.WARNING,\n details: {\n title: 'Suspicious Transaction',\n description: 'Use caution, this transaction may be malicious.',\n },\n },\n [AlertType.DANGER]: {\n type: AlertType.DANGER,\n details: {\n title: 'Scam Transaction',\n description: 'This transaction is malicious, do not proceed.',\n actionTitles: {\n reject: 'Reject Transaction',\n proceed: 'Proceed Anyway',\n },\n },\n },\n};\n","import Blockaid from '@blockaid/client';\nimport type { TransactionParams } from '../types';\n\nconst DUMMY_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\nexport const scanTransaction = async ({\n proxyApiUrl,\n chainId,\n params,\n domain,\n}: {\n proxyApiUrl: string;\n chainId: number;\n params: TransactionParams;\n domain?: string;\n}): Promise<Blockaid.TransactionScanResponse> => {\n const blockaid = new Blockaid({\n baseURL: proxyApiUrl + '/proxy/blockaid/',\n apiKey: DUMMY_API_KEY,\n });\n\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 },\n metadata: (domain && domain.length > 0 ? { domain } : { non_dapp: true }) as Blockaid.Evm.Metadata,\n });\n};\n\nexport const scanJsonRpc = async ({\n proxyApiUrl,\n chainId,\n accountAddress,\n data,\n domain,\n}: {\n proxyApiUrl: string;\n chainId: number;\n accountAddress: string;\n data: Blockaid.Evm.JsonRpcScanParams.Data;\n domain?: string;\n}): Promise<Blockaid.TransactionScanResponse> => {\n const blockaid = new Blockaid({\n baseURL: proxyApiUrl + '/proxy/blockaid/',\n apiKey: DUMMY_API_KEY,\n });\n\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.Metadata,\n });\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","{\n \"_format\": \"hh-sol-artifact-1\",\n \"contractName\": \"ERC20\",\n \"sourceName\": \"contracts/token/ERC20/ERC20.sol\",\n \"abi\": [\n {\n \"inputs\": [\n {\n \"internalType\": \"string\",\n \"name\": \"name_\",\n \"type\": \"string\"\n },\n {\n \"internalType\": \"string\",\n \"name\": \"symbol_\",\n \"type\": \"string\"\n }\n ],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"constructor\"\n },\n {\n \"anonymous\": false,\n \"inputs\": [\n {\n \"indexed\": true,\n \"internalType\": \"address\",\n \"name\": \"owner\",\n \"type\": \"address\"\n },\n {\n \"indexed\": true,\n \"internalType\": \"address\",\n \"name\": \"spender\",\n \"type\": \"address\"\n },\n {\n \"indexed\": false,\n \"internalType\": \"uint256\",\n \"name\": \"value\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"Approval\",\n \"type\": \"event\"\n },\n {\n \"anonymous\": false,\n \"inputs\": [\n {\n \"indexed\": true,\n \"internalType\": \"address\",\n \"name\": \"from\",\n \"type\": \"address\"\n },\n {\n \"indexed\": true,\n \"internalType\": \"address\",\n \"name\": \"to\",\n \"type\": \"address\"\n },\n {\n \"indexed\": false,\n \"internalType\": \"uint256\",\n \"name\": \"value\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"Transfer\",\n \"type\": \"event\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"owner\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"address\",\n \"name\": \"spender\",\n \"type\": \"address\"\n }\n ],\n \"name\": \"allowance\",\n \"outputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"\",\n \"type\": \"uint256\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"spender\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"amount\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"approve\",\n \"outputs\": [\n {\n \"internalType\": \"bool\",\n \"name\": \"\",\n \"type\": \"bool\"\n }\n ],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"account\",\n \"type\": \"address\"\n }\n ],\n \"name\": \"balanceOf\",\n \"outputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"\",\n \"type\": \"uint256\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"decimals\",\n \"outputs\": [\n {\n \"internalType\": \"uint8\",\n \"name\": \"\",\n \"type\": \"uint8\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"spender\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"subtractedValue\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"decreaseAllowance\",\n \"outputs\": [\n {\n \"internalType\": \"bool\",\n \"name\": \"\",\n \"type\": \"bool\"\n }\n ],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"spender\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"addedValue\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"increaseAllowance\",\n \"outputs\": [\n {\n \"internalType\": \"bool\",\n \"name\": \"\",\n \"type\": \"bool\"\n }\n ],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"name\",\n \"outputs\": [\n {\n \"internalType\": \"string\",\n \"name\": \"\",\n \"type\": \"string\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"symbol\",\n \"outputs\": [\n {\n \"internalType\": \"string\",\n \"name\": \"\",\n \"type\": \"string\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"totalSupply\",\n \"outputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"\",\n \"type\": \"uint256\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"to\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"amount\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"transfer\",\n \"outputs\": [\n {\n \"internalType\": \"bool\",\n \"name\": \"\",\n \"type\": \"bool\"\n }\n ],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"from\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"address\",\n \"name\": \"to\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"amount\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"transferFrom\",\n \"outputs\": [\n {\n \"internalType\": \"bool\",\n \"name\": \"\",\n \"type\": \"bool\"\n }\n ],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n }\n ],\n \"bytecode\": \"0x60806040523480156200001157600080fd5b5060405162000aed38038062000aed8339810160408190526200003491620001db565b81516200004990600390602085019062000068565b5080516200005f90600490602084019062000068565b50505062000281565b828054620000769062000245565b90600052602060002090601f0160209004810192826200009a5760008555620000e5565b82601f10620000b557805160ff1916838001178555620000e5565b82800160010185558215620000e5579182015b82811115620000e5578251825591602001919060010190620000c8565b50620000f3929150620000f7565b5090565b5b80821115620000f35760008155600101620000f8565b634e487b7160e01b600052604160045260246000fd5b600082601f8301126200013657600080fd5b81516001600160401b03808211156200015357620001536200010e565b604051601f8301601f19908116603f011681019082821181831017156200017e576200017e6200010e565b816040528381526020925086838588010111156200019b57600080fd5b600091505b83821015620001bf5785820183015181830184015290820190620001a0565b83821115620001d15760008385830101525b9695505050505050565b60008060408385031215620001ef57600080fd5b82516001600160401b03808211156200020757600080fd5b620002158683870162000124565b935060208501519150808211156200022c57600080fd5b506200023b8582860162000124565b9150509250929050565b600181811c908216806200025a57607f821691505b6020821081036200027b57634e487b7160e01b600052602260045260246000fd5b50919050565b61085c80620002916000396000f3fe608060405234801561001057600080fd5b50600436106100a95760003560e01c80633950935111610071578063395093511461012357806370a082311461013657806395d89b411461015f578063a457c2d714610167578063a9059cbb1461017a578063dd62ed3e1461018d57600080fd5b806306fdde03146100ae578063095ea7b3146100cc57806318160ddd146100ef57806323b872dd14610101578063313ce56714610114575b600080fd5b6100b66101a0565b6040516100c3919061069a565b60405180910390f35b6100df6100da36600461070b565b610232565b60405190151581526020016100c3565b6002545b6040519081526020016100c3565b6100df61010f366004610735565b61024a565b604051601281526020016100c3565b6100df61013136600461070b565b61026e565b6100f3610144366004610771565b6001600160a01b031660009081526020819052604090205490565b6100b6610290565b6100df61017536600461070b565b61029f565b6100df61018836600461070b565b61031f565b6100f361019b366004610793565b61032d565b6060600380546101af906107c6565b80601f01602080910402602001604051908101604052809291908181526020018280546101db906107c6565b80156102285780601f106101fd57610100808354040283529160200191610228565b820191906000526020600020905b81548152906001019060200180831161020b57829003601f168201915b5050505050905090565b600033610240818585610358565b5060019392505050565b60003361025885828561047c565b6102638585856104f6565b506001949350505050565b600033610240818585610281838361032d565b61028b9190610800565b610358565b6060600480546101af906107c6565b600033816102ad828661032d565b9050838110156103125760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b60648201526084015b60405180910390fd5b6102638286868403610358565b6000336102408185856104f6565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b6001600160a01b0383166103ba5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610309565b6001600160a01b03821661041b5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610309565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6000610488848461032d565b905060001981146104f057818110156104e35760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610309565b6104f08484848403610358565b50505050565b6001600160a01b03831661055a5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610309565b6001600160a01b0382166105bc5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610309565b6001600160a01b038316600090815260208190526040902054818110156106345760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610309565b6001600160a01b03848116600081815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a36104f0565b600060208083528351808285015260005b818110156106c7578581018301518582016040015282016106ab565b818111156106d9576000604083870101525b50601f01601f1916929092016040019392505050565b80356001600160a01b038116811461070657600080fd5b919050565b6000806040838503121561071e57600080fd5b610727836106ef565b946020939093013593505050565b60008060006060848603121561074a57600080fd5b610753846106ef565b9250610761602085016106ef565b9150604084013590509250925092565b60006020828403121561078357600080fd5b61078c826106ef565b9392505050565b600080604083850312156107a657600080fd5b6107af836106ef565b91506107bd602084016106ef565b90509250929050565b600181811c908216806107da57607f821691505b6020821081036107fa57634e487b7160e01b600052602260045260246000fd5b50919050565b6000821982111561082157634e487b7160e01b600052601160045260246000fd5b50019056fea2646970667358221220e7dc257596a973556752e9db5f465b21aad78d068ae819d0395e1f99a95065a964736f6c634300080d0033\",\n \"deployedBytecode\": \"0x608060405234801561001057600080fd5b50600436106100a95760003560e01c80633950935111610071578063395093511461012357806370a082311461013657806395d89b411461015f578063a457c2d714610167578063a9059cbb1461017a578063dd62ed3e1461018d57600080fd5b806306fdde03146100ae578063095ea7b3146100cc57806318160ddd146100ef57806323b872dd14610101578063313ce56714610114575b600080fd5b6100b66101a0565b6040516100c3919061069a565b60405180910390f35b6100df6100da36600461070b565b610232565b60405190151581526020016100c3565b6002545b6040519081526020016100c3565b6100df61010f366004610735565b61024a565b604051601281526020016100c3565b6100df61013136600461070b565b61026e565b6100f3610144366004610771565b6001600160a01b031660009081526020819052604090205490565b6100b6610290565b6100df61017536600461070b565b61029f565b6100df61018836600461070b565b61031f565b6100f361019b366004610793565b61032d565b6060600380546101af906107c6565b80601f01602080910402602001604051908101604052809291908181526020018280546101db906107c6565b80156102285780601f106101fd57610100808354040283529160200191610228565b820191906000526020600020905b81548152906001019060200180831161020b57829003601f168201915b5050505050905090565b600033610240818585610358565b5060019392505050565b60003361025885828561047c565b6102638585856104f6565b506001949350505050565b600033610240818585610281838361032d565b61028b9190610800565b610358565b6060600480546101af906107c6565b600033816102ad828661032d565b9050838110156103125760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b60648201526084015b60405180910390fd5b6102638286868403610358565b6000336102408185856104f6565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b6001600160a01b0383166103ba5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610309565b6001600160a01b03821661041b5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610309565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6000610488848461032d565b905060001981146104f057818110156104e35760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610309565b6104f08484848403610358565b50505050565b6001600160a01b03831661055a5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610309565b6001600160a01b0382166105bc5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610309565b6001600160a01b038316600090815260208190526040902054818110156106345760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610309565b6001600160a01b03848116600081815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a36104f0565b600060208083528351808285015260005b818110156106c7578581018301518582016040015282016106ab565b818111156106d9576000604083870101525b50601f01601f1916929092016040019392505050565b80356001600160a01b038116811461070657600080fd5b919050565b6000806040838503121561071e57600080fd5b610727836106ef565b946020939093013593505050565b60008060006060848603121561074a57600080fd5b610753846106ef565b9250610761602085016106ef565b9150604084013590509250925092565b60006020828403121561078357600080fd5b61078c826106ef565b9392505050565b600080604083850312156107a657600080fd5b6107af836106ef565b91506107bd602084016106ef565b90509250929050565b600181811c908216806107da57607f821691505b6020821081036107fa57634e487b7160e01b600052602260045260246000fd5b50919050565b6000821982111561082157634e487b7160e01b600052601160045260246000fd5b50019056fea2646970667358221220e7dc257596a973556752e9db5f465b21aad78d068ae819d0395e1f99a95065a964736f6c634300080d0033\",\n \"linkReferences\": {},\n \"deployedLinkReferences\": {}\n}\n","import {\n type GetBalancesResponse,\n type GetBalancesParams,\n type Storage,\n TokenType,\n type NetworkContractToken,\n type ERC20Token,\n} from '@avalabs/vm-module-types';\nimport { getErc20Balances } from './evm-balance-service/get-erc20-balances';\nimport { TokenService } from '@internal/utils';\nimport { getProvider } from '../../utils/get-provider';\nimport { getTokens } from '../get-tokens/get-tokens';\nimport { getNativeTokenBalances } from './evm-balance-service/get-native-token-balances';\nimport { getNativeTokenBalances as getNativeTokenBalancesFromGlacier } from './glacier-balance-service/get-native-token-balances';\nimport { getErc20Balances as getErc20BalancesFromGlacier } from './glacier-balance-service/get-erc20-balances';\nimport type { EvmGlacierService } from '../../services/glacier-service/glacier-service';\n\nexport const getBalances = async ({\n addresses,\n currency,\n network,\n proxyApiUrl,\n customTokens = [],\n storage,\n glacierService,\n}: GetBalancesParams & {\n proxyApiUrl: string;\n glacierService: EvmGlacierService;\n storage?: Storage;\n}): Promise<GetBalancesResponse> => {\n const chainId = network.chainId;\n const isNetworkSupported = await glacierService.isNetworkSupported(network.chainId);\n const isHealthy = glacierService.isHealthy();\n\n let balances = [];\n if (isHealthy && isNetworkSupported) {\n balances = await Promise.allSettled(\n addresses.map(async (address) => {\n const nativeToken = await getNativeTokenBalancesFromGlacier({\n address,\n currency,\n chainId,\n glacierService,\n coingeckoId: network.pricingProviders?.coingecko.nativeTokenId ?? '',\n });\n\n const erc20Tokens = await getErc20BalancesFromGlacier({\n customTokens: customTokens.filter(isERC20Token),\n glacierService,\n currency,\n chainId,\n address,\n });\n\n return {\n address,\n balances: {\n [nativeToken.symbol]: nativeToken,\n ...erc20Tokens,\n },\n };\n }),\n );\n } else {\n const tokenService = new TokenService({ storage, proxyApiUrl });\n const tokens = await getTokens({ chainId: Number(chainId), proxyApiUrl });\n const allTokens = [...tokens, ...customTokens];\n const provider = getProvider({\n chainId,\n chainName: network.chainName,\n rpcUrl: network.rpcUrl,\n multiContractAddress: network.utilityAddresses?.multicall,\n });\n\n balances = await Promise.allSettled(\n addresses.map(async (address) => {\n const nativeToken = await getNativeTokenBalances({\n network,\n tokenService,\n address,\n currency,\n provider,\n });\n\n const erc20Tokens = await getErc20Balances({\n provider,\n network,\n tokenService,\n address,\n currency,\n tokens: allTokens.filter(isERC20Token),\n });\n\n return {\n address,\n balances: {\n [nativeToken.symbol]: nativeToken,\n ...erc20Tokens,\n },\n };\n }),\n );\n }\n\n const filterBalances = balances.reduce((acc, result) => {\n if (result.status === 'rejected') {\n return acc;\n }\n\n return {\n ...acc,\n [result.value.address]: result.value.balances,\n };\n }, {} as GetBalancesResponse);\n\n return filterBalances;\n};\n\nfunction isERC20Token(token: NetworkContractToken): token is ERC20Token {\n return token.type === TokenType.ERC20;\n}\n","import { numberToBN, bnToBig, balanceToDisplayValue } from '@avalabs/utils-sdk';\nimport { TokenType, type ERC20Token, type Network, type TokenWithBalance } from '@avalabs/vm-module-types';\nimport { ethers, type Provider } from 'ethers';\nimport ERC20 from '@openzeppelin/contracts/build/contracts/ERC20.json';\nimport type { TokenService } from '@internal/utils';\nimport { VsCurrencyType } from '@avalabs/coingecko-sdk';\nimport BN from 'bn.js';\n\nexport const getErc20Balances = async ({\n provider,\n tokenService,\n address: userAddress,\n currency,\n tokens,\n network,\n}: {\n provider: Provider;\n tokenService: TokenService;\n address: string;\n currency: string;\n tokens: ERC20Token[];\n network: Network;\n}): Promise<Record<string, TokenWithBalance>> => {\n const coingeckoPlatformId = network.pricingProviders?.coingecko.assetPlatformId;\n const coingeckoTokenId = network.pricingProviders?.coingecko.nativeTokenId;\n const tokenAddresses = tokens.map((token) => token.address);\n\n const tokensBalances = await Promise.allSettled(\n tokens.map(async (token) => {\n const contract = new ethers.Contract(token.address, ERC20.abi, provider);\n const balanceBig = await contract.balanceOf?.(userAddress);\n const balance = new BN(balanceBig) || numberToBN(0, token.decimals);\n\n const tokenWithBalance = {\n ...token,\n balance,\n };\n\n return tokenWithBalance;\n }),\n ).then((res) => {\n return res.reduce<(ERC20Token & { balance: BN })[]>((acc, result) => {\n return result.status === 'fulfilled' && !result.value.balance.isZero() ? [...acc, result.value] : acc;\n }, []);\n });\n\n if (!tokensBalances.length) return {};\n\n const simplePriceResponse =\n (coingeckoPlatformId &&\n (await tokenService.getPricesByAddresses(tokenAddresses, coingeckoPlatformId, currency as VsCurrencyType))) ||\n {};\n\n return tokensBalances.reduce(\n (acc, token) => {\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 balanceInCurrency = priceInCurrency\n ? bnToBig(token.balance, token.decimals).mul(priceInCurrency).toNumber()\n : undefined;\n const balanceDisplayValue = balanceToDisplayValue(token.balance, token.decimals);\n const balanceCurrencyDisplayValue = balanceInCurrency ? balanceInCurrency.toFixed(2) : '';\n\n return {\n ...acc,\n [token.address.toLowerCase()]: {\n ...token,\n type: TokenType.ERC20,\n balance: token.balance,\n balanceDisplayValue,\n balanceInCurrency,\n balanceCurrencyDisplayValue,\n priceInCurrency,\n marketCap,\n change24,\n vol24,\n },\n };\n },\n {} as Record<string, TokenWithBalance>,\n );\n};\n","import {\n VsCurrencyType,\n getBasicCoingeckoHttp,\n simplePrice,\n simpleTokenPrice,\n type SimplePriceParams,\n} from '@avalabs/coingecko-sdk';\nimport type { Storage, RawSimplePriceResponse, SimplePriceResponse } from '@avalabs/vm-module-types';\nimport { coingeckoRetry } from '../../utils/coingecko-retry';\nimport { arrayHash } from '../../utils/array-hash';\nimport { coingeckoProxyClient } from './coingecko-proxy-client';\n\nconst coingeckoBasicClient = getBasicCoingeckoHttp();\n\nexport class TokenService {\n #storage?: Storage;\n #proxyApiUrl: string;\n\n constructor({ storage, proxyApiUrl }: { proxyApiUrl: string; storage?: Storage }) {\n this.#storage = storage;\n this.#proxyApiUrl = proxyApiUrl;\n }\n\n /**\n * Get token price with market data first on coingecko (free tier) directly,\n * if we get 429 error, retry it on coingecko proxy (paid service)\n * @returns token price with market data\n */\n async getSimplePrice({\n coinIds = [],\n currencies = [VsCurrencyType.USD],\n }: SimplePriceParams): Promise<SimplePriceResponse | undefined> {\n let data: SimplePriceResponse | undefined;\n\n const key = coinIds ? `${arrayHash(coinIds)}-${currencies.toString()}` : `${currencies.toString()}`;\n\n const cacheId = `getSimplePrice-${key}`;\n\n data = this.#storage?.get?.<SimplePriceResponse>(cacheId);\n\n if (data) return data;\n\n try {\n data = await coingeckoRetry((useCoingeckoProxy) =>\n this.simplePrice({\n coinIds,\n currencies,\n marketCap: true,\n vol24: true,\n change24: true,\n useCoingeckoProxy,\n }),\n );\n } catch {\n data = undefined;\n }\n this.#storage?.set?.(cacheId, data);\n return data;\n }\n\n /**\n * Get token price with market data for a list of addresses\n * @param tokenAddresses the token addresses\n * @param assetPlatformId The platform id for all the tokens in the list\n * @param currency the currency to be used\n * @returns a list of token price with market data\n */\n async getPricesByAddresses(\n tokenAddresses: string[],\n assetPlatformId: string,\n currency: VsCurrencyType = VsCurrencyType.USD,\n ): Promise<SimplePriceResponse | undefined> {\n let data: SimplePriceResponse | undefined;\n\n const key = `${arrayHash(tokenAddresses)}-${assetPlatformId}-${currency}`;\n\n const cacheId = `getPricesWithMarketDataByAddresses-${key}`;\n data = this.#storage?.get?.<SimplePriceResponse>(cacheId);\n\n if (data) return data;\n\n try {\n data = await coingeckoRetry((useCoingeckoProxy) =>\n this.fetchPricesByAddresses({\n assetPlatformId,\n tokenAddresses,\n currency,\n useCoingeckoProxy,\n }),\n );\n } catch {\n data = undefined;\n }\n this.#storage?.set?.(cacheId, data);\n return data;\n }\n\n private async fetchPricesByAddresses({\n assetPlatformId,\n tokenAddresses,\n currency = VsCurrencyType.USD,\n useCoingeckoProxy = false,\n }: {\n assetPlatformId: string;\n tokenAddresses: string[];\n currency: VsCurrencyType;\n useCoingeckoProxy?: boolean;\n }): Promise<SimplePriceResponse> {\n if (useCoingeckoProxy) {\n return coingeckoProxyClient(this.#proxyApiUrl).simplePriceByContractAddresses(undefined, {\n params: {\n id: assetPlatformId,\n },\n queries: {\n contract_addresses: tokenAddresses,\n vs_currencies: [currency],\n include_market_cap: true,\n include_24hr_vol: true,\n include_24hr_change: true,\n },\n });\n }\n\n return simpleTokenPrice(coingeckoBasicClient, {\n assetPlatformId,\n tokenAddresses,\n currencies: [currency],\n marketCap: true,\n vol24: true,\n change24: true,\n });\n }\n\n private async simplePrice({\n coinIds = [],\n currencies = [VsCurrencyType.USD],\n marketCap = false,\n vol24 = false,\n change24 = false,\n lastUpdated = false,\n useCoingeckoProxy = false,\n shouldThrow = true,\n }: SimplePriceParams & { useCoingeckoProxy?: boolean }): Promise<SimplePriceResponse> {\n if (useCoingeckoProxy) {\n const rawData = await coingeckoProxyClient(this.#proxyApiUrl).simplePrice(undefined, {\n queries: {\n ids: coinIds?.join(','),\n vs_currencies: currencies.join(','),\n include_market_cap: String(marketCap),\n include_24hr_vol: String(vol24),\n include_24hr_change: String(change24),\n include_last_updated_at: String(lastUpdated),\n },\n });\n return this.transformSimplePriceResponse(rawData);\n }\n return simplePrice(coingeckoBasicClient, {\n coinIds,\n currencies,\n marketCap,\n vol24,\n change24,\n lastUpdated,\n shouldThrow,\n });\n }\n\n private transformSimplePriceResponse = (\n data: RawSimplePriceResponse,\n currencies = [VsCurrencyType.USD],\n ): SimplePriceResponse => {\n const formattedData: SimplePriceResponse = {};\n Object.keys(data).forEach((id) => {\n const tokenData = data[id];\n formattedData[id] = {};\n currencies.forEach((currency: VsCurrencyType) => {\n formattedData[id] = {\n [currency]: {\n price: tokenData?.[currency],\n change24: tokenData?.[`${currency}_24h_change`],\n vol24: tokenData?.[`${currency}_24h_vol`],\n marketCap: tokenData?.[`${currency}_market_cap`],\n },\n };\n });\n });\n return formattedData;\n };\n}\n","const DEFAULT_MAX_RETRIES = 10;\n\ntype RetryParams<T> = {\n operation: (retryIndex: number) => Promise<T>;\n isSuccess: (result: T) => boolean;\n maxRetries?: number;\n backoffPolicy?: RetryBackoffPolicyInterface;\n};\n/*\n * Retries an operation with defined backoff policy.\n *\n * @param operation - The operation to retry.\n * @param isSuccess - The predicate to check if the operation succeeded.\n * @param maxRetries - The maximum number of retries.\n * @param backoffPolicy - Function to generate delay time based on current retry count.\n *\n * @returns The result of the operation.\n * @throws An error if the operation fails after the maximum number of retries.\n *\n * @example\n * const result = await retry(\n * async () => {\n * const response = await fetch('https://example.com')\n * return response.json()\n * },\n * result => result.status === 200\n * )\n */\nexport const retry = async <T>({\n operation,\n isSuccess,\n maxRetries = DEFAULT_MAX_RETRIES,\n backoffPolicy = RetryBackoffPolicy.exponential(),\n}: RetryParams<T>): Promise<T> => {\n let backoffPeriodMillis = 0;\n let retries = 0;\n let lastError: unknown;\n\n while (retries < maxRetries) {\n if (retries > 0) {\n await delay(backoffPeriodMillis);\n }\n\n try {\n const result = await operation(retries);\n\n if (isSuccess(result)) {\n return result;\n }\n } catch (err) {\n // when the operation throws an error, we still retry\n lastError = err;\n }\n\n backoffPeriodMillis = backoffPolicy(retries);\n retries++;\n }\n\n const errorMessage = lastError ? `Max retry exceeded. ${lastError}` : 'Max retry exceeded.';\n\n throw new Error(errorMessage);\n};\n\ntype RetryBackoffPolicyInterface = (retryIndex: number) => number;\n\nexport class RetryBackoffPolicy {\n static exponential(): RetryBackoffPolicyInterface {\n return (retryIndex: number): number => {\n return Math.pow(2, retryIndex) * 1000;\n };\n }\n\n static constant(secondsToDelay: number): RetryBackoffPolicyInterface {\n return (_: number): number => {\n return secondsToDelay * 1000;\n };\n }\n\n static constantMs(msToDelay: number): RetryBackoffPolicyInterface {\n return (_: number): number => {\n return msToDelay;\n };\n }\n}\n\nfunction delay(ms: number) {\n return new Promise((r) => setTimeout(r, ms));\n}\n","import { RetryBackoffPolicy, retry } from './retry';\n\ntype Error = {\n status: {\n error_code: number;\n error_message: string;\n };\n};\n\nexport const coingeckoRetry = <T>(\n operation: (useCoingeckoProxy: boolean) => Promise<T | Error>,\n): Promise<T | undefined> => {\n return retry({\n operation: (retryIndex: number) => operation(retryIndex > 0),\n maxRetries: 2,\n backoffPolicy: RetryBackoffPolicy.constant(1),\n isSuccess: (response: T | Error) => {\n const errorStatus = (response as Error)?.status;\n return errorStatus?.error_code !== 429;\n },\n }) as Promise<T | undefined>;\n};\n","export function charsum(s: string): number {\n let i,\n sum = 0;\n for (i = 0; i < s.length; i++) {\n sum += s.charCodeAt(i) * (i + 1);\n }\n return sum;\n}\n","import { charsum } from './charsum';\n\n// from https://stackoverflow.com/a/25105589\nexport function arrayHash(array: string[]): string {\n let i,\n sum = 0;\n for (i = 0; i < array.length; i++) {\n const cs = charsum(array[i] ?? '');\n sum = sum + 65027 / cs;\n }\n return ('' + sum).slice(0, 16);\n}\n","import { Zodios } from '@zodios/core';\nimport { RawSimplePriceResponseSchema, SimplePriceResponseSchema } from '@avalabs/vm-module-types';\nimport { boolean, string } from 'zod';\n\nexport const coingeckoProxyClient = (proxyApiUrl: string) =>\n new Zodios(\n `${proxyApiUrl}/proxy/coingecko`,\n [\n {\n method: 'post',\n path: '/simple/price',\n parameters: [\n { name: 'ids', type: 'Query', schema: string() },\n { name: 'vs_currencies', type: 'Query', schema: string() },\n {\n name: 'include_market_cap',\n type: 'Query',\n schema: string().optional(),\n },\n {\n name: 'include_24hr_vol',\n type: 'Query',\n schema: string().optional(),\n },\n {\n name: 'include_24hr_change',\n type: 'Query',\n schema: string().optional(),\n },\n {\n name: 'include_last_updated_at',\n type: 'Query',\n schema: string().optional(),\n },\n ],\n alias: 'simplePrice',\n response: RawSimplePriceResponseSchema,\n },\n {\n method: 'post',\n path: '/simple/token_price/:id',\n parameters: [\n { name: 'id', type: 'Path', schema: string() },\n { name: 'contract_addresses', type: 'Query', schema: string().array() },\n { name: 'vs_currencies', type: 'Query', schema: string().array() },\n {\n name: 'include_market_cap',\n type: 'Query',\n schema: boolean().optional(),\n },\n {\n name: 'include_24hr_vol',\n type: 'Query',\n schema: boolean().optional(),\n },\n {\n name: 'include_24hr_change',\n type: 'Query',\n schema: boolean().optional(),\n },\n ],\n alias: 'simplePriceByContractAddresses',\n response: SimplePriceResponseSchema,\n },\n ],\n {\n axiosConfig: {\n headers: {\n 'Content-Type': 'application/json',\n },\n },\n },\n );\n","import { balanceToDisplayValue, bigToBN, bigintToBig, bnToBig } from '@avalabs/utils-sdk';\nimport { TokenType, type Network, type NetworkTokenWithBalance } from '@avalabs/vm-module-types';\nimport type { VsCurrencyType } from '@avalabs/coingecko-sdk';\nimport { TokenService } from '@internal/utils';\nimport type { Provider } from 'ethers';\n\nexport const getNativeTokenBalances = async ({\n provider,\n tokenService,\n address,\n currency,\n network,\n}: {\n provider: Provider;\n tokenService: TokenService;\n address: string;\n currency: string;\n network: Network;\n}): Promise<NetworkTokenWithBalance> => {\n const coingeckoTokenId = network.pricingProviders?.coingecko.nativeTokenId;\n const networkToken = network.networkToken;\n const simplePriceResponse = coingeckoTokenId\n ? await tokenService.getSimplePrice({\n coinIds: [coingeckoTokenId],\n currencies: [currency] 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 balanceBigint = await provider.getBalance(address);\n const balaceBig = bigintToBig(balanceBigint, networkToken.decimals);\n const balance = bigToBN(balaceBig, networkToken.decimals);\n const balanceDisplayValue = balanceToDisplayValue(balance, networkToken.decimals);\n const balanceInCurrency = priceInCurrency\n ? bnToBig(balance, networkToken.decimals).mul(priceInCurrency).toNumber()\n : undefined;\n const balanceCurrencyDisplayValue = balanceInCurrency ? balanceInCurrency.toFixed(2) : '';\n\n return {\n ...networkToken,\n coingeckoId: coingeckoTokenId ?? '',\n type: TokenType.NATIVE,\n balance,\n balanceDisplayValue,\n balanceInCurrency,\n balanceCurrencyDisplayValue,\n priceInCurrency,\n marketCap,\n vol24,\n change24,\n };\n};\n","import type { CurrencyCode } from '@avalabs/glacier-sdk';\nimport { TokenType, type NetworkTokenWithBalance } from '@avalabs/vm-module-types';\nimport { balanceToDisplayValue, bnToBig } from '@avalabs/utils-sdk';\nimport { BN } from 'bn.js';\nimport type { EvmGlacierService } from '../../../services/glacier-service/glacier-service';\n\nexport const getNativeTokenBalances = async ({\n address,\n currency,\n chainId,\n glacierService,\n coingeckoId,\n}: {\n chainId: number;\n address: string;\n currency: string;\n coingeckoId: string;\n glacierService: EvmGlacierService;\n}): Promise<NetworkTokenWithBalance> => {\n const nativeBalance = await glacierService.getNativeBalance({\n chainId: chainId.toString(),\n address,\n currency: currency.toLocaleLowerCase() as CurrencyCode,\n });\n const nativeTokenBalance = nativeBalance.nativeTokenBalance;\n const balance = new BN(nativeTokenBalance.balance);\n const balanceDisplayValue = balanceToDisplayValue(balance, nativeTokenBalance.decimals);\n const priceInCurrency = nativeTokenBalance.price?.value;\n const balanceInCurrency = priceInCurrency\n ? bnToBig(balance, nativeTokenBalance.decimals).mul(priceInCurrency).toNumber()\n : undefined;\n const balanceCurrencyDisplayValue = balanceInCurrency ? balanceInCurrency.toFixed(2) : '';\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,\n balanceDisplayValue,\n balanceInCurrency,\n balanceCurrencyDisplayValue,\n priceInCurrency,\n coingeckoId,\n };\n};\n","import { balanceToDisplayValue, bnToBig } from '@avalabs/utils-sdk';\nimport {\n TokenType,\n type TokenWithBalanceERC20,\n type TokenWithBalance,\n type ERC20Token,\n} from '@avalabs/vm-module-types';\nimport { CurrencyCode, Erc20TokenBalance } from '@avalabs/glacier-sdk';\nimport BN from 'bn.js';\nimport type { EvmGlacierService } from '../../../services/glacier-service/glacier-service';\nimport { DEFAULT_DECIMALS } from '../../../constants';\n\nexport const getErc20Balances = async ({\n glacierService,\n currency,\n chainId,\n address,\n customTokens,\n}: {\n glacierService: EvmGlacierService;\n address: string;\n currency: string;\n chainId: number;\n customTokens: ERC20Token[];\n}): Promise<Record<string, TokenWithBalance>> => {\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;\n do {\n const response = await glacierService.listErc20Balances({\n chainId: chainId.toString(),\n address,\n currency: currency.toLocaleLowerCase() as CurrencyCode,\n // glacier has a cap on page size of 100\n pageSize: 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, TokenWithBalance>,\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: new BN(0),\n balanceInCurrency: 0,\n balanceDisplayValue: '0',\n balanceCurrencyDisplayValue: '0',\n priceInCurrency: 0,\n marketCap: 0,\n change24: 0,\n vol24: 0,\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 BN(token.balance);\n const balanceDisplayValue = balanceToDisplayValue(balance, token.decimals);\n const balanceCurrencyDisplayValue = token.balanceValue?.value.toString() ?? '';\n const priceInCurrency = token.price?.value;\n const balanceInCurrency = priceInCurrency\n ? bnToBig(balance, token.decimals).mul(priceInCurrency).toNumber()\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,\n balanceCurrencyDisplayValue,\n balanceDisplayValue,\n balanceInCurrency,\n priceInCurrency,\n type: TokenType.ERC20,\n };\n });\n};\n","import { Environment } from '@avalabs/vm-module-types';\n\ntype Env = {\n glacierApiUrl: string;\n proxyApiUrl: string;\n};\n\nexport const prodEnv: Env = {\n glacierApiUrl: 'https://glacier-api.avax.network',\n proxyApiUrl: 'https://proxy-api.avax.network',\n};\n\nexport const devEnv: Env = {\n glacierApiUrl: 'https://glacier-api-dev.avax.network',\n proxyApiUrl: 'https://proxy-api-dev.avax.network',\n};\n\nexport const getEnv = (environment: Environment): Env => {\n switch (environment) {\n case Environment.PRODUCTION:\n return prodEnv;\n case Environment.DEV:\n return devEnv;\n }\n};\n","import {\n CurrencyCode,\n Erc1155Token,\n Erc721Token,\n type GetNativeBalanceResponse,\n Glacier,\n type ListErc1155BalancesResponse,\n type ListErc20BalancesResponse,\n type ListErc721BalancesResponse,\n} from '@avalabs/glacier-sdk';\n\nclass GlacierUnhealthyError extends Error {\n override message = 'Glacier is unhealthy. Try again later.';\n}\n\nexport class EvmGlacierService {\n glacierSdk: Glacier;\n isGlacierHealthy = true;\n supportedChainIds: string[] = [];\n\n constructor({ glacierApiUrl }: { glacierApiUrl: string }) {\n this.glacierSdk = new Glacier({ BASE: glacierApiUrl });\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 this.supportedChainIds = supportedChains.chains.map((chain) => chain.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 }: {\n chainId: string;\n address: string;\n currency: CurrencyCode;\n }): Promise<GetNativeBalanceResponse> {\n try {\n return this.glacierSdk.evmBalances.getNativeBalance({\n chainId,\n address,\n currency: currency.toLocaleLowerCase() as CurrencyCode,\n });\n } catch (error) {\n if (error instanceof GlacierUnhealthyError) {\n this.setGlacierToUnhealthy();\n }\n throw error;\n }\n }\n\n async listErc721Balances({\n chainId,\n address,\n pageSize,\n pageToken,\n }: {\n chainId: string;\n address: string;\n pageSize: number;\n pageToken?: string;\n }): Promise<ListErc721BalancesResponse> {\n try {\n return this.glacierSdk.evmBalances.listErc721Balances({\n chainId,\n address,\n pageSize,\n pageToken,\n });\n } catch (error) {\n if (error instanceof GlacierUnhealthyError) {\n this.setGlacierToUnhealthy();\n }\n throw error;\n }\n }\n\n async listErc1155Balances({\n chainId,\n address,\n pageSize,\n pageToken,\n }: {\n chainId: string;\n address: string;\n pageSize: number;\n pageToken?: string;\n }): Promise<ListErc1155BalancesResponse> {\n try {\n return this.glacierSdk.evmBalances.listErc1155Balances({\n chainId,\n address,\n pageSize,\n pageToken,\n });\n } catch (error) {\n if (error instanceof GlacierUnhealthyError) {\n this.setGlacierToUnhealthy();\n }\n throw error;\n }\n }\n\n async listErc20Balances({\n chainId,\n address,\n currency,\n pageSize,\n pageToken,\n }: {\n chainId: string;\n address: string;\n currency: CurrencyCode;\n pageSize: number;\n pageToken?: string;\n }): Promise<ListErc20BalancesResponse> {\n try {\n return this.glacierSdk.evmBalances.listErc20Balances({\n chainId,\n address,\n currency: currency.toLocaleLowerCase() as CurrencyCode,\n pageSize,\n pageToken,\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.listTransactions({\n chainId,\n address,\n pageToken,\n pageSize,\n });\n } catch (error) {\n if (error instanceof GlacierUnhealthyError) {\n this.setGlacierToUnhealthy();\n }\n throw error;\n }\n }\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';\n\nexport const ethSign = async ({\n request,\n network,\n approvalController,\n proxyApiUrl,\n}: {\n request: RpcRequest;\n network: Network;\n approvalController: ApprovalController;\n proxyApiUrl: string;\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('Params are invalid'),\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 disclaimer: 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.',\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 chainId: network.chainId,\n data: data,\n };\n\n messageDetails = data;\n\n disclaimer =\n \"Signing this message can be dangerous. This signature could potentially perform any operation on your account's behalf, including granting complete control of your account and all of its assets to the requesting site. Only sign this message if you know what you're doing or completely trust the requesting site\";\n } else if (method === RpcMethod.PERSONAL_SIGN) {\n signingData = {\n type: method,\n account: address,\n chainId: network.chainId,\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 chainId: network.chainId,\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 chainId: network.chainId,\n data: data,\n };\n\n const { types, primaryType, ...messageToDisplay } = data;\n messageDetails = beautifyComplexMessage(messageToDisplay);\n }\n\n if (!signingData) {\n return {\n success: false,\n error: rpcErrors.internal('Unable to generate signing data'),\n };\n }\n\n const {\n alert: prioritizedAlert,\n balanceChange,\n tokenApprovals,\n } = await processJsonRpcSimulation({\n request,\n proxyApiUrl,\n accountAddress: address,\n chainId: network.chainId,\n data: { method, params: request.params },\n dAppUrl: request.dappInfo.url,\n });\n\n const displayData: DisplayData = {\n title: 'Sign Message',\n dAppInfo: {\n name: request.dappInfo.name,\n action: `${request.dappInfo.name} requests you to sign the following message`,\n logoUri: request.dappInfo.icon,\n },\n network: {\n chainId: network.chainId,\n name: network.chainName,\n logoUri: network.logoUri,\n },\n account: address,\n messageDetails,\n disclaimer,\n alert: prioritizedAlert ?? alert,\n balanceChange,\n 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 return { result: response.result };\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"]}
|