@circle-fin/app-kit 1.14.0 → 1.15.1

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 (53) hide show
  1. package/CHANGELOG.md +72 -0
  2. package/README.md +3 -3
  3. package/bridge.cjs +7464 -454
  4. package/bridge.d.cts +585 -61
  5. package/bridge.d.mts +585 -61
  6. package/bridge.d.ts +585 -61
  7. package/bridge.mjs +7464 -454
  8. package/chains.cjs +146 -5
  9. package/chains.d.cts +108 -2
  10. package/chains.d.mts +108 -2
  11. package/chains.d.ts +108 -2
  12. package/chains.mjs +146 -6
  13. package/context.d.cts +522 -57
  14. package/context.d.mts +522 -57
  15. package/context.d.ts +522 -57
  16. package/earn.cjs +478 -181
  17. package/earn.d.cts +522 -57
  18. package/earn.d.mts +522 -57
  19. package/earn.d.ts +522 -57
  20. package/earn.mjs +478 -181
  21. package/estimateBridge.cjs +7464 -457
  22. package/estimateBridge.d.cts +643 -82
  23. package/estimateBridge.d.mts +643 -82
  24. package/estimateBridge.d.ts +643 -82
  25. package/estimateBridge.mjs +7464 -457
  26. package/estimateSwap.cjs +528 -185
  27. package/estimateSwap.d.cts +522 -57
  28. package/estimateSwap.d.mts +522 -57
  29. package/estimateSwap.d.ts +522 -57
  30. package/estimateSwap.mjs +528 -185
  31. package/index.cjs +11548 -2936
  32. package/index.d.cts +5073 -1738
  33. package/index.d.mts +5073 -1738
  34. package/index.d.ts +5073 -1738
  35. package/index.mjs +11547 -2937
  36. package/package.json +17 -6
  37. package/server.cjs +10040 -0
  38. package/server.cjs.map +1 -0
  39. package/server.d.cts +2467 -0
  40. package/server.d.mts +2467 -0
  41. package/server.d.ts +2467 -0
  42. package/server.mjs +10028 -0
  43. package/server.mjs.map +1 -0
  44. package/swap.cjs +528 -185
  45. package/swap.d.cts +522 -57
  46. package/swap.d.mts +522 -57
  47. package/swap.d.ts +522 -57
  48. package/swap.mjs +528 -185
  49. package/unifiedBalance.cjs +742 -44
  50. package/unifiedBalance.d.cts +223 -1
  51. package/unifiedBalance.d.mts +223 -1
  52. package/unifiedBalance.d.ts +223 -1
  53. package/unifiedBalance.mjs +742 -44
