import type { AssetInfo } from "@ledgerhq/coin-module-framework/api/types"; import { getCryptoAssetsStore } from "@ledgerhq/cryptoassets/state"; import { BridgeApi } from "@ledgerhq/ledger-wallet-framework/api/types"; import type { CryptoCurrency, TokenCurrency } from "@ledgerhq/types-cryptoassets"; export async function getTokenFromAsset( currency: CryptoCurrency, asset: AssetInfo, ): Promise { if (asset.type === "native" || !("assetReference" in asset) || !asset.assetReference) { return undefined; } return getCryptoAssetsStore().findTokenByAddressInCurrency(asset.assetReference, currency.id); } export function getAssetFromToken(token: TokenCurrency, owner: string): AssetInfo { return { type: token.tokenType, assetReference: token.contractAddress, assetOwner: owner, name: token.name, unit: token.units[0], }; } export function computeIntentType(transaction: Record): string { const mode = transaction.mode as string | undefined; switch (mode) { case "send": case undefined: return "send"; case "stake": return "stake.createAccount"; case "delegate": return "stake.delegate"; case "undelegate": return "stake.undelegate"; case "unstake": return "stake.withdraw"; default: throw new Error(`Unsupported Solana transaction mode: ${mode}`); } } export default function solanaBridge(currency: CryptoCurrency): BridgeApi { return { getTokenFromAsset: async (asset: AssetInfo) => getTokenFromAsset(currency, asset), getAssetFromToken: (token: TokenCurrency, owner: string) => getAssetFromToken(token, owner), computeIntentType: (transaction: Record) => computeIntentType(transaction), }; }