aegis-swap-widget 0.1.2 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (46) hide show
  1. package/CHANGELOG.md +82 -0
  2. package/LICENSE +21 -0
  3. package/README.md +101 -24
  4. package/dist/abis.d.ts +18 -1
  5. package/dist/address.d.ts +5 -0
  6. package/dist/aegis-swap-widget.js +2423 -1014
  7. package/dist/color.d.ts +2 -0
  8. package/dist/components/icons.d.ts +23 -0
  9. package/dist/config.d.ts +3 -2
  10. package/dist/encoding.d.ts +5 -1
  11. package/dist/errors.d.ts +2 -0
  12. package/dist/format.d.ts +3 -3
  13. package/dist/hooks/useResolvedTheme.d.ts +3 -0
  14. package/dist/hooks/useScrollAnchor.d.ts +12 -0
  15. package/dist/hooks/useStableValue.d.ts +2 -0
  16. package/dist/hooks/useSubmitSwap.d.ts +66 -0
  17. package/dist/hooks/useSwapQuote.d.ts +30 -0
  18. package/dist/hooks/useTokenAllowance.d.ts +24 -0
  19. package/dist/hooks/useTokenBalances.d.ts +15 -0
  20. package/dist/hooks/useTokenIconMetadata.d.ts +7 -0
  21. package/dist/hooks/useWalletConnection.d.ts +18 -0
  22. package/dist/index.d.ts +6 -42
  23. package/dist/metadata.d.ts +0 -1
  24. package/dist/permit.d.ts +24 -1
  25. package/dist/polling.d.ts +2 -0
  26. package/dist/quote.d.ts +30 -2
  27. package/dist/styles.css +1 -1
  28. package/dist/transactionProgress.d.ts +18 -0
  29. package/dist/wallet.d.ts +19 -8
  30. package/dist/widget/AegisDirectSwapWidget.d.ts +4 -0
  31. package/dist/widget/AmountField.d.ts +17 -0
  32. package/dist/widget/ExecutionDetails.d.ts +29 -0
  33. package/dist/widget/NetworkSelector.d.ts +3 -0
  34. package/dist/widget/PoolSelector.d.ts +13 -0
  35. package/dist/widget/types.d.ts +66 -0
  36. package/dist/widget/viewState.d.ts +54 -0
  37. package/package.json +40 -8
  38. package/dist/abis.d.ts.map +0 -1
  39. package/dist/config.d.ts.map +0 -1
  40. package/dist/encoding.d.ts.map +0 -1
  41. package/dist/format.d.ts.map +0 -1
  42. package/dist/index.d.ts.map +0 -1
  43. package/dist/metadata.d.ts.map +0 -1
  44. package/dist/permit.d.ts.map +0 -1
  45. package/dist/quote.d.ts.map +0 -1
  46. package/dist/wallet.d.ts.map +0 -1
@@ -0,0 +1,2 @@
1
+ export declare function relativeLuminance(color: string): number | null;
2
+ export declare function pickReadableTextColor(background: string): string | null;
@@ -0,0 +1,23 @@
1
+ import type { AegisSwapMarket, AegisSwapToken } from '../config';
2
+ import { type AegisSwapGlobalTokenMetadata } from '../metadata';
3
+ export type TokenMetadataByAddress = Record<string, AegisSwapGlobalTokenMetadata>;
4
+ export declare const TokenIconMark: import("react").NamedExoticComponent<{
5
+ token: AegisSwapToken;
6
+ metadataByAddress: TokenMetadataByAddress;
7
+ className: string;
8
+ }>;
9
+ export declare const PoolPairIcon: import("react").NamedExoticComponent<{
10
+ market: AegisSwapMarket;
11
+ metadataByAddress: TokenMetadataByAddress;
12
+ className: string;
13
+ }>;
14
+ export declare function AegisLogoMark(): import("react").JSX.Element;
15
+ export declare function EthereumDiamondMark({ className }: {
16
+ className: string;
17
+ }): import("react").JSX.Element;
18
+ export declare function SwapDirectionIcon(): import("react").JSX.Element;
19
+ export declare function ExternalLinkIcon(): import("react").JSX.Element;
20
+ export declare function CopyIcon(): import("react").JSX.Element;
21
+ export declare function CheckIcon(): import("react").JSX.Element;
22
+ export declare function ChevronDownIcon(): import("react").JSX.Element;
23
+ export declare function SlidersIcon(): import("react").JSX.Element;
package/dist/config.d.ts CHANGED
@@ -58,11 +58,13 @@ export type AegisSwapChainConfig = {
58
58
  explorerTxUrl?: (hash: Hex) => string;
59
59
  poolExplorerUrl?: (poolId: Hex, market: AegisSwapMarket) => string;
60
60
  metadataEndpoint?: string | null;
61
+ fee?: AegisSwapFeeConfig;
61
62
  };