package/swap.d.cts CHANGED
@@ -167,6 +167,30 @@ interface BaseChainDefinition {
167
167
  * ```
168
168
  */
169
169
  kitContracts?: KitContracts;
170
+ /**
171
+ * Optional CCTPx configuration.
172
+ *
173
+ * @description When provided, the chain supports CCTPx (Cross-Chain Token Service).
174
+ * CCTPx is a service-level protocol layered on top of CCTP v2's message-passing layer
175
+ * that enables cross-chain transfers of registered tokens (Circle-issued or otherwise).
176
+ *
177
+ * The CCTS contract is deployed via CREATE3 so its address is deterministic and may
178
+ * be committed to chain config ahead of the on-chain deployment.
179
+ *
180
+ * Use the {@link isCCTPXSupported} type guard to check if a chain has CCTPx support
181
+ * before accessing this property.
182
+ *
183
+ * @example
184
+ * ```typescript
185
+ * if (isCCTPXSupported(chain)) {
186
+ * console.log('CCTS address:', chain.cctpx.serviceAddress)
187
+ * }
188
+ * ```
189
+ *
190
+ * @see {@link CCTPXChainConfig} for the structure of CCTPx configuration.
191
+ * @see {@link isCCTPXSupported} for checking CCTPx support.
192
+ */
193
+ cctpx?: CCTPXChainConfig;
170
194
  /**
171
195
  * Optional Gateway contract configuration for Gateway protocol support.
172
196
  *
@@ -486,6 +510,34 @@ interface CCTPConfig {
486
510
  destination: boolean;
487
511
  };
488
512
  }
513
+ /**
514
+ * Configuration for Circle's Cross-Chain Token Service (CCTS) — the CCTPx protocol.
515
+ *
516
+ * @category Types
517
+ *
518
+ * @description Contains the CCTS proxy contract address on a given chain. The CCTS
519
+ * contract is the service-level entry point for CCTPx cross-chain transfers of
520
+ * registered tokens (Circle-issued or otherwise). Addresses are deterministic via CREATE3
521
+ * and may be committed to chain config ahead of the on-chain deploy.
522
+ *
523
+ * @example
524
+ * ```typescript
525
+ * const cctpxConfig: CCTPXChainConfig = {
526
+ * serviceAddress: '0x1234567890abcdef1234567890abcdef12345678'
527
+ * }
528
+ * ```
529
+ */
530
+ interface CCTPXChainConfig {
531
+ /**
532
+ * The CrossChainTokenService (CCTS) proxy contract address on this chain.
533
+ *
534
+ * @description Deterministic CREATE3 address. Used by the SDK as the `to` field
535
+ * when calling `crossChainTransfer` and `resolveTokenManager`.
536
+ *
537
+ * @example "0x1234567890abcdef1234567890abcdef12345678"
538
+ */
539
+ serviceAddress: string;
540
+ }
489
541
  /**
490
542
  * Available kit contract types for enhanced chain functionality.
491
543
  *
@@ -692,9 +744,10 @@ declare enum Blockchain {
692
744
  Algorand_Testnet = "Algorand_Testnet",
693
745
  Aptos = "Aptos",
694
746
  Aptos_Testnet = "Aptos_Testnet",
695
- Arc_Testnet = "Arc_Testnet",
696
747
  Arbitrum = "Arbitrum",
697
748
  Arbitrum_Sepolia = "Arbitrum_Sepolia",
749
+ Arc = "Arc",
750
+ Arc_Testnet = "Arc_Testnet",
698
751
  Avalanche = "Avalanche",
699
752
  Avalanche_Fuji = "Avalanche_Fuji",
700
753
  Base = "Base",
@@ -873,6 +926,7 @@ declare enum SwapChain {
873
926
  XDC = "XDC",
874
927
  HyperEVM = "HyperEVM",
875
928
  Monad = "Monad",
929
+ Arc = "Arc",
876
930
  Arc_Testnet = "Arc_Testnet"
877
931
  }
878
932
  /**
@@ -886,7 +940,7 @@ declare enum SwapChain {
886
940
  * Use `isSwapSupportedChain()` for runtime validation.
887
941
  */
888
942
  type SwapChainDefinition = ChainDefinition & {
889
- chain: Blockchain.Ethereum | Blockchain.Base | Blockchain.Polygon | Blockchain.Solana | Blockchain.Arbitrum | Blockchain.Optimism | Blockchain.Avalanche | Blockchain.Linea | Blockchain.Ink | Blockchain.World_Chain | Blockchain.Unichain | Blockchain.Plume | Blockchain.Sei | Blockchain.Sonic | Blockchain.XDC | Blockchain.HyperEVM | Blockchain.Monad | Blockchain.Arc_Testnet;
943
+ chain: Blockchain.Ethereum | Blockchain.Base | Blockchain.Polygon | Blockchain.Solana | Blockchain.Arbitrum | Blockchain.Optimism | Blockchain.Avalanche | Blockchain.Linea | Blockchain.Ink | Blockchain.World_Chain | Blockchain.Unichain | Blockchain.Plume | Blockchain.Sei | Blockchain.Sonic | Blockchain.XDC | Blockchain.HyperEVM | Blockchain.Monad | Blockchain.Arc | Blockchain.Arc_Testnet;
890
944
  };
891
945
  /**
892
946
  * Chain identifier accepted by swap operations.
@@ -947,6 +1001,7 @@ type SwapChainIdentifier = SwapChainDefinition | SwapChain | `${SwapChain}`;
947
1001
  */
948
1002
  declare enum BridgeChain {
949
1003
  Arbitrum = "Arbitrum",
1004
+ Arc = "Arc",
950
1005
  Avalanche = "Avalanche",
951
1006
  Base = "Base",
952
1007
  Codex = "Codex",
@@ -1043,6 +1098,7 @@ type BridgeChainIdentifier = ChainDefinition | BridgeChain | `${BridgeChain}`;
1043
1098
  * ```
1044
1099
  */
1045
1100
  declare enum EarnChain {
1101
+ Arc = "Arc",
1046
1102
  Arc_Testnet = "Arc_Testnet"
1047
1103
  }
1048
1104
  /**
@@ -1076,7 +1132,7 @@ type EarnChainIdentifier = EarnChainDefinition | EarnChain | `${EarnChain}`;
1076
1132
  * console.log(EARN_BRIDGE_SOURCE_BLOCKCHAINS.join(', '))
1077
1133
  * ```
1078
1134
  */
1079
- declare const EARN_BRIDGE_SOURCE_BLOCKCHAINS: readonly [Blockchain.Arbitrum_Sepolia, Blockchain.Base_Sepolia, Blockchain.Ethereum_Sepolia];
1135
+ declare const EARN_BRIDGE_SOURCE_BLOCKCHAINS: readonly [Blockchain.Arbitrum, Blockchain.Arbitrum_Sepolia, Blockchain.Base, Blockchain.Base_Sepolia, Blockchain.Ethereum, Blockchain.Ethereum_Sepolia];
1080
1136
  /**
1081
1137
  * Blockchains supported as the source chain for cross-chain Earn deposits.
1082
1138
  *
@@ -1116,13 +1172,13 @@ type EarnBridgeSourceChainIdentifier = EarnBridgeSourceChainDefinition | EarnBri
1116
1172
  * console.log(EARN_BRIDGE_DESTINATION_BLOCKCHAINS.join(', '))
1117
1173
  * ```
1118
1174
  */
1119
- declare const EARN_BRIDGE_DESTINATION_BLOCKCHAINS: readonly [Blockchain.Arc_Testnet];
1175
+ declare const EARN_BRIDGE_DESTINATION_BLOCKCHAINS: readonly [Blockchain.Arc, Blockchain.Arc_Testnet];
1120
1176
  /**
1121
1177
  * Blockchains supported as the destination (vault) chain for cross-chain Earn
1122
1178
  * deposits.
1123
1179
  *
1124
1180
  * Intentionally narrower than {@link EarnChain}: cross-chain deposits
1125
- * currently land only on Arc Testnet.
1181
+ * land on Arc (mainnet) or Arc Testnet.
1126
1182
  */
1127
1183
  type EarnBridgeDestinationBlockchain = (typeof EARN_BRIDGE_DESTINATION_BLOCKCHAINS)[number];
1128
1184
  /**
@@ -1135,13 +1191,13 @@ type EarnBridgeDestinationChainDefinition = ChainDefinition & {
1135
1191
  };
1136
1192
  /**
1137
1193
  * Chain identifier accepted for the destination (vault) side of a cross-chain
1138
- * Earn deposit. Constrains the destination to Arc Testnet.
1194
+ * Earn deposit. Constrains the destination to Arc or Arc Testnet.
1139
1195
  *
1140
1196
  * @example
1141
1197
  * ```typescript
1142
1198
  * import type { EarnBridgeDestinationChainIdentifier } from '@core/chains'
1143
1199
  *
1144
- * const destination: EarnBridgeDestinationChainIdentifier = 'Arc_Testnet'
1200
+ * const destination: EarnBridgeDestinationChainIdentifier = 'Arc'
1145
1201
  * ```
1146
1202
  */
1147
1203
  type EarnBridgeDestinationChainIdentifier = EarnBridgeDestinationChainDefinition | EarnBridgeDestinationBlockchain | `${EarnBridgeDestinationBlockchain}`;
@@ -2358,6 +2414,171 @@ interface CCTPActionMap {
2358
2414
  readonly v2: CCTPv2ActionMap;
2359
2415
  }
2360
2416
 
2417
+ /**
2418
+ * Action map for Circle's CCTPx protocol operations.
2419
+ *
2420
+ * Define the parameter schemas for CCTPx actions that enable cross-chain transfers
2421
+ * of registered tokens (Circle-issued or otherwise) through Circle's `CrossChainTokenService`
2422
+ * (CCTS) contract.
2423
+ *
2424
+ * @remarks
2425
+ * CCTPx is a service-level protocol layered on top of CCTP v2's message-passing layer.
2426
+ * The CCTS contract coordinates token locking/burning, fee collection, and cross-chain
2427
+ * message dispatch. The SDK obtains a signed fee quote from IRIS, then calls
2428
+ * `crossChainTransfer` on CCTS with the quote bytes verbatim and the native fee as
2429
+ * `msg.value`. The auto-relay flow handled by Circle's Orbit relayer (paid for via the
2430
+ * `FORWARD` fee component included in the signed quote) means no separate
2431
+ * `receiveMessage` step is required on the destination.
2432
+ *
2433
+ * USDC and EURC bridging continues to use CCTP v2 (`cctp.v2.*`) actions, not CCTPx.
2434
+ *
2435
+ * @example
2436
+ * ```typescript
2437
+ * import type { ActionPayload } from '@core/adapter'
2438
+ *
2439
+ * const transferParams: ActionPayload<'cctpx.crossChainTransfer'> = {
2440
+ * tokenId: '0xabc123...',
2441
+ * amount: 1_000_000n,
2442
+ * destinationDomain: 1,
2443
+ * destinationAddress: '0xRecipient',
2444
+ * destinationCaller: '0x0000000000000000000000000000000000000000000000000000000000000000',
2445
+ * minFinalityThreshold: 1000,
2446
+ * claim: { signedQuote: '0xdeadbeef...', refundAddress: '0xSenderEOA...' },
2447
+ * autoExecuteHookData: false,
2448
+ * hookData: '0x',
2449
+ * serviceAddress: '0xCCTSProxy...',
2450
+ * nativeFeeAmount: 100_000n,
2451
+ * fromChain,
2452
+ * }
2453
+ * ```
2454
+ */
2455
+ interface CCTPXActionMap {
2456
+ /**
2457
+ * Initiate a CCTPx cross-chain transfer through the `CrossChainTokenService` contract.
2458
+ *
2459
+ * Encode and submit a `crossChainTransfer(...)` call to the CCTS proxy on the source
2460
+ * chain, passing the IRIS-signed fee quote bytes verbatim and the native fee as
2461
+ * `msg.value`. The contract emits CCTP v2's `MessageSent` event, which IRIS attests
2462
+ * to before Circle's Orbit relayer auto-executes the destination mint.
2463
+ *
2464
+ * @remarks
2465
+ * The caller (typically `CCTPXBridgingProvider`) is responsible for:
2466
+ * - Resolving `tokenId` and the per-chain `tokenAddress` from the IRIS token registry
2467
+ * - Approving the per-token `TokenManager` for `amount` before this call
2468
+ * - Fetching `claim.signedQuote` and computing `nativeFeeAmount` from IRIS
2469
+ *
2470
+ * This action only encodes and submits the on-chain call; it does not perform any
2471
+ * off-chain orchestration.
2472
+ */
2473
+ crossChainTransfer: ActionParameters & {
2474
+ /**
2475
+ * The CCTPx tokenId for the asset being transferred.
2476
+ *
2477
+ * Provided as a 32-byte hex string assigned by CCTPx at registration time.
2478
+ * The same `tokenId` is used across all chains for a given token; per-chain
2479
+ * `tokenAddress` is resolved from the IRIS token registry separately.
2480
+ */
2481
+ tokenId: string;
2482
+ /**
2483
+ * Amount of the token to transfer, in the token's smallest units.
2484
+ */
2485
+ amount: bigint;
2486
+ /**
2487
+ * CCTP domain identifier of the destination chain.
2488
+ *
2489
+ * CCTPx reuses CCTP v2 domain numbering; pass `dstChain.cctp.domain`.
2490
+ */
2491
+ destinationDomain: number;
2492
+ /**
2493
+ * Recipient address on the destination chain, encoded as bytes.
2494
+ *
2495
+ * For EVM destinations this is a 20-byte address encoded as a hex string.
2496
+ */
2497
+ destinationAddress: string;
2498
+ /**
2499
+ * `bytes32` value restricting which address may execute on the destination.
2500
+ *
2501
+ * Omit (or pass the 32-byte zero hash) to allow permissionless relay — the
2502
+ * default for auto-relayed CCTPx transfers. When omitted, the handler
2503
+ * substitutes the zero hash.
2504
+ *
2505
+ * @defaultValue `ZERO_HASH` — permissionless relay
2506
+ */
2507
+ destinationCaller?: string;
2508
+ /**
2509
+ * Minimum finality threshold for attestation eligibility.
2510
+ *
2511
+ * Use `1000` for FAST transfers (pre-finality) or `2000` for SLOW transfers
2512
+ * (full finality). For FAST, the `claim.signedQuote` must include a
2513
+ * `PRE_FINALITY` item; otherwise the on-chain call reverts.
2514
+ */
2515
+ minFinalityThreshold: number;
2516
+ /**
2517
+ * The CCTS fee-quote claim — maps 1:1 to the on-chain
2518
+ * `IFeeManager.QuoteClaim` tuple.
2519
+ *
2520
+ * The contract requires a tuple here, not a flat bytes blob. Encoding the
2521
+ * signed quote without the tuple wrapper produces a different function
2522
+ * selector and the call will revert.
2523
+ */
2524
+ claim: {
2525
+ /**
2526
+ * IRIS-signed fee quote bytes, passed verbatim to the contract.
2527
+ *
2528
+ * Obtained from `POST /v1/quote/cctpx/{tokenId}/{src}/{dst}`. Contains the
2529
+ * version-prefixed ABI-encoded `Quote` struct and Circle's signature; the
2530
+ * `FeeManager` contract validates the signature against the quote items.
2531
+ */
2532
+ signedQuote: string;
2533
+ /**
2534
+ * Address that receives any native-fee refund from `FeeManager`.
2535
+ *
2536
+ * Forwarded verbatim to `FeeManager` for refund attribution. The contract
2537
+ * accepts `address(0)` (the zero address) to disable refunds, so omitting
2538
+ * this field is safe; the handler will substitute the zero address.
2539
+ *
2540
+ * @defaultValue `ZERO_ADDRESS` — refunds disabled
2541
+ */
2542
+ refundAddress?: string;
2543
+ };
2544
+ /**
2545
+ * Whether the destination chain should auto-execute the hook data.
2546
+ *
2547
+ * For basic transfers this is `false`. Reserved for advanced integrations
2548
+ * that bundle a post-mint hook on the destination.
2549
+ */
2550
+ autoExecuteHookData: boolean;
2551
+ /**
2552
+ * Optional hook data bytes passed through to the destination handler.
2553
+ *
2554
+ * Pass `'0x'` (empty bytes) for basic transfers.
2555
+ */
2556
+ hookData: string;
2557
+ /**
2558
+ * The `CrossChainTokenService` proxy address on the source chain.
2559
+ *
2560
+ * Used as the transaction `to` field. Typically sourced from
2561
+ * `srcChain.cctpx.serviceAddress` — but is passed as an explicit parameter
2562
+ * so the action does not depend on chain-config narrowing at the call site.
2563
+ */
2564
+ serviceAddress: string;
2565
+ /**
2566
+ * Native gas amount to send as `msg.value`.
2567
+ *
2568
+ * Must exactly equal `sum(quote.items[].amount)` when `feeToken` is the
2569
+ * native currency (the P0 default). The contract verifies the value against
2570
+ * the signed quote; do not over-send.
2571
+ */
2572
+ nativeFeeAmount: bigint;
2573
+ /**
2574
+ * Source chain definition.
2575
+ *
2576
+ * Provides the adapter with chain context (chainId, RPC, etc.) for the call.
2577
+ */
2578
+ fromChain: ChainDefinition;
2579
+ };
2580
+ }
2581
+
2361
2582
  /**
2362
2583
  * Permit signature standards for gasless token approvals.
2363
2584
  *
@@ -3453,6 +3674,8 @@ interface NativeActionMap {
3453
3674
  interface ActionMap {
3454
3675
  /** CCTP-specific operations with automatic address resolution. */
3455
3676
  readonly cctp: CCTPActionMap;
3677
+ /** CCTPx operations (CrossChainTokenService) for cross-chain transfers of registered tokens (Circle-issued or otherwise). */
3678
+ readonly cctpx: CCTPXActionMap;
3456
3679
  /** Gateway Wallet operations, versioned (e.g. gateway.v1.deposit). */
3457
3680
  readonly gateway: GatewayActionMap;
3458
3681
  /** Native token operations (ETH, SOL, MATIC, etc.). */
@@ -4577,29 +4800,15 @@ interface TokenSymbolRegistry {
4577
4800
  */
4578
4801
  type TokenSymbol = keyof TokenSymbolRegistry extends never ? string : LiteralUnion<Extract<keyof TokenSymbolRegistry, string>>;
4579
4802
  /**
4580
- * Selector for identifying a token.
4803
+ * Token selector accepted by adapters and the static
4804
+ * {@link TokenRegistry.resolve} method.
4581
4805
  *
4582
4806
  * @remarks
4583
- * Can be one of:
4584
- * - A symbol string (e.g., "USDC") - resolves from registry
4585
- * - A raw locator object with explicit decimals - for arbitrary tokens
4586
- *
4587
- * Using a symbol is preferred when the token is in the registry, as it
4588
- * automatically resolves decimals and the correct chain address.
4589
- *
4590
- * @example
4591
- * ```typescript
4592
- * // By symbol (preferred for known tokens)
4593
- * const selector1: TokenSelector = 'USDC'
4594
- *
4595
- * // By raw locator (for arbitrary tokens)
4596
- * const selector2: TokenSelector = {
4597
- * locator: '0x1234...',
4598
- * decimals: 18,
4599
- * }
4600
- * ```
4807
+ * Keep this alias at adapter and registry boundaries so their accepted token
4808
+ * forms remain explicit even when other product surfaces define narrower
4809
+ * token inputs.
4601
4810
  */
4602
- type TokenSelector = TokenSymbol | RawTokenSelector;
4811
+ type RegistryTokenSelector = TokenSymbol | RawTokenSelector;
4603
4812
  /**
4604
4813
  * The resolved token information after registry lookup.
4605
4814
  *
@@ -4649,12 +4858,12 @@ interface TokenRegistry {
4649
4858
  /**
4650
4859
  * Resolve a token selector to concrete token information for a chain.
4651
4860
  *
4652
- * @param selector - The token to resolve (symbol or raw locator).
4861
+ * @param selector - The token to resolve. Accepts a symbol or raw locator.
4653
4862
  * @param chainId - The chain identifier to resolve for.
4654
4863
  * @returns The resolved token information.
4655
4864
  * @throws When the token cannot be resolved (unknown symbol, missing decimals, etc.).
4656
4865
  */
4657
- resolve(selector: TokenSelector, chainId: ChainIdentifier): ResolvedToken;
4866
+ resolve(selector: RegistryTokenSelector, chainId: ChainIdentifier): ResolvedToken;
4658
4867
  /**
4659
4868
  * Resolve a token by chain-specific locator (address/program ID).
4660
4869
  *
@@ -5476,6 +5685,13 @@ TChainDefinition extends ChainDefinition = ChainDefinition> extends WalletContex
5476
5685
  * Must be a valid address format for the specified blockchain.
5477
5686
  */
5478
5687
  recipientAddress?: string;
5688
+ /**
5689
+ * Whether Circle's relayer submits the destination transaction.
5690
+ *
5691
+ * How an omitted value resolves, and whether an explicit `false` is accepted,
5692
+ * is provider-specific.
5693
+ */
5694
+ useForwarder?: boolean;
5479
5695
  /**
5480
5696
  * Optional destination dApp deposit action for a fast cross-chain transfer.
5481
5697
  *
@@ -5528,17 +5744,70 @@ interface BridgeParams$1<TFromCapabilities extends AdapterCapabilities = Adapter
5528
5744
  *
5529
5745
  * @defaultValue ChainDefinition
5530
5746
  */
5531
- TChainDefinition extends ChainDefinition = ChainDefinition> {
5747
+ TChainDefinition extends ChainDefinition = ChainDefinition,
5748
+ /**
5749
+ * The token type the provider accepts.
5750
+ *
5751
+ * @defaultValue 'USDC'
5752
+ *
5753
+ * @remarks
5754
+ * The default preserves the original USDC-only contract for consumers that
5755
+ * omit the token type. Providers that accept a different token type pass
5756
+ * `TToken` explicitly.
5757
+ *
5758
+ * @example
5759
+ * ```typescript
5760
+ * // Default — TToken resolves to 'USDC'
5761
+ * type DefaultParams = BridgeParams // params.token is typed as 'USDC'
5762
+ *
5763
+ * // Provider that identifies tokens by a hex string template literal
5764
+ * type HexTokenParams = BridgeParams<
5765
+ * AdapterCapabilities,
5766
+ * AdapterCapabilities,
5767
+ * ChainDefinition,
5768
+ * `0x${string}`
5769
+ * > // params.token is typed as `0x${string}`
5770
+ * ```
5771
+ */
5772
+ TToken extends string = 'USDC'> {
5532
5773
  /** The source adapter containing wallet and chain information */
5533
5774
  source: WalletContext<TFromCapabilities, TChainDefinition>;
5534
5775
  /** The destination adapter containing wallet and chain information */
5535
5776
  destination: DestinationWalletContext<TToCapabilities, TChainDefinition>;
5536
5777
  /** The amount to transfer (as a string to avoid precision issues) */
5537
5778
  amount: string;
5538
- /** The token to transfer (currently only USDC is supported) */
5539
- token: 'USDC';
5779
+ /** The token to transfer (provider-defined; defaults to `'USDC'`) */
5780
+ token: TToken;
5540
5781
  /** Bridge configuration (e.g., fast burn settings) */
5541
5782
  config: BridgeConfig;
5783
+ /**
5784
+ * Optional server-signed quote to reuse, typically the
5785
+ * {@link EstimateResult.quote} returned by an earlier `estimate` call.
5786
+ *
5787
+ * When present and still valid, a provider with a server-signed quote
5788
+ * model may reuse it instead of fetching a fresh quote, so the fee the
5789
+ * caller was quoted is the fee they pay. Providers decide when a reused
5790
+ * quote is still valid (e.g. freshness, fee token, speed); an unusable or
5791
+ * mismatched quote is ignored and a fresh one is fetched. Transfer
5792
+ * parameters are validated by the provider's on-chain contract, so a quote
5793
+ * reused for a different transfer is rejected there rather than silently.
5794
+ * Providers without a quote model ignore this field entirely, and do so
5795
+ * silently — nothing verifies that a quote reached the provider that issued
5796
+ * it, because the route is matched to a provider only after these
5797
+ * parameters are validated. A quote is meaningful only on the route that
5798
+ * produced it.
5799
+ *
5800
+ * Typed `unknown`: a caller reaches `bridge` through a provider-agnostic
5801
+ * surface, so this shared type names no provider's shape. It is public
5802
+ * input in any case, and is validated before any field is read — by the
5803
+ * provider that serves the route, or by the kit for routes it prices
5804
+ * itself. Treat it as opaque and pass it back unmodified.
5805
+ *
5806
+ * This is a `bridge` input. A quote is an output of `estimate`, not an
5807
+ * input to it — `estimate` always returns a freshly-priced quote, and a
5808
+ * provider may reject a quote passed to `estimate` rather than ignore it.
5809
+ */
5810
+ quote?: unknown;
5542
5811
  /**
5543
5812
  * Optional invocation metadata for tracing and correlation.
5544
5813
  *
@@ -5648,6 +5917,14 @@ interface BridgeConfig {
5648
5917
  * ```
5649
5918
  */
5650
5919
  customFee?: CustomFee | undefined;
5920
+ /**
5921
+ * Which leg pays the protocol fee.
5922
+ *
5923
+ * `'source'` leaves the delivered amount unreduced; `'destination'` takes the
5924
+ * fee from it. Omit it to let the routed provider decide — a provider rejects
5925
+ * a value it cannot honour.
5926
+ */
5927
+ feePayment?: 'source' | 'destination' | undefined;
5651
5928
  }
5652
5929
  /**
5653
5930
  * Custom fee configuration charged by the integrator.
@@ -5844,13 +6121,14 @@ interface ForwarderDestination<TChainIdentifier extends ChainIdentifier$1 = Chai
5844
6121
  */
5845
6122
  type BridgeDestination<TAdapterCapabilities extends AdapterCapabilities = AdapterCapabilities, TChainIdentifier extends ChainIdentifier$1 = ChainIdentifier$1> = ((AdapterContext<TAdapterCapabilities, TChainIdentifier> | BridgeDestinationWithAddress<TAdapterCapabilities, TChainIdentifier>) & {
5846
6123
  /**
5847
- * Enable Circle's Forwarder to handle the mint transaction.
6124
+ * Enable Circle's relayer to submit the destination transaction.
5848
6125
  *
5849
- * When true, Circle's Orbit relayer will fetch the attestation and submit
5850
- * the mint transaction on the user's behalf. The relay fee is deducted from
5851
- * the minted USDC at mint time.
6126
+ * Where the relay fee is charged depends on the route and on
6127
+ * {@link BridgeConfig.feePayment}: it may be taken from the amount that
6128
+ * arrives, or priced into a quote the source transaction pays.
5852
6129
  *
5853
- * @defaultValue false
6130
+ * Whether the option is required, optional, or refused depends on the
6131
+ * routed provider and the rest of the config.
5854
6132
  */
5855
6133
  useForwarder?: boolean;
5856
6134
  }) | ForwarderDestination<TChainIdentifier>;
@@ -6870,13 +7148,82 @@ interface SwapParams<TFromAdapterCapabilities extends AdapterCapabilities = Adap
6870
7148
  }
6871
7149
 
6872
7150
  /**
6873
- * Configure how CCTP and forwarding fees are collected for a bridge.
7151
+ * Display symbols the provider recognizes as a convenience for callers.
7152
+ *
7153
+ * A consumer may pass one of these symbols instead of a raw bytes32 token
7154
+ * id; the provider resolves it to the symbol's canonical bytes32 id via
7155
+ * {@link KNOWN_TOKEN_IDS_BY_NETWORK} (a symbol can map to more than one
7156
+ * bridge, so the map pins the canonical one). This list does NOT gate
7157
+ * routability: any token the IRIS registry lists with deployments on both
7158
+ * endpoints routes when passed by its bytes32 id, whether listed here or
7159
+ * not.
7160
+ *
7161
+ * @example
7162
+ * ```typescript
7163
+ * for (const symbol of KNOWN_TOKEN_SYMBOLS) console.log(symbol)
7164
+ * ```
7165
+ */
7166
+ declare const KNOWN_TOKEN_SYMBOLS: readonly ["cirBTC", "wETH", "EURC"];
7167
+ /**
7168
+ * A known token symbol. Derived from {@link KNOWN_TOKEN_SYMBOLS} so the
7169
+ * type and the runtime set never drift.
7170
+ *
7171
+ * @example
7172
+ * ```typescript
7173
+ * const sym: KnownTokenSymbol = 'cirBTC'
7174
+ * ```
7175
+ */
7176
+ type KnownTokenSymbol = (typeof KNOWN_TOKEN_SYMBOLS)[number];
7177
+
7178
+ /**
7179
+ * CCTPx token identifier: a bytes32 hex string. Within one CrossChainTokenService
7180
+ * deployment it names the same registered token on every chain that deployment
7181
+ * spans, which is what makes a cross-chain transfer addressable by id alone. Passed verbatim to the
7182
+ * `CrossChainTokenService.crossChainTransfer` contract call and used as the
7183
+ * `tokenId` path segment on the IRIS fee-quote endpoint.
7184
+ */
7185
+ type CCTPXTokenId = `0x${string}`;
7186
+ /**
7187
+ * A token value accepted by {@link CCTPXTokenId}-keyed route checks.
7188
+ *
7189
+ * The provider's `supportsRoute` accepts either a {@link KnownTokenSymbol},
7190
+ * which it resolves to a bytes32 id via the per-network map, or a
7191
+ * {@link CCTPXTokenId} passed directly. This union is the honest type of what
7192
+ * the route check accepts, so callers and JSDoc examples never need an `as`
7193
+ * cast to pass a symbol.
7194
+ *
7195
+ * @example
7196
+ * ```typescript
7197
+ * const bySymbol: CCTPXRouteToken = 'cirBTC'
7198
+ * const byId: CCTPXRouteToken =
7199
+ * '0x0000000000000000000000000000000000000000000000000000000063697254'
7200
+ * ```
7201
+ */
7202
+ type CCTPXRouteToken = CCTPXTokenId | KnownTokenSymbol;
7203
+
7204
+ /**
7205
+ * Token string accepted by `bridge` / `estimate`.
7206
+ *
7207
+ * Use `'USDC'` for CCTP v2, a known CCTPx symbol (`'cirBTC'`, `'wETH'`,
7208
+ * `'EURC'`), or a 32-byte hex CCTPx token id.
7209
+ *
7210
+ * @example
7211
+ * ```typescript
7212
+ * import type { BridgeToken } from '@circle-fin/bridge-kit'
7213
+ *
7214
+ * const usdc: BridgeToken = 'USDC'
7215
+ * const eurc: BridgeToken = 'EURC'
7216
+ * const tokenId: BridgeToken =
7217
+ * '0x0000000000000000000000000000000000000000000000000000000063697254'
7218
+ * ```
7219
+ */
7220
+ type BridgeToken = 'USDC' | CCTPXRouteToken;
7221
+ /**
7222
+ * Configuration accepted by `bridge` and `estimate`.
6874
7223
  *
6875
7224
  * @remarks
6876
- * Use `'source'` with `to.useForwarder: true` to treat `amount` as the exact
6877
- * destination amount. Bridge Kit obtains a signed fee quote, collects the fee
6878
- * in source-chain USDC, and leaves the destination mint unreduced. Omit the
6879
- * option (or use `'destination'`) to preserve the existing max-fee behavior.
7225
+ * The kit's name for {@link BridgeConfig}, kept as the parameter type so a
7226
+ * kit-only option can be added here without touching the provider-facing config.
6880
7227
  *
6881
7228
  * @example
6882
7229
  * ```typescript
@@ -6889,10 +7236,7 @@ interface SwapParams<TFromAdapterCapabilities extends AdapterCapabilities = Adap
6889
7236
  * ```
6890
7237
  * @since 1.14.0
6891
7238
  */
6892
- interface BridgeExecutionConfig extends BridgeConfig {
6893
- /** Select source-side signed fees or the legacy destination-side fee path. */
6894
- feePayment?: 'source' | 'destination';
6895
- }
7239
+ type BridgeExecutionConfig = BridgeConfig;
6896
7240
  type FeeFunction<TFromAdapterCapabilities extends AdapterCapabilities, TToAdapterCapabilities extends AdapterCapabilities> = (params: BridgeParams$1<TFromAdapterCapabilities, TToAdapterCapabilities>) => Promise<string> | string;
6897
7241
  type FeeRecipientFunction<TFromAdapterCapabilities extends AdapterCapabilities, TToAdapterCapabilities extends AdapterCapabilities> = (feePayoutChain: ChainDefinition, params: BridgeParams$1<TFromAdapterCapabilities, TToAdapterCapabilities>) => Promise<string> | string;
6898
7242
  /**
@@ -6910,6 +7254,13 @@ type FeeRecipientFunction<TFromAdapterCapabilities extends AdapterCapabilities,
6910
7254
  * Use `computeFee` (recommended) for human-readable amounts, or `calculateFee` (deprecated)
6911
7255
  * for smallest-unit amounts. Only one should be provided.
6912
7256
  *
7257
+ * **USDC only.** Because the fee is collected on top of the transfer amount and
7258
+ * split through CCTPv2's USDC flow, this policy cannot apply to any other token.
7259
+ * Bridging a non-USDC token (for example CCTPx `cirBTC` or `wETH`)
7260
+ * is rejected with `INPUT_VALIDATION_FAILED` before anything is submitted —
7261
+ * on `bridge` and `estimate` alike — rather than proceeding without the fee.
7262
+ * A per-call `config.customFee` is rejected the same way.
7263
+ *
6913
7264
  * @example
6914
7265
  * ```typescript
6915
7266
  * import type { CustomFeePolicy, BridgeParams } from '@circle-fin/bridge-kit'
@@ -6987,7 +7338,8 @@ type CustomFeePolicy$1 = {
6987
7338
  * - The `from` field specifies the source adapter context (wallet and chain).
6988
7339
  * - The `to` field specifies the destination, supporting both explicit and derived recipient addresses.
6989
7340
  * - The `config` field allows customization of bridge behavior (e.g., transfer speed).
6990
- * - The `token` field is optional and defaults to 'USDC'; other tokens are not currently supported.
7341
+ * - The `token` field is optional and defaults to `'USDC'`. It accepts
7342
+ * `'USDC'`, a known CCTPx symbol, or a bytes32 CCTPx token id.
6991
7343
  *
6992
7344
  * @typeParam TFromAdapterCapabilities - The source adapter capabilities type.
6993
7345
  * @typeParam TToAdapterCapabilities - The destination adapter capabilities type.
@@ -7055,10 +7407,29 @@ interface BridgeParams<TFromAdapterCapabilities extends AdapterCapabilities = Ad
7055
7407
  */
7056
7408
  config?: BridgeExecutionConfig;
7057
7409
  /**
7058
- * The token to transfer. Defaults to 'USDC'.
7059
- * If omitted, the provider will use 'USDC' by default.
7410
+ * The token to transfer. Defaults to `'USDC'`.
7411
+ *
7412
+ * A known symbol is a convenience for a canonical CCTPx registration. A
7413
+ * symbol that maps to more than one bridge resolves to the registration
7414
+ * pinned by the provider. Pass the bridge's bytes32 token id directly when
7415
+ * an exact registration is required.
7416
+ *
7417
+ * If omitted, defaults to `'USDC'`.
7418
+ *
7419
+ * @example
7420
+ * ```typescript
7421
+ * // USDC via CCTPv2 (default)
7422
+ * const usdc: BridgeParams['token'] = 'USDC'
7423
+ *
7424
+ * // CCTPx by bare symbol — resolves via the known-symbol map
7425
+ * const bare: BridgeParams['token'] = 'wETH'
7426
+ *
7427
+ * // CCTPx by bytes32 token id
7428
+ * const explicit: BridgeParams['token'] =
7429
+ * '0x0000000000000000000000000000000000000000000000000000000063697254'
7430
+ * ```
7060
7431
  */
7061
- token?: 'USDC';
7432
+ token?: BridgeToken;
7062
7433
  /**
7063
7434
  * Optional invocation metadata for tracing and correlation.
7064
7435
  *
@@ -7081,15 +7452,68 @@ interface BridgeParams<TFromAdapterCapabilities extends AdapterCapabilities = Ad
7081
7452
  */
7082
7453
  invocationMeta?: InvocationMeta;
7083
7454
  /**
7084
- * Reuse the opaque signed quote returned by a receive-exact estimate.
7455
+ * Optional server-signed quote to reuse — pass the `quote` returned by an
7456
+ * earlier {@link BridgeKit.estimate | estimate} call straight back so the
7457
+ * fee you were quoted is the fee you pay.
7458
+ *
7459
+ * Treat the value as opaque, and never log or decode it. It belongs to
7460
+ * whichever provider issued it and carries that provider's own shape,
7461
+ * which is why it is typed `unknown` here: a route is matched to a
7462
+ * provider after these parameters are validated, so the kit cannot know
7463
+ * whose quote this is. The provider that serves the route validates it
7464
+ * before reading any field.
7465
+ *
7466
+ * An unusable quote is not handled the same way everywhere, so take the
7467
+ * value from an estimate result rather than constructing one:
7468
+ * - A provider with a reusable quote model (e.g. CCTPx) reuses it while it
7469
+ * is fresh and matches the requested fee token and speed; otherwise it
7470
+ * transparently fetches a fresh quote and flags a `QUOTE_NOT_REUSED`
7471
+ * result warning, so a stale quote is never worse than passing none.
7472
+ * - Receive-exact bridging (`config.feePayment: 'source'`) instead
7473
+ * **rejects** a quote that is invalid, mismatched, expired, or too close
7474
+ * to expiry, rather than repricing behind your back.
7475
+ * - Providers with no quote model (e.g. USDC via CCTP v2) ignore it —
7476
+ * **silently**. Route selection happens after these parameters are
7477
+ * validated, so the kit cannot tell whose quote this is, and nothing
7478
+ * checks that it reached the provider that issued it. In practice this
7479
+ * bites when the token changes between `estimate` and `bridge`: a quote
7480
+ * from a CCTPx token (`cirBTC`, `wETH`) passed to a plain USDC bridge is
7481
+ * dropped without an error or a warning, and the fee comes from CCTP v2
7482
+ * instead. Keeping the same token routes back to the same provider, so
7483
+ * the quote arrives. Re-estimate whenever the transfer changes.
7484
+ *
7485
+ * The transfer parameters (amount, recipient, chains) are validated
7486
+ * on-chain, so a quote reused for a different transfer is rejected by the
7487
+ * contract rather than silently — reuse a quote only for the transfer it
7488
+ * was estimated for.
7489
+ *
7490
+ * This field is for {@link BridgeKit.bridge | bridge} only. A quote is
7491
+ * produced by `estimate` and consumed by `bridge`, and `estimate` always
7492
+ * returns a freshly-priced one. Passing a quote back into `estimate` is a
7493
+ * usage error: CCTPx rejects it outright, while receive-exact ignores it and
7494
+ * prices afresh, so the quote you get back is never the one you sent. Take
7495
+ * the quote from the estimate result, not from your input.
7085
7496
  *
7086
- * @remarks
7087
- * Bridge Kit validates a supplied quote against the exact transfer and fails
7088
- * when it is invalid, mismatched, expired, or too close to expiry. Omit this
7089
- * value to let Bridge Kit fetch a fresh quote automatically. Never log or
7090
- * decode it.
7497
+ * @example
7498
+ * ```typescript
7499
+ * const estimate = await kit.estimate({
7500
+ * from: { adapter: sourceAdapter, chain: 'Ethereum' },
7501
+ * to: { adapter: destAdapter, chain: 'Base' },
7502
+ * amount: '100',
7503
+ * token: 'wETH',
7504
+ * })
7505
+ *
7506
+ * // Reuse the quoted fee for the bridge.
7507
+ * const result = await kit.bridge({
7508
+ * from: { adapter: sourceAdapter, chain: 'Ethereum' },
7509
+ * to: { adapter: destAdapter, chain: 'Base' },
7510
+ * amount: '100',
7511
+ * token: 'wETH',
7512
+ * quote: estimate.quote,
7513
+ * })
7514
+ * ```
7091
7515
  */
7092
- quote?: string;
7516
+ quote?: unknown;
7093
7517
  }
7094
7518
 
7095
7519
  /**
@@ -7875,6 +8299,18 @@ interface AppKitContext {
7875
8299
  chain: ChainDefinition;
7876
8300
  params: OperationParamsMap[T];
7877
8301
  }): Promise<string>;
8302
+ /**
8303
+ * Optional client-side configuration forwarded to the underlying
8304
+ * {@link createOnrampKit} factory when `kit.onramp` is accessed.
8305
+ *
8306
+ * @remarks
8307
+ * The onramp namespace on the client carries NO secret — the
8308
+ * long-lived `apiKey` lives exclusively on the server entry
8309
+ * (`@circle-fin/app-kit/server`). These options exist purely so
8310
+ * staging / SSR consumers can override the widget origin or
8311
+ * inject a host `Window`.
8312
+ */
8313
+ onramp?: AppKitOnrampClientConfig | undefined;
7878
8314
  /**
7879
8315
  * Operation-scoped custom fee policies.
7880
8316
  *
@@ -7946,6 +8382,35 @@ interface AppKitContext {
7946
8382
  */
7947
8383
  headers?: Record<string, string>;
7948
8384
  }
