diff --git a/src/components/crosschain/IntentForm.tsx b/src/components/crosschain/IntentForm.tsx index a9ac782..d0c4a04 100644 --- a/src/components/crosschain/IntentForm.tsx +++ b/src/components/crosschain/IntentForm.tsx @@ -11,7 +11,10 @@ import { DEFAULT_TESTNET_CHAIN_ID_STR, isSupportedTestnetEvmChain, } from "../../constants/chains"; -import { getMidenFaucetDecimals } from "../../constants/miden-tokens"; +import { + getMidenFaucetDecimals, + isPragmaSupportedMidenAsset, +} from "../../constants/miden-tokens"; import { EPOCH_TESTNET_TOKENS } from "../../constants/evm-tokens"; import { midenscanNoteUrl } from "../../lib/explorers"; import { @@ -62,13 +65,18 @@ export function IntentForm({ const { address } = useAccount(); const walletChainId = useChainId(); + const supportedMidenAssets = midenAssets.filter((asset) => + isPragmaSupportedMidenAsset(asset, network), + ); + const unsupportedAssetCount = + midenAssets.length - supportedMidenAssets.length; const [selectedAssetId, setSelectedAssetId] = useState(""); - const selectedAssetIdIsAvailable = midenAssets.some( + const selectedAssetIdIsAvailable = supportedMidenAssets.some( (asset) => asset.assetId === selectedAssetId, ); const resolvedSelectedAssetId = selectedAssetIdIsAvailable ? selectedAssetId - : (midenAssets[0]?.assetId ?? ""); + : (supportedMidenAssets[0]?.assetId ?? ""); // Follows the connected wallet until the user overrides a field. Not // useState defaults: the wallet connects after this mounts. @@ -106,13 +114,12 @@ export function IntentForm({ destination.evmAddress.trim(), ); - const selectedAsset = midenAssets.find( + const selectedAsset = supportedMidenAssets.find( (a) => a.assetId.toLowerCase() === resolvedSelectedAssetId.toLowerCase(), ); // Use the hardcoded faucet→decimals map only for display formatting. Do not // fall back to the wallet adapter's reported decimals (often defaults to 8 - // and silently mis-scales). Unknown faucets remain selectable and display - // their quoted amount in raw units. + // and silently mis-scales). const midenFaucetDecimals = resolvedSelectedAssetId ? getMidenFaucetDecimals(resolvedSelectedAssetId, network) : undefined; @@ -231,10 +238,11 @@ export function IntentForm({
{ setSelectedAssetId(assetId); onClearQuote(); diff --git a/src/components/crosschain/intent/IntentSourceAssetField.tsx b/src/components/crosschain/intent/IntentSourceAssetField.tsx index efa92ec..6eb28c0 100644 --- a/src/components/crosschain/intent/IntentSourceAssetField.tsx +++ b/src/components/crosschain/intent/IntentSourceAssetField.tsx @@ -13,6 +13,7 @@ interface Props { selectedAssetId: string; selectedAsset?: MidenAssetOption; isLoadingAssets: boolean; + unsupportedAssetCount: number; onSelect: (assetId: string) => void; } @@ -21,6 +22,7 @@ export function IntentSourceAssetField({ selectedAssetId, selectedAsset, isLoadingAssets, + unsupportedAssetCount, onSelect, }: Props) { return ( @@ -46,9 +48,23 @@ export function IntentSourceAssetField({ {selectedAsset?.amount?.toString() ?? "—"}

- {!isLoadingAssets && assets.length === 0 && ( + {!isLoadingAssets && + assets.length === 0 && + unsupportedAssetCount === 0 && ( +

+ No Miden assets found in this wallet. Fund it before bridging. +

+ )} + {!isLoadingAssets && assets.length === 0 && unsupportedAssetCount > 0 && (

- No Miden assets found in this wallet. Fund it before bridging. + No Pragma-priced assets found. This bridge supports USDC, USDT, DAI, + WETH, and WBTC. +

+ )} + {!isLoadingAssets && assets.length > 0 && unsupportedAssetCount > 0 && ( +

+ {unsupportedAssetCount} unsupported wallet + {unsupportedAssetCount === 1 ? " asset is" : " assets are"} hidden.

)}
diff --git a/src/constants/miden-tokens.ts b/src/constants/miden-tokens.ts index bbd4238..b1426fe 100644 --- a/src/constants/miden-tokens.ts +++ b/src/constants/miden-tokens.ts @@ -1,6 +1,14 @@ import { normalizeMidenIdToHex } from "../services/epoch-bridge"; import type { MidenNetwork } from "../config/miden"; +const PRAGMA_SUPPORTED_MIDEN_SYMBOLS = new Set([ + "USDC", + "USDT", + "DAI", + "WETH", + "WBTC", +]); + /** * Hardcoded Miden testnet faucet → decimals map. * @@ -41,3 +49,16 @@ export function getMidenFaucetDecimals( return undefined; } } + +/** Returns whether the solver has a Pragma price feed for this wallet asset. */ +export function isPragmaSupportedMidenAsset( + asset: { assetId: string; symbol?: string }, + network: MidenNetwork, +): boolean { + const symbol = asset.symbol?.trim().toUpperCase(); + if (symbol && PRAGMA_SUPPORTED_MIDEN_SYMBOLS.has(symbol)) return true; + + // Metadata can arrive after the wallet asset list. Keep known testnet faucets + // available while their symbol is still loading. + return getMidenFaucetDecimals(asset.assetId, network) !== undefined; +}