@funkit/connect
Version:
Funkit Connect SDK elevates DeFi apps via web2 sign-ins and one-click checkouts.
183 lines (182 loc) • 8.8 kB
TypeScript
/**
* Lighter-specific withdrawal helpers, hooks, and display components.
*
* Extracted from WithdrawalContent.tsx to keep Lighter-specific logic isolated.
*/
import type { LighterAccountIndex } from '@funkit/api-base';
import React from 'react';
import type { Address } from 'viem';
import type { CustomWithdrawalConfig, LighterRouteType, WalletWithdrawalConfig } from '../../providers/FunkitCheckoutContext';
import type { LighterShare } from '../../utils/customer';
import type { SourceTokenOption } from './WithdrawAmountInput';
/** Stable method ids for the Fast / Secure options (used for tracking + switching). */
export declare const LIGHTER_FAST_METHOD_ID = "lighter-fast";
export declare const LIGHTER_SECURE_METHOD_ID = "lighter-secure";
/**
* USDC exists twice on a Lighter account: as perps collateral
* (`total_asset_value`, withdrawn via route 0) and as a spot asset balance
* (asset entry 3, withdrawn via route 1). The Secure dropdown keys selection
* by `symbol`, so the spot variant gets a pseudo-symbol to stay selectable
* alongside the plain `USDC` (perps) entry.
*/
export declare const LIGHTER_USDC_SPOT_SYMBOL = "USDC (Spot)";
/** Lighter L2 route types (`RouteType` in the withdraw/transfer tx payload). */
export declare const LIGHTER_ROUTE_TYPE: {
readonly PERPS: 0;
readonly SPOT: 1;
};
/**
* Strips the ` (Spot)` / ` (Perps)` variant suffix off a Lighter source-token
* selection, returning the real token symbol (e.g. `USDC (Spot)` → `USDC`).
* Symbol-keyed lookups (icons, prices, asset indices, min amounts) operate on
* the base symbol; only selection identity and route resolution keep the suffix.
*/
export declare function getLighterBaseSymbol(symbol: string): string;
/**
* Resolves the Lighter L2 route type for a Secure source-token selection.
* Plain `USDC` withdraws perps collateral (route 0); everything else —
* including the `USDC (Spot)` pseudo-symbol — is a spot asset (route 1).
*/
export declare function resolveLighterSecureRouteType(selectedSourceToken: string): LighterRouteType;
/**
* Mainnet ERC-20 address for a Lighter Secure source token symbol, or undefined
* if the symbol isn't a known Secure asset.
*/
export declare function getLighterSecureMainnetAddress(symbol: string): Address | undefined;
/**
* Upper bound on a single Lighter Fast withdrawal, in USD. Amounts above this
* block the CTA and surface the "submit a Secure withdrawal" footer. Fast is
* USDC Perps only (price = 1), so this is also the token-unit cap.
* {@link LIGHTER_FAST_MAX_WITHDRAWAL_LABEL} must stay in sync with this value.
*/
export declare const LIGHTER_FAST_MAX_WITHDRAWAL_USD = 3000000;
/**
* Footer shown beneath the CTA when a Lighter Fast amount exceeds the $3M cap.
* Renders as the `description` of a FunNotification, which supplies the shared
* notification typography; offers an inline link to switch to the Secure method.
*/
export declare function LighterFastMaxExceededMessage({ onSwitchToSecure, }: {
onSwitchToSecure: () => void;
}): React.JSX.Element;
/** Free (withdrawable) balance for a single Lighter asset: balance - locked. */
export declare function freeBalance(balance: string, lockedBalance: string): string;
/**
* Lighter Fast charges an "unstaked" fee — a flat deduction taken off the
* withdrawal amount before quoting — for users who aren't sufficiently staked
* in Lighter's staking pool. Sufficiently-staked users pay nothing.
*
* "Sufficiently staked" = the user holds a share in the staking pool with a
* principal above the threshold. The staking pool is identified by its index,
* hardcoded here (previously read from `systemConfig.staking_pool_index`) since
* it's currently the only public pool a withdrawing user holds a share in.
* Non-stakers report `shares: []`.
*/
export declare const LIGHTER_STAKING_POOL_INDEX = 281474976624800;
export declare const LIGHTER_UNSTAKED_FEE_TOKENS = 3;
export declare const LIGHTER_STAKING_PRINCIPAL_THRESHOLD = 100;
/**
* Resolves the Lighter Fast unstaked fee (in source tokens, i.e. USDC) for a
* user. Returns 0 when the user's staking-pool principal exceeds the threshold,
* otherwise {@link LIGHTER_UNSTAKED_FEE_TOKENS}. A non-staker (`shares: []`,
* or no staking-pool share) pays the fee.
*/
export declare function resolveLighterUnstakedFeeTokens(shares: LighterShare[]): number;
/**
* Deducts the Lighter Fast unstaked fee from a withdrawal input amount, clamped
* at 0. Uses `dnum` fixed-point math so the subtraction stays exact (e.g. the
* input is a decimal string straight from the amount field).
*/
export declare function deductLighterUnstakedFee(inputAmount: string, feeTokens: number): string;
/**
* Fetches all asset balances for a Lighter account. Returns:
*
* - `balances` — `Record<SYMBOL, freeBalance>` (uppercased symbol keys)
* - `assets` — raw asset list from the API (for building source-token options)
*/
export declare function useLighterWithdrawalBalances({ accountIndex, }: {
accountIndex: LighterAccountIndex | undefined;
}): {
balances: Record<string, string>;
assets: import("../../utils/customer").LighterAsset[];
shares: LighterShare[];
isLoading: boolean;
};
type FunkitWithdrawalConfig = WalletWithdrawalConfig | CustomWithdrawalConfig;
/**
* Resolves the Lighter `asset_id` for a selected source token symbol. Returns
* `undefined` when the token isn't in the fetched assets list (e.g. timing
* race before balances load, or an invalid selection) — callers should treat
* that as "not ready to submit" rather than falling back to `0`, which would
* silently target the wrong Lighter asset.
*/
export declare function resolveLighterAssetIndex(lighterAssets: {
symbol: string;
asset_id: number;
}[], selectedSourceToken: string): number | undefined;
/**
* Builds the source-token options list for the Lighter compound input dropdown.
*
* - Fast path: only USDC (Perps).
* - Secure path: USDC (Perps) (from total_asset_value) + USDC (Spot) when the
* account carries a spot USDC asset + every non-USDC asset on the account.
*
* Unified Trading accounts (`isUnifiedTradingMode`) have a single USDC balance
* — no spot/perps split — so the perps entry is labeled plain `USDC` and the
* `USDC (Spot)` entry is hidden on both paths.
*/
export declare function buildLighterSourceTokenOptions(config: FunkitWithdrawalConfig, lighterAssets: {
symbol: string;
}[], isUnifiedTradingMode?: boolean): SourceTokenOption[];
/**
* Detects Lighter Secure withdrawal (mainnet source chain), auto-fills the
* recipient address with the connected wallet, and fetches the Lighter account
* so per-asset balances are available to the withdrawal form.
*/
export declare function useLighterWithdrawal(config: FunkitWithdrawalConfig, setRecipientAddress: (addr: string) => void): {
isLighterSecure: boolean;
isLighterFast: boolean;
isUnifiedTradingMode: boolean;
connectedAddress: `0x${string}` | undefined;
lighterBalances: Record<string, string>;
lighterAssets: import("../../utils/customer").LighterAsset[];
lighterFastUnstakedFee: number;
invalidateLighterAccount: () => void;
};
/**
* Resolves the source-token dropdown options for a Lighter customer.
* Returns `undefined` for non-Lighter customers (no dropdown needed).
*/
export declare function useLighterSourceTokenOptions(config: FunkitWithdrawalConfig, apiKey: string, lighterAssets: {
symbol: string;
}[], isUnifiedTradingMode?: boolean): SourceTokenOption[] | undefined;
/**
* Lighter Secure: recipient address, locked to the connected wallet. A
* read-only `FunInput` (not a `<div>`) keeps it focusable and announced by
* screen readers; the hover tooltip explains the lock.
*/
export declare function LighterSecureAddressDisplay({ address }: {
address: string;
}): React.JSX.Element;
/**
* Lighter Secure: display-only receive token + chain. Both are locked — the
* token always matches the source asset, and the destination chain is always
* Ethereum mainnet. Each field surfaces a hover tooltip explaining the lock.
*/
export declare function LighterSecureReceiveDisplay({ sourceTokenSymbol: rawSourceTokenSymbol, }: {
sourceTokenSymbol: string;
}): React.JSX.Element;
/**
* Lighter Secure: receive amount value (1:1 — same token, no swap).
*/
export declare function LighterSecureReceiveAmountValue({ amount, tokenSymbol: rawTokenSymbol, }: {
amount: string;
tokenSymbol: string;
}): React.JSX.Element;
export declare function LighterSecureWithdrawalSuccess({ onClose, onNewWithdrawal, amount, tokenSymbol: rawTokenSymbol, txHash, }: {
onClose: () => void;
onNewWithdrawal: () => void;
amount: string;
tokenSymbol: string;
txHash: string;
}): React.JSX.Element;
export {};