import { StarknetAddress, toAddress } from '@fatsolutions/privacy-pools-core-starknet-sdk'; import { Chain, mainnet, sepolia, // devnet, } from '@starknet-react/chains'; import { parseEther } from 'viem/utils'; import { getEnv } from '~/config/env'; // import daiIcon from '~/assets/icons/dai.svg'; import ethereumIcon from '~/assets/icons/ethereum.svg'; import starknetIcon from '~/assets/icons/starknet.svg'; import usdcIcon from '~/assets/icons/usdc.svg'; const { ALCHEMY_KEY, IS_TESTNET, ASP_ENDPOINT, RPC_URL, RELAYER_URL } = getEnv(); // Add chains to the whitelist to be used in the app const mainnetChains: readonly [Chain, ...Chain[]] = [mainnet]; const testnetChains: readonly [Chain, ...Chain[]] = [ sepolia, // devnet, ]; export const whitelistedChains = IS_TESTNET ? testnetChains : mainnetChains; export type ChainAssets = 'ETH' | 'USDS' | 'sUSDS' | 'DAI' | 'USDC' | 'USDT' | 'wstETH' | 'wBTC' | 'STRK'; export interface PoolInfo { chainId: string; address: StarknetAddress; entryPointAddress: StarknetAddress; assetAddress: StarknetAddress; asset: ChainAssets; assetDecimals?: number; icon?: string; maxDeposit: bigint; scope: StarknetAddress; isStableAsset?: boolean; // Includes stablecoins and yield-bearing stablecoins deploymentBlock: bigint; } export interface CompletePoolInfo extends PoolInfo {} export interface ChainData { [chainId: string]: { name: string; symbol: string; decimals: number; image: string; explorerUrl: string; sdkRpcUrl: string; rpcUrl: string; aspUrl: string; relayers: { name: string; url: string; }[]; poolInfo: PoolInfo[]; }; } const mainnetChainData: ChainData = { // Mainnets [mainnet.id.toString()]: { name: mainnet.name, symbol: mainnet.nativeCurrency.symbol, decimals: mainnet.nativeCurrency.decimals, image: starknetIcon.src, explorerUrl: mainnet.explorers.voyager.at(0)!, relayers: [{ name: 'Fast Relay', url: RELAYER_URL }], sdkRpcUrl: `/api/hypersync-rpc?chainId=1`, // Secure Hypersync proxy (relative URL) rpcUrl: `${RPC_URL}${ALCHEMY_KEY}` as const, aspUrl: ASP_ENDPOINT, poolInfo: [ { chainId: mainnet.id.toString(), asset: 'STRK' as const, assetAddress: toAddress('0x04718f5a0Fc34cC1AF16A1cdee98fFB20C31f5cD61D6Ab07201858f4287c938D'), assetDecimals: 18, address: toAddress('0x2f35b62fff4fbf6188c758e5e1f92d98193ea179d42142746101660168a1d13'), scope: toAddress(0x5fd162992faa7fb668cea2a0ef93e759af118755f74560622ba436d39d1704an), entryPointAddress: toAddress('0x13a0314dd07c6639921bd0e7eb8c865b28b3c7a413238baf804de3464d428dd'), maxDeposit: parseEther('100000000'), deploymentBlock: 5487678n, icon: starknetIcon.src, }, { chainId: mainnet.id.toString(), asset: 'ETH' as const, assetAddress: toAddress('0x049d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7'), assetDecimals: 18, address: toAddress('0x1575a7d243bf929bea1eead2a33dfb25dad16df1af7a34f61caea22e4ec57fb'), scope: toAddress(0x631320a254ef817c906b00a00b386df59235e97d8fbb9d64eb499d5364a06e8n), entryPointAddress: toAddress('0x13a0314dd07c6639921bd0e7eb8c865b28b3c7a413238baf804de3464d428dd'), maxDeposit: parseEther('10'), deploymentBlock: 5487709n, icon: ethereumIcon.src, }, { chainId: mainnet.id.toString(), asset: 'USDC' as const, assetAddress: toAddress('0x053C91253BC9682c04929cA02ED00b3E423f6710D2ee7e0D5EBB06F3eCF368A8'), assetDecimals: 6, isStableAsset: true, address: toAddress('0x78d8a02f3a7073dfd6c7a4ea3e15ba217a3196ecf6487b09a03800d69092879'), scope: toAddress(0x21c2e26e3487250993ba2820d942e28dd139d76078663e3e0c3c2c07c3703c6n), entryPointAddress: toAddress('0x13a0314dd07c6639921bd0e7eb8c865b28b3c7a413238baf804de3464d428dd'), maxDeposit: parseEther('1000000'), deploymentBlock: 5903944n, icon: usdcIcon.src, }, ], }, }; const testnetChainData: ChainData = { // Testnets [sepolia.id.toString()]: { name: sepolia.name, symbol: sepolia.nativeCurrency.symbol, decimals: sepolia.nativeCurrency.decimals, image: starknetIcon.src, explorerUrl: sepolia.explorers.voyager.at(0)!, sdkRpcUrl: `/api/alchemy-rpc?chainId=${sepolia.id.toString()}`, // Alchemy RPC proxy (relative URL) rpcUrl: `https://starknet-sepolia.g.alchemy.com/starknet/version/rpc/v0_10/${ALCHEMY_KEY}` as const, aspUrl: ASP_ENDPOINT, relayers: [ // { name: 'FatRelayerLocal', url: 'http://localhost:3000' }, { name: 'FatRelayer', url: 'https://starknet-relayer-latest-149184580131.us-east1.run.app' }, ], poolInfo: [ { chainId: sepolia.id.toString(), asset: 'ETH' as const, assetAddress: toAddress('0x049d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7'), assetDecimals: 18, address: toAddress('0x0109d3f24af2d03634cb310ed7de9baeca8208667338f7714bf3b70f886e2dd9'), scope: toAddress(0x4951be981d6c5ee34f0e825cad898caa01929fae272fa38ca7d1c9083c2933n), entryPointAddress: toAddress('0x6fe3b0c2d8b16dcb3aa50d97d63b6a149be8c96cdd0b451497be3d0a95b50e'), maxDeposit: parseEther('10'), deploymentBlock: 2296635n, icon: ethereumIcon.src, }, { chainId: sepolia.id.toString(), asset: 'STRK' as const, assetAddress: toAddress('0x4718F5A0FC34CC1AF16A1CDEE98FFB20C31F5CD61D6AB07201858F4287C938D'), assetDecimals: 18, address: toAddress('0x0616357ecf95c7b138c463691cb2ba74adf4dcc578598bd5e2f5b8a47b534f7e'), scope: toAddress(0x07829257cf9951cf5fa8b2cb8693e2762d7bcd9ec22f7bc40c4cfb1ef47102cdn), entryPointAddress: toAddress('0x6fe3b0c2d8b16dcb3aa50d97d63b6a149be8c96cdd0b451497be3d0a95b50e'), maxDeposit: parseEther('10'), deploymentBlock: 2299735n, icon: starknetIcon.src, }, ], }, // [devnet.id.toString()]: { // name: devnet.name, // symbol: devnet.nativeCurrency.symbol, // decimals: devnet.nativeCurrency.decimals, // image: starknetIcon.src, // explorerUrl: '', // sdkRpcUrl: `/api/hypersync-rpc?chainId=${devnet.id.toString()}`, // Secure Hypersync proxy (relative URL) // rpcUrl: `http://localhost:5050/rpc` as const, // aspUrl: ASP_ENDPOINT, // relayers: [{ name: 'FatRelay', url: 'http://localhost:3000' }], // poolInfo: [ // // { // // chainId: devnet.id.toString(), // // asset: 'ETH' as const, // // assetAddress: toAddress('0x049d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7'), // // assetDecimals: 18, // // address: toAddress('0x5f31bfa4bda4cac510ce3235b58f5595b6097e59f2bd554ff3bc19d779a90f'), // // scope: toAddress(0x5448b936fbc76a4d45a638d23b884cf31f2b1bede31e9fce22952c2424fc70n), // // entryPointAddress: toAddress('0x248be73ad9087517e4624c29ce4ac84a76c8b4791205baa6856970e32ef6794'), // // maxDeposit: parseEther('10'), // // deploymentBlock: 1446670n, // // }, // { // chainId: devnet.id.toString(), // asset: 'ETH' as const, // assetAddress: toAddress('0x049d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7'), // assetDecimals: 18, // address: toAddress('0x75d2f9b6a5e1b41ec2e2081e42c7fe068eeda8d47e7d47ecbd990cf3ed563f1'), // entryPointAddress: toAddress('0x3156ed949fdae4bd7e0a73d2b7d1b48bfe8ae6ebacb158ef549c150bef5be38'), // scope: toAddress('0x4951be981d6c5ee34f0e825cad898caa01929fae272fa38ca7d1c9083c2933'), // maxDeposit: parseEther('10'), // }, // { // chainId: devnet.id.toString(), // asset: 'STRK' as const, // assetAddress: toAddress('0x4718F5A0FC34CC1AF16A1CDEE98FFB20C31F5CD61D6AB07201858F4287C938D'), // assetDecimals: 18, // address: toAddress('0x3d6b9f9b173859502afb4c6194d93af7e669bf9f3cbcf0aadf2e93cd17d6729'), // entryPointAddress: toAddress('0x3156ed949fdae4bd7e0a73d2b7d1b48bfe8ae6ebacb158ef549c150bef5be38'), // scope: toAddress(''), // maxDeposit: parseEther('10'), // }, // ], // }, }; export const chainData = IS_TESTNET ? testnetChainData : mainnetChainData;