62
- export type AegisSwapChainConfigInput = Partial<Omit<AegisSwapChainConfig, 'chainId' | 'v4Contracts'>> & {
63
+ export type AegisSwapChainConfigInput = Partial<Omit<AegisSwapChainConfig, 'chainId' | 'v4Contracts' | 'fee'>> & {
63
64
  chainId?: number;
64
65
  v4Contracts?: AegisSwapUniswapV4ContractsInput;
65
66
  };
67
+ export declare function getExplorerUrl(hash: Hex, chain: AegisSwapChainConfig): string;
66
68
  export type AegisSwapPoolConfig = {
67
69
  id: string;
68
70
  symbol?: AegisSwapTokenSymbol;
@@ -100,4 +102,3 @@ export declare function createAegisSwapChainConfig(input: AegisSwapChainConfigIn
100
102
  export declare function createAegisSwapChains(chains?: Partial<Record<number, AegisSwapChainConfigInput>>): Record<number, AegisSwapChainConfig>;
101
103
  export declare function createAegisSwapPoolMarket(input: AegisSwapPoolConfig, chains?: Record<number, AegisSwapChainConfig>): AegisSwapMarket;
102
104
  export declare function createAegisSwapMarketsFromPools(pools: AegisSwapPoolConfig[] | undefined, chains?: Record<number, AegisSwapChainConfig>): Record<string, AegisSwapMarket>;
103
- //# sourceMappingURL=config.d.ts.map
@@ -22,6 +22,9 @@ export type SignedPermitBatch = {
22
22
  signature: Hex;
23
23
  };
24
24
  export type SwapOutputFee = {
25
+ recipient: Address;
26
+ bips: number;
27
+ } | {
25
28
  recipient: Address;
26
29
  amount: bigint;
27
30
  };
@@ -29,6 +32,8 @@ export type BuiltSwapTransaction = {
29
32
  calldata: Hex;
30
33
  value: bigint;
31
34
  };
35
+ export declare const MAX_UINT128: bigint;
36
+ export declare function assertUint128(value: bigint, label?: string): void;
32
37
  export declare function computePoolId(poolKey: AegisPoolKey): Hex;
33
38
  export declare function buildExactInSwapTransaction(args: {
34
39
  poolKey: AegisPoolKey;
@@ -50,4 +55,3 @@ export declare function buildExactOutSwapTransaction(args: {
50
55
  permit?: SignedPermitBatch | null;
51
56
  fee?: SwapOutputFee | null;
52
57
  }): BuiltSwapTransaction;
53
- //# sourceMappingURL=encoding.d.ts.map
@@ -0,0 +1,2 @@
1
+ export declare function isUserRejectedError(error: unknown): boolean;
2
+ export declare function errorMessage(error: unknown, fallbackMessage: string): string;
package/dist/format.d.ts CHANGED
@@ -2,7 +2,7 @@ export declare function sanitizeDecimalInput(value: string): string;
2
2
  export declare function sanitizeSlippagePercent(value: string): string;
3
3
  export declare function parseTokenAmount(value: string, decimals: number): bigint | null;
4
4
  export declare function parseSlippageBps(value: string): number | null;
5
- export declare function formatTokenAmount(raw: bigint | null | undefined, decimals: number, maxDecimals?: number): string;
5
+ export declare function formatTokenSignificant(raw: bigint | null | undefined, decimals: number, significantFigures?: number): string;
6
+ export declare function formatTokenBalance(raw: bigint | null | undefined, decimals: number, significantFigures?: number): string;
7
+ export declare function formatTokenDisplayInput(raw: bigint | null | undefined, decimals: number): string;
6
8
  export declare function formatTokenInput(raw: bigint | null | undefined, decimals: number): string;
7
- export declare function truncateAddress(value: string, head?: number, tail?: number): string;
8
- //# sourceMappingURL=format.d.ts.map
@@ -0,0 +1,3 @@
1
+ export type AegisSwapWidgetTheme = 'dark' | 'light' | 'auto';
2
+ export type ResolvedThemeMode = 'dark' | 'light';
3
+ export declare function useResolvedTheme(theme?: AegisSwapWidgetTheme): ResolvedThemeMode;
@@ -0,0 +1,12 @@
1
+ import { type MutableRefObject } from 'react';
2
+ export type ScrollAnchorTarget = Window | HTMLElement;
3
+ /**
4
+ * Keeps a toggle button visually pinned when the content it expands/collapses
5
+ * changes the layout above or below it. Call `captureAnchor()` in the toggle's
6
+ * click handler (before the state update); the layout effect compensates the
7
+ * nearest scrollable ancestor by the toggle's positional delta.
8
+ */
9
+ export declare function useScrollAnchoredToggle(open: boolean): {
10
+ toggleRef: MutableRefObject<HTMLButtonElement | null>;
11
+ captureAnchor: () => void;
12
+ };
@@ -0,0 +1,2 @@
1
+ export declare function stableEquals(a: unknown, b: unknown): boolean;
2
+ export declare function useStableValue<T>(value: T): T;
@@ -0,0 +1,66 @@
1
+ import { type Address, type Hex, type PublicClient } from 'viem';
2
+ import { type AegisSwapChainConfig, type AegisSwapFeeConfig, type AegisSwapMarket, type AegisSwapToken } from '../config';
3
+ import { type DirectSwapQuote, type SwapQuoteMode } from '../quote';
4
+ import { type SubmitStatus } from '../transactionProgress';
5
+ import { type Eip1193Provider } from '../wallet';
6
+ import type { ResolvedWalletConnection } from './useWalletConnection';
7
+ export type AegisSwapApprovalMode = 'exact' | 'max';
8
+ export type AegisSwapSubmitDetails = {
9
+ mode: SwapQuoteMode;
10
+ inputSymbol: string;
11
+ outputSymbol: string;
12
+ amountIn: bigint;
13
+ amountOut: bigint;
14
+ feeAmount: bigint;
15
+ feeBps: number;
16
+ };
17
+ type ApprovalProgress = {
18
+ required: boolean;
19
+ done: boolean;
20
+ };
21
+ /**
22
+ * The money path: the approve -> permit+swap flow against the Aegis router,
23
+ * including wallet connection/chain-switch recovery, the submit-time re-quote
24
+ * reconciled against the displayed quote, and the TAKE_PORTION / fixed-amount
25
+ * fee leg selection. A confirmed approval auto-continues into the swap, so a
26
+ * single click covers approve -> permit -> swap.
27
+ */
28
+ export declare function useSubmitSwap({ publicClient, activeChain, market, inputToken, outputToken, quoteMode, activeAmount, slippageBps, feeConfig, quote, setQuote, owner, getActiveProvider, connectWallet, setWalletChainId, readAllowance, commitAllowance, approvalMode, refreshBalances, onSubmitted, onSuccess, onError }: {
29
+ publicClient: PublicClient;
30
+ activeChain: AegisSwapChainConfig;
31
+ market: AegisSwapMarket | null;
32
+ inputToken: AegisSwapToken;
33
+ outputToken: AegisSwapToken;
34
+ quoteMode: SwapQuoteMode;
35
+ activeAmount: bigint | null;
36
+ slippageBps: number | null;
37
+ feeConfig: AegisSwapFeeConfig | null;
38
+ quote: DirectSwapQuote | null;
39
+ setQuote: (quote: DirectSwapQuote | null) => void;
40
+ owner: Address | null;
41
+ getActiveProvider: () => Promise<Eip1193Provider | null>;
42
+ connectWallet: () => Promise<ResolvedWalletConnection | null>;
43
+ setWalletChainId: (chainId: number | null) => void;
44
+ readAllowance: (owner: Address, market: AegisSwapMarket) => Promise<bigint>;
45
+ commitAllowance: (owner: Address, market: AegisSwapMarket, amount: bigint) => void;
46
+ approvalMode: AegisSwapApprovalMode;
47
+ refreshBalances: (account: Address) => Promise<void>;
48
+ onSubmitted?: (hash: Hex, swap?: AegisSwapSubmitDetails) => void;
49
+ onSuccess?: (result: {
50
+ hash: Hex;
51
+ explorerUrl: string;
52
+ swap?: AegisSwapSubmitDetails;
53
+ }) => void;
54
+ onError?: (error: Error) => void;
55
+ }): {
56
+ submit: () => Promise<void>;
57
+ approveInputToken: () => Promise<void>;
58
+ /** Clears submit-flow state when the user edits the swap entry. */
59
+ reset: () => void;
60
+ status: SubmitStatus;
61
+ busy: boolean;
62
+ txHash: Hex | null;
63
+ actionError: string | null;
64
+ approvalProgress: ApprovalProgress;
65
+ };
66
+ export {};
@@ -0,0 +1,30 @@
1
+ import type { Address, PublicClient } from 'viem';
2
+ import type { AegisSwapFeeConfig, AegisSwapMarket, AegisSwapToken } from '../config';
3
+ import { type DirectSwapQuote, type SwapQuoteMode } from '../quote';
4
+ export declare function useSwapQuote({ publicClient, owner, market, inputToken, outputToken, quoteMode, activeAmount, slippageBps, feeConfig, onQuote, pausedRef }: {
5
+ publicClient: PublicClient;
6
+ owner: Address | null;
7
+ market: AegisSwapMarket | null;
8
+ inputToken: AegisSwapToken;
9
+ outputToken: AegisSwapToken;
10
+ quoteMode: SwapQuoteMode;
11
+ activeAmount: bigint | null;
12
+ slippageBps: number | null;
13
+ feeConfig: AegisSwapFeeConfig | null;
14
+ onQuote?: (quote: DirectSwapQuote) => void;
15
+ /**
16
+ * While `.current` is true, background refreshes are skipped so the
17
+ * displayed numbers cannot shift under the wallet prompt mid-submit. A ref
18
+ * (not a prop) so pausing never restarts the quote effect, which would
19
+ * clear the displayed quote.
20
+ */
21
+ pausedRef?: {
22
+ current: boolean;
23
+ };
24
+ }): {
25
+ quote: DirectSwapQuote | null;
26
+ quoteLoading: boolean;
27
+ quoteError: string | null;
28
+ setQuote: (quote: DirectSwapQuote | null) => void;
29
+ clearQuote: () => void;
30
+ };
@@ -0,0 +1,24 @@
1
+ import { type Address, type PublicClient } from 'viem';
2
+ import type { AegisSwapMarket, AegisSwapToken } from '../config';
3
+ /**
4
+ * Tracks the ERC20 -> Permit2 allowance for the current input token and quote
5
+ * spend amount plus the Permit2 -> router authorization. These are separate
6
+ * trust boundaries: a token approval may be done while the next wallet prompt
7
+ * still needs a Permit2 signature or fallback spending-cap transaction.
8
+ */
9
+ export declare function useTokenAllowance({ publicClient, owner, market, inputToken, spendAmount }: {
10
+ publicClient: PublicClient;
11
+ owner: Address | null;
12
+ market: AegisSwapMarket | null;
13
+ inputToken: AegisSwapToken;
14
+ spendAmount: bigint | undefined;
15
+ }): {
16
+ allowanceAmount: bigint | null;
17
+ allowanceError: string | null;
18
+ approvalCheckPending: boolean;
19
+ approvalRequired: boolean;
20
+ authorizationCheckPending: boolean;
21
+ authorizationRequired: boolean;
22
+ readAllowance: (owner: Address, market: AegisSwapMarket) => Promise<bigint>;
23
+ commitAllowance: (owner: Address, market: AegisSwapMarket, amount: bigint) => void;
24
+ };
@@ -0,0 +1,15 @@
1
+ import { type Address, type PublicClient } from 'viem';
2
+ import type { AegisSwapToken } from '../config';
3
+ export type BalanceState = {
4
+ input: bigint | null;
5
+ output: bigint | null;
6
+ };
7
+ export declare function useTokenBalances({ publicClient, owner, inputToken, outputToken }: {
8
+ publicClient: PublicClient;
9
+ owner: Address | null;
10
+ inputToken: AegisSwapToken;
11
+ outputToken: AegisSwapToken;
12
+ }): {
13
+ balances: BalanceState;
14
+ refreshBalances: (account: Address) => Promise<void>;
15
+ };
@@ -0,0 +1,7 @@
1
+ import type { Address } from 'viem';
2
+ import type { TokenMetadataByAddress } from '../components/icons';
3
+ export declare function useTokenIconMetadata({ endpoint, chainId, addresses }: {
4
+ endpoint: string | null | undefined;
5
+ chainId: number;
6
+ addresses: Address[];
7
+ }): TokenMetadataByAddress;
@@ -0,0 +1,18 @@
1
+ import type { Address } from 'viem';
2
+ import { type AegisSwapProviderResolver, type AegisSwapWalletConnection, type Eip1193Provider } from '../wallet';
3
+ export type ResolvedWalletConnection = {
4
+ provider: Eip1193Provider;
5
+ account: Address | null;
6
+ };
7
+ export declare function useWalletConnection({ provider, controlledAccount, getProvider, onConnectWallet }: {
8
+ provider?: Eip1193Provider | null;
9
+ controlledAccount: Address | null;
10
+ getProvider?: AegisSwapProviderResolver;
11
+ onConnectWallet?: () => AegisSwapWalletConnection | void | Promise<AegisSwapWalletConnection | void>;
12
+ }): {
13
+ owner: Address | null;
14
+ walletChainId: number | null;
15
+ setWalletChainId: (chainId: number | null) => void;
16
+ getActiveProvider: () => Promise<Eip1193Provider | null>;
17
+ connectWallet: () => Promise<ResolvedWalletConnection | null>;
18
+ };
package/dist/index.d.ts CHANGED
@@ -1,47 +1,11 @@
1
- import { type Address, type Hex } from 'viem';
2
- import { type AegisSwapChainConfigInput, type AegisSwapMarket, type AegisSwapPoolConfig } from './config';
3
- import { type Eip1193Provider } from './wallet';
4
1
  import './styles.css';
5
- type SwapDirection = 'intoTarget' | 'outOfTarget';
6
- export type AegisSwapWidgetTheme = 'dark' | 'light';
7
- export type AegisSwapProviderResolver = () => Eip1193Provider | null | Promise<Eip1193Provider | null>;
8
- export type AegisSwapWalletConnection = Eip1193Provider | {
9
- provider?: Eip1193Provider | null;
10
- account?: Address | string | null;
11
- } | null;
12
- export type AegisDirectSwapWidgetProps = {
13
- provider?: Eip1193Provider | null;
14
- account?: Address | string | null;
15
- getProvider?: AegisSwapProviderResolver;
16
- onConnectWallet?: () => AegisSwapWalletConnection | void | Promise<AegisSwapWalletConnection | void>;
17
- onSubmitted?: (hash: Hex) => void;
18
- onSuccess?: (result: {
19
- hash: Hex;
20
- explorerUrl: string;
21
- }) => void;
22
- onError?: (error: Error) => void;
23
- chainId?: number;
24
- chains?: Partial<Record<number, AegisSwapChainConfigInput>>;
25
- pools?: AegisSwapPoolConfig[];
26
- defaultPoolId?: string;
27
- targets?: string[];
28
- markets?: Record<string, AegisSwapMarket>;
29
- defaultDirection?: SwapDirection;
30
- defaultSlippagePercent?: string;
31
- rpcUrls?: string[];
32
- metadataEndpoint?: string | null;
33
- className?: string;
34
- theme?: AegisSwapWidgetTheme;
35
- accentColor?: string;
36
- accentTextColor?: string;
37
- showPoolLink?: boolean;
38
- };
39
- export declare function AegisDirectSwapWidget({ provider, account, getProvider, onConnectWallet, onSubmitted, onSuccess, onError, chainId, chains, pools, defaultPoolId, targets, markets, defaultDirection, defaultSlippagePercent, rpcUrls, metadataEndpoint, className, theme, accentColor, accentTextColor, showPoolLink }: AegisDirectSwapWidgetProps): import("react").JSX.Element;
40
- export declare const AegisSwapWidget: typeof AegisDirectSwapWidget;
41
- export default AegisDirectSwapWidget;
2
+ export { AegisDirectSwapWidget, AegisSwapWidget, default } from './widget/AegisDirectSwapWidget';
3
+ export type { AegisDirectSwapWidgetProps, AegisSwapWidgetDirection, AegisSwapWidgetProps, AegisSwapWidgetStyle } from './widget/types';
42
4
  export { AEGIS_SWAP_CHAINS, AEGIS_SWAP_CHAIN_ID, AEGIS_SWAP_DEFAULT_FEE_BPS, AEGIS_SWAP_DEFAULT_FEE_RECIPIENT, AEGIS_SWAP_DEFAULT_METADATA_ENDPOINT, AEGIS_SWAP_DEFAULT_POOL_IDS, AEGIS_SWAP_DEFAULT_RPC_URLS, AEGIS_DYNAMIC_FEE_FLAG, AEGIS_SWAP_HOOK, AEGIS_SWAP_MARKETS, AEGIS_SWAP_MAINNET_CHAIN, AEGIS_SWAP_MAINNET_UNISWAP_V4_CONTRACTS, AEGIS_SWAP_PERMIT2, AEGIS_SWAP_ROUTER, AEGIS_SWAP_TOKENS, AEGIS_SWAP_V4_QUOTER, UNISWAP_V4_CONTRACTS_BY_CHAIN, createAegisSwapChainConfig, createAegisSwapChains, createAegisSwapPoolMarket, createAegisSwapMarketsFromPools, createAegisSwapUniswapV4Contracts } from './config';
43
5
  export type { AegisPoolKey, AegisSwapBuiltInAssetSymbol, AegisSwapBuiltInMarketId, AegisSwapBuiltInTokenSymbol, AegisSwapChainConfig, AegisSwapChainConfigInput, AegisSwapMarket, AegisSwapPoolConfig, AegisSwapToken, AegisSwapTokenSymbol, AegisSwapUniswapV4Contracts, AegisSwapUniswapV4ContractsInput } from './config';
44
6
  export { fetchGlobalTokenMetadata, getIchiIconGuess } from './metadata';
45
7
  export type { AegisSwapGlobalTokenMetadata } from './metadata';
46
- export type { Eip1193Provider } from './wallet';
47
- //# sourceMappingURL=index.d.ts.map
8
+ export type { DirectSwapQuote, SwapQuoteMode } from './quote';
9
+ export type { AegisSwapWidgetTheme } from './hooks/useResolvedTheme';
10
+ export type { AegisSwapApprovalMode, AegisSwapSubmitDetails } from './hooks/useSubmitSwap';
11
+ export type { AegisSwapProviderResolver, AegisSwapWalletConnection, Eip1193Provider } from './wallet';
@@ -15,4 +15,3 @@ export declare function fetchGlobalTokenMetadata(args: {
15
15
  addresses: Address[];
16
16
  signal?: AbortSignal;
17
17
  }): Promise<Map<string, AegisSwapGlobalTokenMetadata>>;
18
- //# sourceMappingURL=metadata.d.ts.map
package/dist/permit.d.ts CHANGED
@@ -3,6 +3,9 @@ import type { Eip1193Provider } from './wallet';
3
3
  import type { SignedPermitBatch } from './encoding';
4
4
  export declare const MAX_UINT160: bigint;
5
5
  export declare const MAX_UINT256: bigint;
6
+ export declare const SWAP_TX_DEADLINE_SECONDS = 600;
7
+ export declare const DEFAULT_PERMIT_EXPIRATION_SECONDS: number;
8
+ export declare const PERMIT2_FAR_FUTURE_EXPIRATION: number;
6
9
  export declare function approveErc20ToPermit2(args: {
7
10
  provider: Eip1193Provider;
8
11
  publicClient: PublicClient;
@@ -10,7 +13,26 @@ export declare function approveErc20ToPermit2(args: {
10
13
  chain: Chain;
11
14
  token: Address;
12
15
  permit2: Address;
16
+ amount?: bigint;
13
17
  }): Promise<Hex>;
18
+ export declare function approvePermit2ToRouter(args: {
19
+ provider: Eip1193Provider;
20
+ publicClient: PublicClient;
21
+ account: Address;
22
+ chain: Chain;
23
+ token: Address;
24
+ permit2: Address;
25
+ router: Address;
26
+ amount?: bigint;
27
+ expiration?: number;
28
+ }): Promise<Hex>;
29
+ export declare function readPermit2RouterAllowance(args: {
30
+ publicClient: PublicClient;
31
+ permit2: Address;
32
+ account: Address;
33
+ token: Address;
34
+ router: Address;
35
+ }): Promise<readonly [amount: bigint, expiration: number, nonce: number]>;
14
36
  export declare function buildSignedPermitBatch(args: {
15
37
  provider: Eip1193Provider;
16
38
  publicClient: PublicClient;
@@ -21,5 +43,6 @@ export declare function buildSignedPermitBatch(args: {
21
43
  router: Address;
22
44
  token: Address;
23
45
  amount: bigint;
46
+ /** Pre-started readPermit2RouterAllowance result to overlap with other RPC work. */
47
+ allowanceRead?: ReturnType<typeof readPermit2RouterAllowance>;
24
48
  }): Promise<SignedPermitBatch | null>;
25
- //# sourceMappingURL=permit.d.ts.map
@@ -0,0 +1,2 @@
1
+ export declare function isDocumentVisible(): boolean;
2
+ export declare function pollUntil<T>(read: () => Promise<T>, done: (value: T) => boolean, attempts: number, delayMs: number): Promise<T>;
package/dist/quote.d.ts CHANGED
@@ -1,4 +1,5 @@
1
1
  import { type Address, type PublicClient } from 'viem';
2
+ import { type SwapOutputFee } from './encoding';
2
3
  import type { AegisPoolKey, AegisSwapFeeConfig, AegisSwapMarket, AegisSwapToken } from './config';
3
4
  export type SwapQuoteMode = 'exactIn' | 'exactOut';
4
5
  export type DirectSwapQuote = {
@@ -6,12 +7,25 @@ export type DirectSwapQuote = {
6
7
  poolKey: AegisPoolKey;
7
8
  zeroForOne: boolean;
8
9
  amountIn: bigint;
10
+ /** Net output the user is quoted to receive (gross minus the widget fee). */
9
11
  amountOut: bigint;
12
+ /** Pool output before the widget fee is taken. */
10
13
  grossAmountOut: bigint;
14
+ /**
15
+ * Swap-action output floor, enforced on-chain. Semantics differ by mode:
16
+ * - exactIn: gross floor sized so the user still nets `userAmountOutMinimum`
17
+ * after the fee portion is taken.
18
+ * - exactOut: equals `grossAmountOut` (output is fixed; the on-chain
19
+ * protection is `amountInMaximum`). Informational only.
20
+ */
11
21
  amountOutMinimum: bigint;
12
- userAmountOutMinimum: bigint;
22
+ /** exactOut: input ceiling enforced on-chain. exactIn: equals `amountIn`. */
13
23
  amountInMaximum: bigint;
24
+ /** Minimum the user nets after slippage and fee. Display/reconciliation value. */
25
+ userAmountOutMinimum: bigint;
26
+ /** Estimated widget fee in output currency (exact for exactOut, quote-time estimate for exactIn). */
14
27
  feeAmount: bigint;
28
+ feeBps: number;
15
29
  feeRecipient: Address | null;
16
30
  gasEstimate: bigint;
17
31
  };
@@ -28,4 +42,18 @@ export declare function fetchDirectSwapQuote(args: {
28
42
  fee?: AegisSwapFeeConfig | null;
29
43
  signal?: AbortSignal;
30
44
  }): Promise<DirectSwapQuote>;
31
- //# sourceMappingURL=quote.d.ts.map
45
+ export type ReconciledSubmitQuote = {
46
+ quote: DirectSwapQuote;
47
+ /**
48
+ * True when the fresh quote can no longer satisfy the protection the user
49
+ * saw (exactIn: output below the displayed minimum; exactOut: input above
50
+ * the displayed maximum). Callers should surface the fresh quote instead of
51
+ * submitting.
52
+ */
53
+ priceMovedBeyondTolerance: boolean;
54
+ };
55
+ export declare function sameQuote(a: DirectSwapQuote, b: DirectSwapQuote): boolean;
56
+ export declare function reconcileSubmitQuote(displayed: DirectSwapQuote | null, fresh: DirectSwapQuote): ReconciledSubmitQuote;
57
+ /** The input-side amount a swap may spend: the bound for allowances and permits. */
58
+ export declare function quoteSpendAmount(quote: DirectSwapQuote): bigint;
59
+ export declare function outputFeeForQuote(quote: DirectSwapQuote): SwapOutputFee | null;
package/dist/styles.css CHANGED
@@ -1 +1 @@
1
- .aegis-swap-widget{--aegis-swap-bg: #0d1112;--aegis-swap-panel: #151a1c;--aegis-swap-panel-raised: #1a2022;--aegis-swap-panel-soft: #20282a;--aegis-swap-text: #f5f8f5;--aegis-swap-muted: #9aa9a3;--aegis-swap-subtle: #64716b;--aegis-swap-border: #2b3436;--aegis-swap-border-strong: #3b4749;--aegis-swap-danger: #ff9b85;--aegis-swap-accent: #2fbf7a;--aegis-swap-accent-text: #06120c;--aegis-swap-warm: #c7a96a;box-sizing:border-box;width:100%;max-width:468px;min-width:300px;border:1px solid var(--aegis-swap-border-strong);border-radius:8px;background:linear-gradient(180deg,#ffffff0e,#fff0 22%),linear-gradient(145deg,#15191c,#0d1112 62%,#11100c);box-shadow:0 24px 70px #0000006b,inset 0 1px #ffffff0f;color:var(--aegis-swap-text);font-family:Inter,ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,sans-serif;-webkit-font-smoothing:antialiased;text-rendering:geometricPrecision;padding:18px}.aegis-swap-widget--light{--aegis-swap-bg: #f5f7f4;--aegis-swap-panel: #ffffff;--aegis-swap-panel-raised: #ffffff;--aegis-swap-panel-soft: #eef2ee;--aegis-swap-text: #111815;--aegis-swap-muted: #617069;--aegis-swap-subtle: #7d8a84;--aegis-swap-border: #d8dfda;--aegis-swap-border-strong: #c7d2cb;--aegis-swap-danger: #b73f2c;background:linear-gradient(180deg,#fffc,#fff0 28%),linear-gradient(145deg,#fff,#f1f5f2 62%,#f6f1e8);box-shadow:0 22px 54px #19262024,inset 0 1px #ffffffbf}.aegis-swap-widget *,.aegis-swap-widget *:before,.aegis-swap-widget *:after{box-sizing:border-box}.aegis-swap-widget button,.aegis-swap-widget input{font:inherit}.aegis-swap-widget__header,.aegis-swap-widget__brand,.aegis-swap-widget__amount-row,.aegis-swap-widget__field-label,.aegis-swap-widget__settings label,.aegis-swap-widget__pool{display:flex;align-items:center}.aegis-swap-widget__header{justify-content:space-between;gap:14px;margin-bottom:16px}.aegis-swap-widget__brand{min-width:0;gap:11px}.aegis-swap-widget__logo{display:grid;flex:0 0 auto;width:42px;height:42px;place-items:center;border:1px solid rgba(255,255,255,.12);border-radius:50%;background:linear-gradient(180deg,#ffffff2e,#ffffff05),#151a1c;color:#f3f7f4;box-shadow:inset 0 1px #ffffff1f}.aegis-swap-widget--light .aegis-swap-widget__logo{border-color:#1118151a;background:linear-gradient(180deg,#fff,#e5ebe7);color:#171c1f}.aegis-swap-widget__logo svg{width:24px;height:24px}.aegis-swap-widget__eyebrow,.aegis-swap-widget__chain,.aegis-swap-widget__meta,.aegis-swap-widget__settings,.aegis-swap-widget__pool{color:var(--aegis-swap-muted);font-size:12px}.aegis-swap-widget__eyebrow{display:block;margin-bottom:2px;overflow:hidden;color:var(--aegis-swap-accent);font-weight:800;line-height:1.1;text-overflow:ellipsis;text-transform:uppercase;white-space:nowrap}.aegis-swap-widget h2{margin:0;overflow:hidden;padding-bottom:1px;color:var(--aegis-swap-text);font-size:24px;font-weight:800;line-height:1.22;text-overflow:ellipsis;white-space:nowrap}.aegis-swap-widget__chain{flex:0 0 auto;border:1px solid var(--aegis-swap-border);border-radius:999px;background:#ffffff09;padding:7px 10px;color:var(--aegis-swap-text);font-weight:700}.aegis-swap-widget__targets{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:7px;margin-bottom:12px}.aegis-swap-widget__target,.aegis-swap-widget__submit,.aegis-swap-widget__max,.aegis-swap-widget__flip{border:0;cursor:pointer}.aegis-swap-widget__target{display:flex;min-width:0;min-height:42px;align-items:center;justify-content:center;gap:6px;border:1px solid var(--aegis-swap-border);border-radius:8px;background:var(--aegis-swap-panel);color:var(--aegis-swap-muted);padding:7px 6px;transition:border-color .16s ease,background .16s ease,color .16s ease,transform .16s ease}.aegis-swap-widget__target-symbol{min-width:0;overflow:hidden;font-size:12.5px;font-weight:760;letter-spacing:0;line-height:1;text-overflow:ellipsis;white-space:nowrap}.aegis-swap-widget__target-mark,.aegis-swap-widget__token-mark,.aegis-swap-widget__pair-icon{display:grid;flex:0 0 auto;place-items:center;border-radius:50%;background:linear-gradient(145deg,var(--aegis-token-primary),var(--aegis-token-secondary));color:var(--aegis-token-text);font-weight:900}.aegis-swap-widget__target-mark{width:20px;height:20px;font-size:11px}.aegis-swap-widget__target-mark img,.aegis-swap-widget__token-mark img,.aegis-swap-widget__pair-icon img{display:block;width:100%;height:100%;border-radius:inherit;object-fit:cover}.aegis-swap-widget__target-pair,.aegis-swap-widget__pool-pair{display:inline-flex;flex:0 0 auto;align-items:center}.aegis-swap-widget__pair-icon{width:21px;height:21px;border:2px solid var(--aegis-swap-panel);font-size:10px}.aegis-swap-widget__pair-icon--secondary{margin-left:-7px}.aegis-swap-widget__target[aria-selected=true] .aegis-swap-widget__pair-icon{border-color:var(--aegis-swap-panel-raised)}.aegis-swap-widget__target[aria-selected=true]{border-color:color-mix(in srgb,var(--aegis-swap-accent) 62%,white 8%);background:linear-gradient(180deg,color-mix(in srgb,var(--aegis-swap-accent) 18%,transparent),transparent),var(--aegis-swap-panel-raised);color:var(--aegis-swap-text)}.aegis-swap-widget__target:hover:not(:disabled){transform:translateY(-1px);border-color:color-mix(in srgb,var(--aegis-swap-accent) 45%,var(--aegis-swap-border));color:var(--aegis-swap-text)}.aegis-swap-widget__target:disabled,.aegis-swap-widget__submit:disabled,.aegis-swap-widget__max:disabled,.aegis-swap-widget__flip:disabled{cursor:not-allowed;opacity:.55}.aegis-swap-widget__panel{display:grid;gap:0}.aegis-swap-widget__amount-box{display:grid;gap:10px;border:1px solid var(--aegis-swap-border);border-radius:8px;background:linear-gradient(180deg,#ffffff0b,#fff0),var(--aegis-swap-panel);padding:13px;transition:border-color .16s ease,background .16s ease}.aegis-swap-widget__amount-box:focus-within{border-color:color-mix(in srgb,var(--aegis-swap-accent) 58%,var(--aegis-swap-border));background:linear-gradient(180deg,color-mix(in srgb,var(--aegis-swap-accent) 8%,transparent),transparent),var(--aegis-swap-panel-raised)}.aegis-swap-widget__field-label{justify-content:space-between;color:var(--aegis-swap-muted);font-size:12px;font-weight:700;line-height:1}.aegis-swap-widget__max{border-radius:5px;background:color-mix(in srgb,var(--aegis-swap-accent) 12%,transparent);color:var(--aegis-swap-accent);padding:4px 7px;font-size:11px;font-weight:800}.aegis-swap-widget__amount-row{justify-content:space-between;gap:12px}.aegis-swap-widget__amount-row input{width:100%;min-width:0;border:0;outline:0;background:transparent;color:var(--aegis-swap-text);font-size:30px;font-weight:800;line-height:1.05}.aegis-swap-widget__amount-row input::placeholder{color:color-mix(in srgb,var(--aegis-swap-muted) 55%,transparent)}.aegis-swap-widget__amount-row input:disabled{opacity:1;-webkit-text-fill-color:var(--aegis-swap-text)}.aegis-swap-widget__token{display:inline-flex;flex:0 0 auto;min-width:96px;align-items:center;justify-content:center;gap:7px;border:1px solid var(--aegis-swap-border);border-radius:999px;background:var(--aegis-swap-panel-soft);color:var(--aegis-swap-text);padding:7px 10px 7px 8px;text-align:center}.aegis-swap-widget__token-symbol{display:inline-block;min-width:44px;color:var(--aegis-swap-text);font-size:13.5px;font-weight:780;letter-spacing:0;line-height:1;text-align:left;text-transform:uppercase}.aegis-swap-widget__token-mark{width:22px;height:22px;font-size:11px}.aegis-swap-widget__meta{overflow-wrap:anywhere;color:var(--aegis-swap-subtle)}.aegis-swap-widget__flip{z-index:1;display:grid;justify-self:center;width:38px;height:34px;margin:-8px 0;place-items:center;border:5px solid var(--aegis-swap-bg);border-radius:999px;background:var(--aegis-swap-panel-soft);color:var(--aegis-swap-accent);transition:color .16s ease,transform .16s ease}.aegis-swap-widget__flip:hover:not(:disabled){transform:rotate(180deg);color:var(--aegis-swap-text)}.aegis-swap-widget__flip svg{width:17px;height:17px;fill:none;stroke:currentColor;stroke-linecap:round;stroke-linejoin:round;stroke-width:2}.aegis-swap-widget__settings{margin-top:14px}.aegis-swap-widget__settings label{justify-content:space-between;gap:10px}.aegis-swap-widget__slippage-input{display:inline-flex;align-items:center;gap:2px;border:1px solid var(--aegis-swap-border);border-radius:8px;background:var(--aegis-swap-panel);padding:6px 8px;color:var(--aegis-swap-text);font-weight:800}.aegis-swap-widget__slippage-input input{width:42px;border:0;outline:0;background:transparent;color:var(--aegis-swap-text);text-align:right}.aegis-swap-widget__details{display:grid;gap:8px;margin-top:12px;border:1px solid var(--aegis-swap-border);border-radius:8px;background:#ffffff06;padding:11px 12px}.aegis-swap-widget__pool{justify-content:space-between;gap:12px;min-width:0}.aegis-swap-widget__pool strong,.aegis-swap-widget__pool a{min-width:0;overflow:hidden;color:var(--aegis-swap-text);font-size:12px;font-weight:800;text-align:right;text-decoration:none;text-overflow:ellipsis;white-space:nowrap}.aegis-swap-widget__pool a{color:var(--aegis-swap-accent)}.aegis-swap-widget__pool-label{display:inline-flex;min-width:0;align-items:center;gap:7px}.aegis-swap-widget__pool-pair .aegis-swap-widget__pair-icon{width:18px;height:18px;border-color:color-mix(in srgb,var(--aegis-swap-bg) 76%,var(--aegis-swap-border));font-size:9px}.aegis-swap-widget__error{margin:9px 0 -2px;color:var(--aegis-swap-danger);font-size:12px;font-weight:750;line-height:1.25;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.aegis-swap-widget__submit{width:100%;min-height:48px;margin-top:13px;border-radius:8px;background:linear-gradient(180deg,#ffffff2e,#fff0),var(--aegis-swap-accent);color:var(--aegis-swap-accent-text);font-size:15px;font-weight:900;transition:filter .16s ease,transform .16s ease}.aegis-swap-widget__submit:hover:not(:disabled){filter:brightness(1.08);transform:translateY(-1px)}.aegis-swap-widget__tx{display:block;margin-top:10px;color:var(--aegis-swap-accent);font-size:12px;font-weight:800;text-align:center;text-decoration:none}@media(prefers-reduced-motion:no-preference){.aegis-swap-widget{animation:aegisSwapEnter .32s ease both}}@keyframes aegisSwapEnter{0%{opacity:0;transform:translateY(8px)}to{opacity:1;transform:translateY(0)}}@media(max-width:420px){.aegis-swap-widget{min-width:0;padding:14px}.aegis-swap-widget__header{align-items:flex-start}.aegis-swap-widget h2{font-size:21px}.aegis-swap-widget__chain{padding:6px 8px}.aegis-swap-widget__targets{grid-template-columns:repeat(2,minmax(0,1fr))}.aegis-swap-widget__amount-row input{font-size:26px}.aegis-swap-widget__token{min-width:88px}}
1
+ .aegis-swap-widget{--aegis-swap-bg: #0b0f0e;--aegis-swap-panel: #111716;--aegis-swap-panel-raised: #161d1b;--aegis-swap-panel-soft: #1b2421;--aegis-swap-text: #f5faf6;--aegis-swap-muted: #8f9d96;--aegis-swap-subtle: #87958e;--aegis-swap-border: #232f2b;--aegis-swap-border-strong: #34423d;--aegis-swap-danger: #ff9b85;--aegis-swap-accent: #38d98a;--aegis-swap-accent-text: #06120c;--aegis-swap-accent-soft: color-mix(in srgb, var(--aegis-swap-accent) 11%, transparent);--aegis-swap-accent-line: color-mix(in srgb, var(--aegis-swap-accent) 46%, var(--aegis-swap-border));--aegis-swap-accent-glow: color-mix(in srgb, var(--aegis-swap-accent) 24%, transparent);--aegis-swap-ring: color-mix(in srgb, var(--aegis-swap-accent) 55%, transparent);--aegis-r-lg: 8px;--aegis-r-md: 8px;--aegis-r-sm: 6px;--aegis-ease: cubic-bezier(.2, 0, 0, 1);box-sizing:border-box;container-type:inline-size;width:100%;max-width:468px;min-width:300px;position:relative;isolation:isolate;overflow-anchor:none;border:1px solid var(--aegis-swap-border-strong);border-radius:var(--aegis-r-lg);background:radial-gradient(90% 62% at 50% -20%,var(--aegis-swap-accent-soft),transparent 62%),linear-gradient(180deg,#ffffff0b,#fff0 25%),linear-gradient(150deg,#141a18,#0b0f0e 68%,#0d100c);box-shadow:0 1px #ffffff0d inset,0 2px 8px #00000042,0 34px 78px -34px #000000c7,0 0 0 1px #0003;color:var(--aegis-swap-text);font-family:var(--aegis-swap-font-family, system-ui, sans-serif);-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;padding:20px}.aegis-swap-widget:before{content:"";position:absolute;inset:0 18% auto;top:-1px;height:1px;border-radius:inherit;background:linear-gradient(90deg,transparent,var(--aegis-swap-accent-line),transparent);opacity:.7;pointer-events:none}.aegis-swap-widget__progress-rail{position:absolute;inset:0 0 auto;z-index:3;display:block;height:3px;overflow:hidden;border-top-left-radius:inherit;border-top-right-radius:inherit;background:color-mix(in srgb,var(--aegis-swap-accent) 10%,transparent);pointer-events:none}.aegis-swap-widget__progress-complete,.aegis-swap-widget__progress-active{position:absolute;top:0;bottom:0;display:block}.aegis-swap-widget__progress-complete{left:0;width:var(--aegis-swap-progress-complete, 0%);background:linear-gradient(90deg,color-mix(in srgb,var(--aegis-swap-accent) 62%,white),var(--aegis-swap-accent));box-shadow:0 0 10px color-mix(in srgb,var(--aegis-swap-accent) 54%,transparent);transition:width .36s var(--aegis-ease),background .22s var(--aegis-ease),box-shadow .22s var(--aegis-ease)}.aegis-swap-widget__progress-active{left:var(--aegis-swap-progress-complete, 0%);width:var(--aegis-swap-progress-active-width, 100%);overflow:hidden}.aegis-swap-widget__progress-active:after{content:"";display:block;width:0;height:100%;background:linear-gradient(90deg,color-mix(in srgb,var(--aegis-swap-accent) 62%,white),var(--aegis-swap-accent));box-shadow:0 0 10px color-mix(in srgb,var(--aegis-swap-accent) 54%,transparent);transform-origin:left center;transition:width .36s var(--aegis-ease),transform .36s var(--aegis-ease),background .22s var(--aegis-ease),box-shadow .22s var(--aegis-ease)}.aegis-swap-widget__progress-rail[data-state=pending] .aegis-swap-widget__progress-active:after{width:58%;animation:aegis-swap-progress-sweep 1.35s linear infinite}.aegis-swap-widget__progress-rail[data-state=mining] .aegis-swap-widget__progress-active:after{width:58%;animation:aegis-swap-progress-sweep 1.18s linear infinite}.aegis-swap-widget__progress-rail[data-state=success]{background:color-mix(in srgb,#21b26f 14%,transparent)}.aegis-swap-widget__progress-rail[data-state=success] .aegis-swap-widget__progress-complete{width:100%;background:linear-gradient(90deg,color-mix(in srgb,#21b26f 62%,white),#21b26f);box-shadow:0 0 10px color-mix(in srgb,#21b26f 54%,transparent)}.aegis-swap-widget__progress-rail[data-state=error]{background:color-mix(in srgb,var(--aegis-swap-danger) 14%,transparent)}.aegis-swap-widget__progress-rail[data-state=error] .aegis-swap-widget__progress-complete{width:100%;background:linear-gradient(90deg,color-mix(in srgb,var(--aegis-swap-danger) 62%,white),var(--aegis-swap-danger));box-shadow:0 0 10px color-mix(in srgb,var(--aegis-swap-danger) 54%,transparent)}.aegis-swap-widget__progress-rail[data-state=success],.aegis-swap-widget__progress-rail[data-state=error]{animation:aegis-swap-rail-dismiss .42s var(--aegis-ease) 3s forwards}@keyframes aegis-swap-rail-dismiss{to{opacity:0}}@keyframes aegis-swap-progress-sweep{0%{transform:translate(-115%)}to{transform:translate(320%)}}.aegis-swap-widget--light{--aegis-swap-bg: #f5f7f3;--aegis-swap-panel: #ffffff;--aegis-swap-panel-raised: #ffffff;--aegis-swap-panel-soft: #edf2ed;--aegis-swap-text: #101714;--aegis-swap-muted: #5d6c65;--aegis-swap-subtle: #66736c;--aegis-swap-border: #dfe6e1;--aegis-swap-border-strong: #cfd9d2;--aegis-swap-danger: #b73f2c;background:radial-gradient(90% 62% at 50% -20%,var(--aegis-swap-accent-soft),transparent 62%),linear-gradient(180deg,#ffffffd9,#fff0 30%),linear-gradient(150deg,#fff,#f3f6f1 66%,#f8f4ec);box-shadow:0 1px #fffc inset,0 2px 6px #1926200f,0 30px 64px -30px #19262047}.aegis-swap-widget *,.aegis-swap-widget *:before,.aegis-swap-widget *:after{box-sizing:border-box}:where(.aegis-swap-widget) button,:where(.aegis-swap-widget) input{font:inherit}@media(prefers-reduced-motion:reduce){.aegis-swap-widget__progress-rail[data-state=pending] .aegis-swap-widget__progress-active:after,.aegis-swap-widget__progress-rail[data-state=mining] .aegis-swap-widget__progress-active:after{width:100%;animation:none;transform:none}}.aegis-swap-widget :focus-visible{outline:2px solid var(--aegis-swap-ring);outline-offset:2px;border-radius:var(--aegis-r-sm)}.aegis-swap-widget__amount-row input:focus-visible,.aegis-swap-widget__slippage-input input:focus-visible{outline:none}.aegis-swap-widget__header,.aegis-swap-widget__brand,.aegis-swap-widget__amount-row,.aegis-swap-widget__field-label,.aegis-swap-widget__settings label,.aegis-swap-widget__pool{display:flex;align-items:center}.aegis-swap-widget__header{justify-content:space-between;gap:16px;margin-bottom:17px}.aegis-swap-widget__brand{min-width:0;gap:11px}.aegis-swap-widget__logo{display:grid;flex:0 0 auto;width:40px;height:40px;place-items:center;border:1px solid rgba(255,255,255,.14);border-radius:var(--aegis-r-md);background:radial-gradient(120% 120% at 30% 20%,var(--aegis-swap-accent-soft),transparent 60%),linear-gradient(180deg,#ffffff2e,#ffffff05),#161b1d;color:#f3f7f4;box-shadow:inset 0 1px #ffffff24,0 10px 22px -16px #000000b3}.aegis-swap-widget--light .aegis-swap-widget__logo{border-color:#1118151a;background:radial-gradient(120% 120% at 30% 20%,var(--aegis-swap-accent-soft),transparent 60%),linear-gradient(180deg,#fff,#e7ede9);color:#171c1f}.aegis-swap-widget__logo svg{width:23px;height:23px}.aegis-swap-widget__eyebrow,.aegis-swap-widget__chain,.aegis-swap-widget__meta,.aegis-swap-widget__settings,.aegis-swap-widget__pool{color:var(--aegis-swap-muted);font-size:12px}.aegis-swap-widget__eyebrow{display:block;margin-bottom:2px;overflow:hidden;color:var(--aegis-swap-subtle);font-size:11px;font-weight:700;letter-spacing:.06em;line-height:1.1;text-overflow:ellipsis;text-transform:uppercase;white-space:nowrap}.aegis-swap-widget h2{margin:0;overflow:hidden;padding-bottom:1px;color:var(--aegis-swap-text);font-size:24px;font-weight:800;line-height:1.2;text-overflow:ellipsis;white-space:nowrap}.aegis-swap-widget__network{position:relative;display:flex;flex:0 0 auto}.aegis-swap-widget__chain{flex:0 0 auto;display:inline-flex;min-height:32px;align-items:center;justify-content:center;gap:3px;border:1px solid color-mix(in srgb,var(--aegis-swap-border) 74%,transparent);border-radius:var(--aegis-r-lg);background:linear-gradient(180deg,rgba(255,255,255,.025),transparent),color-mix(in srgb,var(--aegis-swap-panel) 74%,transparent);padding:0 8px 0 6px;color:var(--aegis-swap-text);font-weight:700;box-shadow:inset 0 1px #ffffff09;transition:border-color .17s var(--aegis-ease),background .17s var(--aegis-ease)}.aegis-swap-widget__chain-mark{display:grid;width:26px;height:26px;place-items:center;border:0;border-radius:50%;background:transparent;box-shadow:none}.aegis-swap-widget__chain-logo{width:21px;height:21px;grid-area:1 / 1;color:#f7fbf8}.aegis-swap-widget--light .aegis-swap-widget__chain-logo{color:#101714}.aegis-swap-widget__chain:hover{border-color:color-mix(in srgb,var(--aegis-swap-text) 14%,transparent);background:color-mix(in srgb,var(--aegis-swap-panel-raised) 80%,transparent)}.aegis-swap-widget__chain-caret{display:grid;width:14px;place-items:center;color:var(--aegis-swap-subtle);transition:transform .17s var(--aegis-ease)}.aegis-swap-widget__chain-caret svg{width:12px;height:12px;fill:none;stroke:currentColor;stroke-linecap:round;stroke-linejoin:round;stroke-width:2.2}.aegis-swap-widget__chain[data-open] .aegis-swap-widget__chain-caret{transform:rotate(180deg)}.aegis-swap-widget__network-menu{position:absolute;top:calc(100% + 6px);right:0;z-index:5;min-width:232px;transform-origin:top right;transform:scale(.97);opacity:0;pointer-events:none;border:1px solid var(--aegis-swap-border-strong);border-radius:var(--aegis-r-lg);background:linear-gradient(180deg,#ffffff0a,#fff0),var(--aegis-swap-panel-raised);box-shadow:inset 0 1px #ffffff0d,0 4px 12px #0000003d,0 24px 48px -18px #0009;padding:5px;transition:transform .25s var(--aegis-ease),opacity .25s var(--aegis-ease);will-change:transform,opacity}.aegis-swap-widget__network-menu.is-open{transform:scale(1);opacity:1;pointer-events:auto}.aegis-swap-widget__network-menu.is-closing{transform:scale(.99);opacity:0;pointer-events:none;transition:transform .15s var(--aegis-ease),opacity .15s var(--aegis-ease)}.aegis-swap-widget__network-option{display:flex;width:100%;align-items:center;gap:9px;border:0;border-radius:var(--aegis-r-sm);background:transparent;color:var(--aegis-swap-text);padding:8px 9px;font-size:13px;font-weight:700;cursor:pointer;transition:background .15s var(--aegis-ease)}.aegis-swap-widget__network-option:hover{background:color-mix(in srgb,var(--aegis-swap-text) 6%,transparent)}.aegis-swap-widget__network-mark{display:grid;width:24px;height:24px;flex:0 0 auto;place-items:center;border-radius:50%;background:color-mix(in srgb,var(--aegis-swap-panel-soft) 90%,transparent);box-shadow:inset 0 0 0 1px color-mix(in srgb,var(--aegis-swap-border) 80%,transparent)}.aegis-swap-widget__network-mark .aegis-swap-widget__chain-logo{width:14px;height:14px}.aegis-swap-widget__network-name{flex:1;min-width:0;overflow:hidden;text-align:left;text-overflow:ellipsis;white-space:nowrap}.aegis-swap-widget__network-check{color:var(--aegis-swap-accent)}.aegis-swap-widget__network-check svg{width:14px;height:14px;fill:none;stroke:currentColor;stroke-linecap:round;stroke-linejoin:round;stroke-width:2.4}.aegis-swap-widget__network-soon{margin:3px 2px 4px;padding:0 9px;color:var(--aegis-swap-subtle);font-size:12px;font-weight:600;line-height:1.4}@media(prefers-reduced-motion:reduce){.aegis-swap-widget__network-menu{transition:none!important}}.aegis-swap-widget__topbar{display:flex;align-items:stretch;gap:6px;margin-bottom:14px}.aegis-swap-widget__topbar .aegis-swap-widget__targets{flex:1;min-width:0;margin-bottom:0}.aegis-swap-widget__topbar .aegis-swap-widget__target-pair{display:none}.aegis-swap-widget__targets{display:grid;grid-auto-flow:column;grid-auto-columns:minmax(0,1fr);gap:4px;margin-bottom:14px;border:1px solid color-mix(in srgb,var(--aegis-swap-border) 74%,transparent);border-radius:var(--aegis-r-lg);background:linear-gradient(180deg,rgba(255,255,255,.025),transparent),color-mix(in srgb,var(--aegis-swap-panel) 74%,transparent);padding:4px;box-shadow:inset 0 1px #ffffff09}.aegis-swap-widget__target,.aegis-swap-widget__submit,.aegis-swap-widget__max,.aegis-swap-widget__half,.aegis-swap-widget__flip,.aegis-swap-widget__route-action,.aegis-swap-widget__execution-toggle,.aegis-swap-widget__approval-options button{border:0;cursor:pointer}.aegis-swap-widget__target{display:flex;min-width:0;min-height:42px;align-items:center;justify-content:center;gap:6px;border:1px solid transparent;border-radius:var(--aegis-r-sm);background:transparent;color:var(--aegis-swap-muted);padding:7px 5px;transition:border-color .17s var(--aegis-ease),background .17s var(--aegis-ease),color .17s var(--aegis-ease),box-shadow .17s var(--aegis-ease),transform .17s var(--aegis-ease)}.aegis-swap-widget__target-symbol{min-width:0;overflow:hidden;font-size:13px;font-weight:700;line-height:1;text-overflow:ellipsis;white-space:nowrap}.aegis-swap-widget__token-mark,.aegis-swap-widget__pair-icon{display:grid;flex:0 0 auto;place-items:center;border-radius:50%;background:linear-gradient(145deg,var(--aegis-token-primary),var(--aegis-token-secondary));color:var(--aegis-token-text);font-weight:700;box-shadow:inset 0 0 0 1px #ffffff14}.aegis-swap-widget__token-mark img,.aegis-swap-widget__pair-icon img{display:block;width:100%;height:100%;border-radius:inherit;object-fit:cover}.aegis-swap-widget__target-pair,.aegis-swap-widget__pool-pair{display:inline-flex;flex:0 0 auto;align-items:center}.aegis-swap-widget__pair-icon{width:20px;height:20px;border:2px solid color-mix(in srgb,var(--aegis-swap-panel) 84%,#080b0a);font-size:10px}.aegis-swap-widget__pair-icon--secondary{margin-left:-7px}.aegis-swap-widget__target[aria-checked=true] .aegis-swap-widget__pair-icon{border-color:var(--aegis-swap-panel-raised)}.aegis-swap-widget__target[aria-checked=true]{border-color:var(--aegis-swap-accent-line);background:linear-gradient(180deg,var(--aegis-swap-accent-soft),transparent 78%),var(--aegis-swap-panel-raised);color:var(--aegis-swap-text);box-shadow:0 0 0 1px color-mix(in srgb,var(--aegis-swap-accent-line) 58%,transparent),0 10px 22px -17px var(--aegis-swap-accent-glow),inset 0 1px #ffffff12}.aegis-swap-widget__target:hover:not(:disabled){transform:translateY(-1px);border-color:color-mix(in srgb,var(--aegis-swap-text) 12%,transparent);background:color-mix(in srgb,var(--aegis-swap-panel-raised) 76%,transparent);color:var(--aegis-swap-text)}.aegis-swap-widget__target:active:not(:disabled),.aegis-swap-widget__submit:active:not(:disabled),.aegis-swap-widget__max:active:not(:disabled),.aegis-swap-widget__half:active:not(:disabled),.aegis-swap-widget__flip:active:not(:disabled){transform:scale(.96)}.aegis-swap-widget__target:disabled,.aegis-swap-widget__submit:disabled,.aegis-swap-widget__max:disabled,.aegis-swap-widget__half:disabled,.aegis-swap-widget__flip:disabled{cursor:not-allowed;opacity:.5}.aegis-swap-widget__panel{display:grid;gap:4px}.aegis-swap-widget__amount-box{display:grid;gap:11px;border:1px solid color-mix(in srgb,var(--aegis-swap-border) 82%,transparent);border-radius:var(--aegis-r-md);background:linear-gradient(180deg,#ffffff09,#fff0),var(--aegis-swap-panel);padding:15px;box-shadow:inset 0 1px #ffffff09,0 10px 24px -22px #000000a6;transition:border-color .17s var(--aegis-ease),background .17s var(--aegis-ease),box-shadow .17s var(--aegis-ease)}.aegis-swap-widget__amount-box:focus-within{border-color:color-mix(in srgb,var(--aegis-swap-accent) 58%,var(--aegis-swap-border));background:linear-gradient(180deg,var(--aegis-swap-accent-soft),transparent 68%),var(--aegis-swap-panel-raised);box-shadow:0 0 0 3px var(--aegis-swap-accent-soft),inset 0 1px #ffffff0d,0 14px 28px -24px var(--aegis-swap-accent-glow)}.aegis-swap-widget__field-label{justify-content:space-between;color:var(--aegis-swap-muted);font-size:12px;font-weight:600;line-height:1}.aegis-swap-widget__max,.aegis-swap-widget__half{position:relative;border:1px solid color-mix(in srgb,var(--aegis-swap-accent) 28%,transparent);border-radius:var(--aegis-r-sm);background:color-mix(in srgb,var(--aegis-swap-accent) 9%,transparent);color:var(--aegis-swap-accent);padding:4px 7px;font-size:11px;font-weight:700;letter-spacing:.06em;text-transform:uppercase;transition:background .15s var(--aegis-ease),border-color .15s var(--aegis-ease),color .15s var(--aegis-ease)}.aegis-swap-widget__max:hover:not(:disabled),.aegis-swap-widget__half:hover:not(:disabled){background:color-mix(in srgb,var(--aegis-swap-accent) 22%,transparent);border-color:color-mix(in srgb,var(--aegis-swap-accent) 45%,transparent)}.aegis-swap-widget__max:before,.aegis-swap-widget__half:before{position:absolute;top:-8px;right:-8px;bottom:-8px;left:-8px;content:""}.aegis-swap-widget__quick{display:inline-flex;align-items:center;gap:6px}.aegis-swap-widget__half{background:transparent;border-color:color-mix(in srgb,var(--aegis-swap-accent) 20%,transparent)}.aegis-swap-widget__amount-row{justify-content:space-between;gap:12px}.aegis-swap-widget__amount-row input{width:100%;min-width:0;border:0;outline:0;background:transparent;color:var(--aegis-swap-text);font-size:clamp(23px,8.7cqi,33px);font-weight:700;font-variant-numeric:tabular-nums;line-height:1.05;-webkit-mask-image:linear-gradient(to right,#000 90%,transparent);mask-image:linear-gradient(to right,#000 90%,transparent)}.aegis-swap-widget__amount-row input::placeholder{color:color-mix(in srgb,var(--aegis-swap-muted) 50%,transparent);-webkit-text-fill-color:color-mix(in srgb,var(--aegis-swap-muted) 50%,transparent)}.aegis-swap-widget__amount-row input:disabled{opacity:1;-webkit-text-fill-color:var(--aegis-swap-text)}.aegis-swap-widget__token{display:inline-flex;flex:0 0 auto;min-width:96px;align-items:center;justify-content:center;gap:8px;border:1px solid color-mix(in srgb,var(--aegis-swap-border) 86%,transparent);border-radius:999px;background:linear-gradient(180deg,#ffffff0d,#fff0),var(--aegis-swap-panel-soft);color:var(--aegis-swap-text);padding:7px 11px 7px 8px;text-align:center;box-shadow:inset 0 1px #ffffff0d}.aegis-swap-widget__token-symbol{display:inline-block;min-width:44px;color:var(--aegis-swap-text);font-size:13px;font-weight:700;line-height:1;text-align:left;text-transform:uppercase}.aegis-swap-widget__token-mark{width:22px;height:22px;font-size:11px}.aegis-swap-widget__meta{overflow-wrap:anywhere;color:var(--aegis-swap-subtle);font-variant-numeric:tabular-nums}.aegis-swap-widget__flip{z-index:1;display:grid;justify-self:center;width:38px;height:38px;margin:-15px 0;place-items:center;border:4px solid var(--aegis-swap-bg);border-radius:50%;background:linear-gradient(180deg,#ffffff0f,#fff0),var(--aegis-swap-panel-soft);color:var(--aegis-swap-accent);box-shadow:0 0 0 1px var(--aegis-swap-border),0 8px 18px -12px #000000b3;transition:color .2s var(--aegis-ease),box-shadow .2s var(--aegis-ease),transform .32s var(--aegis-ease)}.aegis-swap-widget__flip:hover:not(:disabled){transform:rotate(180deg);color:var(--aegis-swap-text);box-shadow:0 0 0 1px var(--aegis-swap-accent-line),0 10px 22px -10px var(--aegis-swap-accent-glow)}.aegis-swap-widget__flip svg{width:18px;height:18px;fill:none;stroke:currentColor;stroke-linecap:round;stroke-linejoin:round;stroke-width:2}.aegis-swap-widget__execution{display:grid;gap:0;margin-top:15px;overflow:hidden;border:1px solid color-mix(in srgb,var(--aegis-swap-border) 82%,transparent);border-radius:var(--aegis-r-md);background:linear-gradient(180deg,#ffffff07,#fff0),color-mix(in srgb,var(--aegis-swap-panel) 78%,transparent);box-shadow:inset 0 1px #ffffff09}.aegis-swap-widget__execution-toggle{display:flex;min-height:42px;align-items:center;justify-content:space-between;gap:12px;background:transparent;color:var(--aegis-swap-muted);padding:0 12px;font-size:13px;font-weight:700;transition:background .15s var(--aegis-ease),color .15s var(--aegis-ease)}.aegis-swap-widget__execution-toggle:hover{background:color-mix(in srgb,var(--aegis-swap-text) 5%,transparent);color:var(--aegis-swap-text)}.aegis-swap-widget__execution-toggle-label{display:inline-flex;min-width:0;align-items:center;gap:9px}.aegis-swap-widget__execution-toggle-icon{display:grid;width:25px;height:25px;flex:0 0 auto;place-items:center;border:1px solid color-mix(in srgb,var(--aegis-swap-border) 76%,transparent);border-radius:9px;background:linear-gradient(180deg,#ffffff0b,#fff0),color-mix(in srgb,var(--aegis-swap-panel-soft) 74%,transparent);color:var(--aegis-swap-subtle);box-shadow:inset 0 1px #ffffff0a;transition:border-color .15s var(--aegis-ease),color .15s var(--aegis-ease),background .15s var(--aegis-ease)}.aegis-swap-widget__execution-toggle-icon svg{width:15px;height:15px;fill:none;stroke:currentColor;stroke-linecap:round;stroke-linejoin:round;stroke-width:2}.aegis-swap-widget__execution-toggle:hover .aegis-swap-widget__execution-toggle-icon{border-color:color-mix(in srgb,var(--aegis-swap-accent) 34%,transparent);background:color-mix(in srgb,var(--aegis-swap-accent) 10%,transparent);color:var(--aegis-swap-accent)}.aegis-swap-widget__execution-chevron{display:grid;width:26px;height:26px;place-items:center;border-radius:8px;color:var(--aegis-swap-subtle);transition:background .15s var(--aegis-ease),color .15s var(--aegis-ease),transform .17s var(--aegis-ease)}.aegis-swap-widget__execution-chevron svg{width:15px;height:15px;fill:none;stroke:currentColor;stroke-linecap:round;stroke-linejoin:round;stroke-width:2.2}.aegis-swap-widget__execution-toggle:hover .aegis-swap-widget__execution-chevron{background:color-mix(in srgb,var(--aegis-swap-text) 7%,transparent);color:var(--aegis-swap-accent)}.aegis-swap-widget__execution[data-open] .aegis-swap-widget__execution-chevron{transform:rotate(180deg)}.aegis-swap-widget__execution-panel{display:grid;grid-template-rows:0fr;visibility:hidden;opacity:0;transition:grid-template-rows .26s var(--aegis-ease),opacity .18s var(--aegis-ease),visibility 0s linear .26s}.aegis-swap-widget__execution[data-open] .aegis-swap-widget__execution-panel{grid-template-rows:1fr;visibility:visible;opacity:1;transition:grid-template-rows .26s var(--aegis-ease),opacity .2s var(--aegis-ease) 40ms,visibility 0s}.aegis-swap-widget__execution-panel-inner{display:grid;min-height:0;overflow:hidden;border-top:1px solid color-mix(in srgb,var(--aegis-swap-border) 78%,transparent)}@media(prefers-reduced-motion:reduce){.aegis-swap-widget__execution-panel,.aegis-swap-widget__execution[data-open] .aegis-swap-widget__execution-panel{transition:none}}.aegis-swap-widget__settings{margin:0}.aegis-swap-widget__settings label{justify-content:space-between;gap:10px;min-height:42px;padding:0 12px;font-weight:600}.aegis-swap-widget__approval-mode{display:flex;min-height:42px;align-items:center;justify-content:space-between;gap:12px;border-top:1px solid color-mix(in srgb,var(--aegis-swap-border) 70%,transparent);padding:0 12px;color:var(--aegis-swap-muted);font-size:13px;font-weight:600}.aegis-swap-widget__approval-options{display:inline-grid;grid-template-columns:repeat(2,minmax(0,1fr));overflow:hidden;border:1px solid color-mix(in srgb,var(--aegis-swap-border) 78%,transparent);border-radius:var(--aegis-r-sm);background:color-mix(in srgb,var(--aegis-swap-panel-soft) 72%,transparent);padding:3px}.aegis-swap-widget__approval-options button{min-width:54px;border-radius:6px;background:transparent;color:var(--aegis-swap-subtle);padding:5px 9px;font-size:12px;font-weight:700;transition:background .15s var(--aegis-ease),color .15s var(--aegis-ease),box-shadow .15s var(--aegis-ease)}.aegis-swap-widget__approval-options button[data-active]{background:color-mix(in srgb,var(--aegis-swap-accent) 18%,transparent);color:color-mix(in srgb,var(--aegis-swap-accent) 82%,white);box-shadow:inset 0 0 0 1px color-mix(in srgb,var(--aegis-swap-accent) 24%,transparent)}.aegis-swap-widget__approval-options button:disabled{cursor:not-allowed;opacity:.55}.aegis-swap-widget__slippage-input{display:inline-flex;align-items:center;gap:2px;border:1px solid color-mix(in srgb,var(--aegis-swap-border) 78%,transparent);border-radius:var(--aegis-r-sm);background:color-mix(in srgb,var(--aegis-swap-panel-soft) 72%,transparent);padding:5px 8px;color:var(--aegis-swap-text);font-weight:700;font-variant-numeric:tabular-nums;transition:border-color .15s var(--aegis-ease),box-shadow .15s var(--aegis-ease)}.aegis-swap-widget__slippage-input:focus-within{border-color:color-mix(in srgb,var(--aegis-swap-accent) 58%,var(--aegis-swap-border));box-shadow:0 0 0 3px var(--aegis-swap-accent-soft)}.aegis-swap-widget__slippage-input input{width:42px;border:0;outline:0;background:transparent;color:var(--aegis-swap-text);font-variant-numeric:tabular-nums;text-align:right}.aegis-swap-widget__slippage-input>span{color:var(--aegis-swap-muted)}.aegis-swap-widget__details{display:grid;gap:0;margin:0;border:0;border-top:1px solid color-mix(in srgb,var(--aegis-swap-border) 78%,transparent);border-radius:0;background:#ffffff05;padding:0}.aegis-swap-widget--light .aegis-swap-widget__details{background:#10171405}.aegis-swap-widget__quote-summary{display:grid;border-bottom:1px solid color-mix(in srgb,var(--aegis-swap-border) 70%,transparent)}.aegis-swap-widget__detail-row{display:flex;align-items:center;justify-content:space-between;gap:12px;min-height:34px;padding:0 12px;border-bottom:1px solid color-mix(in srgb,var(--aegis-swap-border) 55%,transparent);color:var(--aegis-swap-muted);font-size:12px;font-weight:600}.aegis-swap-widget__detail-row:last-of-type{border-bottom:0}.aegis-swap-widget__detail-row strong{min-width:0;overflow:hidden;color:var(--aegis-swap-text);font-size:12px;font-weight:700;font-variant-numeric:tabular-nums;text-align:right;text-overflow:ellipsis;white-space:nowrap}.aegis-swap-widget__empty{margin:0 0 14px;border:1px dashed var(--aegis-swap-border-strong);border-radius:var(--aegis-r-md);background:#ffffff06;color:var(--aegis-swap-muted);font-size:13px;font-weight:600;line-height:1.4;padding:14px}.aegis-swap-widget--light .aegis-swap-widget__empty{background:#10171406}.aegis-swap-widget__pool{justify-content:space-between;gap:12px;min-height:42px;min-width:0;padding:0 12px}.aegis-swap-widget__pool strong,.aegis-swap-widget__pool a{min-width:0;overflow:hidden;color:var(--aegis-swap-text);font-size:12px;font-weight:700;font-variant-numeric:tabular-nums;text-align:right;text-decoration:none;text-overflow:ellipsis;white-space:nowrap}.aegis-swap-widget__pool a{color:var(--aegis-swap-accent);transition:color .15s var(--aegis-ease)}.aegis-swap-widget__pool a:hover{color:color-mix(in srgb,var(--aegis-swap-accent) 80%,white)}.aegis-swap-widget__route-chip{display:inline-flex;max-width:min(252px,100%);min-width:0;align-items:center;gap:6px;overflow:hidden;border:1px solid color-mix(in srgb,var(--aegis-swap-border) 74%,transparent);border-radius:12px;background:linear-gradient(180deg,#ffffff0c,#ffffff03),color-mix(in srgb,var(--aegis-swap-bg) 36%,var(--aegis-swap-panel-soft));padding:3px 4px 3px 5px;color:var(--aegis-swap-text);box-shadow:inset 0 1px #ffffff0b,0 8px 18px -18px #000000e6;transition:border-color .15s var(--aegis-ease),background .15s var(--aegis-ease),box-shadow .15s var(--aegis-ease)}.aegis-swap-widget__route-chip:hover{border-color:color-mix(in srgb,var(--aegis-swap-accent) 28%,var(--aegis-swap-border));background:linear-gradient(180deg,#ffffff0f,#ffffff05),color-mix(in srgb,var(--aegis-swap-bg) 30%,var(--aegis-swap-panel-soft));box-shadow:inset 0 1px #ffffff0e,0 12px 24px -22px color-mix(in srgb,var(--aegis-swap-accent) 42%,black)}.aegis-swap-widget__route-protocol{display:inline-flex;min-width:0;align-items:center;gap:5px}.aegis-swap-widget__route-version{flex:0 0 auto;display:inline-grid;min-width:25px;height:20px;place-items:center;border:1px solid color-mix(in srgb,var(--aegis-swap-accent) 30%,transparent);border-radius:7px;background:color-mix(in srgb,var(--aegis-swap-accent) 12%,transparent);color:color-mix(in srgb,var(--aegis-swap-accent) 82%,white);font-size:11px;font-weight:700;line-height:1}.aegis-swap-widget__route-kind{flex:0 0 auto;color:var(--aegis-swap-text);font-size:12px;font-weight:700;line-height:1}.aegis-swap-widget__route-id{min-width:0;overflow:hidden;border-left:1px solid color-mix(in srgb,var(--aegis-swap-border) 66%,transparent);color:var(--aegis-swap-subtle);font-family:ui-monospace,Cascadia Mono,Menlo,Consolas,Roboto Mono,monospace;font-size:12px;font-weight:600;line-height:1;padding-left:7px;text-overflow:ellipsis;white-space:nowrap}.aegis-swap-widget__route-actions{display:inline-flex;flex:0 0 auto;align-items:center;gap:2px;margin-left:1px;border-left:1px solid color-mix(in srgb,var(--aegis-swap-border) 66%,transparent);padding-left:4px}.aegis-swap-widget__route-action{display:grid;width:27px;height:27px;place-items:center;border-radius:9px;background:transparent;color:var(--aegis-swap-subtle);padding:0;text-decoration:none;transition:background .15s var(--aegis-ease),color .15s var(--aegis-ease),transform .15s var(--aegis-ease)}.aegis-swap-widget__route-action:hover{background:color-mix(in srgb,var(--aegis-swap-accent) 12%,transparent);color:var(--aegis-swap-accent)}.aegis-swap-widget__route-action:active{transform:scale(.96);background:color-mix(in srgb,var(--aegis-swap-accent) 16%,transparent)}.aegis-swap-widget__route-action svg{width:15px;height:15px;fill:none;stroke:currentColor;stroke-linecap:round;stroke-linejoin:round;stroke-width:2}.aegis-swap-widget__copy-icon{grid-area:1 / 1;display:grid;place-items:center;transition:opacity .2s var(--aegis-ease),filter .2s var(--aegis-ease),transform .26s cubic-bezier(.34,1.56,.64,1)}.aegis-swap-widget__route-action:not([data-copied]) .aegis-swap-widget__copy-icon[data-icon=check],.aegis-swap-widget__route-action[data-copied] .aegis-swap-widget__copy-icon[data-icon=copy]{opacity:0;filter:blur(2px);transform:scale(.25)}.aegis-swap-widget__route-action[data-copied]{color:var(--aegis-swap-accent);background:color-mix(in srgb,var(--aegis-swap-accent) 14%,transparent)}@media(prefers-reduced-motion:reduce){.aegis-swap-widget__copy-icon{transition:none}}.aegis-swap-widget__pool-label{display:inline-flex;min-width:0;align-items:center;gap:8px;font-weight:600}.aegis-swap-widget__pool-pair .aegis-swap-widget__pair-icon{width:18px;height:18px;border-color:color-mix(in srgb,var(--aegis-swap-bg) 76%,var(--aegis-swap-border));font-size:9px}.aegis-swap-widget__error{margin:11px 0 -2px;color:var(--aegis-swap-danger);font-size:12px;font-weight:700;line-height:1.3;overflow-wrap:anywhere}.aegis-swap-widget__success{margin:11px 0 -2px;color:var(--aegis-swap-accent);font-size:12px;font-weight:700;font-variant-numeric:tabular-nums;line-height:1.3;overflow-wrap:anywhere}.aegis-swap-widget__submit{position:relative;display:grid;place-items:center;overflow:hidden;width:100%;min-height:52px;margin-top:14px;padding:0 16px;overflow-wrap:anywhere;text-align:center;border-radius:var(--aegis-r-md);background:linear-gradient(180deg,#fff3,#fff0 60%),var(--aegis-swap-accent);color:var(--aegis-swap-accent-text);font-size:15px;font-weight:800;box-shadow:0 1px #ffffff40 inset,0 12px 30px -12px var(--aegis-swap-accent-glow);transition:filter .17s var(--aegis-ease),box-shadow .17s var(--aegis-ease),transform .17s var(--aegis-ease)}.aegis-swap-widget__submit:hover:not(:disabled){filter:brightness(1.06);transform:translateY(-1px);box-shadow:0 1px #ffffff4d inset,0 18px 38px -14px var(--aegis-swap-accent-glow)}.aegis-swap-widget__submit:disabled{box-shadow:none}.aegis-swap-widget__tx{display:flex;align-items:center;justify-content:center;gap:5px;margin-top:11px;color:var(--aegis-swap-accent);font-size:12px;font-weight:700;text-decoration:none;transition:color .15s var(--aegis-ease)}.aegis-swap-widget__tx svg{width:13px;height:13px;fill:none;stroke:currentColor;stroke-linecap:round;stroke-linejoin:round;stroke-width:2}.aegis-swap-widget__tx:hover{color:color-mix(in srgb,var(--aegis-swap-accent) 80%,white)}@media(prefers-reduced-motion:no-preference){.aegis-swap-widget{animation:aegisSwapEnter .36s var(--aegis-ease) both}}@keyframes aegisSwapEnter{0%{opacity:0;transform:translateY(10px) scale(.99)}to{opacity:1;transform:translateY(0) scale(1)}}@container (max-width: 408px){.aegis-swap-widget__targets{grid-auto-flow:row;grid-template-columns:repeat(2,minmax(0,1fr))}.aegis-swap-widget__topbar .aegis-swap-widget__targets{grid-auto-flow:column;grid-template-columns:none;gap:2px}.aegis-swap-widget__topbar .aegis-swap-widget__target{padding:7px 2px}.aegis-swap-widget__topbar .aegis-swap-widget__target-symbol{font-size:11px}.aegis-swap-widget__route-chip{max-width:min(218px,100%)}.aegis-swap-widget__route-kind{display:none}.aegis-swap-widget__route-id{max-width:104px;font-size:11px}.aegis-swap-widget__header{align-items:flex-start}.aegis-swap-widget h2{font-size:21px}.aegis-swap-widget__chain{width:32px;height:32px;padding:0}.aegis-swap-widget__token{min-width:90px}}@media(max-width:420px){.aegis-swap-widget{min-width:0;padding:16px}}.aegis-swap-widget__powered{display:flex;align-items:center;justify-content:center;gap:5px;margin:14px 0 0;font-size:11px;color:var(--aegis-swap-subtle)}.aegis-swap-widget__powered-link{position:relative;display:inline-flex;align-items:center;gap:5px;padding:4px 6px;border-radius:var(--aegis-r-sm);color:var(--aegis-swap-subtle);text-decoration:none;transition:color .15s var(--aegis-ease)}.aegis-swap-widget__powered-link:before{content:"";position:absolute;top:-11px;right:-6px;bottom:-11px;left:-6px}.aegis-swap-widget__powered-mark{display:inline-flex;width:12px;height:12px}.aegis-swap-widget__powered-mark svg{width:100%;height:100%}.aegis-swap-widget__powered-brand{position:relative;font-weight:600;letter-spacing:.06em}.aegis-swap-widget__powered-brand:after{content:"";position:absolute;left:0;right:0;bottom:-2px;height:1px;border-radius:1px;background:currentColor;transform:scaleX(0);transform-origin:left center;transition:transform .2s var(--aegis-ease)}@media(hover:hover){.aegis-swap-widget__powered-link:hover{color:var(--aegis-swap-accent)}.aegis-swap-widget__powered-link:hover .aegis-swap-widget__powered-brand:after{transform:scaleX(1)}}.aegis-swap-widget__powered-link:focus-visible{outline:none;color:var(--aegis-swap-accent);box-shadow:0 0 0 2px var(--aegis-swap-ring)}.aegis-swap-widget__powered-link:focus-visible .aegis-swap-widget__powered-brand:after{transform:scaleX(1)}@media(prefers-reduced-motion:reduce){.aegis-swap-widget__powered-brand:after{transition:none}}
@@ -0,0 +1,18 @@
1
+ import type { Hex } from 'viem';
2
+ export type SubmitStatus = 'idle' | 'approving' | 'signing' | 'submitting' | 'success';
3
+ export declare function isBusy(status: SubmitStatus): boolean;
4
+ export type TransactionProgressState = 'pending' | 'mining' | 'success' | 'error';
5
+ export type TransactionProgressView = {
6
+ state: TransactionProgressState;
7
+ label: string;
8
+ completePct: number;
9
+ activeWidthPct: number;
10
+ };
11
+ export declare function transactionProgressView({ status, inputSymbol, txHash, actionError, approvalRequired, approvalDone }: {
12
+ status: SubmitStatus;
13
+ inputSymbol: string;
14
+ txHash: Hex | null;
15
+ actionError: string | null;
16
+ approvalRequired: boolean;
17
+ approvalDone: boolean;
18
+ }): TransactionProgressView | null;
package/dist/wallet.d.ts CHANGED
@@ -1,23 +1,34 @@
1
- import { type Address } from 'viem';
1
+ import { type Address, type Chain, type PublicClient } from 'viem';
2
2
  export type Eip1193Provider = {
3
3
  request<T = unknown>(args: {
4
4
  method: string;
5
5
  params?: unknown[] | Record<string, unknown>;
6
6
  }): Promise<T>;
7
7
  };
8
- declare global {
9
- interface Window {
10
- ethereum?: Eip1193Provider;
11
- }
12
- }
8
+ export type ProviderChainConfig = {
9
+ chainId: number;
10
+ name?: string;
11
+ rpcUrls?: string[];
12
+ chain?: Pick<Chain, 'name' | 'nativeCurrency' | 'rpcUrls' | 'blockExplorers'>;
13
+ };
14
+ export type AegisSwapProviderResolver = () => Eip1193Provider | null | Promise<Eip1193Provider | null>;
15
+ export type AegisSwapWalletConnection = Eip1193Provider | {
16
+ provider?: Eip1193Provider | null;
17
+ account?: Address | string | null;
18
+ } | null;
13
19
  export declare function getInjectedProvider(): Eip1193Provider | null;
14
20
  export declare function normalizeAccount(value: unknown): Address | null;
21
+ export declare function isEip1193Provider(value: unknown): value is Eip1193Provider;
22
+ export declare function normalizeWalletConnection(connection: AegisSwapWalletConnection | void): {
23
+ provider: Eip1193Provider | null;
24
+ account: Address | null;
25
+ };
15
26
  export declare function getProviderAccount(provider: Eip1193Provider): Promise<Address | null>;
16
27
  export declare function requestProviderAccount(provider: Eip1193Provider): Promise<Address | null>;
17
28
  export declare function getProviderChainId(provider: Eip1193Provider): Promise<number | null>;
18
- export declare function switchProviderChain(provider: Eip1193Provider, chainId: number): Promise<void>;
29
+ export declare function switchProviderChain(provider: Eip1193Provider, chain: number | ProviderChainConfig): Promise<void>;
30
+ export declare function createSwapPublicClient(chain: Chain, rpcUrls: readonly string[]): PublicClient;
19
31
  export declare function subscribeProvider(provider: Eip1193Provider, handlers: {
20
32
  onAccountsChanged?: () => void;
21
33
  onChainChanged?: () => void;
22
34
  }): () => void;
23
- //# sourceMappingURL=wallet.d.ts.map
@@ -0,0 +1,4 @@
1
+ import type { AegisDirectSwapWidgetProps } from './types';
2
+ export declare function AegisDirectSwapWidget({ provider, account, getProvider, onConnectWallet, onSubmitted, onSuccess, onError, onQuote, chainId, chains, pools, defaultPoolId, poolIds: poolIdOrder, targets, markets, defaultDirection, defaultSlippagePercent, rpcUrls, metadataEndpoint, className, style, title, subtitle, ariaLabel, theme, accentColor, accentTextColor, showPoolLink, defaultApprovalMode, showApprovalModeControl, showExecutionDetails, defaultExecutionDetailsOpen }: AegisDirectSwapWidgetProps): import("react").JSX.Element;
3
+ export declare const AegisSwapWidget: typeof AegisDirectSwapWidget;
4
+ export default AegisDirectSwapWidget;
@@ -0,0 +1,17 @@
1
+ import type { AegisSwapToken } from '../config';
2
+ import { type TokenMetadataByAddress } from '../components/icons';
3
+ export declare function AmountField({ inputId, label, token, value, balance, invalid, busy, metadataByAddress, onChange, quickActions }: {
4
+ inputId: string;
5
+ label: string;
6
+ token: AegisSwapToken;
7
+ value: string;
8
+ balance: bigint | null;
9
+ invalid: boolean;
10
+ busy: boolean;
11
+ metadataByAddress: TokenMetadataByAddress;
12
+ onChange: (value: string) => void;
13
+ quickActions?: {
14
+ onHalf: () => void;
15
+ onMax: () => void;
16
+ };
17
+ }): import("react").JSX.Element;