UNPKG

@lifi/widget

Version:

LI.FI Widget for cross-chain bridging and swapping. It will drive your multi-chain strategy and attract new users from everywhere.

294 lines (293 loc) 9.88 kB
import type { BaseToken, ChainType, ContractCall, ExtendedChain, Order, RouteExtended, RouteOptions, SDKConfig, StaticToken, Token } from '@lifi/sdk'; import type { WalletMenuOpenArgs } from '@lifi/wallet-management'; import type { Components, PaletteMode, PaletteOptions, Shape, SxProps, Theme } from '@mui/material'; import type { TypographyVariantsOptions } from '@mui/material/styles'; import type { CSSProperties, FC, ReactNode, RefObject } from 'react'; import type { CoinbaseWalletParameters, MetaMaskParameters, WalletConnectParameters } from 'wagmi/connectors'; import type { LanguageKey, LanguageResources } from '../providers/I18nProvider/types.js'; import type { DefaultFieldValues } from '../stores/form/types.js'; export type WidgetVariant = 'compact' | 'wide' | 'drawer'; export type WidgetSubvariant = 'default' | 'split' | 'custom' | 'refuel'; export type SplitSubvariant = 'bridge' | 'swap'; export type CustomSubvariant = 'checkout' | 'deposit'; export type WideSubvariant = { enableChainSidebar?: boolean; }; export interface SubvariantOptions { split?: SplitSubvariant; custom?: CustomSubvariant; wide?: WideSubvariant; } export type Appearance = PaletteMode | 'system'; export interface NavigationProps { /** * If given, uses a negative margin to counteract the padding on sides for navigation elements like icon buttons. * @default true */ edge?: boolean; } export type WidgetThemeComponents = Partial<Pick<Components<Theme>, 'MuiAppBar' | 'MuiAvatar' | 'MuiButton' | 'MuiCard' | 'MuiIconButton' | 'MuiInputCard' | 'MuiTabs'>>; export type WidgetTheme = { /** * @deprecated Use `colorScheme` instead. */ palette?: PaletteOptions; colorSchemes?: { light?: { palette: PaletteOptions; }; dark?: { palette: PaletteOptions; }; }; shape?: Partial<Shape>; typography?: TypographyVariantsOptions; components?: WidgetThemeComponents; container?: CSSProperties; routesContainer?: CSSProperties; chainSidebarContainer?: CSSProperties; header?: CSSProperties; navigation?: NavigationProps; }; export declare enum DisabledUI { FromAmount = "fromAmount", FromToken = "fromToken", ToAddress = "toAddress", ToToken = "toToken" } export type DisabledUIType = `${DisabledUI}`; export declare enum HiddenUI { Appearance = "appearance", DrawerCloseButton = "drawerCloseButton", History = "history", Language = "language", PoweredBy = "poweredBy", ToAddress = "toAddress", ToToken = "toToken", WalletMenu = "walletMenu", IntegratorStepDetails = "integratorStepDetails", ReverseTokensButton = "reverseTokensButton", RouteTokenDescription = "routeTokenDescription", ChainSelect = "chainSelect", BridgesSettings = "bridgesSettings", AddressBookConnectedWallets = "addressBookConnectedWallets", LowAddressActivityConfirmation = "lowAddressActivityConfirmation" } export type HiddenUIType = `${HiddenUI}`; export declare enum RequiredUI { ToAddress = "toAddress", AccountDeployedMessage = "accountDeployedMessage" } export type RequiredUIType = `${RequiredUI}`; export type DefaultUI = { transactionDetailsExpanded?: boolean; navigationHeaderTitleNoWrap?: boolean; }; export interface WidgetWalletConfig { onConnect?(args?: WalletMenuOpenArgs): void; walletConnect?: WalletConnectParameters; coinbase?: CoinbaseWalletParameters; metaMask?: MetaMaskParameters; /** * Determines whether the widget should provide partial wallet management functionality. * * In partial mode, external wallet management will be used for "opt-out" providers, * while the internal management is applied for any remaining providers that do not opt out. * This allows a flexible balance between the integrator's custom wallet menu and the widget's native wallet menu. * @default false */ usePartialWalletManagement?: boolean; } export interface WidgetSDKConfig extends Omit<SDKConfig, 'apiKey' | 'disableVersionCheck' | 'integrator' | 'routeOptions' | 'widgetVersion'> { routeOptions?: Omit<RouteOptions, 'bridges' | 'exchanges'>; } export interface WidgetContractTool { name: string; logoURI: string; } export interface CalculateFeeParams { fromChain: ExtendedChain; toChain: ExtendedChain; fromToken: Token; toToken: Token; fromAddress?: string; toAddress?: string; fromAmount?: bigint; toAmount?: bigint; slippage?: number; } export interface WidgetFeeConfig { name?: string; logoURI?: string; fee?: number; /** * Whether to show the fee percentage in the fee details. * @default false */ showFeePercentage?: boolean; /** * Whether to show a tooltip with the fee details. Requires `name` or `feeTooltipComponent` to be set. * @default false */ showFeeTooltip?: boolean; /** * Custom tooltip component to show with the fee details. */ feeTooltipComponent?: ReactNode; /** * Function to calculate fees before fetching quotes. * If provided, this function will be used instead of the `fee` parameter. * Only one of `fee` or `calculateFee` should be used. * * @param params Object containing the fee calculation parameters * @returns A promise that resolves to the calculated fee as a number (e.g., 0.03 represents a 3% fee) */ calculateFee?(params: CalculateFeeParams): Promise<number | undefined>; /** * @internal */ _vcComponent?: FC<{ route: RouteExtended; }>; } export interface ToAddress { name?: string; address: string; chainType: ChainType; logoURI?: string; } export interface AllowDeny<T> { allow?: T[]; deny?: T[]; } export type AllowDenySetItem = string | number; export interface AllowDenySet { allow?: Set<AllowDenySetItem>; deny?: Set<AllowDenySetItem>; } export type AllowDenySets = { from?: AllowDenySet; to?: AllowDenySet; } & AllowDenySet; export type AllowDenyItems<T> = { from?: AllowDeny<T>; to?: AllowDeny<T>; } & AllowDeny<T>; export type WidgetChains = { types?: AllowDeny<ChainType>; } & AllowDenyItems<number>; export type WidgetTokens = { featured?: StaticToken[]; include?: Token[]; popular?: StaticToken[]; } & AllowDenyItems<BaseToken>; export type WidgetLanguages = { default?: LanguageKey; } & AllowDeny<LanguageKey>; export type PoweredByType = 'default' | 'jumper'; export interface RouteLabel { text: string; sx?: SxProps<Theme>; } export interface RouteLabelRule { label: RouteLabel; bridges?: AllowDeny<string>; exchanges?: AllowDeny<string>; fromChainId?: number[]; toChainId?: number[]; fromTokenAddress?: string[]; toTokenAddress?: string[]; } export type ExplorerUrl = string | { url: string; txPath?: string; addressPath?: string; }; export interface WidgetConfig { fromChain?: number; toChain?: number; fromToken?: string; toToken?: string; toAddress?: ToAddress; toAddresses?: ToAddress[]; fromAmount?: number | string; minFromAmountUSD?: number; toAmount?: number | string; formUpdateKey?: string; contractCalls?: ContractCall[]; contractComponent?: ReactNode; contractSecondaryComponent?: ReactNode; contractCompactComponent?: ReactNode; contractTool?: WidgetContractTool; integrator: string; apiKey?: string; fee?: number; feeConfig?: WidgetFeeConfig; referrer?: string; routePriority?: Order; slippage?: number; variant?: WidgetVariant; subvariant?: WidgetSubvariant; subvariantOptions?: SubvariantOptions; appearance?: Appearance; theme?: WidgetTheme; disabledUI?: DisabledUIType[]; hiddenUI?: HiddenUIType[]; requiredUI?: RequiredUIType[]; defaultUI?: DefaultUI; useRecommendedRoute?: boolean; useRelayerRoutes?: boolean; walletConfig?: WidgetWalletConfig; sdkConfig?: WidgetSDKConfig; buildUrl?: boolean; keyPrefix?: string; bridges?: AllowDeny<string>; exchanges?: AllowDeny<string>; chains?: WidgetChains; tokens?: WidgetTokens; languages?: WidgetLanguages; languageResources?: LanguageResources; explorerUrls?: Record<number, ExplorerUrl[]> & Partial<Record<'internal', ExplorerUrl[]>>; poweredBy?: PoweredByType; /** * Custom labels/badges to show on routes based on specified rules */ routeLabels?: RouteLabelRule[]; } export interface FormFieldOptions { setUrlSearchParam: boolean; } export interface FieldValues extends Omit<DefaultFieldValues, 'fromAmount' | 'toAmount' | 'toAddress'> { fromAmount?: number | string; toAmount?: number | string; toAddress?: ToAddress | string; } export type FieldNames = keyof FieldValues; export type SetFieldValueFunction = <K extends FieldNames>(key: K, value: FieldValues[K], options?: FormFieldOptions) => void; export type FormState = { setFieldValue: SetFieldValueFunction; }; export type FormRef = RefObject<FormState | null>; export interface FormRefProps { formRef?: FormRef; } export interface WidgetConfigProps extends FormRefProps { config: WidgetConfig; } export interface WidgetConfigPartialProps { config?: Partial<WidgetConfig>; } export type WidgetProps = WidgetDrawerProps & WidgetConfig & WidgetConfigPartialProps & FormRefProps; export interface WidgetDrawerProps extends WidgetConfigPartialProps { elementRef?: RefObject<HTMLDivElement>; open?: boolean; /** * Make sure to make the onClose callback stable (e.g. using useCallback) to avoid causing re-renders of the entire widget */ onClose?(): void; } export declare enum ExpansionType { Routes = "routes", FromChain = "fromChain", ToChain = "toChain" }