8385
+ /**
8386
+ * Client-side onramp configuration carried on {@link AppKitContext.onramp}.
8387
+ *
8388
+ * @remarks
8389
+ * No secret material lives here — the server-only `apiKey` is
8390
+ * configured on the matching `@circle-fin/app-kit/server` entry. Both
8391
+ * fields are optional with safe production defaults; the typical
8392
+ * application leaves them unset and instantiates `new AppKit()`.
8393
+ */
8394
+ interface AppKitOnrampClientConfig {
8395
+ /**
8396
+ * Override the hosted widget origin. Defaults to the onramp-kit
8397
+ * production origin.
8398
+ *
8399
+ * @remarks
8400
+ * Override for staging environments only — production traffic
8401
+ * should always use the default.
8402
+ */
8403
+ readonly widgetBaseUrl?: string | undefined;
8404
+ /**
8405
+ * Inject a host `Window` for testing or SSR-friendly bundles.
8406
+ *
8407
+ * @remarks
8408
+ * Production code leaves this unset and relies on the global
8409
+ * `window`. Exposed (not `@internal`) so SSR frameworks can
8410
+ * hand-feed the host window after hydration.
8411
+ */
8412
+ readonly window?: Window | undefined;
8413
+ }
7949
8414
 
7950
8415
  /**
7951
8416
  * Execute a same-chain token swap operation using the AppKit context.