diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 09130733..9962ea75 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -28,9 +28,9 @@ jobs: - name: Verify anvil is available run: anvil --version - - name: Install Surfpool v1.1.1 (for SVM fork tests) + - name: Install Surfpool v1.1.2 (for SVM fork tests) run: | - curl -sSL https://github.com/solana-foundation/surfpool/releases/download/v1.1.1/surfpool-linux-x64.tar.gz \ + curl -sSL https://github.com/solana-foundation/surfpool/releases/download/v1.1.2/surfpool-linux-x64.tar.gz \ | tar xz -C /usr/local/bin - name: Verify surfpool is available @@ -53,6 +53,9 @@ jobs: npx @arethetypeswrong/cli --pack . --profile esm-only || true - name: Run tests with coverage + env: + # Temporary: pipe surfpool stdout/stderr to diagnose Solana fork test failures in CI + VERBOSE: '1' run: | set -o pipefail npm test 2>&1 | tee coverage-summary.txt diff --git a/CHANGELOG.md b/CHANGELOG.md index 3564977c..f16dd838 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,9 +7,14 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +## [1.5.0] - 2025-04-22 + - SDK/CLI: Add `sourceTokenAddress` search filter to `searchMessages` and `--source-token` CLI option for filtering messages by source token - CLI: Clean JSON output — data on stdout, diagnostics on stderr, single JSON envelope per command - SDK/CLI: Add `--no-interactive` mode to disable all prompts for AI agents and automation, with auto-detection of non-TTY stdin +- SDK: add Fast Confirmation Rule/FCR/SAFE support to v2.0 lanes: + - `LaneFeatures.MIN_BLOCK_CONFIRMATIONS` and `CUSTOM_BLOCK_CONFIRMATIONS_RATE_LIMITS` replaced with `FINALITY_FAST`, `FINALITY_SAFE`, `FAST_RATE_LIMITS` + - `GenericExtraArgsV3.blockConfirmations` replaced with `finality: 'finalized' | 'safe' | number` ## [1.4.0] - 2026-03-26 diff --git a/ccip-api-ref/docs-cli/guides/data-transfer-workflow.mdx b/ccip-api-ref/docs-cli/guides/data-transfer-workflow.mdx index 1d010ed4..84d6180a 100644 --- a/ccip-api-ref/docs-cli/guides/data-transfer-workflow.mdx +++ b/ccip-api-ref/docs-cli/guides/data-transfer-workflow.mdx @@ -88,7 +88,7 @@ ccip-cli send \ --wallet ledger ``` -See the [send command reference](/cli/send) for all options: [gas limit behavior](/cli/send#gas-limit-behavior), [lane-specific parameters](/cli/send#lane-specific-parameters), and [extra args](/cli/send#extra-args). Extra args like `blockConfirmations` and `ccvs` (encoded as GenericExtraArgsV3) require CCIP v2+ lanes — check your lane version in the [CCIP Directory](https://docs.chain.link/ccip/directory). +See the [send command reference](/cli/send) for all options: [gas limit behavior](/cli/send#gas-limit-behavior), [lane-specific parameters](/cli/send#lane-specific-parameters), and [extra args](/cli/send#extra-args). Extra args like `finality` and `ccvs` (encoded as GenericExtraArgsV3) require CCIP v2+ lanes — check your lane version in the [CCIP Directory](https://docs.chain.link/ccip/directory). ## Step 3: Track Message diff --git a/ccip-api-ref/docs-cli/guides/token-transfer-workflow.mdx b/ccip-api-ref/docs-cli/guides/token-transfer-workflow.mdx index 2fe32cc7..6db329a7 100644 --- a/ccip-api-ref/docs-cli/guides/token-transfer-workflow.mdx +++ b/ccip-api-ref/docs-cli/guides/token-transfer-workflow.mdx @@ -101,7 +101,7 @@ ccip-cli send \ --wallet ledger ``` -See the [send command reference](/cli/send) for all options: [token amount format](/cli/send#token-amount-format), [gas limit behavior](/cli/send#gas-limit-behavior), [lane-specific parameters](/cli/send#lane-specific-parameters), and [extra args](/cli/send#extra-args). Extra args like `blockConfirmations` and `ccvs` (encoded as GenericExtraArgsV3) require CCIP v2+ lanes — check your lane version in the [CCIP Directory](https://docs.chain.link/ccip/directory). +See the [send command reference](/cli/send) for all options: [token amount format](/cli/send#token-amount-format), [gas limit behavior](/cli/send#gas-limit-behavior), [lane-specific parameters](/cli/send#lane-specific-parameters), and [extra args](/cli/send#extra-args). Extra args like `finality` and `ccvs` (encoded as GenericExtraArgsV3) require CCIP v2+ lanes — check your lane version in the [CCIP Directory](https://docs.chain.link/ccip/directory). ## Step 4: Track Transfer diff --git a/ccip-api-ref/docs-cli/guides/tokens-and-data-workflow.mdx b/ccip-api-ref/docs-cli/guides/tokens-and-data-workflow.mdx index 6cae8b89..25bf504b 100644 --- a/ccip-api-ref/docs-cli/guides/tokens-and-data-workflow.mdx +++ b/ccip-api-ref/docs-cli/guides/tokens-and-data-workflow.mdx @@ -53,7 +53,7 @@ ccip-cli send \ --wallet ledger ``` -For all other options, see the [send command reference](/cli/send): [lane-specific parameters](/cli/send#lane-specific-parameters), [extra args](/cli/send#extra-args), and [gas limit behavior](/cli/send#gas-limit-behavior). Extra args like `blockConfirmations` and `ccvs` (encoded as GenericExtraArgsV3) require CCIP v2+ lanes — check your lane version in the [CCIP Directory](https://docs.chain.link/ccip/directory). +For all other options, see the [send command reference](/cli/send): [lane-specific parameters](/cli/send#lane-specific-parameters), [extra args](/cli/send#extra-args), and [gas limit behavior](/cli/send#gas-limit-behavior). Extra args like `finality` and `ccvs` (encoded as GenericExtraArgsV3) require CCIP v2+ lanes — check your lane version in the [CCIP Directory](https://docs.chain.link/ccip/directory). ## Troubleshooting diff --git a/ccip-api-ref/docs-cli/send.mdx b/ccip-api-ref/docs-cli/send.mdx index 51d8931c..b4b02063 100644 --- a/ccip-api-ref/docs-cli/send.mdx +++ b/ccip-api-ref/docs-cli/send.mdx @@ -57,7 +57,7 @@ The `send` command constructs and submits a CCIP message to transfer data and/or | `--extra` | `-x` | string[] | Extra args as `key=value`. Values parsed as JSON with BigInt support; fallback to string. Repeated keys become arrays. | :::note -Extra args fields like `blockConfirmations`, `ccvs`, `ccvArgs`, `executor`, `executorArgs`, `tokenReceiver`, and `tokenArgs` require **CCIP v2+ lanes** (GenericExtraArgsV3). Using them on older lanes will fail. The SDK auto-detects V3 when any V3-only field is present. Check your lane version in the [CCIP Directory](https://docs.chain.link/ccip/directory). +Extra args fields like `finality`, `ccvs`, `ccvArgs`, `executor`, `executorArgs`, `tokenReceiver`, and `tokenArgs` require **CCIP v2+ lanes** (GenericExtraArgsV3). Using them on older lanes will fail. The SDK auto-detects V3 when any V3-only field is present. Check your lane version in the [CCIP Directory](https://docs.chain.link/ccip/directory). ::: :::caution Array fields with a single element @@ -245,7 +245,7 @@ ccip-cli send \ -r 0x0BF3dE8c5D3e8A2B34D2BEeB17ABfCeBaf363A59 \ --to 0xAB4f961939BFE6A93567cC57C59eEd7084CE2131 \ --data "hello world" \ - -x blockConfirmations=5 \ + -x finality=5 \ -x ccvs='["0xVerifier1"]' \ -x executor=0xExecutorAddress ``` diff --git a/ccip-api-ref/docs-cli/supported-tokens.mdx b/ccip-api-ref/docs-cli/supported-tokens.mdx index bc891721..5b715f0a 100644 --- a/ccip-api-ref/docs-cli/supported-tokens.mdx +++ b/ccip-api-ref/docs-cli/supported-tokens.mdx @@ -69,15 +69,16 @@ ccip-cli get-supported-tokens -n ethereum-mainnet -a 0xRouter... --fee-tokens When a token is selected or specified: -| Field | Description | -| ----------------------- | ---------------------------------------------------------------------------------------------- | -| Token address | Contract address on the source chain | -| Symbol / Name | Token symbol and full name | -| Decimals | Token decimal places | -| Pool address | Associated token pool contract | -| Pool type | Lock/Release, Burn/Mint, etc. | -| `minBlockConfirmations` | (v2.0+ pools) Minimum source-chain block confirmations for FTF (0 = supported but not enabled) | -| Remote chains | Supported destination chains with rate limits | +| Field | Description | +| --------------- | ---------------------------------------------------------------------------------------------- | +| Token address | Contract address on the source chain | +| Symbol / Name | Token symbol and full name | +| Decimals | Token decimal places | +| Pool address | Associated token pool contract | +| Pool type | Lock/Release, Burn/Mint, etc. | +| `finalityDepth` | (v2.0+ pools) Minimum source-chain block confirmations for FTF (0 = supported but not enabled) | +| `finalitySafe` | (v2.0+ pools) Whether Pool supports safe finality (Fast Confirmation Rule) | +| Remote chains | Supported destination chains with rate limits | ## Examples @@ -129,10 +130,10 @@ For each remote chain, the command displays rate limiter state: For TokenPool v2.0+ contracts, additional fields may appear: -| Field | Description | -| --------------- | ------------------------------------------------------------ | -| `[ftf]outbound` | FTF outbound rate limiter state (custom block confirmations) | -| `[ftf]inbound` | FTF inbound rate limiter state (custom block confirmations) | +| Field | Description | +| ---------------- | ------------------------------------------------------------ | +| `[fast]outbound` | FTF outbound rate limiter state (custom block confirmations) | +| `[fast]inbound` | FTF inbound rate limiter state (custom block confirmations) | These FTF rate limiters apply separate limits when transfers use custom (lower) block confirmations instead of full finality. diff --git a/ccip-api-ref/docs-sdk/guides/fee-estimation.mdx b/ccip-api-ref/docs-sdk/guides/fee-estimation.mdx index 642c934e..3d9a64b8 100644 --- a/ccip-api-ref/docs-sdk/guides/fee-estimation.mdx +++ b/ccip-api-ref/docs-sdk/guides/fee-estimation.mdx @@ -105,8 +105,8 @@ if (estimate.tokenTransferFee) { Token transfer fee rates differ based on finality mode: -- **Standard finality** (`blockConfirmations = 0` or omitted): uses `defaultBlockConfirmationsTransferFeeBps` -- **Faster-Than-Finality** (`blockConfirmations > 0`): uses `customBlockConfirmationsTransferFeeBps` +- **Standard finality** (`finality = 0` or omitted): uses `finalityTransferFeeBps` +- **Faster-Than-Finality** (block depth `finality > 0`): uses `fastFinalityTransferFeeBps` For the full FTF workflow — checking availability, estimating FTF fees with code examples, and computing received amounts — see [Faster-Than-Finality](/sdk/guides/ftf). diff --git a/ccip-api-ref/docs-sdk/guides/ftf.mdx b/ccip-api-ref/docs-sdk/guides/ftf.mdx index 97ebd442..53e45dcf 100644 --- a/ccip-api-ref/docs-sdk/guides/ftf.mdx +++ b/ccip-api-ref/docs-sdk/guides/ftf.mdx @@ -27,16 +27,16 @@ const features = await source.getLaneFeatures({ token: '0xTokenAddress...', }) -const minConfirmations = features.MIN_BLOCK_CONFIRMATIONS +const minConfirmations = features.FINALITY_FAST ``` -Interpret `MIN_BLOCK_CONFIRMATIONS`: +Interpret `FINALITY_FAST`: | Value | Lane version | Meaning | |-------|-------------|---------| | `undefined` | Pre-v2.0 | FTF not supported. Use V2 extraArgs only. | -| `0` | v2.0+ | V3 extraArgs supported, but FTF not enabled for this token. `blockConfirmations` has no effect. | -| `> 0` | v2.0+ with FTF | FTF enabled. Use `blockConfirmations >= minValue` in V3 extraArgs. | +| `0` | v2.0+ | V3 extraArgs supported, but FTF not enabled for this token. `finality` has no effect. | +| `> 0` | v2.0+ with FTF | FTF enabled. Use `finality >= minValue` in V3 extraArgs. | :::note Without a `token`, the result reflects lane version only: `undefined` for pre-v2.0, or a hardcoded `1` for v2.0+ (confirming V3 support without pool-specific FTF data). Pass a `token` to get the actual pool-specific value. @@ -48,7 +48,7 @@ Without a `token`, the result reflects lane version only: `undefined` for pre-v2 ## Send with FTF -Set `blockConfirmations` in `extraArgs`. The SDK auto-detects V3 encoding when any V3-only field is present: +Set `finality` in `extraArgs`. The SDK auto-detects V3 encoding when any V3-only field is present: ```typescript import { EVMChain, networkInfo } from '@chainlink/ccip-sdk' @@ -63,14 +63,14 @@ const features = await source.getLaneFeatures({ token: '0xTokenAddress...', }) -const minConfirmations = features.MIN_BLOCK_CONFIRMATIONS +const minConfirmations = features.FINALITY_FAST let extraArgs if (minConfirmations != null && minConfirmations > 0) { - // FTF enabled — use V3 with blockConfirmations + // FTF enabled — use V3 with finality extraArgs = { gasLimit: 200_000n, - blockConfirmations: minConfirmations, + finality: minConfirmations, } } else if (minConfirmations != null) { // v2.0+ but FTF not enabled — V2-style args work @@ -98,7 +98,7 @@ await source.sendMessage({ }) ``` -The SDK does **not** validate `extraArgs` against the lane's on-chain version. Passing V3 fields (e.g., `blockConfirmations`) to a pre-v2.0 lane will **revert** on-chain. +The SDK does **not** validate `extraArgs` against the lane's on-chain version. Passing V3 fields (e.g., `finality`) to a pre-v2.0 lane will **revert** on-chain. ## Estimate FTF Latency @@ -118,7 +118,7 @@ When `numberOfBlocks` is omitted or `0`, the API returns latency for the lane's ## Estimate FTF Fees -Token transfer fees differ between standard and FTF. Call `getTotalFeesEstimate` with `blockConfirmations` in `extraArgs`: +Token transfer fees differ between standard and FTF. Call `getTotalFeesEstimate` with `finality` in `extraArgs`: ```typescript const estimate = await source.getTotalFeesEstimate({ @@ -127,7 +127,7 @@ const estimate = await source.getTotalFeesEstimate({ message: { receiver: '0xReceiverAddress...', tokenAmounts: [{ token: '0xTokenAddress...', amount: 1_000_000n }], - extraArgs: { blockConfirmations: minConfirmations }, + extraArgs: { finality: minConfirmations }, }, }) @@ -144,10 +144,10 @@ if (estimate.tokenTransferFee) { The pool-level BPS rate applied depends on finality mode: -| Finality mode | `blockConfirmations` | BPS field used | +| Finality mode | `finality` | BPS field used | |---------------|---------------------|----------------| -| Standard | `0` or omitted | `defaultBlockConfirmationsTransferFeeBps` | -| FTF | `> 0` | `customBlockConfirmationsTransferFeeBps` | +| Standard | `0` or omitted | `finalityTransferFeeBps` | +| FTF | `> 0` (block depth) | `fastFinalityTransferFeeBps` | See [Fee Estimation](/sdk/guides/fee-estimation) for the full `TotalFeesEstimate` type and USDC/CCTP fee handling. @@ -168,8 +168,8 @@ if (features.RATE_LIMITS) { } // FTF rate limits (only when FTF is enabled) -if (features.CUSTOM_BLOCK_CONFIRMATIONS_RATE_LIMITS) { - const ftf = features.CUSTOM_BLOCK_CONFIRMATIONS_RATE_LIMITS +if (features.FAST_RATE_LIMITS) { + const ftf = features.FAST_RATE_LIMITS console.log('FTF — available:', ftf.tokens, '/', ftf.capacity) } ``` @@ -180,8 +180,8 @@ FTF rate limits are also available per remote chain via `getTokenPoolRemotes`: const remotes = await source.getTokenPoolRemotes(poolAddress, destSelector) const remote = Object.values(remotes)[0] -if (remote && 'customBlockConfirmationsOutboundRateLimiterState' in remote) { - const ftfOutbound = remote.customBlockConfirmationsOutboundRateLimiterState +if (remote && 'fastOutboundRateLimiterState' in remote) { + const ftfOutbound = remote.fastOutboundRateLimiterState if (ftfOutbound) { console.log('FTF outbound:', ftfOutbound.tokens, '/', ftfOutbound.capacity) } @@ -216,15 +216,15 @@ async function sendWithFTF( token: tokenAddress, }) - const minConfirmations = features.MIN_BLOCK_CONFIRMATIONS + const minConfirmations = features.FINALITY_FAST if (minConfirmations == null || minConfirmations === 0) { console.log('FTF not available on this lane/token') return } // 2. Check FTF rate limits - if (features.CUSTOM_BLOCK_CONFIRMATIONS_RATE_LIMITS) { - const available = features.CUSTOM_BLOCK_CONFIRMATIONS_RATE_LIMITS.tokens + if (features.FAST_RATE_LIMITS) { + const available = features.FAST_RATE_LIMITS.tokens console.log('FTF rate limit available:', available) } @@ -236,7 +236,7 @@ async function sendWithFTF( const message = { receiver, tokenAmounts: [{ token: tokenAddress, amount }], - extraArgs: { blockConfirmations: minConfirmations }, + extraArgs: { finality: minConfirmations }, } const estimate = await source.getTotalFeesEstimate({ diff --git a/ccip-api-ref/docs-sdk/guides/querying-data.mdx b/ccip-api-ref/docs-sdk/guides/querying-data.mdx index 9dfad69a..cf8c9945 100644 --- a/ccip-api-ref/docs-sdk/guides/querying-data.mdx +++ b/ccip-api-ref/docs-sdk/guides/querying-data.mdx @@ -149,9 +149,10 @@ Returns `Partial` — not all fields are guaranteed: | Field | Type | Meaning | |-------|------|---------| -| `MIN_BLOCK_CONFIRMATIONS` | `number \| undefined` | `undefined` = pre-v2.0 lane, `0` = v2.0+ but FTF not enabled for this token, `>0` = FTF enabled | +| `FINALITY_FAST` | `number \| undefined` | `undefined` = pre-v2.0 lane, `0` = v2.0+ but FTF not enabled for this token, `>0` = FTF enabled | +| `FINALITY_SAFE` | `true \| undefined` | `true` = FCR/safe finality supported on this lane | | `RATE_LIMITS` | `RateLimiterState \| null` | Standard rate limiter state (`null` if disabled) | -| `CUSTOM_BLOCK_CONFIRMATIONS_RATE_LIMITS` | `RateLimiterState \| null` | FTF-specific rate limiter (only when `MIN_BLOCK_CONFIRMATIONS > 0`) | +| `FAST_RATE_LIMITS` | `RateLimiterState \| null` | FTF/FCR-specific rate limiter (only when FINALITY_FAST > 0 or FINALITY_SAFE) | :::note `getLaneFeatures` is implemented for EVM chains only. @@ -442,8 +443,8 @@ async function getTransferInfo( amount: amountString, fee: formatUnits(fee, 18), ftfEnabled: - laneFeatures.MIN_BLOCK_CONFIRMATIONS != null && - laneFeatures.MIN_BLOCK_CONFIRMATIONS > 0, + laneFeatures.FINALITY_FAST != null && + laneFeatures.FINALITY_FAST > 0, rateLimited: laneFeatures.RATE_LIMITS != null, } } diff --git a/ccip-api-ref/docs-sdk/guides/sending-messages.mdx b/ccip-api-ref/docs-sdk/guides/sending-messages.mdx index 4ce76aa5..c6f3e74b 100644 --- a/ccip-api-ref/docs-sdk/guides/sending-messages.mdx +++ b/ccip-api-ref/docs-sdk/guides/sending-messages.mdx @@ -34,7 +34,7 @@ const features = await source.getLaneFeatures({ router, destChainSelector: destS const message = { receiver: '0xReceiverAddress...', data: '0x', - extraArgs: features.MIN_BLOCK_CONFIRMATIONS != null + extraArgs: features.FINALITY_FAST != null ? { gasLimit: 200_000n } // v2.0+ lane — V3 encoding (V2-style fields also accepted) : { gasLimit: 200_000n, allowOutOfOrderExecution: true }, // pre-v2.0 lane — V2 encoding } @@ -149,7 +149,7 @@ The token `amount` and `fee` are sent as transaction `value` (native ETH), not v ## Checking Lane Capabilities -The SDK does **not** validate your `extraArgs` against the lane's on-chain version. If you pass V3 fields (e.g., `blockConfirmations`) to a pre-v2.0 lane, the transaction will **revert** on-chain. Call `getLaneFeatures` first to check what the lane supports: +The SDK does **not** validate your `extraArgs` against the lane's on-chain version. If you pass V3 fields (e.g., `finality`) to a pre-v2.0 lane, the transaction will **revert** on-chain. Call `getLaneFeatures` first to check what the lane supports: ```typescript const features = await source.getLaneFeatures({ @@ -158,7 +158,7 @@ const features = await source.getLaneFeatures({ token: '0xTokenAddress...', // pass to get token-specific FTF and rate limit info }) -const minConfirmations = features.MIN_BLOCK_CONFIRMATIONS +const minConfirmations = features.FINALITY_FAST // undefined = pre-v2.0 (V2 only), 0 = v2.0+ (V3 supported, no FTF), >0 = FTF enabled ``` @@ -200,7 +200,7 @@ The SDK auto-detects the encoding version based on which fields you provide. Pas |---------------|-----------------|-------------| | `gasLimit` only | EVMExtraArgsV1 | `0x97a657c9` | | `gasLimit` + `allowOutOfOrderExecution` | EVMExtraArgsV2 | `0x181dcf10` | -| Any of: `blockConfirmations`, `ccvs`, `ccvArgs`, `executor`, `executorArgs`, `tokenReceiver`, `tokenArgs` | GenericExtraArgsV3 | `0xa69dd4aa` | +| Any of: `finality`, `ccvs`, `ccvArgs`, `executor`, `executorArgs`, `tokenReceiver`, `tokenArgs` | GenericExtraArgsV3 | `0xa69dd4aa` | | `computeUnits` | SVMExtraArgsV1 (Solana) | `0x1f3b3aba` | | `receiverObjectIds` | SuiExtraArgsV1 | `0x21ea4ca9` | @@ -213,7 +213,7 @@ V3 does **not** include `allowOutOfOrderExecution`. If migrating from V2, remove | Field | Type | Default | Description | |-------|------|---------|-------------| | `gasLimit` | `bigint` | `0n` (no data) / `200_000n` (with data) | Gas for receiver execution | -| `blockConfirmations` | `number` | `0` | Source-chain confirmations before relaying (FTF) | +| `finality` | `number \| 'safe' \| 'finalized'` | `0` | Source-chain confirmations before relaying (FTF), or 'safe'/'finalized' for mode-based finality | | `ccvs` | `string[]` | `[]` | Cross-chain verifier addresses | | `ccvArgs` | `BytesLike[]` | `[]` | Per-CCV arguments | | `executor` | `string` | `''` | Custom executor address | @@ -247,10 +247,10 @@ const encodedV1 = encodeExtraArgs({ gasLimit: 200_000n }) ```typescript import { encodeExtraArgs } from '@chainlink/ccip-sdk' -// V3 — auto-detected from blockConfirmations (or any V3-only field) +// V3 — auto-detected from finality (or any V3-only field) const encoded = encodeExtraArgs({ gasLimit: 200_000n, - blockConfirmations: 5, + finality: 5, ccvs: [], ccvArgs: [], executor: '', @@ -342,14 +342,14 @@ async function sendTokens( // 3. Choose extra arguments based on lane version let extraArgs - const minConfirmations = features.MIN_BLOCK_CONFIRMATIONS + const minConfirmations = features.FINALITY_FAST if (minConfirmations == null) { // Pre-v2.0 lane extraArgs = { gasLimit: 0n, allowOutOfOrderExecution: true } } else if (minConfirmations > 0) { // v2.0+ with FTF — use minimum block confirmations for faster delivery - extraArgs = { gasLimit: 0n, blockConfirmations: minConfirmations } + extraArgs = { gasLimit: 0n, finality: minConfirmations } } else { // v2.0+, FTF not enabled — V2-style args work fine extraArgs = { gasLimit: 0n, allowOutOfOrderExecution: true } @@ -410,7 +410,7 @@ When `extraArgs` is omitted or partial, the SDK fills in defaults: |-----------|------------------| | Message has `data` | `{ gasLimit: 200_000n, allowOutOfOrderExecution: true }` | | Token-only (no `data`) | `{ gasLimit: 0n, allowOutOfOrderExecution: true }` | -| Any V3-only field present | V3 defaults: `blockConfirmations: 0`, empty arrays/strings for other fields | +| Any V3-only field present | V3 defaults: `finality: 0`, empty arrays/strings for other fields | ## Non-EVM Destinations diff --git a/ccip-api-ref/docs-sdk/guides/token-pools.mdx b/ccip-api-ref/docs-sdk/guides/token-pools.mdx index f88f7be3..49adb086 100644 --- a/ccip-api-ref/docs-sdk/guides/token-pools.mdx +++ b/ccip-api-ref/docs-sdk/guides/token-pools.mdx @@ -52,7 +52,7 @@ The `typeAndVersion` string identifies the pool type (BurnMint, LockRelease, USD ### Faster-Than-Finality (FTF) Configuration -On v2.0+ pools, `getTokenPoolConfig` also returns `minBlockConfirmations` (`undefined` on pre-v2.0 pools, `0` when FTF is not enabled, `>0` when enabled). See [Faster-Than-Finality](/sdk/guides/ftf) for the full FTF workflow. +On v2.0+ pools, `getTokenPoolConfig` also returns `finalityDepth` (`undefined` on pre-v2.0 pools, `0` when FTF is not enabled, `>0` when enabled) and `finalitySafe` (`true` when FCR/safe finality is supported). See [Faster-Than-Finality](/sdk/guides/ftf) for the full FTF workflow. ## Remote Chain Configuration @@ -138,7 +138,7 @@ type RateLimiterState = { ### FTF Rate Limits -TokenPool v2.0+ contracts may include separate rate limiters for Faster-Than-Finality transfers (`customBlockConfirmationsOutboundRateLimiterState` and `customBlockConfirmationsInboundRateLimiterState`). See [Faster-Than-Finality — FTF Rate Limits](/sdk/guides/ftf#ftf-rate-limits) for details and examples. +TokenPool v2.0+ contracts may include separate rate limiters for Faster-Than-Finality transfers (`fastOutboundRateLimiterState` and `fastInboundRateLimiterState`). See [Faster-Than-Finality — FTF Rate Limits](/sdk/guides/ftf#ftf-rate-limits) for details and examples. ## Complete Example @@ -172,8 +172,8 @@ async function inspectTokenPool( const poolConfig = await chain.getTokenPoolConfig(poolAddress) console.log('Type:', poolConfig.typeAndVersion) - if (poolConfig.minBlockConfirmations != null && poolConfig.minBlockConfirmations > 0) { - console.log('FTF enabled — min confirmations:', poolConfig.minBlockConfirmations) + if (poolConfig.finalityDepth != null && poolConfig.finalityDepth > 0) { + console.log('FTF enabled — min confirmations:', poolConfig.finalityDepth) } // 3. Get remote configuration for the destination @@ -204,9 +204,9 @@ async function inspectTokenPool( } // 5. FTF rate limits (v2.0+ only) - if ('customBlockConfirmationsOutboundRateLimiterState' in remote) { - const ftfOut = remote.customBlockConfirmationsOutboundRateLimiterState - const ftfIn = remote.customBlockConfirmationsInboundRateLimiterState + if ('fastOutboundRateLimiterState' in remote) { + const ftfOut = remote.fastOutboundRateLimiterState + const ftfIn = remote.fastInboundRateLimiterState if (ftfOut) { console.log(`\nFTF outbound: ${ftfOut.tokens}/${ftfOut.capacity}`) } @@ -231,7 +231,7 @@ await inspectTokenPool( |--------|----------|---------| | `getTokenAdminRegistryFor(address)` | Chain | Resolve TokenAdminRegistry from Router/OnRamp/OffRamp | | `getRegistryTokenConfig(registry, token)` | Chain | Get token's registry entry (pool address, admin) | -| `getTokenPoolConfig(pool)` | Chain | Pool config: token, router, typeAndVersion, minBlockConfirmations | +| `getTokenPoolConfig(pool)` | Chain | Pool config: token, router, typeAndVersion, finalityDepth, finalitySafe | | `getTokenPoolRemotes(pool, chainSelector?)` | Chain | Remote chain config: remote token, pools, rate limits | | `getSupportedTokens(registry)` | Chain | List all tokens in the registry | | `getTokenInfo(token)` | Chain | Token metadata (symbol, decimals, name) | diff --git a/ccip-api-ref/docusaurus.config.ts b/ccip-api-ref/docusaurus.config.ts index d70aca20..e5296a48 100644 --- a/ccip-api-ref/docusaurus.config.ts +++ b/ccip-api-ref/docusaurus.config.ts @@ -12,8 +12,8 @@ interface PackageJson { name: string } -const cliPackage: PackageJson = cliPackageJson as PackageJson -const sdkPackage: PackageJson = sdkPackageJson as PackageJson +const cliPackage: PackageJson = cliPackageJson +const sdkPackage: PackageJson = sdkPackageJson const config: Config = { title: 'CCIP Tools Reference', diff --git a/ccip-api-ref/package.json b/ccip-api-ref/package.json index c0c96c96..d07c83c7 100644 --- a/ccip-api-ref/package.json +++ b/ccip-api-ref/package.json @@ -1,6 +1,6 @@ { "name": "@chainlink/ccip-api-ref", - "version": "1.4.2", + "version": "1.5.0", "private": true, "description": "API Reference documentation for CCIP SDK and CLI", "scripts": { @@ -28,8 +28,8 @@ "@easyops-cn/docusaurus-search-local": "^0.55.1", "@mdx-js/react": "^3.1.1", "clsx": "^2.1.1", - "docusaurus-plugin-openapi-docs": "^5.0.0", - "docusaurus-theme-openapi-docs": "^5.0.0", + "docusaurus-plugin-openapi-docs": "^5.0.1", + "docusaurus-theme-openapi-docs": "^5.0.1", "focus-trap-react": "^12.0.0", "prism-react-renderer": "^2.4.1", "react": "^19.2.5", @@ -40,7 +40,7 @@ "@docusaurus/types": "^3.10.0", "@types/react-dom": "^19.2.3", "docusaurus-plugin-typedoc": "^1.4.2", - "typedoc": "^0.28.18", + "typedoc": "^0.28.19", "typedoc-plugin-markdown": "^4.11.0" }, "browserslist": { diff --git a/ccip-api-ref/src/components/cli-builder/schemas/send.schema.ts b/ccip-api-ref/src/components/cli-builder/schemas/send.schema.ts index fe6813ef..bfb4f395 100644 --- a/ccip-api-ref/src/components/cli-builder/schemas/send.schema.ts +++ b/ccip-api-ref/src/components/cli-builder/schemas/send.schema.ts @@ -96,7 +96,7 @@ export const sendSchema: CommandSchema<'send'> = { alias: 'x', label: 'Extra Args', description: - 'Extra args as key=value (e.g., blockConfirmations=5). Requires CCIP v2+ lanes for V3 fields.', + 'Extra args as key=value (e.g., finality=5). Requires CCIP v2+ lanes for V3 fields.', group: 'message', itemType: 'string', placeholder: 'key=value', diff --git a/ccip-api-ref/src/components/copy-page/contentExtractor.ts b/ccip-api-ref/src/components/copy-page/contentExtractor.ts index 73ef7048..d2b38cc9 100644 --- a/ccip-api-ref/src/components/copy-page/contentExtractor.ts +++ b/ccip-api-ref/src/components/copy-page/contentExtractor.ts @@ -413,7 +413,7 @@ function convertTabsToMarkdown(el: HTMLElement): string { let visiblePanel: HTMLElement | null = null if (selectedTabId) { - visiblePanel = document.getElementById(selectedTabId) as HTMLElement + visiblePanel = document.getElementById(selectedTabId) } // If not found by ID, look for tabpanels in the common container diff --git a/ccip-api-ref/src/components/copy-page/openApiExtractor.ts b/ccip-api-ref/src/components/copy-page/openApiExtractor.ts index ec30f4d9..b743be3e 100644 --- a/ccip-api-ref/src/components/copy-page/openApiExtractor.ts +++ b/ccip-api-ref/src/components/copy-page/openApiExtractor.ts @@ -373,9 +373,7 @@ function formatParameters(params: Parameter[]): string[] { const example = param.schema.example /* eslint-disable @typescript-eslint/no-unnecessary-condition -- typeof null === 'object' in JS */ const exampleStr = - typeof example === 'object' && example !== null - ? JSON.stringify(example) - : String(example as string | number | boolean) + typeof example === 'object' && example !== null ? JSON.stringify(example) : String(example) // eslint-disable-line @typescript-eslint/no-base-to-string /* eslint-enable @typescript-eslint/no-unnecessary-condition */ lines.push(` - Example: \`${exampleStr}\``) } @@ -437,7 +435,7 @@ function formatSchema( const exampleStr = typeof example === 'object' && example !== null ? JSON.stringify(example) - : String(example as string | number | boolean) + : String(example) // eslint-disable-line @typescript-eslint/no-base-to-string /* eslint-enable @typescript-eslint/no-unnecessary-condition */ lines.push(`${indent} - Example: \`${exampleStr}\``) } diff --git a/ccip-api-ref/src/theme/CodeBlock/index.tsx b/ccip-api-ref/src/theme/CodeBlock/index.tsx index cfaf4193..4670ac31 100644 --- a/ccip-api-ref/src/theme/CodeBlock/index.tsx +++ b/ccip-api-ref/src/theme/CodeBlock/index.tsx @@ -46,7 +46,7 @@ function extractLanguage(className?: string): string { export default function CodeBlockWrapper(props: Props): React.JSX.Element { // Language can come from props.language or from className (may be undefined at runtime from markdown) // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- props.language may be undefined at runtime from markdown - const language = props.language ?? extractLanguage(props.className as string) ?? '' + const language = props.language ?? extractLanguage(props.className) ?? '' const languageLabel = LANGUAGE_LABELS[language.toLowerCase()] ?? language.toUpperCase() const showBadge = language && language !== 'text' && language !== '' diff --git a/ccip-cli/package.json b/ccip-cli/package.json index c341cb86..4f6b6fc9 100644 --- a/ccip-cli/package.json +++ b/ccip-cli/package.json @@ -1,6 +1,6 @@ { "name": "@chainlink/ccip-cli", - "version": "1.4.2", + "version": "1.5.0", "description": "CCIP Command Line Interface, based on @chainlink/ccip-sdk", "author": "Chainlink devs", "license": "MIT", @@ -36,26 +36,26 @@ ], "devDependencies": { "@eslint/js": "^10.0.1", - "@types/node": "25.5.2", + "@types/node": "25.6.0", "@types/update-notifier": "^6.0.8", "@types/yargs": "17.0.35", - "eslint": "^10.2.0", + "eslint": "^10.2.1", "eslint-config-prettier": "10.1.8", "eslint-plugin-import-x": "^4.16.2", "eslint-plugin-jsdoc": "^62.9.0", "eslint-plugin-prettier": "^5.5.5", "eslint-plugin-tsdoc": "^0.5.2", - "prettier": "^3.8.1", + "prettier": "^3.8.3", "tsx": "4.21.0", - "typescript": "6.0.2", - "typescript-eslint": "8.58.1" + "typescript": "6.0.3", + "typescript-eslint": "8.59.0" }, "dependencies": { "@aptos-labs/ts-sdk": "^6.3.1", - "@chainlink/ccip-sdk": "^1.4.2", + "@chainlink/ccip-sdk": "^1.5.0", "@coral-xyz/anchor": "^0.29.0", "@ethers-ext/signer-ledger": "^6.0.0-beta.1", - "@inquirer/prompts": "8.4.1", + "@inquirer/prompts": "8.4.2", "@ledgerhq/hw-app-aptos": "6.37.0", "@ledgerhq/hw-app-solana": "7.9.0", "@ledgerhq/hw-transport-node-hid": "6.32.0", @@ -63,7 +63,7 @@ "@ton-community/ton-ledger": "^7.3.0", "bs58": "^6.0.0", "ethers": "6.16.0", - "type-fest": "^5.5.0", + "type-fest": "^5.6.0", "update-notifier": "^7.3.1", "yargs": "18.0.0" } diff --git a/ccip-cli/src/commands/lane-latency.test.ts b/ccip-cli/src/commands/lane-latency.test.ts index 9d4719ec..311741bf 100644 --- a/ccip-cli/src/commands/lane-latency.test.ts +++ b/ccip-cli/src/commands/lane-latency.test.ts @@ -48,8 +48,8 @@ describe('lane-latency command', () => { const createCtx = (): Ctx => ({ destroy$: Promise.resolve(), - output: mockOutput as unknown as Ctx['output'], - logger: mockLogger as unknown as Ctx['logger'], + output: mockOutput, + logger: mockLogger, }) beforeEach(() => { diff --git a/ccip-cli/src/commands/non-interactive.test.ts b/ccip-cli/src/commands/non-interactive.test.ts index 91e37649..7fbb184c 100644 --- a/ccip-cli/src/commands/non-interactive.test.ts +++ b/ccip-cli/src/commands/non-interactive.test.ts @@ -4,6 +4,7 @@ import { describe, it } from 'node:test' import { type CCIPRequest, CCIPInteractiveRequiredError } from '@chainlink/ccip-sdk/src/index.ts' import { selectRequest } from './utils.ts' +import type { GlobalOpts } from '../index.ts' /** Minimal mock CCIPRequest for testing selectRequest behavior. */ function mockRequest(logIndex: number, messageId: string): CCIPRequest { @@ -74,7 +75,6 @@ describe('preprocessArgv TTY auto-detection', () => { it('--interactive flag is defined in globalOpts', async () => { // Verify the flag exists by importing globalOpts type // This is a compile-time check — if the type doesn't include interactive, TS fails - type GlobalOpts = import('../index.ts').GlobalOpts const _check: GlobalOpts['interactive'] extends boolean | undefined ? true : never = true assert.ok(_check) }) diff --git a/ccip-cli/src/commands/search/messages.test.ts b/ccip-cli/src/commands/search/messages.test.ts index 1e6b18c0..43c445c8 100644 --- a/ccip-cli/src/commands/search/messages.test.ts +++ b/ccip-cli/src/commands/search/messages.test.ts @@ -61,8 +61,8 @@ describe('search messages command', () => { const createCtx = (): Ctx => ({ destroy$: Promise.resolve(), - output: mockOutput as unknown as Ctx['output'], - logger: mockLogger as unknown as Ctx['logger'], + output: mockOutput, + logger: mockLogger, }) const createArgv = (overrides: Record = {}) => diff --git a/ccip-cli/src/commands/send.ts b/ccip-cli/src/commands/send.ts index e17e63e7..eeec67bf 100644 --- a/ccip-cli/src/commands/send.ts +++ b/ccip-cli/src/commands/send.ts @@ -21,7 +21,6 @@ import { type ChainStatic, - type ExtraArgs, type MessageInput, CCIPArgumentInvalidError, CCIPInsufficientBalanceError, @@ -128,7 +127,7 @@ export const builder = (yargs: Argv) => string: true, describe: 'Extra args to pass in the message: key=value (value parsed as JSON with bigint support, fallback to string; repeated keys become arrays)', - example: '-x ccvs=["0xvalue1", "0xvalue2"] --extra=blockConfirmations=1', + example: '-x ccvs=["0xvalue1", "0xvalue2"] --extra=finality=safe', }, 'only-get-fee': { type: 'boolean', @@ -185,7 +184,7 @@ export async function handler(argv: Awaited['argv']> * Repeated keys are accumulated into an array. * * @example - * `assert.eq(parseExtraArgs(['ccvs=["0xvalue1", "0xvalue2"]', 'blockConfirmations=1', 'flag=true']), { ccvs: ["0xvalue1", "0xvalue2"], blockConfirmations: 1n, flag: true })` + * `assert.eq(parseExtraArgs(['ccvs=["0xvalue1", "0xvalue2"]', 'finality=safe', 'flag=true']), { ccvs: ["0xvalue1", "0xvalue2"], finality: 'safe', flag: true })` */ function parseExtraArgs(extra: readonly string[] | undefined): Record { if (!extra?.length) return {} @@ -195,6 +194,7 @@ function parseExtraArgs(extra: readonly string[] | undefined): Record[0] let source: Chain | undefined, offRamp // Track if we displayed all messages in non-interactive multi-message path - let displayedAllMessages = false + let displayedAllMessages = false as boolean let request$ = (async () => { const [source_, tx] = await tx$ diff --git a/ccip-cli/src/commands/supported-tokens.ts b/ccip-cli/src/commands/supported-tokens.ts index 672937c9..c74f27ba 100644 --- a/ccip-cli/src/commands/supported-tokens.ts +++ b/ccip-cli/src/commands/supported-tokens.ts @@ -221,9 +221,9 @@ async function getSupportedTokens(ctx: Ctx, argv: Parameters[0]) ...(registryConfig.pendingAdministrator && { pendingAdministrator: registryConfig.pendingAdministrator, }), - ...(poolConfig.minBlockConfirmations != null && { - minBlockConfirmations: - poolConfig.minBlockConfirmations === 0 ? '0 (finality)' : poolConfig.minBlockConfirmations, + ...(poolConfig.finalityDepth != null && { + finalityDepth: poolConfig.finalityDepth === 0 ? '0 (finalized)' : poolConfig.finalityDepth, + finalitySafe: poolConfig.finalitySafe ? 'true (FCR)' : false, }), }) const remotesLen = Object.keys(remotes).length @@ -235,15 +235,9 @@ async function getSupportedTokens(ctx: Ctx, argv: Parameters[0]) remotePool: remote.remotePools, outbound: prettyRateLimiter(remote.outboundRateLimiterState, info), inbound: prettyRateLimiter(remote.inboundRateLimiterState, info), - ...('customBlockConfirmationsOutboundRateLimiterState' in remote && { - ['[ftf]outbound']: prettyRateLimiter( - remote.customBlockConfirmationsOutboundRateLimiterState, - info, - ), - ['[ftf]inbound']: prettyRateLimiter( - remote.customBlockConfirmationsInboundRateLimiterState, - info, - ), + ...('fastOutboundRateLimiterState' in remote && { + ['[fast]outbound']: prettyRateLimiter(remote.fastOutboundRateLimiterState, info), + ['[fast]inbound']: prettyRateLimiter(remote.fastInboundRateLimiterState, info), }), }) } diff --git a/ccip-cli/src/index.ts b/ccip-cli/src/index.ts index 842c111a..b8b1db7f 100755 --- a/ccip-cli/src/index.ts +++ b/ccip-cli/src/index.ts @@ -25,7 +25,7 @@ import { Format } from './commands/index.ts' util.inspect.defaultOptions.depth = 6 // print down to tokenAmounts in requests // generate:nofail // `const VERSION = '${require('./package.json').version}-${require('child_process').execSync('git rev-parse --short HEAD').toString().trim()}'` -const VERSION = '1.4.2-257335e' +const VERSION = '1.5.0-a368172f' // generate:end const require = createRequire(import.meta.url) diff --git a/ccip-cli/src/providers/solana.ts b/ccip-cli/src/providers/solana.ts index 8a38f701..11984ee1 100644 --- a/ccip-cli/src/providers/solana.ts +++ b/ccip-cli/src/providers/solana.ts @@ -127,7 +127,7 @@ export async function loadSolanaWallet( let derivationPath = walletOpt.split(':')[1] if (!derivationPath) derivationPath = "44'/501'/0'" else if (!isNaN(Number(derivationPath))) derivationPath = `44'/501'/${derivationPath}'` - return (await LedgerSolanaWallet.create(derivationPath, logger)) as AnchorWallet + return await LedgerSolanaWallet.create(derivationPath, logger) } else if (existsSync(walletOpt)) { wallet = hexlify(new Uint8Array(JSON.parse(readFileSync(walletOpt, 'utf8')))) } diff --git a/ccip-sdk/package.json b/ccip-sdk/package.json index 0e05b2ad..8f8a3a57 100644 --- a/ccip-sdk/package.json +++ b/ccip-sdk/package.json @@ -1,6 +1,6 @@ { "name": "@chainlink/ccip-sdk", - "version": "1.4.2", + "version": "1.5.0", "description": "SDK/Library to interact with CCIP", "author": "Chainlink devs", "license": "MIT", @@ -59,9 +59,9 @@ "@depay/web3-mock": "^15.3.0", "@eslint/js": "^10.0.1", "@types/bn.js": "^5.2.0", - "@types/node": "25.5.2", + "@types/node": "25.6.0", "@types/yargs": "17.0.35", - "eslint": "^10.2.0", + "eslint": "^10.2.1", "eslint-config-prettier": "10.1.8", "eslint-plugin-import-x": "^4.16.2", @@ -69,32 +69,32 @@ "eslint-plugin-prettier": "^5.5.5", "eslint-plugin-tsdoc": "^0.5.2", "ethers-abitype": "1.0.3", - "prettier": "^3.8.1", + "prettier": "^3.8.3", "prool": "^0.2.4", - "typescript": "6.0.2", - "typescript-eslint": "8.58.1", - "viem": "^2.47.11" + "typescript": "6.0.3", + "typescript-eslint": "8.59.0", + "viem": "^2.48.4" }, "dependencies": { - "axios": "1.15.0", + "axios": "1.15.2", "@aptos-labs/ts-sdk": "^6.3.1", "buffer": "^6.0.3", "@coral-xyz/anchor": "^0.29.0", "@mysten/bcs": "^2.0.3", - "@mysten/sui": "^2.15.0", + "@mysten/sui": "^2.16.0", "@solana/spl-token": "0.4.14", "@solana/web3.js": "^1.98.4", "@ton/core": "0.63.1", "@ton/crypto": "^3.3.0", - "@ton/ton": "^16.2.3", - "abitype": "1.2.3", + "@ton/ton": "^16.2.4", + "abitype": "1.2.4", "bn.js": "^5.2.3", "borsh": "^2.0.0", "bs58": "^6.0.0", "ethers": "6.16.0", - "got": "^15.0.1", + "got": "^15.0.3", "micro-memoize": "^5.1.1", - "type-fest": "^5.5.0", + "type-fest": "^5.6.0", "yaml": "2.8.3" }, "overrides": { diff --git a/ccip-sdk/src/api/index.ts b/ccip-sdk/src/api/index.ts index 7b873a43..bda45b94 100644 --- a/ccip-sdk/src/api/index.ts +++ b/ccip-sdk/src/api/index.ts @@ -60,7 +60,7 @@ export const DEFAULT_TIMEOUT_MS = 30000 /** SDK version string for telemetry header */ // generate:nofail // `export const SDK_VERSION = '${require('./package.json').version}-${require('child_process').execSync('git rev-parse --short HEAD').toString().trim()}'` -export const SDK_VERSION = '1.4.2-257335e' +export const SDK_VERSION = '1.5.0-a368172f' // generate:end /** SDK telemetry header name */ diff --git a/ccip-sdk/src/aptos/hasher.ts b/ccip-sdk/src/aptos/hasher.ts index a12631b4..2c375a86 100644 --- a/ccip-sdk/src/aptos/hasher.ts +++ b/ccip-sdk/src/aptos/hasher.ts @@ -33,7 +33,7 @@ export function getAptosLeafHasher({ return ((message: CCIPMessage): string => hashV16AptosMessage(message, metadataHash)) as LeafHasher default: - throw new CCIPAptosHasherVersionUnsupportedError(version as string) + throw new CCIPAptosHasherVersionUnsupportedError(version) } } diff --git a/ccip-sdk/src/chain.ts b/ccip-sdk/src/chain.ts index 4d39f180..3985f50c 100644 --- a/ccip-sdk/src/chain.ts +++ b/ccip-sdk/src/chain.ts @@ -19,6 +19,8 @@ import type { EVMExtraArgsV1, EVMExtraArgsV2, ExtraArgs, + FinalityAllowed, + FinalityRequested, GenericExtraArgsV3, SVMExtraArgsV1, SuiExtraArgsV1, @@ -60,7 +62,7 @@ const V2_FIELDS = new Set(['gasLimit', 'allowOutOfOrderExecution']) /** All valid field names for GenericExtraArgsV3. */ const V3_FIELDS = new Set([ 'gasLimit', - 'blockConfirmations', + 'finality', 'ccvs', 'ccvArgs', 'executor', @@ -234,22 +236,22 @@ export type TotalFeesEstimate = { * - A flat USD surcharge (in cents) added to the CCIP fee via FeeQuoter * - A BPS rate deducted directly from the transferred token amount by the pool * - * "Default" fields apply when `blockConfirmations = 0` (standard finality). - * "Custom" fields apply when `blockConfirmations > 0` (Faster-Than-Finality). + * "Default" fields apply when `finality` is `0` or `'finalized'` (standard finality). + * "Custom" fields apply when `finality` is a block depth \> 0 (Faster-Than-Finality). */ export type TokenTransferFeeConfig = { /** Gas overhead added to the execution cost estimate for token transfers on the destination chain. */ destGasOverhead: number /** Byte overhead added to the data availability cost estimate for token transfers. */ destBytesOverhead: number - /** USD surcharge (in cents) added to the CCIP fee under standard finality (`blockConfirmations = 0`). */ - defaultBlockConfirmationsFeeUSDCents: number - /** USD surcharge (in cents) added to the CCIP fee under FTF (`blockConfirmations > 0`). */ - customBlockConfirmationsFeeUSDCents: number + /** USD surcharge (in cents) added to the CCIP fee under standard finality (`finality = 0` or `'finalized'`). */ + finalityFeeUSDCents: number + /** USD surcharge (in cents) added to the CCIP fee under FTF (block depth `finality > 0`). */ + fastFinalityFeeUSDCents: number /** BPS rate deducted from the transferred token amount under standard finality. */ - defaultBlockConfirmationsTransferFeeBps: number + finalityTransferFeeBps: number /** BPS rate deducted from the transferred token amount under FTF. */ - customBlockConfirmationsTransferFeeBps: number + fastFinalityTransferFeeBps: number /** Whether token transfer fees are enabled for this pool. */ isEnabled: boolean } @@ -260,8 +262,8 @@ export type TokenTransferFeeConfig = { export type TokenTransferFeeOpts = { /** Destination chain selector to query fee config for. */ destChainSelector: bigint - /** Number of block confirmations requested (0 = standard finality, positive = FTF). */ - blockConfirmationsRequested: number + /** Requested finality ('finalized', 'safe' or block depth). */ + finality: FinalityRequested /** Hex-encoded bytes passed as tokenArgs to the pool contract. */ tokenArgs: string } @@ -280,18 +282,22 @@ export const LaneFeature = { * - **\> 0**: FTF is enabled; this is the minimum number of block * confirmations required to use it. */ - MIN_BLOCK_CONFIRMATIONS: 'MIN_BLOCK_CONFIRMATIONS', + FINALITY_FAST: 'FINALITY_FAST', + /** + * Token supports "safe" finality option, aka Fast Confirmation Rule + */ + FINALITY_SAFE: 'FINALITY_SAFE', /** * Rate limiter bucket state for the lane/token with default finality. */ RATE_LIMITS: 'RATE_LIMITS', /** - * Rate limiter bucket state when using non-default finality (FTF). + * Rate limiter bucket state when using non-default finality (FTF or FCR). * Only meaningful when FTF is supported on this lane, i.e. - * {@link LaneFeature.MIN_BLOCK_CONFIRMATIONS} is present and \> 0. + * {@link LaneFeature.FINALITY_FAST} is present and \> 0. * If absent, the default rate limits ({@link LaneFeature.RATE_LIMITS}) apply even when using custom finality. */ - CUSTOM_BLOCK_CONFIRMATIONS_RATE_LIMITS: 'CUSTOM_BLOCK_CONFIRMATIONS_RATE_LIMITS', + FAST_RATE_LIMITS: 'FAST_RATE_LIMITS', } as const /** Type representing one of the lane feature keys. */ export type LaneFeature = (typeof LaneFeature)[keyof typeof LaneFeature] @@ -302,16 +308,35 @@ export type LaneFeature = (typeof LaneFeature)[keyof typeof LaneFeature] */ export interface LaneFeatures extends Record { /** Minimum block confirmations for FTF. */ - MIN_BLOCK_CONFIRMATIONS: number + FINALITY_FAST: number + /** FCR/safe finality. */ + FINALITY_SAFE: true /** Rate limiter bucket state for the lane/token with default finality. */ RATE_LIMITS: RateLimiterState /** * Rate limiter bucket state when using non-default finality (FTF). * If absent, the default rate limits ({@link LaneFeatures.RATE_LIMITS}) apply even when using custom finality. */ - CUSTOM_BLOCK_CONFIRMATIONS_RATE_LIMITS: RateLimiterState + FAST_RATE_LIMITS: RateLimiterState } +/** Compile-time helpers to keep {@link LaneFeature} and {@link LaneFeatures} in sync. */ +type LaneFeatureKeysMatch_ = [LaneFeature] extends [keyof LaneFeatures] + ? [keyof LaneFeatures] extends [LaneFeature] + ? true + : Exclude + : Exclude +const _laneFeatureKeysMatch: LaneFeatureKeysMatch_ = true + +/** + * Ensure LaneFeatures remains assignable to Record\ + * and does not declare extra keys beyond LaneFeature. + */ +const _laneFeaturesTypeCheck = null as unknown as LaneFeatures satisfies Record< + LaneFeature, + unknown +> + /** * Options for getBalance query. */ @@ -357,10 +382,10 @@ export type RateLimiterState = { * Each entry represents the configuration needed to transfer tokens * from the current chain to a specific destination chain. * - * The `customBlockConfirmationsOutboundRateLimiterState` and - * `customBlockConfirmationsInboundRateLimiterState` fields are present only for + * The `fastOutboundRateLimiterState` and + * `fastInboundRateLimiterState` fields are present only for * TokenPool v2.0+ contracts. These provide separate rate limits applied when - * Faster-Than-Finality (FTF) custom block confirmations are used. + * Faster-Than-Finality (FTF) or FCR (safe finality) is used. */ export type TokenPoolRemote = { /** Address of the remote token on the destination chain. */ @@ -381,10 +406,10 @@ export type TokenPoolRemote = { inboundRateLimiterState: RateLimiterState } & ( | { - /** Outbound rate limiter state for tokens leaving this chain (FTF/v2). */ - customBlockConfirmationsOutboundRateLimiterState: RateLimiterState - /** Inbound rate limiter state for tokens coming into this chain (FTF/v2). */ - customBlockConfirmationsInboundRateLimiterState: RateLimiterState + /** Outbound rate limiter state for tokens leaving this chain (FTF/FCR/v2). */ + fastOutboundRateLimiterState: RateLimiterState + /** Inbound rate limiter state for tokens coming into this chain (FTF/FCR/v2). */ + fastInboundRateLimiterState: RateLimiterState } | object ) @@ -408,20 +433,20 @@ export type TokenPoolConfig = { * May be undefined for older pool implementations that don't expose this method. */ typeAndVersion?: string - /** - * Min custom block confirmations for Faster-Than-Finality (FTF), - * if TokenPool version \>= v2.0.0 and FTF is supported on this lane. - * `0` indicates FTF is supported but not enabled for this token; `>0` indicates FTF is enabled - * with this many minimum confirmations. - */ - minBlockConfirmations?: number /** * Token transfer fee configuration from the pool contract. * Only present when {@link TokenTransferFeeOpts} is provided to * {@link Chain.getTokenPoolConfig} and the pool supports it (v2.0+). */ tokenTransferFeeConfig?: TokenTransferFeeConfig -} + /** + * Min finalityDepth and finality flags for Faster-Than-Finality (FTF) and FCR (safe), + * if TokenPool version \>= v2.0.0 and FTF is supported on this lane. + * `finalityDepth=0` indicates FTF is supported but not enabled for this token; + * `>0` indicates FTF is enabled with this many minimum confirmations. + * `finalitySafe=true` indicates support for FCR/safe finality. + */ +} & Partial /** * Token configuration from a TokenAdminRegistry, returned by {@link Chain.getRegistryTokenConfig}. @@ -1312,13 +1337,13 @@ export abstract class Chain { * router: '0x...', * destChainSelector: 4949039107694359620n, * }) - * // MIN_BLOCK_CONFIRMATIONS has three states: + * // FINALITY_FAST has three states: * // - undefined: FTF is not supported on this lane (pre-v2.0) * // - 0: the lane supports FTF, but it is not enabled for this token * // - > 0: FTF is enabled with this many block confirmations - * const ftf = features.MIN_BLOCK_CONFIRMATIONS + * const ftf = features[LaneFeature.FINALITY_FAST] * if (ftf != null && ftf > 0) { - * console.log(`FTF enabled with ${ftf} confirmations`) + * console.log(`FTF enabled with ${ftf} block confirmations`) * } else if (ftf === 0) { * console.log('FTF supported on this lane but not enabled for this token') * } @@ -1592,7 +1617,7 @@ export abstract class Chain { * * @remarks * V3 (GenericExtraArgsV3) is auto-detected when any V3-only field is present - * (e.g. `blockConfirmations`, `ccvs`, `ccvArgs`, `executor`, `executorArgs`, + * (e.g. `finality`, `ccvs`, `ccvArgs`, `executor`, `executorArgs`, * `tokenReceiver`, `tokenArgs`). Otherwise defaults to V2 (EVMExtraArgsV2). * * @throws {@link CCIPArgumentInvalidError} if extraArgs contains unknown fields for the detected version. @@ -1616,13 +1641,28 @@ export abstract class Chain { ) { tokenReceiver = this.getAddress(message.extraArgs.tokenReceiver) // validate } + let finality: FinalityRequested = 'finalized' + if ( + message.extraArgs && + 'finality' in message.extraArgs && + message.extraArgs.finality != null + ) { + const finality_ = Number(message.extraArgs.finality) + if (!isNaN(finality_)) finality = finality_ + else if (!['safe', 'finalized'].includes(message.extraArgs.finality as string)) + throw new CCIPArgumentInvalidError( + 'extraArgs.finality', + 'finality must be "safe", "finalized", or a numeric block depth', + { context: { finality: message.extraArgs.finality } }, + ) + else finality = message.extraArgs.finality + } // V3 defaults (GenericExtraArgsV3) return { ...message, receiver, extraArgs: { gasLimit, - blockConfirmations: 0, ccvs: [], ccvArgs: [], executor: '', @@ -1630,6 +1670,7 @@ export abstract class Chain { tokenArgs: '0x', ...message.extraArgs, tokenReceiver, + finality, }, } } diff --git a/ccip-sdk/src/commits.test.ts b/ccip-sdk/src/commits.test.ts index 79c0d35b..a486e2c2 100644 --- a/ccip-sdk/src/commits.test.ts +++ b/ccip-sdk/src/commits.test.ts @@ -191,7 +191,7 @@ class MockChain extends Chain { try { // Try v1.2/1.5 format first (ReportAccepted from CommitStore) const parsed12 = ifaceCommitStore.parseLog({ - topics: log.topics as string[], + topics: log.topics, data: typeof log.data === 'string' ? log.data : '0x', }) @@ -201,7 +201,7 @@ class MockChain extends Chain { // The actual filtering happens in getOnchainCommitReport based on the commitStore address return [ { - merkleRoot: parsed12.args.report.merkleRoot as string, + merkleRoot: parsed12.args.report.merkleRoot as `0x${string}`, minSeqNr: parsed12.args.report.interval.min as bigint, maxSeqNr: parsed12.args.report.interval.max as bigint, sourceChainSelector: lane.sourceChainSelector, @@ -216,7 +216,7 @@ class MockChain extends Chain { try { // Try v1.6 format (CommitReportAccepted) const parsed16 = iface16.parseLog({ - topics: log.topics as string[], + topics: log.topics, data: typeof log.data === 'string' ? log.data : '0x', }) @@ -269,7 +269,7 @@ class MockChain extends Chain { const iface = new Interface(OffRamp_1_6_ABI) try { const parsed = iface.parseLog({ - topics: _log.topics as string[], + topics: _log.topics, data: typeof _log.data === 'string' ? _log.data : '0x', }) if (parsed?.name === 'ExecutionStateChanged') { diff --git a/ccip-sdk/src/evm/abi/OffRamp_2_0.ts b/ccip-sdk/src/evm/abi/OffRamp_2_0.ts index 2cc17807..f1bd5a1e 100644 --- a/ccip-sdk/src/evm/abi/OffRamp_2_0.ts +++ b/ccip-sdk/src/evm/abi/OffRamp_2_0.ts @@ -1,7 +1,7 @@ // TODO: track a v2 release tag and the v2.0.0 folder instead of a commit + latest/ folder, once 2.0.0 is released in `chainlink-ccip` export default [ // generate: - // fetch('https://github.com/smartcontractkit/chainlink-ccip/raw/refs/heads/develop/ccv/chains/evm/gobindings/generated/latest/offramp/offramp.go') + // fetch('https://github.com/smartcontractkit/chainlink-ccip/raw/refs/heads/main/chains/evm/gobindings/generated/v2_0_0/offramp/offramp.go') // .then((res) => res.text()) // .then((body) => body.match(/^\s*ABI: "(.*?)",$/m)?.[1]) // .then((abi) => JSON.parse(abi.replace(/\\"/g, '"'))) @@ -142,7 +142,7 @@ export default [ type: 'uint32', internalType: 'uint32', }, - { name: 'finality', type: 'uint16', internalType: 'uint16' }, + { name: 'finality', type: 'bytes4', internalType: 'bytes4' }, { name: 'ccvAndExecutorHash', type: 'bytes32', @@ -596,19 +596,6 @@ export default [ name: 'InvalidEncodingVersion', inputs: [{ name: 'version', type: 'uint8', internalType: 'uint8' }], }, - { - type: 'error', - name: 'InvalidFinalityForReceiver', - inputs: [ - { name: 'receiver', type: 'address', internalType: 'address' }, - { name: 'msgBlockDepth', type: 'uint16', internalType: 'uint16' }, - { - name: 'requiredBlockDepth', - type: 'uint16', - internalType: 'uint16', - }, - ], - }, { type: 'error', name: 'InvalidGasLimitOverride', @@ -662,6 +649,22 @@ export default [ { name: 'got', type: 'uint256', internalType: 'uint256' }, ], }, + { + type: 'error', + name: 'InvalidRequestedFinality', + inputs: [ + { + name: 'requestedFinality', + type: 'bytes4', + internalType: 'bytes4', + }, + { + name: 'allowedFinality', + type: 'bytes4', + internalType: 'bytes4', + }, + ], + }, { type: 'error', name: 'InvalidVerifierResultsLength', @@ -705,6 +708,17 @@ export default [ inputs: [{ name: 'err', type: 'bytes', internalType: 'bytes' }], }, { type: 'error', name: 'ReentrancyGuardReentrantCall', inputs: [] }, + { + type: 'error', + name: 'RequestedFinalityCanOnlyHaveOneMode', + inputs: [ + { + name: 'encodedFinality', + type: 'bytes4', + internalType: 'bytes4', + }, + ], + }, { type: 'error', name: 'RequiredCCVMissing', diff --git a/ccip-sdk/src/evm/abi/OnRamp_2_0.ts b/ccip-sdk/src/evm/abi/OnRamp_2_0.ts index 3cb7ca3b..51370490 100644 --- a/ccip-sdk/src/evm/abi/OnRamp_2_0.ts +++ b/ccip-sdk/src/evm/abi/OnRamp_2_0.ts @@ -1,7 +1,7 @@ // TODO: track a v2 release tag and the v2.0.0 folder instead of a commit + latest/ folder, once 2.0.0 is released in `chainlink-ccip` export default [ // generate: - // fetch('https://github.com/smartcontractkit/chainlink-ccip/raw/refs/heads/develop/ccv/chains/evm/gobindings/generated/latest/onramp/onramp.go') + // fetch('https://github.com/smartcontractkit/chainlink-ccip/raw/refs/heads/main/chains/evm/gobindings/generated/v2_0_0/onramp/onramp.go') // .then((res) => res.text()) // .then((body) => body.match(/^\s*ABI: "(.*?)",$/m)?.[1]) // .then((abi) => JSON.parse(abi.replace(/\\"/g, '"'))) @@ -829,11 +829,6 @@ export default [ }, ], }, - { - type: 'error', - name: 'CustomBlockConfirmationsNotSupportedOnPoolV1', - inputs: [], - }, { type: 'error', name: 'DestinationChainNotSupported', @@ -862,6 +857,7 @@ export default [ name: 'DuplicateCCVNotAllowed', inputs: [{ name: 'ccvAddress', type: 'address', internalType: 'address' }], }, + { type: 'error', name: 'FTFNotSupportedOnPoolV1', inputs: [] }, { type: 'error', name: 'FeeExceedsMaxAllowed', @@ -949,6 +945,17 @@ export default [ { type: 'error', name: 'OnlyCallableByOwner', inputs: [] }, { type: 'error', name: 'OwnerCannotBeZero', inputs: [] }, { type: 'error', name: 'ReentrancyGuardReentrantCall', inputs: [] }, + { + type: 'error', + name: 'RequestedFinalityCanOnlyHaveOneMode', + inputs: [ + { + name: 'encodedFinality', + type: 'bytes4', + internalType: 'bytes4', + }, + ], + }, { type: 'error', name: 'RouterMustSetOriginalSender', inputs: [] }, { type: 'error', diff --git a/ccip-sdk/src/evm/abi/TokenPool_2_0.ts b/ccip-sdk/src/evm/abi/TokenPool_2_0.ts index 3b2ee9ca..2442c0e6 100644 --- a/ccip-sdk/src/evm/abi/TokenPool_2_0.ts +++ b/ccip-sdk/src/evm/abi/TokenPool_2_0.ts @@ -1,7 +1,7 @@ // TODO: track a v2 release tag and the v2.0.0 folder instead of a commit + latest/ folder, once 2.0.0 is released in `chainlink-ccip` export default [ // generate: - // fetch('https://github.com/smartcontractkit/chainlink-ccip/raw/refs/heads/develop/ccv/chains/evm/gobindings/generated/latest/token_pool/token_pool.go') + // fetch('https://github.com/smartcontractkit/chainlink-ccip/raw/refs/heads/main/chains/evm/gobindings/generated/v2_0_0/token_pool/token_pool.go') // .then((res) => res.text()) // .then((body) => body.match(/^\s*ABI: "(.*?)",$/m)?.[1]) // .then((abi) => JSON.parse(abi.replace(/\\"/g, '"'))) @@ -132,22 +132,22 @@ export default [ internalType: 'uint32', }, { - name: 'defaultBlockConfirmationsFeeUSDCents', + name: 'finalityFeeUSDCents', type: 'uint32', internalType: 'uint32', }, { - name: 'customBlockConfirmationsFeeUSDCents', + name: 'fastFinalityFeeUSDCents', type: 'uint32', internalType: 'uint32', }, { - name: 'defaultBlockConfirmationsTransferFeeBps', + name: 'finalityTransferFeeBps', type: 'uint16', internalType: 'uint16', }, { - name: 'customBlockConfirmationsTransferFeeBps', + name: 'fastFinalityTransferFeeBps', type: 'uint16', internalType: 'uint16', }, @@ -178,6 +178,19 @@ export default [ ], stateMutability: 'view', }, + { + type: 'function', + name: 'getAllowedFinalityConfig', + inputs: [], + outputs: [ + { + name: 'allowedFinality', + type: 'bytes4', + internalType: 'bytes4', + }, + ], + stateMutability: 'view', + }, { type: 'function', name: 'getCurrentRateLimiterState', @@ -187,11 +200,7 @@ export default [ type: 'uint64', internalType: 'uint64', }, - { - name: 'customBlockConfirmations', - type: 'bool', - internalType: 'bool', - }, + { name: 'fastFinality', type: 'bool', internalType: 'bool' }, ], outputs: [ { @@ -265,9 +274,9 @@ export default [ { name: '', type: 'uint256', internalType: 'uint256' }, { name: '', type: 'address', internalType: 'address' }, { - name: 'blockConfirmationsRequested', - type: 'uint16', - internalType: 'uint16', + name: 'requestedFinalityConfig', + type: 'bytes4', + internalType: 'bytes4', }, { name: '', type: 'bytes', internalType: 'bytes' }, ], @@ -288,19 +297,6 @@ export default [ ], stateMutability: 'view', }, - { - type: 'function', - name: 'getMinBlockConfirmations', - inputs: [], - outputs: [ - { - name: 'minBlockConfirmations', - type: 'uint16', - internalType: 'uint16', - }, - ], - stateMutability: 'view', - }, { type: 'function', name: 'getRemotePools', @@ -343,9 +339,9 @@ export default [ internalType: 'uint256', }, { - name: 'blockConfirmationsRequested', - type: 'uint16', - internalType: 'uint16', + name: 'requestedFinalityConfig', + type: 'bytes4', + internalType: 'bytes4', }, { name: 'extraData', type: 'bytes', internalType: 'bytes' }, { @@ -407,7 +403,7 @@ export default [ type: 'uint64', internalType: 'uint64', }, - { name: '', type: 'uint16', internalType: 'uint16' }, + { name: '', type: 'bytes4', internalType: 'bytes4' }, { name: '', type: 'bytes', internalType: 'bytes' }, ], outputs: [ @@ -427,22 +423,22 @@ export default [ internalType: 'uint32', }, { - name: 'defaultBlockConfirmationsFeeUSDCents', + name: 'finalityFeeUSDCents', type: 'uint32', internalType: 'uint32', }, { - name: 'customBlockConfirmationsFeeUSDCents', + name: 'fastFinalityFeeUSDCents', type: 'uint32', internalType: 'uint32', }, { - name: 'defaultBlockConfirmationsTransferFeeBps', + name: 'finalityTransferFeeBps', type: 'uint16', internalType: 'uint16', }, { - name: 'customBlockConfirmationsTransferFeeBps', + name: 'fastFinalityTransferFeeBps', type: 'uint16', internalType: 'uint16', }, @@ -569,9 +565,9 @@ export default [ ], }, { - name: 'blockConfirmationsRequested', - type: 'uint16', - internalType: 'uint16', + name: 'requestedFinalityConfig', + type: 'bytes4', + internalType: 'bytes4', }, { name: 'tokenArgs', type: 'bytes', internalType: 'bytes' }, ], @@ -659,6 +655,11 @@ export default [ }, ], }, + { + name: 'requestedFinalityConfig', + type: 'bytes4', + internalType: 'bytes4', + }, ], outputs: [ { @@ -727,11 +728,6 @@ export default [ }, ], }, - { - name: 'blockConfirmationsRequested', - type: 'uint16', - internalType: 'uint16', - }, ], outputs: [ { @@ -769,28 +765,28 @@ export default [ }, { type: 'function', - name: 'setDynamicConfig', + name: 'setAllowedFinalityConfig', inputs: [ - { name: 'router', type: 'address', internalType: 'address' }, { - name: 'rateLimitAdmin', - type: 'address', - internalType: 'address', + name: 'allowedFinality', + type: 'bytes4', + internalType: 'bytes4', }, - { name: 'feeAdmin', type: 'address', internalType: 'address' }, ], outputs: [], stateMutability: 'nonpayable', }, { type: 'function', - name: 'setMinBlockConfirmations', + name: 'setDynamicConfig', inputs: [ + { name: 'router', type: 'address', internalType: 'address' }, { - name: 'minBlockConfirmations', - type: 'uint16', - internalType: 'uint16', + name: 'rateLimitAdmin', + type: 'address', + internalType: 'address', }, + { name: 'feeAdmin', type: 'address', internalType: 'address' }, ], outputs: [], stateMutability: 'nonpayable', @@ -809,11 +805,7 @@ export default [ type: 'uint64', internalType: 'uint64', }, - { - name: 'customBlockConfirmations', - type: 'bool', - internalType: 'bool', - }, + { name: 'fastFinality', type: 'bool', internalType: 'bool' }, { name: 'outboundRateLimiterConfig', type: 'tuple', @@ -861,7 +853,7 @@ export default [ name: 'supportsInterface', inputs: [{ name: 'interfaceId', type: 'bytes4', internalType: 'bytes4' }], outputs: [{ name: '', type: 'bool', internalType: 'bool' }], - stateMutability: 'pure', + stateMutability: 'view', }, { type: 'function', @@ -980,32 +972,32 @@ export default [ }, { type: 'event', - name: 'CustomBlockConfirmationsInboundRateLimitConsumed', + name: 'DynamicConfigSet', inputs: [ { - name: 'remoteChainSelector', - type: 'uint64', - indexed: true, - internalType: 'uint64', + name: 'router', + type: 'address', + indexed: false, + internalType: 'address', }, { - name: 'token', + name: 'rateLimitAdmin', type: 'address', indexed: false, internalType: 'address', }, { - name: 'amount', - type: 'uint256', + name: 'feeAdmin', + type: 'address', indexed: false, - internalType: 'uint256', + internalType: 'address', }, ], anonymous: false, }, { type: 'event', - name: 'CustomBlockConfirmationsOutboundRateLimitConsumed', + name: 'FastFinalityInboundRateLimitConsumed', inputs: [ { name: 'remoteChainSelector', @@ -1030,25 +1022,25 @@ export default [ }, { type: 'event', - name: 'DynamicConfigSet', + name: 'FastFinalityOutboundRateLimitConsumed', inputs: [ { - name: 'router', - type: 'address', - indexed: false, - internalType: 'address', + name: 'remoteChainSelector', + type: 'uint64', + indexed: true, + internalType: 'uint64', }, { - name: 'rateLimitAdmin', + name: 'token', type: 'address', indexed: false, internalType: 'address', }, { - name: 'feeAdmin', - type: 'address', + name: 'amount', + type: 'uint256', indexed: false, - internalType: 'address', + internalType: 'uint256', }, ], anonymous: false, @@ -1078,6 +1070,19 @@ export default [ ], anonymous: false, }, + { + type: 'event', + name: 'FinalityConfigSet', + inputs: [ + { + name: 'allowedFinality', + type: 'bytes4', + indexed: false, + internalType: 'bytes4', + }, + ], + anonymous: false, + }, { type: 'event', name: 'InboundRateLimitConsumed', @@ -1134,19 +1139,6 @@ export default [ ], anonymous: false, }, - { - type: 'event', - name: 'MinBlockConfirmationsSet', - inputs: [ - { - name: 'minBlockConfirmations', - type: 'uint16', - indexed: false, - internalType: 'uint16', - }, - ], - anonymous: false, - }, { type: 'event', name: 'OutboundRateLimitConsumed', @@ -1221,7 +1213,7 @@ export default [ internalType: 'uint64', }, { - name: 'customBlockConfirmations', + name: 'fastFinality', type: 'bool', indexed: false, internalType: 'bool', @@ -1374,22 +1366,22 @@ export default [ internalType: 'uint32', }, { - name: 'defaultBlockConfirmationsFeeUSDCents', + name: 'finalityFeeUSDCents', type: 'uint32', internalType: 'uint32', }, { - name: 'customBlockConfirmationsFeeUSDCents', + name: 'fastFinalityFeeUSDCents', type: 'uint32', internalType: 'uint32', }, { - name: 'defaultBlockConfirmationsTransferFeeBps', + name: 'finalityTransferFeeBps', type: 'uint16', internalType: 'uint16', }, { - name: 'customBlockConfirmationsTransferFeeBps', + name: 'fastFinalityTransferFeeBps', type: 'uint16', internalType: 'uint16', }, @@ -1428,11 +1420,6 @@ export default [ ], }, { type: 'error', name: 'CursedByRMN', inputs: [] }, - { - type: 'error', - name: 'CustomBlockConfirmationsNotEnabled', - inputs: [], - }, { type: 'error', name: 'DisabledNonZeroRateLimit', @@ -1461,18 +1448,6 @@ export default [ { name: 'actual', type: 'uint8', internalType: 'uint8' }, ], }, - { - type: 'error', - name: 'InvalidMinBlockConfirmations', - inputs: [ - { name: 'requested', type: 'uint16', internalType: 'uint16' }, - { - name: 'minBlockConfirmations', - type: 'uint16', - internalType: 'uint16', - }, - ], - }, { type: 'error', name: 'InvalidRateLimitRate', @@ -1514,6 +1489,22 @@ export default [ }, ], }, + { + type: 'error', + name: 'InvalidRequestedFinality', + inputs: [ + { + name: 'requestedFinality', + type: 'bytes4', + internalType: 'bytes4', + }, + { + name: 'allowedFinality', + type: 'bytes4', + internalType: 'bytes4', + }, + ], + }, { type: 'error', name: 'InvalidSourcePoolAddress', @@ -1589,6 +1580,17 @@ export default [ }, ], }, + { + type: 'error', + name: 'RequestedFinalityCanOnlyHaveOneMode', + inputs: [ + { + name: 'encodedFinality', + type: 'bytes4', + internalType: 'bytes4', + }, + ], + }, { type: 'error', name: 'SafeERC20FailedOperation', diff --git a/ccip-sdk/src/evm/abi/USDCTokenPoolProxy_2_0.ts b/ccip-sdk/src/evm/abi/USDCTokenPoolProxy_2_0.ts index a684c05c..9badbe01 100644 --- a/ccip-sdk/src/evm/abi/USDCTokenPoolProxy_2_0.ts +++ b/ccip-sdk/src/evm/abi/USDCTokenPoolProxy_2_0.ts @@ -1,7 +1,7 @@ // TODO: track a v2 release tag and the v2.0.0 folder instead of a commit + latest/ folder, once 2.0.0 is released in `chainlink-ccip` export default [ // generate: - // fetch('https://github.com/smartcontractkit/chainlink-ccip/raw/refs/heads/develop/ccv/chains/evm/gobindings/generated/latest/usdc_token_pool_proxy/usdc_token_pool_proxy.go') + // fetch('https://github.com/smartcontractkit/chainlink-ccip/raw/refs/heads/main/chains/evm/gobindings/generated/v2_0_0/usdc_token_pool_proxy/usdc_token_pool_proxy.go') // .then((res) => res.text()) // .then((body) => body.match(/^\s*ABI: "(.*?)",$/m)?.[1]) // .then((abi) => JSON.parse(abi.replace(/\\"/g, '"'))) @@ -70,9 +70,9 @@ export default [ { name: 'amount', type: 'uint256', internalType: 'uint256' }, { name: 'feeToken', type: 'address', internalType: 'address' }, { - name: 'blockConfirmationsRequested', - type: 'uint16', - internalType: 'uint16', + name: 'requestedFinalityConfig', + type: 'bytes4', + internalType: 'bytes4', }, { name: 'tokenArgs', type: 'bytes', internalType: 'bytes' }, ], @@ -191,7 +191,7 @@ export default [ internalType: 'uint64', }, { name: '', type: 'uint256', internalType: 'uint256' }, - { name: '', type: 'uint16', internalType: 'uint16' }, + { name: '', type: 'bytes4', internalType: 'bytes4' }, { name: 'extraData', type: 'bytes', internalType: 'bytes' }, { name: 'direction', @@ -247,9 +247,9 @@ export default [ internalType: 'uint64', }, { - name: 'blockConfirmationsRequested', - type: 'uint16', - internalType: 'uint16', + name: 'requestedFinalityConfig', + type: 'bytes4', + internalType: 'bytes4', }, { name: 'tokenArgs', type: 'bytes', internalType: 'bytes' }, ], @@ -270,22 +270,22 @@ export default [ internalType: 'uint32', }, { - name: 'defaultBlockConfirmationsFeeUSDCents', + name: 'finalityFeeUSDCents', type: 'uint32', internalType: 'uint32', }, { - name: 'customBlockConfirmationsFeeUSDCents', + name: 'fastFinalityFeeUSDCents', type: 'uint32', internalType: 'uint32', }, { - name: 'defaultBlockConfirmationsTransferFeeBps', + name: 'finalityTransferFeeBps', type: 'uint16', internalType: 'uint16', }, { - name: 'customBlockConfirmationsTransferFeeBps', + name: 'fastFinalityTransferFeeBps', type: 'uint16', internalType: 'uint16', }, @@ -394,9 +394,9 @@ export default [ ], }, { - name: 'blockConfirmationsRequested', - type: 'uint16', - internalType: 'uint16', + name: 'requestedFinalityConfig', + type: 'bytes4', + internalType: 'bytes4', }, { name: 'tokenArgs', type: 'bytes', internalType: 'bytes' }, ], @@ -484,6 +484,11 @@ export default [ }, ], }, + { + name: 'requestedFinalityConfig', + type: 'bytes4', + internalType: 'bytes4', + }, ], outputs: [ { @@ -552,11 +557,6 @@ export default [ }, ], }, - { - name: 'blockConfirmationsRequested', - type: 'uint16', - internalType: 'uint16', - }, ], outputs: [ { diff --git a/ccip-sdk/src/evm/abi/VersionedVerifierResolver_2_0.ts b/ccip-sdk/src/evm/abi/VersionedVerifierResolver_2_0.ts index aec9744e..520f318f 100644 --- a/ccip-sdk/src/evm/abi/VersionedVerifierResolver_2_0.ts +++ b/ccip-sdk/src/evm/abi/VersionedVerifierResolver_2_0.ts @@ -1,7 +1,7 @@ // TODO: track a v2 release tag and the v2.0.0 folder instead of a commit + latest/ folder, once 2.0.0 is released in `chainlink-ccip` export default [ // generate: - // fetch('https://github.com/smartcontractkit/chainlink-ccip/raw/refs/heads/develop/ccv/chains/evm/gobindings/generated/latest/versioned_verifier_resolver/versioned_verifier_resolver.go') + // fetch('https://github.com/smartcontractkit/chainlink-ccip/raw/refs/heads/main/chains/evm/gobindings/generated/v2_0_0/versioned_verifier_resolver/versioned_verifier_resolver.go') // .then((res) => res.text()) // .then((body) => body.match(/^\s*ABI: "(.*?)",$/m)?.[1]) // .then((abi) => JSON.parse(abi.replace(/\\"/g, '"'))) diff --git a/ccip-sdk/src/evm/const.ts b/ccip-sdk/src/evm/const.ts index 068ae264..08837208 100644 --- a/ccip-sdk/src/evm/const.ts +++ b/ccip-sdk/src/evm/const.ts @@ -34,6 +34,7 @@ const customErrors = [ 'error InvalidChain(uint64 chainSelector)', 'error InvalidAdapter()', 'error BlacklistableBlacklistedAccount(address)', + 'error WrongAsset(address expected, address received)', ] as const export const VersionedContractABI = parseAbi(['function typeAndVersion() view returns (string)']) diff --git a/ccip-sdk/src/evm/decode.test.ts b/ccip-sdk/src/evm/decode.test.ts index fc7daf65..da0e8868 100644 --- a/ccip-sdk/src/evm/decode.test.ts +++ b/ccip-sdk/src/evm/decode.test.ts @@ -337,17 +337,11 @@ describe('EVMChain.decodeMessage', () => { describe('error handling', () => { it('should throw on invalid data (not BytesLike)', () => { - assert.throws( - () => EVMChain.decodeMessage({ data: 123 as unknown as string }), - /Invalid log data/, - ) + assert.throws(() => EVMChain.decodeMessage({ data: 123 }), /Invalid log data/) }) it('should throw on invalid data (object)', () => { - assert.throws( - () => EVMChain.decodeMessage({ data: { foo: 'bar' } as unknown as string }), - /Invalid log data/, - ) + assert.throws(() => EVMChain.decodeMessage({ data: { foo: 'bar' } }), /Invalid log data/) }) it('should return undefined for unknown topic', () => { @@ -616,10 +610,7 @@ describe('EVMChain.decodeCommits', () => { describe('error handling', () => { it('should throw on invalid data', () => { - assert.throws( - () => EVMChain.decodeCommits({ data: 123 as unknown as string }), - /Invalid log data/, - ) + assert.throws(() => EVMChain.decodeCommits({ data: 123 }), /Invalid log data/) }) it('should return undefined for unknown topic', () => { @@ -719,10 +710,7 @@ describe('EVMChain.decodeReceipt', () => { describe('error handling', () => { it('should throw on invalid data', () => { - assert.throws( - () => EVMChain.decodeReceipt({ data: null as unknown as string }), - /Invalid log data/, - ) + assert.throws(() => EVMChain.decodeReceipt({ data: null }), /Invalid log data/) }) it('should return undefined for unknown topic', () => { diff --git a/ccip-sdk/src/evm/errors.test.ts b/ccip-sdk/src/evm/errors.test.ts index a4836ef5..9ff4e755 100644 --- a/ccip-sdk/src/evm/errors.test.ts +++ b/ccip-sdk/src/evm/errors.test.ts @@ -117,7 +117,7 @@ describe('recursiveParseError', () => { assert.ok((res[0]![1] as string).includes('ExecutionError')) assert.equal(res[1]![0], 'err.error') assert.ok((res[1]![1] as string).includes('ReceiverError')) - assert.equal(res[2]![0], 'err.error.err') + assert.equal(res[2]![0], 'err.err') assert.match(res[2]![1] as string, /\b0x\b/) assert.ok((res[2]![1] as string).includes('out-of-gas')) }) diff --git a/ccip-sdk/src/evm/errors.ts b/ccip-sdk/src/evm/errors.ts index 08a177f2..06cd4ab2 100644 --- a/ccip-sdk/src/evm/errors.ts +++ b/ccip-sdk/src/evm/errors.ts @@ -140,10 +140,10 @@ export function recursiveParseError( try { const obj = data.toObject() const keys = Object.keys(obj) - + // eslint-disable-next-line no-restricted-syntax if (keys.length > 0 && keys.every((k) => k.startsWith('_'))) throw new Error('not an obj') kv = Object.entries(obj).map(([k, v]) => [j(key, k), v]) - } catch (_) { + } catch { kv = data.toArray().map((v, i) => [j(key, `[${i}]`), v]) } return kv.reduce( @@ -152,15 +152,15 @@ export function recursiveParseError( ) } if (!isBytesLike(data) || [0, 20].includes(dataLength(data))) { - // include networkName for chainSelectors - if (key.match(/sel(ector)?$/i) && typeof data === 'bigint') { - let name + if (key.match(/[Ss]el(ector)?$/) && typeof data === 'bigint') { + // try to include networkName for chainSelectors try { - ;({ name } = networkInfo(data)) + data = `${data} [${networkInfo(data).name}]` } catch { // ignore } - if (name) return [[key, `${data} [${name}]`]] + } else if (key.match(/\berr$/) && data === '0x') { + data = '0x [possibly out-of-gas or abi.decode error]' } return [[key, data]] } @@ -182,10 +182,6 @@ export function recursiveParseError( typeof recursiveParseError > if (!args) return res - if (['ReceiverError', 'TokenHandlingError'].includes(fragment.name) && args.err === '0x') { - res.push([`${key_}.err`, '0x [possibly out-of-gas or abi.decode error]']) - return res - } res.push(...recursiveParseError(key, args)) return res } diff --git a/ccip-sdk/src/evm/extra-args.ts b/ccip-sdk/src/evm/extra-args.ts index a349f826..9b711089 100644 --- a/ccip-sdk/src/evm/extra-args.ts +++ b/ccip-sdk/src/evm/extra-args.ts @@ -23,6 +23,8 @@ import { GenericExtraArgsV3Tag, SVMExtraArgsV1Tag, SuiExtraArgsV1Tag, + decodeFinalityRequested, + encodeFinality, } from '../extra-args.ts' import { DEFAULT_GAS_LIMIT } from '../shared/constants.ts' import { ChainFamily } from '../types.ts' @@ -44,7 +46,7 @@ const SuiExtraArgsV1ABI = * Binary format: * - tag (4 bytes): 0xa69dd4aa * - gasLimit (4 bytes): uint32 big-endian - * - blockConfirmations (2 bytes): uint16 big-endian + * - finality (4 bytes): uint32 big-endian (see FinalityCodec / encodeFinality) * - ccvsLength (1 byte): uint8 * - For each CCV: * - ccvAddressLength (1 byte): 0 or 20 @@ -69,8 +71,8 @@ function encodeExtraArgsV3(args: GenericExtraArgsV3): string { // gasLimit (4 bytes, uint32 big-endian) parts.push(toBeArray(args.gasLimit, 4)) - // blockConfirmations (2 bytes, uint16 big-endian) - parts.push(toBeArray(args.blockConfirmations, 2)) + // finality (4 bytes, uint32 big-endian) + parts.push(toBeArray(encodeFinality(args.finality), 4)) // ccvsLength (1 byte) parts.push(new Uint8Array([args.ccvs.length])) @@ -152,10 +154,10 @@ function decodeExtraArgsV3(data: Uint8Array): GenericExtraArgsV3 | undefined { const gasLimit = toBigInt(data.subarray(offset, offset + 4)) offset += 4 - // blockConfirmations (2 bytes, uint16 big-endian) - if (offset + 2 > data.length) return undefined - const blockConfirmations = toNumber(data.subarray(offset, offset + 2)) - offset += 2 + // finality (4 bytes, uint32 big-endian) + if (offset + 4 > data.length) return undefined + const finality = decodeFinalityRequested(toNumber(data.subarray(offset, offset + 4))) + offset += 4 // ccvsLength (1 byte) if (offset + 1 > data.length) return undefined @@ -252,7 +254,7 @@ function decodeExtraArgsV3(data: Uint8Array): GenericExtraArgsV3 | undefined { return { gasLimit, - blockConfirmations, + finality, ccvs, ccvArgs, executor, @@ -319,7 +321,7 @@ export function decodeExtraArgs( */ export function encodeExtraArgs(args: ExtraArgs | undefined): string { if (!args) return '0x' - if ('blockConfirmations' in args) { + if ('finality' in args) { // GenericExtraArgsV3 - tightly packed binary encoding return encodeExtraArgsV3(args) } else if ('computeUnits' in args) { diff --git a/ccip-sdk/src/evm/fork.test.ts b/ccip-sdk/src/evm/fork.test.ts index 90be6b70..fb6b5204 100644 --- a/ccip-sdk/src/evm/fork.test.ts +++ b/ccip-sdk/src/evm/fork.test.ts @@ -27,6 +27,11 @@ const SEPOLIA_ROUTER = '0x0BF3dE8c5D3e8A2B34D2BEeB17ABfCeBaf363A59' const FUJI_RPC = process.env['RPC_FUJI'] || 'https://api.avax-test.network/ext/bc/C/rpc' const FUJI_CHAIN_ID = 43113 +const ARB_SEP_RPC = process.env['RPC_ARB_SEPOLIA'] || 'https://arbitrum-sepolia-rpc.publicnode.com' +const ARB_SEP_CHAIN_ID = 421614 +const ARB_SEP_SELECTOR = 3478487238524512106n +const ARB_SEP_V2_0_ROUTER = '0x8F95FA37c55eF7beFdf05f6abDeC551773E17Fb4' + const ANVIL_PRIVATE_KEY = '0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80' // ── getFeeTokens constants ── @@ -54,22 +59,20 @@ const APTOS_SUPPORTED_TOKEN = '0xFd57b4ddBf88a4e07fF4e34C487b99af2Fe82a05' // ── getLaneFeatures constants ── // v2.0 router for Sepolia -> Fuji lane -const SEPOLIA_V2_0_ROUTER = '0xc0f457e615348708FaAB3B40ECC26Badb32B7b30' +const SEPOLIA_V2_0_ROUTER = '0x784d49a71BB4C48eB7dA4cD7e6Ecb424f9b5EAB1' // v2.0 router for Fuji -> Sepolia lane -const FUJI_V2_0_ROUTER = '0xE7b62d27D6DDca525FE2e1ea526905EbfB36a1e1' -// Token on Sepolia whose pool (BurnMintTokenPool 1.7.0-dev) supports the older -// singular getMinBlockConfirmation(), not the plural getMinBlockConfirmations() -// in our current ABI. This exercises the try-catch fallback path. -const OLD_POOL_TOKEN_SEPOLIA = '0x67f000ca40cb1c6ee3bd2c7fda2fd22ddf56faab' -// Token on Fuji whose pool (LombardTokenPool 2.0.0-dev) DOES support getMinBlockConfirmations -const FTF_TOKEN_FUJI = '0x7FbdC44BfEBDe80C970ba622B678daB36cee31f6' +const FUJI_V2_0_ROUTER = '0x7C9B8B4e8024e5Ee8A630F6FCe9015e470dA5763' +// Token on Fuji whose v2.0 pool (BurnMintTokenPool 2.0.0) has FTF disabled +// (allowedFinalityConfig = 0x00000000). Used by tests that need a v2.0 pool +// without Fast Transfer Finality enabled. +const NOFTF_TOKEN_FUJI = '0xcba4fd7b4fe7adf246007d6228d42162815a1fd0' // CCIP-BnM on Sepolia — supported on v1.5 Sepolia→Fuji lane const CCIP_BNM_TOKEN_SEPOLIA = '0xFd57b4ddBf88a4e07fF4e34C487b99af2Fe82a05' // Token pools with FTF enabled and custom rate limits configured -const FTF_ENABLED_POOL_SEPOLIA = '0x161d23c30b5ae2899c3d4d969ba2b82026f3954a' -const FTF_ENABLED_POOL_FUJI = '0xc9346f85a04a47188710d8830127a2490959cbd9' +const FTF_ENABLED_POOL_SEPOLIA = '0x6e2df115f6cb112533be550ca70a41428a465925' +const FTF_ENABLED_POOL_FUJI = '0xcf0e862b5dc183adb8c42595238a982e45f58df1' // Token served by FTF_ENABLED_POOL_SEPOLIA — works with V3 extra args on Sepolia→Fuji v2.0 lane -const FTF_TOKEN_SEPOLIA = '0x6b039E8bDB3F92093AdC417367379089be7A80B1' +const FTF_TOKEN_SEPOLIA = '0xa41a773a7b68e80d4760a176cfec8f50e80d65a7' // ── execute constants ── // Known message stuck in FAILED state on sepolia, sent from fuji (v1.6) @@ -78,8 +81,12 @@ const EXEC_TEST_MSG = FUJI_TO_SEPOLIA.find( )! const SOURCE_TX_HASH = EXEC_TEST_MSG.txHash const MESSAGE_ID = EXEC_TEST_MSG.messageId +// Arb-Sep → Fuji v2.0.0 message that FAILED on-chain due to intentional OOG +// (ccipReceive gasLimit=100). CCV verification is COMPLETED so the message is +// readyForManualExecution — re-executing it on a Fuji fork with a higher +// gasLimit succeeds, exercising the API-driven manual-exec recovery path. const V2_API_EXEC_MSG = { - messageId: '0x886836ec7b9adc834d45d70c4cbd05f2623f56add4e15a96e12758c941452155', + messageId: '0x2dedf76b3e16020807ca43a28f3c7210bf4305a6eadf98df9d2c5ceddd4a4f71', } // Second failed v1.6 message for getExecutionInput test (different from above so both can execute) @@ -132,9 +139,11 @@ const skipHighRpcLoad = !process.env.RUN_HIGH_RPC_LOAD_TESTS describe('EVM Fork Tests', { skip, timeout: 180_000 }, () => { let sepoliaChain: EVMChain | undefined let fujiChain: EVMChain | undefined + let arbSepChain: EVMChain | undefined let wallet: Wallet let sepoliaInstance: ReturnType | undefined let fujiInstance: ReturnType | undefined + let arbSepInstance: ReturnType | undefined before(async () => { sepoliaInstance = Instance.anvil({ @@ -143,25 +152,38 @@ describe('EVM Fork Tests', { skip, timeout: 180_000 }, () => { port: 8646, }) fujiInstance = Instance.anvil({ forkUrl: FUJI_RPC, chainId: FUJI_CHAIN_ID, port: 8645 }) - await Promise.all([sepoliaInstance.start(), fujiInstance.start()]) + arbSepInstance = Instance.anvil({ + forkUrl: ARB_SEP_RPC, + chainId: ARB_SEP_CHAIN_ID, + port: 8644, + }) + await Promise.all([sepoliaInstance.start(), fujiInstance.start(), arbSepInstance.start()]) const sepoliaProvider = new JsonRpcProvider( `http://${sepoliaInstance.host}:${sepoliaInstance.port}`, ) const fujiProvider = new JsonRpcProvider(`http://${fujiInstance.host}:${fujiInstance.port}`) + const arbSepProvider = new JsonRpcProvider( + `http://${arbSepInstance.host}:${arbSepInstance.port}`, + ) sepoliaChain = await EVMChain.fromProvider(sepoliaProvider, { apiClient: null, logger: testLogger, }) fujiChain = await EVMChain.fromProvider(fujiProvider, { apiClient: null, logger: testLogger }) + arbSepChain = await EVMChain.fromProvider(arbSepProvider, { + apiClient: null, + logger: testLogger, + }) wallet = new Wallet(ANVIL_PRIVATE_KEY, sepoliaProvider) }) after(async () => { sepoliaChain?.destroy?.() fujiChain?.destroy?.() - await Promise.all([sepoliaInstance?.stop(), fujiInstance?.stop()]) + arbSepChain?.destroy?.() + await Promise.all([sepoliaInstance?.stop(), fujiInstance?.stop(), arbSepInstance?.stop()]) }) describe('getBalance', () => { @@ -536,7 +558,7 @@ describe('EVM Fork Tests', { skip, timeout: 180_000 }, () => { }) describe('getLaneFeatures', () => { - it('should return MIN_BLOCK_CONFIRMATIONS=0 and no rate limits for v1.6 router', async () => { + it('should return FINALITY_FAST=undefined and no rate limits for v1.6 router', async () => { assert.ok(sepoliaChain, 'sepolia chain should be initialized') const features = await sepoliaChain.getLaneFeatures({ @@ -545,9 +567,9 @@ describe('EVM Fork Tests', { skip, timeout: 180_000 }, () => { }) assert.equal( - features[LaneFeature.MIN_BLOCK_CONFIRMATIONS], + features[LaneFeature.FINALITY_FAST], undefined, - 'v1.6 lane should not include MIN_BLOCK_CONFIRMATIONS (FTF does not exist pre-v2.0)', + 'v1.6 lane should not include FINALITY_FAST (FTF does not exist pre-v2.0)', ) assert.equal( LaneFeature.RATE_LIMITS in features, @@ -555,13 +577,13 @@ describe('EVM Fork Tests', { skip, timeout: 180_000 }, () => { 'v1.6 lane should not have RATE_LIMITS', ) assert.equal( - LaneFeature.CUSTOM_BLOCK_CONFIRMATIONS_RATE_LIMITS in features, + LaneFeature.FAST_RATE_LIMITS in features, false, - 'v1.6 lane should not have CUSTOM_BLOCK_CONFIRMATIONS_RATE_LIMITS', + 'v1.6 lane should not have FAST_RATE_LIMITS', ) }) - it('should return MIN_BLOCK_CONFIRMATIONS=1 and no rate limits for v2.0 router without token', async () => { + it('should return FINALITY_FAST=1 and no rate limits for v2.0 router without token', async () => { assert.ok(sepoliaChain, 'sepolia chain should be initialized') const features = await sepoliaChain.getLaneFeatures({ @@ -570,7 +592,7 @@ describe('EVM Fork Tests', { skip, timeout: 180_000 }, () => { }) assert.equal( - features[LaneFeature.MIN_BLOCK_CONFIRMATIONS], + features[LaneFeature.FINALITY_FAST], 1, 'v2.0 lane without token should default to 1 block confirmation', ) @@ -581,47 +603,18 @@ describe('EVM Fork Tests', { skip, timeout: 180_000 }, () => { ) }) - it('should return MIN_BLOCK_CONFIRMATIONS=0 for token with old pool (fallback)', async () => { - assert.ok(sepoliaChain, 'sepolia chain should be initialized') - - const features = await sepoliaChain.getLaneFeatures({ - router: SEPOLIA_V2_0_ROUTER, - destChainSelector: FUJI_SELECTOR, - token: OLD_POOL_TOKEN_SEPOLIA, - }) - - assert.equal( - features[LaneFeature.MIN_BLOCK_CONFIRMATIONS], - 0, - 'token with old pool should have FTF disabled (MIN_BLOCK_CONFIRMATIONS=0)', - ) - // Old pool doesn't support getMinBlockConfirmations but does support - // getCurrentRateLimiterState, so RATE_LIMITS may still be present - assert.ok(LaneFeature.RATE_LIMITS in features, 'old pool should still have RATE_LIMITS') - // FTF disabled → no CUSTOM_BLOCK_CONFIRMATIONS_RATE_LIMITS - assert.equal( - LaneFeature.CUSTOM_BLOCK_CONFIRMATIONS_RATE_LIMITS in features, - false, - 'FTF disabled pool should not have CUSTOM_BLOCK_CONFIRMATIONS_RATE_LIMITS', - ) - }) - it('should query token pool for features on v2.0 pool', async () => { assert.ok(fujiChain, 'fuji chain should be initialized') const features = await fujiChain.getLaneFeatures({ router: FUJI_V2_0_ROUTER, destChainSelector: SEPOLIA_SELECTOR, - token: FTF_TOKEN_FUJI, + token: NOFTF_TOKEN_FUJI, }) - const minBlocks = features[LaneFeature.MIN_BLOCK_CONFIRMATIONS] - console.log(` Lombard pool MIN_BLOCK_CONFIRMATIONS = ${minBlocks}`) - assert.equal( - minBlocks, - 0, - 'Lombard pool should return MIN_BLOCK_CONFIRMATIONS=0 (FTF not enabled)', - ) + const minBlocks = features[LaneFeature.FINALITY_FAST] + console.log(` v2.0 FTF-disabled pool FINALITY_FAST = ${minBlocks}`) + assert.equal(minBlocks, 0, 'FTF-disabled v2.0 pool should return FINALITY_FAST=0') // RATE_LIMITS should be present for v2.0 pool with token assert.ok(LaneFeature.RATE_LIMITS in features, 'v2.0 pool should have RATE_LIMITS') @@ -632,11 +625,11 @@ describe('EVM Fork Tests', { skip, timeout: 180_000 }, () => { assert.equal(typeof rateLimits.rate, 'bigint', 'rate should be bigint') } - // FTF disabled → no CUSTOM_BLOCK_CONFIRMATIONS_RATE_LIMITS + // FTF disabled → no FAST_RATE_LIMITS assert.equal( - LaneFeature.CUSTOM_BLOCK_CONFIRMATIONS_RATE_LIMITS in features, + LaneFeature.FAST_RATE_LIMITS in features, false, - 'FTF disabled pool should not have CUSTOM_BLOCK_CONFIRMATIONS_RATE_LIMITS', + 'FTF disabled pool should not have FAST_RATE_LIMITS', ) }) @@ -650,9 +643,9 @@ describe('EVM Fork Tests', { skip, timeout: 180_000 }, () => { }) assert.equal( - features[LaneFeature.MIN_BLOCK_CONFIRMATIONS], + features[LaneFeature.FINALITY_FAST], undefined, - 'v1.5 lane should not include MIN_BLOCK_CONFIRMATIONS (FTF does not exist pre-v2.0)', + 'v1.5 lane should not include FINALITY_FAST (FTF does not exist pre-v2.0)', ) // Legacy pool should expose RATE_LIMITS via getCurrentOutboundRateLimiterState @@ -664,15 +657,15 @@ describe('EVM Fork Tests', { skip, timeout: 180_000 }, () => { assert.equal(typeof rateLimits.rate, 'bigint', 'rate should be bigint') } - // FTF doesn't exist on legacy lanes → no CUSTOM_BLOCK_CONFIRMATIONS_RATE_LIMITS + // FTF doesn't exist on legacy lanes → no FAST_RATE_LIMITS assert.equal( - LaneFeature.CUSTOM_BLOCK_CONFIRMATIONS_RATE_LIMITS in features, + LaneFeature.FAST_RATE_LIMITS in features, false, - 'legacy lane should not have CUSTOM_BLOCK_CONFIRMATIONS_RATE_LIMITS', + 'legacy lane should not have FAST_RATE_LIMITS', ) }) - it('should return nonzero MIN_BLOCK_CONFIRMATIONS and custom rate limits for FTF-enabled pool (Sepolia)', async () => { + it('should return nonzero FINALITY_FAST and FAST_RATE_LIMITS for FTF-enabled pool (Sepolia)', async () => { assert.ok(sepoliaChain, 'sepolia chain should be initialized') const token = await sepoliaChain.getTokenForTokenPool(FTF_ENABLED_POOL_SEPOLIA) @@ -682,11 +675,11 @@ describe('EVM Fork Tests', { skip, timeout: 180_000 }, () => { token, }) - const minBlocks = features[LaneFeature.MIN_BLOCK_CONFIRMATIONS] - console.log(` FTF-enabled pool MIN_BLOCK_CONFIRMATIONS = ${minBlocks}`) + const minBlocks = features[LaneFeature.FINALITY_FAST] + console.log(` FTF-enabled pool FINALITY_FAST = ${minBlocks}`) assert.ok( minBlocks != null && minBlocks > 0, - `FTF-enabled pool should have MIN_BLOCK_CONFIRMATIONS > 0 (got ${minBlocks})`, + `FTF-enabled pool should have FINALITY_FAST > 0 (got ${minBlocks})`, ) // Default rate limits should be present @@ -699,14 +692,11 @@ describe('EVM Fork Tests', { skip, timeout: 180_000 }, () => { // Custom finality rate limits should be present when FTF is enabled assert.ok( - LaneFeature.CUSTOM_BLOCK_CONFIRMATIONS_RATE_LIMITS in features, - 'FTF-enabled pool should have CUSTOM_BLOCK_CONFIRMATIONS_RATE_LIMITS', - ) - const customRateLimits = features[LaneFeature.CUSTOM_BLOCK_CONFIRMATIONS_RATE_LIMITS] - assert.ok( - customRateLimits != null, - 'CUSTOM_BLOCK_CONFIRMATIONS_RATE_LIMITS should not be null', + LaneFeature.FAST_RATE_LIMITS in features, + 'FTF-enabled pool should have FAST_RATE_LIMITS', ) + const customRateLimits = features[LaneFeature.FAST_RATE_LIMITS] + assert.ok(customRateLimits != null, 'FAST_RATE_LIMITS should not be null') assert.equal(typeof customRateLimits.tokens, 'bigint', 'custom tokens should be bigint') assert.equal(typeof customRateLimits.capacity, 'bigint', 'custom capacity should be bigint') assert.equal(typeof customRateLimits.rate, 'bigint', 'custom rate should be bigint') @@ -721,7 +711,7 @@ describe('EVM Fork Tests', { skip, timeout: 180_000 }, () => { ) }) - it('should return nonzero MIN_BLOCK_CONFIRMATIONS and custom rate limits for FTF-enabled pool (Fuji)', async () => { + it('should return nonzero FINALITY_FAST and FAST_RATE_LIMITS for FTF-enabled pool (Fuji)', async () => { assert.ok(fujiChain, 'fuji chain should be initialized') const token = await fujiChain.getTokenForTokenPool(FTF_ENABLED_POOL_FUJI) @@ -731,11 +721,11 @@ describe('EVM Fork Tests', { skip, timeout: 180_000 }, () => { token, }) - const minBlocks = features[LaneFeature.MIN_BLOCK_CONFIRMATIONS] - console.log(` FTF-enabled Fuji pool MIN_BLOCK_CONFIRMATIONS = ${minBlocks}`) + const minBlocks = features[LaneFeature.FINALITY_FAST] + console.log(` FTF-enabled Fuji pool FINALITY_FAST = ${minBlocks}`) assert.ok( minBlocks != null && minBlocks > 0, - `FTF-enabled pool should have MIN_BLOCK_CONFIRMATIONS > 0 (got ${minBlocks})`, + `FTF-enabled pool should have FINALITY_FAST > 0 (got ${minBlocks})`, ) // Default rate limits should be present @@ -745,14 +735,11 @@ describe('EVM Fork Tests', { skip, timeout: 180_000 }, () => { // Custom finality rate limits should be present when FTF is enabled assert.ok( - LaneFeature.CUSTOM_BLOCK_CONFIRMATIONS_RATE_LIMITS in features, - 'FTF-enabled pool should have CUSTOM_BLOCK_CONFIRMATIONS_RATE_LIMITS', - ) - const customRateLimits = features[LaneFeature.CUSTOM_BLOCK_CONFIRMATIONS_RATE_LIMITS] - assert.ok( - customRateLimits != null, - 'CUSTOM_BLOCK_CONFIRMATIONS_RATE_LIMITS should not be null', + LaneFeature.FAST_RATE_LIMITS in features, + 'FTF-enabled pool should have FAST_RATE_LIMITS', ) + const customRateLimits = features[LaneFeature.FAST_RATE_LIMITS] + assert.ok(customRateLimits != null, 'FAST_RATE_LIMITS should not be null') // Custom rate limits should differ from default rate limits const differs = @@ -766,32 +753,6 @@ describe('EVM Fork Tests', { skip, timeout: 180_000 }, () => { }) describe('getTokenPoolConfig with tokenTransferFeeConfig', () => { - it('should return disabled fee config for token with old pool', async () => { - assert.ok(sepoliaChain, 'sepolia chain should be initialized') - - // Resolve pool address for the old pool token - const onRamp = await sepoliaChain.getOnRampForRouter(SEPOLIA_V2_0_ROUTER, FUJI_SELECTOR) - const onRampContract = new Contract(onRamp, interfaces.OnRamp_v2_0, sepoliaChain.provider) - const poolAddress = (await onRampContract.getFunction('getPoolBySourceToken')( - FUJI_SELECTOR, - OLD_POOL_TOKEN_SEPOLIA, - )) as string - - const result = await sepoliaChain.getTokenPoolConfig(poolAddress, { - destChainSelector: FUJI_SELECTOR, - blockConfirmationsRequested: 0, - tokenArgs: '0x', - }) - - // Old pools may respond with all-zero config rather than reverting - assert.ok(result.tokenTransferFeeConfig, 'old pool responds to the call') - assert.equal( - result.tokenTransferFeeConfig.isEnabled, - false, - 'fee config should not be enabled on old pool', - ) - }) - it('should return fee config for v2.0 pool', async () => { assert.ok(fujiChain, 'fuji chain should be initialized') @@ -800,12 +761,12 @@ describe('EVM Fork Tests', { skip, timeout: 180_000 }, () => { const onRampContract = new Contract(onRamp, interfaces.OnRamp_v2_0, fujiChain.provider) const poolAddress = (await onRampContract.getFunction('getPoolBySourceToken')( SEPOLIA_SELECTOR, - FTF_TOKEN_FUJI, + NOFTF_TOKEN_FUJI, )) as string const result = await fujiChain.getTokenPoolConfig(poolAddress, { destChainSelector: SEPOLIA_SELECTOR, - blockConfirmationsRequested: 0, + finality: 0, tokenArgs: '0x', }) @@ -813,22 +774,20 @@ describe('EVM Fork Tests', { skip, timeout: 180_000 }, () => { assert.equal(typeof result.tokenTransferFeeConfig.destGasOverhead, 'number') assert.equal(typeof result.tokenTransferFeeConfig.destBytesOverhead, 'number') assert.equal(typeof result.tokenTransferFeeConfig.isEnabled, 'boolean') - console.log(' v2.0 pool fee config (blockConfirmationsRequested=0):') - console.log( - ` defaultBlockConfirmationsFeeUSDCents = ${result.tokenTransferFeeConfig.defaultBlockConfirmationsFeeUSDCents}`, - ) + console.log(' v2.0 pool fee config (finality=0):') + console.log(` finalityFeeUSDCents = ${result.tokenTransferFeeConfig.finalityFeeUSDCents}`) console.log( - ` customBlockConfirmationsFeeUSDCents = ${result.tokenTransferFeeConfig.customBlockConfirmationsFeeUSDCents}`, + ` fastFinalityFeeUSDCents = ${result.tokenTransferFeeConfig.fastFinalityFeeUSDCents}`, ) console.log( - ` defaultBlockConfirmationsTransferFeeBps = ${result.tokenTransferFeeConfig.defaultBlockConfirmationsTransferFeeBps}`, + ` finalityTransferFeeBps = ${result.tokenTransferFeeConfig.finalityTransferFeeBps}`, ) console.log( - ` customBlockConfirmationsTransferFeeBps = ${result.tokenTransferFeeConfig.customBlockConfirmationsTransferFeeBps}`, + ` fastFinalityTransferFeeBps = ${result.tokenTransferFeeConfig.fastFinalityTransferFeeBps}`, ) }) - it('should return fee config with blockConfirmationsRequested=1', async () => { + it('should return fee config with finality=1', async () => { assert.ok(fujiChain, 'fuji chain should be initialized') // Resolve pool address @@ -836,12 +795,12 @@ describe('EVM Fork Tests', { skip, timeout: 180_000 }, () => { const onRampContract = new Contract(onRamp, interfaces.OnRamp_v2_0, fujiChain.provider) const poolAddress = (await onRampContract.getFunction('getPoolBySourceToken')( SEPOLIA_SELECTOR, - FTF_TOKEN_FUJI, + NOFTF_TOKEN_FUJI, )) as string const result = await fujiChain.getTokenPoolConfig(poolAddress, { destChainSelector: SEPOLIA_SELECTOR, - blockConfirmationsRequested: 1, + finality: 1, tokenArgs: '0x', }) @@ -849,18 +808,16 @@ describe('EVM Fork Tests', { skip, timeout: 180_000 }, () => { assert.equal(typeof result.tokenTransferFeeConfig.destGasOverhead, 'number') assert.equal(typeof result.tokenTransferFeeConfig.destBytesOverhead, 'number') assert.equal(typeof result.tokenTransferFeeConfig.isEnabled, 'boolean') - console.log(' v2.0 pool fee config (blockConfirmationsRequested=1):') + console.log(' v2.0 pool fee config (finality=1):') + console.log(` finalityFeeUSDCents = ${result.tokenTransferFeeConfig.finalityFeeUSDCents}`) console.log( - ` defaultBlockConfirmationsFeeUSDCents = ${result.tokenTransferFeeConfig.defaultBlockConfirmationsFeeUSDCents}`, + ` fastFinalityFeeUSDCents = ${result.tokenTransferFeeConfig.fastFinalityFeeUSDCents}`, ) console.log( - ` customBlockConfirmationsFeeUSDCents = ${result.tokenTransferFeeConfig.customBlockConfirmationsFeeUSDCents}`, + ` finalityTransferFeeBps = ${result.tokenTransferFeeConfig.finalityTransferFeeBps}`, ) console.log( - ` defaultBlockConfirmationsTransferFeeBps = ${result.tokenTransferFeeConfig.defaultBlockConfirmationsTransferFeeBps}`, - ) - console.log( - ` customBlockConfirmationsTransferFeeBps = ${result.tokenTransferFeeConfig.customBlockConfirmationsTransferFeeBps}`, + ` fastFinalityTransferFeeBps = ${result.tokenTransferFeeConfig.fastFinalityTransferFeeBps}`, ) }) @@ -872,7 +829,7 @@ describe('EVM Fork Tests', { skip, timeout: 180_000 }, () => { const onRampContract = new Contract(onRamp, interfaces.OnRamp_v2_0, fujiChain.provider) const poolAddress = (await onRampContract.getFunction('getPoolBySourceToken')( SEPOLIA_SELECTOR, - FTF_TOKEN_FUJI, + NOFTF_TOKEN_FUJI, )) as string const result = await fujiChain.getTokenPoolConfig(poolAddress) @@ -924,7 +881,7 @@ describe('EVM Fork Tests', { skip, timeout: 180_000 }, () => { assert.equal(typeof tf.bps, 'number') assert.equal(tf.feeDeducted, (amount * BigInt(tf.bps)) / 10_000n) - console.log(' getTotalFeesEstimate (default blockConfirmations):') + console.log(' getTotalFeesEstimate (standard finality):') console.log(` ccipFee = ${estimate.ccipFee}`) console.log(` value = ${tf.feeDeducted} (${tf.bps} bps)`) }) @@ -951,7 +908,7 @@ describe('EVM Fork Tests', { skip, timeout: 180_000 }, () => { ) }) - it('should use custom BPS when blockConfirmations > 0', async () => { + it('should use custom BPS when FTF', async () => { assert.ok(sepoliaChain, 'sepolia chain should be initialized') const amount = 1_000_000n @@ -963,7 +920,7 @@ describe('EVM Fork Tests', { skip, timeout: 180_000 }, () => { tokenAmounts: [{ token: FTF_TOKEN_SEPOLIA, amount }], extraArgs: { gasLimit: 200_000n, - blockConfirmations: 1, + finality: 1, ccvs: [], ccvArgs: [], executor: '', @@ -981,7 +938,7 @@ describe('EVM Fork Tests', { skip, timeout: 180_000 }, () => { const tf = estimate.tokenTransferFee assert.equal(tf.feeDeducted, (amount * BigInt(tf.bps)) / 10_000n) - console.log(' getTotalFeesEstimate (blockConfirmations=1):') + console.log(' getTotalFeesEstimate (finality=1):') console.log(` ccipFee = ${estimate.ccipFee}`) console.log(` value = ${tf.feeDeducted} (${tf.bps} bps)`) }) @@ -998,14 +955,14 @@ describe('EVM Fork Tests', { skip, timeout: 180_000 }, () => { const STAGING_API = 'https://api.ccip.cldev.cloud' const HISTORICAL_MESSAGE_IDS = [ - // Fuji → Sepolia, default finality (blockConfirmations=0), 0% BPS - '0x39dda11d8d8ccf35055825349ab8c1842587966389cb8200eb5b72830318f707', - // Fuji → Sepolia, custom finality (blockConfirmations=5), 1% BPS - '0x88bf551330e9767ac981582a3e7fac510b876a7038e38a633e32c63ac7dd0169', - // Sepolia → Fuji, default finality (blockConfirmations=0), 0% BPS - '0x2a6eeea60b80235cbd1e3ead45f6cd848374961831c21733170d7cb965514f31', - // Sepolia → Fuji, custom finality (blockConfirmations=1), 10% BPS - '0x42683f3a0efb956e881b3e9eec4e4161e32b09a98c680ee82219d011fcd9df1d', + // Fuji → Arb-Sepolia, finalized (finality=0), 20 bps (finalityTransferFeeBps) + '0xed535024b2c212ee0aef32a1c5790ffd0ed8684fed317623c704d991adc53a89', + // Fuji → Arb-Sepolia, FTF (finality=1), 100 bps (fastFinalityTransferFeeBps) + '0x1908420ed02f15577adf21277bb3ff562a20150c90d5848e1174237b5dc896c0', + // Arb-Sepolia → Fuji, finalized (finality=0), 20 bps + '0xd42a4152a46f062c73fcd7ad7c2702b97854573b93ab7a0476b91f5efd4547ec', + // Arb-Sepolia → Fuji, FTF (finality=1), 100 bps + '0x7c4502dd471f08db5801785095c87a20b0a6236e5350a7108e49342d884c6753', ] /** Resolve source chain selector to the matching fork chain + v2.0 router. */ @@ -1014,6 +971,10 @@ describe('EVM Fork Tests', { skip, timeout: 180_000 }, () => { assert.ok(fujiChain, 'fuji chain should be initialized') return { chain: fujiChain, router: FUJI_V2_0_ROUTER } } + if (sourceSelector === ARB_SEP_SELECTOR.toString()) { + assert.ok(arbSepChain, 'arb-sepolia chain should be initialized') + return { chain: arbSepChain, router: ARB_SEP_V2_0_ROUTER } + } assert.ok(sepoliaChain, 'sepolia chain should be initialized') return { chain: sepoliaChain, router: SEPOLIA_V2_0_ROUTER } } @@ -1030,7 +991,9 @@ describe('EVM Fork Tests', { skip, timeout: 180_000 }, () => { const { chain, router } = resolveChain(raw.sourceNetworkInfo.chainSelector) const destChainSelector = BigInt(raw.destNetworkInfo.chainSelector) const token = raw.tokenAmounts[0].sourceTokenAddress as string - const blockConfirmations: number = raw.extraArgs?.blockConfirmations ?? 0 + // v2.0.0 API exposes finality at the top level; extraArgs.blockConfirmations + // was a dev-era compat field and is no longer populated. + const finality: number = Number(raw.finality ?? 0) // Reconstruct original sent amount = post-fee amount + bps fee deducted const bpsEntry = raw.fees?.bpsFeeDetails?.[0] @@ -1046,10 +1009,10 @@ describe('EVM Fork Tests', { skip, timeout: 180_000 }, () => { receiver: '0x0000000000000000000000000000000000000001', tokenAmounts: [{ token, amount: originalAmount }], } - if (blockConfirmations > 0) { + if (finality > 0) { message.extraArgs = { gasLimit: 0n, - blockConfirmations, + finality: finality, ccvs: [], ccvArgs: [], executor: '', @@ -1408,22 +1371,20 @@ describe('EVM Fork Tests', { skip, timeout: 180_000 }, () => { ) }) - it('should execute a v2.0 message via API-driven path (Fuji -> Sepolia)', async () => { - assert.ok(sepoliaInstance, 'sepolia anvil should be running') + it('should execute a v2.0 message via API-driven path (Arb-Sep -> Fuji)', async () => { + assert.ok(fujiInstance, 'fuji anvil should be running') - // Create a sepolia chain with staging API client (execution-inputs endpoint) + // Create a fuji chain with staging API client (execution-inputs endpoint) const stagingApi = new CCIPAPIClient('https://api.ccip.cldev.cloud', { logger: testLogger }) - const sepoliaProvider = new JsonRpcProvider( - `http://${sepoliaInstance.host}:${sepoliaInstance.port}`, - ) - const sepoliaWithApi = await EVMChain.fromProvider(sepoliaProvider, { + const fujiProvider = new JsonRpcProvider(`http://${fujiInstance.host}:${fujiInstance.port}`) + const fujiWithApi = await EVMChain.fromProvider(fujiProvider, { apiClient: stagingApi, logger: testLogger, }) - const w = new Wallet(ANVIL_PRIVATE_KEY, sepoliaProvider) + const w = new Wallet(ANVIL_PRIVATE_KEY, fujiProvider) // Execute via messageId only — triggers API-driven path - const execution = await sepoliaWithApi.execute({ + const execution = await fujiWithApi.execute({ messageId: V2_API_EXEC_MSG.messageId, wallet: w, gasLimit: 500_000, @@ -1441,7 +1402,7 @@ describe('EVM Fork Tests', { skip, timeout: 180_000 }, () => { assert.ok(execution.timestamp > 0, 'should have timestamp') assert.equal(execution.receipt.state, ExecutionState.Success) - sepoliaWithApi.destroy?.() + fujiWithApi.destroy?.() }) it('should execute a v1.5 message via API-driven path (Sepolia -> Fuji)', async () => { diff --git a/ccip-sdk/src/evm/index.ts b/ccip-sdk/src/evm/index.ts index 75874423..0f93631d 100644 --- a/ccip-sdk/src/evm/index.ts +++ b/ccip-sdk/src/evm/index.ts @@ -34,7 +34,6 @@ import { type RateLimiterState, type TokenPoolRemote, type TokenPrice, - type TokenTransferFeeConfig, type TokenTransferFeeOpts, type TotalFeesEstimate, Chain, @@ -60,7 +59,12 @@ import { CCIPVersionUnsupportedError, CCIPWalletInvalidError, } from '../errors/index.ts' -import type { ExtraArgs } from '../extra-args.ts' +import { + type ExtraArgs, + type FinalityRequested, + decodeFinalityAllowed, + encodeFinality, +} from '../extra-args.ts' import type { LeafHasher } from '../hasher/common.ts' import { CCTP_FINALITY_FAST, getUsdcBurnFees } from '../offchain.ts' import { supportedChains } from '../supported-chains.ts' @@ -407,7 +411,6 @@ export class EVMChain extends Chain { this.provider, ) as unknown as TypedContract const res = parseTypeAndVersion(await contract.typeAndVersion()) - if (res[1].startsWith('1.7.')) res[1] = CCIPVersion.V2_0 return res } @@ -484,7 +487,7 @@ export class EVMChain extends Chain { if (isCcipV15) { return [ { - merkleRoot: result.merkleRoot as string, + merkleRoot: result.merkleRoot as `0x${string}`, minSeqNr: (result.interval as Result).min as bigint, maxSeqNr: (result.interval as Result).max as bigint, sourceChainSelector: lane!.sourceChainSelector, @@ -664,24 +667,28 @@ export class EVMChain extends Chain { const result: Partial = {} // default FTF value for V2_0+ lanes if no token/pool or pool doesn't specify - if (version >= CCIPVersion.V2_0) result[LaneFeature.MIN_BLOCK_CONFIRMATIONS] = 1 + if (version >= CCIPVersion.V2_0) { + result[LaneFeature.FINALITY_FAST] = 1 + result[LaneFeature.FINALITY_SAFE] = true + } - // MIN_BLOCK_CONFIRMATIONS — V2_0+ only + // FINALITY_FAST — V2_0+ only if (opts.token) { const { tokenPool } = await this.getRegistryTokenConfig( await this.getTokenAdminRegistryFor(onRamp), opts.token, ) if (tokenPool) { - const { minBlockConfirmations } = await this.getTokenPoolConfig(tokenPool) - if (minBlockConfirmations != null) - result[LaneFeature.MIN_BLOCK_CONFIRMATIONS] = minBlockConfirmations + const { finalityDepth, finalitySafe } = await this.getTokenPoolConfig(tokenPool) + if (finalityDepth != null) result[LaneFeature.FINALITY_FAST] = finalityDepth + else delete result[LaneFeature.FINALITY_FAST] + if (finalitySafe) result[LaneFeature.FINALITY_SAFE] = true + else delete result[LaneFeature.FINALITY_SAFE] const remote = await this.getTokenPoolRemote(tokenPool, opts.destChainSelector) result[LaneFeature.RATE_LIMITS] = remote.outboundRateLimiterState - if (minBlockConfirmations && 'customBlockConfirmationsOutboundRateLimiterState' in remote) { - result[LaneFeature.CUSTOM_BLOCK_CONFIRMATIONS_RATE_LIMITS] = - remote.customBlockConfirmationsOutboundRateLimiterState + if ((finalityDepth || finalitySafe) && 'fastOutboundRateLimiterState' in remote) { + result[LaneFeature.FAST_RATE_LIMITS] = remote.fastOutboundRateLimiterState } } } @@ -905,20 +912,23 @@ export class EVMChain extends Chain { case CCIPVersion.V1_5: if (networkInfo(sourceChainSelector).family !== ChainFamily.EVM) throw new CCIPSourceChainUnsupportedError(sourceChainSelector) - return getV12LeafHasher(sourceChainSelector, destChainSelector, onRamp) as LeafHasher + return getV12LeafHasher(sourceChainSelector, destChainSelector, onRamp) case CCIPVersion.V1_6: - return getV16LeafHasher(sourceChainSelector, destChainSelector, onRamp, ctx) as LeafHasher + return getV16LeafHasher(sourceChainSelector, destChainSelector, onRamp, ctx) default: - throw new CCIPHasherVersionUnsupportedError('EVM', version as string) + throw new CCIPHasherVersionUnsupportedError('EVM', version) } } /** * Gets any available OnRamp for the given router. - * @param router - Router contract address. + * @param address - Router or OnRamp contract address. * @returns OnRamp contract address. */ - async _getSomeOnRampFor(router: string): Promise { + async _getSomeOnRampFor(address: string): Promise { + const [type, , typeAndVersion] = await this.typeAndVersion(address) + if (type.includes('OnRamp')) return address + else if (type !== 'Router') throw new CCIPContractNotRouterError(address, typeAndVersion) // when given a router, we take any onRamp we can find, as usually they all use same registry const someOtherNetwork = this.network.networkType === NetworkType.Testnet @@ -928,7 +938,7 @@ export class EVMChain extends Chain { : this.network.name === 'ethereum-mainnet' ? 'avalanche-mainnet' : 'ethereum-mainnet' - return this.getOnRampForRouter(router, networkInfo(someOtherNetwork).chainSelector) + return this.getOnRampForRouter(address, networkInfo(someOtherNetwork).chainSelector) } /** @@ -1212,12 +1222,12 @@ export class EVMChain extends Chain { const { token, amount } = tokenAmounts[0]! - // Determine blockConfirmations and tokenArgs from extraArgs + // Determine finality and tokenArgs from extraArgs const extraArgs = opts.message.extraArgs - let blockConfirmations = 0 + let finality: FinalityRequested = 0 let tokenArgs: string = '0x' - if (extraArgs && 'blockConfirmations' in extraArgs) { - blockConfirmations = extraArgs.blockConfirmations as number + if (extraArgs && 'finality' in extraArgs && extraArgs.finality != null) { + finality = extraArgs.finality if (extraArgs.tokenArgs) tokenArgs = hexlify(extraArgs.tokenArgs) } @@ -1243,7 +1253,7 @@ export class EVMChain extends Chain { ccipFee$, this.getTokenPoolConfig(poolAddress, { destChainSelector: opts.destChainSelector, - blockConfirmationsRequested: blockConfirmations, + finality, tokenArgs, }), this.detectUsdcDomains( @@ -1260,7 +1270,7 @@ export class EVMChain extends Chain { usdcDomains.destDomain, this.network.networkType, ) - const fast = blockConfirmations > 0 + const fast = finality !== 0 // Tiers are sorted ascending by finalityThreshold; findLast for fast ensures // we pick the highest tier still within the fast threshold. const tier = fast @@ -1284,10 +1294,10 @@ export class EVMChain extends Chain { return { ccipFee } } - const useCustom = blockConfirmations > 0 + const useCustom = finality !== 0 const bps = useCustom - ? tokenTransferFeeConfig.customBlockConfirmationsTransferFeeBps - : tokenTransferFeeConfig.defaultBlockConfirmationsTransferFeeBps + ? tokenTransferFeeConfig.fastFinalityTransferFeeBps + : tokenTransferFeeConfig.finalityTransferFeeBps return { ccipFee, @@ -1464,7 +1474,7 @@ export class EVMChain extends Chain { })), executionGasLimit: BigInt(message.executionGasLimit), ccipReceiveGasLimit: BigInt(message.ccipReceiveGasLimit), - finality: BigInt(message.finality), + finality: toBeHex(encodeFinality(message.finality), 4), }, messageId, input.verifications.map(({ destAddress }) => destAddress), @@ -1585,18 +1595,25 @@ export class EVMChain extends Chain { /* Executing a message for the first time has some hard try/catches on-chain * so we need to ensure some lower-bounds gasLimits */ - let txGasLimit = await this.provider.estimateGas(manualExecTx) - if ( - 'gasLimit' in input.message && - input.message.gasLimit && - txGasLimit < input.message.gasLimit + 100000n - ) - // if message requested gasLimit, ensure execution more than 100k above requested, otherwise it's clearly a try/catch fail - txGasLimit = BigInt(input.message.gasLimit) + 200000n - else if ('gasLimit' in input.message && !input.message.gasLimit && txGasLimit < 240000n) - // if message didn't request gasLimit, ensure minimum execution gasLimit (empiric) - txGasLimit = 240000n - manualExecTx.gasLimit = txGasLimit + try { + let txGasLimit = await this.provider.estimateGas(manualExecTx) + if ( + 'gasLimit' in input.message && + input.message.gasLimit && + txGasLimit < input.message.gasLimit + 100000n + ) + // if message requested gasLimit, ensure execution more than 100k above requested, otherwise it's clearly a try/catch fail + txGasLimit = BigInt(input.message.gasLimit) + 200000n + else if ('gasLimit' in input.message && !input.message.gasLimit && txGasLimit < 240000n) + // if message didn't request gasLimit, ensure execution gasLimit is above 240k (empiric) + txGasLimit = 240000n + manualExecTx.gasLimit = txGasLimit + } catch (err) { + this.logger.warn( + 'Gas estimation for manuallyExecute failed, using default fallback. Error:', + err, + ) + } return { family: ChainFamily.EVM, transactions: [manualExecTx] } } @@ -1702,29 +1719,23 @@ export class EVMChain extends Chain { * @param tokenPool - Token pool contract address. * @param feeOpts - Optional parameters to also fetch token transfer fee config: * - `destChainSelector` — destination chain selector. - * - `blockConfirmationsRequested` — number of block confirmations (0 = standard, positive = FTF). + * - `finality` — requested finality ('finalized', 'safe', or block depth number). * - `tokenArgs` — hex-encoded bytes passed to the pool contract. * @returns Token pool config containing token, router, typeAndVersion, and optionally - * minBlockConfirmations and tokenTransferFeeConfig. + * finalityDepth, finalitySafe, and tokenTransferFeeConfig. * * @remarks - * For pools with version \>= 2.0, also returns `minBlockConfirmations` for - * Faster-Than-Finality (FTF) support. Pre-2.0 pools omit this field. + * For pools with version \>= 2.0, also returns `finalityDepth` and `finalitySafe` for + * Faster-Than-Finality (FTF) and FCR support. Pre-2.0 pools omit these fields. * When `feeOpts` is provided and the pool is v2.0+, also fetches token transfer fee config. */ async getTokenPoolConfig( tokenPool: string, feeOpts?: TokenTransferFeeOpts, - ): Promise<{ - token: string - router: string - typeAndVersion: string - minBlockConfirmations?: number - tokenTransferFeeConfig?: TokenTransferFeeConfig - }> { + ): Promise>, 'typeAndVersion'>> { const [type, version, typeAndVersion] = await this.typeAndVersion(tokenPool) - let token, router, minBlockConfirmations, tokenTransferFeeConfig + let token, router, allowedFinality, tokenTransferFeeConfig if (version < CCIPVersion.V2_0) { const contract = new Contract( tokenPool, @@ -1749,10 +1760,10 @@ export class EVMChain extends Chain { ) as unknown as TypedContract token = contract.getToken() router = contract.getDynamicConfig().then(([router]) => router) - minBlockConfirmations = contract.getMinBlockConfirmations().catch((err) => { + allowedFinality = contract.getAllowedFinalityConfig().catch((err) => { this.logger.debug( typeAndVersion, - 'threw when fetching minBlockConfirmations, defaulting to 0:', + 'threw when fetching getAllowedFinalityConfig, defaulting to 0:', err, ) if (isError(err, 'CALL_EXCEPTION')) return 0 @@ -1764,24 +1775,16 @@ export class EVMChain extends Chain { .getTokenTransferFeeConfig( tokenAddr as string, feeOpts.destChainSelector, - BigInt(feeOpts.blockConfirmationsRequested), + toBeHex(encodeFinality(feeOpts.finality), 4), feeOpts.tokenArgs, ) .then((result) => ({ destGasOverhead: Number(result.destGasOverhead), destBytesOverhead: Number(result.destBytesOverhead), - defaultBlockConfirmationsFeeUSDCents: Number( - result.defaultBlockConfirmationsFeeUSDCents, - ), - customBlockConfirmationsFeeUSDCents: Number( - result.customBlockConfirmationsFeeUSDCents, - ), - defaultBlockConfirmationsTransferFeeBps: Number( - result.defaultBlockConfirmationsTransferFeeBps, - ), - customBlockConfirmationsTransferFeeBps: Number( - result.customBlockConfirmationsTransferFeeBps, - ), + finalityFeeUSDCents: Number(result.finalityFeeUSDCents), + fastFinalityFeeUSDCents: Number(result.fastFinalityFeeUSDCents), + finalityTransferFeeBps: Number(result.finalityTransferFeeBps), + fastFinalityTransferFeeBps: Number(result.fastFinalityTransferFeeBps), isEnabled: result.isEnabled, })) .catch((err) => { @@ -1792,15 +1795,13 @@ export class EVMChain extends Chain { } } - return Promise.all([token, router, minBlockConfirmations, tokenTransferFeeConfig]).then( - ([token, router, minBlockConfirmations, tokenTransferFeeConfig]) => { + return Promise.all([token, router, allowedFinality, tokenTransferFeeConfig]).then( + ([token, router, allowedFinality, tokenTransferFeeConfig]) => { return { token: token as CleanAddressable, router: router as CleanAddressable, typeAndVersion, - ...(minBlockConfirmations != null && { - minBlockConfirmations: Number(minBlockConfirmations), - }), + ...(allowedFinality != null && decodeFinalityAllowed(allowedFinality)), ...(tokenTransferFeeConfig != null && { tokenTransferFeeConfig }), } }, @@ -1819,7 +1820,7 @@ export class EVMChain extends Chain { * - v1.5: single remote pool via `getRemotePool`, standard rate limiters. * - v1.6: multiple remote pools via `getRemotePools`, standard rate limiters. * - v2.0+: multiple remote pools plus FTF (Faster-Than-Finality) rate limiters - * (`customBlockConfirmationsOutboundRateLimiterState` / `customBlockConfirmationsInboundRateLimiterState`). + * (`fastOutboundRateLimiterState` / `fastInboundRateLimiterState`). * * @throws {@link CCIPTokenPoolChainConfigNotFoundError} if remote token is not configured for a chain. */ @@ -1919,11 +1920,9 @@ export class EVMChain extends Chain { contract.getRemoteToken(chain.chainSelector), contract.getCurrentRateLimiterState(chain.chainSelector, false), contract.getCurrentRateLimiterState(chain.chainSelector, true), - ] as const).then( - ([remoteToken, [outbound, inbound], [customOutbound, customInbound]]) => { - return [remoteToken, outbound, inbound, customOutbound, customInbound] as const - }, - ), + ] as const).then(([remoteToken, [outbound, inbound], [fastOutbound, fastInbound]]) => { + return [remoteToken, outbound, inbound, fastOutbound, fastInbound] as const + }), ), ), ) @@ -1943,12 +1942,8 @@ export class EVMChain extends Chain { outboundRateLimiterState: toRateLimiterState(remoteInfo[i]![1]), inboundRateLimiterState: toRateLimiterState(remoteInfo[i]![2]), ...(remoteInfo[i]!.length === 5 && { - customBlockConfirmationsOutboundRateLimiterState: toRateLimiterState( - remoteInfo[i]![3], - ), - customBlockConfirmationsInboundRateLimiterState: toRateLimiterState( - remoteInfo[i]![4], - ), + fastOutboundRateLimiterState: toRateLimiterState(remoteInfo[i]![3]), + fastInboundRateLimiterState: toRateLimiterState(remoteInfo[i]![4]), }), }, ] as const @@ -1961,8 +1956,8 @@ export class EVMChain extends Chain { * {@inheritDoc Chain.getFeeTokens} * @throws {@link CCIPVersionUnsupportedError} if OnRamp version is not supported */ - async getFeeTokens(router: string) { - const onRamp = await this._getSomeOnRampFor(router) + async getFeeTokens(address: string) { + const onRamp = await this._getSomeOnRampFor(address) const [_, version] = await this.typeAndVersion(onRamp) let tokens let onRampIface: Interface | undefined diff --git a/ccip-sdk/src/evm/messages.test.ts b/ccip-sdk/src/evm/messages.test.ts index 840e1fc2..97a7f237 100644 --- a/ccip-sdk/src/evm/messages.test.ts +++ b/ccip-sdk/src/evm/messages.test.ts @@ -31,7 +31,7 @@ describe('decodeMessageV1', () => { const messageNumber = '0x0000000000000064' // 100 const executionGasLimit = '0x00030d40' // 200000 const ccipReceiveGasLimit = '0x00030d40' // 200000 - const finality = '0x000a' // 10 + const finality = '0x0000000a' // 10 const ccvAndExecutorHash = '0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef' // Variable length fields @@ -95,7 +95,7 @@ describe('decodeMessageV1', () => { const messageNumber = '0x00000000000003e8' // 1000 const executionGasLimit = '0x000493e0' // 300000 const ccipReceiveGasLimit = '0x000186a0' // 100000 - const finality = '0x0014' // 20 + const finality = '0x00000014' // 20 const ccvAndExecutorHash = '0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa' const onRampAddressLength = '0x14' diff --git a/ccip-sdk/src/evm/viem/client-adapter.ts b/ccip-sdk/src/evm/viem/client-adapter.ts index 29a4f286..297e4710 100644 --- a/ccip-sdk/src/evm/viem/client-adapter.ts +++ b/ccip-sdk/src/evm/viem/client-adapter.ts @@ -50,12 +50,12 @@ export class ViemTransportProvider extends JsonRpcApiProvider { method: p.method as Parameters[0]['method'], params: params as Parameters[0]['params'], }) - return { id: p.id, result } as JsonRpcResult + return { id: p.id, result } } catch (error) { return { id: p.id, error: { code: -32000, message: String(error) }, - } as JsonRpcError + } } }), ) diff --git a/ccip-sdk/src/execution.test.ts b/ccip-sdk/src/execution.test.ts index a919844e..d980c892 100644 --- a/ccip-sdk/src/execution.test.ts +++ b/ccip-sdk/src/execution.test.ts @@ -200,7 +200,7 @@ class MockChain extends Chain { const iface = new Interface(OffRamp_1_6_ABI) try { const parsed = iface.parseLog({ - topics: _log.topics as string[], + topics: _log.topics, data: typeof _log.data === 'string' ? _log.data : '0x', }) if (parsed?.name === 'ExecutionStateChanged') { @@ -328,7 +328,7 @@ describe('calculateManualExecProof', () => { feeValueJuels: 1000n, feeTokenAmount: 1000n, allowOutOfOrderExecution: false, - } as any, + }, ] const lane1_6: Lane = { @@ -368,7 +368,7 @@ describe('calculateManualExecProof', () => { feeTokenAmount: 1547524n, allowOutOfOrderExecution: true, gasLimit: 25000000n, - } as any, + }, ] const lane: Lane = { diff --git a/ccip-sdk/src/extra-args.test.ts b/ccip-sdk/src/extra-args.test.ts index abe5c400..3c2dc71e 100644 --- a/ccip-sdk/src/extra-args.test.ts +++ b/ccip-sdk/src/extra-args.test.ts @@ -355,7 +355,7 @@ describe('GenericExtraArgsV3', () => { it('should encode V3 args with correct tag', () => { const args: GenericExtraArgsV3 = { gasLimit: 200_000n, - blockConfirmations: 5, + finality: 5, ccvs: [], ccvArgs: [], executor: '', @@ -370,7 +370,7 @@ describe('GenericExtraArgsV3', () => { it('should encode gasLimit as uint32 big-endian', () => { const args: GenericExtraArgsV3 = { gasLimit: 0x12345678n, - blockConfirmations: 0, + finality: 'finalized', ccvs: [], ccvArgs: [], executor: '', @@ -383,10 +383,10 @@ describe('GenericExtraArgsV3', () => { assert.equal(dataSlice(encoded, 4, 8), '0x12345678') }) - it('should encode blockConfirmations as uint16 big-endian', () => { + it('should encode finality as uint32 big-endian', () => { const args: GenericExtraArgsV3 = { gasLimit: 0n, - blockConfirmations: 0x1234, + finality: 0x1234, ccvs: [], ccvArgs: [], executor: '', @@ -395,8 +395,39 @@ describe('GenericExtraArgsV3', () => { tokenArgs: '0x', } const encoded = encodeExtraArgs(args, ChainFamily.EVM) - // After 4-byte tag + 4-byte gasLimit, next 2 bytes should be blockConfirmations - assert.equal(dataSlice(encoded, 8, 10), '0x1234') + // After 4-byte tag + 4-byte gasLimit, next 4 bytes should be finality + assert.equal(dataSlice(encoded, 8, 12), '0x00001234') + }) + + it("should encode finality 'safe' as WAIT_FOR_SAFE_FLAG", () => { + const args: GenericExtraArgsV3 = { + gasLimit: 0n, + finality: 'safe', + ccvs: [], + ccvArgs: [], + executor: '', + executorArgs: '0x', + tokenReceiver: '', + tokenArgs: '0x', + } + const encoded = encodeExtraArgs(args, ChainFamily.EVM) + // WAIT_FOR_SAFE_FLAG = 0x00010000 + assert.equal(dataSlice(encoded, 8, 12), '0x00010000') + }) + + it("should encode finality 'finalized' as zero", () => { + const args: GenericExtraArgsV3 = { + gasLimit: 0n, + finality: 'finalized', + ccvs: [], + ccvArgs: [], + executor: '', + executorArgs: '0x', + tokenReceiver: '', + tokenArgs: '0x', + } + const encoded = encodeExtraArgs(args, ChainFamily.EVM) + assert.equal(dataSlice(encoded, 8, 12), '0x00000000') }) }) @@ -404,7 +435,7 @@ describe('GenericExtraArgsV3', () => { it('should decode V3 args with empty arrays', () => { const original: GenericExtraArgsV3 = { gasLimit: 200_000n, - blockConfirmations: 5, + finality: 5, ccvs: [], ccvArgs: [], executor: '', @@ -417,7 +448,7 @@ describe('GenericExtraArgsV3', () => { assert.equal(decoded?._tag, 'GenericExtraArgsV3') assert.equal(decoded.gasLimit, 200_000n) - assert.equal((decoded as GenericExtraArgsV3).blockConfirmations, 5) + assert.deepEqual((decoded as GenericExtraArgsV3).finality, 5) assert.deepEqual((decoded as GenericExtraArgsV3).ccvs, []) assert.deepEqual((decoded as GenericExtraArgsV3).ccvArgs, []) assert.equal((decoded as GenericExtraArgsV3).executor, '') @@ -427,7 +458,7 @@ describe('GenericExtraArgsV3', () => { it('should decode V3 args with CCVs', () => { const original: GenericExtraArgsV3 = { gasLimit: 100_000n, - blockConfirmations: 10, + finality: 10, ccvs: ['0x1234567890123456789012345678901234567890'], ccvArgs: ['0x01020304'], executor: '', @@ -449,7 +480,7 @@ describe('GenericExtraArgsV3', () => { it('should decode V3 args with executor', () => { const original: GenericExtraArgsV3 = { gasLimit: 50_000n, - blockConfirmations: 0, + finality: 'finalized', ccvs: [], ccvArgs: [], executor: '0xabcdefabcdef123456789012345678901234abcd', @@ -470,7 +501,7 @@ describe('GenericExtraArgsV3', () => { it('should decode V3 args with tokenReceiver and tokenArgs', () => { const original: GenericExtraArgsV3 = { gasLimit: 300_000n, - blockConfirmations: 15, + finality: 15, ccvs: [], ccvArgs: [], executor: '', @@ -497,7 +528,7 @@ describe('GenericExtraArgsV3', () => { it('should round-trip minimal V3 args', () => { const original: GenericExtraArgsV3 = { gasLimit: 200_000n, - blockConfirmations: 5, + finality: 5, ccvs: [], ccvArgs: [], executor: '', @@ -512,7 +543,7 @@ describe('GenericExtraArgsV3', () => { assert.equal(decoded._tag, 'GenericExtraArgsV3') assert.equal(decoded.gasLimit, original.gasLimit) - assert.equal(decoded.blockConfirmations, original.blockConfirmations) + assert.deepEqual(decoded.finality, original.finality) assert.deepEqual(decoded.ccvs, original.ccvs) assert.deepEqual(decoded.ccvArgs, original.ccvArgs) assert.equal(decoded.executor, original.executor) @@ -524,7 +555,7 @@ describe('GenericExtraArgsV3', () => { it('should round-trip V3 args with all fields populated', () => { const original: GenericExtraArgsV3 = { gasLimit: 500_000n, - blockConfirmations: 20, + finality: 20, ccvs: [ '0x1111111111111111111111111111111111111111', '0x2222222222222222222222222222222222222222', @@ -542,7 +573,7 @@ describe('GenericExtraArgsV3', () => { assert.equal(decoded._tag, 'GenericExtraArgsV3') assert.equal(decoded.gasLimit, original.gasLimit) - assert.equal(decoded.blockConfirmations, original.blockConfirmations) + assert.deepEqual(decoded.finality, original.finality) assert.equal(decoded.ccvs.length, 2) assert.equal(decoded.ccvs[0]?.toLowerCase(), original.ccvs[0]!.toLowerCase()) assert.equal(decoded.ccvs[1]?.toLowerCase(), original.ccvs[1]!.toLowerCase()) @@ -558,7 +589,7 @@ describe('GenericExtraArgsV3', () => { it('should round-trip V3 args with max uint32 gasLimit', () => { const original: GenericExtraArgsV3 = { gasLimit: BigInt(0xffffffff), // max uint32 - blockConfirmations: 0xffff, // max uint16 + finality: 0xffff, // max block depth ccvs: [], ccvArgs: [], executor: '', @@ -573,7 +604,7 @@ describe('GenericExtraArgsV3', () => { assert.equal(decoded._tag, 'GenericExtraArgsV3') assert.equal(decoded.gasLimit, BigInt(0xffffffff)) - assert.equal(decoded.blockConfirmations, 0xffff) + assert.equal(decoded.finality, 0xffff) }) }) @@ -581,7 +612,7 @@ describe('GenericExtraArgsV3', () => { it('should auto-detect V3 args', () => { const original: GenericExtraArgsV3 = { gasLimit: 100_000n, - blockConfirmations: 3, + finality: 3, ccvs: [], ccvArgs: [], executor: '', @@ -637,14 +668,14 @@ describe('GenericExtraArgsV3', () => { // are canonical reference values produced by the on-chain encoder. it('should decode test vector: minimal', () => { - // gasLimit=200000, blockConfirmations=1, all empty + // gasLimit=200000, finality=1, all empty const decoded = decodeExtraArgs( - '0xa69dd4aa00030d40000100000000000000', + '0xa69dd4aa00030d400000000100000000000000', ChainFamily.EVM, ) as GenericExtraArgsV3 & { _tag: string } assert.equal(decoded._tag, 'GenericExtraArgsV3') assert.equal(decoded.gasLimit, 200000n) - assert.equal(decoded.blockConfirmations, 1) + assert.equal(decoded.finality, 1) assert.deepEqual(decoded.ccvs, []) assert.deepEqual(decoded.ccvArgs, []) assert.equal(decoded.executor, '') @@ -656,12 +687,12 @@ describe('GenericExtraArgsV3', () => { it('should decode test vector: all zeros', () => { // All fields zero/empty const decoded = decodeExtraArgs( - '0xa69dd4aa00000000000000000000000000', + '0xa69dd4aa0000000000000000000000000000000000', ChainFamily.EVM, ) as GenericExtraArgsV3 & { _tag: string } assert.equal(decoded._tag, 'GenericExtraArgsV3') assert.equal(decoded.gasLimit, 0n) - assert.equal(decoded.blockConfirmations, 0) + assert.deepEqual(decoded.finality, 'finalized') assert.deepEqual(decoded.ccvs, []) assert.deepEqual(decoded.ccvArgs, []) assert.equal(decoded.executor, '') @@ -671,14 +702,14 @@ describe('GenericExtraArgsV3', () => { }) it('should decode test vector: max values', () => { - // gasLimit=4294967295 (max uint32), blockConfirmations=65535 (max uint16) + // gasLimit=4294967295 (max uint32), finality=65535 (max block depth) const decoded = decodeExtraArgs( - '0xa69dd4aaffffffffffff00000000000000', + '0xa69dd4aaffffffff0000ffff00000000000000', ChainFamily.EVM, ) as GenericExtraArgsV3 & { _tag: string } assert.equal(decoded._tag, 'GenericExtraArgsV3') assert.equal(decoded.gasLimit, 4294967295n) - assert.equal(decoded.blockConfirmations, 65535) + assert.equal(decoded.finality, 65535) assert.deepEqual(decoded.ccvs, []) assert.deepEqual(decoded.ccvArgs, []) assert.equal(decoded.executor, '') @@ -688,14 +719,14 @@ describe('GenericExtraArgsV3', () => { }) it('should decode test vector: with executor', () => { - // gasLimit=400000, blockConfirmations=5, executor=0x9fca2fa95be0944a4ad731474dd3cdb1b704f9c6, executorArgs="data" + // gasLimit=400000, finality=5, executor=0x9fca2fa95be0944a4ad731474dd3cdb1b704f9c6, executorArgs="data" const decoded = decodeExtraArgs( - '0xa69dd4aa00061a80000500149fca2fa95be0944a4ad731474dd3cdb1b704f9c6000464617461000000', + '0xa69dd4aa00061a800000000500149fca2fa95be0944a4ad731474dd3cdb1b704f9c6000464617461000000', ChainFamily.EVM, ) as GenericExtraArgsV3 & { _tag: string } assert.equal(decoded._tag, 'GenericExtraArgsV3') assert.equal(decoded.gasLimit, 400000n) - assert.equal(decoded.blockConfirmations, 5) + assert.equal(decoded.finality, 5) assert.deepEqual(decoded.ccvs, []) assert.deepEqual(decoded.ccvArgs, []) assert.equal(decoded.executor.toLowerCase(), '0x9fca2fa95be0944a4ad731474dd3cdb1b704f9c6') @@ -705,14 +736,14 @@ describe('GenericExtraArgsV3', () => { }) it('should decode test vector: with 2 CCVs', () => { - // gasLimit=300000, blockConfirmations=10, 2 CCVs with "args1"/"args2" + // gasLimit=300000, finality=10, 2 CCVs with "args1"/"args2" const decoded = decodeExtraArgs( - '0xa69dd4aa000493e0000a021497cb3391ea73689a81b6853deb104dd078538f6b0005617267733114a0b7e3c01fcd94560317638a6b01f81846dee14400056172677332000000000000', + '0xa69dd4aa000493e00000000a021497cb3391ea73689a81b6853deb104dd078538f6b0005617267733114a0b7e3c01fcd94560317638a6b01f81846dee14400056172677332000000000000', ChainFamily.EVM, ) as GenericExtraArgsV3 & { _tag: string } assert.equal(decoded._tag, 'GenericExtraArgsV3') assert.equal(decoded.gasLimit, 300000n) - assert.equal(decoded.blockConfirmations, 10) + assert.equal(decoded.finality, 10) assert.equal(decoded.ccvs.length, 2) assert.equal(decoded.ccvs[0]?.toLowerCase(), '0x97cb3391ea73689a81b6853deb104dd078538f6b') assert.equal(decoded.ccvs[1]?.toLowerCase(), '0xa0b7e3c01fcd94560317638a6b01f81846dee144') @@ -725,14 +756,14 @@ describe('GenericExtraArgsV3', () => { }) it('should decode test vector: full fields', () => { - // All fields populated: gasLimit=200000, blockConfirmations=12, 2 CCVs, executor, tokenReceiver, tokenArgs + // All fields populated: gasLimit=200000, finality=12, 2 CCVs, executor, tokenReceiver, tokenArgs const decoded = decodeExtraArgs( - '0xa69dd4aa00030d40000c021497cb3391ea73689a81b6853deb104dd078538f6b0005617267733114a0b7e3c01fcd94560317638a6b01f81846dee14400056172677332149fca2fa95be0944a4ad731474dd3cdb1b704f9c60008657865634172677314c9f66ef22b2e26c2af10fcf8847ac4a920ab3eaa0009746f6b656e41726773', + '0xa69dd4aa00030d400000000c021497cb3391ea73689a81b6853deb104dd078538f6b0005617267733114a0b7e3c01fcd94560317638a6b01f81846dee14400056172677332149fca2fa95be0944a4ad731474dd3cdb1b704f9c60008657865634172677314c9f66ef22b2e26c2af10fcf8847ac4a920ab3eaa0009746f6b656e41726773', ChainFamily.EVM, ) as GenericExtraArgsV3 & { _tag: string } assert.equal(decoded._tag, 'GenericExtraArgsV3') assert.equal(decoded.gasLimit, 200000n) - assert.equal(decoded.blockConfirmations, 12) + assert.equal(decoded.finality, 12) assert.equal(decoded.ccvs.length, 2) assert.equal(decoded.ccvs[0]?.toLowerCase(), '0x97cb3391ea73689a81b6853deb104dd078538f6b') assert.equal(decoded.ccvs[1]?.toLowerCase(), '0xa0b7e3c01fcd94560317638a6b01f81846dee144') @@ -753,12 +784,12 @@ describe('GenericExtraArgsV3', () => { it('should decode test vector: zero-address CCVs', () => { // 2 CCVs with address(0), executor with 40-byte string args, tokenReceiver with 40-byte string const decoded = decodeExtraArgs( - '0xa69dd4aa0000e86b00220200000000000014123456789012345678901234567890123456789000283332383233383934323839333538373233353938373233393538383537393238333932373335323528333238323338393432383933353837323335393837323332393338353739323833373237333532350000', + '0xa69dd4aa0000e86b000000220200000000000014123456789012345678901234567890123456789000283332383233383934323839333538373233353938373233393538383537393238333932373335323528333238323338393432383933353837323335393837323332393338353739323833373237333532350000', ChainFamily.EVM, ) as GenericExtraArgsV3 & { _tag: string } assert.equal(decoded._tag, 'GenericExtraArgsV3') assert.equal(decoded.gasLimit, 59499n) - assert.equal(decoded.blockConfirmations, 34) + assert.equal(decoded.finality, 34) assert.equal(decoded.ccvs.length, 2) // CCVs with address(0) are decoded as empty strings assert.equal(decoded.ccvs[0], '') diff --git a/ccip-sdk/src/extra-args.ts b/ccip-sdk/src/extra-args.ts index e1536fc8..3ec3a825 100644 --- a/ccip-sdk/src/extra-args.ts +++ b/ccip-sdk/src/extra-args.ts @@ -1,4 +1,4 @@ -import { type BytesLike, id } from 'ethers' +import { type BytesLike, id, toNumber } from 'ethers' import { CCIPChainFamilyUnsupportedError, CCIPExtraArgsParseError } from './errors/index.ts' import { supportedChains } from './supported-chains.ts' @@ -47,6 +47,38 @@ export type EVMExtraArgsV2 = EVMExtraArgsV1 & { allowOutOfOrderExecution: boolean } +/** + * Requested finality configuration for cross-chain messages. + * + * Determines how long to wait on the source chain before relaying the message: + * - `'finalized'` — wait for full finality (safest, default). + * - `'safe'` — wait for the `safe` head tag. + * - number — wait for this many block confirmations [1..65535]. + * + * @example + * ```typescript + * // Wait for full finality (default) + * const finality: FinalityRequested = 'finalized' + * + * // Wait for the safe tag + * const safe: FinalityRequested = 'safe' + * + * // Wait for 5 block confirmations + * const blocks: FinalityRequested = 5 + * ``` + */ +export type FinalityRequested = 'finalized' | 'safe' | number + +/** + * Finality allowed by interested parties (e.g. TokenPools) + * - finalitySafe: Whether messages can be executed under "safe" finality (FCR) rules. + * - finalityDepth: Minimum block depth confirmations for Faster Than Finality (0 for Finalized). + */ +export type FinalityAllowed = { + finalitySafe?: boolean + finalityDepth: number +} + /** * Generic extra arguments version 3 with cross-chain verifiers and executor support. * Uses tightly packed binary encoding (NOT ABI-encoded). @@ -55,7 +87,7 @@ export type EVMExtraArgsV2 = EVMExtraArgsV1 & { * ```typescript * const args: GenericExtraArgsV3 = { * gasLimit: 200_000n, - * blockConfirmations: 5, + * finality: 'safe', * ccvs: ['0x1234...'], * ccvArgs: ['0x010203'], * executor: '0x5678...', @@ -68,8 +100,8 @@ export type EVMExtraArgsV2 = EVMExtraArgsV1 & { export type GenericExtraArgsV3 = { /** Gas limit for execution on the destination chain (uint32). */ gasLimit: bigint - /** Number of source-chain block confirmations to wait before relaying the message. */ - blockConfirmations: number + /** Finality config for the source chain before relaying. See {@link FinalityRequested}. */ + finality: FinalityRequested /** Cross-chain verifier addresses (EVM addresses). */ ccvs: string[] /** Per-CCV arguments (BytesLike). */ @@ -226,3 +258,45 @@ export function decodeExtraArgs( } throw new CCIPExtraArgsParseError(String(from ?? data)) } + +/** + * Decodes finality allowed by interested parties from bytes. + */ +export function decodeFinalityAllowed(finality: number | BytesLike): FinalityAllowed { + if (typeof finality !== 'number') finality = toNumber(finality) + const finalityDepth = finality & 0xffff + const finalityFlags = finality >>> 16 + const finalitySafe = !!(finalityFlags & 0x1) + return { + ...(finalitySafe && { finalitySafe }), + finalityDepth, + } +} + +/** + * Decodes requested finality from uint32, ensuring it is compatible with allowed finality. + */ +export function decodeFinalityRequested(finality: number | BytesLike): FinalityRequested { + const { finalitySafe, finalityDepth } = decodeFinalityAllowed(finality) + if (finalitySafe) { + if (finalityDepth) + throw new CCIPExtraArgsParseError('Invalid finality config: cannot have both safe and depth') + return 'safe' + } else if (!finalityDepth) return 'finalized' + return finalityDepth +} + +/** + * Encodes finality allowed or requested into a uint32 format for on-chain use. + */ +export function encodeFinality(finality: FinalityAllowed | FinalityRequested | bigint): number { + if (typeof finality === 'number' || typeof finality === 'bigint' || !isNaN(Number(finality))) + return encodeFinality({ finalityDepth: Number(finality) }) + else if (finality === 'finalized') return encodeFinality({ finalityDepth: 0 }) + else if (finality === 'safe') return encodeFinality({ finalitySafe: true, finalityDepth: 0 }) + if (finality.finalityDepth < 0 || finality.finalityDepth > 65535) + throw new CCIPExtraArgsParseError('Finality depth must be between 0 and 65535') + let finalityFlags = 0 + if (finality.finalitySafe) finalityFlags |= 0x1 + return (finalityFlags << 16) | finality.finalityDepth +} diff --git a/ccip-sdk/src/hasher/hasher.ts b/ccip-sdk/src/hasher/hasher.ts index e5802de5..5a467187 100644 --- a/ccip-sdk/src/hasher/hasher.ts +++ b/ccip-sdk/src/hasher/hasher.ts @@ -17,5 +17,5 @@ export function getLeafHasher( const destFamily = networkInfo(lane.destChainSelector).family const chain = supportedChains[destFamily] if (!chain) throw new CCIPChainFamilyUnsupportedError(destFamily) - return chain.getDestLeafHasher(lane, ctx) as LeafHasher + return chain.getDestLeafHasher(lane, ctx) } diff --git a/ccip-sdk/src/index.ts b/ccip-sdk/src/index.ts index d47942f0..a9d3a2b5 100644 --- a/ccip-sdk/src/index.ts +++ b/ccip-sdk/src/index.ts @@ -49,6 +49,7 @@ export { type EVMExtraArgsV1, type EVMExtraArgsV2, type ExtraArgs, + type FinalityRequested, type GenericExtraArgsV3, type SVMExtraArgsV1, type SuiExtraArgsV1, diff --git a/ccip-sdk/src/messages.ts b/ccip-sdk/src/messages.ts index ff415d75..933463da 100644 --- a/ccip-sdk/src/messages.ts +++ b/ccip-sdk/src/messages.ts @@ -1,6 +1,7 @@ import { type BytesLike, dataSlice, hexlify, toBigInt, toNumber } from 'ethers' import { CCIPMessageDecodeError } from './errors/index.ts' +import { type FinalityRequested, decodeFinalityRequested } from './extra-args.ts' import type { ChainFamily } from './types.ts' import { decodeAddress, getDataBytes, networkInfo } from './utils.ts' @@ -21,7 +22,7 @@ export type MessageV1 = { messageNumber: bigint executionGasLimit: number ccipReceiveGasLimit: number - finality: number + finality: FinalityRequested ccvAndExecutorHash: string onRampAddress: string offRampAddress: string @@ -143,7 +144,7 @@ function decodeTokenTransferV1( * @returns The decoded MessageV1 struct. */ export function decodeMessageV1(encodedMessage: BytesLike): MessageV1 { - const MESSAGE_V1_BASE_SIZE = 77 + const MESSAGE_V1_BASE_SIZE = 79 const encoded = getDataBytes(encodedMessage) if (encoded.length < MESSAGE_V1_BASE_SIZE) throw new CCIPMessageDecodeError('MESSAGE_MIN_SIZE') @@ -172,14 +173,14 @@ export function decodeMessageV1(encodedMessage: BytesLike): MessageV1 { // ccipReceiveGasLimit (4 bytes, big endian) const ccipReceiveGasLimit = toNumber(dataSlice(encoded, 29, 33)) - // finality (2 bytes, big endian) - const finality = toNumber(dataSlice(encoded, 33, 35)) + // finality (4 bytes, big endian) + const finality = decodeFinalityRequested(toNumber(dataSlice(encoded, 33, 37))) // ccvAndExecutorHash (32 bytes) - const ccvAndExecutorHash = hexlify(dataSlice(encoded, 35, 67)) + const ccvAndExecutorHash = hexlify(dataSlice(encoded, 37, 69)) // onRampAddressLength and onRampAddress - let offset = 67 + let offset = 69 if (offset >= encoded.length) throw new CCIPMessageDecodeError('MESSAGE_ONRAMP_ADDRESS_LENGTH') const onRampAddressLength = encoded[offset++]! if (offset + onRampAddressLength > encoded.length) { diff --git a/ccip-sdk/src/requests.test.ts b/ccip-sdk/src/requests.test.ts index 7025941b..e3f99a1f 100644 --- a/ccip-sdk/src/requests.test.ts +++ b/ccip-sdk/src/requests.test.ts @@ -7,7 +7,7 @@ import { getAddress, hexlify, randomBytes, toBeHex } from 'ethers' import type { Chain, LogFilter } from './chain.ts' import { CCIPAddressInvalidError, CCIPArgumentInvalidError } from './errors/specialized.ts' -import type { GenericExtraArgsV3, SVMExtraArgsV1 } from './extra-args.ts' +import type { GenericExtraArgsV3 } from './extra-args.ts' import { EVMChain } from './index.ts' import { buildMessageForDest, @@ -66,7 +66,7 @@ class MockChain { data: mockedMessage(1), blockNumber: 12000, transactionHash: '0x123', - } as ChainLog, + }, ] return (async function* () { for (const log of logs) { @@ -165,7 +165,7 @@ describe('getMessagesInTx', () => { blockNumber: 12000, transactionHash: '0x123', index: 0, - } as ChainLog, + }, ], timestamp: 1234567890, blockNumber: 12000, @@ -192,7 +192,7 @@ describe('getMessagesInTx', () => { blockNumber: 12000, transactionHash: '0x123', index: 0, - } as ChainLog, + }, { address: getAddress(hexlify(randomBytes(20))), topics: [topic0], @@ -200,7 +200,7 @@ describe('getMessagesInTx', () => { blockNumber: 12000, transactionHash: '0x123', index: 1, - } as ChainLog, + }, ], timestamp: 1234567890, blockNumber: 12000, @@ -261,7 +261,7 @@ describe('getMessageById', () => { data: msg, blockNumber: 12000, transactionHash: '0x123', - } as ChainLog + } })(), ) @@ -284,7 +284,7 @@ describe('getMessageById', () => { data: mockedMessage(2), blockNumber: 12000, transactionHash: '0x123', - } as ChainLog + } })(), ) @@ -340,7 +340,7 @@ describe('getMessagesInBatch', () => { transactionHash: '0x123', index: 0, data: mockedMessage(9), - } as ChainLog, + }, message: { messageId: '0xMessageId9', sourceChainSelector: 16015286601757825753n, @@ -355,7 +355,7 @@ describe('getMessagesInBatch', () => { strict: false, feeToken: '0x0000000000000000000000000000000000008916', feeTokenAmount: 0n, - } as CCIPMessage, + }, lane: { sourceChainSelector: 16015286601757825753n, destChainSelector: 10n, @@ -383,7 +383,7 @@ describe('getMessagesInBatch', () => { transactionHash: '0x123', index: 0, data: mockedMessage(5), - } as ChainLog, + }, message: { messageId: '0xMessageId5', sourceChainSelector: 16015286601757825753n, @@ -398,7 +398,7 @@ describe('getMessagesInBatch', () => { strict: false, feeToken: '0x0000000000000000000000000000000000008916', feeTokenAmount: 0n, - } as CCIPMessage, + }, lane: { sourceChainSelector: 16015286601757825753n, destChainSelector: 10n, @@ -503,6 +503,64 @@ describe('decodeMessage', () => { } }) + it('should decode v2.0 message with null verifiers[].destAddress (pre-execution state)', () => { + // Real-world API shape: a VERIFYING v2.0 message has verifiers[].destAddress === null + // until a verifier commits on the destination chain. The regex in decodeJsonMessage + // matches `destAddress` (via /^dest.*address/) and would otherwise crash on + // decodeAddress(null). Only `destAddress` is allowed to be null; other + // address-matched keys (sender, receiver, onramp, etc.) must still throw. + const msg = decodeMessage({ + messageId: '0xd3ad975c42aea68b22a21f659b13cc803881f1a9f191da63d0dafaf9e03fa6b2', + sequenceNumber: '35', + onramp: '0x0F887309075403d02563CBCbB3D98Fb2ef2D2946', + sourceNetworkInfo: { + chainSelector: '16015286601757825753', + chainFamily: 'EVM', + }, + destNetworkInfo: { + chainSelector: '14767482510784806043', + chainFamily: 'EVM', + }, + sender: '0x9d087fC03ae39b088326b67fA3C788236645b717', + receiver: '0x9d087fC03ae39b088326b67fA3C788236645b717', + status: 'VERIFYING', + feeToken: '0x6846eF566e701136b2f77E3A7f21aAaDfc61B801', + feeTokenAmount: '375000000000000', + tokenAmounts: [ + { + sourceTokenAddress: '0x67f000ca40cb1C6eE3Bd2c7FdA2Fd22DDF56FAAb', + destTokenAddress: '0x004936C8E8Cb18b40F79A142d4454467338d6F9E', + sourcePoolAddress: '0xF374Cb960A8D9bd8d7b295F90F22E27eC405Fc95', + amount: '1000', + extraData: '0x0000000000000000000000000000000000000000000000000000000000000012', + destGasAmount: '90000', + }, + ], + verifiers: { + items: [ + { + sourceAddress: '0x997bbB1Be075E6e9E7802B84C27c79e820A337A3', + destAddress: null, + metadata: null, + isRequired: null, + verification: null, + status: 'UNKNOWN', + }, + ], + optionalThreshold: 0, + }, + }) + + assert.equal( + msg.messageId, + '0xd3ad975c42aea68b22a21f659b13cc803881f1a9f191da63d0dafaf9e03fa6b2', + ) + assert.equal(typeof msg.sender, 'string') + const verifiers = (msg as unknown as { verifiers: { items: { destAddress: unknown }[] } }) + .verifiers + assert.equal(verifiers.items[0]!.destAddress, null) + }) + describe('buildMessageForDest', () => { describe('Chain (base implementation)', () => { it('should populate default extraArgs for EVM with data', () => { @@ -633,7 +691,7 @@ describe('decodeMessage', () => { receiver: '0x1234567890123456789012345678901234567890', data: '0x1234', extraArgs: { - blockConfirmations: 1, + finality: 1, typo: 'oops', } as any, } @@ -685,20 +743,20 @@ describe('decodeMessage', () => { }) describe('V3 extraArgs detection', () => { - it('should detect V3 when blockConfirmations is provided', () => { + it('should detect V3 when finality is provided', () => { const message = { receiver: '0x1234567890123456789012345678901234567890', data: '0x1234', extraArgs: { - blockConfirmations: 5, - } as any, + finality: 5, + }, } const result = EVMChain.buildMessageForDest(message) const extraArgs = result.extraArgs as GenericExtraArgsV3 - assert.ok('blockConfirmations' in result.extraArgs) - assert.equal(extraArgs.blockConfirmations, 5) + assert.ok('finality' in result.extraArgs) + assert.equal(extraArgs.finality, 5) assert.equal(extraArgs.gasLimit, 200000n) assert.deepEqual(extraArgs.ccvs, []) assert.equal(extraArgs.executor, '') @@ -717,7 +775,7 @@ describe('decodeMessage', () => { assert.ok('executor' in result.extraArgs) assert.equal(extraArgs.executor, '0x0000000000000000123456789012345678901234') - assert.equal(extraArgs.blockConfirmations, 0) + assert.deepEqual(extraArgs.finality, 'finalized') }) it('should apply V3 defaults for all fields when any V3 field is present', () => { @@ -735,7 +793,7 @@ describe('decodeMessage', () => { // Verify all V3 fields have proper defaults assert.deepEqual(extraArgs.ccvs, ['0x0000000000123456789012345678901234567890']) assert.deepEqual(extraArgs.ccvArgs, []) - assert.equal(extraArgs.blockConfirmations, 0) + assert.deepEqual(extraArgs.finality, 'finalized') assert.equal(extraArgs.executor, '') assert.equal(extraArgs.executorArgs, '0x') assert.equal(extraArgs.tokenReceiver, '') @@ -755,7 +813,7 @@ describe('decodeMessage', () => { const result = EVMChain.buildMessageForDest(message) // Should be V2, not V3 - assert.ok(!('blockConfirmations' in result.extraArgs)) + assert.ok(!('finality' in result.extraArgs)) assert.ok(!('executor' in result.extraArgs)) if ('gasLimit' in result.extraArgs) { assert.equal(result.extraArgs.gasLimit, 300000n) @@ -769,15 +827,15 @@ describe('decodeMessage', () => { const message = { receiver: '0x1234567890123456789012345678901234567890', extraArgs: { - blockConfirmations: 10, - } as any, + finality: 10, + }, } const result = EVMChain.buildMessageForDest(message) const extraArgs = result.extraArgs as GenericExtraArgsV3 assert.equal(extraArgs.gasLimit, 0n) - assert.equal(extraArgs.blockConfirmations, 10) + assert.equal(extraArgs.finality, 10) }) it('should allow user to override V3 defaults', () => { @@ -786,7 +844,7 @@ describe('decodeMessage', () => { receiver: '0x1234567890123456789012345678901234567890', data: '0x1234', extraArgs: { - blockConfirmations: 3, + finality: 3, gasLimit: 500000n, executor: '0x000000000000000012345678901234567890123', executorArgs: customExecutorArgs, @@ -794,14 +852,14 @@ describe('decodeMessage', () => { '0x0000000000000000000000000000000000000cc1', '0x0000000000000000000000000000000000000cc2', ], - } as any, + }, } const result = EVMChain.buildMessageForDest(message) const extraArgs = result.extraArgs as GenericExtraArgsV3 assert.equal(extraArgs.gasLimit, 500000n) - assert.equal(extraArgs.blockConfirmations, 3) + assert.equal(extraArgs.finality, 3) assert.equal(extraArgs.executor, '0x000000000000000012345678901234567890123') assert.deepEqual(extraArgs.executorArgs, customExecutorArgs) assert.deepEqual(extraArgs.ccvs, [ @@ -826,7 +884,7 @@ describe('decodeMessage', () => { const result = SolanaChain.buildMessageForDest(message) assert.ok(result.extraArgs) - const extraArgs = result.extraArgs as SVMExtraArgsV1 + const extraArgs = result.extraArgs assert.equal(extraArgs.computeUnits, 100000n) assert.equal(extraArgs.allowOutOfOrderExecution, true) assert.equal(extraArgs.tokenReceiver, '11111111111111111111111111111111') @@ -845,7 +903,7 @@ describe('decodeMessage', () => { const result = SolanaChain.buildMessageForDest(message) - const extraArgs = result.extraArgs as SVMExtraArgsV1 + const extraArgs = result.extraArgs assert.equal(extraArgs.computeUnits, 250000n) }) @@ -861,7 +919,7 @@ describe('decodeMessage', () => { const result = SolanaChain.buildMessageForDest(message) - const extraArgs = result.extraArgs as SVMExtraArgsV1 + const extraArgs = result.extraArgs assert.equal(extraArgs.computeUnits, 150000n) }) @@ -873,7 +931,7 @@ describe('decodeMessage', () => { const result = SolanaChain.buildMessageForDest(message) - const extraArgs = result.extraArgs as SVMExtraArgsV1 + const extraArgs = result.extraArgs assert.equal(extraArgs.computeUnits, 200000n) // DEFAULT_GAS_LIMIT }) @@ -884,7 +942,7 @@ describe('decodeMessage', () => { const result = SolanaChain.buildMessageForDest(message) - const extraArgs = result.extraArgs as SVMExtraArgsV1 + const extraArgs = result.extraArgs assert.equal(extraArgs.computeUnits, 0n) }) @@ -916,7 +974,7 @@ describe('decodeMessage', () => { const result = SolanaChain.buildMessageForDest(message) - const extraArgs = result.extraArgs as SVMExtraArgsV1 + const extraArgs = result.extraArgs assert.equal(extraArgs.tokenReceiver, customReceiver) }) @@ -929,7 +987,7 @@ describe('decodeMessage', () => { const result = SolanaChain.buildMessageForDest(message) - const extraArgs = result.extraArgs as SVMExtraArgsV1 + const extraArgs = result.extraArgs assert.equal(extraArgs.tokenReceiver, receiverAddr) assert.equal(result.receiver, '11111111111111111111111111111111') // default PublicKey when tokens }) @@ -962,7 +1020,7 @@ describe('decodeMessage', () => { const result = SolanaChain.buildMessageForDest(message) - const extraArgs = result.extraArgs as SVMExtraArgsV1 + const extraArgs = result.extraArgs assert.deepEqual(extraArgs.accounts, accounts) }) @@ -978,7 +1036,7 @@ describe('decodeMessage', () => { const result = SolanaChain.buildMessageForDest(message) - const extraArgs = result.extraArgs as SVMExtraArgsV1 + const extraArgs = result.extraArgs assert.equal(extraArgs.accountIsWritableBitmap, bitmap) }) @@ -1007,7 +1065,7 @@ describe('decodeMessage', () => { const result = SolanaChain.buildMessageForDest(message) - const extraArgs = result.extraArgs as SVMExtraArgsV1 + const extraArgs = result.extraArgs assert.equal(extraArgs.allowOutOfOrderExecution, false) }) diff --git a/ccip-sdk/src/requests.ts b/ccip-sdk/src/requests.ts index 3251fe5a..43851bc0 100644 --- a/ccip-sdk/src/requests.ts +++ b/ccip-sdk/src/requests.ts @@ -19,7 +19,6 @@ import { type CCIPMessage, type CCIPRequest, type CCIPVersion, - type ChainLog, type ChainTransaction, type MessageInput, ChainFamily, @@ -89,12 +88,14 @@ function decodeJsonMessage(data: Record | undefined) { k?.match(/(selector|amount|nonce|number|limit|bitmap|juels)$/i) ? BigInt(v as string | number | bigint) : k?.match(/(^dest.*address)|(receiver|offramp|accounts)/i) - ? decodeAddress((typeof v === 'bigint' ? v.toString() : v) as BytesLike, destFamily) + ? v == null && k === 'destAddress' + ? v + : decodeAddress((typeof v === 'bigint' ? v.toString() : v) as BytesLike, destFamily) : k?.match(/((source.*address)|sender|issuer|origin|onramp|(feetoken$)|(token.*address$))/i) ? decodeAddress((typeof v === 'bigint' ? v.toString() : v) as BytesLike, sourceFamily) : v instanceof Uint8Array || (Array.isArray(v) && v.length >= 4 && v.every((e) => typeof e === 'number')) - ? hexlify(getDataBytes(v as readonly number[])) + ? hexlify(getDataBytes(v)) : v, ) as typeof data_ @@ -180,7 +181,7 @@ export function decodeMessage(data: string | Uint8Array | Record { */ async getRouterForOffRamp(offRamp: string, _sourceChainSelector: bigint): Promise { const offRamp_ = new PublicKey(offRamp) - const program = new Program(CCIP_OFFRAMP_IDL as Idl, offRamp_, { + const program = new Program(CCIP_OFFRAMP_IDL, offRamp_, { connection: this.connection, }) @@ -842,7 +842,7 @@ export class SolanaChain extends Chain { feeValueJuels, extraArgs, ...rest, - } as CCIPMessage + } } /** diff --git a/ccip-sdk/src/solana/send.ts b/ccip-sdk/src/solana/send.ts index ec45c1a4..356deb92 100644 --- a/ccip-sdk/src/solana/send.ts +++ b/ccip-sdk/src/solana/send.ts @@ -21,7 +21,7 @@ import { CCIPTokenAmountInvalidError, } from '../errors/index.ts' import { type AnyMessage, type WithLogger, ChainFamily } from '../types.ts' -import { bytesToBuffer, toLeArray, encodeAddressToAny } from '../utils.ts' +import { bytesToBuffer, encodeAddressToAny, toLeArray } from '../utils.ts' import { IDL as CCIP_ROUTER_IDL } from './idl/1.6.0/CCIP_ROUTER.ts' import type { UnsignedSolanaTx } from './types.ts' import { resolveATA, simulateTransaction, simulationProvider } from './utils.ts' diff --git a/ccip-sdk/src/sui/hasher.ts b/ccip-sdk/src/sui/hasher.ts index 93de4a56..32329dc0 100644 --- a/ccip-sdk/src/sui/hasher.ts +++ b/ccip-sdk/src/sui/hasher.ts @@ -30,7 +30,7 @@ export function getSuiLeafHasher({ return ((message: CCIPMessage): string => hashV16SuiMessage(message, metadataHash)) as LeafHasher default: - throw new CCIPSuiHasherVersionUnsupportedError(version as string) + throw new CCIPSuiHasherVersionUnsupportedError(version) } } diff --git a/ccip-sdk/src/sui/index.ts b/ccip-sdk/src/sui/index.ts index 768e0a21..e5e37f54 100644 --- a/ccip-sdk/src/sui/index.ts +++ b/ccip-sdk/src/sui/index.ts @@ -644,7 +644,7 @@ export class SuiChain extends Chain { onRampAddress: decodeOnRampAddress(root.on_ramp_address), minSeqNr: BigInt(root.min_seq_nr), maxSeqNr: BigInt(root.max_seq_nr), - merkleRoot: hexlify(getDataBytes(root.merkle_root)), + merkleRoot: hexlify(getDataBytes(root.merkle_root)) as `0x${string}`, } }) .filter((r) => diff --git a/ccip-sdk/src/ton/index.test.ts b/ccip-sdk/src/ton/index.test.ts index d98043c8..80a44213 100644 --- a/ccip-sdk/src/ton/index.test.ts +++ b/ccip-sdk/src/ton/index.test.ts @@ -212,7 +212,7 @@ describe('TON index unit tests', () => { it('should send to offRamp with correct value and seqno', async () => { const { client, wallet, getCapturedTransfer } = createMockClientAndWallet({ seqno: 42 }) - const tonChain = new TONChain(client, mockNetworkInfo as any) + const tonChain = new TONChain(client, mockNetworkInfo) await tonChain.execute({ offRamp: TON_OFFRAMP_ADDRESS_TEST, @@ -229,7 +229,7 @@ describe('TON index unit tests', () => { it('should build Cell body with MANUALLY_EXECUTE_OPCODE', async () => { const { client, wallet, getCapturedTransfer } = createMockClientAndWallet() - const tonChain = new TONChain(client, mockNetworkInfo as any) + const tonChain = new TONChain(client, mockNetworkInfo) await tonChain.execute({ offRamp: TON_OFFRAMP_ADDRESS_TEST, @@ -253,7 +253,7 @@ describe('TON index unit tests', () => { txLt: '42317062000001', txHash: 'bb94e574159e19660ab558347f59f80fd005b44c544417df38d0dfb08f2bd395', }) - const tonChain = new TONChain(client, mockNetworkInfo as any) + const tonChain = new TONChain(client, mockNetworkInfo) const result = await tonChain.execute({ offRamp: TON_OFFRAMP_ADDRESS_TEST, @@ -275,7 +275,7 @@ describe('TON index unit tests', () => { it('should reject non-TON wallet', async () => { const { client } = createMockClientAndWallet() - const tonChain = new TONChain(client, mockNetworkInfo as any) + const tonChain = new TONChain(client, mockNetworkInfo) await assert.rejects( tonChain.execute({ @@ -289,7 +289,7 @@ describe('TON index unit tests', () => { it('should propagate sendTransfer errors', async () => { const { client, wallet } = createMockClientAndWallet({ shouldFail: true }) - const tonChain = new TONChain(client, mockNetworkInfo as any) + const tonChain = new TONChain(client, mockNetworkInfo) await assert.rejects( tonChain.execute({ @@ -304,10 +304,7 @@ describe('TON index unit tests', () => { describe('generateUnsignedExecute', () => { it('should return UnsignedTONTx with family=ton', async () => { - const tonChain = new TONChain( - { getTransactions: async () => [] } as any, - mockNetworkInfo as any, - ) + const tonChain = new TONChain({ getTransactions: async () => [] } as any, mockNetworkInfo) const unsigned = await tonChain.generateUnsignedExecute({ payer: '0:' + 'b'.repeat(64), @@ -352,7 +349,7 @@ describe('TON index unit tests', () => { contractType: 'com.chainlink.ton.ccip.OffRamp', version: '1.6.0', }) - const tonChain = new TONChain(client, mockNetworkInfo as any) + const tonChain = new TONChain(client, mockNetworkInfo) const result = await tonChain.typeAndVersion( 'EQCVYafY2dq6dxpJXxm0ugndeoCi1uohtNthyotzpcGVmaoa', @@ -368,7 +365,7 @@ describe('TON index unit tests', () => { contractType: 'com.chainlink.ton.ccip.OnRamp', version: '1.6.0', }) - const tonChain = new TONChain(client, mockNetworkInfo as any) + const tonChain = new TONChain(client, mockNetworkInfo) const result = await tonChain.typeAndVersion( 'EQCVYafY2dq6dxpJXxm0ugndeoCi1uohtNthyotzpcGVmaoa', @@ -483,7 +480,7 @@ describe('TON index unit tests', () => { symbol: 'USDT', decimals: 6, }) - const tonChain = new TONChain(client, mockNetworkInfo as any) + const tonChain = new TONChain(client, mockNetworkInfo) const result = await tonChain.getTokenInfo('EQCVYafY2dq6dxpJXxm0ugndeoCi1uohtNthyotzpcGVmaoa') @@ -495,7 +492,7 @@ describe('TON index unit tests', () => { const client = createMockClientForJetton({ contentType: 'onchain', }) - const tonChain = new TONChain(client, mockNetworkInfo as any) + const tonChain = new TONChain(client, mockNetworkInfo) const result = await tonChain.getTokenInfo('EQCVYafY2dq6dxpJXxm0ugndeoCi1uohtNthyotzpcGVmaoa') @@ -511,7 +508,7 @@ describe('TON index unit tests', () => { getTransactions: async () => [], } as unknown as TonClient - const tonChain = new TONChain(client, mockNetworkInfo as any) + const tonChain = new TONChain(client, mockNetworkInfo) const result = await tonChain.getTokenInfo('EQCVYafY2dq6dxpJXxm0ugndeoCi1uohtNthyotzpcGVmaoa') @@ -542,7 +539,7 @@ describe('TON index unit tests', () => { getTransactions: async () => [], } as unknown as TonClient - const tonChain = new TONChain(client, mockNetworkInfo as any) + const tonChain = new TONChain(client, mockNetworkInfo) const result = await tonChain.getTokenInfo('EQCVYafY2dq6dxpJXxm0ugndeoCi1uohtNthyotzpcGVmaoa') // Should use default decimals when parsing fails @@ -760,7 +757,7 @@ describe('TON index unit tests', () => { createMockTransaction(2, 1001), // Success - should be yielded ]) - const tonChain = new TONChain(mockClient, mockNetworkInfo as any) + const tonChain = new TONChain(mockClient, mockNetworkInfo) const receipts = [] for await (const receipt of tonChain.getExecutionReceipts({ @@ -781,7 +778,7 @@ describe('TON index unit tests', () => { createMockTransaction(3, 1001), // Failure - should be yielded ]) - const tonChain = new TONChain(mockClient, mockNetworkInfo as any) + const tonChain = new TONChain(mockClient, mockNetworkInfo) const receipts = [] for await (const receipt of tonChain.getExecutionReceipts({ @@ -805,7 +802,7 @@ describe('TON index unit tests', () => { createMockTransaction(2, 1001, pastTimestamp + 1), // Success ]) - const tonChain = new TONChain(mockClient, mockNetworkInfo as any) + const tonChain = new TONChain(mockClient, mockNetworkInfo) // Use startTime before the mock transactions so they are included const request = { @@ -878,7 +875,7 @@ describe('TON index unit tests', () => { }, } as unknown as TonClient - const tonChain = new TONChain(mockClient, mockNetworkInfo as any) + const tonChain = new TONChain(mockClient, mockNetworkInfo) const receipts = [] for await (const receipt of tonChain.getExecutionReceipts({ diff --git a/ccip-sdk/src/ton/index.ts b/ccip-sdk/src/ton/index.ts index 3922162a..18e666b8 100644 --- a/ccip-sdk/src/ton/index.ts +++ b/ccip-sdk/src/ton/index.ts @@ -767,7 +767,7 @@ export class TONChain extends Chain { ) const minSeqNr = slice.loadUintBig(64) const maxSeqNr = slice.loadUintBig(64) - const merkleRoot = hexlify(slice.loadBuffer(32)) + const merkleRoot = hexlify(slice.loadBuffer(32)) as `0x${string}` // Read hasPriceUpdates (1 bit): we don't need the data but should consume it if (slice.remainingBits >= 1) { diff --git a/ccip-sdk/src/ton/utils.ts b/ccip-sdk/src/ton/utils.ts index 7e3fcd9f..fbf6cb30 100644 --- a/ccip-sdk/src/ton/utils.ts +++ b/ccip-sdk/src/ton/utils.ts @@ -1,6 +1,7 @@ import { type Builder, type Slice, Cell, Dictionary, beginCell } from '@ton/core' import { hexlify, toBeHex } from 'ethers' +import { CCIPError, CCIPErrorCode } from '../errors/index.ts' import { CCIPTransactionNotFoundError } from '../errors/specialized.ts' import { type WithLogger, NetworkType } from '../types.ts' import { bytesToBuffer } from '../utils.ts' @@ -42,7 +43,8 @@ export function asSnakedCell(array: T[], builderFn: (item: T) => Builder): Ce for (const value of array) { const itemBuilder = builderFn(value) if (itemBuilder.refs > 3) { - throw new Error( + throw new CCIPError( + CCIPErrorCode.UNKNOWN, 'Cannot pack more than 3 refs per item, use storeRef to a cell containing the item', ) } diff --git a/ccip-sdk/src/types.ts b/ccip-sdk/src/types.ts index b33025f2..540ee177 100644 --- a/ccip-sdk/src/types.ts +++ b/ccip-sdk/src/types.ts @@ -1,6 +1,6 @@ import type { AbiParametersToPrimitiveTypes, ExtractAbiEvent } from 'abitype' import type { BytesLike, Log as EVMLog } from 'ethers' -import type { SetOptional } from 'type-fest' +import type { SetFieldType, SetOptional } from 'type-fest' import type { APICCIPRequestMetadata } from './api/types.ts' import type OffRamp_1_6_ABI from './evm/abi/OffRamp_1_6.ts' @@ -239,10 +239,15 @@ export interface CCIPRequest { /** * OnChain Commit report structure from the OffRamp CommitReportAccepted event. + * Replaces the stricter onRampAddress: `0x{string}` field type with a string for cross-chain compatibility. */ -export type CommitReport = AbiParametersToPrimitiveTypes< - ExtractAbiEvent['inputs'] ->[0][number] +export type CommitReport = SetFieldType< + AbiParametersToPrimitiveTypes< + ExtractAbiEvent['inputs'] + >[0][number], + 'onRampAddress', + string +> /** * OffChain Verification result for a CCIP v2.0 message, returned by the indexer API. diff --git a/ccip-sdk/src/utils.test.ts b/ccip-sdk/src/utils.test.ts index fdac21f3..49a2109c 100644 --- a/ccip-sdk/src/utils.test.ts +++ b/ccip-sdk/src/utils.test.ts @@ -924,7 +924,7 @@ describe('getDataBytes', () => { }) it('should throw error for invalid input', () => { - assert.throws(() => getDataBytes('not-hex-or-base64' as any), /Unsupported data format/) + assert.throws(() => getDataBytes('not-hex-or-base64'), /Unsupported data format/) }) it('should handle empty hex string', () => { diff --git a/ccip-sdk/src/utils.ts b/ccip-sdk/src/utils.ts index 60d410db..f2b8c522 100644 --- a/ccip-sdk/src/utils.ts +++ b/ccip-sdk/src/utils.ts @@ -901,9 +901,7 @@ const util = : { inspect: Object.assign((v: unknown) => JSON.stringify(v), { custom: Symbol('custom'), - defaultOptions: { - depth: 2, - } as Record, + defaultOptions: { depth: 2 }, }), } export { util } diff --git a/eslint.config.mjs b/eslint.config.mjs index d7d428d7..5d1b35cb 100644 --- a/eslint.config.mjs +++ b/eslint.config.mjs @@ -1,9 +1,8 @@ // @ts-check import eslint from '@eslint/js' import { defineConfig } from 'eslint/config' -import { createNodeResolver } from 'eslint-plugin-import-x' -import importXPlugin from 'eslint-plugin-import-x' -import jsdoc from 'eslint-plugin-jsdoc' +import { createNodeResolver, flatConfigs as importXFlatConfigs } from 'eslint-plugin-import-x' +import { default as jsdoc } from 'eslint-plugin-jsdoc' import eslintPluginPrettierRecommended from 'eslint-plugin-prettier/recommended' import tsdoc from 'eslint-plugin-tsdoc' import { configs as tseslintConfigs } from 'typescript-eslint' @@ -19,7 +18,7 @@ export default defineConfig( }, eslint.configs.recommended, eslintPluginPrettierRecommended, - importXPlugin.flatConfigs.recommended, + importXFlatConfigs.recommended, // Inline the useful parts of flatConfigs.typescript without its broken // eslint-import-resolver-typescript dependency. Our source files already // use explicit .ts extensions, so createNodeResolver handles everything. @@ -87,16 +86,7 @@ export default defineConfig( message: 'Use CCIPError or specialized error classes instead of generic Error. Use "new" with error classes.', }, - ], - }, - }, - { - files: ['ccip-sdk/src/**/*.ts', 'ccip-cli/src/**/*.ts'], - ignores: ['**/*.test.ts', '**/__tests__/**', '**/__mocks__/**'], - rules: { - 'no-restricted-syntax': [ // Required for NextJS Turbopack compatibility - 'error', { selector: "BinaryExpression[operator='**'][left.type='Literal'][left.bigint], BinaryExpression[operator='**'][right.type='Literal'][right.bigint]", @@ -164,7 +154,9 @@ export default defineConfig( { settings: { 'import-x/resolver-next': [ - createNodeResolver({ extensions: ['.ts', '.tsx', '.cts', '.mts', '.js', '.jsx', '.cjs', '.mjs'] }), + createNodeResolver({ + extensions: ['.ts', '.tsx', '.cts', '.mts', '.js', '.jsx', '.cjs', '.mjs'], + }), ], }, rules: { diff --git a/package-lock.json b/package-lock.json index 081f87b4..0a3310a8 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@chainlink/ccip-tools-ts", - "version": "1.4.2", + "version": "1.5.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@chainlink/ccip-tools-ts", - "version": "1.4.2", + "version": "1.5.0", "license": "MIT", "workspaces": [ "ccip-sdk", @@ -15,24 +15,24 @@ ], "devDependencies": { "@eslint/js": "^10.0.1", - "@types/node": "25.5.2", + "@types/node": "25.6.0", "c8": "^11.0.0", - "eslint": "^10.2.0", + "eslint": "^10.2.1", "eslint-config-prettier": "^10.1.8", "eslint-plugin-import-x": "^4.16.2", "eslint-plugin-jsdoc": "^62.9.0", "eslint-plugin-prettier": "^5.5.5", "eslint-plugin-tsdoc": "^0.5.2", "glob": "13.0.6", - "prettier": "3.8.1", - "typescript": "6.0.2", - "typescript-eslint": "8.58.1", + "prettier": "3.8.3", + "typescript": "6.0.3", + "typescript-eslint": "8.59.0", "yaml": "2.8.3" } }, "ccip-api-ref": { "name": "@chainlink/ccip-api-ref", - "version": "1.4.2", + "version": "1.5.0", "dependencies": { "@chainlink/ccip-sdk": "*", "@chainlink/design-system": "^0.2.8", @@ -43,8 +43,8 @@ "@easyops-cn/docusaurus-search-local": "^0.55.1", "@mdx-js/react": "^3.1.1", "clsx": "^2.1.1", - "docusaurus-plugin-openapi-docs": "^5.0.0", - "docusaurus-theme-openapi-docs": "^5.0.0", + "docusaurus-plugin-openapi-docs": "^5.0.1", + "docusaurus-theme-openapi-docs": "^5.0.1", "focus-trap-react": "^12.0.0", "prism-react-renderer": "^2.4.1", "react": "^19.2.5", @@ -55,23 +55,44 @@ "@docusaurus/types": "^3.10.0", "@types/react-dom": "^19.2.3", "docusaurus-plugin-typedoc": "^1.4.2", - "typedoc": "^0.28.18", + "typedoc": "^0.28.19", "typedoc-plugin-markdown": "^4.11.0" }, "engines": { "node": ">=20.0.0" } }, + "ccip-api-ref/node_modules/react": { + "version": "19.2.5", + "resolved": "https://registry.npmjs.org/react/-/react-19.2.5.tgz", + "integrity": "sha512-llUJLzz1zTUBrskt2pwZgLq59AemifIftw4aB7JxOqf1HY2FDaGDxgwpAPVzHU1kdWabH7FauP4i1oEeer2WCA==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "ccip-api-ref/node_modules/react-dom": { + "version": "19.2.5", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.5.tgz", + "integrity": "sha512-J5bAZz+DXMMwW/wV3xzKke59Af6CHY7G4uYLN1OvBcKEsWOs4pQExj86BBKamxl/Ik5bx9whOrvBlSDfWzgSag==", + "license": "MIT", + "dependencies": { + "scheduler": "^0.27.0" + }, + "peerDependencies": { + "react": "^19.2.5" + } + }, "ccip-cli": { "name": "@chainlink/ccip-cli", - "version": "1.4.2", + "version": "1.5.0", "license": "MIT", "dependencies": { "@aptos-labs/ts-sdk": "^6.3.1", - "@chainlink/ccip-sdk": "^1.4.2", + "@chainlink/ccip-sdk": "^1.5.0", "@coral-xyz/anchor": "^0.29.0", "@ethers-ext/signer-ledger": "^6.0.0-beta.1", - "@inquirer/prompts": "8.4.1", + "@inquirer/prompts": "8.4.2", "@ledgerhq/hw-app-aptos": "6.37.0", "@ledgerhq/hw-app-solana": "7.9.0", "@ledgerhq/hw-transport-node-hid": "6.32.0", @@ -79,7 +100,7 @@ "@ton-community/ton-ledger": "^7.3.0", "bs58": "^6.0.0", "ethers": "6.16.0", - "type-fest": "^5.5.0", + "type-fest": "^5.6.0", "update-notifier": "^7.3.1", "yargs": "18.0.0" }, @@ -88,102 +109,25 @@ }, "devDependencies": { "@eslint/js": "^10.0.1", - "@types/node": "25.5.2", + "@types/node": "25.6.0", "@types/update-notifier": "^6.0.8", "@types/yargs": "17.0.35", - "eslint": "^10.2.0", + "eslint": "^10.2.1", "eslint-config-prettier": "10.1.8", "eslint-plugin-import-x": "^4.16.2", "eslint-plugin-jsdoc": "^62.9.0", "eslint-plugin-prettier": "^5.5.5", "eslint-plugin-tsdoc": "^0.5.2", - "prettier": "^3.8.1", + "prettier": "^3.8.3", "tsx": "4.21.0", - "typescript": "6.0.2", - "typescript-eslint": "8.58.1" - } - }, - "ccip-cli/node_modules/ansi-regex": { - "version": "6.2.2", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "ccip-cli/node_modules/ansi-styles": { - "version": "6.2.3", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "ccip-cli/node_modules/cliui": { - "version": "9.0.1", - "license": "ISC", - "dependencies": { - "string-width": "^7.2.0", - "strip-ansi": "^7.1.0", - "wrap-ansi": "^9.0.0" - }, - "engines": { - "node": ">=20" - } - }, - "ccip-cli/node_modules/emoji-regex": { - "version": "10.6.0", - "license": "MIT" - }, - "ccip-cli/node_modules/string-width": { - "version": "7.2.0", - "license": "MIT", - "dependencies": { - "emoji-regex": "^10.3.0", - "get-east-asian-width": "^1.0.0", - "strip-ansi": "^7.1.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "ccip-cli/node_modules/strip-ansi": { - "version": "7.2.0", - "license": "MIT", - "dependencies": { - "ansi-regex": "^6.2.2" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "ccip-cli/node_modules/wrap-ansi": { - "version": "9.0.2", - "license": "MIT", - "dependencies": { - "ansi-styles": "^6.2.1", - "string-width": "^7.0.0", - "strip-ansi": "^7.1.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + "typescript": "6.0.3", + "typescript-eslint": "8.59.0" } }, "ccip-cli/node_modules/yargs": { "version": "18.0.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-18.0.0.tgz", + "integrity": "sha512-4UEqdc2RYGHZc7Doyqkrqiln3p9X2DZVxaGbwhn2pi7MrRagKaOcIKe8L3OxYcbhXLgLFUS3zAYuQjKBQgmuNg==", "license": "MIT", "dependencies": { "cliui": "^9.0.1", @@ -199,6 +143,8 @@ }, "ccip-cli/node_modules/yargs-parser": { "version": "22.0.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-22.0.0.tgz", + "integrity": "sha512-rwu/ClNdSMpkSrUb+d6BRsSkLUq1fmfsY6TOpYzTwvwkg1/NRG85KBy3kq++A8LKQwX6lsu+aWad+2khvuXrqw==", "license": "ISC", "engines": { "node": "^20.19.0 || ^22.12.0 || >=23" @@ -206,48 +152,48 @@ }, "ccip-sdk": { "name": "@chainlink/ccip-sdk", - "version": "1.4.2", + "version": "1.5.0", "license": "MIT", "dependencies": { "@aptos-labs/ts-sdk": "^6.3.1", "@coral-xyz/anchor": "^0.29.0", "@mysten/bcs": "^2.0.3", - "@mysten/sui": "^2.15.0", + "@mysten/sui": "^2.16.0", "@solana/spl-token": "0.4.14", "@solana/web3.js": "^1.98.4", "@ton/core": "0.63.1", "@ton/crypto": "^3.3.0", - "@ton/ton": "^16.2.3", - "abitype": "1.2.3", - "axios": "1.15.0", + "@ton/ton": "^16.2.4", + "abitype": "1.2.4", + "axios": "1.15.2", "bn.js": "^5.2.3", "borsh": "^2.0.0", "bs58": "^6.0.0", "buffer": "^6.0.3", "ethers": "6.16.0", - "got": "^15.0.1", + "got": "^15.0.3", "micro-memoize": "^5.1.1", - "type-fest": "^5.5.0", + "type-fest": "^5.6.0", "yaml": "2.8.3" }, "devDependencies": { "@depay/web3-mock": "^15.3.0", "@eslint/js": "^10.0.1", "@types/bn.js": "^5.2.0", - "@types/node": "25.5.2", + "@types/node": "25.6.0", "@types/yargs": "17.0.35", - "eslint": "^10.2.0", + "eslint": "^10.2.1", "eslint-config-prettier": "10.1.8", "eslint-plugin-import-x": "^4.16.2", "eslint-plugin-jsdoc": "^62.9.0", "eslint-plugin-prettier": "^5.5.5", "eslint-plugin-tsdoc": "^0.5.2", "ethers-abitype": "1.0.3", - "prettier": "^3.8.1", + "prettier": "^3.8.3", "prool": "^0.2.4", - "typescript": "6.0.2", - "typescript-eslint": "8.58.1", - "viem": "^2.47.11" + "typescript": "6.0.3", + "typescript-eslint": "8.59.0", + "viem": "^2.48.4" }, "peerDependencies": { "viem": "^2.0.0" @@ -258,71 +204,13 @@ } } }, - "ccip-sdk/node_modules/@sindresorhus/is": { - "version": "7.2.0", - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sindresorhus/is?sponsor=1" - } - }, - "ccip-sdk/node_modules/cacheable-lookup": { - "version": "7.0.0", - "license": "MIT", - "engines": { - "node": ">=14.16" - } - }, - "ccip-sdk/node_modules/cacheable-request": { - "version": "13.0.18", - "license": "MIT", - "dependencies": { - "@types/http-cache-semantics": "^4.0.4", - "get-stream": "^9.0.1", - "http-cache-semantics": "^4.2.0", - "keyv": "^5.5.5", - "mimic-response": "^4.0.0", - "normalize-url": "^8.1.1", - "responselike": "^4.0.2" - }, - "engines": { - "node": ">=18" - } - }, - "ccip-sdk/node_modules/decompress-response": { - "version": "10.0.0", - "license": "MIT", - "dependencies": { - "mimic-response": "^4.0.0" - }, - "engines": { - "node": ">=20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "ccip-sdk/node_modules/get-stream": { - "version": "9.0.1", - "license": "MIT", - "dependencies": { - "@sec-ant/readable-stream": "^0.4.1", - "is-stream": "^4.0.1" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "ccip-sdk/node_modules/got": { - "version": "15.0.1", + "version": "15.0.3", + "resolved": "https://registry.npmjs.org/got/-/got-15.0.3.tgz", + "integrity": "sha512-630of5aMTYM6g6epok5nuqvctP8InJISvt39iNt7y0r27rcGCdiPv9Cc6EbwfnkyT1g/shBoVhvDjtXZUbn/Rw==", "license": "MIT", "dependencies": { - "@sindresorhus/is": "^7.2.0", + "@sindresorhus/is": "^8.0.0", "byte-counter": "^0.1.0", "cacheable-lookup": "^7.0.0", "cacheable-request": "^13.0.18", @@ -332,7 +220,7 @@ "keyv": "^5.6.0", "lowercase-keys": "^4.0.1", "responselike": "^4.0.2", - "type-fest": "^5.4.4", + "type-fest": "^5.6.0", "uint8array-extras": "^1.5.0" }, "engines": { @@ -342,87 +230,6 @@ "url": "https://github.com/sindresorhus/got?sponsor=1" } }, - "ccip-sdk/node_modules/http2-wrapper": { - "version": "2.2.1", - "license": "MIT", - "dependencies": { - "quick-lru": "^5.1.1", - "resolve-alpn": "^1.2.0" - }, - "engines": { - "node": ">=10.19.0" - } - }, - "ccip-sdk/node_modules/is-stream": { - "version": "4.0.1", - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "ccip-sdk/node_modules/keyv": { - "version": "5.6.0", - "license": "MIT", - "dependencies": { - "@keyv/serialize": "^1.1.1" - } - }, - "ccip-sdk/node_modules/lowercase-keys": { - "version": "4.0.1", - "license": "MIT", - "engines": { - "node": ">=20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "ccip-sdk/node_modules/mimic-response": { - "version": "4.0.0", - "license": "MIT", - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "ccip-sdk/node_modules/normalize-url": { - "version": "8.1.1", - "license": "MIT", - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "ccip-sdk/node_modules/responselike": { - "version": "4.0.2", - "license": "MIT", - "dependencies": { - "lowercase-keys": "^3.0.0" - }, - "engines": { - "node": ">=20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "ccip-sdk/node_modules/responselike/node_modules/lowercase-keys": { - "version": "3.0.0", - "license": "MIT", - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/@0no-co/graphql.web": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/@0no-co/graphql.web/-/graphql.web-1.2.0.tgz", @@ -438,9 +245,9 @@ } }, "node_modules/@0no-co/graphqlsp": { - "version": "1.15.3", - "resolved": "https://registry.npmjs.org/@0no-co/graphqlsp/-/graphqlsp-1.15.3.tgz", - "integrity": "sha512-rap58Wh1qbRnGpPGwB60P6rvKF6G+mgo1kPeDySWIAcqkGMjuyQdrZPcHS6w7mKOT8i/f1UQmjow6+7vfuEXKw==", + "version": "1.15.4", + "resolved": "https://registry.npmjs.org/@0no-co/graphqlsp/-/graphqlsp-1.15.4.tgz", + "integrity": "sha512-Nt1DVHcZ08lKRKwhiU0amXH77fSdrO6DzyjLE0DkCxfbM/N1SAs32d76y1xtCzM5H9eT0iDS7SdksgRXWJu05g==", "license": "MIT", "dependencies": { "@gql.tada/internal": "^1.0.0", @@ -458,15 +265,15 @@ "license": "MIT" }, "node_modules/@algolia/abtesting": { - "version": "1.16.2", - "resolved": "https://registry.npmjs.org/@algolia/abtesting/-/abtesting-1.16.2.tgz", - "integrity": "sha512-n9s6bEV6imdtIEd+BGP7WkA4pEZ5YTdgQ05JQhHwWawHg3hyjpNwC0TShGz6zWhv+jfLDGA/6FFNbySFS0P9cw==", + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/@algolia/abtesting/-/abtesting-1.17.0.tgz", + "integrity": "sha512-nuhHZdTiCtRzJEe9VSNzyqE9cOQMt01UWBzymFnjbgwrxxZpbGHQde6Oa/y9zyspTCjbUtb7Q5HQek1CLiLyeg==", "license": "MIT", "dependencies": { - "@algolia/client-common": "5.50.2", - "@algolia/requester-browser-xhr": "5.50.2", - "@algolia/requester-fetch": "5.50.2", - "@algolia/requester-node-http": "5.50.2" + "@algolia/client-common": "5.51.0", + "@algolia/requester-browser-xhr": "5.51.0", + "@algolia/requester-fetch": "5.51.0", + "@algolia/requester-node-http": "5.51.0" }, "engines": { "node": ">= 14.0.0" @@ -505,99 +312,99 @@ } }, "node_modules/@algolia/client-abtesting": { - "version": "5.50.2", - "resolved": "https://registry.npmjs.org/@algolia/client-abtesting/-/client-abtesting-5.50.2.tgz", - "integrity": "sha512-52iq0vHy1sphgnwoZyx5PmbEt8hsh+m7jD123LmBs6qy4GK7LbYZIeKd+nSnSipN2zvKRZ2zScS6h9PW3J7SXg==", + "version": "5.51.0", + "resolved": "https://registry.npmjs.org/@algolia/client-abtesting/-/client-abtesting-5.51.0.tgz", + "integrity": "sha512-PKrKlIla1U2J7mFcIQn6N3pWP4oySmkxShnbbDsj/H7818gKbET5KsUwsVoNjWIxHKTJMCTcQ7ekAJ8Ea23NMg==", "license": "MIT", "dependencies": { - "@algolia/client-common": "5.50.2", - "@algolia/requester-browser-xhr": "5.50.2", - "@algolia/requester-fetch": "5.50.2", - "@algolia/requester-node-http": "5.50.2" + "@algolia/client-common": "5.51.0", + "@algolia/requester-browser-xhr": "5.51.0", + "@algolia/requester-fetch": "5.51.0", + "@algolia/requester-node-http": "5.51.0" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/@algolia/client-analytics": { - "version": "5.50.2", - "resolved": "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-5.50.2.tgz", - "integrity": "sha512-WpPIUg+cSG2aPUG0gS8Ko9DwRgbRPUZxJkolhL2aCsmSlcEEZT65dILrfg5ovcxtx0Kvr+xtBVsTMtsQWRtPDQ==", + "version": "5.51.0", + "resolved": "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-5.51.0.tgz", + "integrity": "sha512-U+HCY1K16Km91pIRL1kN6bW6BbGFAF/WhkRSCx4wyl1aFpbrlhSFQs/dAwWbmyBiHWwVWhl7stWHQ1pum5EfMw==", "license": "MIT", "dependencies": { - "@algolia/client-common": "5.50.2", - "@algolia/requester-browser-xhr": "5.50.2", - "@algolia/requester-fetch": "5.50.2", - "@algolia/requester-node-http": "5.50.2" + "@algolia/client-common": "5.51.0", + "@algolia/requester-browser-xhr": "5.51.0", + "@algolia/requester-fetch": "5.51.0", + "@algolia/requester-node-http": "5.51.0" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/@algolia/client-common": { - "version": "5.50.2", - "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-5.50.2.tgz", - "integrity": "sha512-Gj2MgtArGcsr82kIqRlo6/dCAFjrs2gLByEqyRENuT7ugrSMFuqg1vDzeBjRL1t3EJEJCFtT0PLX3gB8A6Hq4Q==", + "version": "5.51.0", + "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-5.51.0.tgz", + "integrity": "sha512-YPJ3dEuZLCRp846Az94t6Z2gwSNRazP+SmBco7p6SCa4fYrtIE820PDXYZshbNrj2Z8Qfbmv7BQ1Lecl5L3G/w==", "license": "MIT", "engines": { "node": ">= 14.0.0" } }, "node_modules/@algolia/client-insights": { - "version": "5.50.2", - "resolved": "https://registry.npmjs.org/@algolia/client-insights/-/client-insights-5.50.2.tgz", - "integrity": "sha512-CUqoid5jDpmrc0oK3/xuZXFt6kwT0P9Lw7/nsM14YTr6puvmi+OUKmURpmebQF22S2vCG8L1DAoXXujxQUi/ug==", + "version": "5.51.0", + "resolved": "https://registry.npmjs.org/@algolia/client-insights/-/client-insights-5.51.0.tgz", + "integrity": "sha512-/gEwLlR7fQ7YjOW+ADRZ0NxLDtpTC61FSzlZ01Gdl1kTJfU0Rq3Y/TYqwxGxlQGcUiXtGzrpjxXWh3Y0TZD6NA==", "license": "MIT", "dependencies": { - "@algolia/client-common": "5.50.2", - "@algolia/requester-browser-xhr": "5.50.2", - "@algolia/requester-fetch": "5.50.2", - "@algolia/requester-node-http": "5.50.2" + "@algolia/client-common": "5.51.0", + "@algolia/requester-browser-xhr": "5.51.0", + "@algolia/requester-fetch": "5.51.0", + "@algolia/requester-node-http": "5.51.0" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/@algolia/client-personalization": { - "version": "5.50.2", - "resolved": "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-5.50.2.tgz", - "integrity": "sha512-AndZWFoc0gbP5901OeQJ73BazgGgSGiBEba4ohdoJuZwHTO2Gio8Q4L1VLmytMBYcviVigB0iICToMvEJxI4ug==", + "version": "5.51.0", + "resolved": "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-5.51.0.tgz", + "integrity": "sha512-nRwUN1Y2cKyOAFZyIBagkEfZSIhP05nWhT4Rjwl84lcjECssYggftrAODrZ4leakXxSGjhxs/AdaAFEIBqwVFA==", "license": "MIT", "dependencies": { - "@algolia/client-common": "5.50.2", - "@algolia/requester-browser-xhr": "5.50.2", - "@algolia/requester-fetch": "5.50.2", - "@algolia/requester-node-http": "5.50.2" + "@algolia/client-common": "5.51.0", + "@algolia/requester-browser-xhr": "5.51.0", + "@algolia/requester-fetch": "5.51.0", + "@algolia/requester-node-http": "5.51.0" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/@algolia/client-query-suggestions": { - "version": "5.50.2", - "resolved": "https://registry.npmjs.org/@algolia/client-query-suggestions/-/client-query-suggestions-5.50.2.tgz", - "integrity": "sha512-NWoL+psEkz5dIzweaByVXuEB45wS8/rk0E0AhMMnaVJdVs7TcACPH2/OURm+N0xRDITkTHqCna823rd6Uqntdg==", + "version": "5.51.0", + "resolved": "https://registry.npmjs.org/@algolia/client-query-suggestions/-/client-query-suggestions-5.51.0.tgz", + "integrity": "sha512-pybzYCG7VoQKppo+z5iZOKpW8XqtFxhsAIRgEaNboCnfypKukiBHJAwB+pmr7vMZXBsOHwklGYWwCG82e8qshA==", "license": "MIT", "dependencies": { - "@algolia/client-common": "5.50.2", - "@algolia/requester-browser-xhr": "5.50.2", - "@algolia/requester-fetch": "5.50.2", - "@algolia/requester-node-http": "5.50.2" + "@algolia/client-common": "5.51.0", + "@algolia/requester-browser-xhr": "5.51.0", + "@algolia/requester-fetch": "5.51.0", + "@algolia/requester-node-http": "5.51.0" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/@algolia/client-search": { - "version": "5.50.2", - "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-5.50.2.tgz", - "integrity": "sha512-ypSboUJ3XJoQz5DeDo82hCnrRuwq3q9ZdFhVKAik9TnZh1DvLqoQsrbBjXg7C7zQOtV/Qbge/HmyoV6V5L7MhQ==", + "version": "5.51.0", + "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-5.51.0.tgz", + "integrity": "sha512-DWVIlj6RqcvdhwP0gBU9OpOQPnHdcAk9jlT+z8rsNb2+liWv4eUlfQZ7saGBraFsnygEHD3PtdppIHvqwBAb5w==", "license": "MIT", "dependencies": { - "@algolia/client-common": "5.50.2", - "@algolia/requester-browser-xhr": "5.50.2", - "@algolia/requester-fetch": "5.50.2", - "@algolia/requester-node-http": "5.50.2" + "@algolia/client-common": "5.51.0", + "@algolia/requester-browser-xhr": "5.51.0", + "@algolia/requester-fetch": "5.51.0", + "@algolia/requester-node-http": "5.51.0" }, "engines": { "node": ">= 14.0.0" @@ -610,81 +417,81 @@ "license": "MIT" }, "node_modules/@algolia/ingestion": { - "version": "1.50.2", - "resolved": "https://registry.npmjs.org/@algolia/ingestion/-/ingestion-1.50.2.tgz", - "integrity": "sha512-VlR2FRXLw2bCB94SQo6zxg/Qi+547aOji6Pb+dKE7h1DMCCY317St+OpjpmgzE+bT2O9ALIc0V4nVIBOd7Gy+Q==", + "version": "1.51.0", + "resolved": "https://registry.npmjs.org/@algolia/ingestion/-/ingestion-1.51.0.tgz", + "integrity": "sha512-bA25s12iUDJi/X8M7tWlPRT8GeOhls/yDbdoUqinz27lNqsOlcM1UrAxIKdIZ6lm3sXit+ewPIz1pS2x6rXu8g==", "license": "MIT", "dependencies": { - "@algolia/client-common": "5.50.2", - "@algolia/requester-browser-xhr": "5.50.2", - "@algolia/requester-fetch": "5.50.2", - "@algolia/requester-node-http": "5.50.2" + "@algolia/client-common": "5.51.0", + "@algolia/requester-browser-xhr": "5.51.0", + "@algolia/requester-fetch": "5.51.0", + "@algolia/requester-node-http": "5.51.0" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/@algolia/monitoring": { - "version": "1.50.2", - "resolved": "https://registry.npmjs.org/@algolia/monitoring/-/monitoring-1.50.2.tgz", - "integrity": "sha512-Cmvfp2+qopzQt8OilU97rhLhosq7ZrB6uieok3EwFUqG/aalPg6DgfCmu0yJMrYe+KMC1qRVt1MTRAUwLknUMQ==", + "version": "1.51.0", + "resolved": "https://registry.npmjs.org/@algolia/monitoring/-/monitoring-1.51.0.tgz", + "integrity": "sha512-zj+RcE5e0NE0/ew6oEOTgOplPHry+w2oi7h0Y87lhdq4E0d7xLS31KVB8kKfCGkrG7AYtZvrcyvLOKS5d0no4Q==", "license": "MIT", "dependencies": { - "@algolia/client-common": "5.50.2", - "@algolia/requester-browser-xhr": "5.50.2", - "@algolia/requester-fetch": "5.50.2", - "@algolia/requester-node-http": "5.50.2" + "@algolia/client-common": "5.51.0", + "@algolia/requester-browser-xhr": "5.51.0", + "@algolia/requester-fetch": "5.51.0", + "@algolia/requester-node-http": "5.51.0" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/@algolia/recommend": { - "version": "5.50.2", - "resolved": "https://registry.npmjs.org/@algolia/recommend/-/recommend-5.50.2.tgz", - "integrity": "sha512-jrkuyKoOM7dFWQ/6Y4hQAse2SC3L/RldG6GnPjMvAj65h+7Ubb51S0pKk4ofSStF0xm4LCNe0C4T6XX4nOFDiQ==", + "version": "5.51.0", + "resolved": "https://registry.npmjs.org/@algolia/recommend/-/recommend-5.51.0.tgz", + "integrity": "sha512-/HDgccfye1Rq3bPxaSCsvSEBHzSMmtpM9ZRGRtAuC62Cv+ql/76IWnxjGTDXtqIJ+/j7ZlFYAzq9fkp95wF2SQ==", "license": "MIT", "dependencies": { - "@algolia/client-common": "5.50.2", - "@algolia/requester-browser-xhr": "5.50.2", - "@algolia/requester-fetch": "5.50.2", - "@algolia/requester-node-http": "5.50.2" + "@algolia/client-common": "5.51.0", + "@algolia/requester-browser-xhr": "5.51.0", + "@algolia/requester-fetch": "5.51.0", + "@algolia/requester-node-http": "5.51.0" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/@algolia/requester-browser-xhr": { - "version": "5.50.2", - "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-5.50.2.tgz", - "integrity": "sha512-4107YLJqCudPiBUlwnk6oTSUVwU7ab+qL1SfQGEDYI8DZH5gsf1ekPt9JykXRKYXf2IfouFL5GiCY/PHTFIjYw==", + "version": "5.51.0", + "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-5.51.0.tgz", + "integrity": "sha512-nJdW+WBwGlXWMJbxxB7/AJPvNq0lLJSudXmIQCJbmH8jsOXQhRpAtoCD4ceLyJKv3ze9JbQu4Gqu5JDLckuFcw==", "license": "MIT", "dependencies": { - "@algolia/client-common": "5.50.2" + "@algolia/client-common": "5.51.0" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/@algolia/requester-fetch": { - "version": "5.50.2", - "resolved": "https://registry.npmjs.org/@algolia/requester-fetch/-/requester-fetch-5.50.2.tgz", - "integrity": "sha512-vOrd3MQpLgmf6wXAueTuZ/cA0W4uRwIHHaxNy3h+a6YcNn6bCV/gFdZuv3F13v593zRU2k5R75NmvRWLenvMrw==", + "version": "5.51.0", + "resolved": "https://registry.npmjs.org/@algolia/requester-fetch/-/requester-fetch-5.51.0.tgz", + "integrity": "sha512-bsBgRI/1h1mjS3eCyfGau78yGZVmiDLmT1aU6dMnk75/T0SgKqnSKNpQ53xKoDYVChGDcNnpHXWpoUSo8MH1+w==", "license": "MIT", "dependencies": { - "@algolia/client-common": "5.50.2" + "@algolia/client-common": "5.51.0" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/@algolia/requester-node-http": { - "version": "5.50.2", - "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-5.50.2.tgz", - "integrity": "sha512-Mu9BFtgzGqDUy5Bcs2nMyoILIFSN13GKQaklKAFIsd0K3/9CpNyfeBc+/+Qs6mFZLlxG9qzullO7h+bjcTBuGQ==", + "version": "5.51.0", + "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-5.51.0.tgz", + "integrity": "sha512-zPrIDVPpmKWgrjmWOqpqrhqAhNjvVkjoj+mqw2NBPxEOuKNzP0H+Qz5NJLLTOepBVj1UFedFaF3AUgxLsB9ukQ==", "license": "MIT", "dependencies": { - "@algolia/client-common": "5.50.2" + "@algolia/client-common": "5.51.0" }, "engines": { "node": ">= 14.0.0" @@ -881,15 +688,6 @@ "node": ">=6.9.0" } }, - "node_modules/@babel/helper-compilation-targets/node_modules/lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "license": "ISC", - "dependencies": { - "yallist": "^3.0.2" - } - }, "node_modules/@babel/helper-compilation-targets/node_modules/semver": { "version": "6.3.1", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", @@ -899,12 +697,6 @@ "semver": "bin/semver.js" } }, - "node_modules/@babel/helper-compilation-targets/node_modules/yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "license": "ISC" - }, "node_modules/@babel/helper-create-class-features-plugin": { "version": "7.28.6", "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.28.6.tgz", @@ -4346,43 +4138,10 @@ "node": ">=14.16" } }, - "node_modules/@docusaurus/core/node_modules/ansi-regex": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", - "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/@docusaurus/core/node_modules/ansi-styles": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", - "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/@docusaurus/core/node_modules/cacheable-lookup": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-7.0.0.tgz", - "integrity": "sha512-+qJyx4xiKra8mZrcwhjMRMUhD5NR1R8esPkzIYxX96JiecFoxAXFuz/GpR3+ev4PE1WamHip78wV0vcmPQtp8w==", - "license": "MIT", - "engines": { - "node": ">=14.16" - } - }, - "node_modules/@docusaurus/core/node_modules/cacheable-request": { - "version": "10.2.14", - "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-10.2.14.tgz", - "integrity": "sha512-zkDT5WAF4hSSoUgyfg5tFIxz8XQK+25W/TLVojJTMKBaxevLBBtLxgqguAuVQB8PVW79FVjHcU+GJ9tVbDZ9mQ==", + "node_modules/@docusaurus/core/node_modules/cacheable-request": { + "version": "10.2.14", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-10.2.14.tgz", + "integrity": "sha512-zkDT5WAF4hSSoUgyfg5tFIxz8XQK+25W/TLVojJTMKBaxevLBBtLxgqguAuVQB8PVW79FVjHcU+GJ9tVbDZ9mQ==", "license": "MIT", "dependencies": { "@types/http-cache-semantics": "^4.0.2", @@ -4437,6 +4196,33 @@ "url": "https://github.com/yeoman/configstore?sponsor=1" } }, + "node_modules/@docusaurus/core/node_modules/decompress-response": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", + "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", + "license": "MIT", + "dependencies": { + "mimic-response": "^3.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@docusaurus/core/node_modules/decompress-response/node_modules/mimic-response": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", + "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/@docusaurus/core/node_modules/dot-prop": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-6.0.1.tgz", @@ -4458,6 +4244,18 @@ "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", "license": "MIT" }, + "node_modules/@docusaurus/core/node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/@docusaurus/core/node_modules/got": { "version": "12.6.1", "resolved": "https://registry.npmjs.org/got/-/got-12.6.1.tgz", @@ -4483,19 +4281,6 @@ "url": "https://github.com/sindresorhus/got?sponsor=1" } }, - "node_modules/@docusaurus/core/node_modules/http2-wrapper": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-2.2.1.tgz", - "integrity": "sha512-V5nVw1PAOgfI3Lmeaj2Exmeg7fenjhRUgz1lPSezy1CuhPYbgQtbQj4jZfEAEMlaL+vupsvhjqCyjzob0yxsmQ==", - "license": "MIT", - "dependencies": { - "quick-lru": "^5.1.1", - "resolve-alpn": "^1.2.0" - }, - "engines": { - "node": ">=10.19.0" - } - }, "node_modules/@docusaurus/core/node_modules/is-installed-globally": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.4.0.tgz", @@ -4530,6 +4315,15 @@ "node": ">=8" } }, + "node_modules/@docusaurus/core/node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "license": "MIT", + "dependencies": { + "json-buffer": "3.0.1" + } + }, "node_modules/@docusaurus/core/node_modules/latest-version": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-7.0.0.tgz", @@ -4557,30 +4351,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@docusaurus/core/node_modules/mimic-response": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-4.0.0.tgz", - "integrity": "sha512-e5ISH9xMYU0DzrT+jl8q2ze9D6eWBto+I8CNpe+VI+K2J/F/k3PdkdTdz4wvGVH4NTpo+NRYTVIuMQEMMcsLqg==", - "license": "MIT", - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@docusaurus/core/node_modules/normalize-url": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-8.1.1.tgz", - "integrity": "sha512-JYc0DPlpGWB40kH5g07gGTrYuMqV653k3uBKY6uITPWds3M0ov3GaWGp9lbE3Bzngx8+XkfzgvASb9vk9JDFXQ==", - "license": "MIT", - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/@docusaurus/core/node_modules/p-cancelable": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-3.0.0.tgz", @@ -4640,21 +4410,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@docusaurus/core/node_modules/strip-ansi": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", - "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", - "license": "MIT", - "dependencies": { - "ansi-regex": "^6.2.2" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, "node_modules/@docusaurus/core/node_modules/type-fest": { "version": "2.19.0", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", @@ -4729,23 +4484,6 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/@docusaurus/core/node_modules/wrap-ansi": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", - "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", - "license": "MIT", - "dependencies": { - "ansi-styles": "^6.1.0", - "string-width": "^5.0.1", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, "node_modules/@docusaurus/cssnano-preset": { "version": "3.10.0", "resolved": "https://registry.npmjs.org/@docusaurus/cssnano-preset/-/cssnano-preset-3.10.0.tgz", @@ -5522,9 +5260,9 @@ } }, "node_modules/@emnapi/core": { - "version": "1.9.2", - "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.9.2.tgz", - "integrity": "sha512-UC+ZhH3XtczQYfOlu3lNEkdW/p4dsJ1r/bP7H8+rhao3TTTMO1ATq/4DdIi23XuGoFY+Cz0JmCbdVl0hz9jZcA==", + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.10.0.tgz", + "integrity": "sha512-yq6OkJ4p82CAfPl0u9mQebQHKPJkY7WrIuk205cTYnYe+k2Z8YBh11FrbRG/H6ihirqcacOgl2BIO8oyMQLeXw==", "license": "MIT", "optional": true, "dependencies": { @@ -5533,9 +5271,9 @@ } }, "node_modules/@emnapi/runtime": { - "version": "1.9.2", - "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.9.2.tgz", - "integrity": "sha512-3U4+MIWHImeyu1wnmVygh5WlgfYDtyf0k8AbLhMFxOipihf6nrWC4syIm/SwEeec0mNSafiiNnMJwbza/Is6Lw==", + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.10.0.tgz", + "integrity": "sha512-ewvYlk86xUoGI0zQRNq/mC+16R1QeDlKQy21Ki3oSYXNgLb45GV1P6A0M+/s6nyCuNDqe5VpaY84BzXGwVbwFA==", "license": "MIT", "optional": true, "dependencies": { @@ -7012,29 +6750,43 @@ } }, "node_modules/@humanfs/core": { - "version": "0.19.1", - "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", - "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==", + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.2.tgz", + "integrity": "sha512-UhXNm+CFMWcbChXywFwkmhqjs3PRCmcSa/hfBgLIb7oQ5HNb1wS0icWsGtSAUNgefHeI+eBrA8I1fxmbHsGdvA==", "dev": true, "license": "Apache-2.0", + "dependencies": { + "@humanfs/types": "^0.15.0" + }, "engines": { "node": ">=18.18.0" } }, "node_modules/@humanfs/node": { - "version": "0.16.7", - "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.7.tgz", - "integrity": "sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==", + "version": "0.16.8", + "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.8.tgz", + "integrity": "sha512-gE1eQNZ3R++kTzFUpdGlpmy8kDZD/MLyHqDwqjkVQI0JMdI1D51sy1H958PNXYkM2rAac7e5/CnIKZrHtPh3BQ==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@humanfs/core": "^0.19.1", + "@humanfs/core": "^0.19.2", + "@humanfs/types": "^0.15.0", "@humanwhocodes/retry": "^0.4.0" }, "engines": { "node": ">=18.18.0" } }, + "node_modules/@humanfs/types": { + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/@humanfs/types/-/types-0.15.0.tgz", + "integrity": "sha512-ZZ1w0aoQkwuUuC7Yf+7sdeaNfqQiiLcSRbfI08oAxqLtpXQr9AIVX7Ay7HLDuiLYAaFPu8oBYNq/QIi9URHJ3Q==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18.0" + } + }, "node_modules/@humanwhocodes/module-importer": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", @@ -7090,13 +6842,13 @@ } }, "node_modules/@inquirer/checkbox": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/@inquirer/checkbox/-/checkbox-5.1.3.tgz", - "integrity": "sha512-+G7I8CT+EHv/hasNfUl3P37DVoMoZfpA+2FXmM54dA8MxYle1YqucxbacxHalw1iAFSdKNEDTGNV7F+j1Ldqcg==", + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/@inquirer/checkbox/-/checkbox-5.1.4.tgz", + "integrity": "sha512-w6KF8ZYRvqHhROkOTHXYC3qIV/KYEu5o12oLqQySvch61vrYtRxNSHTONSdJqWiFJPlCUQAHT5OgOIyuTr+MHQ==", "license": "MIT", "dependencies": { "@inquirer/ansi": "^2.0.5", - "@inquirer/core": "^11.1.8", + "@inquirer/core": "^11.1.9", "@inquirer/figures": "^2.0.5", "@inquirer/type": "^4.0.5" }, @@ -7113,12 +6865,12 @@ } }, "node_modules/@inquirer/confirm": { - "version": "6.0.11", - "resolved": "https://registry.npmjs.org/@inquirer/confirm/-/confirm-6.0.11.tgz", - "integrity": "sha512-pTpHjg0iEIRMYV/7oCZUMf27/383E6Wyhfc/MY+AVQGEoUobffIYWOK9YLP2XFRGz/9i6WlTQh1CkFVIo2Y7XA==", + "version": "6.0.12", + "resolved": "https://registry.npmjs.org/@inquirer/confirm/-/confirm-6.0.12.tgz", + "integrity": "sha512-h9FgGun3QwVYNj5TWIZZ+slii73bMoBFjPfVIGtnFuL4t8gBiNDV9PcSfIzkuxvgquJKt9nr1QzszpBzTbH8Og==", "license": "MIT", "dependencies": { - "@inquirer/core": "^11.1.8", + "@inquirer/core": "^11.1.9", "@inquirer/type": "^4.0.5" }, "engines": { @@ -7134,9 +6886,9 @@ } }, "node_modules/@inquirer/core": { - "version": "11.1.8", - "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-11.1.8.tgz", - "integrity": "sha512-/u+yJk2pOKNDOh1ZgdUH2RQaRx6OOH4I0uwL95qPvTFTIL38YBsuSC4r1yXBB3Q6JvNqFFc202gk0Ew79rrcjA==", + "version": "11.1.9", + "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-11.1.9.tgz", + "integrity": "sha512-BDE4fG22uYh1bGSifcj7JSx119TVYNViMhMu85usp4Fswrzh6M0DV3yld64jA98uOAa2GSQ4Bg4bZRm2d2cwSg==", "license": "MIT", "dependencies": { "@inquirer/ansi": "^2.0.5", @@ -7160,12 +6912,12 @@ } }, "node_modules/@inquirer/editor": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@inquirer/editor/-/editor-5.1.0.tgz", - "integrity": "sha512-6wlkYl65Qfayy48gPCfU4D7li6KCAGN79mLXa/tYHZH99OfZ820yY+HA+DgE88r8YwwgeuY6PQgNqMeK6LuMmw==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@inquirer/editor/-/editor-5.1.1.tgz", + "integrity": "sha512-6y11LgmNpmn5D2aB5FgnCfBUBK8ZstwLCalyJmORcJZ/WrhOjm16mu6eSqIx8DnErxDqSLr+Jkp+GP8/Nwd5tA==", "license": "MIT", "dependencies": { - "@inquirer/core": "^11.1.8", + "@inquirer/core": "^11.1.9", "@inquirer/external-editor": "^3.0.0", "@inquirer/type": "^4.0.5" }, @@ -7182,12 +6934,12 @@ } }, "node_modules/@inquirer/expand": { - "version": "5.0.12", - "resolved": "https://registry.npmjs.org/@inquirer/expand/-/expand-5.0.12.tgz", - "integrity": "sha512-vOfrB33b7YIZfDauXS8vNNz2Z86FozTZLIt7e+7/dCaPJ1RXZsHCuI9TlcERzEUq57vkM+UdnBgxP0rFd23JYQ==", + "version": "5.0.13", + "resolved": "https://registry.npmjs.org/@inquirer/expand/-/expand-5.0.13.tgz", + "integrity": "sha512-dF2zvrFo9LshkcB23/O1il13kBkBltWIXzut1evfbuBLXMiGIuC45c+ZQ0uukjCDsvI8OWqun4FRYMnzFCQa3g==", "license": "MIT", "dependencies": { - "@inquirer/core": "^11.1.8", + "@inquirer/core": "^11.1.9", "@inquirer/type": "^4.0.5" }, "engines": { @@ -7233,12 +6985,12 @@ } }, "node_modules/@inquirer/input": { - "version": "5.0.11", - "resolved": "https://registry.npmjs.org/@inquirer/input/-/input-5.0.11.tgz", - "integrity": "sha512-twUWidn4ocPO8qi6fRM7tNWt7W1FOnOZqQ+/+PsfLUacMR5rFLDPK9ql0nBPwxi0oELbo8T5NhRs8B2+qQEqFQ==", + "version": "5.0.12", + "resolved": "https://registry.npmjs.org/@inquirer/input/-/input-5.0.12.tgz", + "integrity": "sha512-uiMFBl4LqFzJClh80Q3f9hbOFJ6kgkDWI4LjAeBuyO6EanVVMF69AgOvpi1qdqjDSjDN6578B6nky9ceEpI+1Q==", "license": "MIT", "dependencies": { - "@inquirer/core": "^11.1.8", + "@inquirer/core": "^11.1.9", "@inquirer/type": "^4.0.5" }, "engines": { @@ -7254,12 +7006,12 @@ } }, "node_modules/@inquirer/number": { - "version": "4.0.11", - "resolved": "https://registry.npmjs.org/@inquirer/number/-/number-4.0.11.tgz", - "integrity": "sha512-Vscmim9TCksQsfjPtka/JwPUcbLhqWYrgfPf1cHrCm24X/F2joFwnageD50yMKsaX14oNGOyKf/RNXAFkNjWpA==", + "version": "4.0.12", + "resolved": "https://registry.npmjs.org/@inquirer/number/-/number-4.0.12.tgz", + "integrity": "sha512-/vrwhEf7Xsuh+YlHF4IjSy3g1cyrQuPaSiHIxCEbLu8qnfvrcvJyCkoktOOF+xV9gSb77/G0n3h04RbMDW2sIg==", "license": "MIT", "dependencies": { - "@inquirer/core": "^11.1.8", + "@inquirer/core": "^11.1.9", "@inquirer/type": "^4.0.5" }, "engines": { @@ -7275,13 +7027,13 @@ } }, "node_modules/@inquirer/password": { - "version": "5.0.11", - "resolved": "https://registry.npmjs.org/@inquirer/password/-/password-5.0.11.tgz", - "integrity": "sha512-9KZFeRaNHIcejtPb0wN4ddFc7EvobVoAFa049eS3LrDZFxI8O7xUXiITEOinBzkZFAIwY5V4yzQae/QfO9cbbg==", + "version": "5.0.12", + "resolved": "https://registry.npmjs.org/@inquirer/password/-/password-5.0.12.tgz", + "integrity": "sha512-CBh7YHju623lxJRcAOo498ZUwIuMy63bqW/vVq0tQAZVv+lkWlHkP9ealYE1utWSisEShY5VMdzIXRmyEODzcQ==", "license": "MIT", "dependencies": { "@inquirer/ansi": "^2.0.5", - "@inquirer/core": "^11.1.8", + "@inquirer/core": "^11.1.9", "@inquirer/type": "^4.0.5" }, "engines": { @@ -7297,21 +7049,21 @@ } }, "node_modules/@inquirer/prompts": { - "version": "8.4.1", - "resolved": "https://registry.npmjs.org/@inquirer/prompts/-/prompts-8.4.1.tgz", - "integrity": "sha512-AH5xPQ997K7e0F0vulPlteIHke2awMkFi8F0dBemrDfmvtPmHJo82mdHbONC4F/t8d1NHwrbI5cGVI+RbLWdoQ==", + "version": "8.4.2", + "resolved": "https://registry.npmjs.org/@inquirer/prompts/-/prompts-8.4.2.tgz", + "integrity": "sha512-XJmn/wY4AX56l1BRU+ZjDrFtg9+2uBEi4JvJQj82kwJDQKiPgSn4CEsbfGGygS4Gw6rkL4W18oATjfVfaqub2Q==", "license": "MIT", "dependencies": { - "@inquirer/checkbox": "^5.1.3", - "@inquirer/confirm": "^6.0.11", - "@inquirer/editor": "^5.1.0", - "@inquirer/expand": "^5.0.12", - "@inquirer/input": "^5.0.11", - "@inquirer/number": "^4.0.11", - "@inquirer/password": "^5.0.11", - "@inquirer/rawlist": "^5.2.7", - "@inquirer/search": "^4.1.7", - "@inquirer/select": "^5.1.3" + "@inquirer/checkbox": "^5.1.4", + "@inquirer/confirm": "^6.0.12", + "@inquirer/editor": "^5.1.1", + "@inquirer/expand": "^5.0.13", + "@inquirer/input": "^5.0.12", + "@inquirer/number": "^4.0.12", + "@inquirer/password": "^5.0.12", + "@inquirer/rawlist": "^5.2.8", + "@inquirer/search": "^4.1.8", + "@inquirer/select": "^5.1.4" }, "engines": { "node": ">=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0" @@ -7326,12 +7078,12 @@ } }, "node_modules/@inquirer/rawlist": { - "version": "5.2.7", - "resolved": "https://registry.npmjs.org/@inquirer/rawlist/-/rawlist-5.2.7.tgz", - "integrity": "sha512-AqRMiD9+uE1lskDPrdqHwrV/EUmxKEBLX44SR7uxK3vD2413AmVfE5EQaPeNzYf5Pq5SitHJDYUFVF0poIr09w==", + "version": "5.2.8", + "resolved": "https://registry.npmjs.org/@inquirer/rawlist/-/rawlist-5.2.8.tgz", + "integrity": "sha512-Su7FQvp5buZmCymN3PPoYv31ZQQX4ve2j02k7piGgKAWgE+AQRB5YoYVveGXcl3TZ9ldgRMSxj56YfDFmmaqLg==", "license": "MIT", "dependencies": { - "@inquirer/core": "^11.1.8", + "@inquirer/core": "^11.1.9", "@inquirer/type": "^4.0.5" }, "engines": { @@ -7347,12 +7099,12 @@ } }, "node_modules/@inquirer/search": { - "version": "4.1.7", - "resolved": "https://registry.npmjs.org/@inquirer/search/-/search-4.1.7.tgz", - "integrity": "sha512-1y7+0N65AWk5RdlXH/Kn13txf3IjIQ7OEfhCEkDTU+h5wKMLq8DUF3P6z+/kLSxDGDtQT1dRBWEUC3o/VvImsQ==", + "version": "4.1.8", + "resolved": "https://registry.npmjs.org/@inquirer/search/-/search-4.1.8.tgz", + "integrity": "sha512-fGiHKGD6DyPIYUWxoXnQTeXeyYqSOUrasDMABBmMHUalH/LxkuzY0xVRtimXAt1sUeeyYkVuKQx1bebMuN11Kw==", "license": "MIT", "dependencies": { - "@inquirer/core": "^11.1.8", + "@inquirer/core": "^11.1.9", "@inquirer/figures": "^2.0.5", "@inquirer/type": "^4.0.5" }, @@ -7369,13 +7121,13 @@ } }, "node_modules/@inquirer/select": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/@inquirer/select/-/select-5.1.3.tgz", - "integrity": "sha512-zYyqWgGQi3NhBcNq4Isc5rB3oEdQEh1Q/EcAnOW0FK4MpnXWkvSBYgA4cYrTM4A9UB573omouZbnL9JJ74Mq3A==", + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/@inquirer/select/-/select-5.1.4.tgz", + "integrity": "sha512-2kWcGKPMLAXAWRp1AH1SLsQmX+j0QjeljyXMUji9WMZC8nRDO0b7qquIGr6143E7KMLt3VAIGNXzwa/6PXQs4Q==", "license": "MIT", "dependencies": { "@inquirer/ansi": "^2.0.5", - "@inquirer/core": "^11.1.8", + "@inquirer/core": "^11.1.9", "@inquirer/figures": "^2.0.5", "@inquirer/type": "^4.0.5" }, @@ -7564,13 +7316,13 @@ } }, "node_modules/@jsonjoy.com/fs-core": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-core/-/fs-core-4.57.1.tgz", - "integrity": "sha512-YrEi/ZPmgc+GfdO0esBF04qv8boK9Dg9WpRQw/+vM8Qt3nnVIJWIa8HwZ/LXVZ0DB11XUROM8El/7yYTJX+WtA==", + "version": "4.57.2", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-core/-/fs-core-4.57.2.tgz", + "integrity": "sha512-SVjwklkpIV5wrynpYtuYnfYH1QF4/nDuLBX7VXdb+3miglcAgBVZb/5y0cOsehRV/9Vb+3UqhkMq3/NR3ztdkQ==", "license": "Apache-2.0", "dependencies": { - "@jsonjoy.com/fs-node-builtins": "4.57.1", - "@jsonjoy.com/fs-node-utils": "4.57.1", + "@jsonjoy.com/fs-node-builtins": "4.57.2", + "@jsonjoy.com/fs-node-utils": "4.57.2", "thingies": "^2.5.0" }, "engines": { @@ -7585,14 +7337,14 @@ } }, "node_modules/@jsonjoy.com/fs-fsa": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-fsa/-/fs-fsa-4.57.1.tgz", - "integrity": "sha512-ooEPvSW/HQDivPDPZMibHGKZf/QS4WRir1czGZmXmp3MsQqLECZEpN0JobrD8iV9BzsuwdIv+PxtWX9WpPLsIA==", + "version": "4.57.2", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-fsa/-/fs-fsa-4.57.2.tgz", + "integrity": "sha512-fhO8+iR2I+OCw668ISDJdn1aArc9zx033sWejIyzQ8RBeXa9bDSaUeA3ix0poYOfrj1KdOzytmYNv2/uLDfV6g==", "license": "Apache-2.0", "dependencies": { - "@jsonjoy.com/fs-core": "4.57.1", - "@jsonjoy.com/fs-node-builtins": "4.57.1", - "@jsonjoy.com/fs-node-utils": "4.57.1", + "@jsonjoy.com/fs-core": "4.57.2", + "@jsonjoy.com/fs-node-builtins": "4.57.2", + "@jsonjoy.com/fs-node-utils": "4.57.2", "thingies": "^2.5.0" }, "engines": { @@ -7607,16 +7359,16 @@ } }, "node_modules/@jsonjoy.com/fs-node": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-node/-/fs-node-4.57.1.tgz", - "integrity": "sha512-3YaKhP8gXEKN+2O49GLNfNb5l2gbnCFHyAaybbA2JkkbQP3dpdef7WcUaHAulg/c5Dg4VncHsA3NWAUSZMR5KQ==", + "version": "4.57.2", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-node/-/fs-node-4.57.2.tgz", + "integrity": "sha512-nX2AdL6cOFwLdju9G4/nbRnYevmCJbh7N7hvR3gGm97Cs60uEjyd0rpR+YBS7cTg175zzl22pGKXR5USaQMvKg==", "license": "Apache-2.0", "dependencies": { - "@jsonjoy.com/fs-core": "4.57.1", - "@jsonjoy.com/fs-node-builtins": "4.57.1", - "@jsonjoy.com/fs-node-utils": "4.57.1", - "@jsonjoy.com/fs-print": "4.57.1", - "@jsonjoy.com/fs-snapshot": "4.57.1", + "@jsonjoy.com/fs-core": "4.57.2", + "@jsonjoy.com/fs-node-builtins": "4.57.2", + "@jsonjoy.com/fs-node-utils": "4.57.2", + "@jsonjoy.com/fs-print": "4.57.2", + "@jsonjoy.com/fs-snapshot": "4.57.2", "glob-to-regex.js": "^1.0.0", "thingies": "^2.5.0" }, @@ -7632,9 +7384,9 @@ } }, "node_modules/@jsonjoy.com/fs-node-builtins": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-node-builtins/-/fs-node-builtins-4.57.1.tgz", - "integrity": "sha512-XHkFKQ5GSH3uxm8c3ZYXVrexGdscpWKIcMWKFQpMpMJc8gA3AwOMBJXJlgpdJqmrhPyQXxaY9nbkNeYpacC0Og==", + "version": "4.57.2", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-node-builtins/-/fs-node-builtins-4.57.2.tgz", + "integrity": "sha512-xhiegylRmhw43Ki2HO1ZBL7DQ5ja/qpRsL29VtQ2xuUHiuDGbgf2uD4p9Qd8hJI5P6RCtGYD50IXHXVq/Ocjcg==", "license": "Apache-2.0", "engines": { "node": ">=10.0" @@ -7648,14 +7400,14 @@ } }, "node_modules/@jsonjoy.com/fs-node-to-fsa": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-node-to-fsa/-/fs-node-to-fsa-4.57.1.tgz", - "integrity": "sha512-pqGHyWWzNck4jRfaGV39hkqpY5QjRUQ/nRbNT7FYbBa0xf4bDG+TE1Gt2KWZrSkrkZZDE3qZUjYMbjwSliX6pg==", + "version": "4.57.2", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-node-to-fsa/-/fs-node-to-fsa-4.57.2.tgz", + "integrity": "sha512-18LmWTSONhoAPW+IWRuf8w/+zRolPFGPeGwMxlAhhfY11EKzX+5XHDBPAw67dBF5dxDErHJbl40U+3IXSDRXSQ==", "license": "Apache-2.0", "dependencies": { - "@jsonjoy.com/fs-fsa": "4.57.1", - "@jsonjoy.com/fs-node-builtins": "4.57.1", - "@jsonjoy.com/fs-node-utils": "4.57.1" + "@jsonjoy.com/fs-fsa": "4.57.2", + "@jsonjoy.com/fs-node-builtins": "4.57.2", + "@jsonjoy.com/fs-node-utils": "4.57.2" }, "engines": { "node": ">=10.0" @@ -7669,12 +7421,12 @@ } }, "node_modules/@jsonjoy.com/fs-node-utils": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-node-utils/-/fs-node-utils-4.57.1.tgz", - "integrity": "sha512-vp+7ZzIB8v43G+GLXTS4oDUSQmhAsRz532QmmWBbdYA20s465JvwhkSFvX9cVTqRRAQg+vZ7zWDaIEh0lFe2gw==", + "version": "4.57.2", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-node-utils/-/fs-node-utils-4.57.2.tgz", + "integrity": "sha512-rsPSJgekz43IlNbLyAM/Ab+ouYLWGp5DDBfYBNNEqDaSpsbXfthBn29Q4muFA9L0F+Z3mKo+CWlgSCXrf+mOyQ==", "license": "Apache-2.0", "dependencies": { - "@jsonjoy.com/fs-node-builtins": "4.57.1" + "@jsonjoy.com/fs-node-builtins": "4.57.2" }, "engines": { "node": ">=10.0" @@ -7688,12 +7440,12 @@ } }, "node_modules/@jsonjoy.com/fs-print": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-print/-/fs-print-4.57.1.tgz", - "integrity": "sha512-Ynct7ZJmfk6qoXDOKfpovNA36ITUx8rChLmRQtW08J73VOiuNsU8PB6d/Xs7fxJC2ohWR3a5AqyjmLojfrw5yw==", + "version": "4.57.2", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-print/-/fs-print-4.57.2.tgz", + "integrity": "sha512-wK9NSow48i4DbDl9F1CQE5TqnyZOJ04elU3WFG5aJ76p+YxO/ulyBBQvKsessPxdo381Bc2pcEoyPujMOhcRqQ==", "license": "Apache-2.0", "dependencies": { - "@jsonjoy.com/fs-node-utils": "4.57.1", + "@jsonjoy.com/fs-node-utils": "4.57.2", "tree-dump": "^1.1.0" }, "engines": { @@ -7708,13 +7460,13 @@ } }, "node_modules/@jsonjoy.com/fs-snapshot": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-snapshot/-/fs-snapshot-4.57.1.tgz", - "integrity": "sha512-/oG8xBNFMbDXTq9J7vepSA1kerS5vpgd3p5QZSPd+nX59uwodGJftI51gDYyHRpP57P3WCQf7LHtBYPqwUg2Bg==", + "version": "4.57.2", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-snapshot/-/fs-snapshot-4.57.2.tgz", + "integrity": "sha512-GdduDZuoP5V/QCgJkx9+BZ6SC0EZ/smXAdTS7PfMqgMTGXLlt/bH/FqMYaqB9JmLf05sJPtO0XRbAwwkEEPbVw==", "license": "Apache-2.0", "dependencies": { "@jsonjoy.com/buffers": "^17.65.0", - "@jsonjoy.com/fs-node-utils": "4.57.1", + "@jsonjoy.com/fs-node-utils": "4.57.2", "@jsonjoy.com/json-pack": "^17.65.0", "@jsonjoy.com/util": "^17.65.0" }, @@ -7924,13 +7676,19 @@ "tslib": "2" } }, + "node_modules/@keyv/serialize": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@keyv/serialize/-/serialize-1.1.1.tgz", + "integrity": "sha512-dXn3FZhPv0US+7dtJsIi2R+c7qWYiReoEh5zUntWCf4oSpMNib8FDhSoed6m3QyZdx5hK7iLFkYk3rNxwt8vTA==", + "license": "MIT" + }, "node_modules/@ledgerhq/client-ids": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/@ledgerhq/client-ids/-/client-ids-0.8.2.tgz", - "integrity": "sha512-mfds5IyuJLDEwzIzHrYwii1YjP3EkY+txMInWDeektnafzC0nkKOirhluoCKUqtetwBuTUBYLDCf2eyfbmdtrQ==", + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/@ledgerhq/client-ids/-/client-ids-0.8.3.tgz", + "integrity": "sha512-+0lR1JPxlV7ln2CForSLRj1jritH0+s6D4sP8RJysgv5aDFVdxZl0Wo4mpvxvnudqISqgN3Y3eyXnMNjJ7/1yA==", "license": "Apache-2.0", "dependencies": { - "@ledgerhq/live-env": "^2.32.0", + "@ledgerhq/live-env": "^2.33.0", "@reduxjs/toolkit": "2.11.2", "uuid": "^9.0.0" } @@ -7969,51 +7727,24 @@ } }, "node_modules/@ledgerhq/domain-service": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/@ledgerhq/domain-service/-/domain-service-1.7.4.tgz", - "integrity": "sha512-7QYkml4MBRMzQsj92xsafI6xum8xuyztTKKRGWMlV9kN47EdMukiOnr5Ywt6SZD3cDJ6cBWxtwj8n853LcdBcQ==", + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@ledgerhq/domain-service/-/domain-service-1.8.0.tgz", + "integrity": "sha512-4L5OQy89saTZUIAIcsFNEwwyXkcJUsNC6Fj/V98fzCpUMqm5XHBXSiiF2B8sNCIx+fcghW9ELXJniB2ijBWZKw==", "license": "Apache-2.0", "dependencies": { - "@ledgerhq/errors": "^6.33.0", + "@ledgerhq/errors": "^6.34.0", "@ledgerhq/logs": "^6.17.0", - "@ledgerhq/types-live": "^6.104.0", + "@ledgerhq/types-live": "^6.105.0", "axios": "1.13.2", "eip55": "^2.1.1", "react": "19.0.0", "react-dom": "19.0.0" } }, - "node_modules/@ledgerhq/domain-service/node_modules/react": { - "version": "19.0.0", - "resolved": "https://registry.npmjs.org/react/-/react-19.0.0.tgz", - "integrity": "sha512-V8AVnmPIICiWpGfm6GLzCR/W5FXLchHop40W4nXBmdlEceh16rCN8O8LNWm5bh5XUX91fh7KpA+W0TgMKmgTpQ==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/@ledgerhq/domain-service/node_modules/react-dom": { - "version": "19.0.0", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.0.0.tgz", - "integrity": "sha512-4GV5sHFG0e/0AD4X+ySy6UJd3jVl1iNsNHdpad0qhABJ11twS3TTBnseqsKurKcsNqCEFeGL3uLpVChpIO3QfQ==", - "license": "MIT", - "dependencies": { - "scheduler": "^0.25.0" - }, - "peerDependencies": { - "react": "^19.0.0" - } - }, - "node_modules/@ledgerhq/domain-service/node_modules/scheduler": { - "version": "0.25.0", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.25.0.tgz", - "integrity": "sha512-xFVuu11jh+xcO7JOAGJNOXld8/TcEHK/4CituBUeUb5hqxJLj9YuemAEuvm9gQ/+pgXYfbQuqAkiYu+u7YEsNA==", - "license": "MIT" - }, "node_modules/@ledgerhq/errors": { - "version": "6.33.0", - "resolved": "https://registry.npmjs.org/@ledgerhq/errors/-/errors-6.33.0.tgz", - "integrity": "sha512-9iMdjB0Hfxfd8HGMVM0TDPfxBXhJ4MtGKyFlm8aveSHSXjcTjGtCkcnk4OUZ6ZHopBb69BFR+HC2N/ob9xuNgA==", + "version": "6.34.0", + "resolved": "https://registry.npmjs.org/@ledgerhq/errors/-/errors-6.34.0.tgz", + "integrity": "sha512-l16K56FzPoXBMT5J4EpnIBmRLTYkpSyYj3z4er+rmbwq0t9dDG/UaRvFeBpwB2gqGcYWcue14qF9Wkuos/43eA==", "license": "Apache-2.0" }, "node_modules/@ledgerhq/hw-app-aptos": { @@ -8071,36 +7802,36 @@ } }, "node_modules/@ledgerhq/hw-transport-mocker": { - "version": "6.34.0", - "resolved": "https://registry.npmjs.org/@ledgerhq/hw-transport-mocker/-/hw-transport-mocker-6.34.0.tgz", - "integrity": "sha512-gFxz0oZXNIoye6qKHddjyprBTErvvEPic2SZbbZHXMc4KHkZuSmpkLOrzqs+iPMiT8OqykuYHV3wAzU2Mu1+Ww==", + "version": "6.34.1", + "resolved": "https://registry.npmjs.org/@ledgerhq/hw-transport-mocker/-/hw-transport-mocker-6.34.1.tgz", + "integrity": "sha512-TfrE+nhKYS+j7DpJ5worRrf1buV7HasLnT/pwJT5Hhs8ve6QN6Aaz4d4t4/FWCy4CqKaROyL0/Piu046/dQwiQ==", "license": "Apache-2.0", "dependencies": { - "@ledgerhq/hw-transport": "6.35.0", + "@ledgerhq/hw-transport": "6.35.1", "@ledgerhq/logs": "^6.17.0", "rxjs": "7.8.2" } }, "node_modules/@ledgerhq/hw-transport-mocker/node_modules/@ledgerhq/devices": { - "version": "8.14.0", - "resolved": "https://registry.npmjs.org/@ledgerhq/devices/-/devices-8.14.0.tgz", - "integrity": "sha512-eMGOaagkMJrqGtqemYNraPg38FA0I/UUEPrbrC+vOZu1qeoG+Sek3gjuJih6rMK4efUfcI4Zs19w/Hv/58fwkQ==", + "version": "8.14.1", + "resolved": "https://registry.npmjs.org/@ledgerhq/devices/-/devices-8.14.1.tgz", + "integrity": "sha512-q6tOUO963tFPrsJtdzu5juC8xIAIRe6etLSZ+ZhwgUivTHNJbmFFBxMU3p19dwn8VaKRvbw0pxJv+qmokMYpRA==", "license": "Apache-2.0", "dependencies": { - "@ledgerhq/errors": "^6.33.0", + "@ledgerhq/errors": "^6.34.0", "@ledgerhq/logs": "^6.17.0", "rxjs": "7.8.2", "semver": "7.7.3" } }, "node_modules/@ledgerhq/hw-transport-mocker/node_modules/@ledgerhq/hw-transport": { - "version": "6.35.0", - "resolved": "https://registry.npmjs.org/@ledgerhq/hw-transport/-/hw-transport-6.35.0.tgz", - "integrity": "sha512-BFk4Zr5gfzT40RT6nj0NQTNB25bxWD3QWhdrOA6Mi/CChFTdGomjOuAhWHla2kH50ft8M5UsiiUeHoR+56J69g==", + "version": "6.35.1", + "resolved": "https://registry.npmjs.org/@ledgerhq/hw-transport/-/hw-transport-6.35.1.tgz", + "integrity": "sha512-YCkk9koo0FzCzHvLVpdrQ3+EQOPMpp/fSednHhk7AiaJC/c+pX6wKevUDp1MLcq7gUHbVOXyYYpqoW6A97w8OA==", "license": "Apache-2.0", "dependencies": { - "@ledgerhq/devices": "8.14.0", - "@ledgerhq/errors": "^6.33.0", + "@ledgerhq/devices": "8.14.1", + "@ledgerhq/errors": "^6.34.0", "@ledgerhq/logs": "^6.17.0", "events": "^3.3.0" } @@ -8134,38 +7865,38 @@ } }, "node_modules/@ledgerhq/hw-transport-node-hid-noevents": { - "version": "6.35.0", - "resolved": "https://registry.npmjs.org/@ledgerhq/hw-transport-node-hid-noevents/-/hw-transport-node-hid-noevents-6.35.0.tgz", - "integrity": "sha512-5ZPsxoaLOsXmV/mb7kaewmD7f1SXMcsrW+xfMNFUg73S5tC5n+apHerkd9FoQm32QOQ6CQPpW6kz5f5c5pNcug==", + "version": "6.35.1", + "resolved": "https://registry.npmjs.org/@ledgerhq/hw-transport-node-hid-noevents/-/hw-transport-node-hid-noevents-6.35.1.tgz", + "integrity": "sha512-3NVgVYiACSXh1S1lgRjogNloF4Bewllv/nDydv8/Nc0DrnXJSGPNC+anl0ZR3cVo5Rg+iuZ1AvUKJFtmQZtt1A==", "license": "Apache-2.0", "dependencies": { - "@ledgerhq/devices": "8.14.0", - "@ledgerhq/errors": "^6.33.0", - "@ledgerhq/hw-transport": "6.35.0", + "@ledgerhq/devices": "8.14.1", + "@ledgerhq/errors": "^6.34.0", + "@ledgerhq/hw-transport": "6.35.1", "@ledgerhq/logs": "^6.17.0", "node-hid": "2.1.2" } }, "node_modules/@ledgerhq/hw-transport-node-hid-noevents/node_modules/@ledgerhq/devices": { - "version": "8.14.0", - "resolved": "https://registry.npmjs.org/@ledgerhq/devices/-/devices-8.14.0.tgz", - "integrity": "sha512-eMGOaagkMJrqGtqemYNraPg38FA0I/UUEPrbrC+vOZu1qeoG+Sek3gjuJih6rMK4efUfcI4Zs19w/Hv/58fwkQ==", + "version": "8.14.1", + "resolved": "https://registry.npmjs.org/@ledgerhq/devices/-/devices-8.14.1.tgz", + "integrity": "sha512-q6tOUO963tFPrsJtdzu5juC8xIAIRe6etLSZ+ZhwgUivTHNJbmFFBxMU3p19dwn8VaKRvbw0pxJv+qmokMYpRA==", "license": "Apache-2.0", "dependencies": { - "@ledgerhq/errors": "^6.33.0", + "@ledgerhq/errors": "^6.34.0", "@ledgerhq/logs": "^6.17.0", "rxjs": "7.8.2", "semver": "7.7.3" } }, "node_modules/@ledgerhq/hw-transport-node-hid-noevents/node_modules/@ledgerhq/hw-transport": { - "version": "6.35.0", - "resolved": "https://registry.npmjs.org/@ledgerhq/hw-transport/-/hw-transport-6.35.0.tgz", - "integrity": "sha512-BFk4Zr5gfzT40RT6nj0NQTNB25bxWD3QWhdrOA6Mi/CChFTdGomjOuAhWHla2kH50ft8M5UsiiUeHoR+56J69g==", + "version": "6.35.1", + "resolved": "https://registry.npmjs.org/@ledgerhq/hw-transport/-/hw-transport-6.35.1.tgz", + "integrity": "sha512-YCkk9koo0FzCzHvLVpdrQ3+EQOPMpp/fSednHhk7AiaJC/c+pX6wKevUDp1MLcq7gUHbVOXyYYpqoW6A97w8OA==", "license": "Apache-2.0", "dependencies": { - "@ledgerhq/devices": "8.14.0", - "@ledgerhq/errors": "^6.33.0", + "@ledgerhq/devices": "8.14.1", + "@ledgerhq/errors": "^6.34.0", "@ledgerhq/logs": "^6.17.0", "events": "^3.3.0" } @@ -8183,9 +7914,9 @@ } }, "node_modules/@ledgerhq/live-env": { - "version": "2.32.0", - "resolved": "https://registry.npmjs.org/@ledgerhq/live-env/-/live-env-2.32.0.tgz", - "integrity": "sha512-5/6gQDRJCxluC3dy8WdtpfE13xLhwOOi07FF6uU57jtx4Pe2C8qKtvA4wnZD5I7R3RAKS4o84meSshGXNplcPA==", + "version": "2.33.0", + "resolved": "https://registry.npmjs.org/@ledgerhq/live-env/-/live-env-2.33.0.tgz", + "integrity": "sha512-kDjMJp7zUTlxO6oNAiGV913jSg45GVPPybxG+RJKPyjdWtdBPD0LKGggx+zMzh8a2JAVAETG0+QLi0ZTYXkDtg==", "license": "Apache-2.0", "dependencies": { "rxjs": "7.8.2", @@ -8199,12 +7930,12 @@ "license": "Apache-2.0" }, "node_modules/@ledgerhq/types-live": { - "version": "6.104.0", - "resolved": "https://registry.npmjs.org/@ledgerhq/types-live/-/types-live-6.104.0.tgz", - "integrity": "sha512-5WLoFeKaassNM9dDKkiv8FCn5JRntghq208IV/MEDNj02oTkaZSHFUVuBFQEw3d6m2svkF40aMlI2gnf0tNMoQ==", + "version": "6.105.0", + "resolved": "https://registry.npmjs.org/@ledgerhq/types-live/-/types-live-6.105.0.tgz", + "integrity": "sha512-Mojj/8wUwTi9HQ0Z3XShUfapeMDrY+F9E0i7rYJO/a9qAFor8Qtb567YLfyb+NVv+HIv+YabW94NgtJ3L/8jLA==", "license": "Apache-2.0", "dependencies": { - "@ledgerhq/client-ids": "0.8.2", + "@ledgerhq/client-ids": "0.8.3", "bignumber.js": "^9.1.2", "rxjs": "7.8.2" } @@ -8298,30 +8029,6 @@ "resolve": "~1.22.2" } }, - "node_modules/@microsoft/tsdoc-config/node_modules/ajv": { - "version": "8.18.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.18.0.tgz", - "integrity": "sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A==", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.3", - "fast-uri": "^3.0.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/@microsoft/tsdoc-config/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true, - "license": "MIT" - }, "node_modules/@mysten/bcs": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/@mysten/bcs/-/bcs-2.0.3.tgz", @@ -8333,9 +8040,9 @@ } }, "node_modules/@mysten/sui": { - "version": "2.15.0", - "resolved": "https://registry.npmjs.org/@mysten/sui/-/sui-2.15.0.tgz", - "integrity": "sha512-OWdmd/kPOKGCBkAzyKi/AAMcn+rf39sbrqm7KAx1c2SMbaNwskJV4Uw2seiW686neyfoc0cw/hZ7/Rv9PyM+hQ==", + "version": "2.16.0", + "resolved": "https://registry.npmjs.org/@mysten/sui/-/sui-2.16.0.tgz", + "integrity": "sha512-xnf3e3uIuJGzIVEBLEl372Xk51CB45CP2ZlXXLSnWHH1MI0xIpko10JSQ44ohde9XhxygAy1jz26rkrlCgDGXQ==", "license": "Apache-2.0", "dependencies": { "@graphql-typed-document-node/core": "^3.2.0", @@ -8386,66 +8093,27 @@ } }, "node_modules/@mysten/sui/node_modules/@scure/bip32": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@scure/bip32/-/bip32-2.0.1.tgz", - "integrity": "sha512-4Md1NI5BzoVP+bhyJaY3K6yMesEFzNS1sE/cP+9nuvE7p/b0kx9XbpDHHFl8dHtufcbdHRUUQdRqLIPHN/s7yA==", - "license": "MIT", - "dependencies": { - "@noble/curves": "2.0.1", - "@noble/hashes": "2.0.1", - "@scure/base": "2.0.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/@mysten/sui/node_modules/@scure/bip32/node_modules/@noble/curves": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-2.0.1.tgz", - "integrity": "sha512-vs1Az2OOTBiP4q0pwjW5aF0xp9n4MxVrmkFBxc6EKZc6ddYx5gaZiAsZoq0uRRXWbi3AT/sBqn05eRPtn1JCPw==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@scure/bip32/-/bip32-2.2.0.tgz", + "integrity": "sha512-zFr7t2F+a9+5tB7QbarF2HQNYrgjCNaoLAupZdKkrFMYMozJf5zqH2WJCQibMzm1qQ0QogrxVGO3qXfQDYMaQg==", "license": "MIT", "dependencies": { - "@noble/hashes": "2.0.1" - }, - "engines": { - "node": ">= 20.19.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/@mysten/sui/node_modules/@scure/bip32/node_modules/@noble/hashes": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-2.0.1.tgz", - "integrity": "sha512-XlOlEbQcE9fmuXxrVTXCTlG2nlRXa9Rj3rr5Ue/+tX+nmkgbX720YHh0VR3hBF9xDvwnb8D2shVGOwNx+ulArw==", - "license": "MIT", - "engines": { - "node": ">= 20.19.0" + "@noble/curves": "2.2.0", + "@noble/hashes": "2.2.0", + "@scure/base": "2.2.0" }, "funding": { "url": "https://paulmillr.com/funding/" } }, "node_modules/@mysten/sui/node_modules/@scure/bip39": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@scure/bip39/-/bip39-2.0.1.tgz", - "integrity": "sha512-PsxdFj/d2AcJcZDX1FXN3dDgitDDTmwf78rKZq1a6c1P1Nan1X/Sxc7667zU3U+AN60g7SxxP0YCVw2H/hBycg==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@scure/bip39/-/bip39-2.2.0.tgz", + "integrity": "sha512-T/Bj/YvYMNkIPq6EENO6/rcs2e7qTNuyoUXf0KBFDmp0ZDu0H2X4Lq6yC3i0c8PcWkov5EbW+yQZZbdMmk154A==", "license": "MIT", "dependencies": { - "@noble/hashes": "2.0.1", - "@scure/base": "2.0.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/@mysten/sui/node_modules/@scure/bip39/node_modules/@noble/hashes": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-2.0.1.tgz", - "integrity": "sha512-XlOlEbQcE9fmuXxrVTXCTlG2nlRXa9Rj3rr5Ue/+tX+nmkgbX720YHh0VR3hBF9xDvwnb8D2shVGOwNx+ulArw==", - "license": "MIT", - "engines": { - "node": ">= 20.19.0" + "@noble/hashes": "2.2.0", + "@scure/base": "2.2.0" }, "funding": { "url": "https://paulmillr.com/funding/" @@ -9359,25 +9027,19 @@ "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/@redocly/ajv/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "license": "MIT" - }, "node_modules/@redocly/config": { - "version": "0.48.0", - "resolved": "https://registry.npmjs.org/@redocly/config/-/config-0.48.0.tgz", - "integrity": "sha512-8W3wz+Q7y4e9klJWlYOvQWK5r7P2Mo589vcjtlT5coOxsyAdt53k8Vb8iAqnRiGWExbjBQmSbL2XbuU747Nf6Q==", + "version": "0.48.1", + "resolved": "https://registry.npmjs.org/@redocly/config/-/config-0.48.1.tgz", + "integrity": "sha512-vq8GM3e0KiglqkwE5Lb9XayrmZY4dHCs21BsvV92yAZN68f1N9cZUuwY1SwnztPbH06dn9uLzubBl/JNfImqfA==", "license": "MIT", "dependencies": { "json-schema-to-ts": "2.7.2" } }, "node_modules/@redocly/openapi-core": { - "version": "2.28.0", - "resolved": "https://registry.npmjs.org/@redocly/openapi-core/-/openapi-core-2.28.0.tgz", - "integrity": "sha512-Htpp4PsjKMgEuMT9iJu4iuFFzWCDe8FylvpGaQEA5D7jZXWv+8XvnqhpGCKN2cM/n/Uri2QfqNdw0JlKIC59sg==", + "version": "2.29.1", + "resolved": "https://registry.npmjs.org/@redocly/openapi-core/-/openapi-core-2.29.1.tgz", + "integrity": "sha512-T9FeS2+lpXR9V/XHqiJ53uGjoF1Hs80nRA9ACEXpTLF9a4jzzSANO92/f9HKuQvl0bHgyaIbP5OsBgVU3EP1KQ==", "license": "MIT", "dependencies": { "@redocly/ajv": "^8.18.0", @@ -9396,33 +9058,10 @@ "npm": ">=10" } }, - "node_modules/@redocly/openapi-core/node_modules/ajv": { - "name": "@redocly/ajv", - "version": "8.18.0", - "resolved": "https://registry.npmjs.org/@redocly/ajv/-/ajv-8.18.0.tgz", - "integrity": "sha512-F+LMD2IDIXuHxgpLJh3nkLj9+tSaEzoUWd+7fONGq5pe2169FUDjpEkOfEpoGLz1sbZni/69p07OsecNfAOpqA==", - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.3", - "fast-uri": "^3.0.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/@redocly/openapi-core/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "license": "MIT" - }, - "node_modules/@reduxjs/toolkit": { - "version": "2.11.2", - "resolved": "https://registry.npmjs.org/@reduxjs/toolkit/-/toolkit-2.11.2.tgz", - "integrity": "sha512-Kd6kAHTA6/nUpp8mySPqj3en3dm0tdMIgbttnQ1xFMVpufoj+ADi8pXLBsd4xzTRHQa7t/Jv8W5UnCuW4kuWMQ==", + "node_modules/@reduxjs/toolkit": { + "version": "2.11.2", + "resolved": "https://registry.npmjs.org/@reduxjs/toolkit/-/toolkit-2.11.2.tgz", + "integrity": "sha512-Kd6kAHTA6/nUpp8mySPqj3en3dm0tdMIgbttnQ1xFMVpufoj+ADi8pXLBsd4xzTRHQa7t/Jv8W5UnCuW4kuWMQ==", "license": "MIT", "dependencies": { "@standard-schema/spec": "^1.0.0", @@ -9446,9 +9085,9 @@ } }, "node_modules/@scure/base": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@scure/base/-/base-2.0.0.tgz", - "integrity": "sha512-3E1kpuZginKkek01ovG8krQ0Z44E3DHPjc5S2rjJw9lZn3KSQOs8S7wqikF/AH7iRanHypj85uGyxk0XAyC37w==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@scure/base/-/base-2.2.0.tgz", + "integrity": "sha512-b8XEupJibegiXV+tDUseI8oLQc8ei3d/4Jkb2RpbHh3MfE054ov3uIz2dhFkB3FI8iwYkEh0gGCApkrYggkPNg==", "license": "MIT", "funding": { "url": "https://paulmillr.com/funding/" @@ -9595,12 +9234,12 @@ } }, "node_modules/@sindresorhus/is": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", - "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-8.0.0.tgz", + "integrity": "sha512-YvOsokBE5NsyHuXMnwEVB7lgFk6lX8F4OXCruYVgFII0hUHof0RGUvhMoabVt9hRqbg+qVzayzEG24RCcxcYeA==", "license": "MIT", "engines": { - "node": ">=10" + "node": ">=22" }, "funding": { "url": "https://github.com/sindresorhus/is?sponsor=1" @@ -10296,12 +9935,12 @@ } }, "node_modules/@ton/ton": { - "version": "16.2.3", - "resolved": "https://registry.npmjs.org/@ton/ton/-/ton-16.2.3.tgz", - "integrity": "sha512-jHnIn44BIWDZGCutS/3wBe+0Sw+5faRIYmk/cGj7qAnWVLgIphIvMOdZYMJpVO/wVpPtSKdnpjR+/w3ljYcwnw==", + "version": "16.2.4", + "resolved": "https://registry.npmjs.org/@ton/ton/-/ton-16.2.4.tgz", + "integrity": "sha512-GWCNKizQm7MM99XNQGr+zWWdSfbFu/WLeQYm7tMIQDNKpAYEpLDKJUKuK/yrz763DBbnTDAFeq1NWAEy8rAOaQ==", "license": "MIT", "dependencies": { - "axios": "1.14.0", + "axios": "1.15.0", "dataloader": "^2.0.0", "zod": "^3.21.4" }, @@ -10838,12 +10477,12 @@ "license": "MIT" }, "node_modules/@types/node": { - "version": "25.5.2", - "resolved": "https://registry.npmjs.org/@types/node/-/node-25.5.2.tgz", - "integrity": "sha512-tO4ZIRKNC+MDWV4qKVZe3Ql/woTnmHDr5JD8UI5hn2pwBrHEwOEMZK7WlNb5RKB6EoJ02gwmQS9OrjuFnZYdpg==", + "version": "25.6.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-25.6.0.tgz", + "integrity": "sha512-+qIYRKdNYJwY3vRCZMdJbPLJAtGjQBudzZzdzwQYkEPQd+PJGixUL5QfvCLDaULoLv+RhT3LDkwEfKaAkgSmNQ==", "license": "MIT", "dependencies": { - "undici-types": "~7.18.0" + "undici-types": "~7.19.0" } }, "node_modules/@types/prismjs": { @@ -11011,32 +10650,6 @@ "boxen": "^7.1.1" } }, - "node_modules/@types/update-notifier/node_modules/ansi-regex": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", - "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/@types/update-notifier/node_modules/ansi-styles": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", - "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, "node_modules/@types/update-notifier/node_modules/boxen": { "version": "7.1.1", "resolved": "https://registry.npmjs.org/boxen/-/boxen-7.1.1.tgz", @@ -11111,22 +10724,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@types/update-notifier/node_modules/strip-ansi": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", - "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^6.2.2" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, "node_modules/@types/update-notifier/node_modules/type-fest": { "version": "2.19.0", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", @@ -11140,24 +10737,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@types/update-notifier/node_modules/wrap-ansi": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", - "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^6.1.0", - "string-width": "^5.0.1", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, "node_modules/@types/use-sync-external-store": { "version": "0.0.6", "resolved": "https://registry.npmjs.org/@types/use-sync-external-store/-/use-sync-external-store-0.0.6.tgz", @@ -11201,17 +10780,17 @@ "license": "MIT" }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "8.58.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.58.1.tgz", - "integrity": "sha512-eSkwoemjo76bdXl2MYqtxg51HNwUSkWfODUOQ3PaTLZGh9uIWWFZIjyjaJnex7wXDu+TRx+ATsnSxdN9YWfRTQ==", + "version": "8.59.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.59.0.tgz", + "integrity": "sha512-HyAZtpdkgZwpq8Sz3FSUvCR4c+ScbuWa9AksK2Jweub7w4M3yTz4O11AqVJzLYjy/B9ZWPyc81I+mOdJU/bDQw==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/regexpp": "^4.12.2", - "@typescript-eslint/scope-manager": "8.58.1", - "@typescript-eslint/type-utils": "8.58.1", - "@typescript-eslint/utils": "8.58.1", - "@typescript-eslint/visitor-keys": "8.58.1", + "@typescript-eslint/scope-manager": "8.59.0", + "@typescript-eslint/type-utils": "8.59.0", + "@typescript-eslint/utils": "8.59.0", + "@typescript-eslint/visitor-keys": "8.59.0", "ignore": "^7.0.5", "natural-compare": "^1.4.0", "ts-api-utils": "^2.5.0" @@ -11224,7 +10803,7 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "@typescript-eslint/parser": "^8.58.1", + "@typescript-eslint/parser": "^8.59.0", "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.1.0" } @@ -11240,16 +10819,16 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "8.58.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.58.1.tgz", - "integrity": "sha512-gGkiNMPqerb2cJSVcruigx9eHBlLG14fSdPdqMoOcBfh+vvn4iCq2C8MzUB89PrxOXk0y3GZ1yIWb9aOzL93bw==", + "version": "8.59.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.59.0.tgz", + "integrity": "sha512-TI1XGwKbDpo9tRW8UDIXCOeLk55qe9ZFGs8MTKU6/M08HWTw52DD/IYhfQtOEhEdPhLMT26Ka/x7p70nd3dzDg==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/scope-manager": "8.58.1", - "@typescript-eslint/types": "8.58.1", - "@typescript-eslint/typescript-estree": "8.58.1", - "@typescript-eslint/visitor-keys": "8.58.1", + "@typescript-eslint/scope-manager": "8.59.0", + "@typescript-eslint/types": "8.59.0", + "@typescript-eslint/typescript-estree": "8.59.0", + "@typescript-eslint/visitor-keys": "8.59.0", "debug": "^4.4.3" }, "engines": { @@ -11264,29 +10843,15 @@ "typescript": ">=4.8.4 <6.1.0" } }, - "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/types": { - "version": "8.58.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.58.1.tgz", - "integrity": "sha512-io/dV5Aw5ezwzfPBBWLoT+5QfVtP8O7q4Kftjn5azJ88bYyp/ZMCsyW1lpKK46EXJcaYMZ1JtYj+s/7TdzmQMw==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, "node_modules/@typescript-eslint/project-service": { - "version": "8.58.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.58.1.tgz", - "integrity": "sha512-gfQ8fk6cxhtptek+/8ZIqw8YrRW5048Gug8Ts5IYcMLCw18iUgrZAEY/D7s4hkI0FxEfGakKuPK/XUMPzPxi5g==", + "version": "8.59.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.59.0.tgz", + "integrity": "sha512-Lw5ITrR5s5TbC19YSvlr63ZfLaJoU6vtKTHyB0GQOpX0W7d5/Ir6vUahWi/8Sps/nOukZQ0IB3SmlxZnjaKVnw==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/tsconfig-utils": "^8.58.1", - "@typescript-eslint/types": "^8.58.1", + "@typescript-eslint/tsconfig-utils": "^8.59.0", + "@typescript-eslint/types": "^8.59.0", "debug": "^4.4.3" }, "engines": { @@ -11301,14 +10866,14 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "8.58.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.58.1.tgz", - "integrity": "sha512-TPYUEqJK6avLcEjumWsIuTpuYODTTDAtoMdt8ZZa93uWMTX13Nb8L5leSje1NluammvU+oI3QRr5lLXPgihX3w==", + "version": "8.59.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.59.0.tgz", + "integrity": "sha512-UzR16Ut8IpA3Mc4DbgAShlPPkVm8xXMWafXxB0BocaVRHs8ZGakAxGRskF7FId3sdk9lgGD73GSFaWmWFDE4dg==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.58.1", - "@typescript-eslint/visitor-keys": "8.58.1" + "@typescript-eslint/types": "8.59.0", + "@typescript-eslint/visitor-keys": "8.59.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -11318,24 +10883,10 @@ "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@typescript-eslint/scope-manager/node_modules/@typescript-eslint/types": { - "version": "8.58.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.58.1.tgz", - "integrity": "sha512-io/dV5Aw5ezwzfPBBWLoT+5QfVtP8O7q4Kftjn5azJ88bYyp/ZMCsyW1lpKK46EXJcaYMZ1JtYj+s/7TdzmQMw==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, "node_modules/@typescript-eslint/tsconfig-utils": { - "version": "8.58.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.58.1.tgz", - "integrity": "sha512-JAr2hOIct2Q+qk3G+8YFfqkqi7sC86uNryT+2i5HzMa2MPjw4qNFvtjnw1IiA1rP7QhNKVe21mSSLaSjwA1Olw==", + "version": "8.59.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.59.0.tgz", + "integrity": "sha512-91Sbl3s4Kb3SybliIY6muFBmHVv+pYXfybC4Oolp3dvk8BvIE3wOPc+403CWIT7mJNkfQRGtdqghzs2+Z91Tqg==", "dev": true, "license": "MIT", "engines": { @@ -11350,15 +10901,15 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "8.58.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.58.1.tgz", - "integrity": "sha512-HUFxvTJVroT+0rXVJC7eD5zol6ID+Sn5npVPWoFuHGg9Ncq5Q4EYstqR+UOqaNRFXi5TYkpXXkLhoCHe3G0+7w==", + "version": "8.59.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.59.0.tgz", + "integrity": "sha512-3TRiZaQSltGqGeNrJzzr1+8YcEobKH9rHnqIp/1psfKFmhRQDNMGP5hBufanYTGznwShzVLs3Mz+gDN7HkWfXg==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.58.1", - "@typescript-eslint/typescript-estree": "8.58.1", - "@typescript-eslint/utils": "8.58.1", + "@typescript-eslint/types": "8.59.0", + "@typescript-eslint/typescript-estree": "8.59.0", + "@typescript-eslint/utils": "8.59.0", "debug": "^4.4.3", "ts-api-utils": "^2.5.0" }, @@ -11374,24 +10925,10 @@ "typescript": ">=4.8.4 <6.1.0" } }, - "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/types": { - "version": "8.58.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.58.1.tgz", - "integrity": "sha512-io/dV5Aw5ezwzfPBBWLoT+5QfVtP8O7q4Kftjn5azJ88bYyp/ZMCsyW1lpKK46EXJcaYMZ1JtYj+s/7TdzmQMw==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, "node_modules/@typescript-eslint/types": { - "version": "8.58.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.58.2.tgz", - "integrity": "sha512-9TukXyATBQf/Jq9AMQXfvurk+G5R2MwfqQGDR2GzGz28HvY/lXNKGhkY+6IOubwcquikWk5cjlgPvD2uAA7htQ==", + "version": "8.59.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.59.0.tgz", + "integrity": "sha512-nLzdsT1gdOgFxxxwrlNVUBzSNBEEHJ86bblmk4QAS6stfig7rcJzWKqCyxFy3YRRHXDWEkb2NralA1nOYkkm/A==", "dev": true, "license": "MIT", "engines": { @@ -11403,16 +10940,16 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "8.58.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.58.1.tgz", - "integrity": "sha512-w4w7WR7GHOjqqPnvAYbazq+Y5oS68b9CzasGtnd6jIeOIeKUzYzupGTB2T4LTPSv4d+WPeccbxuneTFHYgAAWg==", + "version": "8.59.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.59.0.tgz", + "integrity": "sha512-O9Re9P1BmBLFJyikRbQpLku/QA3/AueZNO9WePLBwQrvkixTmDe8u76B6CYUAITRl/rHawggEqUGn5QIkVRLMw==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/project-service": "8.58.1", - "@typescript-eslint/tsconfig-utils": "8.58.1", - "@typescript-eslint/types": "8.58.1", - "@typescript-eslint/visitor-keys": "8.58.1", + "@typescript-eslint/project-service": "8.59.0", + "@typescript-eslint/tsconfig-utils": "8.59.0", + "@typescript-eslint/types": "8.59.0", + "@typescript-eslint/visitor-keys": "8.59.0", "debug": "^4.4.3", "minimatch": "^10.2.2", "semver": "^7.7.3", @@ -11430,31 +10967,17 @@ "typescript": ">=4.8.4 <6.1.0" } }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/@typescript-eslint/types": { - "version": "8.58.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.58.1.tgz", - "integrity": "sha512-io/dV5Aw5ezwzfPBBWLoT+5QfVtP8O7q4Kftjn5azJ88bYyp/ZMCsyW1lpKK46EXJcaYMZ1JtYj+s/7TdzmQMw==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, "node_modules/@typescript-eslint/utils": { - "version": "8.58.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.58.1.tgz", - "integrity": "sha512-Ln8R0tmWC7pTtLOzgJzYTXSCjJ9rDNHAqTaVONF4FEi2qwce8mD9iSOxOpLFFvWp/wBFlew0mjM1L1ihYWfBdQ==", + "version": "8.59.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.59.0.tgz", + "integrity": "sha512-I1R/K7V07XsMJ12Oaxg/O9GfrysGTmCRhvZJBv0RE0NcULMzjqVpR5kRRQjHsz3J/bElU7HwCO7zkqL+MSUz+g==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.9.1", - "@typescript-eslint/scope-manager": "8.58.1", - "@typescript-eslint/types": "8.58.1", - "@typescript-eslint/typescript-estree": "8.58.1" + "@typescript-eslint/scope-manager": "8.59.0", + "@typescript-eslint/types": "8.59.0", + "@typescript-eslint/typescript-estree": "8.59.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -11468,28 +10991,14 @@ "typescript": ">=4.8.4 <6.1.0" } }, - "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/types": { - "version": "8.58.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.58.1.tgz", - "integrity": "sha512-io/dV5Aw5ezwzfPBBWLoT+5QfVtP8O7q4Kftjn5azJ88bYyp/ZMCsyW1lpKK46EXJcaYMZ1JtYj+s/7TdzmQMw==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "8.58.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.58.1.tgz", - "integrity": "sha512-y+vH7QE8ycjoa0bWciFg7OpFcipUuem1ujhrdLtq1gByKwfbC7bPeKsiny9e0urg93DqwGcHey+bGRKCnF1nZQ==", + "version": "8.59.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.59.0.tgz", + "integrity": "sha512-/uejZt4dSere1bx12WLlPfv8GktzcaDtuJ7s42/HEZ5zGj9oxRaD4bj7qwSunXkf+pbAhFt2zjpHYUiT5lHf0Q==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.58.1", + "@typescript-eslint/types": "8.59.0", "eslint-visitor-keys": "^5.0.0" }, "engines": { @@ -11500,20 +11009,6 @@ "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@typescript-eslint/visitor-keys/node_modules/@typescript-eslint/types": { - "version": "8.58.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.58.1.tgz", - "integrity": "sha512-io/dV5Aw5ezwzfPBBWLoT+5QfVtP8O7q4Kftjn5azJ88bYyp/ZMCsyW1lpKK46EXJcaYMZ1JtYj+s/7TdzmQMw==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, "node_modules/@ungap/structured-clone": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.0.tgz", @@ -11958,9 +11453,9 @@ "license": "Apache-2.0" }, "node_modules/abitype": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/abitype/-/abitype-1.2.3.tgz", - "integrity": "sha512-Ofer5QUnuUdTFsBRwARMoWKOH1ND5ehwYhJ3OJ/BQO+StkwQjHw0XyVh4vDttzHB7QOFhPHa/o413PJ82gU/Tg==", + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/abitype/-/abitype-1.2.4.tgz", + "integrity": "sha512-dpKH+N27vRjarMVTFFkeY445VTKftzGWpL0FiT7xmVmzQRKazZexzC5uHG0f6XKsVLAuUlndnbGau6lRejClxg==", "license": "MIT", "funding": { "url": "https://github.com/sponsors/wevm" @@ -12086,21 +11581,36 @@ } }, "node_modules/ajv": { - "version": "6.14.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.14.0.tgz", - "integrity": "sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw==", + "name": "@redocly/ajv", + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/@redocly/ajv/-/ajv-8.18.0.tgz", + "integrity": "sha512-F+LMD2IDIXuHxgpLJh3nkLj9+tSaEzoUWd+7fONGq5pe2169FUDjpEkOfEpoGLz1sbZni/69p07OsecNfAOpqA==", "license": "MIT", "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" }, "funding": { "type": "github", "url": "https://github.com/sponsors/epoberezkin" } }, + "node_modules/ajv-draft-04": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/ajv-draft-04/-/ajv-draft-04-1.0.0.tgz", + "integrity": "sha512-mv00Te6nmYbRp5DCwclxtt7yV/joXJPGS7nM+97GdxvuttCOfgI3K4U25zboyeX0O+myI8ERluxQe5wljMmVIw==", + "license": "MIT", + "peerDependencies": { + "ajv": "^8.5.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, "node_modules/ajv-formats": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-3.0.1.tgz", @@ -12118,57 +11628,38 @@ } } }, - "node_modules/ajv-formats/node_modules/ajv": { - "version": "8.18.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.18.0.tgz", - "integrity": "sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A==", + "node_modules/ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", "license": "MIT", "dependencies": { - "fast-deep-equal": "^3.1.3", - "fast-uri": "^3.0.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2" + "fast-deep-equal": "^3.1.3" }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/ajv-formats/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "license": "MIT" - }, - "node_modules/ajv-keywords": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "license": "MIT", "peerDependencies": { - "ajv": "^6.9.1" + "ajv": "^8.8.2" } }, "node_modules/algoliasearch": { - "version": "5.50.2", - "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-5.50.2.tgz", - "integrity": "sha512-Tfp26yoNWurUjfgK4GOrVJQhSNXu9tJtHfFFNosgT2YClG+vPyUjX/gbC8rG39qLncnZg8Fj34iarQWpMkqefw==", - "license": "MIT", - "dependencies": { - "@algolia/abtesting": "1.16.2", - "@algolia/client-abtesting": "5.50.2", - "@algolia/client-analytics": "5.50.2", - "@algolia/client-common": "5.50.2", - "@algolia/client-insights": "5.50.2", - "@algolia/client-personalization": "5.50.2", - "@algolia/client-query-suggestions": "5.50.2", - "@algolia/client-search": "5.50.2", - "@algolia/ingestion": "1.50.2", - "@algolia/monitoring": "1.50.2", - "@algolia/recommend": "5.50.2", - "@algolia/requester-browser-xhr": "5.50.2", - "@algolia/requester-fetch": "5.50.2", - "@algolia/requester-node-http": "5.50.2" + "version": "5.51.0", + "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-5.51.0.tgz", + "integrity": "sha512-u3XS8HaTzt5YN90KPsOXMRjYJUMVD1dtr6yi4NXQluMbZ5IjQNBu1MEabdAxFhYtEuexqomPMSmRIhQJUd3QSg==", + "license": "MIT", + "dependencies": { + "@algolia/abtesting": "1.17.0", + "@algolia/client-abtesting": "5.51.0", + "@algolia/client-analytics": "5.51.0", + "@algolia/client-common": "5.51.0", + "@algolia/client-insights": "5.51.0", + "@algolia/client-personalization": "5.51.0", + "@algolia/client-query-suggestions": "5.51.0", + "@algolia/client-search": "5.51.0", + "@algolia/ingestion": "1.51.0", + "@algolia/monitoring": "1.51.0", + "@algolia/recommend": "5.51.0", + "@algolia/requester-browser-xhr": "5.51.0", + "@algolia/requester-fetch": "5.51.0", + "@algolia/requester-node-http": "5.51.0" }, "engines": { "node": ">= 14.0.0" @@ -12204,6 +11695,47 @@ "string-width": "^4.1.0" } }, + "node_modules/ansi-align/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-align/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "license": "MIT" + }, + "node_modules/ansi-align/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-align/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/ansi-html-community": { "version": "0.0.8", "resolved": "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz", @@ -12217,12 +11749,15 @@ } }, "node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", "license": "MIT", "engines": { - "node": ">=8" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" } }, "node_modules/ansi-styles": { @@ -12306,13 +11841,13 @@ } }, "node_modules/asn1js": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/asn1js/-/asn1js-3.0.7.tgz", - "integrity": "sha512-uLvq6KJu04qoQM6gvBfKFjlh6Gl0vOKQuR5cJMDHQkmwfMOQeN3F3SHCv9SNYSL+CRoHvOGFfllDlVz03GQjvQ==", + "version": "3.0.10", + "resolved": "https://registry.npmjs.org/asn1js/-/asn1js-3.0.10.tgz", + "integrity": "sha512-S2s3aOytiKdFRdulw2qPE51MzjzVOisppcVv7jVFR+Kw0kxwvFrDcYA0h7Ndqbmj0HkMIXYWaoj7fli8kgx1eg==", "license": "BSD-3-Clause", "dependencies": { "pvtsutils": "^1.3.6", - "pvutils": "^1.1.3", + "pvutils": "^1.1.5", "tslib": "^2.8.1" }, "engines": { @@ -12517,9 +12052,9 @@ "license": "MIT" }, "node_modules/baseline-browser-mapping": { - "version": "2.10.19", - "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.19.tgz", - "integrity": "sha512-qCkNLi2sfBOn8XhZQ0FXsT1Ki/Yo5P90hrkRamVFRS7/KV9hpfA4HkoWNU152+8w0zPjnxo5psx5NL3PSGgv5g==", + "version": "2.10.21", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.21.tgz", + "integrity": "sha512-Q+rUQ7Uz8AHM7DEaNdwvfFCTq7a43lNTzuS94eiWqwyxfV/wJv+oUivef51T91mmRY4d4A1u9rcSvkeufCVXlA==", "license": "Apache-2.0", "bin": { "baseline-browser-mapping": "dist/cli.cjs" @@ -12760,30 +12295,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/boxen/node_modules/ansi-regex": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", - "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/boxen/node_modules/ansi-styles": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", - "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, "node_modules/boxen/node_modules/emoji-regex": { "version": "9.2.2", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", @@ -12807,21 +12318,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/boxen/node_modules/strip-ansi": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", - "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", - "license": "MIT", - "dependencies": { - "ansi-regex": "^6.2.2" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, "node_modules/boxen/node_modules/type-fest": { "version": "2.19.0", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", @@ -12834,23 +12330,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/boxen/node_modules/wrap-ansi": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", - "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", - "license": "MIT", - "dependencies": { - "ansi-styles": "^6.1.0", - "string-width": "^5.0.1", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, "node_modules/brace-expansion": { "version": "5.0.5", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.5.tgz", @@ -12991,6 +12470,18 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/byte-counter": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/byte-counter/-/byte-counter-0.1.0.tgz", + "integrity": "sha512-jheRLVMeUKrDBjVw2O5+k4EvR4t9wtxHL+bo/LxfkxsVeuGMy3a5SEGgXdAFA4FSzTrU8rQXQIrsZ3oBq5a0pQ==", + "license": "MIT", + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/bytes": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", @@ -13044,48 +12535,30 @@ } }, "node_modules/cacheable-lookup": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz", - "integrity": "sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-7.0.0.tgz", + "integrity": "sha512-+qJyx4xiKra8mZrcwhjMRMUhD5NR1R8esPkzIYxX96JiecFoxAXFuz/GpR3+ev4PE1WamHip78wV0vcmPQtp8w==", "license": "MIT", - "peer": true, "engines": { - "node": ">=10.6.0" + "node": ">=14.16" } }, "node_modules/cacheable-request": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.4.tgz", - "integrity": "sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg==", - "license": "MIT", - "peer": true, - "dependencies": { - "clone-response": "^1.0.2", - "get-stream": "^5.1.0", - "http-cache-semantics": "^4.0.0", - "keyv": "^4.0.0", - "lowercase-keys": "^2.0.0", - "normalize-url": "^6.0.1", - "responselike": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/cacheable-request/node_modules/get-stream": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "version": "13.0.18", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-13.0.18.tgz", + "integrity": "sha512-rFWadDRKJs3s2eYdXlGggnBZKG7MTblkFBB0YllFds+UYnfogDp2wcR6JN97FhRkHTvq59n2vhNoHNZn29dh/Q==", "license": "MIT", - "peer": true, "dependencies": { - "pump": "^3.0.0" + "@types/http-cache-semantics": "^4.0.4", + "get-stream": "^9.0.1", + "http-cache-semantics": "^4.2.0", + "keyv": "^5.5.5", + "mimic-response": "^4.0.0", + "normalize-url": "^8.1.1", + "responselike": "^4.0.2" }, "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=18" } }, "node_modules/call-bind": { @@ -13194,9 +12667,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001788", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001788.tgz", - "integrity": "sha512-6q8HFp+lOQtcf7wBK+uEenxymVWkGKkjFpCvw5W25cmMwEDU45p1xQFBQv8JDlMMry7eNxyBaR+qxgmTUZkIRQ==", + "version": "1.0.30001790", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001790.tgz", + "integrity": "sha512-bOoxfJPyYo+ds6W0YfptaCWbFnJYjh2Y1Eow5lRv+vI2u8ganPZqNm1JwNh0t2ELQCqIWg4B3dWEusgAmsoyOw==", "funding": [ { "type": "opencollective", @@ -13400,18 +12873,6 @@ "fsevents": "~2.3.2" } }, - "node_modules/chokidar/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, "node_modules/chownr": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/chownr/-/chownr-3.0.0.tgz", @@ -13431,6 +12892,18 @@ "node": ">=6.0" } }, + "node_modules/chunk-data": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/chunk-data/-/chunk-data-0.1.0.tgz", + "integrity": "sha512-zFyPtyC0SZ6Zu79b9sOYtXZcgrsXe0RpePrzRyj52hYVFG1+Rk6rBqjjOEk+GNQwc3PIX+86teQMok970pod1g==", + "license": "MIT", + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/ci-info": { "version": "3.9.0", "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", @@ -13503,6 +12976,47 @@ "@colors/colors": "1.5.0" } }, + "node_modules/cli-table3/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/cli-table3/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "license": "MIT" + }, + "node_modules/cli-table3/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cli-table3/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/cli-width": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-4.1.0.tgz", @@ -13513,17 +13027,46 @@ } }, "node_modules/cliui": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", - "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-9.0.1.tgz", + "integrity": "sha512-k7ndgKhwoQveBL+/1tqGJYNz097I7WOvwbmmU2AR5+magtbjPWQTS1C5vzGkBC8Ym8UWRzfKUzUUqFLypY4Q+w==", "license": "ISC", "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" + "string-width": "^7.2.0", + "strip-ansi": "^7.1.0", + "wrap-ansi": "^9.0.0" }, + "engines": { + "node": ">=20" + } + }, + "node_modules/cliui/node_modules/ansi-styles": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", + "license": "MIT", "engines": { "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/cliui/node_modules/wrap-ansi": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.2.tgz", + "integrity": "sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.2.1", + "string-width": "^7.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, "node_modules/clone-deep": { @@ -13553,6 +13096,16 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/clone-response/node_modules/mimic-response": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", + "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", + "license": "MIT", + "peer": true, + "engines": { + "node": ">=4" + } + }, "node_modules/clsx": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", @@ -13866,6 +13419,18 @@ "webpack": "^5.1.0" } }, + "node_modules/copy-webpack-plugin/node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, "node_modules/copy-webpack-plugin/node_modules/globby": { "version": "13.2.2", "resolved": "https://registry.npmjs.org/globby/-/globby-13.2.2.tgz", @@ -15017,27 +14582,15 @@ } }, "node_modules/decompress-response": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", - "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-10.0.0.tgz", + "integrity": "sha512-oj7KWToJuuxlPr7VV0vabvxEIiqNMo+q0NueIiL3XhtwC6FVOX7Hr1c0C4eD0bmf7Zr+S/dSf2xvkH3Ad6sU3Q==", "license": "MIT", "dependencies": { - "mimic-response": "^3.1.0" - }, - "engines": { - "node": ">=10" + "mimic-response": "^4.0.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/decompress-response/node_modules/mimic-response": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", - "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", - "license": "MIT", "engines": { - "node": ">=10" + "node": ">=20" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -15467,9 +15020,9 @@ } }, "node_modules/dompurify": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.4.0.tgz", - "integrity": "sha512-nolgK9JcaUXMSmW+j1yaSvaEaoXYHwWyGJlkoCTghc97KgGDDSnpoU/PlEnw63Ah+TGKFOyY+X5LnxaWbCSfXg==", + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.4.1.tgz", + "integrity": "sha512-JahakDAIg1gyOm7dlgWSDjV4n7Ip2PKR55NIT6jrMfIgLFgWo81vdr1/QGqWtFNRqXP9UV71oVePtjqS2ebnPw==", "license": "(MPL-2.0 OR Apache-2.0)", "optionalDependencies": { "@types/trusted-types": "^2.0.7" @@ -15568,9 +15121,9 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.5.336", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.336.tgz", - "integrity": "sha512-AbH9q9J455r/nLmdNZes0G0ZKcRX73FicwowalLs6ijwOmCJSRRrLX63lcAlzy9ux3dWK1w1+1nsBJEWN11hcQ==", + "version": "1.5.343", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.343.tgz", + "integrity": "sha512-YHnQ3MXI08icvL9ZKnEBy05F2EQ8ob01UaMOuMbM8l+4UcAq6MPPbBTJBbsBUg3H8JeZNt+O4fjsoWth3p6IFg==", "license": "ISC" }, "node_modules/elliptic": { @@ -15595,9 +15148,9 @@ "license": "MIT" }, "node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "version": "10.6.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.6.0.tgz", + "integrity": "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==", "license": "MIT" }, "node_modules/emojilib": { @@ -15882,18 +15435,18 @@ } }, "node_modules/eslint": { - "version": "10.2.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-10.2.0.tgz", - "integrity": "sha512-+L0vBFYGIpSNIt/KWTpFonPrqYvgKw1eUI5Vn7mEogrQcWtWYtNQ7dNqC+px/J0idT3BAkiWrhfS7k+Tum8TUA==", + "version": "10.2.1", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-10.2.1.tgz", + "integrity": "sha512-wiyGaKsDgqXvF40P8mDwiUp/KQjE1FdrIEJsM8PZ3XCiniTMXS3OHWWUe5FI5agoCnr8x4xPrTDZuxsBlNHl+Q==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.8.0", "@eslint-community/regexpp": "^4.12.2", - "@eslint/config-array": "^0.23.4", - "@eslint/config-helpers": "^0.5.4", - "@eslint/core": "^1.2.0", - "@eslint/plugin-kit": "^0.7.0", + "@eslint/config-array": "^0.23.5", + "@eslint/config-helpers": "^0.5.5", + "@eslint/core": "^1.2.1", + "@eslint/plugin-kit": "^0.7.1", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/retry": "^0.4.2", @@ -16276,16 +15829,53 @@ "url": "https://opencollective.com/eslint" } }, - "node_modules/espree": { - "version": "11.2.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-11.2.0.tgz", - "integrity": "sha512-7p3DrVEIopW1B1avAGLuCSh1jubc01H2JHc8B4qqGblmg5gI9yumBgACjWo4JlIc04ufug4xJ3SQI8HkS/Rgzw==", + "node_modules/eslint/node_modules/ajv": { + "version": "6.14.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.14.0.tgz", + "integrity": "sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw==", "dev": true, - "license": "BSD-2-Clause", + "license": "MIT", "dependencies": { - "acorn": "^8.16.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^5.0.1" + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/eslint/node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/eslint/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true, + "license": "MIT" + }, + "node_modules/espree": { + "version": "11.2.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-11.2.0.tgz", + "integrity": "sha512-7p3DrVEIopW1B1avAGLuCSh1jubc01H2JHc8B4qqGblmg5gI9yumBgACjWo4JlIc04ufug4xJ3SQI8HkS/Rgzw==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.16.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^5.0.1" }, "engines": { "node": "^20.19.0 || ^22.13.0 || >=24" @@ -16614,6 +16204,18 @@ "url": "https://github.com/sindresorhus/execa?sponsor=1" } }, + "node_modules/execa/node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/execa/node_modules/signal-exit": { "version": "3.0.7", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", @@ -16802,18 +16404,6 @@ "node": ">=8.6.0" } }, - "node_modules/fast-glob/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, "node_modules/fast-json-stable-stringify": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", @@ -17004,6 +16594,37 @@ "webpack": "^4.0.0 || ^5.0.0" } }, + "node_modules/file-loader/node_modules/ajv": { + "version": "6.14.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.14.0.tgz", + "integrity": "sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw==", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/file-loader/node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "license": "MIT", + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/file-loader/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "license": "MIT" + }, "node_modules/file-loader/node_modules/schema-utils": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", @@ -17144,6 +16765,16 @@ "node": ">=16" } }, + "node_modules/flat-cache/node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "json-buffer": "3.0.1" + } + }, "node_modules/flatted": { "version": "3.4.2", "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.4.2.tgz", @@ -17419,12 +17050,28 @@ } }, "node_modules/get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-9.0.1.tgz", + "integrity": "sha512-kVCxPF3vQM/N0B1PmoqVUqgHP+EeVjmZSQn+1oCRPxd2P21P2F19lIgbR3HBosbB1PUhOAoctJnfEn2GbN2eZA==", "license": "MIT", + "dependencies": { + "@sec-ant/readable-stream": "^0.4.1", + "is-stream": "^4.0.1" + }, "engines": { - "node": ">=10" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/get-stream/node_modules/is-stream": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-4.0.1.tgz", + "integrity": "sha512-Dnz92NInDqYckGEUJv689RbRiTSEHCQ7wOVeALbkOz999YpqT46yMRIGtSNl2iCL1waAZSx40+h59NV/EwzV/A==", + "license": "MIT", + "engines": { + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -17474,15 +17121,15 @@ } }, "node_modules/glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", "license": "ISC", "dependencies": { - "is-glob": "^4.0.3" + "is-glob": "^4.0.1" }, "engines": { - "node": ">=10.13.0" + "node": ">= 6" } }, "node_modules/glob-to-regex.js": { @@ -17613,6 +17260,153 @@ "url": "https://github.com/sindresorhus/got?sponsor=1" } }, + "node_modules/got/node_modules/@sindresorhus/is": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", + "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==", + "license": "MIT", + "peer": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/is?sponsor=1" + } + }, + "node_modules/got/node_modules/cacheable-lookup": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz", + "integrity": "sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==", + "license": "MIT", + "peer": true, + "engines": { + "node": ">=10.6.0" + } + }, + "node_modules/got/node_modules/cacheable-request": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.4.tgz", + "integrity": "sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg==", + "license": "MIT", + "peer": true, + "dependencies": { + "clone-response": "^1.0.2", + "get-stream": "^5.1.0", + "http-cache-semantics": "^4.0.0", + "keyv": "^4.0.0", + "lowercase-keys": "^2.0.0", + "normalize-url": "^6.0.1", + "responselike": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/got/node_modules/decompress-response": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", + "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", + "license": "MIT", + "peer": true, + "dependencies": { + "mimic-response": "^3.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/got/node_modules/get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "license": "MIT", + "peer": true, + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/got/node_modules/http2-wrapper": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-1.0.3.tgz", + "integrity": "sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==", + "license": "MIT", + "peer": true, + "dependencies": { + "quick-lru": "^5.1.1", + "resolve-alpn": "^1.0.0" + }, + "engines": { + "node": ">=10.19.0" + } + }, + "node_modules/got/node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "license": "MIT", + "peer": true, + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/got/node_modules/lowercase-keys": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", + "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", + "license": "MIT", + "peer": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/got/node_modules/mimic-response": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", + "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", + "license": "MIT", + "peer": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/got/node_modules/normalize-url": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", + "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==", + "license": "MIT", + "peer": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/got/node_modules/responselike": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/responselike/-/responselike-2.0.1.tgz", + "integrity": "sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==", + "license": "MIT", + "peer": true, + "dependencies": { + "lowercase-keys": "^2.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/gql.tada": { "version": "1.9.2", "resolved": "https://registry.npmjs.org/gql.tada/-/gql.tada-1.9.2.tgz", @@ -17791,9 +17585,9 @@ } }, "node_modules/hasown": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", - "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.3.tgz", + "integrity": "sha512-ej4AhfhfL2Q2zpMmLo7U1Uv9+PyhIZpgQLGT1F9miIGmiCJIoCgSmczFdrc97mWT4kVY72KA+WnnhJ5pghSvSg==", "license": "MIT", "dependencies": { "function-bind": "^1.1.2" @@ -18141,9 +17935,9 @@ } }, "node_modules/html-webpack-plugin": { - "version": "5.6.6", - "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-5.6.6.tgz", - "integrity": "sha512-bLjW01UTrvoWTJQL5LsMRo1SypHW80FTm12OJRSnr3v6YHNhfe+1r0MYUZJMACxnCHURVnBWRwAsWs2yPU9Ezw==", + "version": "5.6.7", + "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-5.6.7.tgz", + "integrity": "sha512-md+vXtdCAe60s1k6AU3dUyMJnDxUyQAwfwPKoLisvgUF1IXjtlLsk2se54+qfL9Mdm26bbwvjJybpNx48NKRLw==", "license": "MIT", "dependencies": { "@types/html-minifier-terser": "^6.0.0", @@ -18328,14 +18122,13 @@ "license": "MIT" }, "node_modules/http2-wrapper": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-1.0.3.tgz", - "integrity": "sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-2.2.1.tgz", + "integrity": "sha512-V5nVw1PAOgfI3Lmeaj2Exmeg7fenjhRUgz1lPSezy1CuhPYbgQtbQj4jZfEAEMlaL+vupsvhjqCyjzob0yxsmQ==", "license": "MIT", - "peer": true, "dependencies": { "quick-lru": "^5.1.1", - "resolve-alpn": "^1.0.0" + "resolve-alpn": "^1.2.0" }, "engines": { "node": ">=10.19.0" @@ -19045,6 +18838,20 @@ "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", "license": "MIT" }, + "node_modules/jayson/node_modules/utf-8-validate": { + "version": "5.0.10", + "resolved": "https://registry.npmjs.org/utf-8-validate/-/utf-8-validate-5.0.10.tgz", + "integrity": "sha512-Z6czzLq4u8fPOyx7TU6X3dvUZVvoJmxSQ+IcrlmagKhilxlhZgxPK6C5Jqbkw1IDUmFTM+cz9QDnnLTwDz/2gQ==", + "extraneous": true, + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "node-gyp-build": "^4.3.0" + }, + "engines": { + "node": ">=6.14.2" + } + }, "node_modules/jayson/node_modules/uuid": { "version": "8.3.2", "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", @@ -19280,9 +19087,9 @@ } }, "node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", "license": "MIT" }, "node_modules/json-stable-stringify-without-jsonify": { @@ -19311,9 +19118,9 @@ } }, "node_modules/jsonfile": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz", - "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==", + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.1.tgz", + "integrity": "sha512-zwOTdL3rFQ/lRdBnntKVOX6k5cKJwEc1HdilT71BWEu7J41gXIB2MRp+vxduPSwZJPWBxEzv4yH1wYLJGUHX4Q==", "license": "MIT", "dependencies": { "universalify": "^2.0.0" @@ -19381,12 +19188,12 @@ } }, "node_modules/keyv": { - "version": "4.5.4", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", - "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-5.6.0.tgz", + "integrity": "sha512-CYDD3SOtsHtyXeEORYRx2qBtpDJFjRTGXUtmNEMGyzYOKj1TE3tycdlho7kA1Ufx9OYWZzg52QFBGALTirzDSw==", "license": "MIT", "dependencies": { - "json-buffer": "3.0.1" + "@keyv/serialize": "^1.1.1" } }, "node_modules/khroma": { @@ -19647,23 +19454,24 @@ } }, "node_modules/lowercase-keys": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", - "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-4.0.1.tgz", + "integrity": "sha512-wI9Nui/L8VfADa/cr/7NQruaASk1k23/Uh1khQ02BCVYiiy8F4AhOGnQzJy3Fl/c44GnYSbZHv8g7EcG3kJ1Qg==", "license": "MIT", - "peer": true, "engines": { - "node": ">=8" + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/lru-cache": { - "version": "11.3.5", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.3.5.tgz", - "integrity": "sha512-NxVFwLAnrd9i7KUBxC4DrUhmgjzOs+1Qm50D3oF1/oL+r1NpZ4gA7xvG0/zJ8evR7zIKn4vLf7qTNduWFtCrRw==", - "dev": true, - "license": "BlueOak-1.0.0", - "engines": { - "node": "20 || >=22" + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "license": "ISC", + "dependencies": { + "yallist": "^3.0.2" } }, "node_modules/lunr": { @@ -20186,19 +19994,19 @@ } }, "node_modules/memfs": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/memfs/-/memfs-4.57.1.tgz", - "integrity": "sha512-WvzrWPwMQT+PtbX2Et64R4qXKK0fj/8pO85MrUCzymX3twwCiJCdvntW3HdhG1teLJcHDDLIKx5+c3HckWYZtQ==", + "version": "4.57.2", + "resolved": "https://registry.npmjs.org/memfs/-/memfs-4.57.2.tgz", + "integrity": "sha512-2nWzSsJzrukurSDna4Z0WywuScK4Id3tSKejgu74u8KCdW4uNrseKRSIDg75C6Yw5ZRqBe0F0EtMNlTbUq8bAQ==", "license": "Apache-2.0", "dependencies": { - "@jsonjoy.com/fs-core": "4.57.1", - "@jsonjoy.com/fs-fsa": "4.57.1", - "@jsonjoy.com/fs-node": "4.57.1", - "@jsonjoy.com/fs-node-builtins": "4.57.1", - "@jsonjoy.com/fs-node-to-fsa": "4.57.1", - "@jsonjoy.com/fs-node-utils": "4.57.1", - "@jsonjoy.com/fs-print": "4.57.1", - "@jsonjoy.com/fs-snapshot": "4.57.1", + "@jsonjoy.com/fs-core": "4.57.2", + "@jsonjoy.com/fs-fsa": "4.57.2", + "@jsonjoy.com/fs-node": "4.57.2", + "@jsonjoy.com/fs-node-builtins": "4.57.2", + "@jsonjoy.com/fs-node-to-fsa": "4.57.2", + "@jsonjoy.com/fs-node-utils": "4.57.2", + "@jsonjoy.com/fs-print": "4.57.2", + "@jsonjoy.com/fs-snapshot": "4.57.2", "@jsonjoy.com/json-pack": "^1.11.0", "@jsonjoy.com/util": "^1.9.0", "glob-to-regex.js": "^1.0.1", @@ -22148,13 +21956,15 @@ } }, "node_modules/mimic-response": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", - "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-4.0.0.tgz", + "integrity": "sha512-e5ISH9xMYU0DzrT+jl8q2ze9D6eWBto+I8CNpe+VI+K2J/F/k3PdkdTdz4wvGVH4NTpo+NRYTVIuMQEMMcsLqg==", "license": "MIT", - "peer": true, "engines": { - "node": ">=4" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/mini-css-extract-plugin": { @@ -22426,6 +22236,18 @@ "node": ">=18" } }, + "node_modules/node-emoji/node_modules/@sindresorhus/is": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", + "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/is?sponsor=1" + } + }, "node_modules/node-fetch": { "version": "2.7.0", "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", @@ -22509,9 +22331,9 @@ "license": "MIT" }, "node_modules/node-releases": { - "version": "2.0.37", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.37.tgz", - "integrity": "sha512-1h5gKZCF+pO/o3Iqt5Jp7wc9rH3eJJ0+nh/CIoiRwjRxde/hAHyLPXYN4V3CqKAbiZPSeJFSWHmJsbkicta0Eg==", + "version": "2.0.38", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.38.tgz", + "integrity": "sha512-3qT/88Y3FbH/Kx4szpQQ4HzUbVrHPKTLVpVocKiLfoYvw9XSGOX2FmD2d6DrXbVYyAQTF2HeF6My8jmzx7/CRw==", "license": "MIT" }, "node_modules/normalize-path": { @@ -22524,13 +22346,12 @@ } }, "node_modules/normalize-url": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", - "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==", + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-8.1.1.tgz", + "integrity": "sha512-JYc0DPlpGWB40kH5g07gGTrYuMqV653k3uBKY6uITPWds3M0ov3GaWGp9lbE3Bzngx8+XkfzgvASb9vk9JDFXQ==", "license": "MIT", - "peer": true, "engines": { - "node": ">=10" + "node": ">=14.16" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -22579,13 +22400,44 @@ "node": ">= 10.13.0" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" + } + }, + "node_modules/null-loader/node_modules/ajv": { + "version": "6.14.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.14.0.tgz", + "integrity": "sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw==", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/null-loader/node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "license": "MIT", "peerDependencies": { - "webpack": "^4.0.0 || ^5.0.0" + "ajv": "^6.9.1" } }, + "node_modules/null-loader/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "license": "MIT" + }, "node_modules/null-loader/node_modules/schema-utils": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", @@ -22896,36 +22748,6 @@ "node": ">=18" } }, - "node_modules/openapi-to-postmanv2/node_modules/ajv": { - "version": "8.18.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.18.0.tgz", - "integrity": "sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A==", - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.3", - "fast-uri": "^3.0.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/openapi-to-postmanv2/node_modules/ajv-draft-04": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/ajv-draft-04/-/ajv-draft-04-1.0.0.tgz", - "integrity": "sha512-mv00Te6nmYbRp5DCwclxtt7yV/joXJPGS7nM+97GdxvuttCOfgI3K4U25zboyeX0O+myI8ERluxQe5wljMmVIw==", - "license": "MIT", - "peerDependencies": { - "ajv": "^8.5.0" - }, - "peerDependenciesMeta": { - "ajv": { - "optional": true - } - } - }, "node_modules/openapi-to-postmanv2/node_modules/ajv-formats": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", @@ -22949,12 +22771,6 @@ "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", "license": "MIT" }, - "node_modules/openapi-to-postmanv2/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "license": "MIT" - }, "node_modules/openapi-to-postmanv2/node_modules/yaml": { "version": "1.10.3", "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.3.tgz", @@ -22998,9 +22814,9 @@ } }, "node_modules/ox": { - "version": "0.14.15", - "resolved": "https://registry.npmjs.org/ox/-/ox-0.14.15.tgz", - "integrity": "sha512-3TubCmbKen/cuZQzX0qDbOS5lojjdSZ90lqKxWIDWd5siuJ0IJBaTXMYs8eMPLcraqnOwGZazz3apHPGiRCkGQ==", + "version": "0.14.20", + "resolved": "https://registry.npmjs.org/ox/-/ox-0.14.20.tgz", + "integrity": "sha512-rby38C3nDn8eQkf29Zgw4hkCZJ64Qqi0zRPWL8ENUQ7JVuoITqrVtwWQgM/He19SCMUEc7hS/Sjw0jIOSLJhOw==", "dev": true, "funding": [ { @@ -23443,6 +23259,16 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/path-scurry/node_modules/lru-cache": { + "version": "11.3.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.3.5.tgz", + "integrity": "sha512-NxVFwLAnrd9i7KUBxC4DrUhmgjzOs+1Qm50D3oF1/oL+r1NpZ4gA7xvG0/zJ8evR7zIKn4vLf7qTNduWFtCrRw==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": "20 || >=22" + } + }, "node_modules/path-to-regexp": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.9.0.tgz", @@ -25358,9 +25184,9 @@ } }, "node_modules/prettier": { - "version": "3.8.1", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.8.1.tgz", - "integrity": "sha512-UOnG6LftzbdaHZcKoPFtOcCKztrQ57WkHDeRD9t/PTQtmT0NHSeWWepj6pS0z/N7+08BHFDQVUrfmfMRcZwbMg==", + "version": "3.8.3", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.8.3.tgz", + "integrity": "sha512-7igPTM53cGHMW8xWuVTydi2KO233VFiTNyF5hLJqpilHfmn8C8gPf+PS7dUT64YcXFbiMGZxS9pCSxL/Dxm/Jw==", "dev": true, "license": "MIT", "bin": { @@ -25534,23 +25360,6 @@ "url": "https://github.com/sindresorhus/execa?sponsor=1" } }, - "node_modules/prool/node_modules/get-stream": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-9.0.1.tgz", - "integrity": "sha512-kVCxPF3vQM/N0B1PmoqVUqgHP+EeVjmZSQn+1oCRPxd2P21P2F19lIgbR3HBosbB1PUhOAoctJnfEn2GbN2eZA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@sec-ant/readable-stream": "^0.4.1", - "is-stream": "^4.0.1" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/prool/node_modules/human-signals": { "version": "8.0.1", "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-8.0.1.tgz", @@ -25845,26 +25654,32 @@ } }, "node_modules/react": { - "version": "19.2.5", - "resolved": "https://registry.npmjs.org/react/-/react-19.2.5.tgz", - "integrity": "sha512-llUJLzz1zTUBrskt2pwZgLq59AemifIftw4aB7JxOqf1HY2FDaGDxgwpAPVzHU1kdWabH7FauP4i1oEeer2WCA==", + "version": "19.0.0", + "resolved": "https://registry.npmjs.org/react/-/react-19.0.0.tgz", + "integrity": "sha512-V8AVnmPIICiWpGfm6GLzCR/W5FXLchHop40W4nXBmdlEceh16rCN8O8LNWm5bh5XUX91fh7KpA+W0TgMKmgTpQ==", "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/react-dom": { - "version": "19.2.5", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.5.tgz", - "integrity": "sha512-J5bAZz+DXMMwW/wV3xzKke59Af6CHY7G4uYLN1OvBcKEsWOs4pQExj86BBKamxl/Ik5bx9whOrvBlSDfWzgSag==", + "version": "19.0.0", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.0.0.tgz", + "integrity": "sha512-4GV5sHFG0e/0AD4X+ySy6UJd3jVl1iNsNHdpad0qhABJ11twS3TTBnseqsKurKcsNqCEFeGL3uLpVChpIO3QfQ==", "license": "MIT", "dependencies": { - "scheduler": "^0.27.0" + "scheduler": "^0.25.0" }, "peerDependencies": { - "react": "^19.2.5" + "react": "^19.0.0" } }, + "node_modules/react-dom/node_modules/scheduler": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.25.0.tgz", + "integrity": "sha512-xFVuu11jh+xcO7JOAGJNOXld8/TcEHK/4CituBUeUb5hqxJLj9YuemAEuvm9gQ/+pgXYfbQuqAkiYu+u7YEsNA==", + "license": "MIT" + }, "node_modules/react-fast-compare": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/react-fast-compare/-/react-fast-compare-3.2.2.tgz", @@ -25890,9 +25705,9 @@ } }, "node_modules/react-hook-form": { - "version": "7.72.1", - "resolved": "https://registry.npmjs.org/react-hook-form/-/react-hook-form-7.72.1.tgz", - "integrity": "sha512-RhwBoy2ygeVZje+C+bwJ8g0NjTdBmDlJvAUHTxRjTmSUKPYsKfMphkS2sgEMotsY03bP358yEYlnUeZy//D9Ig==", + "version": "7.73.1", + "resolved": "https://registry.npmjs.org/react-hook-form/-/react-hook-form-7.73.1.tgz", + "integrity": "sha512-VAfVYOPcx3piiEVQy95vyFmBwbVUsP/AUIN+mpFG8h11yshDd444nn0VyfaGWSRnhOLVgiDu7HIuBtAIzxn9dA==", "license": "MIT", "engines": { "node": ">=18.0.0" @@ -26503,6 +26318,15 @@ "strip-ansi": "^6.0.1" } }, + "node_modules/renderkid/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/renderkid/node_modules/css-select": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", @@ -26590,6 +26414,18 @@ "entities": "^2.0.0" } }, + "node_modules/renderkid/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", @@ -26694,13 +26530,27 @@ } }, "node_modules/responselike": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/responselike/-/responselike-2.0.1.tgz", - "integrity": "sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/responselike/-/responselike-4.0.2.tgz", + "integrity": "sha512-cGk8IbWEAnaCpdAt1BHzJ3Ahz5ewDJa0KseTsE3qIRMJ3C698W8psM7byCeWVpd/Ha7FUYzuRVzXoKoM6nRUbA==", "license": "MIT", - "peer": true, "dependencies": { - "lowercase-keys": "^2.0.0" + "lowercase-keys": "^3.0.0" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/responselike/node_modules/lowercase-keys": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-3.0.0.tgz", + "integrity": "sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ==", + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -27022,22 +26872,6 @@ "url": "https://opencollective.com/webpack" } }, - "node_modules/schema-utils/node_modules/ajv": { - "version": "8.18.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.18.0.tgz", - "integrity": "sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A==", - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.3", - "fast-uri": "^3.0.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, "node_modules/schema-utils/node_modules/ajv-formats": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", @@ -27055,24 +26889,6 @@ } } }, - "node_modules/schema-utils/node_modules/ajv-keywords": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", - "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.3" - }, - "peerDependencies": { - "ajv": "^8.8.2" - } - }, - "node_modules/schema-utils/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "license": "MIT" - }, "node_modules/scrypt-js": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/scrypt-js/-/scrypt-js-3.0.1.tgz", @@ -27662,6 +27478,33 @@ "simple-concat": "^1.0.0" } }, + "node_modules/simple-get/node_modules/decompress-response": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", + "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", + "license": "MIT", + "dependencies": { + "mimic-response": "^3.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/simple-get/node_modules/mimic-response": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", + "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/sirv": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/sirv/-/sirv-2.0.4.tgz", @@ -27946,17 +27789,20 @@ } }, "node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", + "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", "license": "MIT", "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" }, "engines": { - "node": ">=8" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/stringify-entities": { @@ -27988,15 +27834,18 @@ } }, "node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", + "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", "license": "MIT", "dependencies": { - "ansi-regex": "^5.0.1" + "ansi-regex": "^6.2.2" }, "engines": { - "node": ">=8" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, "node_modules/strip-bom-string": { @@ -28076,9 +27925,9 @@ } }, "node_modules/stylis": { - "version": "4.3.6", - "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.3.6.tgz", - "integrity": "sha512-yQ3rwFWRfwNUY7H5vpU0wfdkNSnvnJinhF9830Swlaxl03zsOjCfmX0ugac+3LtK0lYSgwL/KXc8oYL3mG4YFQ==", + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.4.0.tgz", + "integrity": "sha512-5Z9ZpRzfuH6l/UAvCPAPUo3665Nk2wLaZU3x+TLHKVzIz33+sbJqbtrYoC3KD4/uVOr2Zp+L0LySezP9OHV9yA==", "license": "MIT" }, "node_modules/sucrase": { @@ -28298,6 +28147,18 @@ "tailwindcss": ">=3.0.0 || insiders" } }, + "node_modules/tailwindcss/node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, "node_modules/tailwindcss/node_modules/lilconfig": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", @@ -28308,9 +28169,9 @@ } }, "node_modules/tapable": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.2.tgz", - "integrity": "sha512-1MOpMXuhGzGL5TTCZFItxCc0AARf1EZFQkGqMm7ERKj8+Hgr5oLvJOVFcC+lRmR8hCe2S3jC4T5D7Vg/d7/fhA==", + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.3.tgz", + "integrity": "sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A==", "license": "MIT", "engines": { "node": ">=6" @@ -28371,6 +28232,16 @@ "node": ">=6" } }, + "node_modules/tar/node_modules/yallist": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-5.0.0.tgz", + "integrity": "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=18" + } + }, "node_modules/terser": { "version": "5.46.1", "resolved": "https://registry.npmjs.org/terser/-/terser-5.46.1.tgz", @@ -28777,9 +28648,9 @@ } }, "node_modules/type-fest": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-5.5.0.tgz", - "integrity": "sha512-PlBfpQwiUvGViBNX84Yxwjsdhd1TUlXr6zjX7eoirtCPIr08NAmxwa+fcYBTeRQxHo9YC9wwF3m9i700sHma8g==", + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-5.6.0.tgz", + "integrity": "sha512-8ZiHFm91orbSAe2PSAiSVBVko18pbhbiB3U9GglSzF/zCGkR+rxpHx6sEMCUm4kxY4LjDIUGgCfUMtwfZfjfUA==", "license": "(MIT OR CC0-1.0)", "dependencies": { "tagged-tag": "^1.0.0" @@ -28861,9 +28732,9 @@ } }, "node_modules/typescript": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-6.0.2.tgz", - "integrity": "sha512-bGdAIrZ0wiGDo5l8c++HWtbaNCWTS4UTv7RaTH/ThVIgjkveJt83m74bBHMJkuCbslY8ixgLBVZJIOiQlQTjfQ==", + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-6.0.3.tgz", + "integrity": "sha512-y2TvuxSZPDyQakkFRPZHKFm+KKVqIisdg9/CZwm9ftvKXLP8NRWj38/ODjNbr43SsoXqNuAisEf1GdCxqWcdBw==", "license": "Apache-2.0", "bin": { "tsc": "bin/tsc", @@ -28874,16 +28745,16 @@ } }, "node_modules/typescript-eslint": { - "version": "8.58.1", - "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.58.1.tgz", - "integrity": "sha512-gf6/oHChByg9HJvhMO1iBexJh12AqqTfnuxscMDOVqfJW3htsdRJI/GfPpHTTcyeB8cSTUY2JcZmVgoyPqcrDg==", + "version": "8.59.0", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.59.0.tgz", + "integrity": "sha512-BU3ONW9X+v90EcCH9ZS6LMackcVtxRLlI3XrYyqZIwVSHIk7Qf7bFw1z0M9Q0IUxhTMZCf8piY9hTYaNEIASrw==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/eslint-plugin": "8.58.1", - "@typescript-eslint/parser": "8.58.1", - "@typescript-eslint/typescript-estree": "8.58.1", - "@typescript-eslint/utils": "8.58.1" + "@typescript-eslint/eslint-plugin": "8.59.0", + "@typescript-eslint/parser": "8.59.0", + "@typescript-eslint/typescript-estree": "8.59.0", + "@typescript-eslint/utils": "8.59.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -28910,6 +28781,18 @@ "integrity": "sha512-yDJTmhydvl5lJzBmy/hyOAA0d+aqCBuwl818haVdYCRrWV84o7YyeVm4QlVHStqNrrJSTb6jKuFAVqAFsr+K3Q==", "license": "MIT" }, + "node_modules/uint8array-extras": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/uint8array-extras/-/uint8array-extras-1.5.0.tgz", + "integrity": "sha512-rvKSBiC5zqCCiDZ9kAOszZcDvdAHwwIKJG33Ykj43OKcWsnmcBRL09YTU4nOeHZ8Y2a7l1MgTd08SBe9A8Qj6A==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/undici": { "version": "7.25.0", "resolved": "https://registry.npmjs.org/undici/-/undici-7.25.0.tgz", @@ -28920,9 +28803,9 @@ } }, "node_modules/undici-types": { - "version": "7.18.2", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.18.2.tgz", - "integrity": "sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w==", + "version": "7.19.2", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.19.2.tgz", + "integrity": "sha512-qYVnV5OEm2AW8cJMCpdV20CDyaN3g0AjDlOGf1OW4iaDEx8MwdtChUp4zu4H0VP3nDRF/8RKWH+IPp9uW0YGZg==", "license": "MIT" }, "node_modules/unicode-canonical-property-names-ecmascript": { @@ -29209,18 +29092,6 @@ "url": "https://github.com/yeoman/update-notifier?sponsor=1" } }, - "node_modules/update-notifier/node_modules/ansi-regex": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", - "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, "node_modules/update-notifier/node_modules/ansi-styles": { "version": "6.2.3", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", @@ -29279,44 +29150,6 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/update-notifier/node_modules/emoji-regex": { - "version": "10.6.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.6.0.tgz", - "integrity": "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==", - "license": "MIT" - }, - "node_modules/update-notifier/node_modules/string-width": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", - "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", - "license": "MIT", - "dependencies": { - "emoji-regex": "^10.3.0", - "get-east-asian-width": "^1.0.0", - "strip-ansi": "^7.1.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/update-notifier/node_modules/strip-ansi": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", - "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", - "license": "MIT", - "dependencies": { - "ansi-regex": "^6.2.2" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, "node_modules/update-notifier/node_modules/type-fest": { "version": "4.41.0", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.41.0.tgz", @@ -29410,6 +29243,37 @@ } } }, + "node_modules/url-loader/node_modules/ajv": { + "version": "6.14.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.14.0.tgz", + "integrity": "sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw==", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/url-loader/node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "license": "MIT", + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/url-loader/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "license": "MIT" + }, "node_modules/url-loader/node_modules/schema-utils": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", @@ -29661,9 +29525,9 @@ } }, "node_modules/viem": { - "version": "2.47.18", - "resolved": "https://registry.npmjs.org/viem/-/viem-2.47.18.tgz", - "integrity": "sha512-m3kr+/i8MddeY5fmB2y2v5B0vDL0x8R4v/8gai4Lh4jh8KOWlQqml7PFLtilNomoDm3mINxdA0JnYBJfknNoEg==", + "version": "2.48.4", + "resolved": "https://registry.npmjs.org/viem/-/viem-2.48.4.tgz", + "integrity": "sha512-mReP/rgY2P+WeeRSG4sUvccCLKfyAW1C73Y3KkobAqgzYmVna9qyUMNE44xIUkDtfvRuC33r24UhF4baBYovsg==", "dev": true, "funding": [ { @@ -29679,7 +29543,7 @@ "@scure/bip39": "1.6.0", "abitype": "1.2.3", "isows": "1.0.7", - "ox": "0.14.15", + "ox": "0.14.20", "ws": "8.18.3" }, "peerDependencies": { @@ -29707,6 +29571,28 @@ "url": "https://paulmillr.com/funding/" } }, + "node_modules/viem/node_modules/abitype": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/abitype/-/abitype-1.2.3.tgz", + "integrity": "sha512-Ofer5QUnuUdTFsBRwARMoWKOH1ND5ehwYhJ3OJ/BQO+StkwQjHw0XyVh4vDttzHB7QOFhPHa/o413PJ82gU/Tg==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/wevm" + }, + "peerDependencies": { + "typescript": ">=5.0.4", + "zod": "^3.22.0 || ^4.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + }, + "zod": { + "optional": true + } + } + }, "node_modules/viem/node_modules/ws": { "version": "8.18.3", "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.3.tgz", @@ -29907,6 +29793,20 @@ "node": ">= 10" } }, + "node_modules/webpack-bundle-analyzer/node_modules/utf-8-validate": { + "version": "5.0.10", + "resolved": "https://registry.npmjs.org/utf-8-validate/-/utf-8-validate-5.0.10.tgz", + "integrity": "sha512-Z6czzLq4u8fPOyx7TU6X3dvUZVvoJmxSQ+IcrlmagKhilxlhZgxPK6C5Jqbkw1IDUmFTM+cz9QDnnLTwDz/2gQ==", + "extraneous": true, + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "node-gyp-build": "^4.3.0" + }, + "engines": { + "node": ">=6.14.2" + } + }, "node_modules/webpack-bundle-analyzer/node_modules/ws": { "version": "7.5.10", "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", @@ -30304,18 +30204,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/widest-line/node_modules/ansi-regex": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", - "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, "node_modules/widest-line/node_modules/emoji-regex": { "version": "9.2.2", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", @@ -30339,21 +30227,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/widest-line/node_modules/strip-ansi": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", - "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", - "license": "MIT", - "dependencies": { - "ansi-regex": "^6.2.2" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, "node_modules/wildcard": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.1.tgz", @@ -30371,22 +30244,57 @@ } }, "node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", "license": "MIT", "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" }, "engines": { - "node": ">=10" + "node": ">=12" }, "funding": { "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, + "node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "license": "MIT" + }, + "node_modules/wrap-ansi/node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "license": "MIT", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", @@ -30517,14 +30425,10 @@ } }, "node_modules/yallist": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-5.0.0.tgz", - "integrity": "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==", - "dev": true, - "license": "BlueOak-1.0.0", - "engines": { - "node": ">=18" - } + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "license": "ISC" }, "node_modules/yaml": { "version": "2.8.3", @@ -30574,6 +30478,78 @@ "node": ">=12" } }, + "node_modules/yargs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs/node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "license": "MIT" + }, + "node_modules/yargs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs/node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, "node_modules/yocto-queue": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", diff --git a/package.json b/package.json index c8664e97..f35433a5 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@chainlink/ccip-tools-ts", - "version": "1.4.2", + "version": "1.5.0", "description": "CLI and library to interact with CCIP", "author": "Chainlink devs", "license": "MIT", @@ -27,18 +27,18 @@ }, "devDependencies": { "@eslint/js": "^10.0.1", - "@types/node": "25.5.2", + "@types/node": "25.6.0", "c8": "^11.0.0", - "eslint": "^10.2.0", + "eslint": "^10.2.1", "eslint-config-prettier": "^10.1.8", "eslint-plugin-import-x": "^4.16.2", "eslint-plugin-jsdoc": "^62.9.0", "eslint-plugin-prettier": "^5.5.5", "eslint-plugin-tsdoc": "^0.5.2", "glob": "13.0.6", - "prettier": "3.8.1", - "typescript": "6.0.2", - "typescript-eslint": "8.58.1", + "prettier": "3.8.3", + "typescript": "6.0.3", + "typescript-eslint": "8.59.0", "yaml": "2.8.3" }, "overrides": {