From fdffc67151837dc4eabf7db53e6abc8cad66a529 Mon Sep 17 00:00:00 2001 From: evavirseda Date: Wed, 4 Dec 2024 18:16:27 +0100 Subject: [PATCH 01/97] fix validator logo (#4368) --- .../src/lib/ui/utils/generateValidatorsTableColumns.tsx | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/apps/explorer/src/lib/ui/utils/generateValidatorsTableColumns.tsx b/apps/explorer/src/lib/ui/utils/generateValidatorsTableColumns.tsx index 4bbb5b5805f..3f3599704dd 100644 --- a/apps/explorer/src/lib/ui/utils/generateValidatorsTableColumns.tsx +++ b/apps/explorer/src/lib/ui/utils/generateValidatorsTableColumns.tsx @@ -39,12 +39,13 @@ function ValidatorWithImage({ } label={
-
+
Date: Wed, 4 Dec 2024 19:09:37 +0100 Subject: [PATCH 02/97] feat(wallet-dashboard): add staking dialog to vesting page (#4297) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * fix: add staking dialog to vesting page * fix: add enter timlocked amount step in staking dialog * fix: remove comment * fix: add stake new button * fix: add hook new stake to existing banner --------- Co-authored-by: Begoña Álvarez de la Cruz --- .../app/(protected)/vesting/page.tsx | 31 ++- .../Dialogs/Staking/StakeDialog.tsx | 32 +++- .../Dialogs/Staking/views/EnterAmountView.tsx | 4 +- .../views/EnterTimelockedAmountView.tsx | 180 ++++++++++++++++++ .../components/Dialogs/Staking/views/index.ts | 1 + .../lib/utils/vesting/vesting.ts | 2 +- 6 files changed, 235 insertions(+), 15 deletions(-) create mode 100644 apps/wallet-dashboard/components/Dialogs/Staking/views/EnterTimelockedAmountView.tsx diff --git a/apps/wallet-dashboard/app/(protected)/vesting/page.tsx b/apps/wallet-dashboard/app/(protected)/vesting/page.tsx index 34e6673e715..a2d2bfb19fe 100644 --- a/apps/wallet-dashboard/app/(protected)/vesting/page.tsx +++ b/apps/wallet-dashboard/app/(protected)/vesting/page.tsx @@ -3,7 +3,8 @@ 'use client'; -import { Banner, TimelockedUnstakePopup } from '@/components'; +import { Banner, StakeDialog, TimelockedUnstakePopup } from '@/components'; +import { useStakeDialog } from '@/components/Dialogs/Staking/hooks/useStakeDialog'; import { useGetCurrentEpochStartTimestamp, useNotifications, usePopups } from '@/hooks'; import { formatDelegatedTimelockedStake, @@ -87,6 +88,17 @@ function VestingDashboardPage(): JSX.Element { Number(currentEpochMs), ); + const { + isDialogStakeOpen, + stakeDialogView, + setStakeDialogView, + selectedStake, + selectedValidator, + setSelectedValidator, + handleCloseStakeDialog, + handleNewStake, + } = useStakeDialog(); + const nextPayout = getLatestOrEarliestSupplyIncreaseVestingPayout( [...timelockedMapped, ...timelockedstakedMapped], false, @@ -271,9 +283,7 @@ function VestingDashboardPage(): JSX.Element { videoSrc={videoSrc} title="Stake Vested Tokens" subtitle="Earn Rewards" - onButtonClick={() => { - /*Add stake vested tokens dialog flow*/ - }} + onButtonClick={() => handleNewStake()} buttonText="Stake" /> @@ -321,8 +331,21 @@ function VestingDashboardPage(): JSX.Element { ); })}
+
)} + ); } diff --git a/apps/wallet-dashboard/components/Dialogs/Staking/StakeDialog.tsx b/apps/wallet-dashboard/components/Dialogs/Staking/StakeDialog.tsx index bdd129698dd..cc6484119c7 100644 --- a/apps/wallet-dashboard/components/Dialogs/Staking/StakeDialog.tsx +++ b/apps/wallet-dashboard/components/Dialogs/Staking/StakeDialog.tsx @@ -2,7 +2,7 @@ // SPDX-License-Identifier: Apache-2.0 import React, { useMemo } from 'react'; -import { EnterAmountView, SelectValidatorView } from './views'; +import { EnterAmountView, EnterTimelockedAmountView, SelectValidatorView } from './views'; import { useNotifications, useNewStakeTransaction, @@ -34,6 +34,7 @@ export enum StakeDialogView { Details = 'Details', SelectValidator = 'SelectValidator', EnterAmount = 'EnterAmount', + EnterTimelockedAmount = 'EnterTimelockedAmount', Unstake = 'Unstake', } @@ -44,11 +45,12 @@ const INITIAL_VALUES = { interface StakeDialogProps { isOpen: boolean; handleClose: () => void; - isTimelockedStaking?: boolean; - onSuccess?: (digest: string) => void; view?: StakeDialogView; setView?: (view: StakeDialogView) => void; stakedDetails?: ExtendedDelegatedStake | null; + maxStakableTimelockedAmount?: bigint; + isTimelockedStaking?: boolean; + onSuccess?: (digest: string) => void; selectedValidator?: string; setSelectedValidator?: (validator: string) => void; } @@ -61,6 +63,7 @@ export function StakeDialog({ view, setView, stakedDetails, + maxStakableTimelockedAmount, selectedValidator = '', setSelectedValidator, }: StakeDialogProps): JSX.Element { @@ -77,13 +80,13 @@ export function StakeDialog({ const validationSchema = useMemo( () => createValidationSchema( - coinBalance, + maxStakableTimelockedAmount ?? coinBalance, coinSymbol, coinDecimals, view === StakeDialogView.Unstake, minimumStake, ), - [coinBalance, coinSymbol, coinDecimals, view, minimumStake], + [maxStakableTimelockedAmount, coinBalance, coinSymbol, coinDecimals, view, minimumStake], ); const formik = useFormik({ @@ -99,7 +102,6 @@ export function StakeDialog({ const { data: timelockedObjects } = useGetAllOwnedObjects(senderAddress, { StructType: TIMELOCK_IOTA_TYPE, }); - let groupedTimelockObjects: GroupedTimelockObject[] = []; if (isTimelockedStaking && timelockedObjects && currentEpochMs) { groupedTimelockObjects = prepareObjectsForTimelockedStakingTransaction( @@ -133,7 +135,11 @@ export function StakeDialog({ function selectValidatorHandleNext(): void { if (selectedValidator) { - setView?.(StakeDialogView.EnterAmount); + setView?.( + isTimelockedStaking + ? StakeDialogView.EnterTimelockedAmount + : StakeDialogView.EnterAmount, + ); } } @@ -211,6 +217,18 @@ export function StakeDialog({ isTransactionLoading={isTransactionLoading} /> )} + {view === StakeDialogView.EnterTimelockedAmount && ( + 0} + handleClose={handleClose} + onBack={handleBack} + onStake={handleStake} + gasBudget={newStakeData?.gasBudget} + isTransactionLoading={isTransactionLoading} + /> + )} {view === StakeDialogView.Unstake && stakedDetails && ( parseAmount(values.amount, decimals) + BigInt(2) * gasBudgetBigInt; - const shouldShowInsufficientRemainingFundsWarning = - maxTokenFormatted >= values.amount && !hasEnoughRemaingBalance; return ( @@ -134,7 +132,7 @@ function EnterAmountView({ ); }} - {shouldShowInsufficientRemainingFundsWarning ? ( + {!hasEnoughRemaingBalance ? (
void; + onStake: () => void; + gasBudget?: string | number | null; + handleClose: () => void; + hasGroupedTimelockObjects?: boolean; + isTransactionLoading?: boolean; +} + +function EnterTimelockedAmountView({ + selectedValidator: selectedValidatorAddress, + maxStakableTimelockedAmount, + hasGroupedTimelockObjects, + onBack, + onStake, + gasBudget, + handleClose, + isTransactionLoading, +}: EnterTimelockedAmountViewProps): JSX.Element { + const account = useCurrentAccount(); + const accountAddress = account?.address; + + const { values, errors } = useFormikContext(); + const amount = values.amount; + + const { data: system } = useIotaClientQuery('getLatestIotaSystemState'); + const [gas, symbol] = useFormatCoin(gasBudget ?? 0, IOTA_TYPE_ARG); + + const [maxTokenFormatted, maxTokenFormattedSymbol] = useFormatCoin( + maxStakableTimelockedAmount, + IOTA_TYPE_ARG, + CoinFormat.FULL, + ); + + const caption = `${maxTokenFormatted} ${maxTokenFormattedSymbol} Available`; + + const { stakedRewardsStartEpoch, timeBeforeStakeRewardsRedeemableAgoDisplay } = useStakeTxnInfo( + system?.epoch, + ); + + return ( + +
+ +
+
+
+ +
+ +
+ + {({ + field: { onChange, ...field }, + form: { setFieldValue }, + meta, + }: FieldProps) => { + return ( + { + setFieldValue('amount', value, true); + }} + type={InputType.NumericFormat} + label="Amount" + value={amount} + suffix={` ${symbol}`} + placeholder="Enter amount to stake" + errorMessage={ + values.amount && meta.error ? meta.error : undefined + } + caption={caption} + /> + ); + }} + + {!hasGroupedTimelockObjects && !isTransactionLoading ? ( +
+ } + /> +
+ ) : null} +
+ + +
+ + + + +
+
+
+
+
+ +
+
+
+ + ); +} + +export default EnterTimelockedAmountView; diff --git a/apps/wallet-dashboard/components/Dialogs/Staking/views/index.ts b/apps/wallet-dashboard/components/Dialogs/Staking/views/index.ts index 69e70ed7315..8ed3cfb4dee 100644 --- a/apps/wallet-dashboard/components/Dialogs/Staking/views/index.ts +++ b/apps/wallet-dashboard/components/Dialogs/Staking/views/index.ts @@ -2,6 +2,7 @@ // SPDX-License-Identifier: Apache-2.0 export { default as EnterAmountView } from './EnterAmountView'; +export { default as EnterTimelockedAmountView } from './EnterTimelockedAmountView'; export { default as SelectValidatorView } from './SelectValidatorView'; export * from './DetailsView'; export * from './UnstakeView'; diff --git a/apps/wallet-dashboard/lib/utils/vesting/vesting.ts b/apps/wallet-dashboard/lib/utils/vesting/vesting.ts index 0e238c32a45..70a24038841 100644 --- a/apps/wallet-dashboard/lib/utils/vesting/vesting.ts +++ b/apps/wallet-dashboard/lib/utils/vesting/vesting.ts @@ -185,7 +185,7 @@ export function getVestingOverview( const totalAvailableStakingAmount = timelockedObjects.reduce( (acc, current) => current.expirationTimestampMs > currentEpochTimestamp && - current.locked.value > MIN_STAKING_THRESHOLD + current.locked.value >= MIN_STAKING_THRESHOLD ? acc + current.locked.value : acc, 0, From 9f50d1c8ff2d68504976fa8973b498a2115a7471 Mon Sep 17 00:00:00 2001 From: vivekjain23 <165671934+vivekjain23@users.noreply.github.com> Date: Thu, 5 Dec 2024 09:33:39 +0530 Subject: [PATCH 03/97] chore(docs) : Add validator requirements tab snippet. (#4230) * Add validator requirements tab snippet --- .../_snippets/validator-requirements-tab.mdx | 23 ++++++++++++++++ docs/content/about-iota/FAQ.mdx | 26 +++---------------- docs/content/operator/validator-config.mdx | 19 ++------------ 3 files changed, 28 insertions(+), 40 deletions(-) create mode 100644 docs/content/_snippets/validator-requirements-tab.mdx diff --git a/docs/content/_snippets/validator-requirements-tab.mdx b/docs/content/_snippets/validator-requirements-tab.mdx new file mode 100644 index 00000000000..ab2b951616b --- /dev/null +++ b/docs/content/_snippets/validator-requirements-tab.mdx @@ -0,0 +1,23 @@ + + + + +- **RAM:** 128 GB +- **CPU:** 24-core processor +- **Storage:** 4 TB +- **Network Uplink:** 1 Gbps +- **Minimum Stake:** 2 million IOTAs (can be achieved through delegation) + + + + + +- **RAM:** 64 GB +- **CPU:** 8-core processor +- **Storage:** 2 TB +- **Network Uplink:** 1 Gbps +- **Minimum Stake:** 2 million IOTAs (can be achieved through delegation) + + + + \ No newline at end of file diff --git a/docs/content/about-iota/FAQ.mdx b/docs/content/about-iota/FAQ.mdx index 119c28021a8..6fe8086775e 100644 --- a/docs/content/about-iota/FAQ.mdx +++ b/docs/content/about-iota/FAQ.mdx @@ -1,3 +1,5 @@ +import ValidatorRequirementsTab from '../_snippets/validator-requirements-tab.mdx' + --- description: Frequently asked question about IOTA Rebased, Move and the IOTA Rebased Proposal. --- @@ -24,29 +26,7 @@ To participate: [Validators](https://docs.iota.org/operator/validator-operation/validator-tasks) are expected to have: - - - - -- **RAM:** 128 GB -- **CPU:** 24-core processor -- **Storage:** 4 TB -- **Network Uplink:** 1 Gbps -- **Minimum Stake:** 2 million IOTAs (can be achieved through delegation) - - - - - -- **RAM:** 64 GB -- **CPU:** 8-core processor -- **Storage:** 2 TB -- **Network Uplink:** 1 Gbps -- **Minimum Stake:** 2 million IOTAs (can be achieved through delegation) - - - - + ## 4. What happens to the existing IOTA EVM? diff --git a/docs/content/operator/validator-config.mdx b/docs/content/operator/validator-config.mdx index 0c8f36e7b4c..29b0c05e794 100644 --- a/docs/content/operator/validator-config.mdx +++ b/docs/content/operator/validator-config.mdx @@ -6,6 +6,7 @@ description: Learn how to set up, configure, and manage an IOTA Validator node, import StakingPoolReqs from "../_snippets/staking-pool-reqs.mdx"; import Quiz from '@site/src/components/Quiz'; import questions from '/json/node-operators/validator-config.json'; +import ValidatorRequirements from "../_snippets/validator-requirements-tab.mdx" Validators on the IOTA network run special nodes and have additional tasks and responsibilities beyond those of Full node operators. @@ -28,23 +29,7 @@ Specific steps you must take include: -## Hardware requirements to run a Validator node on Mainnet - -Suggested minimum hardware specifications to run an IOTA Validator node on Mainnet: - -- CPU: 24 physical cores (or 48 virtual cores) -- Memory: 128 GB -- Storage: 4 TB NVME -- Network: 1 Gbps - -## Hardware requirements to run a Validator node on Testnet - -Suggested minimum hardware specifications to run an IOTA Validator node on Testnet: - -- CPU: 8 cores -- Memory: 64 GB -- Storage: 2 TB NVME -- Network: 1 Gbps + ## Validator consensus and voting power From 067ebf3ad73dc6fbe4c968df406fdd0d5fbc9a86 Mon Sep 17 00:00:00 2001 From: vivekjain23 <165671934+vivekjain23@users.noreply.github.com> Date: Thu, 5 Dec 2024 09:34:21 +0530 Subject: [PATCH 04/97] fix(docs) : fix css for CTF component. (#4208) * Fix CSS for the CTF component. --- docs/site/src/components/CTF/ctf-verifier.tsx | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/docs/site/src/components/CTF/ctf-verifier.tsx b/docs/site/src/components/CTF/ctf-verifier.tsx index 530ddf2d44f..d6ee34965ca 100644 --- a/docs/site/src/components/CTF/ctf-verifier.tsx +++ b/docs/site/src/components/CTF/ctf-verifier.tsx @@ -5,6 +5,7 @@ import { } from '@iota/dapp-kit'; import { QueryClient, QueryClientProvider } from '@tanstack/react-query'; import { getFullnodeUrl, IotaClient } from '@iota/iota-sdk/client'; +import clsx from 'clsx'; // Define props interface interface ChallengeVerifierProps { @@ -45,18 +46,19 @@ const ChallengeVerifier: React.FC = ({ expectedObjectTyp }; return ( -
+
setInputText(e.target.value)} placeholder="Enter Flag Object Id" + className="input-field mr-2" /> - - {error &&

{error}

} + {error &&

{error}

} {coins && (
@@ -90,4 +92,4 @@ const withProviders = (Component: React.FC) => { }; // Export the component wrapped in providers -export default withProviders(ChallengeVerifier); +export default withProviders(ChallengeVerifier); \ No newline at end of file From 34b0e777b74885d46708fde6514a427639f2e0fb Mon Sep 17 00:00:00 2001 From: evavirseda Date: Thu, 5 Dec 2024 09:41:54 +0100 Subject: [PATCH 05/97] feat(wallet): polish darkmode (#4356) --- .../ui/app/pages/approval-request/SignMessageRequest.tsx | 8 ++++++-- apps/wallet/src/ui/app/shared/ButtonConnectedTo.tsx | 9 ++++++++- .../src/ui/app/shared/transaction-summary/index.tsx | 4 +++- 3 files changed, 17 insertions(+), 4 deletions(-) diff --git a/apps/wallet/src/ui/app/pages/approval-request/SignMessageRequest.tsx b/apps/wallet/src/ui/app/pages/approval-request/SignMessageRequest.tsx index b30ac753ffc..7f708d31f9f 100644 --- a/apps/wallet/src/ui/app/pages/approval-request/SignMessageRequest.tsx +++ b/apps/wallet/src/ui/app/pages/approval-request/SignMessageRequest.tsx @@ -49,12 +49,16 @@ export function SignMessageRequest({ request }: SignMessageRequestProps) { >
- Message You Are Signing + + Message You Are Signing +
- {message} + + {message} +
diff --git a/apps/wallet/src/ui/app/shared/ButtonConnectedTo.tsx b/apps/wallet/src/ui/app/shared/ButtonConnectedTo.tsx index c26f80bed6c..261fc3d310b 100644 --- a/apps/wallet/src/ui/app/shared/ButtonConnectedTo.tsx +++ b/apps/wallet/src/ui/app/shared/ButtonConnectedTo.tsx @@ -24,7 +24,14 @@ export const ButtonConnectedTo = forwardRef {iconBefore}
-
{text}
+
+ {text} +
); }, diff --git a/apps/wallet/src/ui/app/shared/transaction-summary/index.tsx b/apps/wallet/src/ui/app/shared/transaction-summary/index.tsx index 089c19252fd..5d384cdc65d 100644 --- a/apps/wallet/src/ui/app/shared/transaction-summary/index.tsx +++ b/apps/wallet/src/ui/app/shared/transaction-summary/index.tsx @@ -28,7 +28,9 @@ export function TransactionSummary({
{isDryRun && (
- Do you approve these actions? + + Do you approve these actions? +
)} From 2c7de0140b8b5827f75cfc7fb46ef07844eada17 Mon Sep 17 00:00:00 2001 From: Pavlo Botnar Date: Thu, 5 Dec 2024 10:55:58 +0200 Subject: [PATCH 06/97] feat(move/examples): implementation of kiosk marketplace extension using kiosk rules (#4156) * feat(move/examples): implementation of kiosk nft marketplace, rental extensions using kiosk rules --------- Co-authored-by: Mirko Zichichi Co-authored-by: Lucas Tortora <85233773+lucas-tortora@users.noreply.github.com> --- docs/examples/move/nft_marketplace/Move.toml | 35 ++ docs/examples/move/nft_marketplace/README.md | 214 +++++++++ .../sources/clothing_store.move | 60 +++ .../sources/marketplace_extension.move | 151 ++++++ .../sources/rental_extension.move | 430 ++++++++++++++++++ .../tests/marketplace_extension_tests.move | 223 +++++++++ .../tests/rental_extension_tests.move | 362 +++++++++++++++ .../move/nft_marketplace/tests/utils.move | 24 + 8 files changed, 1499 insertions(+) create mode 100644 docs/examples/move/nft_marketplace/Move.toml create mode 100644 docs/examples/move/nft_marketplace/README.md create mode 100644 docs/examples/move/nft_marketplace/sources/clothing_store.move create mode 100644 docs/examples/move/nft_marketplace/sources/marketplace_extension.move create mode 100644 docs/examples/move/nft_marketplace/sources/rental_extension.move create mode 100644 docs/examples/move/nft_marketplace/tests/marketplace_extension_tests.move create mode 100644 docs/examples/move/nft_marketplace/tests/rental_extension_tests.move create mode 100644 docs/examples/move/nft_marketplace/tests/utils.move diff --git a/docs/examples/move/nft_marketplace/Move.toml b/docs/examples/move/nft_marketplace/Move.toml new file mode 100644 index 00000000000..11388926dfb --- /dev/null +++ b/docs/examples/move/nft_marketplace/Move.toml @@ -0,0 +1,35 @@ +[package] +name = "nft_marketplace" +edition = "2024.beta" + +[dependencies] +Iota = { local = "../../../../crates/iota-framework/packages/iota-framework" } +Kiosk = { local = "../../../../kiosk" } + +# For remote import, use the `{ git = "...", subdir = "...", rev = "..." }`. +# Revision can be a branch, a tag, and a commit hash. +# MyRemotePackage = { git = "https://some.remote/host.git", subdir = "remote/path", rev = "main" } + +# For local dependencies use `local = path`. Path is relative to the package root +# Local = { local = "../path/to" } + +# To resolve a version conflict and force a specific version for dependency +# override use `override = true` +# Override = { local = "../conflicting/version", override = true } + +[addresses] +nft_marketplace = "0x0" + +# Named addresses will be accessible in Move as `@name`. They're also exported: +# for example, `std = "0x1"` is exported by the Standard Library. +# alice = "0xA11CE" + +[dev-dependencies] +# The dev-dependencies section allows overriding dependencies for `--test` and +# `--dev` modes. You can introduce test-only dependencies here. +# Local = { local = "../path/to/dev-build" } + +[dev-addresses] +# The dev-addresses section allows overwriting named addresses for the `--test` +# and `--dev` modes. +# alice = "0xB0B" diff --git a/docs/examples/move/nft_marketplace/README.md b/docs/examples/move/nft_marketplace/README.md new file mode 100644 index 00000000000..42cb414ab65 --- /dev/null +++ b/docs/examples/move/nft_marketplace/README.md @@ -0,0 +1,214 @@ +# Marketplace Guide + +## Modules + +The [`marketplace_extension.move`](https://github.com/iotaledger/iota/blob/develop/docs/examples/move/nft_marketplace/sources/marketplace_extension.move) +module provides a straightforward implementation of a marketplace extension. To use it, follow the +[steps outlined below](#how-to-use-the-marketplace). + +The [`clothing_store.move`](https://github.com/iotaledger/iota/blob/develop/docs/examples/move/nft_marketplace/sources/clothing_store.move) module contains mocked item data for +use within the marketplace. + +The [`rental_extension.move`](https://github.com/iotaledger/iota/blob/develop/docs/examples/move/nft_marketplace/sources/rental_extension.move) module adds the functionality to enable item rentals. + +## How To Use the Marketplace + +### 1. Install the IOTA CLI and Connect to the Network + +The first thing you'll need to do is [install the IOTA CLI](https://docs.iota.org/developer/getting-started/install-iota), [connect to an IOTA network](https://docs.iota.org/developer/getting-started/connect) and [get some test tokens](https://docs.iota.org/developer/getting-started/get-coins) to pay for [gas](https://docs.iota.org/about-iota/tokenomics/gas-in-iota). + +### 2. Install Kiosk + +You can install the Kiosk by creating a `Kiosk` object, which will also create its `OwnerCap`, and then transferring +them to the caller. + +Run the following command to install the Kiosk module: + +```bash +iota client call \ + --package 0x2 \ + --module kiosk \ + --function default +``` + +After publishing, export the following variables: + +- `KIOSK_ID`: The ID of the installed Kiosk object. +- `KIOSK_CAP_ID`: The ID of the installed Kiosk's owner cap + +### 3. Publish `nft_marketplace` package + +#### 3.1(Optional) Publish Kiosk rules modules if these are not present in the network you are using + +You can publish Kiosk rules modules(package) using the following command: + +```bash +iota client publish $IOTA_REPO_DIR/kiosk +``` + +After publishing, export the following variable: + +- `RULES_PACKAGE_ID`: The ID of the rules package. + +#### 3.2 Publish the `nft_marketplace` Package + +```bash +iota client publish $IOTA_REPO_DIR/docs/examples/move/nft_marketplace +``` + +After publishing, export the following variables: + +- `MARKETPLACE_PACKAGE_ID`: The ID of the whole marketplace package. +- `MARKETPLACE_PUBLISHER_ID`: The ID of the publisher object created during marketplace package publishing." + +### 4. Create a Clothing Store Item + +Next, you should use the functions in the `clothing_store` module to create an item, for instance: + +```bash +iota client call \ + --package $MARKETPLACE_PACKAGE_ID \ + --module clothing_store \ + --function new_jeans +``` + +After creation, export the following variable: + +- `CLOTHING_STORE_ITEM_ID`: The ID of the published item (in this case, Jeans). + +### 5. Create a Transfer Policy + +`TransferPolicy` is a generic-shared object that acts as a central authority enforcing that everyone checks their +purchase is valid against the defined policy before the purchased item is transferred to the buyer. The object is +specified by concrete type: +The `default` function creates a `TransferPolicy` object and a `TransferPolicyCap`, then transfers them to the caller. + +The `TransferPolicyCap` object serves as proof of ownership of the `TransferPolicy` object. +A capability granting the owner permission to `add/remove` rules, `withdraw`, and `destroy_and_withdraw` the `TransferPolicy`. + +You can set up a transfer policy for the created item using the following command: + +```bash +iota client call \ + --package 0x2 \ + --module transfer_policy \ + --function default \ + --gas-budget 10000000 \ + --args $MARKETPLACE_PUBLISHER_ID \ + --type-args "$MARKETPLACE_PACKAGE_ID::clothing_store::Jeans" +``` + +After publishing, export the following variables: + +- `ITEM_TRANS_POLICY`: The ID of the item transfer policy object. +- `ITEM_TRANS_POLICY_CAP`: The ID of the item transfer policy object owner capability" + +### 6. Install the Extension on the Kiosk + +The [`install`](https://github.com/iotaledger/iota/blob/develop/docs/examples/move/nft_marketplace/sources/marketplace_extension.move#L39-L45) function enables the installation of the Marketplace extension in a kiosk. +Under the hood, it invokes `kiosk_extension::add`, which adds an extension to the Kiosk via a [dynamic field](https://docs.iota.org/developer/iota-101/objects/dynamic-fields/). +You can install the marketplace extension on the created kiosk using the following command: + +```bash +iota client call \ + --package $MARKETPLACE_PACKAGE_ID \ + --module marketplace_extension \ + --function install \ + --args $KIOSK_ID $KIOSK_CAP_ID +``` + +### 7. Set a Price for the Item + +You can use the [`set_price`](https://github.com/iotaledger/iota/blob/develop/docs/examples/move/nft_marketplace/sources/marketplace_extension.move#L98-L114) function to set the price for the item: + +```bash +iota client call \ + --package $MARKETPLACE_PACKAGE_ID \ + --module marketplace_extension \ + --function set_price \ + --args $KIOSK_ID $KIOSK_CAP_ID $CLOTHING_STORE_ITEM_ID 50000 \ + --type-args "$MARKETPLACE_PACKAGE_ID::clothing_store::Jeans" +``` + +### 8.(Optional) Set Royalties + +Royalties are a percentage of the item's price or revenue paid to the owner for using or selling their asset. + +You can use the [`set_royalties`](https://github.com/iotaledger/iota/blob/develop/docs/examples/move/nft_marketplace/sources/marketplace_extension.move#L58-L60) function to set royalties for the item: + +```bash +iota client call \ + --package $MARKETPLACE_PACKAGE_ID \ + --module marketplace_extension \ + --function setup_royalties \ + --args $ITEM_TRANS_POLICY $ITEM_TRANS_POLICY_CAP 5000 2000 \ + --type-args "$MARKETPLACE_PACKAGE_ID::clothing_store::Jeans" +``` + +### 9. Buy an Item + +#### 9.1 Get the Item Price + +You can use the following [Programmable Transaction Block](https://docs.iota.org/developer/iota-101/transactions/ptb/programmable-transaction-blocks-overview) to call the +[`get_item_price`](https://github.com/iotaledger/iota/blob/develop/docs/examples/move/nft_marketplace/sources/marketplace_extension.move#L116-L127) +and assign it to an `item_price` variable. In this case, the Jeans item: + +```bash +iota client ptb \ +--move-call $MARKETPLACE_PACKAGE_ID::marketplace_extension::get_item_price "<$MARKETPLACE_PACKAGE_ID::clothing_store::Jeans>" @$KIOSK_ID @$CLOTHING_STORE_ITEM_ID --assign item_price \ +``` + +#### 9.2(Optional) Calculate the Royalties For the Item + +You can use the following [move-call](https://docs.iota.org/references/cli/ptb#move-call) to get the royalties for any given product by calling the `kiosk::royalty_rule::fee_amount` function +and assign it to a `royalties_amount` variable. In this case, the Jeans item: + +```bash +--move-call $RULES_PACKAGE_ID::royalty_rule::fee_amount "<$MARKETPLACE_PACKAGE_ID::clothing_store::Jeans>" @$ITEM_TRANS_POLICY item_price --assign royalties_amount \ +``` + +#### 9.3 Create a Payment Coin With a Specific Amount (Price + Optional Royalties) + +You can use the following command to [split your gas tokens](https://docs.iota.org/references/cli/ptb#split-destroy-and-merge-coins) to pay for the item's price and royalties: + +```bash +--split-coins gas "[item_price, royalties_amount]" --assign payment_coins \ +--merge-coins payment_coins.0 "[payment_coins.1]" \ +``` + +#### 9.4 Buy an Item Using `payment_coins.0` + +You can use the following [move-call](https://docs.iota.org/references/cli/ptb#move-call) to pay the owner the item's price. +If the royalty rule is enabled, an additional royalty fee, calculated as a percentage of the initial item price, is also +paid. +Once both payments are completed, the item is ready for transfer to the buyer. + +To purchase the item: + +```bash +--move-call $MARKETPLACE_PACKAGE_ID::marketplace_extension::buy_item "<$MARKETPLACE_PACKAGE_ID::clothing_store::Jeans>" @$KIOSK_ID @$ITEM_TRANS_POLICY @$CLOTHING_STORE_ITEM_ID payment_coins.0 --assign purchased_item +``` + +#### 9.5 Transfer an Item to the Buyer + +Finally, you can set up the +[public_transfer](https://docs.iota.org/references/framework/iota-framework/transfer#function-public_transfer) to +transfer the purchased item to the buyer: + +```bash +--move-call 0x2::transfer::public_transfer "<$MARKETPLACE_PACKAGE_ID::clothing_store::Jeans>" purchased_item @ \ +``` + +You can combine all the previous steps into one purchase +[PTB](https://docs.iota.org/developer/iota-101/transactions/ptb/programmable-transaction-blocks-overview) request, +including royalties, which should look like this: + +```bash +iota client ptb \ +--move-call $MARKETPLACE_PACKAGE_ID::marketplace_extension::get_item_price "<$MARKETPLACE_PACKAGE_ID::clothing_store::Jeans>" @$KIOSK_ID @$CLOTHING_STORE_ITEM_ID --assign item_price \ +--move-call $RULES_PACKAGE_ID::royalty_rule::fee_amount "<$MARKETPLACE_PACKAGE_ID::clothing_store::Jeans>" @$ITEM_TRANS_POLICY item_price --assign royalties_amount \ +--split-coins gas "[item_price, royalties_amount]" --assign payment_coins \ +--merge-coins payment_coins.0 "[payment_coins.1]" \ +--move-call $MARKETPLACE_PACKAGE_ID::marketplace_extension::buy_item "<$MARKETPLACE_PACKAGE_ID::clothing_store::Jeans>" @$KIOSK_ID @$ITEM_TRANS_POLICY @$CLOTHING_STORE_ITEM_ID payment_coins.0 --assign purchased_item \ +--move-call 0x2::transfer::public_transfer "<$MARKETPLACE_PACKAGE_ID::clothing_store::Jeans>" purchased_item @ +``` diff --git a/docs/examples/move/nft_marketplace/sources/clothing_store.move b/docs/examples/move/nft_marketplace/sources/clothing_store.move new file mode 100644 index 00000000000..050c8f93a75 --- /dev/null +++ b/docs/examples/move/nft_marketplace/sources/clothing_store.move @@ -0,0 +1,60 @@ +/// Module provides `mock` items for using them in marketplace and rental extensions. +#[allow(lint(self_transfer))] +module nft_marketplace::clothing_store { + use iota::package; + /// One Time Witness. + public struct CLOTHING_STORE has drop {} + + + fun init(otw: CLOTHING_STORE, ctx: &mut TxContext) { + package::claim_and_keep(otw, ctx) + } + + public struct TShirt has key, store { + id: UID, + } + + public struct Jacket has key, store { + id: UID, + } + + public struct Shoes has key, store { + id: UID, + } + + public struct Jeans has key, store { + id: UID, + } + + public fun new_tshirt(ctx: &mut TxContext) { + let tshirt = TShirt { + id: object::new(ctx), + }; + + transfer::public_transfer(tshirt, ctx.sender()); + } + + public fun new_jeans(ctx: &mut TxContext) { + let jeans = Jeans { + id: object::new(ctx), + }; + + transfer::public_transfer(jeans, ctx.sender()); + } + + public fun new_shoes(ctx: &mut TxContext) { + let shoes = Shoes { + id: object::new(ctx), + }; + + transfer::public_transfer(shoes, ctx.sender()); + } + + public fun new_jacket(ctx: &mut TxContext) { + let jacket = Jacket { + id: object::new(ctx), + }; + + transfer::public_transfer(jacket, ctx.sender()); + } +} \ No newline at end of file diff --git a/docs/examples/move/nft_marketplace/sources/marketplace_extension.move b/docs/examples/move/nft_marketplace/sources/marketplace_extension.move new file mode 100644 index 00000000000..0531c5488a3 --- /dev/null +++ b/docs/examples/move/nft_marketplace/sources/marketplace_extension.move @@ -0,0 +1,151 @@ +module nft_marketplace::marketplace_extension { + // iota imports + use iota::{ + kiosk::{Kiosk, KioskOwnerCap, purchase}, + kiosk_extension, + bag, + transfer_policy::{Self, TransferPolicy, TransferPolicyCap, has_rule}, + coin::Coin, + iota::IOTA, + }; + + // rules imports + use kiosk::royalty_rule::Rule as RoyaltyRule; + use kiosk::royalty_rule; + + + // === Errors === + const EExtensionNotInstalled: u64 = 0; + const EWrongPaymentRoyalties: u64 = 1; + const ENotEnoughPaymentAmount: u64 = 2; + + // === Constants === + const ALLOW_PLACE_AND_LOCK: u128 = 11; + + /// Extension Key for Kiosk Marketplace extension. + public struct Marketplace has drop {} + + /// Used as a key for the item that has been up for sale that's placed in the Extension's Bag. + public struct Listed has store, copy, drop { id: ID } + + public struct ItemPrice has store { + /// Total amount of time offered for renting in days. + price: u64, + } + + // === Public Functions === + + /// Enables someone to install the Marketplace extension in their Kiosk. + public fun install( + kiosk: &mut Kiosk, + cap: &KioskOwnerCap, + ctx: &mut TxContext, + ) { + kiosk_extension::add(Marketplace {}, kiosk, cap, ALLOW_PLACE_AND_LOCK, ctx); + } + + /// Remove the extension from the Kiosk. Can only be performed by the owner, + /// The extension storage must be empty for the transaction to succeed. + public fun remove(kiosk: &mut Kiosk, cap: &KioskOwnerCap, _ctx: &mut TxContext) { + kiosk_extension::remove(kiosk, cap); + } + + /// Setup item royalty percentage + /// - amount_bp - the percentage of the purchase price to be paid as a + /// fee, denominated in basis points (100_00 = 100%, 1 = 0.01%). + /// - min_amount - the minimum amount to be paid as a fee if the relative + /// amount is lower than this setting. + public fun setup_royalties(policy: &mut TransferPolicy, cap: &TransferPolicyCap, amount_bp: u16, min_amount: u64) { + royalty_rule::add(policy, cap, amount_bp, min_amount); + } + + /// Buy listed item with the indicated price and pay royalties if needed + public fun buy_item(kiosk: &mut Kiosk, policy: &mut TransferPolicy, item_id: object::ID, mut payment: Coin, ctx: &mut TxContext): T { + assert!(kiosk_extension::is_installed(kiosk), EExtensionNotInstalled); + + // Get item price + let ItemPrice { price } = take_from_bag(kiosk, Listed { id: item_id }); + + // Compute the value of the coin in input + let payment_amount_value = payment.value(); + + // If the payment_amount_value is less than the item price, the request is invalid. + assert!(payment_amount_value >= price, ENotEnoughPaymentAmount); + + // Prepare the payment coin for the purchase (if no royalties are present then the + // remaining balance will be 0 after this operation) + let coin_price = payment.split(price, ctx); + + // Purchase and create the transfer request + let (item, mut transfer_request) = purchase(kiosk, item_id, coin_price); + + // If the royalty is present, then update the request with a royalty payment + if (policy.has_rule()) { + let royalties_value = royalty_rule::fee_amount(policy, price); + assert!(payment_amount_value == price + royalties_value, EWrongPaymentRoyalties); + royalty_rule::pay(policy, &mut transfer_request, payment); + } else { + // Else clean the input coin (if the input payment amount is not exact, this will fail) + payment.destroy_zero(); + }; + + // Confirm the request + transfer_policy::confirm_request(policy, transfer_request); + item + } + + + public fun set_price( + kiosk: &mut Kiosk, + cap: &KioskOwnerCap, + item: T, + price: u64) { + assert!(kiosk_extension::is_installed(kiosk), EExtensionNotInstalled); + + let id = object::id(&item); + kiosk.place_and_list(cap, item, price); + + let item_price = ItemPrice { + price, + }; + + place_in_bag(kiosk, Listed { id }, item_price); + } + + + public fun get_item_price( + kiosk: &Kiosk, + item_id: ID, + ) : u64 { + let storage_ref = kiosk_extension::storage(Marketplace {}, kiosk); + let ItemPrice { price } = bag::borrow>( + storage_ref, + Listed { id: item_id }, + ); + + *price + } + + + // === Private Functions === + + fun take_from_bag( + kiosk: &mut Kiosk, + item_key: Key, + ) : ItemPrice { + let ext_storage_mut = kiosk_extension::storage_mut(Marketplace {}, kiosk); + bag::remove>( + ext_storage_mut, + item_key, + ) + } + + fun place_in_bag( + kiosk: &mut Kiosk, + item_key: Key, + item_price: ItemPrice, + ) { + let ext_storage_mut = kiosk_extension::storage_mut(Marketplace {}, kiosk); + bag::add(ext_storage_mut, item_key, item_price); + } +} \ No newline at end of file diff --git a/docs/examples/move/nft_marketplace/sources/rental_extension.move b/docs/examples/move/nft_marketplace/sources/rental_extension.move new file mode 100644 index 00000000000..e971e79b210 --- /dev/null +++ b/docs/examples/move/nft_marketplace/sources/rental_extension.move @@ -0,0 +1,430 @@ +/// NFT renting is a mechanism that allows individuals without ownership or possession of a specific +/// NFT to temporarily utilize or experience it. +/// The rental_extension module provides an API that facilitates lending or borrowing through the following operations: +/// - List for renting +/// - Delist from renting +/// - Rent +/// - Borrow by reference and borrow by value +/// - Reclaim for the lender +module nft_marketplace::rental_extension { + + // iota imports + use iota::{ + kiosk::{Kiosk, KioskOwnerCap, purchase}, + kiosk_extension, + bag, + transfer_policy::{Self, TransferPolicy, TransferPolicyCap, has_rule}, + clock::Clock, + coin::{Self, Coin}, + balance::{Self, Balance}, + iota::IOTA, + package::Publisher + }; + + // rules imports + use kiosk::kiosk_lock_rule::Rule as LockRule; + + // === Errors === + const EExtensionNotInstalled: u64 = 0; + const ENotOwner: u64 = 1; + const ENotEnoughCoins: u64 = 2; + const EInvalidKiosk: u64 = 3; + const ERentingPeriodNotOver: u64 = 4; + const ETotalPriceOverflow: u64 = 6; + + // === Constants === + const ALLOW_PLACE_AND_LOCK: u128 = 11; + const SECONDS_IN_A_DAY: u64 = 86400; + const MAX_BASIS_POINTS: u16 = 10_000; + const MAX_VALUE_U64: u64 = 0xff_ff_ff_ff__ff_ff_ff_ff; + + // === Structs === + + /// Extension Key for Kiosk Marketplace extension. + public struct Rental has drop {} + + /// Struct representing a rented item. + /// Used as a key for the Rentable that's placed in the Extension's Bag. + public struct Rented has store, copy, drop { id: ID } + + /// Struct representing a listed item. + /// Used as a key for the Rentable that's placed in the Extension's Bag. + public struct Listed has store, copy, drop { id: ID } + + /// Promise struct for borrowing by value. + public struct Promise { + item: Rented, + duration: u64, + start_date: u64, + price_per_day: u64, + renter_kiosk: ID, + borrower_kiosk: ID, + } + + /// A wrapper object that holds an asset that is being rented. + /// Contains information relevant to the rental period, cost and renter. + public struct Rentable has store { + object: T, + /// Total amount of time offered for renting in days. + duration: u64, + /// Initially undefined, is updated once someone rents it. + start_date: Option, + price_per_day: u64, + /// The kiosk id that the object was taken from. + kiosk_id: ID, + } + + /// A shared object that should be minted by every creator. + /// Defines the royalties the creator will receive from each rent invocation. + public struct RentalPolicy has key, store { + id: UID, + balance: Balance, + /// Note: Move does not support float numbers. + /// + /// If you need to represent a float, you need to determine the desired + /// precision and use a larger integer representation. + /// + /// For example, fpercentages can be represented using basis points: + /// 10000 basis points represent 100% and 100 basis points represent 1%. + amount_bp: u64 + } + + /// A shared object that should be minted by every creator. + /// Even for creators that do not wish to enforce royalties. Provides authorized access to an + /// empty TransferPolicy. + public struct ProtectedTP has key, store { + id: UID, + transfer_policy: TransferPolicy, + policy_cap: TransferPolicyCap + } + + // === Public Functions === + + /// Enables someone to install the Rental extension in their Kiosk. + public fun install( + kiosk: &mut Kiosk, + cap: &KioskOwnerCap, + ctx: &mut TxContext, + ) { + kiosk_extension::add(Rental {}, kiosk, cap, ALLOW_PLACE_AND_LOCK, ctx); + } + + /// Remove the extension from the Kiosk. Can only be performed by the owner, + /// The extension storage must be empty for the transaction to succeed. + public fun remove(kiosk: &mut Kiosk, cap: &KioskOwnerCap, _ctx: &mut TxContext) { + kiosk_extension::remove(kiosk, cap); + } + + /// Mints and shares a ProtectedTP & a RentalPolicy object for type T. + /// Can only be performed by the publisher of type T. + public fun setup_renting(publisher: &Publisher, amount_bp: u64, ctx: &mut TxContext) { + // Creates an empty TP and shares a ProtectedTP object. + // This can be used to bypass the lock rule under specific conditions. + // Storing inside the cap the ProtectedTP with no way to access it + // as we do not want to modify this policy + let (transfer_policy, policy_cap) = transfer_policy::new(publisher, ctx); + + let protected_tp = ProtectedTP { + id: object::new(ctx), + transfer_policy, + policy_cap, + }; + + let rental_policy = RentalPolicy { + id: object::new(ctx), + balance: balance::zero(), + amount_bp, + }; + + transfer::share_object(protected_tp); + transfer::share_object(rental_policy); + } + + /// Enables someone to list an asset within the Marketplace extension's Bag, + /// creating a Bag entry with the asset's ID as the key and a Rentable wrapper object as the value. + /// Requires the existance of a ProtectedTP which can only be created by the creator of type T. + /// Assumes item is already placed (& optionally locked) in a Kiosk. + public fun list( + kiosk: &mut Kiosk, + cap: &KioskOwnerCap, + protected_tp: &ProtectedTP, + item_id: ID, + duration: u64, + price_per_day: u64, + ctx: &mut TxContext, + ) { + assert!(kiosk_extension::is_installed(kiosk), EExtensionNotInstalled); + + let max_price_per_day = MAX_VALUE_U64 / duration; + assert!(price_per_day <= max_price_per_day, ETotalPriceOverflow); + kiosk.set_owner(cap, ctx); + kiosk.list(cap, item_id, 0); + + let coin = coin::zero(ctx); + let (object, request) = kiosk.purchase(item_id, coin); + + let (_item, _paid, _from) = protected_tp.transfer_policy.confirm_request(request); + + let rentable = Rentable { + object, + duration, + start_date: option::none(), + price_per_day, + kiosk_id: object::id(kiosk), + }; + + place_in_bag(kiosk, Listed { id: item_id }, rentable); + } + + /// Allows the renter to delist an item, that is not currently being rented. + /// Places (or locks, if a lock rule is present) the object back to owner's Kiosk. + /// Creators should mint an empty TransferPolicy even if they don't want to apply any royalties. + /// If they wish at some point to enforce royalties, they can update the existing TransferPolicy. + public fun delist( + kiosk: &mut Kiosk, + cap: &KioskOwnerCap, + transfer_policy: &TransferPolicy, + item_id: ID, + _ctx: &mut TxContext, + ) { + assert!(kiosk_extension::is_installed(kiosk), EExtensionNotInstalled); + assert!(kiosk.has_access(cap), ENotOwner); + + let rentable = take_from_bag(kiosk, Listed { id: item_id }); + + let Rentable { + object, + duration: _, + start_date: _, + price_per_day: _, + kiosk_id: _, + } = rentable; + + if (has_rule(transfer_policy)) { + kiosk.lock(cap, transfer_policy, object); + } else { + kiosk.place(cap, object); + }; + } + + /// This enables individuals to rent a listed Rentable. + /// + /// It permits anyone to borrow an item on behalf of another user, provided they have the + /// Marketplace extension installed. + /// + /// The Rental Policy defines the portion of the coin that will be retained as fees and added to + /// the Rental Policy's balance. + public fun rent( + renter_kiosk: &mut Kiosk, + borrower_kiosk: &mut Kiosk, + rental_policy: &mut RentalPolicy, + item_id: ID, + mut coin: Coin, + clock: &Clock, + ctx: &mut TxContext, + ) { + assert!(kiosk_extension::is_installed(borrower_kiosk), EExtensionNotInstalled); + + let mut rentable = take_from_bag(renter_kiosk, Listed { id: item_id }); + + let total_price = rentable.price_per_day * rentable.duration; + + let coin_value = coin.value(); + assert!(coin_value == total_price, ENotEnoughCoins); + + let fees_amount = calculate_fees_amount(coin_value as u128, rental_policy.amount_bp as u128); + + let fees = coin.split(fees_amount as u64, ctx); + + coin::put(&mut rental_policy.balance, fees); + transfer::public_transfer(coin, renter_kiosk.owner()); + rentable.start_date.fill(clock.timestamp_ms()); + + place_in_bag(borrower_kiosk, Rented { id: item_id }, rentable); + } + + /// Enables the borrower to acquire the Rentable by reference from their bag. + public fun borrow( + kiosk: &mut Kiosk, + cap: &KioskOwnerCap, + item_id: ID, + _ctx: &mut TxContext, + ): &T { + assert!(kiosk.has_access(cap), ENotOwner); + let ext_storage_mut = kiosk_extension::storage_mut(Rental {}, kiosk); + let rentable: &Rentable = &ext_storage_mut[Rented { id: item_id }]; + &rentable.object + } + + /// Enables the borrower to temporarily acquire the Rentable with an agreement or promise to + /// return it. + /// + /// All the information about the Rentable is stored within the promise, facilitating the + /// reconstruction of the Rentable when the object is returned. + public fun borrow_val( + kiosk: &mut Kiosk, + cap: &KioskOwnerCap, + item_id: ID, + _ctx: &mut TxContext, + ): (T, Promise) { + assert!(kiosk.has_access(cap), ENotOwner); + let borrower_kiosk = object::id(kiosk); + + let rentable = take_from_bag(kiosk, Rented { id: item_id }); + + let promise = Promise { + item: Rented { id: item_id }, + duration: rentable.duration, + start_date: *option::borrow(&rentable.start_date), + price_per_day: rentable.price_per_day, + renter_kiosk: rentable.kiosk_id, + borrower_kiosk + }; + + let Rentable { + object, + duration: _, + start_date: _, + price_per_day: _, + kiosk_id: _, + } = rentable; + + (object, promise) + } + + /// Enables the borrower to return the borrowed item. + public fun return_val( + kiosk: &mut Kiosk, + object: T, + promise: Promise, + _ctx: &mut TxContext, + ) { + assert!(kiosk_extension::is_installed(kiosk), EExtensionNotInstalled); + + let Promise { + item, + duration, + start_date, + price_per_day, + renter_kiosk, + borrower_kiosk, + } = promise; + + let kiosk_id = object::id(kiosk); + assert!(kiosk_id == borrower_kiosk, EInvalidKiosk); + + let rentable = Rentable { + object, + duration, + start_date: option::some(start_date), + price_per_day, + kiosk_id: renter_kiosk, + }; + + place_in_bag(kiosk, item, rentable); + } + + /// Enables the owner to reclaim their asset once the rental period has concluded. + public fun reclaim( + renter_kiosk: &mut Kiosk, + borrower_kiosk: &mut Kiosk, + transfer_policy: &TransferPolicy, + clock: &Clock, + item_id: ID, + _ctx: &mut TxContext, + ) { + assert!(kiosk_extension::is_installed(renter_kiosk), EExtensionNotInstalled); + + let rentable = take_from_bag(borrower_kiosk, Rented { id: item_id }); + + let Rentable { + object, + duration, + start_date, + price_per_day: _, + kiosk_id, + } = rentable; + + assert!(object::id(renter_kiosk) == kiosk_id, EInvalidKiosk); + + let start_date_ms = *option::borrow(&start_date); + let current_timestamp = clock.timestamp_ms(); + let final_timestamp = start_date_ms + duration * SECONDS_IN_A_DAY; + assert!(current_timestamp > final_timestamp, ERentingPeriodNotOver); + + if (transfer_policy.has_rule()) { + kiosk_extension::lock( + Rental {}, + renter_kiosk, + object, + transfer_policy, + ); + } else { + kiosk_extension::place( + Rental {}, + renter_kiosk, + object, + transfer_policy, + ); + }; + } + + // === Private Functions === + + // Calculate fees_amount using the given basis points amount (percentage), ensuring the + // result fits into a 64-bit unsigned integer. + fun calculate_fees_amount(coin_value: u128, rental_amount_bp: u128): u128 { + + let mut fees_amount = coin_value as u128; + fees_amount = fees_amount * (rental_amount_bp as u128); + fees_amount = fees_amount / (MAX_BASIS_POINTS as u128); + + fees_amount + } + + fun take_from_bag( + kiosk: &mut Kiosk, + item: Key, + ) : Rentable { + let ext_storage_mut = kiosk_extension::storage_mut(Rental {}, kiosk); + bag::remove>( + ext_storage_mut, + item, + ) + } + + fun place_in_bag( + kiosk: &mut Kiosk, + item: Key, + rentable: Rentable, + ) { + let ext_storage_mut = kiosk_extension::storage_mut(Rental {}, kiosk); + bag::add(ext_storage_mut, item, rentable); + } + + // === Test Functions === + + #[test_only] + // public fun test_take_from_bag(kiosk: &mut Kiosk, item_id: ID) { + public fun test_take_from_bag( + kiosk: &mut Kiosk, + item: Key, + ) { + let rentable = take_from_bag(kiosk, item); + + let Rentable { + object, + duration: _, + start_date: _, + price_per_day: _, + kiosk_id: _ + } = rentable; + + transfer::public_share_object(object); + } + + #[test_only] + public fun create_listed(id: ID) : Listed { + Listed { id } + } +} diff --git a/docs/examples/move/nft_marketplace/tests/marketplace_extension_tests.move b/docs/examples/move/nft_marketplace/tests/marketplace_extension_tests.move new file mode 100644 index 00000000000..d0e97eb016a --- /dev/null +++ b/docs/examples/move/nft_marketplace/tests/marketplace_extension_tests.move @@ -0,0 +1,223 @@ + +#[test_only] +module nft_marketplace::marketplace_extension_tests { + + use nft_marketplace::test_utils::{create_kiosk, create_transfer_policy}; + use kiosk::royalty_rule as royalty_rule; + use nft_marketplace::marketplace_extension::Self; + use iota::{ + iota::IOTA, + coin::Coin, + kiosk::Kiosk, + kiosk_test_utils, + package::Self, + test_scenario::{Self as ts, Scenario}, + transfer_policy::{TransferPolicy, TransferPolicyCap} + }; + + const CREATOR: address = @0xCCCC; + const SELLER: address = @0xAAAA; + const BUYER: address = @0xBBBB; + + public struct T has key, store { id: UID } + public struct WITNESS has drop {} + + + // ==================== Happy path scenarios ==================== + + #[test] + fun test_buy_item_without_royalties() { + let mut ts = ts::begin(SELLER); + + let item = T { id: object::new(ts.ctx()) }; + let item_id = object::id(&item); + + let witness = WITNESS {}; + let publisher = package::test_claim(witness, ts.ctx()); + + let seller_kiosk_id = create_kiosk(SELLER, ts.ctx()); + let item_price = 50000; + + create_transfer_policy( CREATOR, &publisher, ts.ctx()); + install_ext(&mut ts, SELLER, seller_kiosk_id); + setup_price(&mut ts, SELLER, seller_kiosk_id, item, item_price); + let payment = kiosk_test_utils::get_iota(item_price, ts.ctx()); + buy(&mut ts, BUYER, seller_kiosk_id, item_id, payment); + + publisher.burn_publisher(); + ts.end(); + } + + #[test] + fun test_buy_item_with_royalties() { + let mut ts = ts::begin(SELLER); + + let item = T { id: object::new(ts.ctx()) }; + let item_id = object::id(&item); + + let witness = WITNESS {}; + let publisher = package::test_claim(witness, ts.ctx()); + + let seller_kiosk_id = create_kiosk(SELLER, ts.ctx()); + let item_price = 50000; + let royalty_amount_bp = 5000; + let royalty_min_amount = 2000; + create_transfer_policy( CREATOR, &publisher, ts.ctx()); + add_royalty_rule(&mut ts, CREATOR, royalty_amount_bp, royalty_min_amount); + install_ext(&mut ts, SELLER, seller_kiosk_id); + setup_price(&mut ts, SELLER, seller_kiosk_id, item, item_price); + let mut payment = kiosk_test_utils::get_iota(item_price, ts.ctx()); + let royalty_amount_to_pay = get_royalty_fee_amount(&ts, item_price); + let royalties_coin = kiosk_test_utils::get_iota(royalty_amount_to_pay, ts.ctx()); + payment.join(royalties_coin); + buy(&mut ts, BUYER, seller_kiosk_id, item_id, payment); + + publisher.burn_publisher(); + ts.end(); + } + + #[test] + fun test_get_item_price() { + let mut ts = ts::begin(SELLER); + + let item = T { id: object::new(ts.ctx()) }; + let item_id = object::id(&item); + + let seller_kiosk_id = create_kiosk(SELLER, ts.ctx()); + let item_price = 50000; + + install_ext(&mut ts, SELLER, seller_kiosk_id); + setup_price(&mut ts, SELLER, seller_kiosk_id, item, item_price); + ts.next_tx(SELLER); + let kiosk: Kiosk = ts.take_shared_by_id(seller_kiosk_id); + let storage_item_price = marketplace_extension::get_item_price(&kiosk, item_id); + + assert!(storage_item_price == item_price); + + ts::return_shared(kiosk); + ts.end(); + } + + // ==================== Negative scenarios ==================== + + #[test] + #[expected_failure(abort_code = marketplace_extension::EWrongPaymentRoyalties)] + fun test_buy_item_with_royalties_wrong_royalties_amount() { + let mut ts = ts::begin(SELLER); + + let item = T { id: object::new(ts.ctx()) }; + let item_id = object::id(&item); + + let witness = WITNESS {}; + let publisher = package::test_claim(witness, ts.ctx()); + + let seller_kiosk_id = create_kiosk(SELLER, ts.ctx()); + let item_price = 50000; + let royalty_amount_bp = 5000; + let royalty_min_amount = 2000; + create_transfer_policy( CREATOR, &publisher, ts.ctx()); + add_royalty_rule(&mut ts, CREATOR, royalty_amount_bp, royalty_min_amount); + install_ext(&mut ts, SELLER, seller_kiosk_id); + setup_price(&mut ts, SELLER, seller_kiosk_id, item, item_price); + let mut payment = kiosk_test_utils::get_iota(item_price, ts.ctx()); + let royalty_amount_to_pay = get_royalty_fee_amount(&ts, 1000); + let royalties_coin = kiosk_test_utils::get_iota(royalty_amount_to_pay, ts.ctx()); + payment.join(royalties_coin); + buy(&mut ts, BUYER, seller_kiosk_id, item_id, payment); + + publisher.burn_publisher(); + ts.end(); + } + + #[test] + #[expected_failure(abort_code = marketplace_extension::ENotEnoughPaymentAmount)] + fun test_buy_item_without_royalties_wrong_price() { + let mut ts = ts::begin(SELLER); + + let item = T { id: object::new(ts.ctx()) }; + let item_id = object::id(&item); + + let witness = WITNESS {}; + let publisher = package::test_claim(witness, ts.ctx()); + + let seller_kiosk_id = create_kiosk(SELLER, ts.ctx()); + let item_price = 50000; + + create_transfer_policy( CREATOR, &publisher, ts.ctx()); + install_ext(&mut ts, SELLER, seller_kiosk_id); + setup_price(&mut ts, SELLER, seller_kiosk_id, item, item_price); + let payment = kiosk_test_utils::get_iota(40000, ts.ctx()); + buy(&mut ts, BUYER, seller_kiosk_id, item_id, payment); + + publisher.burn_publisher(); + ts.end(); + } + + #[test] + #[expected_failure(abort_code = marketplace_extension::EExtensionNotInstalled)] + fun test_set_price_without_extension() { + let mut ts = ts::begin(SELLER); + + let item = T { id: object::new(ts.ctx()) }; + + let seller_kiosk_id = create_kiosk(SELLER, ts.ctx()); + let item_price = 50000; + + setup_price(&mut ts, SELLER, seller_kiosk_id, item, item_price); + + ts.end(); + } + // ==================== Helper methods ==================== + + + fun setup_price(ts: &mut Scenario, sender: address, seller_kiosk_id: ID, item: T, price: u64) { + ts.next_tx(sender); + let mut kiosk: Kiosk = ts.take_shared_by_id(seller_kiosk_id); + let kiosk_cap = ts.take_from_sender(); + + marketplace_extension::set_price(&mut kiosk, &kiosk_cap, item, price); + + ts::return_shared(kiosk); + ts.return_to_sender(kiosk_cap); + } + + fun install_ext(ts: &mut Scenario, sender: address, kiosk_id: ID) { + ts.next_tx(sender); + let mut kiosk: Kiosk = ts.take_shared_by_id(kiosk_id); + let kiosk_cap = ts.take_from_sender(); + + marketplace_extension::install(&mut kiosk, &kiosk_cap, ts.ctx()); + + ts::return_shared(kiosk); + ts.return_to_sender(kiosk_cap); + } + + fun buy(ts: &mut Scenario, buyer: address, seller_kiosk_id: ID, item_id: ID, payment: Coin) { + ts.next_tx(buyer); + let mut kiosk: Kiosk = ts.take_shared_by_id(seller_kiosk_id); + let mut policy: TransferPolicy = ts.take_shared(); + + let item = marketplace_extension::buy_item(&mut kiosk, &mut policy, item_id, payment, ts.ctx()); + transfer::public_transfer(item, buyer); + ts::return_shared(kiosk); + ts::return_shared(policy); + } + + fun add_royalty_rule(ts: &mut Scenario, sender: address, amount_bp: u16, min_amount: u64) { + ts.next_tx(sender); + let mut transfer_policy: TransferPolicy = ts.take_shared(); + let policy_cap: TransferPolicyCap = ts.take_from_sender(); + + marketplace_extension::setup_royalties(&mut transfer_policy, &policy_cap, amount_bp, min_amount); + + ts::return_shared(transfer_policy); + ts.return_to_sender(policy_cap); + } + + fun get_royalty_fee_amount(ts: &Scenario, price: u64): u64 { + let transfer_policy: TransferPolicy = ts.take_shared(); + let royalty_fee = royalty_rule::fee_amount(&transfer_policy, price); + ts::return_shared(transfer_policy); + royalty_fee + } +} \ No newline at end of file diff --git a/docs/examples/move/nft_marketplace/tests/rental_extension_tests.move b/docs/examples/move/nft_marketplace/tests/rental_extension_tests.move new file mode 100644 index 00000000000..8fabfd78d7d --- /dev/null +++ b/docs/examples/move/nft_marketplace/tests/rental_extension_tests.move @@ -0,0 +1,362 @@ + +#[test_only] +module nft_marketplace::rental_extension_tests { + + use kiosk::kiosk_lock_rule as lock_rule; + use nft_marketplace::test_utils::{create_kiosk, create_transfer_policy}; + use nft_marketplace::rental_extension::{Self, ProtectedTP, RentalPolicy}; + use iota::{ + clock::{Self, Clock}, + kiosk::{Kiosk, KioskOwnerCap}, + kiosk_test_utils, + package::{Self, Publisher}, + test_scenario::{Self as ts, Scenario}, + transfer_policy::{TransferPolicy, TransferPolicyCap} + }; + + const CREATOR: address = @0xCCCC; + const RENTER: address = @0xAAAA; + const BORROWER: address = @0xBBBB; + const THIEF: address = @0xDDDD; + + public struct T has key, store { id: UID } + public struct WITNESS has drop {} + + +// ==================== Happy path scenarios ==================== + + #[test] + fun test_rent_with_extension() { + let mut ts = ts::begin(BORROWER); + + let item = T { id: object::new(ts.ctx()) }; + let item_id = object::id(&item); + + let clock = clock::create_for_testing(ts.ctx()); + + let witness = WITNESS {}; + let publisher = package::test_claim(witness, ts.ctx()); + + let renter_kiosk_id = create_kiosk(RENTER, ts.ctx()); + let borrower_kiosk_id = create_kiosk(BORROWER, ts.ctx()); + + setup(&mut ts, RENTER, &publisher, 50); + install_ext(&mut ts, RENTER, renter_kiosk_id); + place_in_kiosk(&mut ts, RENTER, renter_kiosk_id, item); + list_for_rent(&mut ts, RENTER, renter_kiosk_id, item_id, 10, 10); + install_ext(&mut ts, BORROWER, borrower_kiosk_id); + rent(&mut ts, BORROWER, renter_kiosk_id, borrower_kiosk_id, item_id, 100, &clock); + + clock.destroy_for_testing(); + publisher.burn_publisher(); + ts.end(); + } + + #[test] + fun test_reclaim() { + let mut ts = ts::begin(BORROWER); + + let item = T { id: object::new(ts.ctx()) }; + let item_id = object::id(&item); + + let mut clock = clock::create_for_testing(ts.ctx()); + + let witness = WITNESS {}; + let publisher = package::test_claim(witness, ts.ctx()); + + let renter_kiosk_id = create_kiosk(RENTER, ts.ctx()); + let borrower_kiosk_id = create_kiosk(BORROWER, ts.ctx()); + + create_transfer_policy( CREATOR, &publisher, ts.ctx()); + setup(&mut ts, RENTER, &publisher, 50); + place_in_kiosk(&mut ts, RENTER, renter_kiosk_id, item); + install_ext(&mut ts, RENTER, renter_kiosk_id); + list_for_rent(&mut ts, RENTER, renter_kiosk_id, item_id, 10, 10); + install_ext(&mut ts, BORROWER, borrower_kiosk_id); + rent(&mut ts, BORROWER, renter_kiosk_id, borrower_kiosk_id, item_id, 100, &clock); + reclaim(&mut ts, RENTER, renter_kiosk_id, borrower_kiosk_id, item_id, 432000000, &mut clock); + + clock.destroy_for_testing(); + publisher.burn_publisher(); + ts.end(); + } + + // ==================== Negative scenarios ==================== + + #[test] + #[expected_failure(abort_code = rental_extension::EExtensionNotInstalled)] + fun test_rent_without_extension() { + let mut ts = ts::begin(BORROWER); + + let item = T { id: object::new(ts.ctx()) }; + let item_id = object::id(&item); + + let clock = clock::create_for_testing(ts.ctx()); + + let witness = WITNESS {}; + let publisher = package::test_claim(witness, ts.ctx()); + + let renter_kiosk_id = create_kiosk(RENTER, ts.ctx()); + let borrower_kiosk_id = create_kiosk(BORROWER, ts.ctx()); + + setup(&mut ts, RENTER, &publisher, 50); + place_in_kiosk(&mut ts, RENTER, renter_kiosk_id, item); + install_ext(&mut ts, RENTER, renter_kiosk_id); + list_for_rent(&mut ts, RENTER, renter_kiosk_id, item_id, 10, 10); + rent(&mut ts, BORROWER, renter_kiosk_id, borrower_kiosk_id, item_id, 100, &clock); + abort 0xbad + } + + #[test] + #[expected_failure(abort_code = rental_extension::ENotEnoughCoins)] + fun test_rent_with_not_enough_coins() { + let mut ts = ts::begin(BORROWER); + + let item = T { id: object::new(ts.ctx()) }; + let item_id = object::id(&item); + + let clock = clock::create_for_testing(ts.ctx()); + + let witness = WITNESS {}; + let publisher = package::test_claim(witness, ts.ctx()); + + let renter_kiosk_id = create_kiosk(RENTER, ts.ctx()); + let borrower_kiosk_id = create_kiosk(BORROWER, ts.ctx()); + + setup(&mut ts, RENTER, &publisher, 50); + place_in_kiosk(&mut ts, RENTER, renter_kiosk_id, item); + install_ext(&mut ts, RENTER, renter_kiosk_id); + list_for_rent(&mut ts, RENTER, renter_kiosk_id, item_id, 10, 10); + install_ext(&mut ts, BORROWER, borrower_kiosk_id); + rent(&mut ts, BORROWER, renter_kiosk_id, borrower_kiosk_id, item_id, 10, &clock); + abort 0xbad + } + + #[test] + #[expected_failure(abort_code = rental_extension::ETotalPriceOverflow)] + fun test_rent_with_overflow() { + let mut ts = ts::begin(BORROWER); + + let item = T { id: object::new(ts.ctx()) }; + let item_id = object::id(&item); + + let clock = clock::create_for_testing(ts.ctx()); + + let witness = WITNESS {}; + let publisher = package::test_claim(witness, ts.ctx()); + + let renter_kiosk_id = create_kiosk(RENTER, ts.ctx()); + let borrower_kiosk_id = create_kiosk(BORROWER, ts.ctx()); + + setup(&mut ts, RENTER, &publisher, 50); + place_in_kiosk(&mut ts, RENTER, renter_kiosk_id, item); + install_ext(&mut ts, RENTER, renter_kiosk_id); + list_for_rent(&mut ts, RENTER, renter_kiosk_id, item_id, 100, 1844674407370955160); + install_ext(&mut ts, BORROWER, borrower_kiosk_id); + rent(&mut ts, BORROWER, renter_kiosk_id, borrower_kiosk_id, item_id, 100, &clock); + abort 0xbad + } + + #[test] + fun test_reclaim_locked() { + let mut ts = ts::begin(RENTER); + + let item = T { id: object::new(ts.ctx()) }; + let item_id = object::id(&item); + + let mut clock = clock::create_for_testing(ts.ctx()); + + let witness = WITNESS {}; + let publisher = package::test_claim(witness, ts.ctx()); + + let renter_kiosk_id = create_kiosk(RENTER, ts.ctx()); + let borrower_kiosk_id = create_kiosk(BORROWER, ts.ctx()); + + create_transfer_policy(CREATOR, &publisher, ts.ctx()); + add_lock_rule(&mut ts, CREATOR); + setup(&mut ts, RENTER, &publisher, 50); + lock_in_kiosk(&mut ts, RENTER, renter_kiosk_id, item); + install_ext(&mut ts, RENTER, renter_kiosk_id); + list_for_rent(&mut ts, RENTER, renter_kiosk_id, item_id, 10, 10); + install_ext(&mut ts, BORROWER, borrower_kiosk_id); + rent(&mut ts, BORROWER, renter_kiosk_id, borrower_kiosk_id, item_id, 100, &clock); + reclaim(&mut ts, RENTER, renter_kiosk_id, borrower_kiosk_id, item_id, 432000000, &mut clock); + + clock.destroy_for_testing(); + publisher.burn_publisher(); + ts.end(); + } + + #[test] + #[expected_failure(abort_code = rental_extension::EInvalidKiosk)] + fun test_reclaim_wrong_kiosk() { + let mut ts = ts::begin(BORROWER); + + let item = T { id: object::new(ts.ctx()) }; + let item_id = object::id(&item); + + let mut clock = clock::create_for_testing(ts.ctx()); + + let witness = WITNESS {}; + let publisher = package::test_claim(witness, ts.ctx()); + + let renter_kiosk_id = create_kiosk(RENTER, ts.ctx()); + let borrower_kiosk_id = create_kiosk(BORROWER, ts.ctx()); + let thief_kiosk_id = create_kiosk(THIEF, ts.ctx()); + + create_transfer_policy(CREATOR, &publisher, ts.ctx()); + setup(&mut ts, RENTER, &publisher, 50); + place_in_kiosk(&mut ts, RENTER, renter_kiosk_id, item); + install_ext(&mut ts, RENTER, renter_kiosk_id); + list_for_rent(&mut ts, RENTER, renter_kiosk_id, item_id, 10, 10); + install_ext(&mut ts, BORROWER, borrower_kiosk_id); + rent(&mut ts, BORROWER, renter_kiosk_id, borrower_kiosk_id, item_id, 100, &clock); + install_ext(&mut ts, THIEF, thief_kiosk_id); + reclaim(&mut ts, RENTER, thief_kiosk_id, borrower_kiosk_id, item_id, 432000000, &mut clock); + abort 0xbad + } + + // ==================== Helper methods ==================== + + fun place_in_kiosk(ts: &mut Scenario, sender: address, kiosk_id: ID, item: T) { + ts.next_tx(sender); + let mut kiosk: Kiosk = ts.take_shared_by_id(kiosk_id); + let kiosk_cap: KioskOwnerCap = ts.take_from_sender(); + + kiosk.place(&kiosk_cap, item); + + ts::return_shared(kiosk); + ts.return_to_sender(kiosk_cap); + } + + + fun list_for_rent( + ts: &mut Scenario, + sender: address, + kiosk_id: ID, + item_id: ID, + duration: u64, + price: u64, + ) { + ts.next_tx(sender); + let mut kiosk: Kiosk = ts.take_shared_by_id(kiosk_id); + let kiosk_cap: KioskOwnerCap = ts.take_from_sender(); + let protected_tp: ProtectedTP = ts.take_shared(); + + rental_extension::list( + &mut kiosk, + &kiosk_cap, + &protected_tp, + item_id, + duration, + price, + ts.ctx(), + ); + + ts::return_shared(kiosk); + ts.return_to_sender(kiosk_cap); + ts::return_shared(protected_tp); + } + + fun rent( + ts: &mut Scenario, + sender: address, + renter_kiosk_id: ID, + borrower_kiosk_id: ID, + item_id: ID, + coin_amount: u64, + clock: &Clock, + ) { + ts.next_tx(sender); + + let mut borrower_kiosk: Kiosk = ts.take_shared_by_id(borrower_kiosk_id); + let mut renter_kiosk: Kiosk = ts.take_shared_by_id(renter_kiosk_id); + let mut rental_policy: RentalPolicy = ts.take_shared(); + + let coin = kiosk_test_utils::get_iota(coin_amount, ts.ctx()); + + rental_extension::rent( + &mut renter_kiosk, + &mut borrower_kiosk, + &mut rental_policy, + item_id, + coin, + clock, + ts.ctx(), + ); + + ts::return_shared(borrower_kiosk); + ts::return_shared(renter_kiosk); + ts::return_shared(rental_policy); + } + + fun setup(ts: &mut Scenario, sender: address, publisher: &Publisher, amount_bp: u64) { + ts.next_tx(sender); + rental_extension::setup_renting(publisher, amount_bp, ts.ctx()); + } + + fun reclaim( + ts: &mut Scenario, + sender: address, + renter_kiosk_id: ID, + borrower_kiosk_id: ID, + item_id: ID, + tick: u64, + clock: &mut Clock, + ) { + ts.next_tx(sender); + let mut borrower_kiosk: Kiosk = ts.take_shared_by_id(borrower_kiosk_id); + let mut renter_kiosk: Kiosk = ts.take_shared_by_id(renter_kiosk_id); + let policy: TransferPolicy = ts.take_shared(); + + clock.increment_for_testing(tick); + rental_extension::reclaim( + &mut renter_kiosk, + &mut borrower_kiosk, + &policy, + clock, + item_id, + ts.ctx(), + ); + + ts::return_shared(policy); + ts::return_shared(borrower_kiosk); + ts::return_shared(renter_kiosk); + } + + fun add_lock_rule(ts: &mut Scenario, sender: address) { + ts.next_tx(sender); + let mut transfer_policy: TransferPolicy = ts.take_shared(); + let policy_cap: TransferPolicyCap = ts.take_from_sender(); + + lock_rule::add(&mut transfer_policy, &policy_cap); + + ts::return_shared(transfer_policy); + ts.return_to_sender(policy_cap); + } + + fun lock_in_kiosk(ts: &mut Scenario, sender: address, kiosk_id: ID, item: T) { + ts.next_tx(sender); + + let mut kiosk: Kiosk = ts.take_shared_by_id(kiosk_id); + let kiosk_cap: KioskOwnerCap = ts.take_from_sender(); + let transfer_policy: TransferPolicy = ts.take_shared(); + + kiosk.lock(&kiosk_cap, &transfer_policy, item); + + ts::return_shared(kiosk); + ts.return_to_sender(kiosk_cap); + ts::return_shared(transfer_policy); + } + + fun install_ext(ts: &mut Scenario, sender: address, kiosk_id: ID) { + ts.next_tx(sender); + let mut kiosk: Kiosk = ts.take_shared_by_id(kiosk_id); + let kiosk_cap = ts.take_from_sender(); + + rental_extension::install(&mut kiosk, &kiosk_cap, ts.ctx()); + + ts::return_shared(kiosk); + ts.return_to_sender(kiosk_cap); +} +} diff --git a/docs/examples/move/nft_marketplace/tests/utils.move b/docs/examples/move/nft_marketplace/tests/utils.move new file mode 100644 index 00000000000..01498370bcc --- /dev/null +++ b/docs/examples/move/nft_marketplace/tests/utils.move @@ -0,0 +1,24 @@ +#[test_only] +module nft_marketplace::test_utils { + use iota::{ + kiosk_test_utils, + package::Publisher, + transfer_policy::Self + }; + + + public fun create_transfer_policy(sender: address, publisher: &Publisher, ctx: &mut TxContext) { + let (transfer_policy, policy_cap) = transfer_policy::new(publisher, ctx); + transfer::public_share_object(transfer_policy); + transfer::public_transfer(policy_cap, sender); + } + + public fun create_kiosk(sender: address, ctx: &mut TxContext): ID { + let (kiosk, kiosk_cap) = kiosk_test_utils::get_kiosk(ctx); + let kiosk_id = object::id(&kiosk); + transfer::public_share_object(kiosk); + transfer::public_transfer(kiosk_cap, sender); + + kiosk_id +} +} \ No newline at end of file From 3dfe7f84f60bcc609ff6501eed37892bb59185ec Mon Sep 17 00:00:00 2001 From: Thoralf-M <46689931+Thoralf-M@users.noreply.github.com> Date: Thu, 5 Dec 2024 13:02:46 +0100 Subject: [PATCH 07/97] feat(iota, iota-sdk): add IotaEnv::faucet, add/update gas url consts (#4286) Co-authored-by: Thibault Martinez --- crates/iota-sdk/src/iota_client_config.rs | 25 +++++++++++++++-- crates/iota-sdk/src/lib.rs | 4 ++- crates/iota/src/client_commands.rs | 34 +++++++++++++++-------- 3 files changed, 47 insertions(+), 16 deletions(-) diff --git a/crates/iota-sdk/src/iota_client_config.rs b/crates/iota-sdk/src/iota_client_config.rs index 1af4d479611..2cecb9cc899 100644 --- a/crates/iota-sdk/src/iota_client_config.rs +++ b/crates/iota-sdk/src/iota_client_config.rs @@ -13,7 +13,8 @@ use serde::{Deserialize, Serialize}; use serde_with::serde_as; use crate::{ - IOTA_DEVNET_URL, IOTA_LOCAL_NETWORK_URL, IOTA_TESTNET_URL, IotaClient, IotaClientBuilder, + IOTA_DEVNET_GAS_URL, IOTA_DEVNET_URL, IOTA_LOCAL_NETWORK_GAS_URL, IOTA_LOCAL_NETWORK_URL, + IOTA_TESTNET_GAS_URL, IOTA_TESTNET_URL, IotaClient, IotaClientBuilder, }; #[serde_as] @@ -100,6 +101,7 @@ pub struct IotaEnv { /// Basic HTTP access authentication in the format of username:password, if /// needed. pub(crate) basic_auth: Option, + pub(crate) faucet: Option, } impl IotaEnv { @@ -109,6 +111,7 @@ impl IotaEnv { rpc: rpc.into(), ws: None, basic_auth: None, + faucet: None, } } @@ -130,6 +133,15 @@ impl IotaEnv { self.basic_auth = basic_auth.into(); } + pub fn with_faucet(mut self, faucet: impl Into>) -> Self { + self.set_faucet(faucet); + self + } + + pub fn set_faucet(&mut self, faucet: impl Into>) { + self.faucet = faucet.into(); + } + pub async fn create_rpc_client( &self, request_timeout: impl Into>, @@ -167,6 +179,7 @@ impl IotaEnv { rpc: IOTA_DEVNET_URL.into(), ws: None, basic_auth: None, + faucet: Some(IOTA_DEVNET_GAS_URL.into()), } } pub fn testnet() -> Self { @@ -175,6 +188,7 @@ impl IotaEnv { rpc: IOTA_TESTNET_URL.into(), ws: None, basic_auth: None, + faucet: Some(IOTA_TESTNET_GAS_URL.into()), } } @@ -184,6 +198,7 @@ impl IotaEnv { rpc: IOTA_LOCAL_NETWORK_URL.into(), ws: None, basic_auth: None, + faucet: Some(IOTA_LOCAL_NETWORK_GAS_URL.into()), } } } @@ -199,9 +214,13 @@ impl Display for IotaEnv { } if let Some(basic_auth) = &self.basic_auth { writeln!(writer)?; - write!(writer, "Basic Auth: {}", basic_auth)?; + write!(writer, "Basic Auth: {basic_auth}")?; } - write!(f, "{}", writer) + if let Some(faucet) = &self.faucet { + writeln!(writer)?; + write!(writer, "Faucet URL: {faucet}")?; + } + write!(f, "{writer}") } } diff --git a/crates/iota-sdk/src/lib.rs b/crates/iota-sdk/src/lib.rs index dcaa87d612d..bf2227e19ee 100644 --- a/crates/iota-sdk/src/lib.rs +++ b/crates/iota-sdk/src/lib.rs @@ -117,9 +117,11 @@ use crate::{ pub const IOTA_COIN_TYPE: &str = "0x2::iota::IOTA"; pub const IOTA_LOCAL_NETWORK_URL: &str = "http://127.0.0.1:9000"; pub const IOTA_LOCAL_NETWORK_URL_0: &str = "http://0.0.0.0:9000"; -pub const IOTA_LOCAL_NETWORK_GAS_URL: &str = "http://127.0.0.1:5003/gas"; +pub const IOTA_LOCAL_NETWORK_GAS_URL: &str = "http://127.0.0.1:9123/v1/gas"; pub const IOTA_DEVNET_URL: &str = "https://api.devnet.iota.cafe"; +pub const IOTA_DEVNET_GAS_URL: &str = "https://faucet.devnet.iota.cafe/v1/gas"; pub const IOTA_TESTNET_URL: &str = "https://api.testnet.iota.cafe"; +pub const IOTA_TESTNET_GAS_URL: &str = "https://faucet.testnet.iota.cafe/v1/gas"; /// Builder for creating an [IotaClient] for connecting to the Iota network. /// diff --git a/crates/iota/src/client_commands.rs b/crates/iota/src/client_commands.rs index 3ddd783aac7..dfb34bb8808 100644 --- a/crates/iota/src/client_commands.rs +++ b/crates/iota/src/client_commands.rs @@ -38,8 +38,9 @@ use iota_package_management::{LockCommand, PublishedAtError}; use iota_protocol_config::{Chain, ProtocolConfig, ProtocolVersion}; use iota_replay::ReplayToolCommand; use iota_sdk::{ - IOTA_COIN_TYPE, IOTA_DEVNET_URL, IOTA_LOCAL_NETWORK_URL, IOTA_LOCAL_NETWORK_URL_0, - IOTA_TESTNET_URL, IotaClient, + IOTA_COIN_TYPE, IOTA_DEVNET_GAS_URL, IOTA_DEVNET_URL, IOTA_LOCAL_NETWORK_GAS_URL, + IOTA_LOCAL_NETWORK_URL, IOTA_LOCAL_NETWORK_URL_0, IOTA_TESTNET_GAS_URL, IOTA_TESTNET_URL, + IotaClient, apis::ReadApi, iota_client_config::{IotaClientConfig, IotaEnv}, wallet_context::WalletContext, @@ -272,6 +273,9 @@ pub enum IotaClientCommands { ws: Option, #[clap(long, help = "Basic auth in the format of username:password")] basic_auth: Option, + /// Optional faucet Url, for example http://127.0.0.1:9123/v1/gas. + #[clap(long, value_hint = ValueHint::Url)] + faucet: Option, }, /// Get object info @@ -1540,17 +1544,21 @@ impl IotaClientCommands { let active_env = context.config().get_active_env(); if let Ok(env) = active_env { - let network = match env.rpc().as_str() { - IOTA_DEVNET_URL => "https://faucet.devnet.iota.cafe/v1/gas", - IOTA_TESTNET_URL => "https://faucet.testnet.iota.cafe/v1/gas", - IOTA_LOCAL_NETWORK_URL | IOTA_LOCAL_NETWORK_URL_0 => { - "http://127.0.0.1:9123/gas" + let faucet_url = if let Some(faucet_url) = env.faucet() { + faucet_url + } else { + match env.rpc().as_str() { + IOTA_DEVNET_URL => IOTA_DEVNET_GAS_URL, + IOTA_TESTNET_URL => IOTA_TESTNET_GAS_URL, + IOTA_LOCAL_NETWORK_URL | IOTA_LOCAL_NETWORK_URL_0 => { + IOTA_LOCAL_NETWORK_GAS_URL + } + _ => bail!( + "Cannot recognize the active network. Please provide the gas faucet full URL." + ), } - _ => bail!( - "Cannot recognize the active network. Please provide the gas faucet full URL." - ), }; - network.to_string() + faucet_url.to_string() } else { bail!("No URL for faucet was provided and there is no active network.") } @@ -1679,6 +1687,7 @@ impl IotaClientCommands { rpc, ws, basic_auth, + faucet, } => { if context .config() @@ -1692,7 +1701,8 @@ impl IotaClientCommands { } let env = IotaEnv::new(alias, rpc) .with_ws(ws) - .with_basic_auth(basic_auth); + .with_basic_auth(basic_auth) + .with_faucet(faucet); // Check urls are valid and server is reachable env.create_rpc_client(None, None).await?; From 21f80724fd2877021cd70723bf333e30436fa68b Mon Sep 17 00:00:00 2001 From: JCNoguera <88061365+VmMad@users.noreply.github.com> Date: Thu, 5 Dec 2024 13:31:45 +0100 Subject: [PATCH 08/97] refactor(wallet,dashboard): move `TransactionReceipt` to core (#4280) * refactor(wallet,dashboard): move `TransactionReceipt` to core * fix: improve imports * fix: remove unused file * fix: cleanup * rever previous commit * fix: types * fix: update tests * fix: format * refactor: update interfaces to put required first * fix: expandable list * fix: update imported dialog layouts * fix: update missing import * fix: update imports * refactor: rename file * fix(wallet): add core components to tailwind.config.ts * chore: improve interface sorting * fix: celanup types and imports * fix: wait for transaciton and refetch stakes --------- Co-authored-by: Bran <52735957+brancoder@users.noreply.github.com> --- .../buttons/ViewTxnOnExplorerButton.tsx | 23 +++ apps/core/src/components/buttons/index.ts | 4 + .../src/components}/cards/BalanceChanges.tsx | 83 ++++++----- .../components/cards}/ObjectChangeDisplay.tsx | 23 +-- .../src/components}/cards/ObjectChanges.tsx | 63 +++++---- apps/core/src/components/cards/index.ts | 5 + .../components/collapsible/Collapsible.tsx | 5 +- .../src/components/gas}/GasFees.tsx | 18 ++- .../src/components/gas}/GasSummary.tsx | 18 ++- apps/core/src/components/gas/index.ts | 5 + apps/core/src/components/index.ts | 4 + .../src/components/lists}/ExpandableList.tsx | 8 +- apps/core/src/components/lists/index.ts | 4 + .../transaction/TransactionReceipt.tsx | 101 ++++++++++++++ .../transaction/amount/TransactionAmount.tsx | 49 +++++++ .../components/transaction/amount/index.ts | 4 + .../details/StakeTransactionDetails.tsx | 69 +++++++++ .../components/transaction/details/index.ts | 4 + apps/core/src/components/transaction/index.ts | 7 + .../info/StakeTransactionInfo.tsx} | 23 ++- .../info/UnstakeTransactionInfo.tsx} | 37 +++-- .../src/components/transaction/info/index.ts | 5 + .../summary/TransactionSummary.tsx | 49 +++++++ .../components/transaction/summary/index.ts | 4 + apps/core/src/hooks/index.ts | 1 - .../hooks/useExtendedTransactionSummary.ts | 40 ------ apps/core/src/hooks/useGetTransaction.ts | 23 +++ apps/core/src/hooks/useTransactionSummary.ts | 12 +- apps/core/src/index.ts | 2 + .../interfaces/balanceChange.interfaces.ts | 10 ++ apps/core/src/interfaces/index.ts | 5 + .../interfaces/validatorLogo.interfaces.ts | 9 ++ apps/core/src/types/balanceChange.ts | 7 + apps/core/src/types/gasSummary.ts | 18 +++ apps/core/src/types/index.ts | 8 ++ apps/core/src/types/objectChange.ts | 26 ++++ apps/core/src/types/renderComponent.ts | 10 ++ apps/core/src/types/transactionSummary.ts | 14 ++ .../transaction/getBalanceChangeSummary.ts | 13 +- .../src/utils/transaction/getGasSummary.ts | 19 +-- .../utils/transaction/getObjectChangeLabel.ts | 2 +- .../transaction/getObjectChangeSummary.ts | 18 +-- .../src/utils/transaction/groupByOwner.ts | 2 +- apps/core/src/utils/transaction/index.ts | 1 - apps/core/src/utils/transaction/types.ts | 24 ---- .../components/gas-breakdown/GasBreakdown.tsx | 9 +- .../app/(protected)/staking/page.tsx | 19 ++- .../Dialogs/Assets/views/DetailsView.tsx | 14 +- .../Dialogs/Assets/views/SendView.tsx | 14 +- .../Dialogs/Staking/StakeDialog.tsx | 39 +++--- .../components/Dialogs/Staking/enums/index.ts | 4 + .../Dialogs/Staking/enums/view.enums.ts | 11 ++ .../Dialogs/Staking/hooks/useStakeDialog.ts | 3 +- .../components/Dialogs/Staking/index.ts | 1 + .../Dialogs/Staking/views/DetailsView.tsx | 14 +- .../Dialogs/Staking/views/EnterAmountView.tsx | 14 +- .../views/EnterTimelockedAmountView.tsx | 14 +- .../Staking/views/SelectValidatorView.tsx | 14 +- .../Dialogs/Staking/views/UnstakeView.tsx | 14 +- .../Dialogs/Staking/views/Validator.tsx | 30 +++- .../components/Dialogs/TransactionDialog.tsx | 59 ++++++++ .../Layout.tsx => layout/DialogLayout.tsx} | 6 +- .../components/Dialogs/layout/index.ts | 4 + .../Popup/Popups/TransactionDetailsPopup.tsx | 75 ---------- .../components/Popup/Popups/index.ts | 1 - .../components/transactions/GasSummary.tsx | 40 ------ .../transactions/TransactionSummary.tsx | 39 ++++-- .../transactions/TransactionTile.tsx | 131 +++++++++++++----- .../balance-changes/BalanceChangeEntries.tsx | 30 ---- .../balance-changes/BalanceChangeEntry.tsx | 39 ------ .../balance-changes/BalanceChanges.tsx | 19 --- .../transactions/balance-changes/index.ts | 6 - .../components/transactions/index.ts | 6 +- .../object-changes/ObjectChangeEntry.tsx | 44 ------ .../object-changes/ObjectChanges.tsx | 23 --- .../object-changes/ObjectDetail.tsx | 102 -------------- .../transactions/object-changes/index.ts | 6 - .../ui/app/components/ExplorerLinkHelper.tsx | 9 ++ apps/wallet/src/ui/app/components/index.ts | 1 + .../app/components/receipt-card/StakeTxn.tsx | 57 -------- .../ui/app/components/receipt-card/index.tsx | 94 +++---------- .../transaction-request/index.tsx | 12 +- .../src/ui/app/pages/home/receipt/index.tsx | 29 ++-- .../app/shared/transaction-summary/index.tsx | 42 ------ .../src/ui/app/staking/stake/StakeForm.tsx | 10 +- apps/wallet/tailwind.config.ts | 6 +- apps/wallet/tests/balanceChanges.spec.ts | 2 +- 87 files changed, 1025 insertions(+), 960 deletions(-) create mode 100644 apps/core/src/components/buttons/ViewTxnOnExplorerButton.tsx create mode 100644 apps/core/src/components/buttons/index.ts rename apps/{wallet/src/ui/app/shared/transaction-summary => core/src/components}/cards/BalanceChanges.tsx (86%) rename apps/{wallet/src/ui/app/shared/transaction-summary/cards/objectSummary => core/src/components/cards}/ObjectChangeDisplay.tsx (59%) rename apps/{wallet/src/ui/app/shared/transaction-summary => core/src/components}/cards/ObjectChanges.tsx (81%) create mode 100644 apps/core/src/components/cards/index.ts rename apps/{wallet/src/ui/app/pages/approval-request/transaction-request => core/src/components/gas}/GasFees.tsx (76%) rename apps/{wallet/src/ui/app/shared/transaction-summary/cards => core/src/components/gas}/GasSummary.tsx (82%) create mode 100644 apps/core/src/components/gas/index.ts rename apps/{wallet/src/ui/app/shared => core/src/components/lists}/ExpandableList.tsx (87%) create mode 100644 apps/core/src/components/lists/index.ts create mode 100644 apps/core/src/components/transaction/TransactionReceipt.tsx create mode 100644 apps/core/src/components/transaction/amount/TransactionAmount.tsx create mode 100644 apps/core/src/components/transaction/amount/index.ts create mode 100644 apps/core/src/components/transaction/details/StakeTransactionDetails.tsx create mode 100644 apps/core/src/components/transaction/details/index.ts create mode 100644 apps/core/src/components/transaction/index.ts rename apps/{wallet/src/ui/app/components/receipt-card/StakeTxnInfo.tsx => core/src/components/transaction/info/StakeTransactionInfo.tsx} (69%) rename apps/{wallet/src/ui/app/components/receipt-card/UnstakeTxn.tsx => core/src/components/transaction/info/UnstakeTransactionInfo.tsx} (58%) create mode 100644 apps/core/src/components/transaction/info/index.ts create mode 100644 apps/core/src/components/transaction/summary/TransactionSummary.tsx create mode 100644 apps/core/src/components/transaction/summary/index.ts delete mode 100644 apps/core/src/hooks/useExtendedTransactionSummary.ts create mode 100644 apps/core/src/interfaces/balanceChange.interfaces.ts create mode 100644 apps/core/src/interfaces/index.ts create mode 100644 apps/core/src/interfaces/validatorLogo.interfaces.ts create mode 100644 apps/core/src/types/balanceChange.ts create mode 100644 apps/core/src/types/gasSummary.ts create mode 100644 apps/core/src/types/index.ts create mode 100644 apps/core/src/types/objectChange.ts create mode 100644 apps/core/src/types/renderComponent.ts create mode 100644 apps/core/src/types/transactionSummary.ts delete mode 100644 apps/core/src/utils/transaction/types.ts create mode 100644 apps/wallet-dashboard/components/Dialogs/Staking/enums/index.ts create mode 100644 apps/wallet-dashboard/components/Dialogs/Staking/enums/view.enums.ts create mode 100644 apps/wallet-dashboard/components/Dialogs/TransactionDialog.tsx rename apps/wallet-dashboard/components/Dialogs/{Staking/views/Layout.tsx => layout/DialogLayout.tsx} (76%) create mode 100644 apps/wallet-dashboard/components/Dialogs/layout/index.ts delete mode 100644 apps/wallet-dashboard/components/Popup/Popups/TransactionDetailsPopup.tsx delete mode 100644 apps/wallet-dashboard/components/transactions/GasSummary.tsx delete mode 100644 apps/wallet-dashboard/components/transactions/balance-changes/BalanceChangeEntries.tsx delete mode 100644 apps/wallet-dashboard/components/transactions/balance-changes/BalanceChangeEntry.tsx delete mode 100644 apps/wallet-dashboard/components/transactions/balance-changes/BalanceChanges.tsx delete mode 100644 apps/wallet-dashboard/components/transactions/balance-changes/index.ts delete mode 100644 apps/wallet-dashboard/components/transactions/object-changes/ObjectChangeEntry.tsx delete mode 100644 apps/wallet-dashboard/components/transactions/object-changes/ObjectChanges.tsx delete mode 100644 apps/wallet-dashboard/components/transactions/object-changes/ObjectDetail.tsx delete mode 100644 apps/wallet-dashboard/components/transactions/object-changes/index.ts create mode 100644 apps/wallet/src/ui/app/components/ExplorerLinkHelper.tsx delete mode 100644 apps/wallet/src/ui/app/components/receipt-card/StakeTxn.tsx delete mode 100644 apps/wallet/src/ui/app/shared/transaction-summary/index.tsx diff --git a/apps/core/src/components/buttons/ViewTxnOnExplorerButton.tsx b/apps/core/src/components/buttons/ViewTxnOnExplorerButton.tsx new file mode 100644 index 00000000000..247241de188 --- /dev/null +++ b/apps/core/src/components/buttons/ViewTxnOnExplorerButton.tsx @@ -0,0 +1,23 @@ +// Copyright (c) 2024 IOTA Stiftung +// SPDX-License-Identifier: Apache-2.0 + +import React, { JSX } from 'react'; +import { Button, ButtonType, LoadingIndicator } from '@iota/apps-ui-kit'; +import { ArrowTopRight } from '@iota/ui-icons'; + +interface ViewTxnOnExplorerButtonProps { + digest?: string; +} + +export function ViewTxnOnExplorerButton({ digest }: ViewTxnOnExplorerButtonProps): JSX.Element { + return ( +
diff --git a/apps/wallet/src/ui/app/shared/transaction-summary/cards/GasSummary.tsx b/apps/core/src/components/gas/GasSummary.tsx similarity index 82% rename from apps/wallet/src/ui/app/shared/transaction-summary/cards/GasSummary.tsx rename to apps/core/src/components/gas/GasSummary.tsx index e4a7f2ecd98..8bad6d508d4 100644 --- a/apps/wallet/src/ui/app/shared/transaction-summary/cards/GasSummary.tsx +++ b/apps/core/src/components/gas/GasSummary.tsx @@ -2,22 +2,30 @@ // Modifications Copyright (c) 2024 IOTA Stiftung // SPDX-License-Identifier: Apache-2.0 -import { useFormatCoin, type GasSummaryType } from '@iota/core'; +import React from 'react'; +import { ExplorerLinkType, useFormatCoin, type GasSummaryType } from '../../'; +import { RenderExplorerLink } from '../../types'; import { formatAddress, IOTA_TYPE_ARG } from '@iota/iota-sdk/utils'; import { KeyValueInfo } from '@iota/apps-ui-kit'; -import { useActiveAddress } from '_src/ui/app/hooks'; -import { ExplorerLink, ExplorerLinkType } from '_src/ui/app/components'; interface GasSummaryProps { + renderExplorerLink: RenderExplorerLink; + activeAddress: string | null | undefined; sender?: string | null; gasSummary?: GasSummaryType; isPending?: boolean; isError?: boolean; } -export function GasSummary({ sender, gasSummary, isPending, isError }: GasSummaryProps) { - const activeAddress = useActiveAddress(); +export function GasSummary({ + sender, + gasSummary, + isPending, + isError, + renderExplorerLink: ExplorerLink, + activeAddress, +}: GasSummaryProps) { const address = sender || activeAddress; const [gas, symbol] = useFormatCoin(gasSummary?.totalGas, IOTA_TYPE_ARG); diff --git a/apps/core/src/components/gas/index.ts b/apps/core/src/components/gas/index.ts new file mode 100644 index 00000000000..8e3998f5365 --- /dev/null +++ b/apps/core/src/components/gas/index.ts @@ -0,0 +1,5 @@ +// Copyright (c) 2024 IOTA Stiftung +// SPDX-License-Identifier: Apache-2.0 + +export * from './GasSummary'; +export * from './GasFees'; diff --git a/apps/core/src/components/index.ts b/apps/core/src/components/index.ts index 33fa79344a8..01683e56bb0 100644 --- a/apps/core/src/components/index.ts +++ b/apps/core/src/components/index.ts @@ -2,9 +2,13 @@ // SPDX-License-Identifier: Apache-2.0 export * from './coin'; +export * from './cards'; +export * from './gas'; export * from './icon'; export * from './Inputs'; export * from './QR'; +export * from './transaction'; +export * from './buttons'; export * from './collapsible'; export * from './providers'; export * from './stake'; diff --git a/apps/wallet/src/ui/app/shared/ExpandableList.tsx b/apps/core/src/components/lists/ExpandableList.tsx similarity index 87% rename from apps/wallet/src/ui/app/shared/ExpandableList.tsx rename to apps/core/src/components/lists/ExpandableList.tsx index 475fe06300f..afd6bacce0c 100644 --- a/apps/wallet/src/ui/app/shared/ExpandableList.tsx +++ b/apps/core/src/components/lists/ExpandableList.tsx @@ -3,18 +3,18 @@ // SPDX-License-Identifier: Apache-2.0 import clsx from 'clsx'; -import { useMemo, useState, type ReactNode } from 'react'; - +import React, { useMemo, useState, type ReactNode } from 'react'; import { TriangleDown } from '@iota/ui-icons'; import { Button, ButtonSize, ButtonType } from '@iota/apps-ui-kit'; interface ExpandableListProps { items: ReactNode[]; defaultItemsToShow: number; + initialShowAll?: boolean; } -export function ExpandableList({ items, defaultItemsToShow }: ExpandableListProps) { - const [showAll, setShowAll] = useState(false); +export function ExpandableList({ items, defaultItemsToShow, initialShowAll }: ExpandableListProps) { + const [showAll, setShowAll] = useState(initialShowAll || false); const itemsDisplayed = useMemo( () => (showAll ? items : items?.slice(0, defaultItemsToShow)), diff --git a/apps/core/src/components/lists/index.ts b/apps/core/src/components/lists/index.ts new file mode 100644 index 00000000000..e1388dacb72 --- /dev/null +++ b/apps/core/src/components/lists/index.ts @@ -0,0 +1,4 @@ +// Copyright (c) 2024 IOTA Stiftung +// SPDX-License-Identifier: Apache-2.0 + +export * from './ExpandableList'; diff --git a/apps/core/src/components/transaction/TransactionReceipt.tsx b/apps/core/src/components/transaction/TransactionReceipt.tsx new file mode 100644 index 00000000000..99cac6112af --- /dev/null +++ b/apps/core/src/components/transaction/TransactionReceipt.tsx @@ -0,0 +1,101 @@ +// Copyright (c) 2024 IOTA Stiftung +// SPDX-License-Identifier: Apache-2.0 + +import React from 'react'; +import { InfoBox, InfoBoxStyle, InfoBoxType } from '@iota/apps-ui-kit'; +import { formatDate, type useTransactionSummary } from '../../hooks'; +import { CheckmarkFilled } from '@iota/ui-icons'; +import { IotaTransactionBlockResponse } from '@iota/iota-sdk/client'; +import { STAKING_REQUEST_EVENT, UNSTAKING_REQUEST_EVENT } from '../../constants'; +import { StakeTransactionDetails } from './details'; +import { UnstakeTransactionInfo } from './info'; +import { TransactionSummary } from './summary'; +import { RenderExplorerLink, RenderValidatorLogo } from '../../types'; +import { GasFees } from '../gas'; + +interface TransactionReceiptProps { + txn: IotaTransactionBlockResponse; + activeAddress: string | null; + summary: Exclude, null>; + renderValidatorLogo: RenderValidatorLogo; + renderExplorerLink: RenderExplorerLink; +} + +export function TransactionReceipt({ + txn, + activeAddress, + summary, + renderValidatorLogo, + renderExplorerLink, +}: TransactionReceiptProps) { + const { events } = txn; + + const isSender = txn.transaction?.data.sender === activeAddress; + + const stakeTypeTransaction = events?.find(({ type }) => type === STAKING_REQUEST_EVENT); + const unstakeTypeTransaction = events?.find(({ type }) => type === UNSTAKING_REQUEST_EVENT); + + return ( +
+ + {stakeTypeTransaction || unstakeTypeTransaction ? ( + <> + {stakeTypeTransaction ? ( + + ) : null} + + {unstakeTypeTransaction ? ( + + ) : null} + + ) : ( + <> + + {isSender && ( + + )} + + )} +
+ ); +} + +interface TransactionStatusProps { + success: boolean; + timestamp?: string; + isIncoming?: boolean; +} + +function TransactionStatus({ success, timestamp, isIncoming }: TransactionStatusProps) { + const txnDate = timestamp ? formatDate(Number(timestamp)) : ''; + const successMessage = isIncoming ? 'Successfully received' : 'Successfully sent'; + return ( + } + /> + ); +} diff --git a/apps/core/src/components/transaction/amount/TransactionAmount.tsx b/apps/core/src/components/transaction/amount/TransactionAmount.tsx new file mode 100644 index 00000000000..6305dd2ae88 --- /dev/null +++ b/apps/core/src/components/transaction/amount/TransactionAmount.tsx @@ -0,0 +1,49 @@ +// Copyright (c) Mysten Labs, Inc. +// Modifications Copyright (c) 2024 IOTA Stiftung +// SPDX-License-Identifier: Apache-2.0 + +import React from 'react'; +import { ImageIconSize, CoinIcon } from '../..'; +import { + Card, + CardAction, + CardActionType, + CardBody, + CardImage, + CardType, + ImageType, +} from '@iota/apps-ui-kit'; +import { useFormatCoin } from '../../../hooks'; + +interface TransactionAmountProps { + amount: string | number | bigint; + coinType: string; + subtitle: string; + approximation?: boolean; +} + +// dont show amount if it is 0 +// This happens when a user sends a transaction to self; +export function TransactionAmount({ + amount, + coinType, + subtitle, + approximation, +}: TransactionAmountProps) { + const [formatAmount, symbol] = useFormatCoin(Math.abs(Number(amount)), coinType); + + return Number(amount) !== 0 ? ( + + +
+ +
+
+ + +
+ ) : null; +} diff --git a/apps/core/src/components/transaction/amount/index.ts b/apps/core/src/components/transaction/amount/index.ts new file mode 100644 index 00000000000..a2cc5969cdd --- /dev/null +++ b/apps/core/src/components/transaction/amount/index.ts @@ -0,0 +1,4 @@ +// Copyright (c) 2024 IOTA Stiftung +// SPDX-License-Identifier: Apache-2.0 + +export * from './TransactionAmount'; diff --git a/apps/core/src/components/transaction/details/StakeTransactionDetails.tsx b/apps/core/src/components/transaction/details/StakeTransactionDetails.tsx new file mode 100644 index 00000000000..c9e247f3d12 --- /dev/null +++ b/apps/core/src/components/transaction/details/StakeTransactionDetails.tsx @@ -0,0 +1,69 @@ +// Copyright (c) 2024 IOTA Stiftung +// SPDX-License-Identifier: Apache-2.0 + +import { IotaEvent } from '@iota/iota-sdk/client'; +import { formatPercentageDisplay } from '../../../utils'; +import { useGetValidatorsApy } from '../../../hooks'; +import { TransactionAmount } from '../amount'; +import { StakeTransactionInfo } from '../info'; +import { IOTA_TYPE_ARG } from '@iota/iota-sdk/utils'; +import type { GasSummaryType, RenderExplorerLink, RenderValidatorLogo } from '../../../types'; + +interface StakeTransactionDetailsProps { + event: IotaEvent; + activeAddress: string | null; + renderExplorerLink: RenderExplorerLink; + renderValidatorLogo: RenderValidatorLogo; + gasSummary?: GasSummaryType; +} + +export function StakeTransactionDetails({ + event, + gasSummary, + activeAddress, + renderValidatorLogo: ValidatorLogo, + renderExplorerLink, +}: StakeTransactionDetailsProps) { + const json = event.parsedJson as { + amount: string; + validator_address: string; + epoch: string; + }; + const validatorAddress = json?.validator_address; + const stakedAmount = json?.amount; + const stakedEpoch = Number(json?.epoch || '0'); + + const { data: rollingAverageApys } = useGetValidatorsApy(); + + const { apy, isApyApproxZero } = rollingAverageApys?.[validatorAddress] ?? { + apy: null, + }; + + return ( +
+ {validatorAddress && ( + + )} + {stakedAmount && ( + + )} + + +
+ ); +} diff --git a/apps/core/src/components/transaction/details/index.ts b/apps/core/src/components/transaction/details/index.ts new file mode 100644 index 00000000000..021232db15a --- /dev/null +++ b/apps/core/src/components/transaction/details/index.ts @@ -0,0 +1,4 @@ +// Copyright (c) 2024 IOTA Stiftung +// SPDX-License-Identifier: Apache-2.0 + +export * from './StakeTransactionDetails'; diff --git a/apps/core/src/components/transaction/index.ts b/apps/core/src/components/transaction/index.ts new file mode 100644 index 00000000000..bedefbc5d7e --- /dev/null +++ b/apps/core/src/components/transaction/index.ts @@ -0,0 +1,7 @@ +// Copyright (c) 2024 IOTA Stiftung +// SPDX-License-Identifier: Apache-2.0 + +export * from './info'; +export * from './summary'; + +export * from './TransactionReceipt'; diff --git a/apps/wallet/src/ui/app/components/receipt-card/StakeTxnInfo.tsx b/apps/core/src/components/transaction/info/StakeTransactionInfo.tsx similarity index 69% rename from apps/wallet/src/ui/app/components/receipt-card/StakeTxnInfo.tsx rename to apps/core/src/components/transaction/info/StakeTransactionInfo.tsx index c4b94e7eb6f..47f00c48d4f 100644 --- a/apps/wallet/src/ui/app/components/receipt-card/StakeTxnInfo.tsx +++ b/apps/core/src/components/transaction/info/StakeTransactionInfo.tsx @@ -2,17 +2,26 @@ // Modifications Copyright (c) 2024 IOTA Stiftung // SPDX-License-Identifier: Apache-2.0 +import React from 'react'; import { Divider, KeyValueInfo, Panel, TooltipPosition } from '@iota/apps-ui-kit'; -import { type GasSummaryType, useStakeTxnInfo } from '@iota/core'; -import { GasSummary } from '../../shared/transaction-summary/cards/GasSummary'; +import { type GasSummaryType, useStakeTxnInfo, GasSummary } from '../../../'; +import { RenderExplorerLink } from '../../../types'; -interface StakeTxnInfoProps { +interface StakeTransactionInfoProps { + activeAddress: string | null; + renderExplorerLink: RenderExplorerLink; apy?: string; startEpoch?: string | number; gasSummary?: GasSummaryType; } -export function StakeTxnInfo({ apy, startEpoch, gasSummary }: StakeTxnInfoProps) { +export function StakeTransactionInfo({ + apy, + startEpoch, + gasSummary, + activeAddress, + renderExplorerLink, +}: StakeTransactionInfoProps) { const { stakedRewardsStartEpoch, timeBeforeStakeRewardsRedeemableAgoDisplay } = useStakeTxnInfo(startEpoch); return ( @@ -38,7 +47,11 @@ export function StakeTxnInfo({ apy, startEpoch, gasSummary }: StakeTxnInfoProps) fullwidth /> - +
); diff --git a/apps/wallet/src/ui/app/components/receipt-card/UnstakeTxn.tsx b/apps/core/src/components/transaction/info/UnstakeTransactionInfo.tsx similarity index 58% rename from apps/wallet/src/ui/app/components/receipt-card/UnstakeTxn.tsx rename to apps/core/src/components/transaction/info/UnstakeTransactionInfo.tsx index 3b9a52e6a51..bb69cf69226 100644 --- a/apps/wallet/src/ui/app/components/receipt-card/UnstakeTxn.tsx +++ b/apps/core/src/components/transaction/info/UnstakeTransactionInfo.tsx @@ -2,21 +2,30 @@ // Modifications Copyright (c) 2024 IOTA Stiftung // SPDX-License-Identifier: Apache-2.0 -import { ValidatorLogo } from '_app/staking/validators/ValidatorLogo'; -import { TxnAmount } from '_components'; -import { type GasSummaryType, useFormatCoin } from '@iota/core'; +import React from 'react'; +import { TransactionAmount } from '../amount'; import type { IotaEvent } from '@iota/iota-sdk/client'; import { IOTA_TYPE_ARG } from '@iota/iota-sdk/utils'; +import type { GasSummaryType, RenderExplorerLink, RenderValidatorLogo } from '../../../types'; +import { useFormatCoin } from '../../../hooks'; +import { Divider, KeyValueInfo, Panel } from '@iota/apps-ui-kit'; +import { GasSummary } from '../../..'; -import { CardType, Divider, KeyValueInfo, Panel } from '@iota/apps-ui-kit'; -import { GasSummary } from '../../shared/transaction-summary/cards/GasSummary'; - -interface UnStakeTxnProps { +interface UnstakeTransactionInfoProps { + activeAddress: string | null; event: IotaEvent; + renderValidatorLogo: RenderValidatorLogo; + renderExplorerLink: RenderExplorerLink; gasSummary?: GasSummaryType; } -export function UnStakeTxn({ event, gasSummary }: UnStakeTxnProps) { +export function UnstakeTransactionInfo({ + activeAddress, + event, + gasSummary, + renderValidatorLogo: ValidatorLogo, + renderExplorerLink, +}: UnstakeTransactionInfoProps) { const json = event.parsedJson as { principal_amount?: number; reward_amount?: number; @@ -31,11 +40,9 @@ export function UnStakeTxn({ event, gasSummary }: UnStakeTxnProps) { return (
- {validatorAddress && ( - - )} + {validatorAddress && } {totalAmount && ( - + )}
@@ -50,7 +57,11 @@ export function UnStakeTxn({ event, gasSummary }: UnStakeTxnProps) { fullwidth /> - +
diff --git a/apps/core/src/components/transaction/info/index.ts b/apps/core/src/components/transaction/info/index.ts new file mode 100644 index 00000000000..60bcbb74f47 --- /dev/null +++ b/apps/core/src/components/transaction/info/index.ts @@ -0,0 +1,5 @@ +// Copyright (c) 2024 IOTA Stiftung +// SPDX-License-Identifier: Apache-2.0 + +export * from './StakeTransactionInfo'; +export * from './UnstakeTransactionInfo'; diff --git a/apps/core/src/components/transaction/summary/TransactionSummary.tsx b/apps/core/src/components/transaction/summary/TransactionSummary.tsx new file mode 100644 index 00000000000..090d84d8ece --- /dev/null +++ b/apps/core/src/components/transaction/summary/TransactionSummary.tsx @@ -0,0 +1,49 @@ +// Copyright (c) Mysten Labs, Inc. +// Modifications Copyright (c) 2024 IOTA Stiftung +// SPDX-License-Identifier: Apache-2.0 +import React from 'react'; +import { type TransactionSummaryType } from '../../..'; +import { BalanceChanges, ObjectChanges } from '../../cards'; +import { LoadingIndicator, Title, TitleSize } from '@iota/apps-ui-kit'; +import { RenderExplorerLink } from '../../../types'; + +interface TransactionSummaryProps { + summary: TransactionSummaryType; + renderExplorerLink: RenderExplorerLink; + isLoading?: boolean; + isError?: boolean; + isDryRun?: boolean; +} + +export function TransactionSummary({ + summary, + isLoading, + isError, + isDryRun = false, + renderExplorerLink, +}: TransactionSummaryProps) { + if (isError) return null; + return ( + <> + {isLoading ? ( +
+ +
+ ) : ( +
+ {isDryRun && ( + + )} + <BalanceChanges + changes={summary?.balanceChanges} + renderExplorerLink={renderExplorerLink} + /> + <ObjectChanges + changes={summary?.objectSummary} + renderExplorerLink={renderExplorerLink} + /> + </div> + )} + </> + ); +} diff --git a/apps/core/src/components/transaction/summary/index.ts b/apps/core/src/components/transaction/summary/index.ts new file mode 100644 index 00000000000..60b127c09ce --- /dev/null +++ b/apps/core/src/components/transaction/summary/index.ts @@ -0,0 +1,4 @@ +// Copyright (c) 2024 IOTA Stiftung +// SPDX-License-Identifier: Apache-2.0 + +export * from './TransactionSummary'; diff --git a/apps/core/src/hooks/index.ts b/apps/core/src/hooks/index.ts index 13c49c813b6..122b9b01294 100644 --- a/apps/core/src/hooks/index.ts +++ b/apps/core/src/hooks/index.ts @@ -30,7 +30,6 @@ export * from './useTokenPrice'; export * from './useKioskClient'; export * from './useQueryTransactionsByAddress'; export * from './useGetTransaction'; -export * from './useExtendedTransactionSummary'; export * from './useSortedCoinsByCategories'; export * from './useGetNFTDisplay'; export * from './useIotaAddressValidation'; diff --git a/apps/core/src/hooks/useExtendedTransactionSummary.ts b/apps/core/src/hooks/useExtendedTransactionSummary.ts deleted file mode 100644 index 8fb9ccc3b36..00000000000 --- a/apps/core/src/hooks/useExtendedTransactionSummary.ts +++ /dev/null @@ -1,40 +0,0 @@ -// Copyright (c) 2024 IOTA Stiftung -// SPDX-License-Identifier: Apache-2.0 - -import { useTransactionSummary } from './'; -import { useCurrentAccount, useIotaClient } from '@iota/dapp-kit'; -import { IotaTransactionBlockResponse } from '@iota/iota-sdk/client'; -import { useQuery } from '@tanstack/react-query'; - -export function useExtendedTransactionSummary( - transactionDigest: string, -): ReturnType<typeof useTransactionSummary> { - const currentAccount = useCurrentAccount(); - const client = useIotaClient(); - - const { data: transactionData } = useQuery<IotaTransactionBlockResponse>({ - queryKey: ['transactions-by-id', transactionDigest], - queryFn: async () => { - return client.getTransactionBlock({ - digest: transactionDigest, - options: { - showBalanceChanges: true, - showObjectChanges: true, - showInput: true, - showEffects: true, - showEvents: true, - }, - }); - }, - enabled: !!transactionDigest, - retry: 8, - }); - - const summary = useTransactionSummary({ - transaction: transactionData, - currentAddress: currentAccount?.address, - recognizedPackagesList: [], - }); - - return summary; -} diff --git a/apps/core/src/hooks/useGetTransaction.ts b/apps/core/src/hooks/useGetTransaction.ts index 8ceab13c2cf..7fd0d818f33 100644 --- a/apps/core/src/hooks/useGetTransaction.ts +++ b/apps/core/src/hooks/useGetTransaction.ts @@ -5,9 +5,11 @@ import { useIotaClient } from '@iota/dapp-kit'; import { type IotaTransactionBlockResponse } from '@iota/iota-sdk/client'; import { type UseQueryResult, useQuery } from '@tanstack/react-query'; +import { useTransactionSummary } from './useTransactionSummary'; export function useGetTransaction( transactionId: string, + queryOptions?: { retry?: number; initialData?: IotaTransactionBlockResponse }, ): UseQueryResult<IotaTransactionBlockResponse, Error> { const client = useIotaClient(); return useQuery<IotaTransactionBlockResponse, Error>({ @@ -24,5 +26,26 @@ export function useGetTransaction( }, }), enabled: !!transactionId, + retry: queryOptions?.retry, + initialData: queryOptions?.initialData, }); } + +export function useGetTransactionWithSummary( + transactionDigest: string, + currentAddress: string, + initialData?: IotaTransactionBlockResponse, + recognizedPackagesList: string[] = [], +) { + const txResponse = useGetTransaction(transactionDigest, { retry: 8, initialData }); + + const { data: transaction } = txResponse; + + const summary = useTransactionSummary({ + transaction, + currentAddress, + recognizedPackagesList, + }); + + return { summary, ...txResponse }; +} diff --git a/apps/core/src/hooks/useTransactionSummary.ts b/apps/core/src/hooks/useTransactionSummary.ts index aab6f4613c3..f34bfa4001d 100644 --- a/apps/core/src/hooks/useTransactionSummary.ts +++ b/apps/core/src/hooks/useTransactionSummary.ts @@ -7,14 +7,14 @@ import { } from '@iota/iota-sdk/client'; import { useMemo } from 'react'; -import { getBalanceChangeSummary } from '../utils/transaction/getBalanceChangeSummary'; -import { getGasSummary } from '../utils/transaction/getGasSummary'; -import { getLabel } from '../utils/transaction/getLabel'; +import { IotaObjectChangeWithDisplay } from '../types'; import { + getBalanceChangeSummary, + getGasSummary, + getLabel, getObjectChangeSummary, - IotaObjectChangeWithDisplay, -} from '../utils/transaction/getObjectChangeSummary'; -import { getObjectDisplayLookup } from '../utils/transaction/getObjectDisplayLookup'; + getObjectDisplayLookup, +} from '../utils'; import { useMultiGetObjects } from './useMultiGetObjects'; export function useTransactionSummary({ diff --git a/apps/core/src/index.ts b/apps/core/src/index.ts index a9aadd0b1e5..17d578f2916 100644 --- a/apps/core/src/index.ts +++ b/apps/core/src/index.ts @@ -11,3 +11,5 @@ export * from './constants'; export * from './contexts'; export * from './enums'; export * from './forms'; +export * from './types'; +export * from './interfaces'; diff --git a/apps/core/src/interfaces/balanceChange.interfaces.ts b/apps/core/src/interfaces/balanceChange.interfaces.ts new file mode 100644 index 00000000000..35b8fb877a6 --- /dev/null +++ b/apps/core/src/interfaces/balanceChange.interfaces.ts @@ -0,0 +1,10 @@ +// Copyright (c) 2024 IOTA Stiftung +// SPDX-License-Identifier: Apache-2.0 + +export type BalanceChange = { + coinType: string; + amount: string; + unRecognizedToken: boolean; + recipient?: string; + owner?: string; +}; diff --git a/apps/core/src/interfaces/index.ts b/apps/core/src/interfaces/index.ts new file mode 100644 index 00000000000..3194d2ae0a1 --- /dev/null +++ b/apps/core/src/interfaces/index.ts @@ -0,0 +1,5 @@ +// Copyright (c) 2024 IOTA Stiftung +// SPDX-License-Identifier: Apache-2.0 + +export * from './validatorLogo.interfaces'; +export * from './balanceChange.interfaces'; diff --git a/apps/core/src/interfaces/validatorLogo.interfaces.ts b/apps/core/src/interfaces/validatorLogo.interfaces.ts new file mode 100644 index 00000000000..26b2d558ff2 --- /dev/null +++ b/apps/core/src/interfaces/validatorLogo.interfaces.ts @@ -0,0 +1,9 @@ +// Copyright (c) 2024 IOTA Stiftung +// SPDX-License-Identifier: Apache-2.0 + +export interface ValidatorLogoProps { + address: string; + isSelected: boolean; + showActiveStatus?: boolean; + activeEpoch?: string; +} diff --git a/apps/core/src/types/balanceChange.ts b/apps/core/src/types/balanceChange.ts new file mode 100644 index 00000000000..8193462b86b --- /dev/null +++ b/apps/core/src/types/balanceChange.ts @@ -0,0 +1,7 @@ +// Copyright (c) 2024 IOTA Stiftung +// SPDX-License-Identifier: Apache-2.0 + +import { BalanceChange } from '../interfaces'; + +export type BalanceChangeByOwner = Record<string, BalanceChange[]>; +export type BalanceChangeSummary = BalanceChangeByOwner | null; diff --git a/apps/core/src/types/gasSummary.ts b/apps/core/src/types/gasSummary.ts new file mode 100644 index 00000000000..312e04be24f --- /dev/null +++ b/apps/core/src/types/gasSummary.ts @@ -0,0 +1,18 @@ +// Copyright (c) 2024 IOTA Stiftung +// SPDX-License-Identifier: Apache-2.0 + +import { GasCostSummary, IotaGasData } from '@iota/iota-sdk/client'; + +type Optional<T> = { + [K in keyof T]?: T[K]; +}; + +export type GasSummaryType = + | (GasCostSummary & + Optional<IotaGasData> & { + isSponsored: boolean; + gasUsed: GasCostSummary; + totalGas?: string; + owner?: string; + }) + | null; diff --git a/apps/core/src/types/index.ts b/apps/core/src/types/index.ts new file mode 100644 index 00000000000..da698c54d8d --- /dev/null +++ b/apps/core/src/types/index.ts @@ -0,0 +1,8 @@ +// Copyright (c) 2024 IOTA Stiftung +// SPDX-License-Identifier: Apache-2.0 + +export * from './renderComponent'; +export * from './balanceChange'; +export * from './objectChange'; +export * from './transactionSummary'; +export * from './gasSummary'; diff --git a/apps/core/src/types/objectChange.ts b/apps/core/src/types/objectChange.ts new file mode 100644 index 00000000000..5c1c878e61d --- /dev/null +++ b/apps/core/src/types/objectChange.ts @@ -0,0 +1,26 @@ +// Copyright (c) 2024 IOTA Stiftung +// SPDX-License-Identifier: Apache-2.0 + +import { DisplayFieldsResponse, IotaObjectChange } from '@iota/iota-sdk/client'; + +export type IotaObjectChangeTypes = + | 'published' + | 'transferred' + | 'mutated' + | 'deleted' + | 'wrapped' + | 'created'; + +export type WithDisplayFields<T> = T & { display?: DisplayFieldsResponse }; +export type IotaObjectChangeWithDisplay = WithDisplayFields<IotaObjectChange>; + +export type ObjectChange = { + changesWithDisplay: IotaObjectChangeWithDisplay[]; + changes: IotaObjectChange[]; + ownerType: string; +}; +export type ObjectChangesByOwner = Record<string, ObjectChange>; + +export type ObjectChangeSummary = { + [K in IotaObjectChangeTypes]: ObjectChangesByOwner; +}; diff --git a/apps/core/src/types/renderComponent.ts b/apps/core/src/types/renderComponent.ts new file mode 100644 index 00000000000..3059aa3f24d --- /dev/null +++ b/apps/core/src/types/renderComponent.ts @@ -0,0 +1,10 @@ +// Copyright (c) 2024 IOTA Stiftung +// SPDX-License-Identifier: Apache-2.0 + +import type { PropsWithChildren, JSX } from 'react'; +import type { ExplorerLinkConfig } from '../utils/getExplorerLink'; +import type { ValidatorLogoProps } from '../interfaces'; + +export type RenderExplorerLinkProps = PropsWithChildren<ExplorerLinkConfig>; +export type RenderExplorerLink = (props: RenderExplorerLinkProps) => JSX.Element; +export type RenderValidatorLogo = (props: ValidatorLogoProps) => JSX.Element; diff --git a/apps/core/src/types/transactionSummary.ts b/apps/core/src/types/transactionSummary.ts new file mode 100644 index 00000000000..ddcdaa2122e --- /dev/null +++ b/apps/core/src/types/transactionSummary.ts @@ -0,0 +1,14 @@ +// Copyright (c) Mysten Labs, Inc. +// Modifications Copyright (c) 2024 IOTA Stiftung +// SPDX-License-Identifier: Apache-2.0 + +import type { GasSummaryType, BalanceChangeSummary, ObjectChangeSummary } from '.'; + +export type TransactionSummaryType = { + balanceChanges: BalanceChangeSummary; + objectSummary: ObjectChangeSummary | null; + digest?: string; + sender?: string; + timestamp?: string | null; + gas?: GasSummaryType; +} | null; diff --git a/apps/core/src/utils/transaction/getBalanceChangeSummary.ts b/apps/core/src/utils/transaction/getBalanceChangeSummary.ts index 31f7b3cab84..0f8147bd6f1 100644 --- a/apps/core/src/utils/transaction/getBalanceChangeSummary.ts +++ b/apps/core/src/utils/transaction/getBalanceChangeSummary.ts @@ -7,17 +7,8 @@ import { type IotaTransactionBlockResponse, } from '@iota/iota-sdk/client'; import { normalizeIotaObjectId, parseStructTag } from '@iota/iota-sdk/utils'; - -export type BalanceChange = { - coinType: string; - amount: string; - recipient?: string; - owner?: string; - unRecognizedToken: boolean; -}; - -export type BalanceChangeByOwner = Record<string, BalanceChange[]>; -export type BalanceChangeSummary = BalanceChangeByOwner | null; +import { BalanceChange } from '../../interfaces'; +import { BalanceChangeByOwner } from '../../types'; function getOwnerAddress(owner: ObjectOwner): string { if (typeof owner === 'object') { diff --git a/apps/core/src/utils/transaction/getGasSummary.ts b/apps/core/src/utils/transaction/getGasSummary.ts index 934002b6da2..cbbf047d41e 100644 --- a/apps/core/src/utils/transaction/getGasSummary.ts +++ b/apps/core/src/utils/transaction/getGasSummary.ts @@ -1,27 +1,12 @@ // Copyright (c) Mysten Labs, Inc. // Modifications Copyright (c) 2024 IOTA Stiftung // SPDX-License-Identifier: Apache-2.0 -import { +import type { DryRunTransactionBlockResponse, - GasCostSummary, - IotaGasData, IotaTransactionBlockResponse, TransactionEffects, } from '@iota/iota-sdk/client'; - -type Optional<T> = { - [K in keyof T]?: T[K]; -}; - -export type GasSummaryType = - | (GasCostSummary & - Optional<IotaGasData> & { - totalGas?: string; - owner?: string; - isSponsored: boolean; - gasUsed: GasCostSummary; - }) - | null; +import type { GasSummaryType } from '../../types'; export function getGasSummary( transaction: IotaTransactionBlockResponse | DryRunTransactionBlockResponse, diff --git a/apps/core/src/utils/transaction/getObjectChangeLabel.ts b/apps/core/src/utils/transaction/getObjectChangeLabel.ts index cf9e1b8d467..4ee974c9e92 100644 --- a/apps/core/src/utils/transaction/getObjectChangeLabel.ts +++ b/apps/core/src/utils/transaction/getObjectChangeLabel.ts @@ -2,7 +2,7 @@ // Modifications Copyright (c) 2024 IOTA Stiftung // SPDX-License-Identifier: Apache-2.0 -import { IotaObjectChangeTypes } from './types'; +import { IotaObjectChangeTypes } from '../../types'; export const ObjectChangeLabels = { created: 'Created', diff --git a/apps/core/src/utils/transaction/getObjectChangeSummary.ts b/apps/core/src/utils/transaction/getObjectChangeSummary.ts index a2a5dd010a1..8635f3f911d 100644 --- a/apps/core/src/utils/transaction/getObjectChangeSummary.ts +++ b/apps/core/src/utils/transaction/getObjectChangeSummary.ts @@ -2,8 +2,6 @@ // Modifications Copyright (c) 2024 IOTA Stiftung // SPDX-License-Identifier: Apache-2.0 import { - DisplayFieldsResponse, - IotaObjectChange, IotaObjectChangeCreated, IotaObjectChangeDeleted, IotaObjectChangeMutated, @@ -13,21 +11,7 @@ import { } from '@iota/iota-sdk/client'; import { groupByOwner } from './groupByOwner'; -import { IotaObjectChangeTypes } from './types'; - -export type WithDisplayFields<T> = T & { display?: DisplayFieldsResponse }; -export type IotaObjectChangeWithDisplay = WithDisplayFields<IotaObjectChange>; - -export type ObjectChanges = { - changesWithDisplay: IotaObjectChangeWithDisplay[]; - changes: IotaObjectChange[]; - ownerType: string; -}; -export type ObjectChangesByOwner = Record<string, ObjectChanges>; - -export type ObjectChangeSummary = { - [K in IotaObjectChangeTypes]: ObjectChangesByOwner; -}; +import { IotaObjectChangeWithDisplay } from '../../types'; export const getObjectChangeSummary = (objectChanges: IotaObjectChangeWithDisplay[]) => { if (!objectChanges) return null; diff --git a/apps/core/src/utils/transaction/groupByOwner.ts b/apps/core/src/utils/transaction/groupByOwner.ts index 07fc3f54fd2..ec0593ce640 100644 --- a/apps/core/src/utils/transaction/groupByOwner.ts +++ b/apps/core/src/utils/transaction/groupByOwner.ts @@ -2,7 +2,7 @@ // Modifications Copyright (c) 2024 IOTA Stiftung // SPDX-License-Identifier: Apache-2.0 -import { ObjectChangesByOwner, IotaObjectChangeWithDisplay } from './getObjectChangeSummary'; +import { IotaObjectChangeWithDisplay, ObjectChangesByOwner } from '../../types'; import { getOwnerType } from './getOwnerType'; const getOwner = (change: IotaObjectChangeWithDisplay) => { diff --git a/apps/core/src/utils/transaction/index.ts b/apps/core/src/utils/transaction/index.ts index 5fcc02257ca..f5ef47663b6 100644 --- a/apps/core/src/utils/transaction/index.ts +++ b/apps/core/src/utils/transaction/index.ts @@ -5,7 +5,6 @@ export * from './getBalanceChangeSummary'; export * from './getObjectChangeSummary'; export * from './getLabel'; -export * from './types'; export * from './getGasSummary'; export * from './groupByOwner'; export * from './getOwnerType'; diff --git a/apps/core/src/utils/transaction/types.ts b/apps/core/src/utils/transaction/types.ts deleted file mode 100644 index dbf6d4c2653..00000000000 --- a/apps/core/src/utils/transaction/types.ts +++ /dev/null @@ -1,24 +0,0 @@ -// Copyright (c) Mysten Labs, Inc. -// Modifications Copyright (c) 2024 IOTA Stiftung -// SPDX-License-Identifier: Apache-2.0 - -import { BalanceChangeSummary } from './getBalanceChangeSummary'; -import { GasSummaryType } from './getGasSummary'; -import { ObjectChangeSummary } from './getObjectChangeSummary'; - -export type TransactionSummary = { - digest?: string; - sender?: string; - timestamp?: string | null; - balanceChanges: BalanceChangeSummary; - gas?: GasSummaryType; - objectSummary: ObjectChangeSummary | null; -} | null; - -export type IotaObjectChangeTypes = - | 'published' - | 'transferred' - | 'mutated' - | 'deleted' - | 'wrapped' - | 'created'; diff --git a/apps/explorer/src/components/gas-breakdown/GasBreakdown.tsx b/apps/explorer/src/components/gas-breakdown/GasBreakdown.tsx index 87199035f7a..a226583b306 100644 --- a/apps/explorer/src/components/gas-breakdown/GasBreakdown.tsx +++ b/apps/explorer/src/components/gas-breakdown/GasBreakdown.tsx @@ -3,7 +3,12 @@ // SPDX-License-Identifier: Apache-2.0 import { Accordion, AccordionContent, Title, Divider } from '@iota/apps-ui-kit'; -import { CoinFormat, type TransactionSummary, useCopyToClipboard, useFormatCoin } from '@iota/core'; +import { + CoinFormat, + type TransactionSummaryType, + useCopyToClipboard, + useFormatCoin, +} from '@iota/core'; import { IOTA_TYPE_ARG } from '@iota/iota-sdk/utils'; import { Copy } from '@iota/ui-icons'; import toast from 'react-hot-toast'; @@ -72,7 +77,7 @@ function GasInfo({ label, info }: { label: string; info?: React.ReactNode }) { } interface GasBreakdownProps { - summary?: TransactionSummary | null; + summary?: TransactionSummaryType | null; } export function GasBreakdown({ summary }: GasBreakdownProps): JSX.Element | null { diff --git a/apps/wallet-dashboard/app/(protected)/staking/page.tsx b/apps/wallet-dashboard/app/(protected)/staking/page.tsx index c26c1a39411..e33b1253b95 100644 --- a/apps/wallet-dashboard/app/(protected)/staking/page.tsx +++ b/apps/wallet-dashboard/app/(protected)/staking/page.tsx @@ -16,8 +16,7 @@ import { Title, TitleSize, } from '@iota/apps-ui-kit'; -import { StakeDialog } from '@/components'; -import { StakeDialogView } from '@/components/Dialogs/Staking/StakeDialog'; +import { StakeDialog, StakeDialogView } from '@/components'; import { ExtendedDelegatedStake, formatDelegatedStake, @@ -29,17 +28,18 @@ import { StakedCard, useFormatCoin, } from '@iota/core'; -import { useCurrentAccount, useIotaClientQuery } from '@iota/dapp-kit'; +import { useCurrentAccount, useIotaClient, useIotaClientQuery } from '@iota/dapp-kit'; import { IotaSystemStateSummary } from '@iota/iota-sdk/client'; import { Info } from '@iota/ui-icons'; import { useMemo } from 'react'; import { useStakeDialog } from '@/components/Dialogs/Staking/hooks/useStakeDialog'; import { IOTA_TYPE_ARG } from '@iota/iota-sdk/utils'; -function StakingDashboardPage(): JSX.Element { +function StakingDashboardPage(): React.JSX.Element { const account = useCurrentAccount(); const { data: system } = useIotaClientQuery('getLatestIotaSystemState'); const activeValidators = (system as IotaSystemStateSummary)?.activeValidators; + const iotaClient = useIotaClient(); const { isDialogStakeOpen, @@ -53,7 +53,7 @@ function StakingDashboardPage(): JSX.Element { handleNewStake, } = useStakeDialog(); - const { data: delegatedStakeData } = useGetDelegatedStake({ + const { data: delegatedStakeData, refetch: refetchDelegatedStakes } = useGetDelegatedStake({ address: account?.address || '', staleTime: DELEGATED_STAKES_QUERY_STALE_TIME, refetchInterval: DELEGATED_STAKES_QUERY_REFETCH_INTERVAL, @@ -92,6 +92,14 @@ function StakingDashboardPage(): JSX.Element { setSelectedStake(extendedStake); }; + function handleOnStakeSuccess(digest: string): void { + iotaClient + .waitForTransaction({ + digest, + }) + .then(() => refetchDelegatedStakes()); + } + return ( <div className="flex justify-center"> <div className="w-3/4"> @@ -165,6 +173,7 @@ function StakingDashboardPage(): JSX.Element { </div> <StakeDialog stakedDetails={selectedStake} + onSuccess={handleOnStakeSuccess} isOpen={isDialogStakeOpen} handleClose={handleCloseStakeDialog} view={stakeDialogView} diff --git a/apps/wallet-dashboard/components/Dialogs/Assets/views/DetailsView.tsx b/apps/wallet-dashboard/components/Dialogs/Assets/views/DetailsView.tsx index 22572cec44f..3929ba0062f 100644 --- a/apps/wallet-dashboard/components/Dialogs/Assets/views/DetailsView.tsx +++ b/apps/wallet-dashboard/components/Dialogs/Assets/views/DetailsView.tsx @@ -13,7 +13,7 @@ import { } from '@iota/apps-ui-kit'; import Link from 'next/link'; import { formatAddress } from '@iota/iota-sdk/utils'; -import { Layout, LayoutBody, LayoutFooter } from '../../Staking/views/Layout'; +import { DialogLayout, DialogLayoutBody, DialogLayoutFooter } from '../../layout'; import { IotaObjectData } from '@iota/iota-sdk/client'; import { ExplorerLink } from '@/components/ExplorerLink'; import { useCurrentAccount } from '@iota/dapp-kit'; @@ -55,9 +55,9 @@ export function DetailsView({ onClose, asset, onSend }: DetailsViewProps) { } return ( - <Layout> + <DialogLayout> <Header title="Asset" onClose={onClose} titleCentered /> - <LayoutBody> + <DialogLayoutBody> <div className="flex w-full flex-col items-center justify-center gap-xs"> <div className="w-[172px]"> <VisualAssetCard @@ -169,8 +169,8 @@ export function DetailsView({ onClose, asset, onSend }: DetailsViewProps) { ) : null} </div> </div> - </LayoutBody> - <LayoutFooter> + </DialogLayoutBody> + <DialogLayoutFooter> <div className="flex flex-col"> {isContainedInKiosk && kioskItem?.isLocked ? ( <div className="flex flex-col gap-2"> @@ -194,7 +194,7 @@ export function DetailsView({ onClose, asset, onSend }: DetailsViewProps) { /> )} </div> - </LayoutFooter> - </Layout> + </DialogLayoutFooter> + </DialogLayout> ); } diff --git a/apps/wallet-dashboard/components/Dialogs/Assets/views/SendView.tsx b/apps/wallet-dashboard/components/Dialogs/Assets/views/SendView.tsx index 973d0407fd9..b5757582c7b 100644 --- a/apps/wallet-dashboard/components/Dialogs/Assets/views/SendView.tsx +++ b/apps/wallet-dashboard/components/Dialogs/Assets/views/SendView.tsx @@ -4,7 +4,7 @@ import React from 'react'; import { AddressInput, useNftDetails } from '@iota/core'; import { useFormikContext } from 'formik'; -import { Layout, LayoutBody, LayoutFooter } from '../../Staking/views/Layout'; +import { DialogLayout, DialogLayoutFooter, DialogLayoutBody } from '../../layout'; import { Button, ButtonHtmlType, @@ -33,9 +33,9 @@ export function SendView({ asset, onClose, onBack }: SendViewProps) { const { nftName, nftImageUrl } = useNftDetails(objectId, senderAddress); return ( - <Layout> + <DialogLayout> <Header title="Send asset" onClose={onClose} titleCentered onBack={onBack} /> - <LayoutBody> + <DialogLayoutBody> <div className="flex w-full flex-col items-center justify-center gap-xs"> <div className="w-[172px]"> <VisualAssetCard @@ -53,8 +53,8 @@ export function SendView({ asset, onClose, onBack }: SendViewProps) { <AddressInput name="to" placeholder="Enter Address" /> </div> </div> - </LayoutBody> - <LayoutFooter> + </DialogLayoutBody> + <DialogLayoutFooter> <Button fullWidth htmlType={ButtonHtmlType.Submit} @@ -64,7 +64,7 @@ export function SendView({ asset, onClose, onBack }: SendViewProps) { iconAfterText onClick={submitForm} /> - </LayoutFooter> - </Layout> + </DialogLayoutFooter> + </DialogLayout> ); } diff --git a/apps/wallet-dashboard/components/Dialogs/Staking/StakeDialog.tsx b/apps/wallet-dashboard/components/Dialogs/Staking/StakeDialog.tsx index cc6484119c7..2c9f72a2911 100644 --- a/apps/wallet-dashboard/components/Dialogs/Staking/StakeDialog.tsx +++ b/apps/wallet-dashboard/components/Dialogs/Staking/StakeDialog.tsx @@ -1,7 +1,7 @@ // Copyright (c) 2024 IOTA Stiftung // SPDX-License-Identifier: Apache-2.0 -import React, { useMemo } from 'react'; +import React, { useMemo, useState } from 'react'; import { EnterAmountView, EnterTimelockedAmountView, SelectValidatorView } from './views'; import { useNotifications, @@ -29,14 +29,8 @@ import { prepareObjectsForTimelockedStakingTransaction } from '@/lib/utils'; import { Dialog } from '@iota/apps-ui-kit'; import { DetailsView, UnstakeView } from './views'; import { FormValues } from './views/EnterAmountView'; - -export enum StakeDialogView { - Details = 'Details', - SelectValidator = 'SelectValidator', - EnterAmount = 'EnterAmount', - EnterTimelockedAmount = 'EnterTimelockedAmount', - Unstake = 'Unstake', -} +import { TransactionDialogView } from '../TransactionDialog'; +import { StakeDialogView } from './enums/view.enums'; const INITIAL_VALUES = { amount: '', @@ -45,8 +39,8 @@ const INITIAL_VALUES = { interface StakeDialogProps { isOpen: boolean; handleClose: () => void; - view?: StakeDialogView; - setView?: (view: StakeDialogView) => void; + view: StakeDialogView | undefined; + setView: (view: StakeDialogView) => void; stakedDetails?: ExtendedDelegatedStake | null; maxStakableTimelockedAmount?: bigint; isTimelockedStaking?: boolean; @@ -71,6 +65,7 @@ export function StakeDialog({ const senderAddress = account?.address ?? ''; const { data: iotaBalance } = useBalance(senderAddress!); const coinBalance = BigInt(iotaBalance?.totalBalance || 0); + const [txDigest, setTxDigest] = useState<string>(''); const { data: metadata } = useCoinMetadata(IOTA_TYPE_ARG); const coinDecimals = metadata?.decimals ?? 0; @@ -166,19 +161,16 @@ export function StakeDialog({ }, { onSuccess: (tx) => { - if (onSuccess) { - onSuccess(tx.digest); - } + onSuccess?.(tx.digest); + addNotification('Stake transaction has been sent'); + setTxDigest(tx.digest); + setView?.(StakeDialogView.TransactionDetails); + }, + onError: () => { + addNotification('Stake transaction was not sent', NotificationType.Error); }, }, - ) - .then(() => { - handleClose(); - addNotification('Stake transaction has been sent'); - }) - .catch(() => { - addNotification('Stake transaction was not sent', NotificationType.Error); - }); + ); } function onSubmit(_: FormValues, { resetForm }: FormikHelpers<FormValues>) { @@ -236,6 +228,9 @@ export function StakeDialog({ showActiveStatus /> )} + {view === StakeDialogView.TransactionDetails && ( + <TransactionDialogView txDigest={txDigest} onClose={handleClose} /> + )} </> </FormikProvider> </Dialog> diff --git a/apps/wallet-dashboard/components/Dialogs/Staking/enums/index.ts b/apps/wallet-dashboard/components/Dialogs/Staking/enums/index.ts new file mode 100644 index 00000000000..6f408e39b8c --- /dev/null +++ b/apps/wallet-dashboard/components/Dialogs/Staking/enums/index.ts @@ -0,0 +1,4 @@ +// Copyright (c) 2024 IOTA Stiftung +// SPDX-License-Identifier: Apache-2.0 + +export * from './view.enums'; diff --git a/apps/wallet-dashboard/components/Dialogs/Staking/enums/view.enums.ts b/apps/wallet-dashboard/components/Dialogs/Staking/enums/view.enums.ts new file mode 100644 index 00000000000..1bdb66a93ed --- /dev/null +++ b/apps/wallet-dashboard/components/Dialogs/Staking/enums/view.enums.ts @@ -0,0 +1,11 @@ +// Copyright (c) 2024 IOTA Stiftung +// SPDX-License-Identifier: Apache-2.0 + +export enum StakeDialogView { + Details = 'Details', + SelectValidator = 'SelectValidator', + EnterAmount = 'EnterAmount', + Unstake = 'Unstake', + EnterTimelockedAmount = 'EnterTimelockedAmount', + TransactionDetails = 'TransactionDetails', +} diff --git a/apps/wallet-dashboard/components/Dialogs/Staking/hooks/useStakeDialog.ts b/apps/wallet-dashboard/components/Dialogs/Staking/hooks/useStakeDialog.ts index f14b97db803..7d1c44f6e89 100644 --- a/apps/wallet-dashboard/components/Dialogs/Staking/hooks/useStakeDialog.ts +++ b/apps/wallet-dashboard/components/Dialogs/Staking/hooks/useStakeDialog.ts @@ -3,8 +3,7 @@ import { useState } from 'react'; import { ExtendedDelegatedStake } from '@iota/core'; - -import { StakeDialogView } from '@/components/Dialogs/Staking/StakeDialog'; +import { StakeDialogView } from '../enums/view.enums'; export function useStakeDialog() { const [stakeDialogView, setStakeDialogView] = useState<StakeDialogView | undefined>(); diff --git a/apps/wallet-dashboard/components/Dialogs/Staking/index.ts b/apps/wallet-dashboard/components/Dialogs/Staking/index.ts index e865a70c7d2..bf9af6d49a4 100644 --- a/apps/wallet-dashboard/components/Dialogs/Staking/index.ts +++ b/apps/wallet-dashboard/components/Dialogs/Staking/index.ts @@ -1,5 +1,6 @@ // Copyright (c) 2024 IOTA Stiftung // SPDX-License-Identifier: Apache-2.0 +export * from './enums'; export * from './StakeDialog'; export * from './hooks'; diff --git a/apps/wallet-dashboard/components/Dialogs/Staking/views/DetailsView.tsx b/apps/wallet-dashboard/components/Dialogs/Staking/views/DetailsView.tsx index 7e81f984e79..0cdba0031e1 100644 --- a/apps/wallet-dashboard/components/Dialogs/Staking/views/DetailsView.tsx +++ b/apps/wallet-dashboard/components/Dialogs/Staking/views/DetailsView.tsx @@ -30,7 +30,7 @@ import { } from '@iota/apps-ui-kit'; import { Warning } from '@iota/ui-icons'; import { formatAddress, IOTA_TYPE_ARG } from '@iota/iota-sdk/utils'; -import { Layout, LayoutFooter, LayoutBody } from './Layout'; +import { DialogLayout, DialogLayoutFooter, DialogLayoutBody } from '../../layout'; interface StakeDialogProps { stakedDetails: ExtendedDelegatedStake; @@ -101,9 +101,9 @@ export function DetailsView({ } return ( - <Layout> + <DialogLayout> <Header title="Validator" onClose={handleClose} onBack={handleClose} titleCentered /> - <LayoutBody> + <DialogLayoutBody> <div className="flex w-full flex-col gap-md"> <Card type={CardType.Filled}> <CardImage> @@ -144,8 +144,8 @@ export function DetailsView({ </div> </Panel> </div> - </LayoutBody> - <LayoutFooter> + </DialogLayoutBody> + <DialogLayoutFooter> <div className="flex w-full gap-sm"> <Button type={ButtonType.Secondary} @@ -160,7 +160,7 @@ export function DetailsView({ fullWidth /> </div> - </LayoutFooter> - </Layout> + </DialogLayoutFooter> + </DialogLayout> ); } diff --git a/apps/wallet-dashboard/components/Dialogs/Staking/views/EnterAmountView.tsx b/apps/wallet-dashboard/components/Dialogs/Staking/views/EnterAmountView.tsx index 13898ddf941..b3869faed2b 100644 --- a/apps/wallet-dashboard/components/Dialogs/Staking/views/EnterAmountView.tsx +++ b/apps/wallet-dashboard/components/Dialogs/Staking/views/EnterAmountView.tsx @@ -30,7 +30,7 @@ import { useCurrentAccount, useIotaClientQuery } from '@iota/dapp-kit'; import { Validator } from './Validator'; import { StakedInfo } from './StakedInfo'; -import { Layout, LayoutBody, LayoutFooter } from './Layout'; +import { DialogLayout, DialogLayoutBody, DialogLayoutFooter } from '../../layout'; export interface FormValues { amount: string; @@ -90,9 +90,9 @@ function EnterAmountView({ maxTokenBalance > parseAmount(values.amount, decimals) + BigInt(2) * gasBudgetBigInt; return ( - <Layout> + <DialogLayout> <Header title="Enter amount" onClose={handleClose} onBack={onBack} titleCentered /> - <LayoutBody> + <DialogLayoutBody> <div className="flex w-full flex-col justify-between"> <div> <div className="mb-md"> @@ -167,8 +167,8 @@ function EnterAmountView({ </Panel> </div> </div> - </LayoutBody> - <LayoutFooter> + </DialogLayoutBody> + <DialogLayoutFooter> <div className="flex w-full justify-between gap-sm"> <Button fullWidth type={ButtonType.Secondary} onClick={onBack} text="Back" /> <Button @@ -179,8 +179,8 @@ function EnterAmountView({ text="Stake" /> </div> - </LayoutFooter> - </Layout> + </DialogLayoutFooter> + </DialogLayout> ); } diff --git a/apps/wallet-dashboard/components/Dialogs/Staking/views/EnterTimelockedAmountView.tsx b/apps/wallet-dashboard/components/Dialogs/Staking/views/EnterTimelockedAmountView.tsx index d4eebde373a..9eaeb41b6a2 100644 --- a/apps/wallet-dashboard/components/Dialogs/Staking/views/EnterTimelockedAmountView.tsx +++ b/apps/wallet-dashboard/components/Dialogs/Staking/views/EnterTimelockedAmountView.tsx @@ -23,7 +23,7 @@ import { useCurrentAccount, useIotaClientQuery } from '@iota/dapp-kit'; import { Validator } from './Validator'; import { StakedInfo } from './StakedInfo'; -import { Layout, LayoutBody, LayoutFooter } from './Layout'; +import { DialogLayout, DialogLayoutBody, DialogLayoutFooter } from '../../layout'; export interface FormValues { amount: string; @@ -72,9 +72,9 @@ function EnterTimelockedAmountView({ ); return ( - <Layout> + <DialogLayout> <Header title="Enter amount" onClose={handleClose} onBack={onBack} titleCentered /> - <LayoutBody> + <DialogLayoutBody> <div className="flex w-full flex-col justify-between"> <div> <div className="mb-md"> @@ -149,8 +149,8 @@ function EnterTimelockedAmountView({ </Panel> </div> </div> - </LayoutBody> - <LayoutFooter> + </DialogLayoutBody> + <DialogLayoutFooter> <div className="flex w-full justify-between gap-sm"> <Button fullWidth type={ButtonType.Secondary} onClick={onBack} text="Back" /> <Button @@ -172,8 +172,8 @@ function EnterTimelockedAmountView({ iconAfterText /> </div> - </LayoutFooter> - </Layout> + </DialogLayoutFooter> + </DialogLayout> ); } diff --git a/apps/wallet-dashboard/components/Dialogs/Staking/views/SelectValidatorView.tsx b/apps/wallet-dashboard/components/Dialogs/Staking/views/SelectValidatorView.tsx index f04641ee1df..626cbf05990 100644 --- a/apps/wallet-dashboard/components/Dialogs/Staking/views/SelectValidatorView.tsx +++ b/apps/wallet-dashboard/components/Dialogs/Staking/views/SelectValidatorView.tsx @@ -5,7 +5,7 @@ import React from 'react'; import { Button, Header } from '@iota/apps-ui-kit'; import { Validator } from './Validator'; -import { Layout, LayoutBody, LayoutFooter } from './Layout'; +import { DialogLayout, DialogLayoutBody, DialogLayoutFooter } from '../../layout'; interface SelectValidatorViewProps { validators: string[]; @@ -23,9 +23,9 @@ function SelectValidatorView({ handleClose, }: SelectValidatorViewProps): JSX.Element { return ( - <Layout> + <DialogLayout> <Header title="Validator" onClose={handleClose} onBack={handleClose} titleCentered /> - <LayoutBody> + <DialogLayoutBody> <div className="flex w-full flex-col gap-md"> <div className="flex w-full flex-col"> {validators.map((validator) => ( @@ -38,18 +38,18 @@ function SelectValidatorView({ ))} </div> </div> - </LayoutBody> + </DialogLayoutBody> {!!selectedValidator && ( - <LayoutFooter> + <DialogLayoutFooter> <Button fullWidth data-testid="select-validator-cta" onClick={onNext} text="Next" /> - </LayoutFooter> + </DialogLayoutFooter> )} - </Layout> + </DialogLayout> ); } diff --git a/apps/wallet-dashboard/components/Dialogs/Staking/views/UnstakeView.tsx b/apps/wallet-dashboard/components/Dialogs/Staking/views/UnstakeView.tsx index bb7913a3ecd..671184c9cea 100644 --- a/apps/wallet-dashboard/components/Dialogs/Staking/views/UnstakeView.tsx +++ b/apps/wallet-dashboard/components/Dialogs/Staking/views/UnstakeView.tsx @@ -30,7 +30,7 @@ import { useCurrentAccount, useSignAndExecuteTransaction } from '@iota/dapp-kit' import { Loader, Warning } from '@iota/ui-icons'; import { useUnstakeTransaction } from '@/hooks'; import { ValidatorStakingData } from '@/components'; -import { Layout, LayoutFooter, LayoutBody } from './Layout'; +import { DialogLayout, DialogLayoutFooter, DialogLayoutBody } from '../../layout'; interface UnstakeDialogProps { extendedStake: ExtendedDelegatedStake; @@ -129,9 +129,9 @@ export function UnstakeView({ } return ( - <Layout> + <DialogLayout> <Header title="Unstake" onClose={handleClose} onBack={handleClose} titleCentered /> - <LayoutBody> + <DialogLayoutBody> <div className="flex flex-col gap-y-md"> <ValidatorStakingData validatorAddress={extendedStake.validatorAddress} @@ -180,9 +180,9 @@ export function UnstakeView({ </div> </Panel> </div> - </LayoutBody> + </DialogLayoutBody> - <LayoutFooter> + <DialogLayoutFooter> <Button type={ButtonType.Secondary} fullWidth @@ -196,7 +196,7 @@ export function UnstakeView({ } iconAfterText /> - </LayoutFooter> - </Layout> + </DialogLayoutFooter> + </DialogLayout> ); } diff --git a/apps/wallet-dashboard/components/Dialogs/Staking/views/Validator.tsx b/apps/wallet-dashboard/components/Dialogs/Staking/views/Validator.tsx index cad60fda4c9..a76ed05db57 100644 --- a/apps/wallet-dashboard/components/Dialogs/Staking/views/Validator.tsx +++ b/apps/wallet-dashboard/components/Dialogs/Staking/views/Validator.tsx @@ -19,6 +19,7 @@ interface ValidatorProps { showActiveStatus?: boolean; onClick?: (address: string) => void; showAction?: boolean; + activeEpoch?: string; } export function Validator({ @@ -27,11 +28,26 @@ export function Validator({ onClick, isSelected, showAction = true, + activeEpoch, }: ValidatorProps) { - const { name, newValidator, isAtRisk, apy, isApyApproxZero, validatorSummary } = - useValidatorInfo({ - validatorAddress: address, - }); + const { + name: validatorName, + newValidator, + isAtRisk, + apy, + isApyApproxZero, + validatorSummary, + system, + } = useValidatorInfo({ + validatorAddress: address, + }); + + // for inactive validators, show the epoch number + const fallBackText = activeEpoch + ? `Staked ${Number(system?.epoch) - Number(activeEpoch)} epochs ago` + : ''; + + const validatorDisplayName = validatorName || fallBackText; const subtitle = showActiveStatus ? ( <div className="flex items-center gap-1"> @@ -50,12 +66,12 @@ export function Validator({ <CardImage> <ImageIcon src={validatorSummary?.imageUrl ?? null} - label={name} - fallback={name} + label={validatorDisplayName} + fallback={validatorDisplayName} size={ImageIconSize.Large} /> </CardImage> - <CardBody title={name} subtitle={subtitle} isTextTruncated /> + <CardBody title={validatorDisplayName} subtitle={subtitle} isTextTruncated /> {showAction && ( <CardAction type={CardActionType.SupportingText} diff --git a/apps/wallet-dashboard/components/Dialogs/TransactionDialog.tsx b/apps/wallet-dashboard/components/Dialogs/TransactionDialog.tsx new file mode 100644 index 00000000000..c1b6a845b01 --- /dev/null +++ b/apps/wallet-dashboard/components/Dialogs/TransactionDialog.tsx @@ -0,0 +1,59 @@ +// Copyright (c) 2024 IOTA Stiftung +// SPDX-License-Identifier: Apache-2.0 + +import { Header, LoadingIndicator } from '@iota/apps-ui-kit'; +import { DialogLayout, DialogLayoutBody, DialogLayoutFooter } from './layout'; +import { ExplorerLink } from '../ExplorerLink'; +import { + ExplorerLinkType, + TransactionReceipt, + useGetTransactionWithSummary, + ViewTxnOnExplorerButton, +} from '@iota/core'; +import { useCurrentAccount } from '@iota/dapp-kit'; +import { Validator } from './Staking/views/Validator'; + +interface SharedProps { + txDigest?: string | null; +} + +interface TransactionViewProps extends SharedProps { + onClose: () => void; + onBack?: () => void; +} + +export function TransactionDialogView({ + txDigest, + onClose, + onBack, +}: TransactionViewProps): React.JSX.Element | null { + const activeAddress = useCurrentAccount()?.address ?? ''; + const { data: transaction, summary } = useGetTransactionWithSummary( + txDigest ?? '', + activeAddress, + ); + + return ( + <DialogLayout> + <Header title="Transaction" onClose={onClose} onBack={onBack} titleCentered /> + <DialogLayoutBody> + {transaction && summary ? ( + <TransactionReceipt + txn={transaction} + activeAddress={activeAddress} + summary={summary} + renderExplorerLink={ExplorerLink} + renderValidatorLogo={Validator} + /> + ) : ( + <LoadingIndicator /> + )} + </DialogLayoutBody> + <DialogLayoutFooter> + <ExplorerLink transactionID={txDigest ?? ''} type={ExplorerLinkType.Transaction}> + <ViewTxnOnExplorerButton digest={txDigest ?? ''} /> + </ExplorerLink> + </DialogLayoutFooter> + </DialogLayout> + ); +} diff --git a/apps/wallet-dashboard/components/Dialogs/Staking/views/Layout.tsx b/apps/wallet-dashboard/components/Dialogs/layout/DialogLayout.tsx similarity index 76% rename from apps/wallet-dashboard/components/Dialogs/Staking/views/Layout.tsx rename to apps/wallet-dashboard/components/Dialogs/layout/DialogLayout.tsx index 7986ce592d0..9405c120097 100644 --- a/apps/wallet-dashboard/components/Dialogs/Staking/views/Layout.tsx +++ b/apps/wallet-dashboard/components/Dialogs/layout/DialogLayout.tsx @@ -3,7 +3,7 @@ import { PropsWithChildren } from 'react'; import { DialogBody, DialogContent, DialogPosition } from '@iota/apps-ui-kit'; -export function Layout({ children }: PropsWithChildren) { +export function DialogLayout({ children }: PropsWithChildren) { return ( <DialogContent containerId="overlay-portal-container" position={DialogPosition.Right}> <div className="flex h-full flex-col">{children}</div> @@ -11,7 +11,7 @@ export function Layout({ children }: PropsWithChildren) { ); } -export function LayoutBody({ children }: PropsWithChildren) { +export function DialogLayoutBody({ children }: PropsWithChildren) { return ( <div className="flex w-full flex-1 overflow-y-hidden [&_>div]:w-full [&_>div]:overflow-y-auto"> <DialogBody>{children}</DialogBody> @@ -19,6 +19,6 @@ export function LayoutBody({ children }: PropsWithChildren) { ); } -export function LayoutFooter({ children }: PropsWithChildren) { +export function DialogLayoutFooter({ children }: PropsWithChildren) { return <div className="p-md--rs">{children}</div>; } diff --git a/apps/wallet-dashboard/components/Dialogs/layout/index.ts b/apps/wallet-dashboard/components/Dialogs/layout/index.ts new file mode 100644 index 00000000000..23dcbf8ce3d --- /dev/null +++ b/apps/wallet-dashboard/components/Dialogs/layout/index.ts @@ -0,0 +1,4 @@ +// Copyright (c) 2024 IOTA Stiftung +// SPDX-License-Identifier: Apache-2.0 + +export * from './DialogLayout'; diff --git a/apps/wallet-dashboard/components/Popup/Popups/TransactionDetailsPopup.tsx b/apps/wallet-dashboard/components/Popup/Popups/TransactionDetailsPopup.tsx deleted file mode 100644 index bb622c166dd..00000000000 --- a/apps/wallet-dashboard/components/Popup/Popups/TransactionDetailsPopup.tsx +++ /dev/null @@ -1,75 +0,0 @@ -// Copyright (c) 2024 IOTA Stiftung -// SPDX-License-Identifier: Apache-2.0 - -import React, { PropsWithChildren } from 'react'; -import { ExtendedTransaction } from '@/lib/interfaces'; -import { - formatDate, - useExtendedTransactionSummary, - STAKING_REQUEST_EVENT, - UNSTAKING_REQUEST_EVENT, -} from '@iota/core'; -import { - StakeTransactionCard, - TransactionSummary, - UnstakeTransactionCard, -} from '@/components/transactions'; - -interface TransactionDetailsPopupProps { - transaction: ExtendedTransaction; - onClose: () => void; -} - -function LabeledValue({ label, children }: PropsWithChildren<{ label: string }>): JSX.Element { - return ( - <div className="flex flex-row gap-2"> - <h3 className="text-md"> - <span className="font-semibold">{label}</span>: - </h3> - <p className="capitalize">{children}</p> - </div> - ); -} - -export default function TransactionDetailsPopup({ - transaction, - onClose, -}: TransactionDetailsPopupProps): JSX.Element { - const { raw: rawTransaction } = transaction; - const { events } = rawTransaction; - - const transactionSummary = useExtendedTransactionSummary(rawTransaction.digest); - - const txDate = !Number.isNaN(rawTransaction.timestampMs) - ? formatDate(Number(rawTransaction.timestampMs), ['month', 'day', 'hour', 'minute']) - : undefined; - - const stakedTxn = events?.find(({ type }) => type === STAKING_REQUEST_EVENT); - const unstakeTxn = events?.find(({ type }) => type === UNSTAKING_REQUEST_EVENT); - - return ( - <div className="flex w-full min-w-[30vw] flex-col gap-6"> - <div className="flex w-full flex-col"> - <h2 className="mx-auto font-semibold">Transaction Details</h2> - </div> - - <div className="flex flex-col space-y-1"> - <LabeledValue label="Status">{transaction.state}</LabeledValue> - <LabeledValue label="Action">{transaction.action}</LabeledValue> - <LabeledValue label="Timestamp">{txDate}</LabeledValue> - </div> - - <div className="w-full py-2"> - <div className="mb-2 block text-center font-bold">Transaction Summary</div> - <TransactionSummary summary={transactionSummary} showGasSummary /> - </div> - - {(stakedTxn || unstakeTxn) && ( - <div className="flex flex-col space-y-2 rounded-lg"> - {stakedTxn && <StakeTransactionCard event={stakedTxn} />} - {unstakeTxn && <UnstakeTransactionCard event={unstakeTxn} />} - </div> - )} - </div> - ); -} diff --git a/apps/wallet-dashboard/components/Popup/Popups/index.ts b/apps/wallet-dashboard/components/Popup/Popups/index.ts index e0e4a17db69..ebdfc7f7391 100644 --- a/apps/wallet-dashboard/components/Popup/Popups/index.ts +++ b/apps/wallet-dashboard/components/Popup/Popups/index.ts @@ -1,7 +1,6 @@ // Copyright (c) 2024 IOTA Stiftung // SPDX-License-Identifier: Apache-2.0 -export { default as TransactionDetailsPopup } from './TransactionDetailsPopup'; export { default as UnstakePopup } from './UnstakePopup'; export { default as SendAssetPopup } from './SendAssetPopup'; diff --git a/apps/wallet-dashboard/components/transactions/GasSummary.tsx b/apps/wallet-dashboard/components/transactions/GasSummary.tsx deleted file mode 100644 index 3b522432a40..00000000000 --- a/apps/wallet-dashboard/components/transactions/GasSummary.tsx +++ /dev/null @@ -1,40 +0,0 @@ -// Copyright (c) Mysten Labs, Inc. -// Modifications Copyright (c) 2024 IOTA Stiftung -// SPDX-License-Identifier: Apache-2.0 - -import { useFormatCoin, type GasSummaryType } from '@iota/core'; -import { useCurrentAccount } from '@iota/dapp-kit'; -import { formatAddress, IOTA_TYPE_ARG } from '@iota/iota-sdk/utils'; - -export default function GasSummary({ gasSummary }: { gasSummary: GasSummaryType }) { - const [gas, symbol] = useFormatCoin(gasSummary?.totalGas, IOTA_TYPE_ARG); - const address = useCurrentAccount(); - - return ( - <div className="rounded-lg border border-solid border-black p-3"> - <h3 className="text-center font-semibold">Gas Fees</h3> - <div className="flex w-full flex-col items-center gap-2 px-4 py-3"> - <div className="flex items-center justify-center gap-4"> - {address?.address === gasSummary?.owner && ( - <div className="mr-auto">You Paid</div> - )} - <p> - {gasSummary?.isSponsored ? '0' : gas} {symbol} - </p> - </div> - {gasSummary?.isSponsored && gasSummary.owner && ( - <> - <div className="flex w-full justify-between"> - Paid by Sponsor - {gas} {symbol} - </div> - <div className="flex w-full justify-between"> - Sponsor: - {formatAddress(gasSummary.owner)} - </div> - </> - )} - </div> - </div> - ); -} diff --git a/apps/wallet-dashboard/components/transactions/TransactionSummary.tsx b/apps/wallet-dashboard/components/transactions/TransactionSummary.tsx index 94a8db43b57..6cca89942ca 100644 --- a/apps/wallet-dashboard/components/transactions/TransactionSummary.tsx +++ b/apps/wallet-dashboard/components/transactions/TransactionSummary.tsx @@ -1,20 +1,25 @@ // Copyright (c) 2024 IOTA Stiftung // SPDX-License-Identifier: Apache-2.0 -import { type TransactionSummary as TransactionSummaryType } from '@iota/core'; -import { BalanceChanges, ObjectChanges, GasSummary } from './'; +import { type TransactionSummaryType, GasSummary } from '@iota/core'; +import { BalanceChanges, ObjectChanges } from '@iota/core'; +import { ExplorerLink } from '../ExplorerLink'; + +interface TransactionSummaryProps { + summary: TransactionSummaryType; + activeAddress: string | null | undefined; + isLoading?: boolean; + isError?: boolean; + showGasSummary?: boolean; +} export default function TransactionSummary({ summary, isLoading, isError, showGasSummary = false, -}: { - summary: TransactionSummaryType; - isLoading?: boolean; - isError?: boolean; - showGasSummary?: boolean; -}) { + activeAddress, +}: TransactionSummaryProps) { if (isError) return null; if (isLoading) return <div>Loading...</div>; if (!summary || (!summary.balanceChanges && !summary.objectSummary && !summary.gas)) @@ -25,16 +30,28 @@ export default function TransactionSummary({ {summary.balanceChanges && ( <div className="rounded-md border border-gray-600 p-2"> <h4 className="text-center font-semibold">Balance Changes</h4> - <BalanceChanges balanceChanges={summary.balanceChanges} /> + <BalanceChanges + changes={summary.balanceChanges} + renderExplorerLink={ExplorerLink} + /> </div> )} {summary.objectSummary && ( <div className="rounded-md border border-gray-600 p-2"> <h4 className="text-center font-semibold">Changes</h4> - <ObjectChanges objectSummary={summary.objectSummary} /> + <ObjectChanges + changes={summary.objectSummary} + renderExplorerLink={ExplorerLink} + /> </div> )} - {showGasSummary && summary.gas && <GasSummary gasSummary={summary.gas} />} + {showGasSummary && summary.gas && ( + <GasSummary + gasSummary={summary.gas} + renderExplorerLink={ExplorerLink} + activeAddress={activeAddress} + /> + )} </div> ); } diff --git a/apps/wallet-dashboard/components/transactions/TransactionTile.tsx b/apps/wallet-dashboard/components/transactions/TransactionTile.tsx index cb029808b3c..405a02e76c6 100644 --- a/apps/wallet-dashboard/components/transactions/TransactionTile.tsx +++ b/apps/wallet-dashboard/components/transactions/TransactionTile.tsx @@ -3,11 +3,10 @@ 'use client'; -import React from 'react'; +import React, { useState } from 'react'; import TransactionIcon from './TransactionIcon'; import formatTimestamp from '@/lib/utils/time'; -import { usePopups } from '@/hooks'; -import { TransactionDetailsPopup } from '@/components'; +import { ExplorerLink } from '@/components'; import { ExtendedTransaction, TransactionState } from '@/lib/interfaces'; import { Card, @@ -18,57 +17,121 @@ import { CardBody, CardAction, CardActionType, + Dialog, + Header, + LoadingIndicator, } from '@iota/apps-ui-kit'; -import { useFormatCoin, useExtendedTransactionSummary, getLabel } from '@iota/core'; +import { + useFormatCoin, + getLabel, + useTransactionSummary, + ViewTxnOnExplorerButton, + ExplorerLinkType, + TransactionReceipt, +} from '@iota/core'; import { IOTA_TYPE_ARG } from '@iota/iota-sdk/utils'; import { useCurrentAccount } from '@iota/dapp-kit'; +import { DialogLayout, DialogLayoutBody, DialogLayoutFooter } from '../Dialogs/layout'; +import { Validator } from '../Dialogs/Staking/views/Validator'; interface TransactionTileProps { transaction: ExtendedTransaction; } -function TransactionTile({ transaction }: TransactionTileProps): JSX.Element { +export function TransactionTile({ transaction }: TransactionTileProps): JSX.Element { const account = useCurrentAccount(); const address = account?.address; - const { openPopup, closePopup } = usePopups(); + const [open, setOpen] = useState(false); - const transactionSummary = useExtendedTransactionSummary(transaction.raw.digest); + const transactionSummary = useTransactionSummary({ + transaction: transaction.raw, + currentAddress: account?.address, + recognizedPackagesList: [], + }); const [formatAmount, symbol] = useFormatCoin( Math.abs(Number(address ? transactionSummary?.balanceChanges?.[address]?.[0]?.amount : 0)), IOTA_TYPE_ARG, ); - const handleDetailsClick = () => { - openPopup(<TransactionDetailsPopup transaction={transaction} onClose={closePopup} />); - }; + function openDetailsDialog() { + setOpen(true); + } const transactionDate = transaction?.timestamp && formatTimestamp(transaction.timestamp); + return ( - <Card type={CardType.Default} isHoverable onClick={handleDetailsClick}> - <CardImage type={ImageType.BgSolid} shape={ImageShape.SquareRounded}> - <TransactionIcon - txnFailed={transaction.state === TransactionState.Failed} - variant={getLabel(transaction?.raw, address)} + <> + <Card type={CardType.Default} isHoverable onClick={openDetailsDialog}> + <CardImage type={ImageType.BgSolid} shape={ImageShape.SquareRounded}> + <TransactionIcon + txnFailed={transaction.state === TransactionState.Failed} + variant={getLabel(transaction?.raw, address)} + /> + </CardImage> + <CardBody + title={ + transaction.state === TransactionState.Failed + ? 'Transaction Failed' + : (transaction.action ?? 'Unknown') + } + subtitle={transactionDate} + /> + <CardAction + type={CardActionType.SupportingText} + title={ + transaction.state === TransactionState.Failed + ? '--' + : `${formatAmount} ${symbol}` + } /> - </CardImage> - <CardBody - title={ - transaction.state === TransactionState.Failed - ? 'Transaction Failed' - : (transaction.action ?? 'Unknown') - } - subtitle={transactionDate} - /> - <CardAction - type={CardActionType.SupportingText} - title={ - transaction.state === TransactionState.Failed - ? '--' - : `${formatAmount} ${symbol}` - } - /> - </Card> + </Card> + <ActivityDetailsDialog transaction={transaction} open={open} setOpen={setOpen} /> + </> ); } -export default TransactionTile; +interface ActivityDetailsDialogProps { + transaction: ExtendedTransaction; + open: boolean; + setOpen: (open: boolean) => void; +} +function ActivityDetailsDialog({ + transaction, + open, + setOpen, +}: ActivityDetailsDialogProps): React.JSX.Element { + const address = useCurrentAccount()?.address ?? ''; + + const summary = useTransactionSummary({ + transaction: transaction.raw, + currentAddress: address, + recognizedPackagesList: [], + }); + + if (!summary) return <LoadingIndicator />; + + return ( + <Dialog open={open} onOpenChange={setOpen}> + <DialogLayout> + <Header title="Transaction" onClose={() => setOpen(false)} /> + <DialogLayoutBody> + <TransactionReceipt + txn={transaction.raw} + activeAddress={address} + summary={summary} + renderExplorerLink={ExplorerLink} + renderValidatorLogo={Validator} + /> + </DialogLayoutBody> + <DialogLayoutFooter> + <ExplorerLink + type={ExplorerLinkType.Transaction} + transactionID={transaction.raw.digest} + > + <ViewTxnOnExplorerButton digest={transaction.raw.digest} /> + </ExplorerLink> + </DialogLayoutFooter> + </DialogLayout> + </Dialog> + ); +} diff --git a/apps/wallet-dashboard/components/transactions/balance-changes/BalanceChangeEntries.tsx b/apps/wallet-dashboard/components/transactions/balance-changes/BalanceChangeEntries.tsx deleted file mode 100644 index 14cc9ad7891..00000000000 --- a/apps/wallet-dashboard/components/transactions/balance-changes/BalanceChangeEntries.tsx +++ /dev/null @@ -1,30 +0,0 @@ -// Copyright (c) 2024 IOTA Stiftung -// SPDX-License-Identifier: Apache-2.0 - -import { BalanceChange } from '@iota/core'; -import { useMemo } from 'react'; -import { BalanceChangeEntry } from '.'; -import { getRecognizedUnRecognizedTokenChanges } from '@iota/core'; - -interface BalanceChangeEntriesProps { - balanceChanges: BalanceChange[]; -} - -export default function BalanceChangeEntries({ - balanceChanges: changes, -}: BalanceChangeEntriesProps) { - const { recognizedTokenChanges, unRecognizedTokenChanges } = useMemo( - () => getRecognizedUnRecognizedTokenChanges(changes), - [changes], - ); - - return ( - <div> - {[...recognizedTokenChanges, ...unRecognizedTokenChanges].map( - (balanceChange, index) => ( - <BalanceChangeEntry balanceChange={balanceChange} key={index} /> - ), - )} - </div> - ); -} diff --git a/apps/wallet-dashboard/components/transactions/balance-changes/BalanceChangeEntry.tsx b/apps/wallet-dashboard/components/transactions/balance-changes/BalanceChangeEntry.tsx deleted file mode 100644 index c4b9f85279f..00000000000 --- a/apps/wallet-dashboard/components/transactions/balance-changes/BalanceChangeEntry.tsx +++ /dev/null @@ -1,39 +0,0 @@ -// Copyright (c) 2024 IOTA Stiftung -// SPDX-License-Identifier: Apache-2.0 - -import { BalanceChange, CoinFormat, useFormatCoin, useCoinMetadata } from '@iota/core'; -import { formatAddress } from '@iota/iota-sdk/utils'; - -interface BalanceChangeEntryProps { - balanceChange: BalanceChange; -} - -export default function BalanceChangeEntry({ - balanceChange: { amount, coinType, unRecognizedToken, owner }, -}: BalanceChangeEntryProps) { - const [formatted, symbol] = useFormatCoin(amount, coinType, CoinFormat.FULL); - const { data: coinMetaData } = useCoinMetadata(coinType); - - const isPositive = BigInt(amount) > 0n; - - return ( - <div className="flex flex-col py-2"> - <div className="flex flex-row justify-between space-x-2 py-2"> - <div className="flex flex-row items-center gap-2"> - <span className="font-medium">{coinMetaData?.name || symbol}</span> - {unRecognizedToken && <div>Unrecognized</div>} - </div> - <div className={`flex flex-row gap-2 ${!isPositive ? 'text-red-600' : ''}`}> - {isPositive && <>+</>} - {formatted} {symbol} - </div> - </div> - {owner && ( - <div className="flex w-full flex-row justify-between space-x-2 border-t pt-1"> - <span>Owner</span> - <span>{formatAddress(owner)}</span> - </div> - )} - </div> - ); -} diff --git a/apps/wallet-dashboard/components/transactions/balance-changes/BalanceChanges.tsx b/apps/wallet-dashboard/components/transactions/balance-changes/BalanceChanges.tsx deleted file mode 100644 index 34c507c62d7..00000000000 --- a/apps/wallet-dashboard/components/transactions/balance-changes/BalanceChanges.tsx +++ /dev/null @@ -1,19 +0,0 @@ -// Copyright (c) 2024 IOTA Stiftung -// SPDX-License-Identifier: Apache-2.0 - -import { BalanceChange } from '@iota/core'; -import { BalanceChangeEntries } from '.'; - -interface BalanceChangesProps { - balanceChanges: Record<string, BalanceChange[]>; -} - -export default function BalanceChanges({ balanceChanges }: BalanceChangesProps) { - return ( - <> - {Object.entries(balanceChanges).map(([owner, balanceChanges], index) => ( - <BalanceChangeEntries balanceChanges={balanceChanges} key={owner + index} /> - ))} - </> - ); -} diff --git a/apps/wallet-dashboard/components/transactions/balance-changes/index.ts b/apps/wallet-dashboard/components/transactions/balance-changes/index.ts deleted file mode 100644 index 6c5ea510eb1..00000000000 --- a/apps/wallet-dashboard/components/transactions/balance-changes/index.ts +++ /dev/null @@ -1,6 +0,0 @@ -// Copyright (c) 2024 IOTA Stiftung -// SPDX-License-Identifier: Apache-2.0 - -export { default as BalanceChangeEntry } from './BalanceChangeEntry'; -export { default as BalanceChangeEntries } from './BalanceChangeEntries'; -export { default as BalanceChanges } from './BalanceChanges'; diff --git a/apps/wallet-dashboard/components/transactions/index.ts b/apps/wallet-dashboard/components/transactions/index.ts index 7602efd1395..509933e7c10 100644 --- a/apps/wallet-dashboard/components/transactions/index.ts +++ b/apps/wallet-dashboard/components/transactions/index.ts @@ -1,15 +1,11 @@ // Copyright (c) 2024 IOTA Stiftung // SPDX-License-Identifier: Apache-2.0 -export { default as GasSummary } from './GasSummary'; export { default as TransactionAmount } from './TransactionAmount'; export { default as StakeTransactionCard } from './StakeTransactionCard'; export { default as UnstakeTransactionCard } from './UnstakeTransactionCard'; export { default as TransactionSummary } from './TransactionSummary'; -export { default as TransactionTile } from './TransactionTile'; +export * from './TransactionTile'; export { default as TransactionIcon } from './TransactionIcon'; export { default as TransactionsList } from './TransactionsList'; export { default as TransactionsOverview } from './TransactionsOverview'; - -export * from './balance-changes'; -export * from './object-changes'; diff --git a/apps/wallet-dashboard/components/transactions/object-changes/ObjectChangeEntry.tsx b/apps/wallet-dashboard/components/transactions/object-changes/ObjectChangeEntry.tsx deleted file mode 100644 index 9d386d6e6d3..00000000000 --- a/apps/wallet-dashboard/components/transactions/object-changes/ObjectChangeEntry.tsx +++ /dev/null @@ -1,44 +0,0 @@ -// Copyright (c) 2024 IOTA Stiftung -// SPDX-License-Identifier: Apache-2.0 - -import { ObjectChangesByOwner, IotaObjectChangeTypes } from '@iota/core'; -import { IotaObjectChange } from '@iota/iota-sdk/client'; -import { ObjectDetail } from '.'; -import React from 'react'; - -interface ObjectChangeEntryProps { - changes: ObjectChangesByOwner; - type: IotaObjectChangeTypes; -} - -export default function ObjectChangeEntry({ changes, type }: ObjectChangeEntryProps) { - return ( - <> - {Object.entries(changes).map(([owner, changes]) => ( - <div className="flex flex-col space-y-2 divide-y" key={`${type}-${owner}`}> - {changes.changes.map((change) => ( - <ObjectDetail - owner={owner} - ownerType={changes.ownerType} - key={getChangeKey(change)} - change={change} - /> - ))} - {changes.changesWithDisplay.map((change) => ( - <ObjectDetail - owner={owner} - ownerType={changes.ownerType} - key={getChangeKey(change)} - change={change} - displayData={change.display} - /> - ))} - </div> - ))} - </> - ); -} - -function getChangeKey(change: IotaObjectChange) { - return change.type !== 'deleted' && change.type !== 'wrapped' ? change.digest : change.objectId; -} diff --git a/apps/wallet-dashboard/components/transactions/object-changes/ObjectChanges.tsx b/apps/wallet-dashboard/components/transactions/object-changes/ObjectChanges.tsx deleted file mode 100644 index b3b246e6f0e..00000000000 --- a/apps/wallet-dashboard/components/transactions/object-changes/ObjectChanges.tsx +++ /dev/null @@ -1,23 +0,0 @@ -// Copyright (c) 2024 IOTA Stiftung -// SPDX-License-Identifier: Apache-2.0 - -import { ObjectChangeSummary, IotaObjectChangeTypes } from '@iota/core'; -import { ObjectChangeEntry } from '.'; - -interface ObjectChangesProps { - objectSummary: ObjectChangeSummary; -} - -export default function ObjectChanges({ objectSummary }: ObjectChangesProps) { - return ( - <> - {Object.entries(objectSummary).map(([type, changes]) => ( - <ObjectChangeEntry - key={type} - type={type as IotaObjectChangeTypes} - changes={changes} - /> - ))} - </> - ); -} diff --git a/apps/wallet-dashboard/components/transactions/object-changes/ObjectDetail.tsx b/apps/wallet-dashboard/components/transactions/object-changes/ObjectDetail.tsx deleted file mode 100644 index 2a4204d5acf..00000000000 --- a/apps/wallet-dashboard/components/transactions/object-changes/ObjectDetail.tsx +++ /dev/null @@ -1,102 +0,0 @@ -// Copyright (c) 2024 IOTA Stiftung -// SPDX-License-Identifier: Apache-2.0 - -import { - IotaObjectChangeWithDisplay, - getObjectChangeLabel, - getOwnerDisplay, - parseObjectChangeDetails, -} from '@iota/core'; -import { useCurrentAccount } from '@iota/dapp-kit'; -import { DisplayFieldsResponse, IotaObjectChange } from '@iota/iota-sdk/client'; -import { formatAddress, isValidIotaAddress } from '@iota/iota-sdk/utils'; - -enum ObjectDetailLabel { - Package = 'Package', - Module = 'Module', - Type = 'Type', -} - -interface ObjectDetailProps { - change: IotaObjectChange | IotaObjectChangeWithDisplay; - owner: string; - ownerType: string; - displayData?: DisplayFieldsResponse; -} - -export default function ObjectDetail({ change, owner, ownerType, displayData }: ObjectDetailProps) { - const address = useCurrentAccount()?.address; - if (!address) return null; - - const { ownerDisplay } = getOwnerDisplay(owner, ownerType, address); - - if (change.type === 'transferred' || change.type === 'published') { - return null; - } - - const [packageId, moduleName, typeName] = parseObjectChangeDetails(change); - - const objectDetails: { - label: ObjectDetailLabel; - value: string; - }[] = [ - { - label: ObjectDetailLabel.Package, - value: packageId, - }, - { - label: ObjectDetailLabel.Module, - value: moduleName, - }, - { - label: ObjectDetailLabel.Type, - value: typeName, - }, - ]; - - return ( - <div className="py-2"> - <h4 className="text-center font-semibold">{getObjectChangeLabel(change.type)}</h4> - - <div className="flex flex-row items-center justify-between py-2"> - <div className="flex flex-col"> - {change.objectId && ( - <div className="flex flex-row space-x-2"> - <span className="font-semibold">Object</span> - <div title={change.objectId}>{formatAddress(change.objectId)}</div> - </div> - )} - - {objectDetails.map((item) => { - const shouldFormatValue = isValidIotaAddress(item.value); - return ( - <div key={item.label} className="flex flex-row space-x-2"> - <span className="font-semibold">{item.label}</span> - <div title={shouldFormatValue ? item.value : undefined}> - {shouldFormatValue ? formatAddress(item.value) : item.value} - </div> - </div> - ); - })} - </div> - - {displayData && displayData.data && ( - // eslint-disable-next-line @next/next/no-img-element - <img - src={displayData.data.image_url} - alt={displayData.data.name} - height={100} - width={100} - /> - )} - </div> - - {ownerDisplay && ( - <div className="flex flex-row justify-between space-x-2 border-t pt-1"> - <span>Owner</span> - <span title={owner}>{ownerDisplay}</span> - </div> - )} - </div> - ); -} diff --git a/apps/wallet-dashboard/components/transactions/object-changes/index.ts b/apps/wallet-dashboard/components/transactions/object-changes/index.ts deleted file mode 100644 index 0e88da93730..00000000000 --- a/apps/wallet-dashboard/components/transactions/object-changes/index.ts +++ /dev/null @@ -1,6 +0,0 @@ -// Copyright (c) 2024 IOTA Stiftung -// SPDX-License-Identifier: Apache-2.0 - -export { default as ObjectChangeEntry } from './ObjectChangeEntry'; -export { default as ObjectChanges } from './ObjectChanges'; -export { default as ObjectDetail } from './ObjectDetail'; diff --git a/apps/wallet/src/ui/app/components/ExplorerLinkHelper.tsx b/apps/wallet/src/ui/app/components/ExplorerLinkHelper.tsx new file mode 100644 index 00000000000..bbc381a0e44 --- /dev/null +++ b/apps/wallet/src/ui/app/components/ExplorerLinkHelper.tsx @@ -0,0 +1,9 @@ +// Copyright (c) 2024 IOTA Stiftung +// SPDX-License-Identifier: Apache-2.0 + +import type { RenderExplorerLinkProps } from '@iota/core'; +import ExplorerLink from './explorer-link'; + +export function ExplorerLinkHelper({ children, ...linkProps }: RenderExplorerLinkProps) { + return <ExplorerLink {...linkProps}>{children}</ExplorerLink>; +} diff --git a/apps/wallet/src/ui/app/components/index.ts b/apps/wallet/src/ui/app/components/index.ts index 5dd1c520da6..978c70b11b4 100644 --- a/apps/wallet/src/ui/app/components/index.ts +++ b/apps/wallet/src/ui/app/components/index.ts @@ -11,6 +11,7 @@ export * from './PasswordInputDialog'; export * from './SectionHeader'; export * from './SummaryCard'; export * from './WalletListSelect'; +export * from './ExplorerLinkHelper'; export * from './accounts'; export * from './active-coins-card'; export * from './error-boundary'; diff --git a/apps/wallet/src/ui/app/components/receipt-card/StakeTxn.tsx b/apps/wallet/src/ui/app/components/receipt-card/StakeTxn.tsx deleted file mode 100644 index 94aa3c6285b..00000000000 --- a/apps/wallet/src/ui/app/components/receipt-card/StakeTxn.tsx +++ /dev/null @@ -1,57 +0,0 @@ -// Copyright (c) Mysten Labs, Inc. -// Modifications Copyright (c) 2024 IOTA Stiftung -// SPDX-License-Identifier: Apache-2.0 - -import { ValidatorLogo } from '_app/staking/validators/ValidatorLogo'; -import { TxnAmount } from '_components'; - -import { formatPercentageDisplay, type GasSummaryType, useGetValidatorsApy } from '@iota/core'; -import type { IotaEvent } from '@iota/iota-sdk/client'; -import { IOTA_TYPE_ARG } from '@iota/iota-sdk/utils'; - -import { CardType } from '@iota/apps-ui-kit'; -import { StakeTxnInfo } from './StakeTxnInfo'; - -interface StakeTxnProps { - event: IotaEvent; - gasSummary?: GasSummaryType; -} - -// For Staked Transaction use moveEvent Field to get the validator address, delegation amount, epoch -export function StakeTxn({ event, gasSummary }: StakeTxnProps) { - const json = event.parsedJson as { - amount: string; - validator_address: string; - epoch: string; - }; - const validatorAddress = json?.validator_address; - const stakedAmount = json?.amount; - const stakedEpoch = Number(json?.epoch || '0'); - - const { data: rollingAverageApys } = useGetValidatorsApy(); - - const { apy, isApyApproxZero } = rollingAverageApys?.[validatorAddress] ?? { - apy: null, - }; - - return ( - <div className="flex flex-col gap-y-md"> - {validatorAddress && ( - <ValidatorLogo - validatorAddress={validatorAddress} - type={CardType.Filled} - showActiveStatus - activeEpoch={json?.epoch} - /> - )} - {stakedAmount && ( - <TxnAmount amount={stakedAmount} coinType={IOTA_TYPE_ARG} subtitle="Stake" /> - )} - <StakeTxnInfo - startEpoch={stakedEpoch} - apy={formatPercentageDisplay(apy, '--', isApyApproxZero)} - gasSummary={gasSummary} - /> - </div> - ); -} diff --git a/apps/wallet/src/ui/app/components/receipt-card/index.tsx b/apps/wallet/src/ui/app/components/receipt-card/index.tsx index 9f75dc287f8..3bba1a45a7f 100644 --- a/apps/wallet/src/ui/app/components/receipt-card/index.tsx +++ b/apps/wallet/src/ui/app/components/receipt-card/index.tsx @@ -5,44 +5,16 @@ import { useRecognizedPackages } from '_src/ui/app/hooks/useRecognizedPackages'; import { useTransactionSummary, - STAKING_REQUEST_EVENT, - UNSTAKING_REQUEST_EVENT, - formatDate, + TransactionReceipt, + ExplorerLinkType, + ViewTxnOnExplorerButton, } from '@iota/core'; import { type IotaTransactionBlockResponse } from '@iota/iota-sdk/client'; -import { TransactionSummary } from '../../shared/transaction-summary'; -import { StakeTxn } from './StakeTxn'; -import { UnStakeTxn } from './UnstakeTxn'; -import { - Button, - ButtonType, - InfoBox, - InfoBoxStyle, - InfoBoxType, - LoadingIndicator, -} from '@iota/apps-ui-kit'; -import { ArrowTopRight, CheckmarkFilled } from '@iota/ui-icons'; -import { GasFees } from '../../pages/approval-request/transaction-request/GasFees'; -import ExplorerLink, { ExplorerLinkType } from '../explorer-link'; - -interface TransactionStatusProps { - success: boolean; - timestamp?: string; -} - -function TransactionStatus({ success, timestamp }: TransactionStatusProps) { - const txnDate = timestamp ? formatDate(Number(timestamp)) : ''; - return ( - <InfoBox - type={success ? InfoBoxType.Default : InfoBoxType.Error} - style={InfoBoxStyle.Elevated} - title={success ? 'Successfully sent' : 'Transaction Failed'} - supportingText={timestamp ? txnDate : ''} - icon={<CheckmarkFilled />} - ></InfoBox> - ); -} +import { CardType } from '@iota/apps-ui-kit'; +import { ValidatorLogo } from '../../staking/validators/ValidatorLogo'; +import { ExplorerLinkHelper } from '../ExplorerLinkHelper'; +import ExplorerLink from '../explorer-link'; interface ReceiptCardProps { txn: IotaTransactionBlockResponse; @@ -50,60 +22,36 @@ interface ReceiptCardProps { } export function ReceiptCard({ txn, activeAddress }: ReceiptCardProps) { - const { events } = txn; const recognizedPackagesList = useRecognizedPackages(); const summary = useTransactionSummary({ transaction: txn, currentAddress: activeAddress, recognizedPackagesList, }); - const isSender = txn.transaction?.data.sender === activeAddress; if (!summary) return null; const { digest } = summary; - const stakedTxn = events?.find(({ type }) => type === STAKING_REQUEST_EVENT); - const unstakeTxn = events?.find(({ type }) => type === UNSTAKING_REQUEST_EVENT); return ( <div className="flex h-full w-full flex-col justify-between"> - <div className="flex flex-col gap-md overflow-y-auto overflow-x-hidden"> - <TransactionStatus - success={summary.status === 'success'} - timestamp={txn.timestampMs ?? undefined} - /> - {stakedTxn || unstakeTxn ? ( - <> - {stakedTxn ? ( - <StakeTxn event={stakedTxn} gasSummary={summary?.gas} /> - ) : null} - {unstakeTxn ? ( - <UnStakeTxn event={unstakeTxn} gasSummary={summary?.gas} /> - ) : null} - </> - ) : ( - <> - <TransactionSummary summary={summary} /> - {isSender && <GasFees gasSummary={summary?.gas} />} - </> + <TransactionReceipt + txn={txn} + summary={summary} + activeAddress={activeAddress} + renderExplorerLink={ExplorerLinkHelper} + renderValidatorLogo={({ address, showActiveStatus, activeEpoch, isSelected }) => ( + <ValidatorLogo + validatorAddress={address} + showActiveStatus={showActiveStatus} + activeEpoch={activeEpoch} + type={isSelected ? CardType.Filled : CardType.Outlined} + /> )} - </div> + /> <div className="pt-sm"> <ExplorerLink transactionID={digest ?? ''} type={ExplorerLinkType.Transaction}> - <Button - type={ButtonType.Outlined} - text="View on Explorer" - fullWidth - icon={ - digest ? ( - <ArrowTopRight /> - ) : ( - <LoadingIndicator data-testid="loading-indicator" /> - ) - } - iconAfterText - disabled={!digest} - /> + <ViewTxnOnExplorerButton digest={digest} /> </ExplorerLink> </div> </div> diff --git a/apps/wallet/src/ui/app/pages/approval-request/transaction-request/index.tsx b/apps/wallet/src/ui/app/pages/approval-request/transaction-request/index.tsx index d618abe0265..e3cf45db226 100644 --- a/apps/wallet/src/ui/app/pages/approval-request/transaction-request/index.tsx +++ b/apps/wallet/src/ui/app/pages/approval-request/transaction-request/index.tsx @@ -2,8 +2,8 @@ // Modifications Copyright (c) 2024 IOTA Stiftung // SPDX-License-Identifier: Apache-2.0 -import { UserApproveContainer } from '_components'; -import { useAppDispatch, useTransactionData, useTransactionDryRun } from '_hooks'; +import { ExplorerLinkHelper, UserApproveContainer } from '_components'; +import { useActiveAddress, useAppDispatch, useTransactionData, useTransactionDryRun } from '_hooks'; import { type TransactionApprovalRequest } from '_payloads/transactions/ApprovalRequest'; import { respondToTransactionRequest } from '_redux/slices/transaction-requests'; import { ampli } from '_src/shared/analytics/ampli'; @@ -11,13 +11,11 @@ import { useAccountByAddress } from '_src/ui/app/hooks/useAccountByAddress'; import { useRecognizedPackages } from '_src/ui/app/hooks/useRecognizedPackages'; import { useSigner } from '_src/ui/app/hooks/useSigner'; import { PageMainLayoutTitle } from '_src/ui/app/shared/page-main-layout/PageMainLayoutTitle'; -import { TransactionSummary } from '_src/ui/app/shared/transaction-summary'; -import { useTransactionSummary } from '@iota/core'; +import { useTransactionSummary, TransactionSummary, GasFees } from '@iota/core'; import { Transaction } from '@iota/iota-sdk/transactions'; import { useMemo, useState } from 'react'; import { ConfirmationModal } from '../../../shared/ConfirmationModal'; -import { GasFees } from './GasFees'; import { TransactionDetails } from './TransactionDetails'; export interface TransactionRequestProps { @@ -32,6 +30,7 @@ const APP_ORIGINS_TO_EXCLUDE_FROM_ANALYTICS = ['https://iota8192.ethoswallet.xyz export function TransactionRequest({ txRequest }: TransactionRequestProps) { const addressForTransaction = txRequest.tx.account; + const activeAddress = useActiveAddress(); const { data: accountForTransaction } = useAccountByAddress(addressForTransaction); const signer = useSigner(accountForTransaction); const dispatch = useAppDispatch(); @@ -99,6 +98,7 @@ export function TransactionRequest({ txRequest }: TransactionRequestProps) { isLoading={isDryRunLoading} isError={isDryRunError} summary={summary} + renderExplorerLink={ExplorerLinkHelper} /> <GasFees sender={addressForTransaction} @@ -106,6 +106,8 @@ export function TransactionRequest({ txRequest }: TransactionRequestProps) { isEstimate isError={isError} isPending={isDryRunLoading} + activeAddress={activeAddress} + renderExplorerLink={ExplorerLinkHelper} /> <TransactionDetails sender={addressForTransaction} transaction={transaction} /> </div> diff --git a/apps/wallet/src/ui/app/pages/home/receipt/index.tsx b/apps/wallet/src/ui/app/pages/home/receipt/index.tsx index 44749f6c186..6afd778f2a9 100644 --- a/apps/wallet/src/ui/app/pages/home/receipt/index.tsx +++ b/apps/wallet/src/ui/app/pages/home/receipt/index.tsx @@ -5,13 +5,12 @@ import { Loading, Overlay, ReceiptCard } from '_components'; import { useActiveAddress } from '_src/ui/app/hooks/useActiveAddress'; import { useUnlockedGuard } from '_src/ui/app/hooks/useUnlockedGuard'; -import { useIotaClient } from '@iota/dapp-kit'; -import { type IotaTransactionBlockResponse } from '@iota/iota-sdk/client'; -import { useQuery } from '@tanstack/react-query'; import { useCallback, useMemo, useState } from 'react'; import { Navigate, useLocation, useNavigate, useSearchParams } from 'react-router-dom'; import { Checkmark, Warning } from '@iota/ui-icons'; import { InfoBox, InfoBoxType, InfoBoxStyle } from '@iota/apps-ui-kit'; +import type { IotaTransactionBlockResponse } from '@iota/iota-sdk/client'; +import { useGetTransaction } from '@iota/core'; function ReceiptPage() { const location = useLocation(); @@ -22,25 +21,14 @@ function ReceiptPage() { // get tx results from url params const transactionId = searchParams.get('txdigest'); const fromParam = searchParams.get('from'); - const client = useIotaClient(); - const { data, isPending, isError, error } = useQuery<IotaTransactionBlockResponse>({ - queryKey: ['transactions-by-id', transactionId], - queryFn: async () => { - return client.getTransactionBlock({ - digest: transactionId!, - options: { - showBalanceChanges: true, - showObjectChanges: true, - showInput: true, - showEffects: true, - showEvents: true, - }, - }); - }, - enabled: !!transactionId, + const initialDataFromState = location.state?.response as + | IotaTransactionBlockResponse + | undefined; + + const { data, isPending, isError, error } = useGetTransaction(transactionId ?? '', { retry: 8, - initialData: location.state?.response, + initialData: initialDataFromState, }); const navigate = useNavigate(); @@ -67,6 +55,7 @@ function ReceiptPage() { if (!transactionId || !activeAddress) { return <Navigate to="/transactions" replace={true} />; } + return ( <Loading loading={isPending || isGuardLoading}> <Overlay diff --git a/apps/wallet/src/ui/app/shared/transaction-summary/index.tsx b/apps/wallet/src/ui/app/shared/transaction-summary/index.tsx deleted file mode 100644 index 5d384cdc65d..00000000000 --- a/apps/wallet/src/ui/app/shared/transaction-summary/index.tsx +++ /dev/null @@ -1,42 +0,0 @@ -// Copyright (c) Mysten Labs, Inc. -// Modifications Copyright (c) 2024 IOTA Stiftung -// SPDX-License-Identifier: Apache-2.0 -import { type TransactionSummary as TransactionSummaryType } from '@iota/core'; -import { BalanceChanges } from './cards/BalanceChanges'; -import { ObjectChanges } from './cards/ObjectChanges'; -import { LoadingIndicator } from '@iota/apps-ui-kit'; - -export function TransactionSummary({ - summary, - isLoading, - isError, - isDryRun = false, -}: { - summary: TransactionSummaryType; - isLoading?: boolean; - isDryRun?: boolean; - isError?: boolean; -}) { - if (isError) return null; - return ( - <> - {isLoading ? ( - <div className="flex items-center justify-center p-10"> - <LoadingIndicator /> - </div> - ) : ( - <div className="flex flex-col gap-3"> - {isDryRun && ( - <div className="pl-4.5"> - <span className="text-title-lg text-neutral-10 dark:text-neutral-92"> - Do you approve these actions? - </span> - </div> - )} - <BalanceChanges changes={summary?.balanceChanges} /> - <ObjectChanges changes={summary?.objectSummary} /> - </div> - )} - </> - ); -} diff --git a/apps/wallet/src/ui/app/staking/stake/StakeForm.tsx b/apps/wallet/src/ui/app/staking/stake/StakeForm.tsx index 83a70ef19a8..093991e6f33 100644 --- a/apps/wallet/src/ui/app/staking/stake/StakeForm.tsx +++ b/apps/wallet/src/ui/app/staking/stake/StakeForm.tsx @@ -7,6 +7,7 @@ import { createStakeTransaction, getGasSummary, parseAmount, + StakeTransactionInfo, useCoinMetadata, useFormatCoin, useStakingGasBudgetEstimation, @@ -16,9 +17,9 @@ import { memo, useEffect, useMemo } from 'react'; import { useActiveAddress, useTransactionDryRun } from '../../hooks'; import { type FormValues } from './StakingCard'; import { InfoBox, InfoBoxStyle, InfoBoxType, Input, InputType } from '@iota/apps-ui-kit'; -import { StakeTxnInfo } from '../../components/receipt-card/StakeTxnInfo'; import { Transaction } from '@iota/iota-sdk/transactions'; import { Exclamation } from '@iota/ui-icons'; +import { ExplorerLinkHelper } from '../../components'; export interface StakeFromProps { validatorAddress: string; @@ -106,7 +107,12 @@ function StakeForm({ validatorAddress, coinBalance, coinType, epoch }: StakeFrom icon={<Exclamation />} /> ) : null} - <StakeTxnInfo startEpoch={epoch} gasSummary={transaction ? gasSummary : undefined} /> + <StakeTransactionInfo + startEpoch={epoch} + activeAddress={activeAddress} + gasSummary={transaction ? gasSummary : undefined} + renderExplorerLink={ExplorerLinkHelper} + /> </Form> ); } diff --git a/apps/wallet/tailwind.config.ts b/apps/wallet/tailwind.config.ts index 1a42a522c18..088b09b22c6 100644 --- a/apps/wallet/tailwind.config.ts +++ b/apps/wallet/tailwind.config.ts @@ -9,7 +9,11 @@ import uiKitStaticPreset from '../../apps/ui-kit/src/lib/tailwind/static.preset' export default { presets: [uiKitStaticPreset], - content: ['./src/**/*.{js,jsx,ts,tsx}', './../ui-kit/src/lib/**/*.{js,jsx,ts,tsx}'], + content: [ + './src/**/*.{js,jsx,ts,tsx}', + './../ui-kit/src/lib/**/*.{js,jsx,ts,tsx}', + './../core/src/components/**/*.{js,jsx,ts,tsx}', + ], theme: { extend: { colors: { diff --git a/apps/wallet/tests/balanceChanges.spec.ts b/apps/wallet/tests/balanceChanges.spec.ts index c83d58499e0..c6f9d010817 100644 --- a/apps/wallet/tests/balanceChanges.spec.ts +++ b/apps/wallet/tests/balanceChanges.spec.ts @@ -89,5 +89,5 @@ test('check balance changes in Activity', async ({ page, extensionUrl }) => { await page.getByTestId('nav-activity').click(); await expect(page.getByTestId('link-to-txn').first()).toBeVisible({ timeout }); await page.getByTestId('link-to-txn').first().click(); - await expect(page.getByText(`Successfully sent`, { exact: false })).toBeVisible(); + await expect(page.getByText(`Successfully received`, { exact: false })).toBeVisible(); }); From 2fd6d933df7ccb304da3dbbbd045e3efe49183e4 Mon Sep 17 00:00:00 2001 From: evavirseda <evirseda@boxfish.studio> Date: Thu, 5 Dec 2024 14:27:52 +0100 Subject: [PATCH 09/97] feat(wallet-dasboard): style vesting schedule (#4340) * feat: add new icon * feat: update carAction component * feat: update feature flags * feat: update icon * polish * minor fix * feat: countdown * feat: improve import and naming * feat: add hook * feat: polishes * fix imports * minor fixes * fix build * fix build * feat: rename function, variables and fix improts * feat: add vesting schedule * cleanup * feat: rename countdown and fix it * feat: improvements * cleanup * feat: remove undefined from button type * fix lint * feat: remove debris * fix build * feat: improve naming * minor fix * fix useffect and filter payouts * feat: use last paoyut and fix condition * feat:use current epoch * feat: update to toLocaleDateString * feat: add current epoch * fix build * fix tests * fix: use dynamic constant --------- Co-authored-by: Marc Espin <mespinsanz@gmail.com> Co-authored-by: Bran <52735957+brancoder@users.noreply.github.com> --- .../components/organisms/dialog/Dialog.tsx | 11 +++-- .../app/(protected)/vesting/page.tsx | 44 ++++++++++++++----- .../components/Dialogs/index.ts | 1 + .../Dialogs/vesting/VestingScheduleBox.tsx | 31 +++++++++++++ .../Dialogs/vesting/VestingScheduleDialog.tsx | 42 ++++++++++++++++++ .../components/Dialogs/vesting/index.ts | 5 +++ .../lib/utils/vesting/vesting.spec.ts | 26 ++++++++--- .../lib/utils/vesting/vesting.ts | 22 ++++++---- 8 files changed, 154 insertions(+), 28 deletions(-) create mode 100644 apps/wallet-dashboard/components/Dialogs/vesting/VestingScheduleBox.tsx create mode 100644 apps/wallet-dashboard/components/Dialogs/vesting/VestingScheduleDialog.tsx create mode 100644 apps/wallet-dashboard/components/Dialogs/vesting/index.ts diff --git a/apps/ui-kit/src/lib/components/organisms/dialog/Dialog.tsx b/apps/ui-kit/src/lib/components/organisms/dialog/Dialog.tsx index 5bd43a1b7ba..50fd835d2e3 100644 --- a/apps/ui-kit/src/lib/components/organisms/dialog/Dialog.tsx +++ b/apps/ui-kit/src/lib/components/organisms/dialog/Dialog.tsx @@ -41,6 +41,7 @@ const DialogContent = React.forwardRef< containerId?: string; showCloseOnOverlay?: boolean; position?: DialogPosition; + customWidth?: string; } >( ( @@ -50,6 +51,7 @@ const DialogContent = React.forwardRef< showCloseOnOverlay, children, position = DialogPosition.Center, + customWidth = 'w-80 max-w-[85vw] md:w-96', ...props }, ref, @@ -66,16 +68,19 @@ const DialogContent = React.forwardRef< }, [containerId]); const positionClass = position === DialogPosition.Right - ? 'right-0 h-screen top-0 w-full max-w-[500px]' - : 'max-h-[60vh] left-1/2 top-1/2 -translate-x-1/2 -translate-y-1/2 rounded-xl w-80 max-w-[85vw]'; + ? 'right-0 h-screen top-0 w-full' + : 'max-h-[60vh] left-1/2 top-1/2 -translate-x-1/2 -translate-y-1/2 rounded-xl'; + const widthClass = + position === DialogPosition.Right ? 'md:w-96 max-w-[500px]' : customWidth; return ( <RadixDialog.Portal container={containerElement}> <DialogOverlay showCloseIcon={showCloseOnOverlay} position={position} /> <RadixDialog.Content ref={ref} className={cx( - 'fixed z-[99998] flex flex-col justify-center overflow-hidden bg-primary-100 dark:bg-neutral-6 md:w-96', + 'fixed z-[99999] flex flex-col justify-center overflow-hidden bg-primary-100 dark:bg-neutral-6', positionClass, + widthClass, )} {...props} > diff --git a/apps/wallet-dashboard/app/(protected)/vesting/page.tsx b/apps/wallet-dashboard/app/(protected)/vesting/page.tsx index a2d2bfb19fe..0488681830d 100644 --- a/apps/wallet-dashboard/app/(protected)/vesting/page.tsx +++ b/apps/wallet-dashboard/app/(protected)/vesting/page.tsx @@ -3,10 +3,16 @@ 'use client'; -import { Banner, StakeDialog, TimelockedUnstakePopup } from '@/components'; -import { useStakeDialog } from '@/components/Dialogs/Staking/hooks/useStakeDialog'; +import { + Banner, + StakeDialog, + TimelockedUnstakePopup, + useStakeDialog, + VestingScheduleDialog, +} from '@/components'; import { useGetCurrentEpochStartTimestamp, useNotifications, usePopups } from '@/hooks'; import { + buildSupplyIncreaseVestingSchedule, formatDelegatedTimelockedStake, getLatestOrEarliestSupplyIncreaseVestingPayout, getVestingOverview, @@ -52,13 +58,14 @@ import { IOTA_TYPE_ARG } from '@iota/iota-sdk/utils'; import { Calendar, StarHex } from '@iota/ui-icons'; import { useQueryClient } from '@tanstack/react-query'; import { useRouter } from 'next/navigation'; -import { useEffect } from 'react'; +import { useEffect, useState } from 'react'; function VestingDashboardPage(): JSX.Element { const account = useCurrentAccount(); const queryClient = useQueryClient(); const iotaClient = useIotaClient(); const router = useRouter(); + const [isVestingScheduleDialogOpen, setIsVestingScheduleDialogOpen] = useState(false); const { addNotification } = useNotifications(); const { openPopup, closePopup } = usePopups(); const { data: currentEpochMs } = useGetCurrentEpochStartTimestamp(); @@ -101,9 +108,19 @@ function VestingDashboardPage(): JSX.Element { const nextPayout = getLatestOrEarliestSupplyIncreaseVestingPayout( [...timelockedMapped, ...timelockedstakedMapped], + Number(currentEpochMs), false, ); + const lastPayout = getLatestOrEarliestSupplyIncreaseVestingPayout( + [...timelockedMapped, ...timelockedstakedMapped], + Number(currentEpochMs), + true, + ); + + const vestingPortfolio = + lastPayout && buildSupplyIncreaseVestingSchedule(lastPayout, Number(currentEpochMs)); + const formattedLastPayoutExpirationTime = useCountdownByTimestamp( Number(nextPayout?.expirationTimestampMs), ); @@ -206,12 +223,15 @@ function VestingDashboardPage(): JSX.Element { ); } + function openReceiveTokenPopup(): void { + setIsVestingScheduleDialogOpen(true); + } + useEffect(() => { if (!supplyIncreaseVestingEnabled) { router.push('/'); } }, [router, supplyIncreaseVestingEnabled]); - return ( <div className="flex w-full max-w-xl flex-col gap-lg justify-self-center"> <Panel> @@ -264,17 +284,19 @@ function VestingDashboardPage(): JSX.Element { /> <CardAction type={CardActionType.Button} - onClick={() => { - /*Open schedule dialog*/ - }} + onClick={openReceiveTokenPopup} title="See All" buttonType={ButtonType.Secondary} - buttonDisabled={ - !vestingSchedule.availableStaking || - vestingSchedule.availableStaking === 0 - } + buttonDisabled={!vestingPortfolio} /> </Card> + {vestingPortfolio && ( + <VestingScheduleDialog + open={isVestingScheduleDialogOpen} + setOpen={setIsVestingScheduleDialogOpen} + vestingPortfolio={vestingPortfolio} + /> + )} </div> </Panel> {timelockedstakedMapped.length === 0 ? ( diff --git a/apps/wallet-dashboard/components/Dialogs/index.ts b/apps/wallet-dashboard/components/Dialogs/index.ts index 672519d795e..97ee2fabbad 100644 --- a/apps/wallet-dashboard/components/Dialogs/index.ts +++ b/apps/wallet-dashboard/components/Dialogs/index.ts @@ -4,3 +4,4 @@ export * from './SendToken'; export * from './ReceiveFundsDialog'; export * from './Staking'; +export * from './vesting'; diff --git a/apps/wallet-dashboard/components/Dialogs/vesting/VestingScheduleBox.tsx b/apps/wallet-dashboard/components/Dialogs/vesting/VestingScheduleBox.tsx new file mode 100644 index 00000000000..25f861590a0 --- /dev/null +++ b/apps/wallet-dashboard/components/Dialogs/vesting/VestingScheduleBox.tsx @@ -0,0 +1,31 @@ +// Copyright (c) 2024 IOTA Stiftung +// SPDX-License-Identifier: Apache-2.0 + +import { useGetCurrentEpochStartTimestamp } from '@/hooks'; +import { DisplayStats, DisplayStatsType } from '@iota/apps-ui-kit'; +import { useFormatCoin } from '@iota/core'; +import { IOTA_TYPE_ARG } from '@iota/iota-sdk/utils'; +import { LockLocked } from '@iota/ui-icons'; + +interface VestingScheduleBoxProps { + amount: number; + expirationTimestampMs: number; +} + +export function VestingScheduleBox({ + amount, + expirationTimestampMs, +}: VestingScheduleBoxProps): React.JSX.Element { + const [formattedAmountVested, amountVestedSymbol] = useFormatCoin(amount, IOTA_TYPE_ARG); + const { data: currentEpochMs } = useGetCurrentEpochStartTimestamp(); + + const isLocked = expirationTimestampMs > Number(currentEpochMs); + return ( + <DisplayStats + label={new Date(expirationTimestampMs).toLocaleDateString()} + value={`${formattedAmountVested} ${amountVestedSymbol}`} + type={isLocked ? DisplayStatsType.Default : DisplayStatsType.Secondary} + icon={isLocked && <LockLocked className="h-4 w-4" />} + /> + ); +} diff --git a/apps/wallet-dashboard/components/Dialogs/vesting/VestingScheduleDialog.tsx b/apps/wallet-dashboard/components/Dialogs/vesting/VestingScheduleDialog.tsx new file mode 100644 index 00000000000..8495836b0da --- /dev/null +++ b/apps/wallet-dashboard/components/Dialogs/vesting/VestingScheduleDialog.tsx @@ -0,0 +1,42 @@ +// Copyright (c) 2024 IOTA Stiftung +// SPDX-License-Identifier: Apache-2.0 + +import { SupplyIncreaseVestingPortfolio } from '@/lib/interfaces'; +import { Dialog, DialogContent, DialogBody, Header } from '@iota/apps-ui-kit'; +import { VestingScheduleBox } from './VestingScheduleBox'; + +interface VestingScheduleDialogProps { + setOpen: (bool: boolean) => void; + open: boolean; + vestingPortfolio: SupplyIncreaseVestingPortfolio; +} + +export function VestingScheduleDialog({ + open, + setOpen, + vestingPortfolio, +}: VestingScheduleDialogProps): React.JSX.Element { + return ( + <Dialog open={open} onOpenChange={setOpen}> + <DialogContent + containerId="overlay-portal-container" + customWidth="max-w-md sm:max-w-xl md:max-w-5xl w-full" + > + <Header title="Rewards Schedule" onClose={() => setOpen(false)} titleCentered /> + <DialogBody> + <div className="h-[440px] overflow-y-auto"> + <div className="grid grid-cols-1 gap-sm sm:grid-cols-2 md:grid-cols-4"> + {vestingPortfolio?.map((vestingObject, index) => ( + <VestingScheduleBox + key={index} + amount={vestingObject.amount} + expirationTimestampMs={vestingObject.expirationTimestampMs} + /> + ))} + </div> + </div> + </DialogBody> + </DialogContent> + </Dialog> + ); +} diff --git a/apps/wallet-dashboard/components/Dialogs/vesting/index.ts b/apps/wallet-dashboard/components/Dialogs/vesting/index.ts new file mode 100644 index 00000000000..ace972f3f49 --- /dev/null +++ b/apps/wallet-dashboard/components/Dialogs/vesting/index.ts @@ -0,0 +1,5 @@ +// Copyright (c) 2024 IOTA Stiftung +// SPDX-License-Identifier: Apache-2.0 + +export * from './VestingScheduleDialog'; +export * from './VestingScheduleBox'; diff --git a/apps/wallet-dashboard/lib/utils/vesting/vesting.spec.ts b/apps/wallet-dashboard/lib/utils/vesting/vesting.spec.ts index acd5812aa72..5e1cea77657 100644 --- a/apps/wallet-dashboard/lib/utils/vesting/vesting.spec.ts +++ b/apps/wallet-dashboard/lib/utils/vesting/vesting.spec.ts @@ -1,6 +1,7 @@ // Copyright (c) 2024 IOTA Stiftung // SPDX-License-Identifier: Apache-2.0 +import { MILLISECONDS_PER_HOUR } from '@iota/core/constants/time.constants'; import { mockedTimelockedStackedObjectsWithDynamicDate, MOCKED_SUPPLY_INCREASE_VESTING_TIMELOCKED_OBJECTS, @@ -8,10 +9,8 @@ import { SUPPLY_INCREASE_STAKER_VESTING_DURATION, SUPPLY_INCREASE_VESTING_PAYOUTS_IN_1_YEAR, } from '../../constants'; - import { SupplyIncreaseUserType, SupplyIncreaseVestingPayout } from '../../interfaces'; import { formatDelegatedTimelockedStake, isTimelockedObject } from '../timelock'; - import { getVestingOverview, buildSupplyIncreaseVestingSchedule as buildVestingPortfolio, @@ -20,6 +19,8 @@ import { getSupplyIncreaseVestingUserType, } from './vesting'; +const MOCKED_CURRENT_EPOCH_TIMESTAMP = Date.now() + MILLISECONDS_PER_HOUR * 6; // 6 hours later + describe('get last supply increase vesting payout', () => { it('should get the object with highest expirationTimestampMs', () => { const timelockedObjects = MOCKED_SUPPLY_INCREASE_VESTING_TIMELOCKED_OBJECTS; @@ -30,7 +31,10 @@ describe('get last supply increase vesting payout', () => { MOCKED_SUPPLY_INCREASE_VESTING_TIMELOCKED_OBJECTS.length - 1 ]; - const lastPayout = getLatestOrEarliestSupplyIncreaseVestingPayout(timelockedObjects); + const lastPayout = getLatestOrEarliestSupplyIncreaseVestingPayout( + timelockedObjects, + MOCKED_CURRENT_EPOCH_TIMESTAMP, + ); expect(lastPayout?.expirationTimestampMs).toEqual(expectedObject.expirationTimestampMs); expect(lastPayout?.amount).toEqual(expectedObject.locked.value); @@ -61,7 +65,10 @@ describe('build supply increase staker vesting portfolio', () => { it('should build with mocked timelocked objects', () => { const timelockedObjects = MOCKED_SUPPLY_INCREASE_VESTING_TIMELOCKED_OBJECTS; - const lastPayout = getLatestOrEarliestSupplyIncreaseVestingPayout(timelockedObjects); + const lastPayout = getLatestOrEarliestSupplyIncreaseVestingPayout( + timelockedObjects, + MOCKED_CURRENT_EPOCH_TIMESTAMP, + ); expect(lastPayout).toBeDefined(); @@ -78,6 +85,7 @@ describe('build supply increase staker vesting portfolio', () => { formatDelegatedTimelockedStake(timelockedStakedObjects); const lastPayout = getLatestOrEarliestSupplyIncreaseVestingPayout( extendedTimelockedStakedObjects, + MOCKED_CURRENT_EPOCH_TIMESTAMP, ); expect(lastPayout).toBeDefined(); @@ -96,7 +104,10 @@ describe('build supply increase staker vesting portfolio', () => { formatDelegatedTimelockedStake(timelockedStakedObjects); const mixedObjects = [...timelockedObjects, ...extendedTimelockedStakedObjects]; - const lastPayout = getLatestOrEarliestSupplyIncreaseVestingPayout(mixedObjects); + const lastPayout = getLatestOrEarliestSupplyIncreaseVestingPayout( + mixedObjects, + MOCKED_CURRENT_EPOCH_TIMESTAMP, + ); expect(lastPayout).toBeDefined(); const vestingPortfolio = buildVestingPortfolio(lastPayout!, Date.now()); @@ -209,7 +220,10 @@ describe('vesting overview', () => { formatDelegatedTimelockedStake(timelockedStakedObjects); const mixedObjects = [...timelockedObjects, ...extendedTimelockedStakedObjects]; - const lastPayout = getLatestOrEarliestSupplyIncreaseVestingPayout(mixedObjects)!; + const lastPayout = getLatestOrEarliestSupplyIncreaseVestingPayout( + mixedObjects, + MOCKED_CURRENT_EPOCH_TIMESTAMP, + )!; const totalAmount = (SUPPLY_INCREASE_STAKER_VESTING_DURATION * SUPPLY_INCREASE_VESTING_PAYOUTS_IN_1_YEAR * diff --git a/apps/wallet-dashboard/lib/utils/vesting/vesting.ts b/apps/wallet-dashboard/lib/utils/vesting/vesting.ts index 70a24038841..c4bd743b5ef 100644 --- a/apps/wallet-dashboard/lib/utils/vesting/vesting.ts +++ b/apps/wallet-dashboard/lib/utils/vesting/vesting.ts @@ -28,6 +28,7 @@ import { IotaObjectData } from '@iota/iota-sdk/client'; export function getLatestOrEarliestSupplyIncreaseVestingPayout( objects: (TimelockedObject | ExtendedDelegatedTimelockedStake)[], + currentEpochTimestamp: number, useLastPayout: boolean = true, ): SupplyIncreaseVestingPayout | undefined { const vestingObjects = objects.filter(isSupplyIncreaseVestingObject); @@ -41,7 +42,7 @@ export function getLatestOrEarliestSupplyIncreaseVestingPayout( let payouts: SupplyIncreaseVestingPayout[] = Array.from(vestingPayoutMap.values()); if (!useLastPayout) { - payouts = payouts.filter((payout) => payout.expirationTimestampMs >= Date.now()); + payouts = payouts.filter((payout) => payout.expirationTimestampMs >= currentEpochTimestamp); } return payouts.sort((a, b) => @@ -126,12 +127,14 @@ export function buildSupplyIncreaseVestingSchedule( const payoutsCount = getSupplyIncreaseVestingPayoutsCount(userType); - return Array.from({ length: payoutsCount }).map((_, i) => ({ - amount: referencePayout.amount, - expirationTimestampMs: - referencePayout.expirationTimestampMs - - SUPPLY_INCREASE_VESTING_PAYOUT_SCHEDULE_MILLISECONDS * i, - })); + return Array.from({ length: payoutsCount }) + .map((_, i) => ({ + amount: referencePayout.amount, + expirationTimestampMs: + referencePayout.expirationTimestampMs - + SUPPLY_INCREASE_VESTING_PAYOUT_SCHEDULE_MILLISECONDS * i, + })) + .sort((a, b) => a.expirationTimestampMs - b.expirationTimestampMs); } export function getVestingOverview( @@ -139,7 +142,10 @@ export function getVestingOverview( currentEpochTimestamp: number, ): VestingOverview { const vestingObjects = objects.filter(isSupplyIncreaseVestingObject); - const latestPayout = getLatestOrEarliestSupplyIncreaseVestingPayout(vestingObjects); + const latestPayout = getLatestOrEarliestSupplyIncreaseVestingPayout( + vestingObjects, + currentEpochTimestamp, + ); if (vestingObjects.length === 0 || !latestPayout) { return { From a9b12323d70b6c5a390b4c5d56dc5e71eca666d9 Mon Sep 17 00:00:00 2001 From: Marc Espin <mespinsanz@gmail.com> Date: Thu, 5 Dec 2024 14:30:03 +0100 Subject: [PATCH 10/97] refactor(iota-vscode): Update extension dependencies (#4306) --- .../editors/code/package-lock.json | 1502 ++++++++++++----- .../move-analyzer/editors/code/package.json | 5 +- 2 files changed, 1105 insertions(+), 402 deletions(-) diff --git a/external-crates/move/crates/move-analyzer/editors/code/package-lock.json b/external-crates/move/crates/move-analyzer/editors/code/package-lock.json index 05ce33f9371..cf0fbf4d40f 100644 --- a/external-crates/move/crates/move-analyzer/editors/code/package-lock.json +++ b/external-crates/move/crates/move-analyzer/editors/code/package-lock.json @@ -9,8 +9,6 @@ "version": "1.0.0", "license": "Apache-2.0", "dependencies": { - "command-exists": "^1.2.9", - "lru-cache": "^4.1.3", "semver": "^7.6.2", "vscode-languageclient": "^9.0.1" }, @@ -24,6 +22,7 @@ "@typescript-eslint/eslint-plugin": "^6.10.0", "@typescript-eslint/parser": "^6.10.0", "@vscode/test-electron": "^2.4.1", + "@vscode/vsce": "^3.2.1", "copyfiles": "2.4.1", "cross-env": "^7.0.3", "eslint": "^8.53.0", @@ -32,9 +31,7 @@ "glob": "^7.1.7", "mocha": "^9.1.1", "typescript": "^4.9.5", - "typescript-formatter": "^7.2.2", - "vsce": "^2.5.1", - "vscode-test": "^1.6.1" + "typescript-formatter": "^7.2.2" }, "engines": { "vscode": "^1.61.0" @@ -49,6 +46,204 @@ "node": ">=0.10.0" } }, + "node_modules/@azure/abort-controller": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@azure/abort-controller/-/abort-controller-2.1.2.tgz", + "integrity": "sha512-nBrLsEWm4J2u5LpAPjxADTlq3trDgVZZXHNKabeXZtpq3d3AbN/KGO82R87rdDz5/lYB024rtEf10/q0urNgsA==", + "dev": true, + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@azure/core-auth": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@azure/core-auth/-/core-auth-1.9.0.tgz", + "integrity": "sha512-FPwHpZywuyasDSLMqJ6fhbOK3TqUdviZNF8OqRGA4W5Ewib2lEEZ+pBsYcBa88B2NGO/SEnYPGhyBqNlE8ilSw==", + "dev": true, + "dependencies": { + "@azure/abort-controller": "^2.0.0", + "@azure/core-util": "^1.11.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@azure/core-client": { + "version": "1.9.2", + "resolved": "https://registry.npmjs.org/@azure/core-client/-/core-client-1.9.2.tgz", + "integrity": "sha512-kRdry/rav3fUKHl/aDLd/pDLcB+4pOFwPPTVEExuMyaI5r+JBbMWqRbCY1pn5BniDaU3lRxO9eaQ1AmSMehl/w==", + "dev": true, + "dependencies": { + "@azure/abort-controller": "^2.0.0", + "@azure/core-auth": "^1.4.0", + "@azure/core-rest-pipeline": "^1.9.1", + "@azure/core-tracing": "^1.0.0", + "@azure/core-util": "^1.6.1", + "@azure/logger": "^1.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@azure/core-rest-pipeline": { + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/@azure/core-rest-pipeline/-/core-rest-pipeline-1.18.1.tgz", + "integrity": "sha512-/wS73UEDrxroUEVywEm7J0p2c+IIiVxyfigCGfsKvCxxCET4V/Hef2aURqltrXMRjNmdmt5IuOgIpl8f6xdO5A==", + "dev": true, + "dependencies": { + "@azure/abort-controller": "^2.0.0", + "@azure/core-auth": "^1.8.0", + "@azure/core-tracing": "^1.0.1", + "@azure/core-util": "^1.11.0", + "@azure/logger": "^1.0.0", + "http-proxy-agent": "^7.0.0", + "https-proxy-agent": "^7.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@azure/core-rest-pipeline/node_modules/agent-base": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.1.tgz", + "integrity": "sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==", + "dev": true, + "dependencies": { + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/@azure/core-rest-pipeline/node_modules/http-proxy-agent": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", + "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", + "dev": true, + "dependencies": { + "agent-base": "^7.1.0", + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/@azure/core-rest-pipeline/node_modules/https-proxy-agent": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.5.tgz", + "integrity": "sha512-1e4Wqeblerz+tMKPIq2EMGiiWW1dIjZOksyHWSUm1rmuvw/how9hBHZ38lAGj5ID4Ik6EdkOw7NmWPy6LAwalw==", + "dev": true, + "dependencies": { + "agent-base": "^7.0.2", + "debug": "4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/@azure/core-tracing": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@azure/core-tracing/-/core-tracing-1.2.0.tgz", + "integrity": "sha512-UKTiEJPkWcESPYJz3X5uKRYyOcJD+4nYph+KpfdPRnQJVrZfk0KJgdnaAWKfhsBBtAf/D58Az4AvCJEmWgIBAg==", + "dev": true, + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@azure/core-util": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@azure/core-util/-/core-util-1.11.0.tgz", + "integrity": "sha512-DxOSLua+NdpWoSqULhjDyAZTXFdP/LKkqtYuxxz1SCN289zk3OG8UOpnCQAz/tygyACBtWp/BoO72ptK7msY8g==", + "dev": true, + "dependencies": { + "@azure/abort-controller": "^2.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@azure/identity": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/@azure/identity/-/identity-4.5.0.tgz", + "integrity": "sha512-EknvVmtBuSIic47xkOqyNabAme0RYTw52BTMz8eBgU1ysTyMrD1uOoM+JdS0J/4Yfp98IBT3osqq3BfwSaNaGQ==", + "dev": true, + "dependencies": { + "@azure/abort-controller": "^2.0.0", + "@azure/core-auth": "^1.9.0", + "@azure/core-client": "^1.9.2", + "@azure/core-rest-pipeline": "^1.17.0", + "@azure/core-tracing": "^1.0.0", + "@azure/core-util": "^1.11.0", + "@azure/logger": "^1.0.0", + "@azure/msal-browser": "^3.26.1", + "@azure/msal-node": "^2.15.0", + "events": "^3.0.0", + "jws": "^4.0.0", + "open": "^8.0.0", + "stoppable": "^1.1.0", + "tslib": "^2.2.0" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@azure/logger": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@azure/logger/-/logger-1.1.4.tgz", + "integrity": "sha512-4IXXzcCdLdlXuCG+8UKEwLA1T1NHqUfanhXYHiQTn+6sfWCZXduqbtXDGceg3Ce5QxTGo7EqmbV6Bi+aqKuClQ==", + "dev": true, + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@azure/msal-browser": { + "version": "3.27.0", + "resolved": "https://registry.npmjs.org/@azure/msal-browser/-/msal-browser-3.27.0.tgz", + "integrity": "sha512-+b4ZKSD8+vslCtVRVetkegEhOFMLP3rxDWJY212ct+2r6jVg6OSQKc1Qz3kCoXo0FgwaXkb+76TMZfpHp8QtgA==", + "dev": true, + "dependencies": { + "@azure/msal-common": "14.16.0" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@azure/msal-common": { + "version": "14.16.0", + "resolved": "https://registry.npmjs.org/@azure/msal-common/-/msal-common-14.16.0.tgz", + "integrity": "sha512-1KOZj9IpcDSwpNiQNjt0jDYZpQvNZay7QAEi/5DLubay40iGYtLzya/jbjRPLyOTZhEKyL1MzPuw2HqBCjceYA==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@azure/msal-node": { + "version": "2.16.2", + "resolved": "https://registry.npmjs.org/@azure/msal-node/-/msal-node-2.16.2.tgz", + "integrity": "sha512-An7l1hEr0w1HMMh1LU+rtDtqL7/jw74ORlc9Wnh06v7TU/xpG39/Zdr1ZJu3QpjUfKJ+E0/OXMW8DRSWTlh7qQ==", + "dev": true, + "dependencies": { + "@azure/msal-common": "14.16.0", + "jsonwebtoken": "^9.0.0", + "uuid": "^8.3.0" + }, + "engines": { + "node": ">=16" + } + }, "node_modules/@eslint-community/eslint-utils": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", @@ -138,6 +333,102 @@ "integrity": "sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw==", "dev": true }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "dev": true, + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-regex": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", + "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/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==", + "dev": true + }, + "node_modules/@isaacs/cliui/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==", + "dev": true, + "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/@isaacs/cliui/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/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, + "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/@microsoft/tsdoc": { "version": "0.14.2", "resolved": "https://registry.npmjs.org/@microsoft/tsdoc/-/tsdoc-0.14.2.tgz", @@ -191,15 +482,6 @@ "node": ">= 8" } }, - "node_modules/@tootallnate/once": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", - "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", - "dev": true, - "engines": { - "node": ">= 6" - } - }, "node_modules/@types/command-exists": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/@types/command-exists/-/command-exists-1.2.3.tgz", @@ -517,7 +799,333 @@ "debug": "4" }, "engines": { - "node": ">= 14" + "node": ">= 14" + } + }, + "node_modules/@vscode/vsce": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/@vscode/vsce/-/vsce-3.2.1.tgz", + "integrity": "sha512-AY9vBjwExakK1c0cI/3NN2Ey0EgiKLBye/fxl/ue+o4q6RZ7N+xzd1jAD6eI6eBeMVANi617+V2rxIAkDPco2Q==", + "dev": true, + "dependencies": { + "@azure/identity": "^4.1.0", + "@vscode/vsce-sign": "^2.0.0", + "azure-devops-node-api": "^12.5.0", + "chalk": "^2.4.2", + "cheerio": "^1.0.0-rc.9", + "cockatiel": "^3.1.2", + "commander": "^6.2.1", + "form-data": "^4.0.0", + "glob": "^11.0.0", + "hosted-git-info": "^4.0.2", + "jsonc-parser": "^3.2.0", + "leven": "^3.1.0", + "markdown-it": "^14.1.0", + "mime": "^1.3.4", + "minimatch": "^3.0.3", + "parse-semver": "^1.1.1", + "read": "^1.0.7", + "semver": "^7.5.2", + "tmp": "^0.2.3", + "typed-rest-client": "^1.8.4", + "url-join": "^4.0.1", + "xml2js": "^0.5.0", + "yauzl": "^2.3.1", + "yazl": "^2.2.2" + }, + "bin": { + "vsce": "vsce" + }, + "engines": { + "node": ">= 20" + }, + "optionalDependencies": { + "keytar": "^7.7.0" + } + }, + "node_modules/@vscode/vsce-sign": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@vscode/vsce-sign/-/vsce-sign-2.0.5.tgz", + "integrity": "sha512-GfYWrsT/vypTMDMgWDm75iDmAOMe7F71sZECJ+Ws6/xyIfmB3ELVnVN+LwMFAvmXY+e6eWhR2EzNGF/zAhWY3Q==", + "dev": true, + "hasInstallScript": true, + "optionalDependencies": { + "@vscode/vsce-sign-alpine-arm64": "2.0.2", + "@vscode/vsce-sign-alpine-x64": "2.0.2", + "@vscode/vsce-sign-darwin-arm64": "2.0.2", + "@vscode/vsce-sign-darwin-x64": "2.0.2", + "@vscode/vsce-sign-linux-arm": "2.0.2", + "@vscode/vsce-sign-linux-arm64": "2.0.2", + "@vscode/vsce-sign-linux-x64": "2.0.2", + "@vscode/vsce-sign-win32-arm64": "2.0.2", + "@vscode/vsce-sign-win32-x64": "2.0.2" + } + }, + "node_modules/@vscode/vsce-sign-alpine-arm64": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@vscode/vsce-sign-alpine-arm64/-/vsce-sign-alpine-arm64-2.0.2.tgz", + "integrity": "sha512-E80YvqhtZCLUv3YAf9+tIbbqoinWLCO/B3j03yQPbjT3ZIHCliKZlsy1peNc4XNZ5uIb87Jn0HWx/ZbPXviuAQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "alpine" + ] + }, + "node_modules/@vscode/vsce-sign-alpine-x64": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@vscode/vsce-sign-alpine-x64/-/vsce-sign-alpine-x64-2.0.2.tgz", + "integrity": "sha512-n1WC15MSMvTaeJ5KjWCzo0nzjydwxLyoHiMJHu1Ov0VWTZiddasmOQHekA47tFRycnt4FsQrlkSCTdgHppn6bw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "alpine" + ] + }, + "node_modules/@vscode/vsce-sign-darwin-arm64": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@vscode/vsce-sign-darwin-arm64/-/vsce-sign-darwin-arm64-2.0.2.tgz", + "integrity": "sha512-rz8F4pMcxPj8fjKAJIfkUT8ycG9CjIp888VY/6pq6cuI2qEzQ0+b5p3xb74CJnBbSC0p2eRVoe+WgNCAxCLtzQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@vscode/vsce-sign-darwin-x64": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@vscode/vsce-sign-darwin-x64/-/vsce-sign-darwin-x64-2.0.2.tgz", + "integrity": "sha512-MCjPrQ5MY/QVoZ6n0D92jcRb7eYvxAujG/AH2yM6lI0BspvJQxp0o9s5oiAM9r32r9tkLpiy5s2icsbwefAQIw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@vscode/vsce-sign-linux-arm": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@vscode/vsce-sign-linux-arm/-/vsce-sign-linux-arm-2.0.2.tgz", + "integrity": "sha512-Fkb5jpbfhZKVw3xwR6t7WYfwKZktVGNXdg1m08uEx1anO0oUPUkoQRsNm4QniL3hmfw0ijg00YA6TrxCRkPVOQ==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@vscode/vsce-sign-linux-arm64": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@vscode/vsce-sign-linux-arm64/-/vsce-sign-linux-arm64-2.0.2.tgz", + "integrity": "sha512-Ybeu7cA6+/koxszsORXX0OJk9N0GgfHq70Wqi4vv2iJCZvBrOWwcIrxKjvFtwyDgdeQzgPheH5nhLVl5eQy7WA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@vscode/vsce-sign-linux-x64": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@vscode/vsce-sign-linux-x64/-/vsce-sign-linux-x64-2.0.2.tgz", + "integrity": "sha512-NsPPFVtLaTlVJKOiTnO8Cl78LZNWy0Q8iAg+LlBiCDEgC12Gt4WXOSs2pmcIjDYzj2kY4NwdeN1mBTaujYZaPg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@vscode/vsce-sign-win32-arm64": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@vscode/vsce-sign-win32-arm64/-/vsce-sign-win32-arm64-2.0.2.tgz", + "integrity": "sha512-wPs848ymZ3Ny+Y1Qlyi7mcT6VSigG89FWQnp2qRYCyMhdJxOpA4lDwxzlpL8fG6xC8GjQjGDkwbkWUcCobvksQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@vscode/vsce-sign-win32-x64": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@vscode/vsce-sign-win32-x64/-/vsce-sign-win32-x64-2.0.2.tgz", + "integrity": "sha512-pAiRN6qSAhDM5SVOIxgx+2xnoVUePHbRNC7OD2aOR3WltTKxxF25OfpK8h8UQ7A0BuRkSgREbB59DBlFk4iAeg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@vscode/vsce/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@vscode/vsce/node_modules/azure-devops-node-api": { + "version": "12.5.0", + "resolved": "https://registry.npmjs.org/azure-devops-node-api/-/azure-devops-node-api-12.5.0.tgz", + "integrity": "sha512-R5eFskGvOm3U/GzeAuxRkUsAl0hrAwGgWn6zAd2KrZmrEhWZVqLew4OOupbQlXUuojUzpGtq62SmdhJ06N88og==", + "dev": true, + "dependencies": { + "tunnel": "0.0.6", + "typed-rest-client": "^1.8.4" + } + }, + "node_modules/@vscode/vsce/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@vscode/vsce/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@vscode/vsce/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@vscode/vsce/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "node_modules/@vscode/vsce/node_modules/commander": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.1.tgz", + "integrity": "sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/@vscode/vsce/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@vscode/vsce/node_modules/glob": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-11.0.0.tgz", + "integrity": "sha512-9UiX/Bl6J2yaBbxKoEBRm4Cipxgok8kQYcOPEhScPwebu2I0HoQOuYdIO6S3hLuWoZgpDpwQZMzTFxgpkyT76g==", + "dev": true, + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^4.0.1", + "minimatch": "^10.0.0", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^2.0.0" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@vscode/vsce/node_modules/glob/node_modules/minimatch": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.0.1.tgz", + "integrity": "sha512-ethXTt3SGGR+95gudmqJ1eNhRO7eGEGIgYA9vnPatK4/etz2MEVDno5GMCibdMTuBMyElzIlgxMna3K94XDIDQ==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@vscode/vsce/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/@vscode/vsce/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@vscode/vsce/node_modules/xml2js": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.5.0.tgz", + "integrity": "sha512-drPFnkQJik/O+uPKpqSgr22mpuFHqKdbS835iAQrUC73L2F5WkboIRd63ai/2Yg6I1jzifPFKH2NTK+cfglkIA==", + "dev": true, + "dependencies": { + "sax": ">=0.6.0", + "xmlbuilder": "~11.0.0" + }, + "engines": { + "node": ">=4.0.0" } }, "node_modules/acorn": { @@ -541,18 +1149,6 @@ "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, - "node_modules/agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", - "dev": true, - "dependencies": { - "debug": "4" - }, - "engines": { - "node": ">= 6.0.0" - } - }, "node_modules/ajv": { "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", @@ -630,15 +1226,11 @@ "node": ">=8" } }, - "node_modules/azure-devops-node-api": { - "version": "11.2.0", - "resolved": "https://registry.npmjs.org/azure-devops-node-api/-/azure-devops-node-api-11.2.0.tgz", - "integrity": "sha512-XdiGPhrpaT5J8wdERRKs5g8E0Zy1pvOYTli7z9E8nmOn3YGp4FhtjhrOyFmX/8veWCwdI69mCHKJw6l+4J/bHA==", - "dev": true, - "dependencies": { - "tunnel": "0.0.6", - "typed-rest-client": "^1.8.4" - } + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "dev": true }, "node_modules/balanced-match": { "version": "1.0.2", @@ -665,28 +1257,6 @@ } ] }, - "node_modules/big-integer": { - "version": "1.6.52", - "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.52.tgz", - "integrity": "sha512-QxD8cf2eVqJOOz63z6JIN9BzvVs/dlySa5HGSBH5xtR8dPteIRQnBxxKqkNTiT6jbDTF6jAfrd4oMcND9RGbQg==", - "dev": true, - "engines": { - "node": ">=0.6" - } - }, - "node_modules/binary": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/binary/-/binary-0.3.0.tgz", - "integrity": "sha512-D4H1y5KYwpJgK8wk1Cue5LLPgmwHKYSChkbspQg5JtVuR5ulGckxfR62H3AE9UDkdMC8yyXlqYihuz3Aqg2XZg==", - "dev": true, - "dependencies": { - "buffers": "~0.1.1", - "chainsaw": "~0.1.0" - }, - "engines": { - "node": "*" - } - }, "node_modules/binary-extensions": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", @@ -701,6 +1271,7 @@ "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", "dev": true, + "optional": true, "dependencies": { "buffer": "^5.5.0", "inherits": "^2.0.4", @@ -712,6 +1283,7 @@ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", "dev": true, + "optional": true, "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -721,12 +1293,6 @@ "node": ">= 6" } }, - "node_modules/bluebird": { - "version": "3.4.7", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.4.7.tgz", - "integrity": "sha512-iD3898SR7sWVRHbiQv+sHUtHnMvC1o3nW5rAcqnq3uOn07DSAppZYUkIGslDz6gXC7HfunPe7YVBgoEJASPcHA==", - "dev": true - }, "node_modules/boolbase": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", @@ -780,6 +1346,7 @@ "url": "https://feross.org/support" } ], + "optional": true, "dependencies": { "base64-js": "^1.3.1", "ieee754": "^1.1.13" @@ -794,23 +1361,11 @@ "node": "*" } }, - "node_modules/buffer-indexof-polyfill": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/buffer-indexof-polyfill/-/buffer-indexof-polyfill-1.0.2.tgz", - "integrity": "sha512-I7wzHwA3t1/lwXQh+A5PbNvJxgfo5r3xulgpYDB5zckTu/Z9oUK9biouBKQUjEqzaz3HnAT6TYoovmE+GqSf7A==", - "dev": true, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/buffers": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/buffers/-/buffers-0.1.1.tgz", - "integrity": "sha512-9q/rDEGSb/Qsvv2qvzIzdluL5k7AaJOTrw23z9reQthrbF7is4CtlT0DXyO1oei2DCp4uojjzQ7igaSHp1kAEQ==", - "dev": true, - "engines": { - "node": ">=0.2.0" - } + "node_modules/buffer-equal-constant-time": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", + "integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==", + "dev": true }, "node_modules/call-bind": { "version": "1.0.5", @@ -847,18 +1402,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/chainsaw": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/chainsaw/-/chainsaw-0.1.0.tgz", - "integrity": "sha512-75kWfWt6MEKNC8xYXIdRpDehRYY/tNSgwKaJq+dbbDcxORuVrrQ+SEHoWsniVn9XPYfP4gmdWIeDk/4YNp1rNQ==", - "dev": true, - "dependencies": { - "traverse": ">=0.3.0 <0.4" - }, - "engines": { - "node": "*" - } - }, "node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", @@ -956,7 +1499,8 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", - "dev": true + "dev": true, + "optional": true }, "node_modules/cli-cursor": { "version": "4.0.0", @@ -998,6 +1542,15 @@ "wrap-ansi": "^7.0.0" } }, + "node_modules/cockatiel": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/cockatiel/-/cockatiel-3.2.1.tgz", + "integrity": "sha512-gfrHV6ZPkquExvMh9IOkKsBzNDk6sDuZ6DdBGUBkvFnTCqCxzpuq48RySgP0AnaqQkw2zynOFj9yly6T1Q2G5Q==", + "dev": true, + "engines": { + "node": ">=16" + } + }, "node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", @@ -1016,10 +1569,17 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, - "node_modules/command-exists": { - "version": "1.2.9", - "resolved": "https://registry.npmjs.org/command-exists/-/command-exists-1.2.9.tgz", - "integrity": "sha512-LTQ/SGc+s0Xc0Fu5WaKnR0YiygZkm9eKFvyS+fRsU7/ZWFF8ykFM6Pc9aCVf1+xasOOZpO3BAVgVrKvsqKHV7w==" + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dev": true, + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } }, "node_modules/commander": { "version": "2.20.3", @@ -1158,6 +1718,7 @@ "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", "dev": true, + "optional": true, "dependencies": { "mimic-response": "^3.1.0" }, @@ -1173,6 +1734,7 @@ "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", "dev": true, + "optional": true, "engines": { "node": ">=4.0.0" } @@ -1197,11 +1759,30 @@ "node": ">= 0.4" } }, + "node_modules/define-lazy-prop": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", + "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, "node_modules/detect-libc": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.2.tgz", "integrity": "sha512-UX6sGumvvqSaXgdKGUsgZWqcUyIXZ/vZTrlRT/iobiKhGL0zL4d3osHj3uqllWJK+i+sixDS/3COVEOFbupFyw==", "dev": true, + "optional": true, "engines": { "node": ">=8" } @@ -1294,15 +1875,6 @@ "url": "https://github.com/fb55/domutils?sponsor=1" } }, - "node_modules/duplexer2": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", - "integrity": "sha512-asLFVfWWtJ90ZyOUHMqk7/S2w2guQKxUI2itj3d92ADHhxUSbCMGi1f1cBcJ7xM1To+pE/Khbwo1yuNbMEPKeA==", - "dev": true, - "dependencies": { - "readable-stream": "^2.0.2" - } - }, "node_modules/eastasianwidth": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", @@ -1310,6 +1882,15 @@ "dev": true, "license": "MIT" }, + "node_modules/ecdsa-sig-formatter": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", + "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", + "dev": true, + "dependencies": { + "safe-buffer": "^5.0.1" + } + }, "node_modules/editorconfig": { "version": "0.15.3", "resolved": "https://registry.npmjs.org/editorconfig/-/editorconfig-0.15.3.tgz", @@ -1345,6 +1926,7 @@ "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", "dev": true, + "optional": true, "dependencies": { "once": "^1.4.0" } @@ -1534,11 +2116,21 @@ "node": ">=0.10.0" } }, + "node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "dev": true, + "engines": { + "node": ">=0.8.x" + } + }, "node_modules/expand-template": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==", "dev": true, + "optional": true, "engines": { "node": ">=6" } @@ -1676,11 +2268,54 @@ "integrity": "sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==", "dev": true }, + "node_modules/foreground-child": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.0.tgz", + "integrity": "sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.0", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/foreground-child/node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/form-data": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.1.tgz", + "integrity": "sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw==", + "dev": true, + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/fs-constants": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", - "dev": true + "dev": true, + "optional": true }, "node_modules/fs-extra": { "version": "10.0.1", @@ -1716,45 +2351,6 @@ "node": "^8.16.0 || ^10.6.0 || >=11.0.0" } }, - "node_modules/fstream": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.12.tgz", - "integrity": "sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.1.2", - "inherits": "~2.0.0", - "mkdirp": ">=0.5 0", - "rimraf": "2" - }, - "engines": { - "node": ">=0.6" - } - }, - "node_modules/fstream/node_modules/mkdirp": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", - "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", - "dev": true, - "dependencies": { - "minimist": "^1.2.6" - }, - "bin": { - "mkdirp": "bin/cmd.js" - } - }, - "node_modules/fstream/node_modules/rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dev": true, - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - } - }, "node_modules/function-bind": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", @@ -1792,7 +2388,8 @@ "version": "0.0.0", "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", "integrity": "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==", - "dev": true + "dev": true, + "optional": true }, "node_modules/glob": { "version": "7.2.3", @@ -2009,33 +2606,6 @@ "entities": "^4.4.0" } }, - "node_modules/http-proxy-agent": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", - "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", - "dev": true, - "dependencies": { - "@tootallnate/once": "1", - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/https-proxy-agent": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", - "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", - "dev": true, - "dependencies": { - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, "node_modules/ieee754": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", @@ -2116,7 +2686,8 @@ "version": "1.3.8", "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", - "dev": true + "dev": true, + "optional": true }, "node_modules/is-binary-path": { "version": "2.1.0", @@ -2142,6 +2713,21 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "dev": true, + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", @@ -2224,6 +2810,18 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "dev": true, + "dependencies": { + "is-docker": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", @@ -2236,6 +2834,21 @@ "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", "dev": true }, + "node_modules/jackspeak": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-4.0.2.tgz", + "integrity": "sha512-bZsjR/iRjl1Nk1UkjGpAzLNfQtzuijhn2g+pbZb98HQ1Gk8vM9hfbxeMBP+M2/UUdwj0RqGG3mlvk2MsAqwvEw==", + "dev": true, + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/jju": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/jju/-/jju-1.4.0.tgz", @@ -2272,6 +2885,12 @@ "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", "dev": true }, + "node_modules/jsonc-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.3.1.tgz", + "integrity": "sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==", + "dev": true + }, "node_modules/jsonfile": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", @@ -2284,6 +2903,49 @@ "graceful-fs": "^4.1.6" } }, + "node_modules/jsonwebtoken": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.2.tgz", + "integrity": "sha512-PRp66vJ865SSqOlgqS8hujT5U4AOgMfhrwYIuIhfKaoSCZcirrmASQr8CX7cUg+RMih+hgznrjp99o+W4pJLHQ==", + "dev": true, + "dependencies": { + "jws": "^3.2.2", + "lodash.includes": "^4.3.0", + "lodash.isboolean": "^3.0.3", + "lodash.isinteger": "^4.0.4", + "lodash.isnumber": "^3.0.3", + "lodash.isplainobject": "^4.0.6", + "lodash.isstring": "^4.0.1", + "lodash.once": "^4.0.0", + "ms": "^2.1.1", + "semver": "^7.5.4" + }, + "engines": { + "node": ">=12", + "npm": ">=6" + } + }, + "node_modules/jsonwebtoken/node_modules/jwa": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz", + "integrity": "sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==", + "dev": true, + "dependencies": { + "buffer-equal-constant-time": "1.0.1", + "ecdsa-sig-formatter": "1.0.11", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/jsonwebtoken/node_modules/jws": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz", + "integrity": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==", + "dev": true, + "dependencies": { + "jwa": "^1.4.1", + "safe-buffer": "^5.0.1" + } + }, "node_modules/jszip": { "version": "3.10.1", "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.10.1.tgz", @@ -2296,12 +2958,34 @@ "setimmediate": "^1.0.5" } }, + "node_modules/jwa": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/jwa/-/jwa-2.0.0.tgz", + "integrity": "sha512-jrZ2Qx916EA+fq9cEAeCROWPTfCwi1IVHqT2tapuqLEVVDKFDENFw1oL+MwrTvH6msKxsd1YTDVw6uKEcsrLEA==", + "dev": true, + "dependencies": { + "buffer-equal-constant-time": "1.0.1", + "ecdsa-sig-formatter": "1.0.11", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/jws": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jws/-/jws-4.0.0.tgz", + "integrity": "sha512-KDncfTmOZoOMTFG4mBlG0qUIOlc03fmzH+ru6RgYVZhPkyiy/92Owlt/8UEN+a4TXR1FQetfIpJE8ApdvdVxTg==", + "dev": true, + "dependencies": { + "jwa": "^2.0.0", + "safe-buffer": "^5.0.1" + } + }, "node_modules/keytar": { "version": "7.9.0", "resolved": "https://registry.npmjs.org/keytar/-/keytar-7.9.0.tgz", "integrity": "sha512-VPD8mtVtm5JNtA2AErl6Chp06JBfy7diFQ7TQQhdpWOl6MrCRB+eRbvAZUsbGQS9kiMq0coJsy0W0vHpDCkWsQ==", "dev": true, "hasInstallScript": true, + "optional": true, "dependencies": { "node-addon-api": "^4.3.0", "prebuild-install": "^7.0.1" @@ -2348,20 +3032,14 @@ } }, "node_modules/linkify-it": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-3.0.3.tgz", - "integrity": "sha512-ynTsyrFSdE5oZ/O9GEf00kPngmOfVwazR5GKDq6EYfhlpFug3J2zybX56a2PRRpc9P+FuSoGNAwjlbDs9jJBPQ==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-5.0.0.tgz", + "integrity": "sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==", "dev": true, "dependencies": { - "uc.micro": "^1.0.1" + "uc.micro": "^2.0.0" } }, - "node_modules/listenercount": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/listenercount/-/listenercount-1.0.1.tgz", - "integrity": "sha512-3mk/Zag0+IJxeDrxSgaDPy4zZ3w05PRZeJNnlWhzFz5OkX49J4krc+A8X2d2M69vGMBEX0uyl8M+W+8gH+kBqQ==", - "dev": true - }, "node_modules/locate-path": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", @@ -2377,12 +3055,54 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/lodash.includes": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz", + "integrity": "sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==", + "dev": true + }, + "node_modules/lodash.isboolean": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", + "integrity": "sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==", + "dev": true + }, + "node_modules/lodash.isinteger": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz", + "integrity": "sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==", + "dev": true + }, + "node_modules/lodash.isnumber": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz", + "integrity": "sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==", + "dev": true + }, + "node_modules/lodash.isplainobject": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", + "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==", + "dev": true + }, + "node_modules/lodash.isstring": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", + "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==", + "dev": true + }, "node_modules/lodash.merge": { "version": "4.6.2", "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", "dev": true }, + "node_modules/lodash.once": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", + "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==", + "dev": true + }, "node_modules/log-symbols": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", @@ -2403,40 +3123,33 @@ "version": "4.1.5", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", + "dev": true, "dependencies": { "pseudomap": "^1.0.2", "yallist": "^2.1.2" } }, "node_modules/markdown-it": { - "version": "12.3.2", - "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-12.3.2.tgz", - "integrity": "sha512-TchMembfxfNVpHkbtriWltGWc+m3xszaRD0CZup7GFFhzIgQqxIfn3eGj1yZpfuflzPvfkt611B2Q/Bsk1YnGg==", + "version": "14.1.0", + "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-14.1.0.tgz", + "integrity": "sha512-a54IwgWPaeBCAAsv13YgmALOF1elABB08FxO9i+r4VFk5Vl4pKokRPeX8u5TCgSsPi6ec1otfLjdOpVcgbpshg==", "dev": true, "dependencies": { "argparse": "^2.0.1", - "entities": "~2.1.0", - "linkify-it": "^3.0.1", - "mdurl": "^1.0.1", - "uc.micro": "^1.0.5" + "entities": "^4.4.0", + "linkify-it": "^5.0.0", + "mdurl": "^2.0.0", + "punycode.js": "^2.3.1", + "uc.micro": "^2.1.0" }, "bin": { - "markdown-it": "bin/markdown-it.js" - } - }, - "node_modules/markdown-it/node_modules/entities": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.1.0.tgz", - "integrity": "sha512-hCx1oky9PFrJ611mf0ifBLBRW8lUUVRlFolb5gWRfIELabBlbp9xZvrqZLZAs+NxFnbfQoeGd8wDkygjg7U85w==", - "dev": true, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" + "markdown-it": "bin/markdown-it.mjs" } }, "node_modules/mdurl": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz", - "integrity": "sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-2.0.0.tgz", + "integrity": "sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==", "dev": true }, "node_modules/merge2": { @@ -2473,6 +3186,27 @@ "node": ">=4" } }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dev": true, + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, "node_modules/mimic-fn": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", @@ -2488,6 +3222,7 @@ "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", "dev": true, + "optional": true, "engines": { "node": ">=10" }, @@ -2512,10 +3247,20 @@ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", "dev": true, + "optional": true, "funding": { "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "dev": true, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, "node_modules/mkdirp": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", @@ -2532,7 +3277,8 @@ "version": "0.5.3", "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==", - "dev": true + "dev": true, + "optional": true }, "node_modules/mocha": { "version": "9.2.2", @@ -2693,7 +3439,8 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-1.0.2.tgz", "integrity": "sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==", - "dev": true + "dev": true, + "optional": true }, "node_modules/natural-compare": { "version": "1.4.0", @@ -2706,6 +3453,7 @@ "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.51.0.tgz", "integrity": "sha512-SQkEP4hmNWjlniS5zdnfIXTk1x7Ome85RDzHlTbBtzE97Gfwz/Ipw4v/Ryk20DWIy3yCNVLVlGKApCnmvYoJbA==", "dev": true, + "optional": true, "dependencies": { "semver": "^7.3.5" }, @@ -2717,7 +3465,8 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-4.3.0.tgz", "integrity": "sha512-73sE9+3UaLYYFmDsFZnqCInzPyh3MqIwZO9cw58yIqAZhONrrabrYyYe3TuIqtIiOuTXVhsGau8hcrhhwSsDIQ==", - "dev": true + "dev": true, + "optional": true }, "node_modules/noms": { "version": "0.0.0", @@ -2808,6 +3557,23 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/open": { + "version": "8.4.2", + "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz", + "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==", + "dev": true, + "dependencies": { + "define-lazy-prop": "^2.0.0", + "is-docker": "^2.1.1", + "is-wsl": "^2.2.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/optionator": { "version": "0.9.3", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", @@ -2976,6 +3742,12 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/package-json-from-dist": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", + "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", + "dev": true + }, "node_modules/pako": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", @@ -3070,6 +3842,31 @@ "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", "dev": true }, + "node_modules/path-scurry": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.0.tgz", + "integrity": "sha512-ypGJsmGtdXUOeM5u93TyeIEfEhM6s+ljAhrk5vAvSx8uyY/02OvrZnA0YNGUrPXfpJMgI1ODd3nwz8Npx4O4cg==", + "dev": true, + "dependencies": { + "lru-cache": "^11.0.0", + "minipass": "^7.1.2" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/path-scurry/node_modules/lru-cache": { + "version": "11.0.2", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.0.2.tgz", + "integrity": "sha512-123qHRfJBmo2jXDbo/a5YOQrJoHF/GNQTLzQ5+IdK5pWpceK17yRc6ozlWd25FxvGKQbIUs91fDFkXmDHTKcyA==", + "dev": true, + "engines": { + "node": "20 || >=22" + } + }, "node_modules/path-type": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", @@ -3102,6 +3899,7 @@ "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.1.tgz", "integrity": "sha512-jAXscXWMcCK8GgCoHOfIr0ODh5ai8mj63L2nWrjuAgXE6tDyYGnx4/8o/rCgU+B4JSyZBKbeZqzhtwtC3ovxjw==", "dev": true, + "optional": true, "dependencies": { "detect-libc": "^2.0.0", "expand-template": "^2.0.3", @@ -3141,13 +3939,15 @@ "node_modules/pseudomap": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", - "integrity": "sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==" + "integrity": "sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==", + "dev": true }, "node_modules/pump": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", "dev": true, + "optional": true, "dependencies": { "end-of-stream": "^1.1.0", "once": "^1.3.1" @@ -3162,6 +3962,15 @@ "node": ">=6" } }, + "node_modules/punycode.js": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode.js/-/punycode.js-2.3.1.tgz", + "integrity": "sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, "node_modules/qs": { "version": "6.11.2", "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.2.tgz", @@ -3211,6 +4020,7 @@ "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", "dev": true, + "optional": true, "dependencies": { "deep-extend": "^0.6.0", "ini": "~1.3.0", @@ -3226,6 +4036,7 @@ "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", "dev": true, + "optional": true, "engines": { "node": ">=0.10.0" } @@ -3484,7 +4295,8 @@ "type": "consulting", "url": "https://feross.org/support" } - ] + ], + "optional": true }, "node_modules/simple-get": { "version": "4.0.1", @@ -3505,6 +4317,7 @@ "url": "https://feross.org/support" } ], + "optional": true, "dependencies": { "decompress-response": "^6.0.0", "once": "^1.3.1", @@ -3588,6 +4401,16 @@ "node": ">= 6" } }, + "node_modules/stoppable": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/stoppable/-/stoppable-1.1.0.tgz", + "integrity": "sha512-KXDYZ9dszj6bzvnEMRYvxgeTHU74QBFL54XKtP3nyMuJ81CFYtABZ3bAzL2EdFUaEwJOBOgENyFj3R7oTzDyyw==", + "dev": true, + "engines": { + "node": ">=4", + "npm": ">=6" + } + }, "node_modules/string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", @@ -3611,6 +4434,21 @@ "node": ">=8" } }, + "node_modules/string-width-cjs": { + "name": "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==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/strip-ansi": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", @@ -3623,6 +4461,19 @@ "node": ">=8" } }, + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/strip-json-comments": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", @@ -3652,6 +4503,7 @@ "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz", "integrity": "sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==", "dev": true, + "optional": true, "dependencies": { "chownr": "^1.1.1", "mkdirp-classic": "^0.5.2", @@ -3664,6 +4516,7 @@ "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", "dev": true, + "optional": true, "dependencies": { "bl": "^4.0.3", "end-of-stream": "^1.4.1", @@ -3680,6 +4533,7 @@ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", "dev": true, + "optional": true, "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -3706,15 +4560,12 @@ } }, "node_modules/tmp": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", - "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==", + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.3.tgz", + "integrity": "sha512-nZD7m9iCPC5g0pYmcaxogYKggSfLsdxl8of3Q/oIbqCqLLIO9IAF0GWjX1z9NZRHPiXv8Wex4yDCaZsgEw0Y8w==", "dev": true, - "dependencies": { - "rimraf": "^3.0.0" - }, "engines": { - "node": ">=8.17.0" + "node": ">=14.14" } }, "node_modules/to-regex-range": { @@ -3729,15 +4580,6 @@ "node": ">=8.0" } }, - "node_modules/traverse": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.3.9.tgz", - "integrity": "sha512-iawgk0hLP3SxGKDfnDJf8wTz4p2qImnyihM5Hh/sGvQ3K37dPi/w8sRhdNIxYA1TwFwc5mDhIJq+O0RsvXBKdQ==", - "dev": true, - "engines": { - "node": "*" - } - }, "node_modules/ts-api-utils": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.0.3.tgz", @@ -3750,6 +4592,12 @@ "typescript": ">=4.2.0" } }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "dev": true + }, "node_modules/tunnel": { "version": "0.0.6", "resolved": "https://registry.npmjs.org/tunnel/-/tunnel-0.0.6.tgz", @@ -3764,6 +4612,7 @@ "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", "dev": true, + "optional": true, "dependencies": { "safe-buffer": "^5.0.1" }, @@ -3839,9 +4688,9 @@ } }, "node_modules/uc.micro": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.6.tgz", - "integrity": "sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-2.1.0.tgz", + "integrity": "sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==", "dev": true }, "node_modules/underscore": { @@ -3868,24 +4717,6 @@ "node": ">=8" } }, - "node_modules/unzipper": { - "version": "0.10.14", - "resolved": "https://registry.npmjs.org/unzipper/-/unzipper-0.10.14.tgz", - "integrity": "sha512-ti4wZj+0bQTiX2KmKWuwj7lhV+2n//uXEotUmGuQqrbVZSEGFMbI68+c6JCQ8aAmUWYvtHEz2A8K6wXvueR/6g==", - "dev": true, - "dependencies": { - "big-integer": "^1.6.17", - "binary": "~0.3.0", - "bluebird": "~3.4.1", - "buffer-indexof-polyfill": "~1.0.0", - "duplexer2": "~0.1.4", - "fstream": "^1.0.12", - "graceful-fs": "^4.2.2", - "listenercount": "~1.0.1", - "readable-stream": "~2.3.6", - "setimmediate": "~1.0.4" - } - }, "node_modules/uri-js": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", @@ -3907,128 +4738,13 @@ "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", "dev": true }, - "node_modules/vsce": { - "version": "2.15.0", - "resolved": "https://registry.npmjs.org/vsce/-/vsce-2.15.0.tgz", - "integrity": "sha512-P8E9LAZvBCQnoGoizw65JfGvyMqNGlHdlUXD1VAuxtvYAaHBKLBdKPnpy60XKVDAkQCfmMu53g+gq9FM+ydepw==", - "deprecated": "vsce has been renamed to @vscode/vsce. Install using @vscode/vsce instead.", - "dev": true, - "dependencies": { - "azure-devops-node-api": "^11.0.1", - "chalk": "^2.4.2", - "cheerio": "^1.0.0-rc.9", - "commander": "^6.1.0", - "glob": "^7.0.6", - "hosted-git-info": "^4.0.2", - "keytar": "^7.7.0", - "leven": "^3.1.0", - "markdown-it": "^12.3.2", - "mime": "^1.3.4", - "minimatch": "^3.0.3", - "parse-semver": "^1.1.1", - "read": "^1.0.7", - "semver": "^5.1.0", - "tmp": "^0.2.1", - "typed-rest-client": "^1.8.4", - "url-join": "^4.0.1", - "xml2js": "^0.4.23", - "yauzl": "^2.3.1", - "yazl": "^2.2.2" - }, - "bin": { - "vsce": "vsce" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/vsce/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/vsce/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/vsce/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/vsce/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "node_modules/vsce/node_modules/commander": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.1.tgz", - "integrity": "sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==", - "dev": true, - "engines": { - "node": ">= 6" - } - }, - "node_modules/vsce/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/vsce/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/vsce/node_modules/semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", "dev": true, "bin": { - "semver": "bin/semver" - } - }, - "node_modules/vsce/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" + "uuid": "dist/bin/uuid" } }, "node_modules/vscode-jsonrpc": { @@ -4085,22 +4801,6 @@ "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.17.5.tgz", "integrity": "sha512-Ld1VelNuX9pdF39h2Hgaeb5hEZM2Z3jUrrMgWQAu82jMtZp7p3vJT3BzToKtZI7NgQssZje5o0zryOrhQvzQAg==" }, - "node_modules/vscode-test": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/vscode-test/-/vscode-test-1.6.1.tgz", - "integrity": "sha512-086q88T2ca1k95mUzffvbzb7esqQNvJgiwY4h29ukPhFo8u+vXOOmelUoU5EQUHs3Of8+JuQ3oGdbVCqaxuTXA==", - "deprecated": "This package has been renamed to @vscode/test-electron, please update to the new name", - "dev": true, - "dependencies": { - "http-proxy-agent": "^4.0.1", - "https-proxy-agent": "^5.0.0", - "rimraf": "^3.0.2", - "unzipper": "^0.10.11" - }, - "engines": { - "node": ">=8.9.3" - } - }, "node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", @@ -4139,25 +4839,30 @@ "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "dev": true - }, - "node_modules/xml2js": { - "version": "0.4.23", - "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.23.tgz", - "integrity": "sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug==", + "node_modules/wrap-ansi-cjs": { + "name": "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==", "dev": true, "dependencies": { - "sax": ">=0.6.0", - "xmlbuilder": "~11.0.0" + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" }, "engines": { - "node": ">=4.0.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true + }, "node_modules/xmlbuilder": { "version": "11.0.1", "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", @@ -4188,7 +4893,8 @@ "node_modules/yallist": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", - "integrity": "sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==" + "integrity": "sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==", + "dev": true }, "node_modules/yargs": { "version": "16.2.0", diff --git a/external-crates/move/crates/move-analyzer/editors/code/package.json b/external-crates/move/crates/move-analyzer/editors/code/package.json index 7528263217d..7d23d4246b1 100644 --- a/external-crates/move/crates/move-analyzer/editors/code/package.json +++ b/external-crates/move/crates/move-analyzer/editors/code/package.json @@ -152,8 +152,6 @@ "damirka.move-syntax" ], "dependencies": { - "command-exists": "^1.2.9", - "lru-cache": "^4.1.3", "semver": "^7.6.2", "vscode-languageclient": "^9.0.1" }, @@ -176,8 +174,7 @@ "mocha": "^9.1.1", "typescript": "^4.9.5", "typescript-formatter": "^7.2.2", - "vsce": "^2.5.1", - "vscode-test": "^1.6.1" + "@vscode/vsce": "^3.2.1" }, "__metadata": { "id": "227cd049-67e6-468e-bc8f-b60e02b79e36", From aea6d7f48679f31814b1905e72c8f1ca97d5f917 Mon Sep 17 00:00:00 2001 From: Lucas Tortora <85233773+lucas-tortora@users.noreply.github.com> Date: Thu, 5 Dec 2024 11:05:58 -0300 Subject: [PATCH 11/97] fix(devx): Unified all documentation links to docs.iota.org (#4013) * fix(devx): use docs.iota.org for all Move doc links, and fix all absolute links * fix(devx): use https * Update docs/README.md * dprint --- crates/iota-indexer/README.md | 2 +- crates/iota-json-rpc-api/src/indexer.rs | 4 ++-- crates/iota-json-rpc-api/src/transaction_builder.rs | 2 +- crates/iota-open-rpc/spec/openrpc.json | 6 +++--- crates/iota-sdk/README.md | 4 ++-- crates/iota-storage/src/object_store/http/mod.rs | 2 +- docs/README.md | 6 +++--- docs/content/references/contribute/code-of-conduct.mdx | 1 - .../references/contribute/contribute-to-iota-repos.mdx | 3 +-- docs/content/references/contribute/style-guide.mdx | 3 +-- docs/content/sidebars/references.js | 1 + scripts/slipstream/config_slipstream.json | 10 +++++----- sdk/typescript/src/client/types/params.ts | 6 +++--- 13 files changed, 24 insertions(+), 26 deletions(-) diff --git a/crates/iota-indexer/README.md b/crates/iota-indexer/README.md index 929c89f1f41..b7126faad67 100644 --- a/crates/iota-indexer/README.md +++ b/crates/iota-indexer/README.md @@ -66,7 +66,7 @@ To run the indexer as a standalone service with an existing fullnode, follow the cargo run --bin iota-indexer -- --db-url "postgres://postgres:postgrespw@localhost/iota_indexer" --rpc-client-url "https://fullnode.devnet.iota.io:443" --fullnode-sync-worker --reset-db ``` -- to run indexer as a reader which exposes a JSON RPC service with following [APIs](https://docs.iota.io/iota-api-ref). +- to run indexer as a reader which exposes a JSON RPC service with following [APIs](https://docs.iota.org/iota-api-ref). ``` cargo run --bin iota-indexer -- --db-url "postgres://postgres:postgrespw@localhost/iota_indexer" --rpc-client-url "https://fullnode.devnet.iota.io:443" --rpc-server-worker diff --git a/crates/iota-json-rpc-api/src/indexer.rs b/crates/iota-json-rpc-api/src/indexer.rs index 25bfaf5eb59..b77ab45d2d6 100644 --- a/crates/iota-json-rpc-api/src/indexer.rs +++ b/crates/iota-json-rpc-api/src/indexer.rs @@ -63,7 +63,7 @@ pub trait IndexerApi { #[method(name = "queryEvents")] async fn query_events( &self, - /// The event query criteria. See [Event filter](https://docs.iota.io/build/event_api#event-filters) documentation for examples. + /// The event query criteria. See [Event filter](https://docs.iota.org/developer/iota-101/using-events#applying-event-filters) documentation for examples. query: EventFilter, /// optional paging cursor cursor: Option<EventID>, @@ -78,7 +78,7 @@ pub trait IndexerApi { #[subscription(name = "subscribeEvent", item = IotaEvent)] fn subscribe_event( &self, - /// The filter criteria of the event stream. See [Event filter](https://docs.iota.io/build/event_api#event-filters) documentation for examples. + /// The filter criteria of the event stream. See [Event filter](https://docs.iota.org/developer/iota-101/using-events#applying-event-filters) documentation for examples. filter: EventFilter, ) -> SubscriptionResult; diff --git a/crates/iota-json-rpc-api/src/transaction_builder.rs b/crates/iota-json-rpc-api/src/transaction_builder.rs index 066941ac720..eb2019ae1d9 100644 --- a/crates/iota-json-rpc-api/src/transaction_builder.rs +++ b/crates/iota-json-rpc-api/src/transaction_builder.rs @@ -138,7 +138,7 @@ pub trait TransactionBuilder { function: String, /// the type arguments of the Move function type_arguments: Vec<IotaTypeTag>, - /// the arguments to be passed into the Move function, in [IotaJson](https://docs.iota.io/build/iota-json) format + /// the arguments to be passed into the Move function, in [IotaJson](https://docs.iota.org/references/iota-api) format arguments: Vec<IotaJsonValue>, /// gas object to be used in this transaction, node will pick one from the signer's possession if not provided gas: Option<ObjectID>, diff --git a/crates/iota-open-rpc/spec/openrpc.json b/crates/iota-open-rpc/spec/openrpc.json index 89343df8e73..dfcd4ecccc2 100644 --- a/crates/iota-open-rpc/spec/openrpc.json +++ b/crates/iota-open-rpc/spec/openrpc.json @@ -4461,7 +4461,7 @@ "params": [ { "name": "query", - "description": "The event query criteria. See [Event filter](https://docs.iota.io/build/event_api#event-filters) documentation for examples.", + "description": "The event query criteria. See [Event filter](https://docs.iota.org/developer/iota-101/using-events#applying-event-filters) documentation for examples.", "required": true, "schema": { "$ref": "#/components/schemas/EventFilter" @@ -4705,7 +4705,7 @@ "params": [ { "name": "filter", - "description": "The filter criteria of the event stream. See [Event filter](https://docs.iota.io/build/event_api#event-filters) documentation for examples.", + "description": "The filter criteria of the event stream. See [Event filter](https://docs.iota.org/developer/iota-101/using-events#applying-event-filters) documentation for examples.", "required": true, "schema": { "$ref": "#/components/schemas/EventFilter" @@ -4921,7 +4921,7 @@ }, { "name": "arguments", - "description": "the arguments to be passed into the Move function, in [IotaJson](https://docs.iota.io/build/iota-json) format", + "description": "the arguments to be passed into the Move function, in [IotaJson](https://docs.iota.org/references/iota-api) format", "required": true, "schema": { "type": "array", diff --git a/crates/iota-sdk/README.md b/crates/iota-sdk/README.md index 843b15fe901..9c98c127ceb 100644 --- a/crates/iota-sdk/README.md +++ b/crates/iota-sdk/README.md @@ -59,7 +59,7 @@ Unless otherwise specified, most of these examples assume `Rust` and `cargo` are In the root folder of the `iota` repository (or in the `iota-sdk` crate folder), you can individually run examples using the command `cargo run --example filename` (without `.rs` extension). For example: -- `cargo run --example iota_client` -- this one requires a local Iota network running (see [#Connecting to Iota Network](https://docs.iota.org/developer/getting-started/local-network#start-a-local-network). If you do not have a local Iota network running, please skip this example. +- `cargo run --example iota_client` -- this one requires a local Iota network running (see [#Connecting to Iota Network](https://docs.iota.org/developer/getting-started/local-network#start-the-local-network). If you do not have a local Iota network running, please skip this example. - `cargo run --example coin_read_api` - `cargo run --example event_api` -- note that this will subscribe to a stream and thus the program will not terminate unless forced (Ctrl+C) - `cargo run --example governance_api` @@ -80,7 +80,7 @@ The `IotaClientBuilder` struct provides a connection to the JSON-RPC server that For all available servers, see [here](https://docs.iota.org/developer/network-overview). -For running a local IOTA network, please follow [this guide](https://docs.iota.org/developer/getting-started/install-iota) for installing IOTA and [this guide](https://docs.iota.org/developer/getting-started/local-network#start-a-local-network) for starting the local IOTA network. +For running a local IOTA network, please follow [this guide](https://docs.iota.org/developer/getting-started/install-iota) for installing IOTA and [this guide](https://docs.iota.org/developer/getting-started/local-network#start-the-local-network) for starting the local IOTA network. ```rust use iota_sdk::IotaClientBuilder; diff --git a/crates/iota-storage/src/object_store/http/mod.rs b/crates/iota-storage/src/object_store/http/mod.rs index 678afd64a55..0f750a7193e 100644 --- a/crates/iota-storage/src/object_store/http/mod.rs +++ b/crates/iota-storage/src/object_store/http/mod.rs @@ -23,7 +23,7 @@ use crate::object_store::{ http::{gcs::GoogleCloudStorage, local::LocalStorage, s3::AmazonS3}, }; -// http://docs.aws.amazon.com/general/latest/gr/sigv4-create-canonical-request.html +// https://docs.aws.amazon.com/general/latest/gr/sigv4-create-canonical-request.html // // Do not URI-encode any of the unreserved characters that RFC 3986 defines: // A-Z, a-z, 0-9, hyphen ( - ), underscore ( _ ), period ( . ), and tilde ( ~ ). diff --git a/docs/README.md b/docs/README.md index 63ade6b76f9..7bf8398b94f 100644 --- a/docs/README.md +++ b/docs/README.md @@ -39,9 +39,9 @@ If you'd like to view the Vercel preview before your changes are ready for revie IOTA is for the community. Contribute for the benefit of all. - [Docs contributing guidelines](https://docs.iota.org/references/contribute/contribution-process) -- [Repo contributing guidelines](https://github.com/iotaledger/iota/blob/develop/CONTRIBUTING.md) -- [Style guide](https://docs.iota.org/style-guide) -- [Code of conduct](https://docs.iota.org/code-of-conduct) +- [Repo contributing guidelines](https://docs.iota.org/references/contribute/contribute-to-iota-repos) +- [Style guide](https://docs.iota.org/references/contribute/style-guide) +- [Code of conduct](https://docs.iota.org/references/contribute/code-of-conduct) ## License diff --git a/docs/content/references/contribute/code-of-conduct.mdx b/docs/content/references/contribute/code-of-conduct.mdx index 6df1fa741ca..4ad6e21fbab 100644 --- a/docs/content/references/contribute/code-of-conduct.mdx +++ b/docs/content/references/contribute/code-of-conduct.mdx @@ -1,7 +1,6 @@ --- title: IOTA Contributor Covenant Code of Conduct sidebar_label: Code of Conduct -slug: /code-of-conduct --- IOTA, as an open-source project, encourages free discussion rooted in respect. diff --git a/docs/content/references/contribute/contribute-to-iota-repos.mdx b/docs/content/references/contribute/contribute-to-iota-repos.mdx index 16ff7ea9c3f..638268b7ea4 100644 --- a/docs/content/references/contribute/contribute-to-iota-repos.mdx +++ b/docs/content/references/contribute/contribute-to-iota-repos.mdx @@ -1,6 +1,5 @@ --- title: Contribute to IOTA Repositories -slug: /contribute-to-iota-repos --- This page describes how to contribute to IOTA, and provides additional information about participating in the IOTA community. @@ -13,7 +12,7 @@ To connect with the IOTA community, join our [Discord](https://discord.gg/iota). To report an issue with IOTA, [create an issue](https://github.com/iotaledger/iota/issues/new/choose) in the GitHub repo. Click **Get started** to open a template for the type of issue to create. -## Fork IOTA to contribute +## Fork IOTA to Contribute To contribute to IOTA source code or documentation, you need only a GitHub account. You can commit updates and then submit a PR directly from the Github website, or create a fork of the repo to your local environment and use your favorite tools to make changes. Always submit PRs to the `main` branch. diff --git a/docs/content/references/contribute/style-guide.mdx b/docs/content/references/contribute/style-guide.mdx index 04b796051fe..ab4a8b6ad80 100644 --- a/docs/content/references/contribute/style-guide.mdx +++ b/docs/content/references/contribute/style-guide.mdx @@ -1,6 +1,5 @@ --- title: Style Guide -slug: /style-guide toc_max_heading_level: 2 --- @@ -556,7 +555,7 @@ Measurements should be written as numerals. ## Links -Always use relative links when linking to topics on docspnpm .iota.org. +Always use relative links when linking to topics on docs.iota.org. Include the `.mdx` extension when creating internal links so that they also work from the source file in GitHub. diff --git a/docs/content/sidebars/references.js b/docs/content/sidebars/references.js index 2b4673f258f..b62046a7b54 100644 --- a/docs/content/sidebars/references.js +++ b/docs/content/sidebars/references.js @@ -93,6 +93,7 @@ const references = [ items: [ 'references/contribute/contribution-process', 'references/contribute/code-of-conduct', + 'references/contribute/contribute-to-iota-repos', 'references/contribute/style-guide', 'references/contribute/add-a-quiz', 'references/contribute/import-code-docs', diff --git a/scripts/slipstream/config_slipstream.json b/scripts/slipstream/config_slipstream.json index 97ea0270f2c..1be88eb7763 100644 --- a/scripts/slipstream/config_slipstream.json +++ b/scripts/slipstream/config_slipstream.json @@ -159,7 +159,7 @@ }, { "regex": "docs\\.[Mm]ysten[Ll]abs\\.com", - "replacement": "wiki.iota.org" + "replacement": "docs.iota.org" }, { "regex": "\\{\\`\\$\\{new Date\\(\\)\\.getFullYear\\(\\)\\}\\s+Mysten\\s+Labs\\.\\s+All\\s+rights\\s+reserved\\.\\`\\}", @@ -203,15 +203,15 @@ }, { "regex": "sdk\\.[Mm]ysten[Ll]abs\\.com\/typescript", - "replacement": "wiki.iota.org/references/ts-sdk/typescript" + "replacement": "docs.iota.org/references/ts-sdk/typescript" }, { "regex": "sdk\\.[Mm]ysten[Ll]abs\\.com\/", - "replacement": "wiki.iota.org/references/ts-sdk/" + "replacement": "docs.iota.org/references/ts-sdk/" }, { "regex": "sdk\\.[Mm]ysten[Ll]abs\\.com", - "replacement": "wiki.iota.org/references/ts-sdk/typescript" + "replacement": "docs.iota.org/references/ts-sdk/typescript" }, { "regex": "[Mm]ysten[Ll]abs\\.com", @@ -243,7 +243,7 @@ }, { "regex": "docs\\.sui\\.io", - "replacement": "wiki.iota.org" + "replacement": "docs.iota.org" }, { "regex": "suiexplorer\\.com", diff --git a/sdk/typescript/src/client/types/params.ts b/sdk/typescript/src/client/types/params.ts index 62f7262f553..feb1c6ccf3c 100644 --- a/sdk/typescript/src/client/types/params.ts +++ b/sdk/typescript/src/client/types/params.ts @@ -326,7 +326,7 @@ export interface GetValidatorsApyParams {} /** Return list of events for a specified query criteria. */ export interface QueryEventsParams { /** - * The event query criteria. See [Event filter](https://docs.iota.io/build/event_api#event-filters) + * The event query criteria. See [Event filter](https://docs.iota.org/developer/iota-101/using-events#applying-event-filters) * documentation for examples. */ query: RpcTypes.IotaEventFilter; @@ -353,7 +353,7 @@ export type QueryTransactionBlocksParams = { export interface SubscribeEventParams { /** * The filter criteria of the event stream. See - * [Event filter](https://docs.iota.io/build/event_api#event-filters) documentation for examples. + * [Event filter](https://docs.iota.org/developer/iota-101/using-events#applying-event-filters) documentation for examples. */ filter: RpcTypes.IotaEventFilter; } @@ -413,7 +413,7 @@ export interface UnsafeMoveCallParams { typeArguments: string[]; /** * the arguments to be passed into the Move function, in - * [IotaJson](https://docs.iota.io/build/iota-json) format + * [IotaJson](https://docs.iota.org/references/iota-api) format */ arguments: unknown[]; /** From 1b4ca89cf1384c399a2f3e79338fb168c2f59df6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Eike=20Ha=C3=9F?= <eike-hass@web.de> Date: Thu, 5 Dec 2024 19:11:17 +0100 Subject: [PATCH 12/97] Add Identity docs (#3256) * update references * update * update * remove alias_output page * Refactor resolve and update examples for IOTA Identity * Update docs/content/developer/iota-identity/how-tos/decentralized-identifiers/create.mdx * Update docs/content/references/iota-identity/iota-did-method-spec.mdx Co-authored-by: Yasir <yasirshariffa@gmail.com> * remove wasm content * minor spelling fixes * update contribution links * reworked introduction * update examples references * update links to releage tag, update referenced lines * update example reference for alternative revoking * Update docs/content/references/iota-identity/iota-did-method-spec.mdx * Update docs/content/developer/iota-identity/getting-started/rust.mdx * update include isntructions * remove outdated video * readd revocation specification * Add missing page * No special headers please * Fix broken links * Remove tags * add sidebar * remove sidebar entries * fix sidebar * update developer overview * fix sidebar link * fix developer overview link * fix DID method spec * Fix images * remove duplicate example DID * Apply suggestions from code review Co-authored-by: Lucas Tortora <85233773+lucas-tortora@users.noreply.github.com> * task(devx): Move Identity docs and update Nav (#4381) * Moved Identity docs and gave them their own nav link * fix sidebar * fix ref links * fix ref links * fix links * fix sidebar * fix sidebars * add @saucelabs/theme-github-codeblock fix sidebar * add @saucelabs/theme-github-codeblock fix sidebar * fix nav * fix link * fix syntax highlighting * remove DID delete include --------- Co-authored-by: Enrico Marconi <enrico.marconi@hotmail.it> Co-authored-by: Yasir <yasir@shariff.dev> Co-authored-by: Yasir <yasirshariffa@gmail.com> Co-authored-by: Sebastian Wolfram <wulfraem@users.noreply.github.com> Co-authored-by: Dr-Electron <dr-electr0n@protonmail.com> Co-authored-by: Lucas Tortora <85233773+lucas-tortora@users.noreply.github.com> --- .../_snippets/not-available-on-testnet.mdx | 2 +- docs/content/developer/developer.mdx | 15 +- docs/content/iota-identity/contribute.mdx | 35 + .../explanations/about-identity-objects.mdx | 47 + .../decentralized-identifiers.mdx | 135 +++ .../explanations/verifiable-credentials.mdx | 74 ++ .../explanations/verifiable-presentations.mdx | 39 + .../iota-identity/getting-started/rust.mdx | 58 ++ .../decentralized-identifiers/create.mdx | 115 +++ .../decentralized-identifiers/delete.mdx | 87 ++ .../decentralized-identifiers/resolve.mdx | 148 +++ .../decentralized-identifiers/update.mdx | 380 ++++++++ .../domain-linkage/create-and-verify.mdx | 167 ++++ .../iota-identity/how-tos/key-storage.mdx | 133 +++ .../how-tos/verifiable-credentials/create.mdx | 117 +++ .../verifiable-credentials/revocation.mdx | 174 ++++ .../selective-disclosure.mdx | 131 +++ .../zero-knowledge-selective-disclosure.mdx | 121 +++ .../create-and-validate.mdx | 107 +++ docs/content/iota-identity/index.mdx | 79 ++ .../iota-identity/iota-did-method-spec.mdx | 226 +++++ .../references/iota-identity/overview.mdx | 17 + .../iota-identity/revocation-bitmap-2022.mdx | 199 +++++ .../revocation-timeframe-2024.mdx | 148 +++ docs/content/sidebars/identity.js | 90 ++ docs/content/sidebars/ts-sdk.js | 4 +- docs/site/docusaurus.config.js | 15 +- docs/site/package.json | 1 + docs/site/sidebars.js | 2 + pnpm-lock.yaml | 841 ++++++++---------- 30 files changed, 3240 insertions(+), 467 deletions(-) create mode 100644 docs/content/iota-identity/contribute.mdx create mode 100644 docs/content/iota-identity/explanations/about-identity-objects.mdx create mode 100644 docs/content/iota-identity/explanations/decentralized-identifiers.mdx create mode 100644 docs/content/iota-identity/explanations/verifiable-credentials.mdx create mode 100644 docs/content/iota-identity/explanations/verifiable-presentations.mdx create mode 100644 docs/content/iota-identity/getting-started/rust.mdx create mode 100644 docs/content/iota-identity/how-tos/decentralized-identifiers/create.mdx create mode 100644 docs/content/iota-identity/how-tos/decentralized-identifiers/delete.mdx create mode 100644 docs/content/iota-identity/how-tos/decentralized-identifiers/resolve.mdx create mode 100644 docs/content/iota-identity/how-tos/decentralized-identifiers/update.mdx create mode 100644 docs/content/iota-identity/how-tos/domain-linkage/create-and-verify.mdx create mode 100644 docs/content/iota-identity/how-tos/key-storage.mdx create mode 100644 docs/content/iota-identity/how-tos/verifiable-credentials/create.mdx create mode 100644 docs/content/iota-identity/how-tos/verifiable-credentials/revocation.mdx create mode 100644 docs/content/iota-identity/how-tos/verifiable-credentials/selective-disclosure.mdx create mode 100644 docs/content/iota-identity/how-tos/verifiable-credentials/zero-knowledge-selective-disclosure.mdx create mode 100644 docs/content/iota-identity/how-tos/verifiable-presentations/create-and-validate.mdx create mode 100644 docs/content/iota-identity/index.mdx create mode 100644 docs/content/references/iota-identity/iota-did-method-spec.mdx create mode 100644 docs/content/references/iota-identity/overview.mdx create mode 100644 docs/content/references/iota-identity/revocation-bitmap-2022.mdx create mode 100644 docs/content/references/iota-identity/revocation-timeframe-2024.mdx create mode 100644 docs/content/sidebars/identity.js diff --git a/docs/content/_snippets/not-available-on-testnet.mdx b/docs/content/_snippets/not-available-on-testnet.mdx index 3d1956f3f15..fee649cb633 100644 --- a/docs/content/_snippets/not-available-on-testnet.mdx +++ b/docs/content/_snippets/not-available-on-testnet.mdx @@ -1,5 +1,5 @@ :::info Mainnet Only -IOTA EVM and IOTA Identity are not available on the IOTA Move Testnet. +IOTA EVM is not available on the IOTA Move Testnet. ::: \ No newline at end of file diff --git a/docs/content/developer/developer.mdx b/docs/content/developer/developer.mdx index 9fe0a348d29..3da2678b84f 100644 --- a/docs/content/developer/developer.mdx +++ b/docs/content/developer/developer.mdx @@ -44,6 +44,12 @@ Go to [Cryptography](cryptography.mdx). Get aquainted with IOTA by solving challenges of increasing complexity in the [Capture the Flag section](iota-move-ctf/introduction.mdx). +## Decentralized Identity + +IOTA offers a Decentralized Identity framework which can be utilized to provide and use digital decentralized identities for People, Organizations, Things and Objects. + +Go to the [IOTA Identity Framework](/iota-identity/) section. + ## Advanced Topics The Advanced Topics section includes guides for advanced solutions (like asset tokenization). These topics assume you are familiar with Move and the IOTA blockchain. @@ -75,12 +81,3 @@ Go to the [Developer Cheat Sheet](dev-cheat-sheet.mdx). Everything you need to know about our Layer 2 EVM Support, including working with the IOTA EVM and ShimmerEVM chains. Go to [EVM Smart Contracts](https://wiki.iota.org/isc/introduction/). - -## Decentralized Identity - -<NotAvailableOnTestnet /> - -IOTA also offers a Decentralized Identity framework which can be utilized to provide and use digital decentralized identities for People, Organizations, Things and Objects. - -Go to the [IOTA Identity Framework](https://wiki.iota.org/identity.rs/welcome/) section. - diff --git a/docs/content/iota-identity/contribute.mdx b/docs/content/iota-identity/contribute.mdx new file mode 100644 index 00000000000..f83dfae4a88 --- /dev/null +++ b/docs/content/iota-identity/contribute.mdx @@ -0,0 +1,35 @@ +--- +title: Contribute to the project +sidebar_label: Contribute +description: Contribute to IOTA Identity by joining the Identity initiative, via the projects GitHub repository, documentation, or sharing your knowledge. +image: /img/identity/icon.png +tags: + - reference + - identity +--- + +**Thanks for thinking about contributing to the project! You can contribute using the following ways.** + +## Contribute to the Project's GitHub Repository + +All of the code is open source and hosted on [GitHub](https://github.com/iotaledger/identity.rs) where you can: + +- [Report a bug](https://github.com/iotaledger/identity.rs/issues/new/choose). +- [Suggest a new feature](https://github.com/iotaledger/identity.rs/blob/main/.github/CONTRIBUTING.md). +- [Contribute to the documentation](#contribute-to-the-documentation). + +## Contribute to the Documentation + +This documentation is also open source and hosted on GitHub. + +If you want to contribute new documentation or fix an error, see the [contribution guidelines](https://docs.iota.org/references/contribute/contribution-process). + +## Share Your Knowledge + +Helping others is an important part of any open source ecosystem. + +By sharing your knowledge with others, you can provide a lot of value to the community and maybe inspire someone else to learn and contribute. + +Take a look at what discussions are going on in the `#identity` channel on [Discord](https://discord.iota.org). + +Thanks :heart: diff --git a/docs/content/iota-identity/explanations/about-identity-objects.mdx b/docs/content/iota-identity/explanations/about-identity-objects.mdx new file mode 100644 index 00000000000..7bff840d856 --- /dev/null +++ b/docs/content/iota-identity/explanations/about-identity-objects.mdx @@ -0,0 +1,47 @@ +--- +title: Identity object +description: The IOTA `Identity` Move object. +image: /img/identity/icon.png +tags: + - explanation + - identity + - did + - getting-started +--- + +# Identity Object + +An Identity Object is a **shared** _Move_ object that stores a single DID Document on the network, allowing both +on-chain and off-chain actors to interact with it. + +The Identity Object's unique ID is used to derive the actual DID of the DID Document it contains. + +## Identity's Access Control + +An `Identity` is a shared object and is thus accessible by anyone. For this reason, it is of paramount importance to +limit the use of an `Identity`'s APIs - especially its mutable ones - to only the intended actors. + +### Controllers and `ControllerCap` + +The [DID specification](https://www.w3.org/TR/did-core/) defines **DID controller** as the entity allowed to make changes to +a DID document. Since an `Identity` may be viewed as a simple wrapper over a DID Document, we extend the definition of _DID controller_ to be: +_the entity allowed to make changes to an `Identity`_. + +In order to allow a broader range of actors to act as an `Identity`'s controller - e.g. an `Identity` controlling another `Identity` - +a controller is identified through its **controller capability** `ControllerCap`. +A `ControllerCap` is a _Move_ object that acts as a blind token, allowing anyone who presents it to the corresponding `Identity` to access +the `Identity`'s APIs that are only invocable by its controllers. + +### Voting power and threshold + +When an `Identity` has more than a single controller, an access control (AC) policy for the `Identity` must be established. Such a policy is +represented by an unsigned integer **threshold** that is established upon the `Identity`'s creation. Together with the `Identity`'s threshold, each controller +is assigned with a **voting power**, i.e. an unsigned integer that acts as a sort of _weight_ in the evaluation of an AC control policy. + +### Proposals + +Whenever a controller wants to make a change to its `Identity`, a **proposal** encapsulating that change is created instead of carrying out the update +right away. In order to execute the changes contained in a `Proposal` enough controllers need to approve it. The exact number of approvals depends on +the controllers' voting powers as well as the `Identity`'s threshold. +`Proposal`s keep track of the approvals they receive by internally storing the sum of all approving controllers' voting powers in a field called `votes`. +A `Proposal` can only be executed after `votes` exceeds `Identity`'s threshold. diff --git a/docs/content/iota-identity/explanations/decentralized-identifiers.mdx b/docs/content/iota-identity/explanations/decentralized-identifiers.mdx new file mode 100644 index 00000000000..30e7b38f7db --- /dev/null +++ b/docs/content/iota-identity/explanations/decentralized-identifiers.mdx @@ -0,0 +1,135 @@ +--- +description: The Decentralized Identifiers (DID) standard from W3C is the fundamental standard that supports the concept of a decentralized digital identity. Explore the basic aspects of the DID standard. +image: /img/identity/icon.png +tags: + - explanation + - identity + - did + - getting-started + - verification-method + - verifiable-credentials +--- + +# Decentralized Identifiers (DID) + +:::info TL;DR + +DIDs are unique identifiers that can be resolved to DID Documents containing public keys and URIs for identity verification and public information. + +Adhering to the W3C's DID specifications, IOTA's implementation ensures interoperability and security within its ledger. + +DIDs support self-sovereign identity, allowing identity owners to control their creation and destruction, +while facilitating encrypted communication. + +::: + +A DID is a unique identifier that can be resolved to a DID Document. This document contains data such as public keys, enabling the holder to prove ownership over their personal data, but also URIs that link to public information about the identity. DIDs are the fundamental building blocks of decentralized digital identity. +This implementation complies with the [DID specifications v1.0](https://www.w3.org/TR/did-core//) from the World Wide Web Consortium (W3C). + +In the IOTA Identity framework, we have implemented the DID standard according to the `iota` [DID Method Specification](../../references/iota-identity/iota-did-method-spec.mdx). Other implementations of DID on IOTA must follow the `iota` DID Method Specification if they want to use the `iota` method name. Libraries implementing the `iota` DID Method Specification are provided for [Rust](../getting-started/rust.mdx). + +## Decentralized Identifiers + +A Decentralized Identifier, or DID, is a unique identifier that is tied to a subject. This subject can be anything, like a person, an organization, an IoT device, or even an object. The identifier can be used by the subject to identify themselves through a digital format, providing a basis for online identification. The identifier looks like a set of random characters that includes some prefixes to determine which standard and implementation is used: + +`did:iota:0xe4edef97da1257e83cbeb49159cfdd2da6ac971ac447f233f8439cf29376ebfe` + +The World Wide Web Consortium (W3C) is a well-known standardization body that has standardized how DIDs should look and work. +This provides a basis for different technologies that implement the [DID standard](https://www.w3.org/TR/did-spec-registries/#did-methods) to achieve interoperability. +Keep in mind that, unfortunately, most of these methods are outdated and not maintained. + +## DID Documents + +The purpose of a DID is to help navigate to a DID Document, +which is a document containing more information regarding the identity subject. +This document contains data such as public keys, enabling the subject to prove ownership over their personal data, +but can contain additional information on how to interact with the subject. + +The identifier contains all information to resolve a DID, providing the latest DID Document. +The first three characters `did` indicate that the DID standard from W3C must be used to resolve the identifier. +It is followed by a unique method name, in our case `iota`, to indicate that the IOTA method is used. + +The IOTA method is a specific implementation following the [IOTA DID Method Specification](../../references/iota-identity/iota-did-method-spec.mdx). +This provides unique rules for the protocol to follow in order to manage a DID Document. +In our case, it describes how DID Documents are uploaded and queried to and from the IOTA ledger. + +Lastly, a DID also contains a set of random characters that are unique per identity and resolve to a single DID Document. + +:::tip Requires basic knowledge of Asymmetric Encryption + +The following sections require some basic knowledge of Asymmetric Encryption. +Please read or view some materials on the subject before continuing. + +::: + +### DID Document Anatomy + +A DID Document mostly contains two important pieces of data: verification methods and services. + +#### Verification Methods + +Verification methods contain public key material that can be used to prove ownership over the identity, +by cryptographically signing something with the associated private key. +The public key can be used to verify that the identity subject signed the data and therefore controls the private key. +Ownership over the private keys, therefore, proves ownership over the identity. + +This also means that it is very important to keep the private keys safe and secure. +In addition, the public keys allow users to send encrypted data to the identity that only the identity owner can decrypt. + +:::caution + +Never share your private keys, seeds, passphrases with anyone. Not even IOTA Foundation members. +This may lead to loss of funds or control over your own digital identity. + +::: + +#### Services + +Services are URIs that point to more information about the identity. +This could be something as simple as a website for an organizational identity. +These services are publicly available for all to read, +and should not contain Personal Identifiable Information (PII) in the case of human identities. + +## Why Use DIDs? + +DIDs allow any subject to have a unique identifier that they can prove ownership of, +and at the same time provide a way to send them encrypted messages. +The Identity is Self-Sovereign, meaning the subject is always in control; +whether it is [creating](../how-tos/decentralized-identifiers/create.mdx), [updating](../how-tos/decentralized-identifiers/update.mdx), or [destroying](../how-tos/decentralized-identifiers/delete.mdx) it. + +### Verifiable Credentials + +DIDs become more interesting when you combine them with [verifiable credentials (VC)](verifiable-credentials.mdx). +In essence, verifiable credentials (VCs) are signed statements by trusted third parties about a certain identity. +The signer, or Issuer, is referenced by the DID and so is the subject, often called the holder. +The holder controls a copy of this statement and can share it with other parties, the _Verifiers_, +who can verify the statement and check which party made the statement without asking the Issuer. +Instead, they can verify the issuer's signature by checking the issuer's DID Document. + +This puts Holders back in control over their own data, +while making the data much more trustworthy as it has become verifiable. + +## Why Use Iota Identity Over Other Implementations? + +IOTA Identity is a framework to implement Self-Sovereign Identities on IOTA. +Inherently, IOTA provides some unique features that have a major impact on the usability of the framework. + +### Availability and Accessibility + +DID Documents are stored in the ledger state and are covered storage deposit. +This guarantees that all nodes will have an up-to-date copy of the latest DID Document. +Resolving a DID into its document can usually be done by any IOTA node in the network. +This solves many issues regarding availability, accessibility, and synchronization. + +### Layer1 Interactions + +DID Documents are stored in [Identity objects](./about-identity-objects.mdx). +This allows them to directly interact with other Layer 1 artifacts like NFTs and coins. + +For instance, an Identity object representing a DID can hold coins or control NFTs. +Transferring funds between DIDs is also possible on Layer 1. + +### Ease-of-use + +IOTA Identity abstracts the details of the DID standard by providing easy-to-use APIs that allow standardized behavior. +It also allows more flexible and complex management of DID Documents. diff --git a/docs/content/iota-identity/explanations/verifiable-credentials.mdx b/docs/content/iota-identity/explanations/verifiable-credentials.mdx new file mode 100644 index 00000000000..257e6864dc1 --- /dev/null +++ b/docs/content/iota-identity/explanations/verifiable-credentials.mdx @@ -0,0 +1,74 @@ +--- +description: Verifiable credentials are statements about the holder. They can be verified online or in person, and the holder decides who to share them with. +image: /img/identity/icon.png +tags: + - explanation + - identity + - verifiable-credentials +--- +# Verifiable Credentials + +:::info TL;DR + +Verifiable credentials (VCs) are digital statements that can be cryptographically proven, like a digital passport, +and are used within systems to assert certain properties or capabilities of an entity. + +In the IOTA Identity framework, this is managed with decentralized identifiers (DIDs) on the IOTA network. +Subjects and issuers use their DIDs for the creation and verification of credentials. + +::: + +Credentials are statements about an entity, +such as properties that the entity possesses or capabilities that they have, +like a driver's license, passports, or a person's age. +Verifiable credentials (VCs) are statements (e.g., Alice has a driver's license) +that can be cryptographically verified by a third party, either online or in person. +Additionally, the holder of the VC decides what is shared and who it is shared with. + +There are several types of actors that play different roles in a Verifiable Credential system. +We'll start with a common example of how things work in the world today using physical credentials and centralized databases, +and outline the roles that various entities play in the Verifiable Credential system. + +## Example - Passport Issuance + +A government (the _issuer_) issues a passport asserting citizenship (the _Verifiable Credential_) to Alice (the _subject_ and _Holder_), +and writes the information to a database (the _Verifiable Data Registry_). +When crossing the border, Alice (the _Holder_) presents her passport to a border agent (the _Verifier_), +who can verify that Alice (the _subject_) is indeed a citizen. + + + +**Subject:** An entity about which claims are made – in this example, that Alice (the _subject_) is a citizen of this country. + +**Holder:** Any entity with a verifiable credential – Alice (the _Holder_) possesses the passport (the _VC_). + +**Issuer:** An entity which asserts claims about a subject – The governing body (the _issuer_), which is trusted, issues Alice a passport. + +**Verifier:** An entity which checks if the VC a holder presents is legitimate – The border agent (the _Verifier_) trusts the government (the _issuer_) which issued Alice her passport and validates that Alice (the _subject_) is a citizen. + +:::note + +See the [Verifiable Credentials Data Model 1.0 Specification](https://w3c.github.io/vc-data-model/) for more information. + +::: + +## Verifiable Credentials in IOTA + +In the IOTA Identity framework, instead of a physical passport being given to Alice and its information written +into a centralized database owned by the government, Alice receives a digital verifiable credential, +and the information required for verification in the future is written to the Tangle. + +At a high level, the creation and verification of a VC on IOTA works as follows: + + +The first step is to create a verifiable credential that requires the subject (Alice) and issuer (the government) to +have [DIDs](./decentralized-identifiers.mdx) published on the Tangle and a set of statements being asserted (that Alice has a passport). +The issuer signs the credential with their private key and publishes the public key to the Tangle. + +Once the issuer is confident that the credential satisfies its expectations, +the credential is stored and transmitted to the subject in a secure manner (off-chain). + +Validation is performed by looking up the issuer's public key on the Tangle, +the holder proving ownership of their DID to the verifier (evidence), +and validating that the issuing party has indeed signed the credential. + diff --git a/docs/content/iota-identity/explanations/verifiable-presentations.mdx b/docs/content/iota-identity/explanations/verifiable-presentations.mdx new file mode 100644 index 00000000000..5ae4bc6cb6e --- /dev/null +++ b/docs/content/iota-identity/explanations/verifiable-presentations.mdx @@ -0,0 +1,39 @@ +# Verifiable Presentations + +A verifiable presentation is the recommended data format for sharing one or more [verifiable credentials](./verifiable-credentials.mdx). +It is constructed and signed by a holder to prove control over their credentials and can be presented to a verifier for validation. + +For instance, after an issuer [creates and issues](./../how-tos/verifiable-credentials/create.mdx) a [verifiable credential](./verifiable-credentials.mdx) to a holder, such as a university issuing a degree to a graduate, +the holder stores it securely until asked to present it. +A company could then request proof of that university degree: the holder can [create a verifiable presentation](./../how-tos/verifiable-credentials/create.mdx) +containing their credential, already signed by their university, and present it to the company to [validate](./../how-tos/verifiable-credentials/create.mdx#validate-a-vc). + +Note that verifiable presentations that contain personal data should, as with verifiable credentials, be transmitted and stored securely off-chain to satisfy data privacy regulations such as [GDPR](https://gdpr.eu/). + +:::note + +See the [Verifiable Credentials Data Model Specification](https://www.w3.org/TR/vc-data-model/#presentations) for more information on verifiable presentations. + +::: + +## Security Considerations + +### Replay Attacks + +A malicious actor could potentially store a verifiable presentation without a challenge +and replayed to a different verifier, impersonating the holder. +This is because the holder's signature on a presentation would still be seen as valid indefinitely, +until they [rotate](https://www.w3.org/TR/did-core/#verification-method-rotation) the verification method used. + +To mitigate this, verifiers should always send a unique challenge when requesting a verifiable presentation. +This challenge can be set as the `nonce` property of the JWS by the holder during signing. +The digital signature prevents these properties from being altered as it would invalidate the signature, effectively preventing a malicious +actor from injecting different values into old verifiable presentations. A presentation without a challenge in its proof that matches what was +sent by the verifier should be considered invalid. + +The challenge string should be sufficiently random and unique for each verifiable presentation requested by a verifier to avoid +being predicted. + +Holders may additionally specify that their signature on a verifiable presentation expires after a short duration, as +per `JwtPresentationOptions`. However, verifiers and different implementations could ignore that property, +so setting a signature expiration alone should not be relied upon. diff --git a/docs/content/iota-identity/getting-started/rust.mdx b/docs/content/iota-identity/getting-started/rust.mdx new file mode 100644 index 00000000000..d32f74a84e1 --- /dev/null +++ b/docs/content/iota-identity/getting-started/rust.mdx @@ -0,0 +1,58 @@ +--- +sidebar_label: Rust +description: Getting started with the IOTA Identity Rust Library. +image: /img/identity/icon.png +tags: + - identity + - rust + - setup + - install + - getting-started +--- +# Getting Started with Rust + +## Requirements + +- [Rust](https://www.rust-lang.org/) (>= 1.62) +- [Cargo](https://doc.rust-lang.org/cargo/) (>= 1.62) + +## Include the Library + +To include IOTA Identity in your project, add it as a dependency in your `Cargo.toml`: + +```toml +[dependencies] +identity_iota = { git = "https://github.com/iotaledger/identity.rs", tag = "v1.6.0-alpha"} +``` + +## Examples + +To try out the [examples](https://github.com/iotaledger/identity.rs/tree/v1.6.0-alpha/examples), you should: + +1. Clone the repository: + +```bash +git clone https://github.com/iotaledger/identity.rs +``` + +2. Build the repository: + +```bash +cargo build +``` + +3. Run your first example: + +```bash +cargo run --example 0_create_did +``` + +## API Reference + +You can find the API reference for the Rust library on [docs.rs](https://docs.rs/identity_iota/latest/identity_iota/index.html). + +If you would like to build the documentation, locally you can do so with the following command: + +``` +RUSTDOCFLAGS='--cfg docsrs' cargo +nightly doc -p identity_iota --all-features --no-deps --open +``` diff --git a/docs/content/iota-identity/how-tos/decentralized-identifiers/create.mdx b/docs/content/iota-identity/how-tos/decentralized-identifiers/create.mdx new file mode 100644 index 00000000000..11333042bb4 --- /dev/null +++ b/docs/content/iota-identity/how-tos/decentralized-identifiers/create.mdx @@ -0,0 +1,115 @@ +--- +title: Creating a Decentralized Identity +sidebar_label: Create and Publish +description: Create DID Documents and publish them to an IOTA network. +image: /img/identity/icon.png +tags: + - how-to + - identity + - did +--- + + +If you want to benefit from Self-Sovereign Identity, +you need to create a [Decentralized Identity](../../explanations/decentralized-identifiers.mdx). +This identity consists of many parts that have different functions. + +:::note DID method Specification + +Note that the Iota Identity Framework follows [IOTA DID Method Specification](../../../references/iota-identity/iota-did-method-spec.mdx). + +::: + +## Identity Generation Process + +### 1. Get Funds to cover the gas costs + +The first thing you will need to generate an identity is an address with enough funds to cover +the gas cost of the whole procedure. +In test networks as well as local ones, you can use a faucet to request funds. + +:::tip + +If you want to use the main IOTA network, +you will need an an address with actual IOTA funds to create a new Identity. + +::: + +<div className={'hide-code-block-extras'}> +<Tabs groupId="language" queryString> +<TabItem value="rust" label="Rust"> + +```rust reference +https://github.com/iotaledger/identity.rs/blob/v1.6.0-alpha/examples/utils/utils.rs#L99 +``` + +</TabItem> +</Tabs> +</div> + +### 2. Create the content for the DID Document + +As a bare minimum, a [DID document](../../explanations/decentralized-identifiers.mdx) needs at least one verification method. + +At this point, the DID itself is unknown since the `Identity` object is not published yet and thus there's no `ID` for it. + +:::tip + +You can use a placeholder `did:iota:0x0000000000000000000000000000000000000000000000000000000000000000` to reference +the DID inside the document. + +::: + +<div className={'hide-code-block-extras'}> +<Tabs groupId="language" queryString> +<TabItem value="rust" label="Rust"> + +```rust reference +https://github.com/iotaledger/identity.rs/blob/v1.6.0-alpha/examples/utils/utils.rs#L49-L58 +``` + +</TabItem> +</Tabs> +</div> + +### 3. Construct an `Identity` Object + +Next, you need to construct a new [Identity Object](../../explanations/about-identity-objects.mdx) that contains the just created +DID Document. +The created `Identity` contains an encoded version of the DID Document, and has a single controller that is represented by a newly +created `ControllerCap`. + +:::info Controller Capability +When a new `Identity` is created the transaction's sender is assumed to be its controller and thus a `ControllerCap` is sent to its address. +::: + +<div className={'hide-code-block-extras'}> +<Tabs groupId="language" queryString> +<TabItem value="rust" label="Rust"> + +```rust reference +https://github.com/iotaledger/identity.rs/blob/v1.6.0-alpha/examples/utils/utils.rs#L60-L64 +``` + +</TabItem> +</Tabs> +</div> + +## Full Example Code + +<Tabs groupId="language" queryString> +<TabItem value="rust" label="Rust"> + +```rust reference +https://github.com/iotaledger/identity.rs/blob/v1.6.0-alpha/examples/0_basic/0_create_did.rs +``` + +</TabItem> +</Tabs> + +## Running Examples Locally + +In order to run the examples, you will need to run an IOTA network locally. + +If you want to use something different, you will need to modify the API and faucet endpoints in the examples to match your +setup. diff --git a/docs/content/iota-identity/how-tos/decentralized-identifiers/delete.mdx b/docs/content/iota-identity/how-tos/decentralized-identifiers/delete.mdx new file mode 100644 index 00000000000..9424433a6e4 --- /dev/null +++ b/docs/content/iota-identity/how-tos/decentralized-identifiers/delete.mdx @@ -0,0 +1,87 @@ +--- +title: Delete an IOTA Identity +sidebar_label: Delete +description: How to deactivate or destroy an IOTA Identity +image: /img/identity/icon.png +tags: + - how-to + - identity + - did +--- + + +There are two approaches to delete an IOTA Identity, with different implications: + +- [Deactivate](#deactivate) +- [Destroy](#destroy) + +## Deactivate + +As detailed in the [IOTA DID Method Specification]( +../../../references/iota-identity/iota-did-method-spec.mdx#deactivate), +a controller of an IOTA Identity may [deactivate](https://www.w3.org/TR/did-core/#did-document-metadata) it by executing an update that either: + +- deletes the contents of the DID Document entirely, leaving the state metadata empty, OR +- sets the `deactivated` field in the DID Document metadata to `true`. + +In both cases, the DID Document will be marked as `deactivated` when resolved. + +:::tip Reversible + +The identity can be reactivated at any time, by publishing an update restoring the DID Document's contents, +or unsetting the `deactivated` field in the metadata respectively, depending on how it was initially deactivated. + +::: + +### Example + +The following example demonstrates deactivating and reactivating an IOTA DID Document. + +<Tabs groupId="language" queryString> +<TabItem value="rust" label="Rust"> + +```rust reference +https://github.com/iotaledger/identity.rs/blob/v1.6.0-alpha/examples/0_basic/3_deactivate_did.rs +``` + +</TabItem> +</Tabs> + +## Destroy + +Alternatively, you can [destroy](../../../references/iota-identity/iota-did-method-spec.mdx#destroy) an IOTA Identity permanently. + +:::warning Irreversible + +Destroying an IOTA Identity is permanent and irreversible. + +::: + +This may be achieved by a DID controller by executing the `Identity::execute_delete` API. + +Any coins and tokens owned by the destroyed `Identity` are reclaimed and must be sent to another address. + +:::warning + +Note that historical versions may still be stored off-ledger, or on a permanode, +so sensitive or Personal Identifiable Information (PII) should NEVER be stored in a DID Document. + +::: + +Even with a previous version available, a destroyed DID can never be restored. + +{/* +### Example + +The following example demonstrates how a controller destroys an IOTA Identity. + +<Tabs groupId="language" queryString> +<TabItem value="rust" label="Rust"> + +```rust reference +https://github.com/iotaledger/identity.rs/blob/v1.6.0-alpha/examples/0_basic/4_delete_did.rs +``` + +</TabItem> +</Tabs> +*/} \ No newline at end of file diff --git a/docs/content/iota-identity/how-tos/decentralized-identifiers/resolve.mdx b/docs/content/iota-identity/how-tos/decentralized-identifiers/resolve.mdx new file mode 100644 index 00000000000..2fec47c8a78 --- /dev/null +++ b/docs/content/iota-identity/how-tos/decentralized-identifiers/resolve.mdx @@ -0,0 +1,148 @@ +--- +title: Resolve an IOTA Identity +sidebar_label: Resolve +description: Explain how resolving works including arguments +image: /img/identity/icon.png +tags: + - how-to + - identity + - did +--- + + +DID resolution is the process of fetching and decoding a [DID Document](https://www.w3.org/TR/did-core/#dfn-did-documents) corresponding to a given [DID](https://www.w3.org/TR/did-core/#dfn-decentralized-identifiers). +The [IOTA Identity framework](https://github.com/iotaledger/identity.rs) supports resolving DID Documents that are +stored on an IOTA network and enables users to plug in handlers for additional methods. + +This is similar to, but not to be confused with, +the [W3C DID Resolution specification](https://w3c-ccg.github.io/did-resolution/), +which defines function signatures for resolution in the context of web or REST APIs, +whereas the IOTA Identity framework provides strongly-typed resolution for a better developer experience. + +This functionality is primarily provided by the `Resolver`, which can: + +- [Resolve IOTA DID Documents](#resolving-an-iota-did). +- [Resolve DID Documents from multiple DID methods](#resolving-multiple-did-methods). +- Resolve the DID Documents referenced in a verifiable presentation or credential. + +## Resolving an IOTA DID + +The following examples demonstrate how to resolve an IOTA DID Document from its DID. + +### Resolver + +Once you have configured a `Resolver` with a `Client`, it will resolve +IOTA DID Documents according to the read procedure defined in the [IOTA DID Method Specification](../../../references/iota-identity/iota-did-method-spec.mdx#read). +It fetches the the `Identity` from the network specified in the DID (see [DID Format](../../../references/iota-identity/iota-did-method-spec.mdx#did-format)), +then extracts and validates the DID Document from it. + +<Tabs groupId="language" queryString> +<TabItem value="rust" label="Rust"> + +```rust +use examples::create_did_document; +use examples::get_client_and_create_account; + +use examples::get_memstorage; +use identity_iota::iota::IotaDocument; +use identity_iota::prelude::Resolver; + +/// Demonstrates how to resolve an existing DID +#[tokio::main] +async fn main() -> anyhow::Result<()> { + // create new client to interact with chain and get funded account with keys + let storage = get_memstorage()?; + let identity_client = get_client_and_create_account(&storage).await?; + // create new DID document and publish it + let (document, _) = create_did_document(&identity_client, &storage).await?; + + let did = document.id().clone(); + + // We will be using a `Resolver` to resolve the DID Document. + let mut resolver = Resolver::<IotaDocument>::new(); + + // We need to register a handler that can resolve IOTA DIDs. + // This convenience method only requires us to provide a client. + resolver.attach_kinesis_iota_handler((*identity_client).clone()); + + let resolver_document: IotaDocument = resolver.resolve(&did).await.unwrap(); + + // Client and Resolver resolve to the same document. + assert_eq!(client_document, resolver_document); + + Ok(()) +} +``` + +</TabItem> +</Tabs> + +### Client + +You can also use the `Client` directly to resolve individual DIDs from its configured network. + +<Tabs groupId="language" queryString> +<TabItem value="rust" label="Rust"> + +```rust +use examples::create_did_document; +use examples::get_client_and_create_account; +use examples::get_memstorage; + +use identity_iota::iota::IotaDocument; + +#[tokio::main] +async fn main() -> anyhow::Result<()>{ + let storage = get_memstorage()?; + let identity_client = get_client_and_create_account(&storage).await?; + // create new DID document and publish it + let (document, _) = create_did_document(&identity_client, &storage).await?; + + let did = document.id().clone(); + + // We can resolve a `IotaDID` to bytes via client. + // Resolve the associated `Identity Object` and extract the DID document from it. + let client_document: IotaDocument = identity_client.resolve_did(&did).await?; + println!("Client resolved DID Document: {client_document:#}"); +} +``` + +</TabItem> +</Tabs> + +## Advanced Resolver Configuration + +You can configure the `Resolver` to support many use cases by attaching custom resolution handlers. +This enables the `Resolver` to resolve multiple DID methods, as well as customizing how +a particular DID method (such as the IOTA method) gets resolved. + +This feature is mainly intended to be used together with the Resolver's convenience methods for +handling [verifiable presentations](../verifiable-presentations/create-and-validate.mdx) +and [credentials](./../../explanations/verifiable-credentials.mdx). + +### Resolving Multiple DID Methods + +<Tabs groupId="language" queryString> +<TabItem value="rust" label="Rust"> + +```rust reference +https://github.com/iotaledger/identity.rs/blob/v1.6.0-alpha/examples/1_advanced/5_custom_resolution.rs +``` + +</TabItem> +</Tabs> + +## Resolution for Verifiable Presentations + +When validating [verifiable presentations](./../verifiable-presentations/create-and-validate.mdx), you need to +resolve the DID Documents of the [verifiable credential](./../../explanations/verifiable-credentials.mdx) issuers +and presentation holder to verify their signatures. + +Resolving the necessary DID Documents is +[performed automatically when verifying presentations via the `Resolver`](../verifiable-presentations/create-and-validate.mdx#example-code) + +When direct access to these DID Documents is desired, the `Resolver` also provides standalone methods to: + +- Resolve a presentation holder's DID Document. +- Resolve the DID Documents of the issuers of the credentials in a verifiable presentation. +- Resolve the issuer's DID Document for a given verifiable credential. diff --git a/docs/content/iota-identity/how-tos/decentralized-identifiers/update.mdx b/docs/content/iota-identity/how-tos/decentralized-identifiers/update.mdx new file mode 100644 index 00000000000..e1c50866955 --- /dev/null +++ b/docs/content/iota-identity/how-tos/decentralized-identifiers/update.mdx @@ -0,0 +1,380 @@ +--- +sidebar_label: Update +description: How DID Documents can be manipulated and how updates should be published +image: /img/identity/icon.png +tags: + - how-to + - identity + - did +--- + + +# Update DID Documents + +You can extend DID Documents by adding [verification methods](#verification-methods), [services](#services) and custom properties. +A verification method adds public keys, which can be used to digitally sign things like a DID message or a verifiable credential, +while a service can provide metadata around the identity via URIs. + +## Verification Methods + +As demonstrated by the [example](#full-example-code) below, the IOTA Identity framework offers easy-to-use methods for adding +[verification methods](https://www.w3.org/TR/did-core/#verification-methods). + +### Properties + +You can specify the following properties for a verification method: + +- **id**: A [DID URL](https://www.w3.org/TR/did-core/#did-url-syntax) for the verification method. You can specify it by setting the [fragment](https://www.w3.org/TR/did-core/#fragment). +- **type**: Specifies the type of the verification method. The framework supports `Ed25519` and `X25519` key types. This property is automatically filled by the framework when specifying the verification material. +- **publicKeyMultibase**: A multi-base encoded public key which concludes the [verification material](https://www.w3.org/TR/did-core/#verification-material). This can be automatically generated by the framework or manually provided by users. + +## Verification Relationships + +[Verification relationships](https://www.w3.org/TR/did-core/#verification-relationships) express the relationship between the DID subject and the verification method. +You can use it to specify the purpose of the verification method. + +### Relationships + +The Identity Framework supports the following relationships: + +- **[Authentication](https://www.w3.org/TR/did-core/#authentication)**: Used to specify authentication methods for the DID subject. +- **[Assertion](https://www.w3.org/TR/did-core/#assertion)**: Used to verify verifiable credentials. +- **[Key Agreement](https://www.w3.org/TR/did-core/#assertion)**: Used for establishing secure communication channels. +- **[Capability Invocation](https://www.w3.org/TR/did-core/#capability-invocation)**: Can be used to authorize updates to the DID Document. +- **[Capability Delegation](https://www.w3.org/TR/did-core/#capability-delegation)**: A mechanism to delegate cryptographic capability to another party. + +Verification methods can be either [embedded or referenced](https://www.w3.org/TR/did-core/#referring-to-verification-methods). Referencing verification +methods allows them to be used by more than one verification relationship. +When you create a verification method using the Identity Framework, specifying the `MethodScope` option will result in an embedded verification method. +Leaving that option unset will create the verification method as a map entry of the `verificationMethod` property. +You can also add verification relationships afterward using references. + +:::note + +Updates to the DID Document are done through the invocation of `Identity::execute_update` API by an `Identity`'s controller. +The public key or address of the controller does not need to be a verification method in the DID Document, +since the controller is authenticated through possession of a `ControllerCap` token. + +::: + +## Services + +[Services](https://www.w3.org/TR/did-core/#services) allow you to add other ways of communicating with the DID subject. +An endpoint included in the DID Document can offer a way of reaching services for different purposes +like authentication, communicating, and discovery. + +### Properties + +You can specify the following properties for a service: + +- **id**: A [DID URL](https://www.w3.org/TR/did-core/#did-url-syntax) for referencing the service in the DID document. You can specify it by setting the [fragment](https://www.w3.org/TR/did-core/#fragment). +- **type**: A string used to maximize interoperability between services. The framework does not perform any checks on the content of this string. +- **serviceEndpoint**: A URL that points to the service endpoint. + +## Create Identity + +Before you can update anything, you will need to [create an Identity](./create.mdx). + +<Tabs groupId="language" queryString> +<TabItem value="rust" label="Rust"> + +```rust + // Create a new client to interact with the IOTA ledger. + // create new client to interact with chain and get funded account with keys + let storage = get_memstorage()?; + let identity_client = get_client_and_create_account(&storage).await?; + // create new DID document and publish it + let (document, vm_fragment_1) = create_did_document(&identity_client, &storage).await?; + let did: IotaDID = document.id().clone(); +``` + +</TabItem> +</Tabs> + +This creates and publishes an Identity object containing a DID Document with one verification method. + +```json +{ + "doc": { + "id": "did:iota:tst:0x19ed80fbd2a644fc2347e27e46e09d42b89df9b1ba09ae41832a9d47d686776a", + "verificationMethod": [ + { + "id": "did:iota:tst:0x19ed80fbd2a644fc2347e27e46e09d42b89df9b1ba09ae41832a9d47d686776a#HZ11e0XacuODQw5FcoMHtcdxl8oXHbSnIhQMUgVzWBE", + "controller": "did:iota:tst:0x19ed80fbd2a644fc2347e27e46e09d42b89df9b1ba09ae41832a9d47d686776a", + "type": "JsonWebKey", + "publicKeyJwk": { + "kty": "OKP", + "alg": "EdDSA", + "kid": "HZ11e0XacuODQw5FcoMHtcdxl8oXHbSnIhQMUgVzWBE", + "crv": "Ed25519", + "x": "475CGLtezvySFMCHhx6hE9S97MIYMLb4B-pbVEHaCtY" + } + } + ] + }, + "meta": { + "created": "2023-11-16T20:40:03Z", + "updated": "2023-11-16T20:40:03Z", + } +} +``` + +## Add a Verification Method + +<Tabs groupId="language" queryString> +<TabItem value="rust" label="Rust"> + +```rust + // Insert a new Ed25519 verification method in the DID document. + let fragment_2: String = document + .generate_method( + &storage, + JwkMemStore::ED25519_KEY_TYPE, + JwsAlgorithm::EdDSA, + None, + MethodScope::VerificationMethod, + ) + .await?; +``` + +</TabItem> +</Tabs> + +This creates a new verification method that includes a newly generated Ed25519 public key. + +```json +{ + "doc": { + "id": "did:iota:tst:0x19ed80fbd2a644fc2347e27e46e09d42b89df9b1ba09ae41832a9d47d686776a", + "verificationMethod": [ + { + "id": "did:iota:tst:0x19ed80fbd2a644fc2347e27e46e09d42b89df9b1ba09ae41832a9d47d686776a#HZ11e0XacuODQw5FcoMHtcdxl8oXHbSnIhQMUgVzWBE", + "controller": "did:iota:tst:0x19ed80fbd2a644fc2347e27e46e09d42b89df9b1ba09ae41832a9d47d686776a", + "type": "JsonWebKey", + "publicKeyJwk": { + "kty": "OKP", + "alg": "EdDSA", + "kid": "HZ11e0XacuODQw5FcoMHtcdxl8oXHbSnIhQMUgVzWBE", + "crv": "Ed25519", + "x": "475CGLtezvySFMCHhx6hE9S97MIYMLb4B-pbVEHaCtY" + } + }, + { + "id": "did:iota:tst:0x19ed80fbd2a644fc2347e27e46e09d42b89df9b1ba09ae41832a9d47d686776a#yJz-sPlCmd432JKqK_hkiPml2kj22Jv0aAFy_2jJ8nE", + "controller": "did:iota:tst:0x19ed80fbd2a644fc2347e27e46e09d42b89df9b1ba09ae41832a9d47d686776a", + "type": "JsonWebKey", + "publicKeyJwk": { + "kty": "OKP", + "alg": "EdDSA", + "kid": "yJz-sPlCmd432JKqK_hkiPml2kj22Jv0aAFy_2jJ8nE", + "crv": "Ed25519", + "x": "h8ndZ4_Urmzf4xN4emqS8r5q4pAQvAh0k2YHq5JLBBo" + } + } + ] + }, + "meta": { + "created": "2023-11-16T20:40:03Z", + "updated": "2023-11-16T20:40:03Z", + } +} +``` + +## Add Verification Relationships + +You can attach verification relationships to a verification method by referencing its fragment. + +<Tabs groupId="language" queryString> +<TabItem value="rust" label="Rust"> + +```rust +// Attach a new method relationship to the inserted method. +document.attach_method_relationship( + &document.id().to_url().join(format!("#{fragment_2}"))?, + MethodRelationship::Authentication, +)?; +``` + +</TabItem> +</Tabs> + +This will add `Authentication` relationship to the verification method with the fragment `key-1`. +Note that `Authentication` references the already included `key-2` verification method: + +```json {12,19} +{ + "doc": { + "id": "did:iota:tst:0x19ed80fbd2a644fc2347e27e46e09d42b89df9b1ba09ae41832a9d47d686776a", + "verificationMethod": [ + { + "id": "did:iota:tst:0x19ed80fbd2a644fc2347e27e46e09d42b89df9b1ba09ae41832a9d47d686776a#HZ11e0XacuODQw5FcoMHtcdxl8oXHbSnIhQMUgVzWBE", + "controller": "did:iota:tst:0x19ed80fbd2a644fc2347e27e46e09d42b89df9b1ba09ae41832a9d47d686776a", + "type": "JsonWebKey", + "publicKeyJwk": { + "kty": "OKP", + "alg": "EdDSA", + "kid": "HZ11e0XacuODQw5FcoMHtcdxl8oXHbSnIhQMUgVzWBE", + "crv": "Ed25519", + "x": "475CGLtezvySFMCHhx6hE9S97MIYMLb4B-pbVEHaCtY" + } + }, + { + "id": "did:iota:tst:0x19ed80fbd2a644fc2347e27e46e09d42b89df9b1ba09ae41832a9d47d686776a#yJz-sPlCmd432JKqK_hkiPml2kj22Jv0aAFy_2jJ8nE", + "controller": "did:iota:tst:0x19ed80fbd2a644fc2347e27e46e09d42b89df9b1ba09ae41832a9d47d686776a", + "type": "JsonWebKey", + "publicKeyJwk": { + "kty": "OKP", + "alg": "EdDSA", + "kid": "yJz-sPlCmd432JKqK_hkiPml2kj22Jv0aAFy_2jJ8nE", + "crv": "Ed25519", + "x": "h8ndZ4_Urmzf4xN4emqS8r5q4pAQvAh0k2YHq5JLBBo" + } + } + ], + "authentication": [ + "did:iota:tst:0x19ed80fbd2a644fc2347e27e46e09d42b89df9b1ba09ae41832a9d47d686776a#yJz-sPlCmd432JKqK_hkiPml2kj22Jv0aAFy_2jJ8nE" + ] + }, + "meta": { + "created": "2023-11-16T20:40:03Z", + "updated": "2023-11-16T20:40:03Z", + } +} +``` + +## Add a Service + +You can also add custom properties can to a service by setting `properties`: + +<Tabs groupId="language" queryString> +<TabItem value="rust" label="Rust"> + +```rust + // Add a new Service. + let service: Service = Service::from_json_value(json!({ + "id": document.id().to_url().join("#linked-domain")?, + "type": "LinkedDomains", + "serviceEndpoint": "https://iota.org/" + }))?; + assert!(document.insert_service(service).is_ok()); + document.metadata.updated = Some(Timestamp::now_utc()); +``` + +</TabItem> +</Tabs> + +The updated Document with the newly created service looks as follows. + +```json {21-27} +{ + "doc": { + "id": "did:iota:tst:0x19ed80fbd2a644fc2347e27e46e09d42b89df9b1ba09ae41832a9d47d686776a", + "verificationMethod": [ + { + "id": "did:iota:tst:0x19ed80fbd2a644fc2347e27e46e09d42b89df9b1ba09ae41832a9d47d686776a#HZ11e0XacuODQw5FcoMHtcdxl8oXHbSnIhQMUgVzWBE", + "controller": "did:iota:tst:0x19ed80fbd2a644fc2347e27e46e09d42b89df9b1ba09ae41832a9d47d686776a", + "type": "JsonWebKey", + "publicKeyJwk": { + "kty": "OKP", + "alg": "EdDSA", + "kid": "HZ11e0XacuODQw5FcoMHtcdxl8oXHbSnIhQMUgVzWBE", + "crv": "Ed25519", + "x": "475CGLtezvySFMCHhx6hE9S97MIYMLb4B-pbVEHaCtY" + } + }, + { + "id": "did:iota:tst:0x19ed80fbd2a644fc2347e27e46e09d42b89df9b1ba09ae41832a9d47d686776a#yJz-sPlCmd432JKqK_hkiPml2kj22Jv0aAFy_2jJ8nE", + "controller": "did:iota:tst:0x19ed80fbd2a644fc2347e27e46e09d42b89df9b1ba09ae41832a9d47d686776a", + "type": "JsonWebKey", + "publicKeyJwk": { + "kty": "OKP", + "alg": "EdDSA", + "kid": "yJz-sPlCmd432JKqK_hkiPml2kj22Jv0aAFy_2jJ8nE", + "crv": "Ed25519", + "x": "h8ndZ4_Urmzf4xN4emqS8r5q4pAQvAh0k2YHq5JLBBo" + } + } + ], + "authentication": [ + "did:iota:tst:0x19ed80fbd2a644fc2347e27e46e09d42b89df9b1ba09ae41832a9d47d686776a#yJz-sPlCmd432JKqK_hkiPml2kj22Jv0aAFy_2jJ8nE" + ], + "service": [ + { + "id": "did:iota:tst:0x19ed80fbd2a644fc2347e27e46e09d42b89df9b1ba09ae41832a9d47d686776a#linked-domain", + "type": "LinkedDomains", + "serviceEndpoint": "https://iota.org/" + } + ] + }, + "meta": { + "created": "2023-11-16T20:40:03Z", + "updated": "2023-11-16T20:40:08Z", + } +} +``` + +## Remove a Verification Method + +You can also remove verification methods at any time using the following snippet: + +<Tabs groupId="language" queryString> +<TabItem value="rust" label="Rust"> + +```rust +// Remove a verification method. +let original_method: DIDUrl = document.resolve_method(fragment_1.as_str(), None).unwrap().id().clone(); +document.purge_method(&storage, &original_method).await.unwrap(); +``` + +</TabItem> +</Tabs> + +This removes the original verification method with the fragment `key-1`. + +```json +{ + "doc": { + "id": "did:iota:tst:0x19ed80fbd2a644fc2347e27e46e09d42b89df9b1ba09ae41832a9d47d686776a", + "verificationMethod": [ + { + "id": "did:iota:tst:0x19ed80fbd2a644fc2347e27e46e09d42b89df9b1ba09ae41832a9d47d686776a#yJz-sPlCmd432JKqK_hkiPml2kj22Jv0aAFy_2jJ8nE", + "controller": "did:iota:tst:0x19ed80fbd2a644fc2347e27e46e09d42b89df9b1ba09ae41832a9d47d686776a", + "type": "JsonWebKey", + "publicKeyJwk": { + "kty": "OKP", + "alg": "EdDSA", + "kid": "yJz-sPlCmd432JKqK_hkiPml2kj22Jv0aAFy_2jJ8nE", + "crv": "Ed25519", + "x": "h8ndZ4_Urmzf4xN4emqS8r5q4pAQvAh0k2YHq5JLBBo" + } + } + ], + "authentication": [ + "did:iota:tst:0x19ed80fbd2a644fc2347e27e46e09d42b89df9b1ba09ae41832a9d47d686776a#yJz-sPlCmd432JKqK_hkiPml2kj22Jv0aAFy_2jJ8nE" + ], + "service": [ + { + "id": "did:iota:tst:0x19ed80fbd2a644fc2347e27e46e09d42b89df9b1ba09ae41832a9d47d686776a#linked-domain", + "type": "LinkedDomains", + "serviceEndpoint": "https://iota.org/" + } + ] + }, + "meta": { + "created": "2023-11-16T20:40:03Z", + "updated": "2023-11-16T20:40:08Z", + } +} +``` + +## Full Example Code + +<Tabs groupId="language" queryString> +<TabItem value="rust" label="Rust"> + +```rust reference +https://github.com/iotaledger/identity.rs/blob/v1.6.0-alpha/examples/0_basic/1_update_did.rs +``` + +</TabItem> +</Tabs> diff --git a/docs/content/iota-identity/how-tos/domain-linkage/create-and-verify.mdx b/docs/content/iota-identity/how-tos/domain-linkage/create-and-verify.mdx new file mode 100644 index 00000000000..34b437cda69 --- /dev/null +++ b/docs/content/iota-identity/how-tos/domain-linkage/create-and-verify.mdx @@ -0,0 +1,167 @@ +--- +description: How to link a domain and a DID +sidebar_label: Create and Verify +image: /img/identity/icon.png +tags: + - how-to + - identity +--- + +# Domain Linkage + +:::info +To use Domain Linkage in Rust you have to enable the `domain-linkage` feature. +::: + +## Overview + +Domain Linkage can provide proof for a connection between a DID and a domain being controlled by the same entity. +This linkage can transfer trust from a domain to a DID and vice versa. +For instance, if an entity trusts a domain, it can also trust the linked DID and all documents signed by +the verification methods included in the DID Document. + +A use case could be a verifier that trusts `www.example.com`, and receives a verifiable presentation issued by `did:foo:abc`. +If `did:foo:abc` is linked to `www.example.com`, the verifier can trust that the verifiable presentation is issued by +the same entity controlling `www.example.com`. +The DIF has approved a [Well Known DID Configuration](https://identity.foundation/.well-known/resources/did-configuration/) draft to standardize this connection by introducing +the [DID Configuration Resource](https://identity.foundation/.well-known/resources/did-configuration/#did-configuration-resource) and the [Linked Domain Service Endpoint](https://identity.foundation/.well-known/resources/did-configuration/#linked-domain-service-endpoint). + +![Identity getting started](/img/iota-identity/domain-linkage-diagram.png) + +### DID Configuration Resource + +Suppose that a DID `did:foo:example` with the following DID Document only contains one `verificationMethod`, `key-1`: + +```json {5} +{ + "id": "did:foo:abc", + "verificationMethod": [ + { + "id": "did:foo:abc#key-1", + "controller": "did:foo:abc", + "type": "Ed25519VerificationKey2018", + "publicKeyMultibase": "zDShpHKXkcHKHcF8CnGAA1UqyyuEPRNz1XFEuggbWJQSq" + } + ] + }, +``` + +The domain `https://www.example.com` represents the same entity and needs to be linked to increase trust in the DID. + +To establish this link, you must create a [DID Configuration Resource](https://identity.foundation/.well-known/resources/did-configuration/#did-configuration-resource), +and make it available on the [DID Configuration URL](https://identity.foundation/.well-known/resources/did-configuration/#did-configuration-uri). +In this case it's `https://example.com/.well-known/did-configuration.json`. + +The [DID Configuration Resource](https://identity.foundation/.well-known/resources/did-configuration/#did-configuration-resource) is a JSON-LD object containing verifiable credentials called `Domain Linkage Credentials`. +Each credential represents a linkage to a single DID. + +:::note + +Note that one `DID Configuration Resource` can include multiple `Domain Linkage Credentials`, +effectively linking the same domain to multiple DIDs. + +::: + +In this example, the domain `https://www.example.com` needs to be linked to the DID `did:foo:abc`. +This means that the `DID Configuration Resource` will have one `Domain Linkage Credential`. +This credential must have the following properties: + +- Its `type` includes `DomainLinkageCredential`. +- It includes the DID Configuration context. +- The `credentialSubject` must be the DID `did:foo:abc` and references the domain `https://www.example.com`. +- The issuer is the DID itself `did:foo:abc`. +- It is signed by a key material included in the DID Document, in this case `did:foo:abc#key-1`. + +```json +{ + "@context": "https://identity.foundation/.well-known/did-configuration/v1", + "linked_dids": [ + { + "@context": [ + "https://www.w3.org/2018/credentials/v1", + "https://identity.foundation/.well-known/did-configuration/v1" + ], + "type": ["VerifiableCredential", "DomainLinkageCredential"], + "credentialSubject": { + "id": "did:foo:abc", + "origin": "https://www.example.com/" + }, + "issuer": "did:foo:abc", + "issuanceDate": "2023-02-09T22:14:15Z", + "expirationDate": "2024-02-09T22:14:15Z", + "proof": { + "type": "JcsEd25519Signature2020", + "verificationMethod": "did:foo:abc#key-1", + "signatureValue": "4SvYqo3YoArfW7r7qKfN7RUJdZnBteb166KE4UkX8MNdbp5UW6YbykneAzvjyRmf5EVQ9bnP9cS5sbEPUn2uaAcB" + } + } + ] +} +``` + +Now this `DID Configuration Resource` must be made available on `https://example.com/.well-known/did-configuration.json`, +which establishes the linkage. + +### Linked Domain Service Endpoint + +By having a domain, one can discover what DIDs are linked to it by fetching the `DID Configuration Resource` and +investigating the `Domain Linkage Credentials`. + +If you want to enable discovery from the other direction, that is, if you have a DID and want to discover which +domains are linked to it, you can add a [Linked Domain Service Endpoint](https://identity.foundation/.well-known/resources/did-configuration/#linked-domain-service-endpoint) to the DID Document. +The DID Document from this example will be extended as follows to enable discovery of `https://www.example.com`: + +```json {11-17} +{ + "id": "did:foo:abc", + "verificationMethod": [ + { + "id": "did:foo:abc#key-1", + "controller": "did:foo:abc", + "type": "Ed25519VerificationKey2018", + "publicKeyMultibase": "zDShpHKXkcHKHcF8CnGAA1UqyyuEPRNz1XFEuggbWJQSq" + } + ], + "service": [ + { + "id": "did:foo:abc#domain-linkage", + "type": "LinkedDomains", + "serviceEndpoint": "https://www.example.com/" + } + ] +} +``` + +:::note +Note that a DID Document can have multiple `Linked Domain Services` and each service can link to multiple domains. +::: + +### Verifying a DID and Domain Linkage + +As mentioned above, you can discover the Domain Linkage from either direction. +However, verifying the linkage in both cases involves only verifying the DID Configuration Resource. +The process is as follows: + +1. Fetch `DID Configuration Resource` from `https://www.example.com/.well-known/did-configuration.json`. +2. Resolve the DID Document of `did:foo:abc`. +3. Verify the `DID Configuration Resource` and its `Domain Linkage Credential` that references `did:foo:abc`. + + +:::tip About DID Configuration Resource Verification + +You can learn more +[about DID Configuration Resource Verification on the Identity Foundation website](https://identity.foundation/.well-known/resources/did-configuration/#did-configuration-resource-verification). + +::: + +## Example Code + +<Tabs groupId="language" queryString> +<TabItem value="rust" label="Rust"> + +```rust reference +https://github.com/iotaledger/identity.rs/blob/v1.6.0-alpha/examples/1_advanced/6_domain_linkage.rs +``` + +</TabItem> +</Tabs> diff --git a/docs/content/iota-identity/how-tos/key-storage.mdx b/docs/content/iota-identity/how-tos/key-storage.mdx new file mode 100644 index 00000000000..2116166089c --- /dev/null +++ b/docs/content/iota-identity/how-tos/key-storage.mdx @@ -0,0 +1,133 @@ +--- +title: Key Storage +sidebar_label: Key Storage +description: Explain the use of the storage interfaces and how they can be implemented +image: /img/identity/icon.png +tags: + - how-to + - identity +--- + + +## Introduction + +The `JwkDocumentExt` API allows you to modify a DID document, for example, adding new verification methods. +It enables storing the secrets that verification methods represent securely. +It does so using the two storage interfaces, the `JwkStorage` and `KeyIdStorage`. +We refer to both of these as the **key storage**. + +The main idea behind the key storage is strongly inspired by the architecture of key management systems (KMS) +or secure enclaves: once private keys are entered into the system, they can never be retrieved again. +Instead, all operations using the key will have to go through that system. + +This approach allows the key storage to be architected more securely than simply storing and loading private keys from +a regular database. +Of course, security is directly dependent on the concrete implementation, +which is why we provide [Stronghold](https://github.com/iotaledger/stronghold.rs/), a best-effort in-software enclave, by default. + +However, there are cases where one cannot use `Stronghold`, +or may want to integrate key management of identities into their own KMS or similar, +which is why the key storage is an abstraction over such systems. +Any implementation of a key storage can be used by the `JwkDocumentExt` API. + +The two interfaces making up the key storage have two respective responsibilities. + +:::info + +Even though there are two separate interfaces, you can implement them using the same backing storage. + +::: + +## Function Overview + +A brief overview of those functions: + +- `JwkStorage`: CRUD and signing operations on [JSON Web Keys](https://www.rfc-editor.org/rfc/rfc7517). + - `generate`: Generate a new key represented as a JSON Web Key. + - `insert`: Insert an existing JSON Web Key into the storage. + - `sign`: Signs the provided data using the stored private key. + - `delete`: Permanently deletes a key. + - `exists`: Returns whether a key exists. +- `KeyIdStorage`: Stores the mappings from verification methods to their corresponding key identifier in the `JwkStorage`. + - `insert_key_id`: Inserts a mapping from a verification method identifier to a key identifier. + - `get_key_id`: Returns the key identifier for a given verification method identifier. + - `delete_key_id`: Deletes a mapping. + +## Key Identifier + +A `JwkStorage` stores and operates on keys, so they must be identified. +In general, Key Management Systems use some form of an identifier for their keys. +To abstract over those, the `JwkStorage` interface has a general-purpose `KeyId` type, +which is effectively a wrapper around a string. + +A `KeyIdStorage` is needed to store the key id that represents the private key for a given verification method. +To that end, a verification method itself must be identified. + +While within a document, each fragment must be unique, the same is not true given multiple documents, +so we cannot rely only on fragments if we don't want to partition the `KeyIdStorage` by DID. +The solution to this is using a `MethodDigest`, a hash over a verification method. + +When following best security practices, each verification method has its own associated key and, thus, a unique public key. +That, plus the fragment of a method, ensures the `MethodDigest` is unique. + +So, in essence, a `JwkStorage` stores a `KeyId -> JWK` mapping while a `KeyIdStorage` stores a `MethodDigest -> KeyId` mapping. + +:::caution + +Given the construction and limitations of the method digest, +no two documents should contain a method that shares both the same fragment and public key. +This should not happen under typical circumstances, but it is good to keep it in mind. + +::: + +## Key Types + +To express what key types a given `JwkStorage` implementation supports, you should use the `KeyType`, +which is another simple wrapper around a string. + +The reason for this design might seem odd in Rust, given the existence of associated types. +This more simplistic design is necessary to accommodate implementing the interface via the bindings to the library. + +Implementations are expected to export constants of the key types they support, +so users have an easy way to discover the supported types. +In general, storage implementations are free to support any [JSON Web Algorithm](https://www.rfc-editor.org/rfc/rfc7518.html)-compatible key. +However, the recommended default used by IOTA Identity is the `EdDSA` algorithm with curve `Ed25519`. + +## Implementation + +The IOTA Identity library ships two implementations of key storage. +The `JwkMemStore` and `KeyIdMemstore` are insecure in-memory implementations +intended as example implementations and for testing. + +The default key storage implementation is `Stronghold`, +which is an example of a storage that implements both storage interfaces simultaneously. +[`Stronghold`](https://github.com/iotaledger/stronghold.rs/) may be interesting for implementers to look at, +as it needs to deal with some challenges the in-memory version does not have to deal with. Note that the `Stronghold` implementation is only available in Rust. + +## Examples + +This section shows the Rust `Memstore` implementation. + +### `JwkMemStore` + +<Tabs groupId="language" queryString> +<TabItem value="rust" label="Rust"> + +```rust reference +https://github.com/iotaledger/identity.rs/blob/v1.6.0-alpha/identity_storage/src/key_storage/memstore.rs +``` + +</TabItem> +</Tabs> + +### `KeyIdMemstore` + +<Tabs groupId="language" queryString> +<TabItem value="rust" label="Rust"> + +```rust reference +https://github.com/iotaledger/identity.rs/blob/v1.6.0-alpha/identity_storage/src/key_id_storage/memstore.rs +``` + +</TabItem> +</Tabs> diff --git a/docs/content/iota-identity/how-tos/verifiable-credentials/create.mdx b/docs/content/iota-identity/how-tos/verifiable-credentials/create.mdx new file mode 100644 index 00000000000..3862af479cb --- /dev/null +++ b/docs/content/iota-identity/how-tos/verifiable-credentials/create.mdx @@ -0,0 +1,117 @@ +--- +title: Create a Verifiable Credential +sidebar_label: Create and Sign +description: Explain how a VC is created and verified +image: /img/identity/icon.png +tags: + - how-to + - identity + - verifiable-credentials +--- + +A [Verifiable Credential (VC)](./../../explanations/verifiable-credentials.mdx) can represent all +information that a physical credential represents, such as a passport or university +degree. However, by allowing other parties to cryptographically verify the authorship +and integrity of the claims, verifiable credentials can be seen as more tamper-evident +and more trustworthy than their physical counterparts. + +## Verifiable Credential Properties + +In the IOTA Identity Framework, you can create a Verifiable Credential with the following properties: + +- [**Context**](https://www.w3.org/TR/vc-data-model/#contexts): List of JSON-LD context URIs. Includes `"https://www.w3.org/2018/credentials/v1"` by default. +- [**Types**](https://www.w3.org/TR/vc-data-model/#types): List of types describing the credential. Includes `"VerifiableCredential"` by default. +- [**Subject**](https://www.w3.org/TR/vc-data-model/#credential-subject): The issuer's claims; a set of objects that contain one or more properties that are each related to a subject. +- [**Issuer**](https://www.w3.org/TR/vc-data-model/#issuer): The identifier of the issuer, typically their [DID](../../explanations/decentralized-identifiers.mdx). +- [**ID**](https://www.w3.org/TR/vc-data-model/#identifiers): Optional URI identifier for the credential. +- [**Issuance Date**](https://www.w3.org/TR/vc-data-model/#issuance-date): Timestamp for expressing the date and time when a credential becomes valid. +- [**Expiration Date**](https://www.w3.org/TR/vc-data-model/#expiration): Optional timestamp for expressing the date and time when a credential ceases to be valid. +- [**Status**](https://www.w3.org/TR/vc-data-model/#status): Optional information used to determine the current status of a credential, i.e. whether or not it has been [revoked](./revocation.mdx). +- [**Schema**](https://www.w3.org/TR/vc-data-model/#data-schemas): Optional list of objects specifying the schema that the data must conform to. +- [**Refresh Service**](https://www.w3.org/TR/vc-data-model/#refreshing): Optional link to a service where the recipient may refresh the included credentials. +- [**Terms of Use**](https://www.w3.org/TR/vc-data-model/#terms-of-use): Optional list of policies defining obligations, prohibitions, or permissions of the presentation recipient. +- [**Evidence**](https://www.w3.org/TR/vc-data-model/#evidence): Optional list of objects that can be used by the issuer to provide the verifier with additional supporting information in a verifiable credential. +- [**Non-Transferable**](https://www.w3.org/TR/vc-data-model/#nontransferable-property): Optional flag that indicates that a verifiable credential must only be encapsulated in a [verifiable presentation](./../../explanations/verifiable-presentations.mdx) whose proof was issued by the credential subject. + + + + +## Signing + +After preparing the verifiable credential, the issuer creates a signed JWT containing VC in the claims using one of their private keys. This is what allows verifiers to validate the credential independently using the corresponding public key from the issuer's DID Document. + +## Validation + +Verifiers should ensure certain credential properties are valid when receiving one or more in a [verifiable presentation](./../../explanations/verifiable-presentations.mdx). Both issuers and holders may also wish to validate their credentials, particularly directly after creating or receiving one. Validation may be performed at any point in time and can be a useful way of checking whether a credential has expired or been revoked. + +### Validation Checks + +The IOTA Identity Framework supports the following checks during credential validation: + +- **Semantic structure**: Ensures the credential adheres to the specification. +- **Signature**: Verifies the JWS against the issuer's DID Document. +- **Optional validations**: Additional checks on credential properties, and the signature can be configured by specifying [Validation Options](#validation-options). + +### Validation Options + +These options specify conditions that specific properties in a credential must satisfy. + +- **Expiration Date**: Check that the [`expirationDate`](https://www.w3.org/TR/vc-data-model/#expiration) property, if present, is not before a specific date-time. Defaults to the current datetime if unset. +- **Issuance Date**: Check that [`issuanceDate`](https://www.w3.org/TR/vc-data-model/#issuance-date) property, if present, is not after a specific date-time. Defaults to the current datetime if unset. +- **Verifier Options**: Validates aspects of the credential signature. + +## Sharing Verifiable Credentials + +A [verifiable presentation](./../../explanations/verifiable-presentations.mdx) is the recommended data format for sharing one or more verifiable credentials, +as it provides cryptographic means of proving the DID of the holder presenting them, +and for enforcing [subject-holder relationships](https://www.w3.org/TR/vc-data-model/#subject-holder-relationships). + +## Example + +The following code showcases how an issuer can [create, sign](#create-and-sign-a-vc), +and [validate](#validate-a-vc) a verifiable credential. +In this example, the issuer signs a `UniversityDegreeCredential` with Alice's name and DID. + +### Create and Sign a VC + + +<div className={'hide-code-block-extras'}> +<Tabs groupId="language" queryString> +<TabItem value="rust" label="Rust"> + +```rust reference +https://github.com/iotaledger/identity.rs/blob/v1.6.0-alpha/examples/0_basic/5_create_vc.rs#L36-L74 +``` + +</TabItem> +</Tabs> +</div> + +### Validate a VC + +<div className={'hide-code-block-extras'}> +<Tabs groupId="language" queryString> +<TabItem value="rust" label="Rust"> + +```rust reference +https://github.com/iotaledger/identity.rs/blob/v1.6.0-alpha/examples/0_basic/5_create_vc.rs#L80-L88 +``` + +</TabItem> +</Tabs> +</div> + +This Verifiable Credential can be [verified by anyone](./../../explanations/verifiable-presentations.mdx), +allowing Alice to take control of it and share it with anyone. + +### Full Example Code + +<Tabs groupId="language" queryString> +<TabItem value="rust" label="Rust"> + +```rust reference +https://github.com/iotaledger/identity.rs/blob/v1.6.0-alpha/examples/0_basic/5_create_vc.rs +``` + +</TabItem> +</Tabs> diff --git a/docs/content/iota-identity/how-tos/verifiable-credentials/revocation.mdx b/docs/content/iota-identity/how-tos/verifiable-credentials/revocation.mdx new file mode 100644 index 00000000000..05e69cfdc62 --- /dev/null +++ b/docs/content/iota-identity/how-tos/verifiable-credentials/revocation.mdx @@ -0,0 +1,174 @@ +--- +sidebar_label: Revoke +description: Explain how a VC can be revoked +image: /img/identity/icon.png +tags: + - how-to + - identity + - verifiable-credentials +--- + + +# Revoke a Verifiable Credential + +The [example](#full-example-code) below demonstrates two methods that an issuer can use to revoke a verifiable credential +using the IOTA Identity Framework: + +1. By using the [`credentialStatus`](https://www.w3.org/TR/vc-data-model/#status) field in a credential and linking + to a [revocation method](#revocation-methods). +2. By [removing the verification method](#removing-the-verification-method) that signed the credential. + This invalidates all credentials that were signed with that verification method. + +## Revocation methods + +The IOTA Identity Framework supports two different revocation methods: `RevocationBitmap2022` and `StatusList2021`. + +### Revocation Bitmap + +[RevocationBitmap2022](../../../references/iota-identity/revocation-bitmap-2022.mdx) is the default credential revocation method used in the IOTA Identity Framework. It allows +issuers to control whether a credential is _valid_ or _revoked_. To do so, a revocation list (represented +as a bitmap) is stored in the issuer's DID document. +When a credential is issued, a unique index from the issuer's revocation list +is chosen, linking the credential's status to the value of the list entry. To change the status of a credential, the issuer +simply updates the corresponding entry in its revocation list. + +With `RevocationBitmap2022` the `identity.rs` library completely handles the processes required to handle credentials revocation; +from creation and storage of the revocation list to its lookup. +This makes `RevocationBitmap2022` the preferred way for users to handle credential revocation, but it requires sufficient +funds to rent out the required on-tangle space. + +:::note + +DLT's size constraints limit the size of the revocation list. With the assumption of only one such revocation list +per the issuer's DID document, one may expect to be able to handle roughly 50k entries. + +::: + +<Tabs groupId="language" queryString> +<TabItem value="rust" label="Rust"> + +```rust reference +https://github.com/iotaledger/identity.rs/tree/v1.6.0-alpha/examples/0_basic/7_revoke_vc.rs#L132 +``` + +</TabItem> +</Tabs> + +If the binary value of the index in the bitmap is 1 (one), the verifiable credential is revoked, +if it is 0 (zero) it is not revoked. + +For example, with this approach the issuer adds an index to a credential in the `credentialStatus` field, such as `"5"`. +This part of the credential might then look like this: + +```json +"credentialStatus": { + "id": "did:iota:EvaQhPXXsJsGgxSXGhZGMCvTt63KuAFtaGThx6a5nSpw#revocation", + "type": "RevocationBitmap2022", + "revocationBitmapIndex": "5" +}, +``` + +The verifier uses the `id` field (`did:iota:EvaQhPXXsJsGgxSXGhZGMCvTt63KuAFtaGThx6a5nSpw#revocation`) to look up the +service in the issuer's DID document: + +```json +{ + "id": "did:iota:EvaQhPXXsJsGgxSXGhZGMCvTt63KuAFtaGThx6a5nSpw#revocation", + "type": "RevocationBitmap2022", + "serviceEndpoint": "data:application/octet-stream;base64,ZUp5ek1tQmdZR1NBQUFFZ1ptVUFBQWZPQUlF" +} +``` + +During verification, the verifier decodes the revocation bitmap embedded in the `data` URL. +This bitmap written as a bitstring looks like this: `000001`. +Here, the 5th bit is set, which means the credential with that index is revoked, +while all other credentials aren't revoked. + +### StatusList2021 + +[StatusList2021](https://www.w3.org/TR/2023/WD-vc-status-list-20230427) offers similar functionalities to `RevocationBitmap2022` +but in a more flexible and scalable way. +The main difference is that `StatusList2021` is completely agnostic in regards to how the issuer's status list +is stored and fetched, as long as its location can be encoded through a URL. For instance, the status list +can be made available over HTTP (e.g. `https://example.com/credentials/status`) or through the +Interplanetary File System (e.g. `ipfs://QmXDWGdVBhbDoXXzKNMhJk5ejnZgxpMBVzW4EhQaHPD3Mi`). + +This flexibility, although it requires the issuer to manually fetch and update its status list, allows for an arbitrary number of +entries in the status list, in contrast with `RevocationBitmap2022`, where the length of the list is limited by the DLT's constraints. + +Furthermore, `StatusList2021` introduces a new credential state: _suspended_. Suspended credentials are credentials that a validator will not accept as _valid_, but that might become valid again in the future. Instead, _revoked_ credentials **cannot** ever +be valid again, as the _revoked_ state is irreversible. + +<Tabs groupId="language" queryString> +<TabItem value="rust" label="Rust"> + +```rust reference +https://github.com/iotaledger/identity.rs/tree/v1.6.0-alpha/examples/1_advanced/8_status_list_2021.rs#L57-L61 +``` + +</TabItem> +</Tabs> + +First, an issuer creates a credential that encodes a certain status list, specifying its purpose (either `revocation` or `suspension`) +and the location at which it will be available (`https://example.com/credentials/status` in this case). After creation, the issuer +must make the credential available at the chosen URL so that verifiers can fetch it. + +Upon issuing a credential, to revoke it or suspend it later, the issuer sets the `credentialStatus` field, linking +to an entry in its status list. The snippet below shows what `credentialStatus` would look like when linking to the previously created +status list credential. + +```json +{ + "id": "https://example.com/credentials/status#94567", + "type": "StatusList2021Entry", + "statusPurpose": "revocation", + "statusListIndex": "94567", + "statusListCredential": "https://example.com/credentials/status" +} +``` + +<Tabs groupId="language" queryString> +<TabItem value="rust" label="Rust"> + +```rust reference +https://github.com/iotaledger/identity.rs/tree/v1.6.0-alpha/examples/1_advanced/8_status_list_2021.rs#L144 +``` + +</TabItem> +</Tabs> + +To set the status of a credential, the issuer retrieves the status list credential and sets the value of the chosen entry index. + +## Removing the Verification Method + +A less efficient alternative is to remove the verification method that signed the credential from the DID Document of +the issuer. +This means the VC can no longer be validated. + +However, this will also invalidate every VC signed with that verification method, +meaning that the issuer will have to sign every VC with a different key to retain +precise control over which credential is revoked. + +<Tabs groupId="language" queryString> +<TabItem value="rust" label="Rust"> + +```rust reference +https://github.com/iotaledger/identity.rs/tree/v1.6.0-alpha/examples/0_basic/7_revoke_vc.rs#L159-L166 +``` + +</TabItem> +</Tabs> + +## Full Example Code + +The following code exemplifies how you can revoke a [Verifiable Credential (VC)](../../explanations/verifiable-credentials.mdx). + +<Tabs groupId="language" queryString> +<TabItem value="rust" label="Rust"> + +```rust reference +https://github.com/iotaledger/identity.rs/tree/v1.6.0-alpha/examples/0_basic/7_revoke_vc.rs +``` + +</TabItem> +</Tabs> diff --git a/docs/content/iota-identity/how-tos/verifiable-credentials/selective-disclosure.mdx b/docs/content/iota-identity/how-tos/verifiable-credentials/selective-disclosure.mdx new file mode 100644 index 00000000000..9236270d117 --- /dev/null +++ b/docs/content/iota-identity/how-tos/verifiable-credentials/selective-disclosure.mdx @@ -0,0 +1,131 @@ +--- +sidebar_label: Selective Disclosure +description: Explain VC with selective disclosure. +image: /img/identity/icon.png +tags: + - how-to + - identity + - verifiable-credentials +--- + + +# Selective Disclosure (SD-JWT) + + +Holders of verifiable credentials may prefer to keep all the information contained within the credential private from a verifier. Instead, they may opt only to share a specific subset of the properties included in the VC. The identity library implements the [IETF Specifications](https://www.ietf.org/archive/id/draft-ietf-oauth-selective-disclosure-jwt-07.html), which outlines a mechanism to enable the selective disclosure of individual properties within the JSON object of JWT claims. + +## Concept + +### Issuance + +During the issuance process, the issuer replaces a subset of the fields in a credential with digests of their salted values and creates a signed JWT. Next, JWT, alongside the plain text disclosures and the salt used for digest creation are sent to the holder. + +### Presentation + +At this stage, the holder can selectively choose which fields to disclose to the verifier. The disclosures are sent in plain text, with the JWT containing the digests to the verifier. + +:::note +Only values replaced by digests through the issuer can be selectively disclosed. The holder **can not** conceal values provided in plain text in the JWT claims. +::: + + +### Validation + +With these values and a valid signature, the verifier is able to reconstruct a Verified Credential (VC) that exclusively contains the information the holder intended to disclose. + +## How It Works + +A SD JWT can be constructed from the following JWT claim of an address credential in accordance with the [VC Data Model v1.1](https://www.w3.org/TR/vc-data-model/#json-web-token): + + +```json +{ + "iss": "did:iota:tst:0x899d07a766f93c2af1a19a3f4583ad338fc94c5d84b6afcadf49b197e1cb693e", + "jti": "https://example.com/credentials/3732", + "nbf": 1705925652, + "sub": "did:iota:tst:0x6c045e1f658197b432cfc7c66350b8781dca50f820e9de0fcdf0029b4b384355", + "vc": { + "@context": "https://www.w3.org/2018/credentials/v1", + "credentialSubject": { + "address": { + "country": "DE", + "locality": "Maxstadt", + "postal_code": "12344", + "street_address": "Weidenstraße 22" + }, + "name": "Alice" + }, + "type": [ + "VerifiableCredential", + "AddressCredential" + ] + } +} + +``` + +The issuer makes the values of "locality", "postal_code", and "street_address" selectively disclosable, giving the holder the freedom to select what details of the address to be disclosed and presented. + +```json +{ + "_sd_alg": "sha-256", + "iss": "did:iota:tst:0x899d07a766f93c2af1a19a3f4583ad338fc94c5d84b6afcadf49b197e1cb693e", + "jti": "https://example.com/credentials/3732", + "nbf": 1705925652, + "sub": "did:iota:tst:0x6c045e1f658197b432cfc7c66350b8781dca50f820e9de0fcdf0029b4b384355", + "vc": { + "@context": "https://www.w3.org/2018/credentials/v1", + "credentialSubject": { + "address": { + "_sd": [ + "8Dai0-GMZgkzmdryGzjYufUaRFkiNWzVsJJdWucwu84", + "jemTNaG_wiHauwmwWiWREsirAlr91qugPds4MA8e2xo", + "iakC9Dfe2r9fGnOaAr_pGg1b7CwITBjcwE7-O7WlMnY" + ], + "country": "DE" + }, + "name": "Alice" + }, + "type": [ + "VerifiableCredential", + "AddressCredential" + ] + } +} +``` + +:::note +The digests are contained in the `_sd` property in `address`. This allows both keys and values to be concealed. +::: + +For further details, see the [example](#full-example-code) below and the [sd-jwt-payload crate](https://github.com/iotaledger/sd-jwt-payload). + +## Presentation format + +The SD-JWT is presented in the following [format](https://www.ietf.org/archive/id/draft-ietf-oauth-selective-disclosure-jwt-07.html#section-5): + +> `<Issuer-signed JWT>~<Disclosure 1>~<Disclosure 2>~...~<Disclosure N>~<optional KB-JWT>` + +## Key Binding JWT + +When a verifier receives an SD-JWT, it may be desirable to verify that the presenter's identity matches the holder of the Credential. For that purpose, a [Key Binding JWT (KB-JWT)](https://www.ietf.org/archive/id/draft-ietf-oauth-selective-disclosure-jwt-07.html#section-4.3) can be used. + + +- The verifier sends a nonce to the holder. +- The holder creates a JWT containing the nonce and the digest of the issuer-signed JWT and the disclosures 1→N. +- The holder sends the KB-JWT to the verifier as a part of the presentation. +- By verifying the KB-JWT, the verifier ensures the identity of the holder, the integrity of the data, the freshness of the signature, and the intended audience. + + + +## Full Example Code + +<Tabs groupId="language" queryString> +<TabItem value="rust" label="Rust"> + +```rust reference +https://github.com/iotaledger/identity.rs/blob/v1.6.0-alpha/examples/1_advanced/7_sd_jwt.rs +``` + +</TabItem> +</Tabs> diff --git a/docs/content/iota-identity/how-tos/verifiable-credentials/zero-knowledge-selective-disclosure.mdx b/docs/content/iota-identity/how-tos/verifiable-credentials/zero-knowledge-selective-disclosure.mdx new file mode 100644 index 00000000000..c18ceb0eac3 --- /dev/null +++ b/docs/content/iota-identity/how-tos/verifiable-credentials/zero-knowledge-selective-disclosure.mdx @@ -0,0 +1,121 @@ +--- +sidebar_label: Zero Knowledge Selective Disclosure +description: Zero Knowledge selectively disclosable VCs. +image: /img/identity/icon.png +tags: + - how-to + - identity + - verifiable-credentials + - zk +--- + + +# Zero Knowledge Selective Disclosure (ZK-SD-VCs) +ZK-SD-VCs allow holders to verify their VCs without having to disclose the entire VC's claim set to verifiers. +This is done through the creation of a Zero Knowledge Proof (ZKP) that guarantees the integrity and authenticity +of the VC, even when only partially disclosed to the verifier. + +:::note +Although ZK-SD-VCs offer similar functionalities to [SD-JWT VCs](selective-disclosure.mdx) - at least on a high level - they rely on completely different +concepts and security concerns. For a user, the most notable difference is the shifted capability of choosing which fields can +be concealed from a verifier. For ZK-SD-VCs it's the holder that has total control over which parts of the credential can be +undisclosed, whereas for SD-JWT VCs it's the issuer that decides which fields may be concealed by the holder. +::: + +## Concepts +### Issuance +The issuer of a ZK-SD-VC creates the credential, signs it using the [BBS+](https://www.ietf.org/archive/id/draft-irtf-cfrg-bbs-signatures-05.html) signature scheme +and sends both the credential and the signature to the holder. To facilitate this process, the credential is first encoded +as a [JSON Proof Token](https://www.ietf.org/archive/id/draft-ietf-jose-json-proof-token-02.html) (JPT), which is then used as the payload of a +[JSON Web Proof](https://www.ietf.org/archive/id/draft-ietf-jose-json-web-proof-02.html) (JWP) and sent to the holder as JPT. +:::note +JWPs and JPTs can be reasoned about as the Zero Knowledge (ZK) based counterparts of JWSs and JWTs. +::: +In code, this process would look like the following snippet: +<Tabs groupId="language" queryString> +<TabItem value="rust" label="Rust"> + +```rust reference +https://github.com/iotaledger/identity.rs/tree/v1.6.0-alpha/examples/1_advanced/9_zkp.rs#L95-L122 +``` + +</TabItem> +</Tabs> + + +Note how the VC issuer makes no prescription whatsoever regarding the disclosability of the VC's fields. + +### Holder presentation + +Once the holder receives a presentation challenge from a verifier, they construct a selective disclosure presentation for the requested credential +and send it back for verification. For this process the JWP in possession of the holder undergoes a transformation that allows the holder +to conceal any fields from the credentials claims through the creation of a Zero Knowledge Proof (ZKP) of the issuer's signature and becomes a _presented JWP_. +The proof value depends on the selected [JSON Proof Algorithm](https://www.ietf.org/archive/id/draft-ietf-jose-json-proof-algorithms-02.html) (JPA). + +<Tabs groupId="language" queryString> + +<TabItem value="rust" label="Rust"> + +```rust reference +https://github.com/iotaledger/identity.rs/tree/v1.6.0-alpha/examples/1_advanced/9_zkp.rs#L177-L203 +``` + +</TabItem> +</Tabs> + +Here's an example presented JWP in its JPT JSON serialization format where the undisclosed values are replaced by `null`: +``` +{ + "payloads": [ + null, + "IkpheSI", + null, + "NDI" + ], + "issuer": "eyJpc3MiOiJodHRwczovL2lzc3Vlci50bGQiLCJjbGFpbXMiOlsiZmFt + aWx5X25hbWUiLCJnaXZlbl9uYW1lIiwiZW1haWwiLCJhZ2UiXSwidHlwIjoiSlBUIiw + icHJvb2ZfandrIjp7ImNydiI6IlAtMjU2Iiwia3R5IjoiRUMiLCJ4IjoiYWNiSVFpdU + 1zM2k4X3VzekVqSjJ0cFR0Uk00RVUzeXo5MVBINkNkSDJWMCIsInkiOiJfS2N5TGo5d + ldNcHRubUt0bTQ2R3FEejh3Zjc0STVMS2dybDJHekgzblNFIn0sInByZXNlbnRhdGlv + bl9qd2siOnsiY3J2IjoiUC0yNTYiLCJrdHkiOiJFQyIsIngiOiJvQjFUUHJFX1FKSUw + 2MWZVT09LNURwS2dkOGoyemJaSnRxcElMRFRKWDZJIiwieSI6IjNKcW5ya3VjTG9ia2 + RSdU9xWlhPUDlNTWxiRnllbkZPTHlHbEctRlBBQ00ifSwiYWxnIjoiU1UtRVMyNTYif + Q", + "proof": "LJMiN6caEqShMJ5jPNts8OescqNq5vKSqkfAdSuGJA1GyJyyrfjkpAG0c + DJKZoUgomHu5MzYhTUsa0YRXVBnMB91RjonrnWVsakfXtfm2h7gHxA_8G1wkB09x09k + on2eK9gTv4iKw4GP6Rh02PEIAVAvnhtuiShMnPqVw1tCBdhweWzjyxJbG86J7Y8MDt2 + H9f5hhHIwmSLwXYzCbD37WmvUEQ2_6whgAYB5ugSQN3BjXEviCA__VX3lbhH1RVc27E + YkRHdRgGQwWNtuExKz7OmwH8oWizplEtjWJ5WIlJpee79gQ9HTa2QIOT9bUDvjjkkO- + jK_zuDjZwh5MkrcaQ", + "presentation": "eyJub25jZSI6InVURUIzNzFsMXB6V0psN2FmQjB3aTBIV1VOaz + FMZS1iQ29tRkx4YThLLXMifQ" +} +``` + +### Verification + +The verifier decodes the received JPT presentation and asserts the validity of the ZKP it contains, thus proving the +authenticity and integrity of the presented credential, without knowledge of any of the undisclosed fields and of the issuer signature. + +<Tabs groupId="language" queryString> + +<TabItem value="rust" label="Rust"> + +```rust reference +https://github.com/iotaledger/identity.rs/tree/v1.6.0-alpha/examples/1_advanced/9_zkp.rs#L225-L237 +``` + +</TabItem> +</Tabs> + +## Full Example Code + +<Tabs groupId="language" queryString> +<TabItem value="rust" label="Rust"> + +```rust reference +https://github.com/iotaledger/identity.rs/tree/v1.6.0-alpha/examples/1_advanced/9_zkp.rs +``` + +</TabItem> +</Tabs> diff --git a/docs/content/iota-identity/how-tos/verifiable-presentations/create-and-validate.mdx b/docs/content/iota-identity/how-tos/verifiable-presentations/create-and-validate.mdx new file mode 100644 index 00000000000..7aff05427ca --- /dev/null +++ b/docs/content/iota-identity/how-tos/verifiable-presentations/create-and-validate.mdx @@ -0,0 +1,107 @@ +--- +sidebar_label: Create and Validate +description: Explain how a VP is created and verified +image: /img/identity/icon.png +tags: + - how-to + - identity +--- + +# Create and Validate Verifiable Presentations + +The IOTA Identity Framework enables holders to easily construct +[verifiable presentations](./../../explanations/verifiable-presentations.mdx). +As demonstrated in the [example](#example-code), +holders only need to pass in their credentials to create a JWT presentation. + +## Properties + +You can specify the following properties in a presentation: + +- [**ID**](https://www.w3.org/TR/vc-data-model/#identifiers): Optional URI identifier for the presentation. +- [**Context**](https://www.w3.org/TR/vc-data-model/#contexts): List of JSON-LD context URIs. Includes `"https://www.w3.org/2018/credentials/v1"` by default. +- [**Types**](https://www.w3.org/TR/vc-data-model/#types): List of types describing the presentation. Includes `"VerifiablePresentation"` by default. +- [**Credentials**](https://www.w3.org/TR/vc-data-model/#dfn-verifiable-credentials): List of verifiable credentials to present. +- [**Holder**](https://www.w3.org/TR/vc-data-model/#dfn-holders): Optional URI, typically a DID, of the entity that generated the presentation. +- [**Refresh Service**](https://www.w3.org/TR/vc-data-model/#refreshing): Optional link to a service where the recipient may refresh the included credentials. +- [**Terms of Use**](https://www.w3.org/TR/vc-data-model/#terms-of-use): Optional list of policies defining obligations, prohibitions, or permissions of the presentation recipient. + +Of the above, **only the list of credentials is required** when creating a presentation using the framework. +However, the holder property should be included to satisfy [subject-holder relationship](#subject-holder-relationship) checks during validation. + +After creation, the holder signs the verifiable presentation using a private key linked to one of the verification +methods in their DID Document and transmits it to a verifier for validation. + +## Creation and Validation + +A Verifiable Presentation can be issued as a JWT that provides data integrity, +and also proves the [DID](../../explanations/decentralized-identifiers.mdx) of the holder. + +:::note + +Verifiers should always send a challenge +to [mitigate replay attacks](./../../explanations/verifiable-presentations.mdx#security-considerations). +::: + + +The IOTA Identity Framework provides several options for verifiers to validate various sections of a verifiable presentation. +See the [example](#example-code) for a demonstration of how to validate a presentation. + +The framework checks: + +- **Semantic structure**: Ensures the presentation and its credentials adhere to the specification. +- **Presentation proof**: Verifies the presentation signature against the holder's DID document. +- **Credential proofs**: Verifies the credential signatures against the DID Documents of their respective issuers. + + +Currently, the following are **not** checked automatically: + +- **Data schemas**: Credentials that specify a [schema](https://www.w3.org/TR/vc-data-model/#data-schemas) property +should be examined to ensure conformance. +- **Fitness for purpose**: Whether the credentials in a presentation and the data within them are acceptable and +valid depends on the context in which they are used. Verifiers should ensure that the credential types, subjects, +and schemas sent by a holder match what was requested. +- **Issuer trustworthiness**: Verifiers must check that they trust the issuer on each individual credential in a +presentation. The framework only verifies that the issuer's signature on each credential is current and valid +against the given options. + +The default validation behavior may be modified by the following options. + +## Subject-Holder Relationship + +Specifies the expected relationship between the holder that signed the verifiable presentation and the subject +specified in each [verifiable credential](./../../explanations/verifiable-credentials.mdx). +This can be restricted by the [`nonTransferable`](https://www.w3.org/TR/vc-data-model/#nontransferable-property) property, +which indicates that a verifiable credential must only be encapsulated into a verifiable presentation whose holder matches the credential subject. + +By default, the framework always enforces that the holder matches the subject. + +The following options are available to modify that behavior: + +- **`AlwaysSubject` (default)**: The holder DID that signed the presentation must match the [`credentialSubject` `id`](https://www.w3.org/TR/vc-data-model/#credential-subject) field in each of the attached credentials. This is the safest option which ensures holders may only present credentials that were directly issued to their DID. An error is thrown on a mismatch or if no subject `id` is present. +- **`SubjectOnNonTransferable`**: The holder DID must match the subject only for credentials where the [`nonTransferable`](https://www.w3.org/TR/vc-data-model/#nontransferable-property) property is `true`. This is appropriate for accepting [bearer credentials](https://www.w3.org/TR/vc-data-model/#bearer-credentials) while still adhering to the specification. +- **`Any`**: The holder DID is not required to have any kind of relationship to any credential subject. This option performs no checks and ignores the [`nonTransferable`](https://www.w3.org/TR/vc-data-model/#nontransferable-property) property. + +:::note + +See the [Verifiable Credentials Data Model Specification](https://www.w3.org/TR/vc-data-model/#subject-holder-relationships) +for further discussion on the different subject-holder relationships. + +::: + + +## Example Code + +The following code demonstrates how to use the IOTA Identity Framework end-to-end to create and sign a verifiable +presentation as a holder, serialize it to JSON for transmission, deserialize it on the receiving side as a verifier, +and finally validate it with various options. + +<Tabs groupId="language" queryString> +<TabItem value="rust" label="Rust"> + +```rust reference +https://github.com/iotaledger/identity.rs/blob/v1.6.0-alpha/examples/0_basic/6_create_vp.rs +``` + +</TabItem> +</Tabs> diff --git a/docs/content/iota-identity/index.mdx b/docs/content/iota-identity/index.mdx new file mode 100644 index 00000000000..80da6184998 --- /dev/null +++ b/docs/content/iota-identity/index.mdx @@ -0,0 +1,79 @@ +--- +description: The most important concepts that developers will need to know to utilize IOTA Identity to its full potential. +image: /img/identity/icon.png +tags: + - reference + - identity +--- +# IOTA Identity Framework + +![IOTA Identity](/img/banner/banner_identity.svg) + +The IOTA Identity framework implements the most common standards and patterns for Decentralized Identity in both a DLT agnostic and `iota` method-specific manner. +It is designed to work for Identity for [People](#identity-for-people), [Organizations](#identity-for-organizations), +[Things, and Objects](#identity-for-things) acting as a unifying layer of trust between everyone and everything. + +## Introduction to Decentralized Identity + +Decentralized or Self-Sovereign Identity (SSI) gives individuals full control over their online identity, +offering a remedy for database breaches, lack of digital trust, and stringent privacy laws like GDPR. +Digital identity bridges the gap between online pseudonyms and real-world personas, enabling true verifiable identities. This gives individuals the power to choose which data to share and with whom. + +### Identity for People + +:::info Privacy + +IOTA Identity builds a new internet, without usernames, passwords, endless repeated forums, or uncontrolled data harvesting. + +::: + +Information about anyone's life is spread across many locations. Most people have numerous unorganized important documents at home, hundreds of online accounts, and many more online footprints. Through statistical predictive analysis, computer programs can harvest unverified online information sources and create a reasonably accurate profile about our lives. These profiles are accurate enough for targeted advertising and personalized content but lack the proof and trust for them to be used in business. This results in an antiquated customer experience where we have to submit our age and address for every purchase we make and every account we create. It also inhibits our ability to do many online tasks like requesting and extending licenses or taking out a mortgage. + +Self-Sovereign Identity is about returning autonomy and privacy to the individual, while also improving our online experience. Some movements focus on data privacy, preventing companies from using our information altogether, but with the IOTA Identity framework you control which part of the information you want to reveal. The user can create a single online profile containing all our personal information. They can decide who they share what information with, and a verifier checks if the information is correct, making the data trustworthy. This moves their online profile from a statistical estimation by corporate entities to an accurate and verifiable profile under their own control. + +IOTA Identity allows a new internet without usernames, passwords, endlessly repeated forms or data harvesting. Users have ultimate control and can choose to supply service providers with their personal data, who in return provide personalized experiences. Data will still flow, and perhaps even more than before, but it will always be in the individual's interest instead of a corporation's. People will gain additional benefits in sharing their data, either in monetary value or improved customer experience. This system is impossible in non-neutral environments such as permissioned or fee-based ledgers. + +Governmental mechanisms for building _digital identities_ are currently being established throughout Europe and Asia, with demand increasing around the globe. However, they are managed by single entities and restricted to the governments that created them. By decentralizing a framework for these standards to adapt to, we have a system for intergovernmental verification of individuals and devices. A person’s digital identification will be transferable across borders like a passport. However, it will no longer require the trust of the issuing government due to the digital trust established by the open and auditable system. + +### Identity for Organizations + +:::info GDPR + +IOTA Identity allows organizations to comply with GDPR in a cost-efficient and privacy-enabling manner + +::: + +Corporations are associated with greed and abuse of power. This reputation stems from the role some have chosen to take within society. Corporations are trusted with our data, but often do not act responsibly; vulnerability, fix, patch, repeat. In software and systems, we have seen this cycle repeat. Headlines on data leaks are now an ever-present feature in the news. + +IOTA Identity presents an opportunity for companies to embrace a new role in the ecosystem. Traditional approaches do not provide cost-efficient solutions to new legislation like GDPR. IOTA Identity enables organizations to change their processes to comply with the new regulations in a cost-efficient and privacy-enabling manner. Features of “Data Protection and Privacy by Design” shift responsibility over Personal Identifiable Information (PII) from organization to customer, and organizations no longer need to store that data. The relationship between customer and organization is also tightened as communication via a third-party Identity provider like Google or Facebook is no longer needed. + +Due to Know-Your-Customer (KYC) and Anti-Money Laundering (AML) obligations, companies can be certain who their customers are. These services also provide unique insight into their customers’ data. These insights can be combined and translated into verifiable credentials, providing a new “Trust Anchor” service with the potential for new business models. KYC and AML credentials would return the autonomy of personal data to the customer. Once companies accept other companies' KYC and AML credentials, the enrollment time for new customers is significantly reduced, as are the costs. With the personal data secured by the customer, companies can afford to store less data in their databases, reducing risk and responsibility and fulfilling the goals of legislation such as GDPR. + +Organizations that have their own decentralized identities can also combat fraud and increase control over their online brand. Companies can sign invoices and agreements using their decentralized identities. While interacting with the customers, they will also be able to reliably identify themselves. + +### Identity for Things + +:::info TRUST + +IOTA Identity adds the missing key ingredient for the "Economy of Things": Trust. + +::: + +With Identity of Things (IDoT), devices are provided with a unique global identity that are able to prove many attributes, including their capabilities, specifications, and authenticity. People, organizations, and other devices will only pay for devices that can prove their ability to fulfill the required task. This basis of trust prevents fraudulent activity. Additionally, using the IOTA ledger, the task's progress can be immutably logged. Combining the IOTA protocol and the IOTA Identity framework, we can automate the entire interaction between all parties without requiring predefined trust. The [Industry Marketplace](https://industry.iota.org/) provides a perfect example of how this framework and level of autonomy work. + +There is a growth in applications that generate Digital Twins for physical devices or objects, such as the Asset Administration Shell (AAS) developed for our Industry Marketplace. Digital twins are online profiles representing a device or object. They provide a virtual state that mirrors reality by emulating the device or object’s physical state through data input sources like sensors. A digital twin is often used to monitor states and execute actions based on the information. Digital twins are only rarely shared outside the associated application and organization due to the complexities in sharing and matching profiles. However, empowered with a digital identity, digital twin sharing would become possible. Once data is verifiable and trusted, digital twins can form the basis for the digital representation of physical devices and objects. This allows other identities to interact with them automatically and provide services such as predictive maintenance. + +Security is a major barrier to advancing technologies that use IoT. Whether it is the smart devices in our homes or at a larger scale, the critical infrastructure of organizations and cities, security must be at the core. It is central to any globally unifying identity solution. By integrating advanced research in cryptography and digital ledgers and combining it with a scalable access and management system, security will become a core functionality of the systems we build. By using scalable device DIDs, integrating verification and reputation schemes, and allowing for transparent tamper-proof accountability, we begin to understand how we can future-proof the security of our systems, allowing us to start trusting the process and not the patch. + +### One Framework. Any Identity + +The IOTA Identity framework serves as a ubiquitous layer of trust for the internet. Whether it's people, organizations, or things, the framework enables the creation of digital identities, fosters trust-building through verifiable credentials, and ensures seamless interaction among different entities. + +### Why IOTA? + +IOTA stands apart as a scalable Distributed Ledger Technology (DLT), suitable for a universal identity solution. Some features of IOTA include: + +* **Cost-effectiveness**: Creating Identities on IOTA incurs minimal fees and deposits for occupied ledger space can be reclaimed at any time. +* **High availability**: Identities are always available on all network nodes - for holders, issuers, and verifiers. +* **Security**: Write access to identities is secured through multi-level control structures with key rotation capabilities, allowing for backup access and recoverability. +* **Integrity**: Updates go through the same mechanisms that secure the IOTA network, guaranteeing consistent state and history of all identities. diff --git a/docs/content/references/iota-identity/iota-did-method-spec.mdx b/docs/content/references/iota-identity/iota-did-method-spec.mdx new file mode 100644 index 00000000000..bdd13a83ac7 --- /dev/null +++ b/docs/content/references/iota-identity/iota-did-method-spec.mdx @@ -0,0 +1,226 @@ +--- +title: IOTA DID Method Specification v2.0 +sidebar_label: DID Method +description: How IOTA Identity implements the Decentralized Identifiers Standard on the IOTA Tangle. +image: /img/identity/icon.png +tags: + - reference + - identity + - did +--- + +# IOTA DID Method Specification v2.0 + +2024-08-23 + +## Abstract + +The IOTA DID Method Specification describes a method of implementing the [Decentralized Identifiers](https://www.w3.org/TR/did-core/) (DID) standard on [IOTA](https://iota.org), a Distributed Ledger Technology (DLT). It conforms to the [DID specification v1.0](https://www.w3.org/TR/did-core/) and describes how to perform Create, Read, Update and Delete (CRUD) operations for IOTA DID Documents using shared Move objects on the IOTA network. + +## Introduction + +{/* +### Move-based DLT + +:::warning +We might want to borrow text for this section from other parts of the wiki that deal with this in more details! +::: +*/} + +### Identity Object + +`Identity` is a **shared** _Move_ object that contains a DID document along other metadata used for access-control. + +Although `Identity`'s instances are **shared**, and therefore publicly accessible by anyone, only a well-defined per-instance set of +actors - called **controllers** - are allowed to make changes to an `Identity`. + +### Ledger and DID + +Storing DID Documents in the ledger state means they inherently benefit from the guarantees the ledger provides. + +1. Conflicts among nodes are resolved and dealt with by the ledger. +2. Replay attacks are mitigated since transactions need to be confirmed by the ledger. +3. Through the `State Index` a linear history for updates of a DID Document is provided. + +## DID Method Name + +The `method-name` to identify this DID method is: `iota`. + +A DID that uses this method MUST begin with the following prefix: `did:iota`. Following the generic DID specification, this string MUST be lowercase. + +## DID Format + +The DIDs that follow this method have the following ABNF syntax. It uses the syntax in [RFC5234](https://www.rfc-editor.org/rfc/rfc5234) and the corresponding definition for `digit`. + +``` +iota-did = "did:iota:" iota-specific-idstring +iota-specific-idstring = [ iota-network ":" ] iota-tag +iota-network = 8lowercase-hex +iota-tag = "0x" 64lowercase-hex +lowercase-hex = digit / "a" / "b" / "c" / "d" / "e" / "f" +``` + +It starts with the string "did:iota:", followed by an optional network name (8 lowercase hexadecimal digits) and a colon, then the tag. +The tag starts with "0x" followed by a lowercase hex-encoded `Object ID`. + +### IOTA-Network + +The iota-network is an identifier of the network where the DID is stored. This network must be an IOTA Ledger, but can either be a public or private network, permissionless or permissioned. + +When no IOTA network is specified, it is assumed that the DID is located on IOTA main network, having id **PUT IOTA CHAIN ID HERE**. This means that the following DIDs will resolve to the same DID Document: + +``` +did:iota:IOTA CHAIN ID:0xe4edef97da1257e83cbeb49159cfdd2da6ac971ac447f233f8439cf29376ebfe +did:iota:0xe4edef97da1257e83cbeb49159cfdd2da6ac971ac447f233f8439cf29376ebfe +``` + +### IOTA-Tag + +An IOTA-tag is a lowercase hex-encoded `Object ID`. The `Object ID` itself is a unique identifier for _Move_ objects and is derived from the digest of the trasanction that created the object it identifies. +This tag identifies the `Identity` where the DID Document is stored, and it will not be known before the generation of the DID since it will be assigned when the `Identity` object is created. + +### Anatomy of the encoded DID Document + +The DID Document stored within an `Identity` must be encoded as the payload of a byte packed structure with fields as follows: + +| Name | Type | Description | +| ------------- | ----------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Document Type | ByteArray[3] | Set to value **DID** to denote a DID Document. | +| Version | uint8 | Set value **1** to denote the version number of this method | +| Encoding | uint8 | Set to value to **0** to denote JSON encoding without compression. | +| Payload | (uint16)ByteArray | A DID Document and its metadata, where every occurrence of the DID in the document is replaced by `did:0:0`. It must be encoded according to `Encoding`. | + +The types are defined in [TIP-21](https://github.com/iotaledger/tips/blob/main/tips/TIP-0021/tip-0021.md). + +#### Payload + +The payload must contain the following fields: + +- `meta`: contains metadata about the DID Document. For example, `created` to indicate the time of + creation, and `updated` to indicate the time of the last update to the document. It may also include other properties. +- `doc`: contains the DID Document. In the example below, the document only contains one verification method. The `id` and `controller` is specified by `did:0:0` which references the DID of the document itself, since the DID is unknown at the time of publishing. It also deduplicates the DID of the document to reduce the size of the state metadata, in turn reducing the required storage deposit. + +Example State Metadata Document: + +```json +{ + "doc": { + "id": "did:0:0", + "verificationMethod": [ + { + "id": "did:0:0#jkGOGVO3Te7ADpvlplr47eP9ucLt41zm", + "controller": "did:0:0", + "type": "JsonWebKey", + "publicKeyJwk": { + "kty": "OKP", + "alg": "EdDSA", + "kid": "jkGOGVO3Te7ADpvlplr47eP9ucLt41zm", + "crv": "Ed25519", + "x": "D5w8vG6tKEnpBAia5J4vNgLID8k0BspHz-cVMBCC3RQ" + } + } + ], + "authentication": ["did:0:0#jkGOGVO3Te7ADpvlplr47eP9ucLt41zm"] + }, + "meta": { + "created": "2023-08-28T14:49:37Z", + "updated": "2023-08-28T14:50:27Z" + } +} +``` + +## Multiple _controllers_ and _voting power_ + +An `Identity` may be owned by more than one controller and each controller may have a different **voting power** - i.e. a quantificable level of control over a given `Identity` represented with an unsigned integer. +Whenever control over an `Identity` is shared among multiple controllers an access control (AC) policy - in the form of an unsigned positive integer **threshold** - must be defined. Any operation a controller performs that might modify the interested `Identity` isn't carried out right away. Instead, a **proposal** to perform such an operation is created, and controllers are required to approve it, before it may be executed. The number of approvals needed in order to execute the proposal depends on the threshold and controllers' voting power. + +## CRUD Operations + +Create, Read, Update and Delete (CRUD) operations that change the DID Documents are performed by invoking `Identity`'s APIs in a transaction. + +**These operations require funds to cover the gas cost. Transactions must be carefully done in order to avoid fund loss** - e.g. executing a transaction that is bound to fail wastefully consumes funds for gas. Additionally, private keys of controllers must be stored securely. + +### Create + +In order to create a simple self controlled DID two things are required: + +1. An Address for which the private key is available. +2. Enough funds to cover for the creation of a new `Identity` object. + +Creation steps: + +1. Create the content of the DID Document like verification methods, services, etc. +2. Create the payload and the headers as described in the [Anatomy of the encoded DID document](#anatomy-of-the-encoded-did-document). +3. Execute `Identity::new` in a transaction, providing the encoded DID document as its parameter. + +Once the transaction is confirmed, the DID is published and can be formatted by using the `Object ID` as the tag in [DID Format](#did-format). + +### Read + +The following steps can be used to read the latest DID Document associated with a DID. + +1. Obtain the `Object ID` from the DID by extracting the `iota-tag` from the DID, see [DID Format](#did-format). +2. Obtain the network of the DID by extracting the `iota-network` from the DID, see [DID Format](#did-format). +3. Query the Object corresponding to the `Object ID` using a node running the indexer, asserting that the network the node is connected to matches the previously extracted network ID. +4. Assert that the `Object ID` of the returned Object matches the `Object ID` extracted from the DID. Return an error otherwise. +5. Parse the retrieved object into an `Identity` object. +6. Decode the DID Document from its byte packed encoding stored in the `Identity` Object. +7. Replace the placeholder `did:0:0` with the DID given as input. + +### Update + +Updating a DID Document can be achieved by invoking the `Identity::propose_update` API passing the updated encoded DID Document as its parameter, followed by executing the generated proposal after enough approvals from the `Identity`'s controllers are obtained. +In a more detailed step-by-step description: + +1. Create a copy of the encoded DID document with the `Object ID` set explicitly. +2. Pack the updated DID Document, as described in the [Anatomy of the encoded DID Document](#anatomy-of-the-encoded-did-document), and use it as the parameter to a call to `Identity::propose_update` API. +3. Query the generated `Proposal` object, and check if the threshold has been reached. If that's not the case wait for enough controllers to approve the proposal. +4. Execute the approved proposal by invoking `Identity::execute_update`. + +### Delete + +#### Deactivate + +Temporarily deactivating a DID can be done by deleting the contents of the encoded DID Document in the `Identity` object, setting it to an empty byte array, and publishing an [update](#update). + +Another option is to [update](#update) the DID Document and set the `deactivated` property in its `metadata` to true. In both cases, the deactivated DID Document will be marked as `deactivated` when resolved. + +#### Destroy + +To permanently destroy a DID Document controllers need to go through a process similar to that of [updating](#update) the document. First, a proposal for destroying the corresponding `Identity` is created, which can be executed after the AC policy has been met. + +Note that this operation irreversibly and irrecoverably deletes the DID. This is because the `Object ID` from which an IOTA DID is derived (see [IOTA-Tag](#iota-tag)) is generated from the hash of the input transaction that created it, which cannot generally be replicated. + +## IOTA Identity standards + +The `did:iota` method is implemented in the [IOTA Identity framework](https://github.com/iotaledger/identity.rs). This framework supports a number of operations that are standardized, some are standardized across the SSI community, and some are the invention of the IOTA Foundation. + +### Revocation + +Revocation of verifiable credentials and signatures can be achieved using the [Revocation Bitmap 2022](./revocation-bitmap-2022.mdx) where issuers store a bitmap of indices in the DID Document. These indices correspond to verifiable credentials they have issued. If the binary value of the index in the bitmap is 1 (one), the verifiable credential is revoked, if it is 0 (zero) it is not revoked. + +### Standardized Services + +The IOTA Identity framework also standardized certain `services` that are embedded in the DID Document. It is RECOMMENDED to implement these when implementing the `did:iota` method. + +Currently standardized `services`: + +- [Revocation Bitmap Service](./revocation-bitmap-2022.mdx#revocation-bitmap-service) + +## Security Considerations + +### Private Key Management + +All private keys or seeds used for the `did:iota` method should be equally well protected by the users. Private keys of the state controller and the governor are especially important as they control how keys are added or removed, providing full control over the identity. + +## Privacy Considerations + +### Personal Identifiable Information + +IOTA networks are immutable. This means that once something is included, it can never be completely removed. For example, destroying an `Identity` will remove it from the ledger state, but it can still be stored in permanodes or by any party that records historical ledger states. + +That directly conflicts with certain privacy laws such as GDPR, which have a 'right-to-be-forgotten' for Personal Identifiable Information (PII). As such, users should NEVER upload any PII, including inside DID Documents. While verifiable credentials can be made public, this should only be utilized by Identity for Organisations and Identity for Things. + +### Correlation Risks + +As with any DID method, identities can be linked if they are used too often and their usage somehow becomes public. See [DID Correlation Risks](https://www.w3.org/TR/did-core/#did-correlation-risks). Additionally, a DID can be correlated with funds if the Alias Output used to store the DID Document or any of its controllers is used for holding, transferring or controlling coins or NFTs. diff --git a/docs/content/references/iota-identity/overview.mdx b/docs/content/references/iota-identity/overview.mdx new file mode 100644 index 00000000000..db1b1da3510 --- /dev/null +++ b/docs/content/references/iota-identity/overview.mdx @@ -0,0 +1,17 @@ +--- +title: Specifications Overview +sidebar_label: Overview +description: Provide overview of the specifications +image: /img/identity/icon.png +tags: + - reference + - identity +--- + +While IOTA Identity implements many existing standards, it also adds some additional features we would like to standardize ourselves. This section covers these features and how they work in great detail. These are not light reads and can be skipped. + +The current specifications are: + +- [IOTA DID](iota-did-method-spec.mdx): The specification for the IOTA DID Method implemented on the IOTA network. +- [Revocation Bitmap 2022](revocation-bitmap-2022.mdx): The specification for an on-chain credential revocation mechanism. +- [Revocation Timeframe 2024](revocation-timeframe-2024.mdx): The specification for a privacy-enhanced on-chain credential revocation mechanism. \ No newline at end of file diff --git a/docs/content/references/iota-identity/revocation-bitmap-2022.mdx b/docs/content/references/iota-identity/revocation-bitmap-2022.mdx new file mode 100644 index 00000000000..0a373d8c5b9 --- /dev/null +++ b/docs/content/references/iota-identity/revocation-bitmap-2022.mdx @@ -0,0 +1,199 @@ +--- +title: Revocation Bitmap +sidebar_label: Revocation Bitmap +description: The specification for the embedded revocation bitmap. +image: /img/identity/icon.png +tags: + - reference + - identity + - did +--- + +# Revocation Bitmap 2022 + +## Abstract + +This specification describes a mechanism for publishing the revocation status of [verifiable credentials](../../iota-identity/explanations/verifiable-credentials.mdx) embedded in an issuer's DID document. + +## Introduction + +Revocation gives an issuer the capability to invalidate a credential they issued before its natural expiration date. To achieve this, issuers can embed an identifier in the `credentialStatus` field of a credential. Verifiers can then lookup that identifier in a separate list, to check whether the credential is still valid. This document specifies a mechanism of embedding such a list, in form of a bitmap, in the DID document of the issuer, where each bitmap index corresponds to a credential they have issued. This mechanism is space-efficient and enables a verifier to check a credential's status in a privacy-preserving manner and without requiring additional lookups or external resources. + +## Revocation Bitmap Concept + +The revocation status of a verifiable credential is expressed as a binary value. The issuer keeps a bitmap of indices corresponding to verifiable credentials they have issued. If the binary value of the index in the bitmap is 1 (one), the verifiable credential is revoked, if it is 0 (zero) it is not revoked. + +## Data Model + +### Revocation Bitmap Status + +For an issuer to enable verifiers to check the status of a verifiable credential, the [`credentialStatus`](https://www.w3.org/TR/vc-data-model/#status) property MUST be specified with the following properties: + +| Property | Description | +| :---------------------- | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `id` | The constraints on the `id` property are listed in the [Verifiable Credentials Data Model specification](https://www.w3.org/TR/vc-data-model/). The `id` MUST be a [DID URL](https://www.w3.org/TR/did-core/#did-url-syntax) that is the URL to a [Revocation Bitmap Service](#revocation-bitmap-service) in the DID Document of the issuer. It SHOULD include an `index` query set to the same value as `revocationBitmapIndex`, to uniquely identify the `credentialStatus`. If the `index` query is present, implementations SHOULD reject statuses where the `index` query's value does not match `revocationBitmapIndex`. | +| `type` | The `type` property MUST be `"RevocationBitmap2022"`. | +| `revocationBitmapIndex` | The `revocationBitmapIndex` property MUST be an unsigned, 32-bit integer expressed as a string. This is the index of the credential in the issuer's revocation bitmap. Each index SHOULD be unique among all credentials linking to the same [Revocation Bitmap Service](#revocation-bitmap-service). | + +#### Example + +An example of a verifiable credential with a `credentialStatus` of type `RevocationBitmap2022`. + +```json +{ + "@context": "https://www.w3.org/2018/credentials/v1", + "id": "https://example.edu/credentials/3732", + "type": ["VerifiableCredential", "UniversityDegreeCredential"], + "credentialSubject": { + "id": "did:iota:B8DucnzULJ9E8cmaReYoePU2b7UKE9WKxyEVov8tQA7H", + "GPA": "4.0", + "degree": "Bachelor of Science and Arts", + "name": "Alice" + }, + "issuer": "did:iota:EvaQhPXXsJsGgxSXGhZGMCvTt63KuAFtaGThx6a5nSpw", + "issuanceDate": "2022-06-13T08:04:36Z", + "credentialStatus": { + "id": "did:iota:EvaQhPXXsJsGgxSXGhZGMCvTt63KuAFtaGThx6a5nSpw?index=5#revocation", + "type": "RevocationBitmap2022", + "revocationBitmapIndex": "5" + }, + "proof": { + "type": "JcsEd25519Signature2020", + "verificationMethod": "did:iota:EvaQhPXXsJsGgxSXGhZGMCvTt63KuAFtaGThx6a5nSpw#key-1", + "signatureValue": "2eHdbDumMrer4pNVkaiYMqsVqVp2adq7bRcgTJZiw17Zeghk2ZT49YHwLwCCg35YKganBhxP6YSbzYoBK1AuCUv" + } +} +``` + +### Revocation Bitmap Service + +To allow verifiers to check the status of a [Revocation Bitmap Status](#revocation-bitmap-status), the DID document of the credential issuer MUST contain a [service](https://www.w3.org/TR/did-core/#services) with the following properties: + +| Property | Description | +| :---------------- | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `id` | The constraints on the `id` property are listed in the [DID Core service specification](https://www.w3.org/TR/did-core/#services). The `id` property MUST be a DID URL uniquely identifying the revocation bitmap. | +| `type` | The `type` property MUST be `"RevocationBitmap2022"`. | +| `serviceEndpoint` | The `serviceEndpoint` MUST be generated according to the [service endpoint generation algorithm](#service-endpoint-generation-algorithm). | + +#### Example + +An example of an issuer's DID document where credential `"5"` in the `#revocation` service is revoked: + +```json +{ + "id": "did:iota:EvaQhPXXsJsGgxSXGhZGMCvTt63KuAFtaGThx6a5nSpw", + "verificationMethod": [ + { + "id": "did:iota:EvaQhPXXsJsGgxSXGhZGMCvTt63KuAFtaGThx6a5nSpw#key-1", + "controller": "did:iota:EvaQhPXXsJsGgxSXGhZGMCvTt63KuAFtaGThx6a5nSpw", + "type": "Ed25519VerificationKey2018", + "publicKeyMultibase": "z3hgM9fNkhwgT5mECbj1HdKoFNZgpffwQYEV8WBVHphXq" + } + ], + "capabilityInvocation": [ + { + "id": "did:iota:EvaQhPXXsJsGgxSXGhZGMCvTt63KuAFtaGThx6a5nSpw#sign-0", + "controller": "did:iota:EvaQhPXXsJsGgxSXGhZGMCvTt63KuAFtaGThx6a5nSpw", + "type": "Ed25519VerificationKey2018", + "publicKeyMultibase": "z83F6zbD3KqaxvQhqo25LvSXzoDdpZmp3EpPVonSVACwZ" + } + ], + "service": [ + { + "id": "did:iota:EvaQhPXXsJsGgxSXGhZGMCvTt63KuAFtaGThx6a5nSpw#revocation", + "type": "RevocationBitmap2022", + "serviceEndpoint": "data:application/octet-stream;base64,ZUp5ek1tQmdZR1NBQUFFZ1ptVUFBQWZPQUlF" + } + ] +} +``` + +## Algorithms + +The following algorithms define how to generate, expand and validate revocation bitmaps. + +### Service Endpoint Generation Algorithm + +The following process MUST be followed when producing a `RevocationBitmap2022` to embed in a service endpoint: + +1. Let **bitmap** be a [_roaring bitmap_](https://roaringbitmap.org/) where each bit is initialized to 0. +2. For each revoked credential with an **index** not exceeding an unsigned, 32-bit integer, set the corresponding bit in **bitmap** at **index** to 1. +3. Generate the **bitmap serialization** according to the [roaring bitmap serialization format](https://github.com/RoaringBitmap/RoaringFormatSpec/) using the **bitmap** as input. +4. Generate a **compressed bitmap** by using the ZLIB compression algorithm [[RFC 1950](https://datatracker.ietf.org/doc/html/rfc1950)] on the **bitmap serialization** and base64-encoding [[RFC4648](https://datatracker.ietf.org/doc/html/rfc4648)] the result. +5. Create the **service endpoint** by embedding the **compressed bitmap** in a data URL [[RFC2397](https://datatracker.ietf.org/doc/html/rfc2397)]. On the data url, the `<mediatype>` MUST be `application/octet-stream` and the `base64` attribute MUST be set. +6. Return the **service endpoint**. + +### Service Endpoint Expansion Algorithm + +The following process MUST be followed when expanding the endpoint from a service of type `RevocationBitmap2022`: + +1. Let **service endpoint** be a data url generated using the [service endpoint generation algorithm](#service-endpoint-generation-algorithm). +2. The `<mediatype>` of the **service endpoint** MUST be `application/octet-stream` and the `base64` attribute MUST be set, return an error otherwise. Let **compressed bitmap** be the `<data>` part of the data url. +3. Generate an **uncompressed bitmap** by base64-decoding [[RFC4648](https://datatracker.ietf.org/doc/html/rfc4648)] the **compressed bitmap** and then decompressing the result using ZLIB [[RFC 1950](https://datatracker.ietf.org/doc/html/rfc1950)]. +4. Generate the **bitmap** by deserializing the **uncompressed bitmap** according to the [roaring bitmap serialization format](https://github.com/RoaringBitmap/RoaringFormatSpec/). +5. Return the **bitmap**. + +### Validation Algorithm + +The following steps MUST be followed when checking whether a verifiable credential is revoked: + +1. Let **credential** be a verifiable credential containing a `credentialStatus` whose `type` is `RevocationBitmap2022`. +2. Let **revocation bitmap URL** be the `id` field of the **credential**'s `credentialStatus`. +3. Resolve the **revocation bitmap URL** to a **revocation bitmap service** in the issuer's DID document, and verify that the service `type` is `RevocationBitmap2022`. Return an error otherwise. +4. Expand the endpoint of the **revocation bitmap service** into a **revocation bitmap** according to the [service endpoint expansion algorithm](#service-endpoint-expansion-algorithm). +5. Let **revocation index** be the integer value of the `revocationBitmapIndex` property contained in the `credentialStatus` of the **credential**. +6. Let **revoked** be the value of the bit at index **revocation index** in the **revocation bitmap**. +7. Return `true` if **revoked** is 1, `false` otherwise. + +## Test Vectors + +This section provides test vectors to validate implementations against. + +### Test Vector 1 + +The following data URL decodes to a bitmap of length 0 where no index is revoked: + +`"data:application/octet-stream;base64,ZUp5ek1tQUFBd0FES0FCcg=="` + +### Test Vector 2 + +The following data URL decodes to a bitmap of length 3 where indices `5`, `398`, and `67000` are revoked: + +`"data:application/octet-stream;base64,ZUp5ek1tQmdZR0lBQVVZZ1pHQ1FBR0laSUdabDZHUGN3UW9BRXVvQjlB"`. + +### Test Vector 3 + +The following data URL decodes to a bitmap of length 16384 where all indices are revoked: + +`"data:application/octet-stream;base64,ZUp6dHhERVJBQ0FNQkxESEFWS1lXZkN2Q3E0MmFESmtyMlNrM0ROckFLQ2RBQUFBQUFBQTMzbGhHZm9q"` + +## Rationale + +This section describes the rationale behind some of the design decisions of this specification. + +### Compression and maximum size + +Considering that messages published to the Tangle cannot exceed [32 KiB](https://github.com/iotaledger/tips/blob/main/tips/TIP-0006/tip-0006.md#message-validation) in size, and that larger messages have increased requirements, the use of compression was assessed. +The precise size of a serialized bitmap varies based on the number and distribution of revoked indices. When indices are revoked uniformly randomly, roughly 100,000 - 200,000 can be achieved in a DID Document with compression, and significantly more if consecutive indices are revoked. + +ZLIB [[RFC 1950](https://datatracker.ietf.org/doc/html/rfc1950)] was chosen for having a free and open source software licence and being one of the most widely used compression schemes, which enhances the accessibility of this specification. Some other assessed algorithms produced only marginally better compression ratios but had far fewer existing implementations across different programming languages. + +### Compressed Bitstring vs. Roaring Bitmap + +Because of its space efficiency, a roaring bitmap is preferred for representing a bitmap in-memory. To avoid the dependency on roaring bitmap, we considered using a compressed bitstring as the serialization format. However, serialization of such a bitstring was 2-3x slower compared to roaring's serialization format, which becomes an issue on resource-constrained devices (e.g. smartphones) or in web browsers. + +### Comparison to `RevocationList2020` and `StatusList2021` + +The [RevocationList2020 specification](https://w3c-ccg.github.io/vc-status-rl-2020/) and [StatusList2021 specification](https://w3c-ccg.github.io/vc-status-list-2021/) both describe a similar revocation mechanism using a verifiable credential that contains a bitmap, similar to the `RevocationBitmap2022` approach. The credential is hosted outside of the DID document and the verifier thus needs to fetch it from an external resource, likely one controlled by the issuer. This has privacy implications as the issuer can track where a fetch request for the credential came from and potentially infer who the credential was verified by and for what purpose. The issuer can also potentially infer which credential was checked. Because `RevocationBitmap2022` is embedded in the issuer's DID document, which can be obtained without the their knowledge, this approach does not suffer from these privacy shortcomings. See also the [privacy considerations](#privacy-considerations). + +A downside of embedding the revocation list in the DID document is that storage in a distributed ledger (DLT) is usually more expensive than other storage hosting solutions. The DLT might also impose message size limitations, capping the total number of revocations that can be done (see also [compression](#compression-and-maximum-size)). + +Another difference is that `RevocationList2020` specifies a minimum initial size of 131,072 for its bitstring, to mitigate the potential for correlating individuals when few credentials have been issued. `RevocationBitmap2022` uses a roaring bitmap instead of a bitstring, so the maximum size is not fixed (apart from the upper bound of an unsigned 32-bit integer). This means the bitmap cannot be used to correlate small populations without more information not present in the bitmap itself. However, both schemes still reveal publicly how many credentials have been revoked, which could be used to infer other information if more knowledge about how an issuer assigns credential revocation indexes is known. + +`StatusList2021` allows for explicitly stating the purpose of the list, currently either _revocation_ or _suspension_. This specification does not mandate that revoked credentials cannot be unrevoked, which means a `RevocationBitmap2022` can effectively also be used as a suspension list. + +### Privacy Considerations + +Because the revocation bitmap is embedded in the DID document, and thus available without contacting the issuer directly, the issuer cannot correlate how a holder uses their credential. + +An observer finding a service of type `RevocationBitmap2022` in a DID document can infer that this DID belongs to an issuer. However, DIDs of issuers tend to be publicly known, in contrast to DIDs of other entities, so this is unlikely to present an issue. External observers can monitor the frequency of revocations and potentially the total number of issued credentials, depending on how the issuer assigns credential indices (e.g. starting from 0 and incrementing the index for each issued credential). \ No newline at end of file diff --git a/docs/content/references/iota-identity/revocation-timeframe-2024.mdx b/docs/content/references/iota-identity/revocation-timeframe-2024.mdx new file mode 100644 index 00000000000..c4f7fb84ed7 --- /dev/null +++ b/docs/content/references/iota-identity/revocation-timeframe-2024.mdx @@ -0,0 +1,148 @@ +--- +title: Revocation Timeframe 2024 +sidebar_label: Revocation Timeframe 2024 +description: The specification for an embeddable time-based revocation method - `RevocationTimeframe2024`. +image: /img/identity/icon.png +tags: + - reference + - identity + - did +--- + +# Revocation Timeframe 2024 + +## Abstract + +This specification describes a new revocation mechanism - `RevocationTimeframe2024` - that extends [`RevocationBitmap2022`](./revocation-bitmap-2022.mdx) +to address its linkability security concerns, at least when used in combination with selectively disclosable (SD-able) VCs. + +## Introduction + +`RevocationBitmap2022` allows for a simple and straightforward way for an issuer to invalidate an issued VC before its expiration. While this method prevents the analysis of usage by the issuer through hosting the revocation information on-chain +it comes with a high risk of linkability by colluding verifiers as they can store the bitmap index and use it to identify users. Additionally, verifiers can monitor the revocation information and at a later point, outside of any interaction, check the revocation status. +To address this privacy concern, `RevocationTimeframe2024` was designed as an extension that builds on top of `RevocationBitmap2022`, therefore sharing +most of its logic. + +## Concepts +`RevocationTimeframe2024` should be used together with selectively disclosable credentials - either [SD-JWT](../../iota-identity/how-tos/verifiable-credentials/selective-disclosure) +or [ZK-SD](../../iota-identity/how-tos/verifiable-credentials/zero-knowledge-selective-disclosure) - in order to conceal to the verifier +the credential's index in the issuer's revocation bitmap to avoid linkability. + +### Validity Timeframe + +If the revocation index is concealed from the verifier how can it assert the validity of the presented credential? +To solve this issue `RevocationTimeframe2024` introduces the concept of a _validity timeframe_, i.e. a limited time span +in which the credential is guaranteed to be non-revoked. By having a validity timeframe embedded in the credential's status +the verifier can prove the credential's validity by verifying the credential's signature. + +The downside of this mechanism is that the credential holder using `RevocationTimeframe2024` has to contact the credential's issuer +to update the signature - i.e. re-issue the credential - at the end of the credentials validity timeframe. Furthermore, +given how a credentials validity timeframe proves the validity of the credential itself, the updates made by the issuer to the credential's status - +i.e., revoking or un-revoking it - won't be reflected on the credential until a new validity timeframe starts. For this reason, +issuers should choose a validity timeframe length with respect to how frequently they expect to change the credential's status; +frequent updates deem shorter validity timeframes. + +:::note +A credential holder does not need to have its credential re-issued at the end of every validity timeframe, but only when +they need to present the credential to a verifier and its validity timeframe has expired. +::: + +## Data Model + +### Revocation Timeframe Status + +For an issuer to enable verifiers to check the status of a verifiable credential, the [`credentialStatus`](https://www.w3.org/TR/vc-data-model/#status) property MUST be specified with the following properties: + +| Property | Description | +| :---------------------- | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| `id` | The constraints on the `id` property are listed in the [Verifiable Credentials Data Model specification](https://www.w3.org/TR/vc-data-model/). The `id` MUST be a [DID URL](https://www.w3.org/TR/did-core/#did-url-syntax) that is the URL to a [Revocation Timeframe Service](#revocation-timeframe-service) in the DID Document of the issuer. | +| `type` | The `type` property MUST be `"RevocationTimeframe2024"`. | +| `revocationBitmapIndex` | The `revocationBitmapIndex` property MUST be an unsigned, 32-bit integer expressed as a string. This is the index of the credential in the issuers revocation bitmap. Each index SHOULD be unique among all credentials linking to the same [Revocation Timeframe Service](#revocation-timeframe-service). To ensure user unlinkability, this value MUST NOT be disclosed to the verifier (this is done by default). | +| `startValidityTimeframe`| The `startValidityTimeframe` property MUST be a [RFC 3339](https://datatracker.ietf.org/doc/html/rfc3339)-compliant timestamp. | +| `endValidityTimeframe`| The `endValidityTimeframe` property MUST be a [RFC 3339](https://datatracker.ietf.org/doc/html/rfc3339)-compliant timestamp. | + +#### Example + +An example of a verifiable credential with a `credentialStatus` of type `RevocationTimeframe2024`. + +```json +{ + "@context": "https://www.w3.org/2018/credentials/v1", + "id": "https://example.edu/credentials/3732", + "type": ["VerifiableCredential", "UniversityDegreeCredential"], + "credentialSubject": { + "id": "did:iota:B8DucnzULJ9E8cmaReYoePU2b7UKE9WKxyEVov8tQA7H", + "GPA": "4.0", + "degree": "Bachelor of Science and Arts", + "name": "Alice" + }, + "issuer": "did:iota:EvaQhPXXsJsGgxSXGhZGMCvTt63KuAFtaGThx6a5nSpw", + "issuanceDate": "2022-06-13T08:04:36Z", + "credentialStatus": { + "id": "did:iota:EvaQhPXXsJsGgxSXGhZGMCvTt63KuAFtaGThx6a5nSpw#my-revocation-service", + "type": "RevocationTimeframe2024", + "revocationBitmapIndex": "5" + "startValidityTimeframe": "2024-05-03T08:00:00Z", + "endValidityTimeframe": "2024-05-03T08:05:00Z", + }, +} +``` + +### Revocation Timeframe Service + +To allow verifiers to check the status of a [Revocation Timeframe Status](#revocation-timeframe-status), the DID document of the credential issuer MUST contain a [service](https://www.w3.org/TR/did-core/#services) with the following properties: + +| Property | Description | +| :---------------- | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `id` | The constraints on the `id` property are listed in the [DID Core service specification](https://www.w3.org/TR/did-core/#services). The `id` property MUST be a DID URL uniquely identifying the revocation bitmap. | +| `type` | The `type` property MUST be `"RevocationTimeframe2024"`. | +| `serviceEndpoint` | The `serviceEndpoint` MUST be generated according to the service endpoint generation algorithm described in [`RevocationBitmap2022`](./revocation-bitmap-2022.mdx#service-endpoint-generation-algorithm). | + +#### Example + +An example of an issuers DID document where credential `"5"` in the `#revocation` service is revoked: + +```json +{ + "id": "did:iota:EvaQhPXXsJsGgxSXGhZGMCvTt63KuAFtaGThx6a5nSpw", + "verificationMethod": [ + { + "id": "did:iota:EvaQhPXXsJsGgxSXGhZGMCvTt63KuAFtaGThx6a5nSpw#key-1", + "controller": "did:iota:EvaQhPXXsJsGgxSXGhZGMCvTt63KuAFtaGThx6a5nSpw", + "type": "Ed25519VerificationKey2018", + "publicKeyMultibase": "z3hgM9fNkhwgT5mECbj1HdKoFNZgpffwQYEV8WBVHphXq" + } + ], + "capabilityInvocation": [ + { + "id": "did:iota:EvaQhPXXsJsGgxSXGhZGMCvTt63KuAFtaGThx6a5nSpw#sign-0", + "controller": "did:iota:EvaQhPXXsJsGgxSXGhZGMCvTt63KuAFtaGThx6a5nSpw", + "type": "Ed25519VerificationKey2018", + "publicKeyMultibase": "z83F6zbD3KqaxvQhqo25LvSXzoDdpZmp3EpPVonSVACwZ" + } + ], + "service": [ + { + "id": "did:iota:EvaQhPXXsJsGgxSXGhZGMCvTt63KuAFtaGThx6a5nSpw#revocation", + "type": "RevocationTimeframe2024", + "serviceEndpoint": "data:application/octet-stream;base64,ZUp5ek1tQmdZR1NBQUFFZ1ptVUFBQWZPQUlF" + } + ] +} +``` + +## Algorithms + +For generation and expansion of the service endpoint see [`RevocationBitmap2022`](./revocation-bitmap-2022.mdx#algorithms). + +### Validation Algorithm + +The following steps MUST be followed when checking whether a verifiable credential is revoked: + +1. Let **credential** be a verifiable credential containing a `credentialStatus` whose `type` is `RevocationTimeframe2024`. +2. Let **now** be the string serialization of the RFC3339 timestamp representing the current UTC time. +3. Let **start validity timeframe** and **end validity timeframe** be the RFC3339 timestamps of the `startValidityTimeframe` and `endValidityTimeframe` (respectively) properties contained in the `credentialStatus` of the **credential**. +4. Return `true` if `startValidityTimeframe <= now < endValidityTimeframe`, `false` otherwise. + +## Test Vectors +See [`RevocationBitmap2022`](./revocation-bitmap-2022.mdx#test-vectors). \ No newline at end of file diff --git a/docs/content/sidebars/identity.js b/docs/content/sidebars/identity.js new file mode 100644 index 00000000000..ceba6878c5e --- /dev/null +++ b/docs/content/sidebars/identity.js @@ -0,0 +1,90 @@ +// Copyright (c) Mysten Labs, Inc. +// Modifications Copyright (c) 2024 IOTA Stiftung +// SPDX-License-Identifier: Apache-2.0 +const identity = [ + 'iota-identity/index', + { + type: 'category', + label: 'Getting Started', + collapsed: false, + items: ['iota-identity/getting-started/rust'], + }, + { + type: 'category', + label: 'Explanations', + items: [ + 'iota-identity/explanations/decentralized-identifiers', + 'iota-identity/explanations/verifiable-credentials', + 'iota-identity/explanations/verifiable-presentations', + 'iota-identity/explanations/about-identity-objects', + ], + }, + { + type: 'category', + label: 'How To', + items: [ + { + type: 'category', + label: 'Decentralized Identifiers (DID)', + items: [ + 'iota-identity/how-tos/decentralized-identifiers/create', + 'iota-identity/how-tos/decentralized-identifiers/update', + 'iota-identity/how-tos/decentralized-identifiers/resolve', + 'iota-identity/how-tos/decentralized-identifiers/delete', + ], + }, + { + type: 'category', + label: 'Verifiable Credentials', + items: [ + 'iota-identity/how-tos/verifiable-credentials/create', + 'iota-identity/how-tos/verifiable-credentials/revocation', + 'iota-identity/how-tos/verifiable-credentials/selective-disclosure', + 'iota-identity/how-tos/verifiable-credentials/zero-knowledge-selective-disclosure', + ], + }, + { + type: 'category', + label: 'Verifiable Presentations', + items: ['iota-identity/how-tos/verifiable-presentations/create-and-validate'], + }, + { + type: 'category', + label: 'Domain Linkage', + items: ['iota-identity/how-tos/domain-linkage/create-and-verify'], + }, + 'iota-identity/how-tos/key-storage', + ], + }, + { + type: 'category', + label: 'References', + collapsed: true, + items: [ + { + type: 'category', + label: 'API', + items: [ + { + type: 'link', + label: 'Rust', + href: 'https://docs.rs/identity_iota/latest/identity_iota/index.html', + }, + ], + }, + { + type: 'category', + label: 'Specifications', + items: [ + 'references/iota-identity/overview', + 'references/iota-identity/iota-did-method-spec', + 'references/iota-identity/revocation-bitmap-2022', + 'references/iota-identity/revocation-timeframe-2024', + ], + }, + ], + }, + 'iota-identity/contribute', +]; + +module.exports = identity; diff --git a/docs/content/sidebars/ts-sdk.js b/docs/content/sidebars/ts-sdk.js index 3ce2111226e..6951b07e0f4 100644 --- a/docs/content/sidebars/ts-sdk.js +++ b/docs/content/sidebars/ts-sdk.js @@ -3,7 +3,7 @@ // SPDX-License-Identifier: Apache-2.0 import typedocSidebar from '../references/ts-sdk/api/typedoc-sidebar.cjs'; -const references = [ +const tsSDK = [ { type: 'category', label: 'Typescript SDK', @@ -133,4 +133,4 @@ const references = [ }, ]; -module.exports = references; +module.exports = tsSDK; diff --git a/docs/site/docusaurus.config.js b/docs/site/docusaurus.config.js index 3edac2ca385..bdb717867cb 100644 --- a/docs/site/docusaurus.config.js +++ b/docs/site/docusaurus.config.js @@ -186,7 +186,8 @@ const config = { type: "text/css", }, ], - themes: ["@docusaurus/theme-live-codeblock", "@docusaurus/theme-mermaid", 'docusaurus-theme-search-typesense'], + themes: ["@docusaurus/theme-live-codeblock", "@docusaurus/theme-mermaid", 'docusaurus-theme-search-typesense', + '@saucelabs/theme-github-codeblock'], themeConfig: /** @type {import('@docusaurus/preset-classic').ThemeConfig} */ ({ @@ -241,10 +242,6 @@ const config = { label: "Developers", to: "developer", }, - { - label: "TS SDK", - to: "references/ts-sdk/typescript/", - }, { label: "Node Operators", to: "operator", @@ -253,6 +250,14 @@ const config = { label: "References", to: "references", }, + { + label: "TS SDK", + to: "references/ts-sdk/typescript/", + }, + { + label: "IOTA Identity", + to: "iota-identity", + }, ], }, footer: { diff --git a/docs/site/package.json b/docs/site/package.json index 28d0b5926e7..5f0f7503310 100644 --- a/docs/site/package.json +++ b/docs/site/package.json @@ -36,6 +36,7 @@ "@iota/iota-sdk": "workspace:*", "@mdx-js/react": "^3.0.1", "@mui/material": "^5.15.19", + "@saucelabs/theme-github-codeblock": "^0.3.0", "@tanstack/react-query": "^5.50.1", "autoprefixer": "^10.4.19", "axios": "^1.7.4", diff --git a/docs/site/sidebars.js b/docs/site/sidebars.js index 0207505a354..88001f36f83 100644 --- a/docs/site/sidebars.js +++ b/docs/site/sidebars.js @@ -8,6 +8,7 @@ const aboutIota = require("../content/sidebars/about-iota.js"); const operator = require("../content/sidebars/operator.js"); const references = require("../content/sidebars/references.js"); const tsSDK = require("../content/sidebars/ts-sdk.js") +const identity = require("../content/sidebars/identity.js") const sidebars = { //whyIOTASidebar: why_iota, @@ -16,6 +17,7 @@ const sidebars = { aboutIotaSidebar: aboutIota, referencesSidebar: references, tsSDK: tsSDK, + identity: identity, }; module.exports = sidebars; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 0f8d5ad6e06..d1595c130be 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -59,7 +59,7 @@ importers: version: 9.1.0(eslint@8.57.1) eslint-import-resolver-typescript: specifier: ^3.6.1 - version: 3.6.3(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.6.2))(eslint-plugin-import@2.30.0)(eslint@8.57.1) + version: 3.6.3(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.30.0)(eslint@8.57.1) eslint-plugin-header: specifier: ^3.1.1 version: 3.1.1(eslint@8.57.1) @@ -119,7 +119,7 @@ importers: version: link:../../sdk/typescript '@nestjs/cache-manager': specifier: ^2.2.2 - version: 2.2.2(@nestjs/common@10.4.4(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/core@10.4.4(@nestjs/common@10.4.4(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/platform-express@10.4.4)(reflect-metadata@0.2.2)(rxjs@7.8.1))(cache-manager@5.7.6)(rxjs@7.8.1) + version: 2.2.2(@nestjs/common@10.4.4(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/core@10.4.4)(cache-manager@5.7.6)(rxjs@7.8.1) '@nestjs/common': specifier: ^10.0.0 version: 10.4.4(reflect-metadata@0.2.2)(rxjs@7.8.1) @@ -134,7 +134,7 @@ importers: version: 10.4.4(@nestjs/common@10.4.4(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/core@10.4.4) '@nestjs/schedule': specifier: ^4.0.2 - version: 4.1.1(@nestjs/common@10.4.4(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/core@10.4.4(@nestjs/common@10.4.4(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/platform-express@10.4.4)(reflect-metadata@0.2.2)(rxjs@7.8.1)) + version: 4.1.1(@nestjs/common@10.4.4(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/core@10.4.4) cache-manager: specifier: ^5.6.1 version: 5.7.6 @@ -144,13 +144,13 @@ importers: devDependencies: '@nestjs/cli': specifier: ^10.0.0 - version: 10.4.5(@swc/core@1.7.28) + version: 10.4.5(@swc/core@1.7.28(@swc/helpers@0.5.5)) '@nestjs/schematics': specifier: ^10.0.0 version: 10.1.4(chokidar@3.6.0)(typescript@5.6.2) '@nestjs/testing': specifier: ^10.0.0 - version: 10.4.4(@nestjs/common@10.4.4(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/core@10.4.4(@nestjs/common@10.4.4(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/platform-express@10.4.4)(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/platform-express@10.4.4(@nestjs/common@10.4.4(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/core@10.4.4)) + version: 10.4.4(@nestjs/common@10.4.4(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/core@10.4.4)(@nestjs/platform-express@10.4.4) '@types/express': specifier: ^4.17.17 version: 4.17.21 @@ -180,7 +180,7 @@ importers: version: 5.2.1(@types/eslint@8.56.12)(eslint-config-prettier@9.1.0(eslint@8.57.1))(eslint@8.57.1)(prettier@3.3.3) jest: specifier: ^29.5.0 - version: 29.7.0(@types/node@20.16.9)(babel-plugin-macros@3.1.0)(node-notifier@10.0.0)(ts-node@10.9.2(@types/node@20.16.9)(typescript@5.6.2)) + version: 29.7.0(@types/node@20.16.9)(babel-plugin-macros@3.1.0)(node-notifier@10.0.0)(ts-node@10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(typescript@5.6.2)) prettier: specifier: ^3.3.1 version: 3.3.3 @@ -192,13 +192,13 @@ importers: version: 6.3.4 ts-jest: specifier: ^29.1.0 - version: 29.2.5(@babel/core@7.25.2)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.25.2))(jest@29.7.0(@types/node@20.16.9)(babel-plugin-macros@3.1.0)(node-notifier@10.0.0)(ts-node@10.9.2(@types/node@20.16.9)(typescript@5.6.2)))(typescript@5.6.2) + version: 29.2.5(@babel/core@7.25.2)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.25.2))(jest@29.7.0(@types/node@20.16.9)(babel-plugin-macros@3.1.0)(node-notifier@10.0.0)(ts-node@10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(typescript@5.6.2)))(typescript@5.6.2) ts-loader: specifier: ^9.4.4 - version: 9.5.1(typescript@5.6.2)(webpack@5.95.0(@swc/core@1.7.28)) + version: 9.5.1(typescript@5.6.2)(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))) ts-node: specifier: ^10.9.1 - version: 10.9.2(@swc/core@1.7.28)(@types/node@20.16.9)(typescript@5.6.2) + version: 10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(typescript@5.6.2) tsconfig-paths: specifier: ^4.2.0 version: 4.2.0 @@ -277,13 +277,13 @@ importers: devDependencies: '@headlessui/tailwindcss': specifier: ^0.1.3 - version: 0.1.3(tailwindcss@3.4.13(ts-node@10.9.2(@types/node@22.7.3)(typescript@5.6.2))) + version: 0.1.3(tailwindcss@3.4.13(ts-node@10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@22.7.3)(typescript@5.6.2))) '@tailwindcss/aspect-ratio': specifier: ^0.4.2 - version: 0.4.2(tailwindcss@3.4.13(ts-node@10.9.2(@types/node@22.7.3)(typescript@5.6.2))) + version: 0.4.2(tailwindcss@3.4.13(ts-node@10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@22.7.3)(typescript@5.6.2))) '@tailwindcss/forms': specifier: ^0.5.7 - version: 0.5.9(tailwindcss@3.4.13(ts-node@10.9.2(@types/node@22.7.3)(typescript@5.6.2))) + version: 0.5.9(tailwindcss@3.4.13(ts-node@10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@22.7.3)(typescript@5.6.2))) '@types/react': specifier: ^18.3.3 version: 18.3.9 @@ -295,7 +295,7 @@ importers: version: 8.4.47 tailwindcss: specifier: ^3.3.3 - version: 3.4.13(ts-node@10.9.2(@types/node@22.7.3)(typescript@5.6.2)) + version: 3.4.13(ts-node@10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@22.7.3)(typescript@5.6.2)) typescript: specifier: ^5.5.3 version: 5.6.2 @@ -518,7 +518,7 @@ importers: version: 2.0.8 tailwindcss: specifier: ^3.3.3 - version: 3.4.13(ts-node@10.9.2(@swc/core@1.7.28)(@types/node@20.16.9)(typescript@5.6.2)) + version: 3.4.13(ts-node@10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(typescript@5.6.2)) tsconfig-paths: specifier: ^4.2.0 version: 4.2.0 @@ -645,7 +645,7 @@ importers: version: 4.0.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@7.6.20) tailwindcss: specifier: ^3.3.3 - version: 3.4.13(ts-node@10.9.2(@swc/core@1.7.28)(@types/node@20.16.9)(typescript@5.6.2)) + version: 3.4.13(ts-node@10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(typescript@5.6.2)) typescript: specifier: ^5.5.3 version: 5.6.2 @@ -910,7 +910,7 @@ importers: version: 0.10.7 '@types/webpack': specifier: ^5.28.1 - version: 5.28.5(@swc/core@1.7.28)(webpack-cli@5.1.4(webpack@5.95.0)) + version: 5.28.5(@swc/core@1.7.28(@swc/helpers@0.5.5))(webpack-cli@5.1.4) '@types/zxcvbn': specifier: ^4.4.1 version: 4.4.5 @@ -919,19 +919,19 @@ importers: version: 4.3.1(vite@5.4.8(@types/node@20.16.9)(sass@1.79.3)(terser@5.34.0)) copy-webpack-plugin: specifier: ^11.0.0 - version: 11.0.0(webpack@5.95.0(@swc/core@1.7.28)(webpack-cli@5.1.4)) + version: 11.0.0(webpack@5.95.0) cross-env: specifier: ^7.0.3 version: 7.0.3 css-loader: specifier: ^6.7.3 - version: 6.11.0(webpack@5.95.0(@swc/core@1.7.28)(webpack-cli@5.1.4)) + version: 6.11.0(webpack@5.95.0) dotenv: specifier: ^16.4.5 version: 16.4.5 eslint-webpack-plugin: specifier: ^4.0.1 - version: 4.2.0(eslint@8.57.1)(webpack@5.95.0(@swc/core@1.7.28)(webpack-cli@5.1.4)) + version: 4.2.0(eslint@8.57.1)(webpack@5.95.0) git-rev-sync: specifier: ^3.0.2 version: 3.0.2 @@ -940,10 +940,10 @@ importers: version: 10.11.2 html-webpack-plugin: specifier: ^5.5.3 - version: 5.6.0(webpack@5.95.0(@swc/core@1.7.28)(webpack-cli@5.1.4)) + version: 5.6.0(webpack@5.95.0) mini-css-extract-plugin: specifier: ^2.7.6 - version: 2.9.1(webpack@5.95.0(@swc/core@1.7.28)(webpack-cli@5.1.4)) + version: 2.9.1(webpack@5.95.0) onchange: specifier: ^7.1.0 version: 7.1.0 @@ -952,7 +952,7 @@ importers: version: 8.4.47 postcss-loader: specifier: ^7.3.3 - version: 7.3.4(postcss@8.4.47)(typescript@5.6.2)(webpack@5.95.0(@swc/core@1.7.28)(webpack-cli@5.1.4)) + version: 7.3.4(postcss@8.4.47)(typescript@5.6.2)(webpack@5.95.0) postcss-preset-env: specifier: ^9.0.0 version: 9.6.0(postcss@8.4.47) @@ -961,19 +961,19 @@ importers: version: 1.79.3 sass-loader: specifier: ^13.3.2 - version: 13.3.3(sass@1.79.3)(webpack@5.95.0(@swc/core@1.7.28)(webpack-cli@5.1.4)) + version: 13.3.3(sass@1.79.3)(webpack@5.95.0) tailwindcss: specifier: ^3.3.3 - version: 3.4.13(ts-node@10.9.2(@swc/core@1.7.28)(@types/node@20.16.9)(typescript@5.6.2)) + version: 3.4.13(ts-node@10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(typescript@5.6.2)) tailwindcss-animate: specifier: ^1.0.7 - version: 1.0.7(tailwindcss@3.4.13(ts-node@10.9.2(@swc/core@1.7.28)(@types/node@20.16.9)(typescript@5.6.2))) + version: 1.0.7(tailwindcss@3.4.13(ts-node@10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(typescript@5.6.2))) ts-loader: specifier: ^9.4.4 - version: 9.5.1(typescript@5.6.2)(webpack@5.95.0(@swc/core@1.7.28)(webpack-cli@5.1.4)) + version: 9.5.1(typescript@5.6.2)(webpack@5.95.0) ts-node: specifier: ^10.9.1 - version: 10.9.2(@swc/core@1.7.28)(@types/node@20.16.9)(typescript@5.6.2) + version: 10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(typescript@5.6.2) tsconfig-paths: specifier: ^4.2.0 version: 4.2.0 @@ -994,7 +994,7 @@ importers: version: 7.12.0(body-parser@1.20.3) webpack: specifier: ^5.79.0 - version: 5.95.0(@swc/core@1.7.28)(webpack-cli@5.1.4) + version: 5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(webpack-cli@5.1.4) webpack-cli: specifier: ^5.0.1 version: 5.1.4(webpack@5.95.0) @@ -1067,16 +1067,16 @@ importers: version: 14.2.3(eslint@8.57.1)(typescript@5.6.2) jest: specifier: ^29.5.0 - version: 29.7.0(@types/node@20.16.9)(babel-plugin-macros@3.1.0)(node-notifier@10.0.0)(ts-node@10.9.2(@types/node@20.16.9)(typescript@5.6.2)) + version: 29.7.0(@types/node@20.16.9)(babel-plugin-macros@3.1.0)(node-notifier@10.0.0)(ts-node@10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(typescript@5.6.2)) postcss: specifier: ^8.4.31 version: 8.4.47 tailwindcss: specifier: ^3.3.3 - version: 3.4.13(ts-node@10.9.2(@swc/core@1.7.28)(@types/node@20.16.9)(typescript@5.6.2)) + version: 3.4.13(ts-node@10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(typescript@5.6.2)) ts-jest: specifier: ^29.1.0 - version: 29.2.5(@babel/core@7.25.2)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.25.2))(jest@29.7.0(@types/node@20.16.9)(babel-plugin-macros@3.1.0)(node-notifier@10.0.0)(ts-node@10.9.2(@types/node@20.16.9)(typescript@5.6.2)))(typescript@5.6.2) + version: 29.2.5(@babel/core@7.25.2)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.25.2))(jest@29.7.0(@types/node@20.16.9)(babel-plugin-macros@3.1.0)(node-notifier@10.0.0)(ts-node@10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(typescript@5.6.2)))(typescript@5.6.2) typescript: specifier: ^5.5.3 version: 5.6.2 @@ -1116,7 +1116,7 @@ importers: devDependencies: '@headlessui/tailwindcss': specifier: ^0.1.3 - version: 0.1.3(tailwindcss@3.4.13(ts-node@10.9.2(@types/node@22.7.3)(typescript@5.6.2))) + version: 0.1.3(tailwindcss@3.4.13(ts-node@10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@22.7.3)(typescript@5.6.2))) '@types/react': specifier: ^18.3.3 version: 18.3.9 @@ -1134,7 +1134,7 @@ importers: version: 8.4.47 tailwindcss: specifier: ^3.3.3 - version: 3.4.13(ts-node@10.9.2(@types/node@22.7.3)(typescript@5.6.2)) + version: 3.4.13(ts-node@10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@22.7.3)(typescript@5.6.2)) typescript: specifier: ^5.5.3 version: 5.6.2 @@ -1228,7 +1228,7 @@ importers: devDependencies: '@tailwindcss/forms': specifier: ^0.5.7 - version: 0.5.9(tailwindcss@3.4.13(ts-node@10.9.2(@types/node@22.7.3)(typescript@5.6.2))) + version: 0.5.9(tailwindcss@3.4.13(ts-node@10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@22.7.3)(typescript@5.6.2))) '@tsconfig/docusaurus': specifier: ^2.0.3 version: 2.0.3 @@ -1249,10 +1249,10 @@ importers: version: 8.4.47 tailwindcss: specifier: ^3.3.3 - version: 3.4.13(ts-node@10.9.2(@types/node@22.7.3)(typescript@5.6.2)) + version: 3.4.13(ts-node@10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@22.7.3)(typescript@5.6.2)) tailwindcss-animate: specifier: ^1.0.7 - version: 1.0.7(tailwindcss@3.4.13(ts-node@10.9.2(@types/node@22.7.3)(typescript@5.6.2))) + version: 1.0.7(tailwindcss@3.4.13(ts-node@10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@22.7.3)(typescript@5.6.2))) typescript: specifier: ^5.5.3 version: 5.6.2 @@ -1298,7 +1298,7 @@ importers: version: 8.4.47 tailwindcss: specifier: ^3.3.3 - version: 3.4.13(ts-node@10.9.2(@types/node@22.7.3)(typescript@5.6.2)) + version: 3.4.13(ts-node@10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@22.7.3)(typescript@5.6.2)) typescript: specifier: ^5.5.3 version: 5.6.2 @@ -1316,25 +1316,25 @@ importers: version: 3.6.1(@algolia/client-search@4.24.0)(@types/react@18.3.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@docusaurus/core': specifier: 3.5.2 - version: 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) + version: 3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) '@docusaurus/preset-classic': specifier: 3.5.2 - version: 3.5.2(@algolia/client-search@4.24.0)(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@types/react@18.3.9)(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) + version: 3.5.2(@algolia/client-search@4.24.0)(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/react@18.3.9)(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) '@docusaurus/remark-plugin-npm2yarn': specifier: ^3.5.2 version: 3.5.2 '@docusaurus/theme-common': specifier: ^3.5.2 - version: 3.5.2(@docusaurus/plugin-content-docs@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16))(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2) + version: 3.5.2(@docusaurus/plugin-content-docs@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16))(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2) '@docusaurus/theme-live-codeblock': specifier: ^3.5.2 - version: 3.5.2(@docusaurus/plugin-content-docs@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16))(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) + version: 3.5.2(@docusaurus/plugin-content-docs@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16))(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) '@docusaurus/theme-mermaid': specifier: ^3.5.2 - version: 3.5.2(@docusaurus/plugin-content-docs@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) + version: 3.5.2(@docusaurus/plugin-content-docs@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) '@docusaurus/theme-search-algolia': specifier: ^3.5.2 - version: 3.5.2(@algolia/client-search@4.24.0)(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@types/react@18.3.9)(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) + version: 3.5.2(@algolia/client-search@4.24.0)(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/react@18.3.9)(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) '@emotion/react': specifier: ^11.11.4 version: 11.13.3(@types/react@18.3.9)(react@18.3.1) @@ -1343,7 +1343,7 @@ importers: version: 11.13.0(@emotion/react@11.13.3(@types/react@18.3.9)(react@18.3.1))(@types/react@18.3.9)(react@18.3.1) '@graphql-markdown/docusaurus': specifier: ^1.24.1 - version: 1.26.2(@docusaurus/logger@3.5.2)(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(graphql-config@5.1.2(@types/node@22.7.3)(graphql@16.9.0)(typescript@5.6.2))(graphql@16.9.0)(prettier@3.3.3)(typescript@5.6.2) + version: 1.26.2(@docusaurus/logger@3.5.2)(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(graphql-config@5.1.2(@types/node@22.7.3)(graphql@16.9.0)(typescript@5.6.2))(graphql@16.9.0)(prettier@3.3.3)(typescript@5.6.2) '@graphql-tools/graphql-file-loader': specifier: ^8.0.1 version: 8.0.1(graphql@16.9.0) @@ -1359,6 +1359,9 @@ importers: '@mui/material': specifier: ^5.15.19 version: 5.16.7(@emotion/react@11.13.3(@types/react@18.3.9)(react@18.3.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(@types/react@18.3.9)(react@18.3.1))(@types/react@18.3.9)(react@18.3.1))(@types/react@18.3.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@saucelabs/theme-github-codeblock': + specifier: ^0.3.0 + version: 0.3.0 '@tanstack/react-query': specifier: ^5.50.1 version: 5.56.2(react@18.3.1) @@ -1376,7 +1379,7 @@ importers: version: 3.2.0 docusaurus-theme-search-typesense: specifier: 0.20.0-0 - version: 0.20.0-0(@algolia/client-search@4.24.0)(@babel/runtime@7.25.6)(@docusaurus/core@3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16))(@docusaurus/theme-common@3.5.2(@docusaurus/plugin-content-docs@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16))(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2))(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/react@18.3.9)(algoliasearch@4.24.0)(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) + version: 0.20.0-0(iea5eyhbiud2dlcqtud2g4pxzm) dotenv: specifier: ^16.4.5 version: 16.4.5 @@ -1433,7 +1436,7 @@ importers: version: 6.0.0 tailwindcss: specifier: ^3.3.3 - version: 3.4.13(ts-node@10.9.2(@types/node@22.7.3)(typescript@5.6.2)) + version: 3.4.13(ts-node@10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@22.7.3)(typescript@5.6.2)) web3: specifier: ^4.2.2 version: 4.13.0(typescript@5.6.2)(zod@3.23.8) @@ -1443,13 +1446,13 @@ importers: version: 7.25.2(@babel/core@7.25.2) '@docusaurus/module-type-aliases': specifier: 3.5.2 - version: 3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@docusaurus/tsconfig': specifier: 3.5.2 version: 3.5.2 '@docusaurus/types': specifier: 3.5.2 - version: 3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@metamask/providers': specifier: ^10.2.1 version: 10.2.1 @@ -2027,7 +2030,7 @@ importers: version: 5.6.2 typescript-json-schema: specifier: ^0.64.0 - version: 0.64.0(@swc/core@1.7.28) + version: 0.64.0(@swc/core@1.7.28(@swc/helpers@0.5.5)) packages: @@ -6253,6 +6256,9 @@ packages: '@rushstack/ts-command-line@4.19.1': resolution: {integrity: sha512-J7H768dgcpG60d7skZ5uSSwyCZs/S2HrWP1Ds8d1qYAyaaeJmpmmLr9BVw97RjFzmQPOYnoXcKA4GkqDCkduQg==} + '@saucelabs/theme-github-codeblock@0.3.0': + resolution: {integrity: sha512-+8xWxBfN+I8StJ0QXERMbGf+BHwRXHWV3mFl9uDayXERiZ/rR93d0nAS3s9s/rKjqh/YSm/4dThEkBNBLnGs4Q==} + '@scure/base@1.1.9': resolution: {integrity: sha512-8YKhl8GHiNI/pU2VMaofa2Tor7PJRAjwQLBBuilkJ9L5+13yVbC7JO/wS7piioAvPSwR3JKM1IJ/u4xQzbcXKg==} @@ -18497,7 +18503,7 @@ snapshots: transitivePeerDependencies: - '@algolia/client-search' - '@docusaurus/core@3.4.0(@docusaurus/types@3.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16)': + '@docusaurus/core@3.4.0(@docusaurus/types@3.4.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16)': dependencies: '@babel/core': 7.25.2 '@babel/generator': 7.25.6 @@ -18511,12 +18517,12 @@ snapshots: '@babel/traverse': 7.25.6 '@docusaurus/cssnano-preset': 3.4.0 '@docusaurus/logger': 3.4.0 - '@docusaurus/mdx-loader': 3.4.0(@docusaurus/types@3.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2) - '@docusaurus/utils': 3.4.0(@docusaurus/types@3.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.6.2) - '@docusaurus/utils-common': 3.4.0(@docusaurus/types@3.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) - '@docusaurus/utils-validation': 3.4.0(@docusaurus/types@3.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.6.2) + '@docusaurus/mdx-loader': 3.4.0(@docusaurus/types@3.4.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2) + '@docusaurus/utils': 3.4.0(@docusaurus/types@3.4.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(typescript@5.6.2) + '@docusaurus/utils-common': 3.4.0(@docusaurus/types@3.4.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + '@docusaurus/utils-validation': 3.4.0(@docusaurus/types@3.4.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(typescript@5.6.2) autoprefixer: 10.4.20(postcss@8.4.47) - babel-loader: 9.2.1(@babel/core@7.25.2)(webpack@5.95.0) + babel-loader: 9.2.1(@babel/core@7.25.2)(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))) babel-plugin-dynamic-import-node: 2.3.3 boxen: 6.2.1 chalk: 4.1.2 @@ -18525,34 +18531,34 @@ snapshots: cli-table3: 0.6.5 combine-promises: 1.2.0 commander: 5.1.0 - copy-webpack-plugin: 11.0.0(webpack@5.95.0) + copy-webpack-plugin: 11.0.0(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))) core-js: 3.38.1 - css-loader: 6.11.0(webpack@5.95.0) - css-minimizer-webpack-plugin: 5.0.1(clean-css@5.3.3)(webpack@5.95.0) + css-loader: 6.11.0(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))) + css-minimizer-webpack-plugin: 5.0.1(clean-css@5.3.3)(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))) cssnano: 6.1.2(postcss@8.4.47) del: 6.1.1 detect-port: 1.6.1 escape-html: 1.0.3 eta: 2.2.0 eval: 0.1.8 - file-loader: 6.2.0(webpack@5.95.0) + file-loader: 6.2.0(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))) fs-extra: 11.2.0 html-minifier-terser: 7.2.0 html-tags: 3.3.1 - html-webpack-plugin: 5.6.0(webpack@5.95.0) + html-webpack-plugin: 5.6.0(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))) leven: 3.1.0 lodash: 4.17.21 - mini-css-extract-plugin: 2.9.1(webpack@5.95.0) + mini-css-extract-plugin: 2.9.1(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))) p-map: 4.0.0 postcss: 8.4.47 - postcss-loader: 7.3.4(postcss@8.4.47)(typescript@5.6.2)(webpack@5.95.0) + postcss-loader: 7.3.4(postcss@8.4.47)(typescript@5.6.2)(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))) prompts: 2.4.2 react: 18.3.1 - react-dev-utils: 12.0.1(eslint@8.57.1)(typescript@5.6.2)(vue-template-compiler@2.7.16)(webpack@5.95.0) + react-dev-utils: 12.0.1(eslint@8.57.1)(typescript@5.6.2)(vue-template-compiler@2.7.16)(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))) react-dom: 18.3.1(react@18.3.1) react-helmet-async: 1.3.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react-loadable: '@docusaurus/react-loadable@6.0.0(react@18.3.1)' - react-loadable-ssr-addon-v5-slorber: 1.0.1(@docusaurus/react-loadable@6.0.0(react@18.3.1))(webpack@5.95.0) + react-loadable-ssr-addon-v5-slorber: 1.0.1(@docusaurus/react-loadable@6.0.0(react@18.3.1))(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))) react-router: 5.3.4(react@18.3.1) react-router-config: 5.1.1(react-router@5.3.4(react@18.3.1))(react@18.3.1) react-router-dom: 5.3.4(react@18.3.1) @@ -18560,15 +18566,15 @@ snapshots: semver: 7.6.3 serve-handler: 6.1.5 shelljs: 0.8.5 - terser-webpack-plugin: 5.3.10(webpack@5.95.0) + terser-webpack-plugin: 5.3.10(@swc/core@1.7.28(@swc/helpers@0.5.5))(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))) tslib: 2.7.0 update-notifier: 6.0.2 - url-loader: 4.1.1(file-loader@6.2.0(webpack@5.95.0))(webpack@5.95.0) - webpack: 5.95.0 + url-loader: 4.1.1(file-loader@6.2.0(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))))(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))) + webpack: 5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5)) webpack-bundle-analyzer: 4.10.2 - webpack-dev-server: 4.15.2(webpack@5.95.0) + webpack-dev-server: 4.15.2(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))) webpack-merge: 5.10.0 - webpackbar: 5.0.2(webpack@5.95.0) + webpackbar: 5.0.2(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))) transitivePeerDependencies: - '@docusaurus/types' - '@parcel/css' @@ -18588,7 +18594,7 @@ snapshots: - vue-template-compiler - webpack-cli - '@docusaurus/core@3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16)': + '@docusaurus/core@3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16)': dependencies: '@babel/core': 7.25.2 '@babel/generator': 7.25.6 @@ -18602,13 +18608,13 @@ snapshots: '@babel/traverse': 7.25.6 '@docusaurus/cssnano-preset': 3.5.2 '@docusaurus/logger': 3.5.2 - '@docusaurus/mdx-loader': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2) - '@docusaurus/utils': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.6.2) - '@docusaurus/utils-common': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) - '@docusaurus/utils-validation': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.6.2) + '@docusaurus/mdx-loader': 3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2) + '@docusaurus/utils': 3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(typescript@5.6.2) + '@docusaurus/utils-common': 3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + '@docusaurus/utils-validation': 3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(typescript@5.6.2) '@mdx-js/react': 3.0.1(@types/react@18.3.9)(react@18.3.1) autoprefixer: 10.4.20(postcss@8.4.47) - babel-loader: 9.2.1(@babel/core@7.25.2)(webpack@5.95.0) + babel-loader: 9.2.1(@babel/core@7.25.2)(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))) babel-plugin-dynamic-import-node: 2.3.3 boxen: 6.2.1 chalk: 4.1.2 @@ -18617,34 +18623,34 @@ snapshots: cli-table3: 0.6.5 combine-promises: 1.2.0 commander: 5.1.0 - copy-webpack-plugin: 11.0.0(webpack@5.95.0) + copy-webpack-plugin: 11.0.0(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))) core-js: 3.38.1 - css-loader: 6.11.0(webpack@5.95.0) - css-minimizer-webpack-plugin: 5.0.1(clean-css@5.3.3)(webpack@5.95.0) + css-loader: 6.11.0(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))) + css-minimizer-webpack-plugin: 5.0.1(clean-css@5.3.3)(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))) cssnano: 6.1.2(postcss@8.4.47) del: 6.1.1 detect-port: 1.6.1 escape-html: 1.0.3 eta: 2.2.0 eval: 0.1.8 - file-loader: 6.2.0(webpack@5.95.0) + file-loader: 6.2.0(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))) fs-extra: 11.2.0 html-minifier-terser: 7.2.0 html-tags: 3.3.1 - html-webpack-plugin: 5.6.0(webpack@5.95.0) + html-webpack-plugin: 5.6.0(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))) leven: 3.1.0 lodash: 4.17.21 - mini-css-extract-plugin: 2.9.1(webpack@5.95.0) + mini-css-extract-plugin: 2.9.1(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))) p-map: 4.0.0 postcss: 8.4.47 - postcss-loader: 7.3.4(postcss@8.4.47)(typescript@5.6.2)(webpack@5.95.0) + postcss-loader: 7.3.4(postcss@8.4.47)(typescript@5.6.2)(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))) prompts: 2.4.2 react: 18.3.1 - react-dev-utils: 12.0.1(eslint@8.57.1)(typescript@5.6.2)(vue-template-compiler@2.7.16)(webpack@5.95.0) + react-dev-utils: 12.0.1(eslint@8.57.1)(typescript@5.6.2)(vue-template-compiler@2.7.16)(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))) react-dom: 18.3.1(react@18.3.1) react-helmet-async: 1.3.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react-loadable: '@docusaurus/react-loadable@6.0.0(react@18.3.1)' - react-loadable-ssr-addon-v5-slorber: 1.0.1(@docusaurus/react-loadable@6.0.0(react@18.3.1))(webpack@5.95.0) + react-loadable-ssr-addon-v5-slorber: 1.0.1(@docusaurus/react-loadable@6.0.0(react@18.3.1))(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))) react-router: 5.3.4(react@18.3.1) react-router-config: 5.1.1(react-router@5.3.4(react@18.3.1))(react@18.3.1) react-router-dom: 5.3.4(react@18.3.1) @@ -18652,15 +18658,15 @@ snapshots: semver: 7.6.3 serve-handler: 6.1.5 shelljs: 0.8.5 - terser-webpack-plugin: 5.3.10(webpack@5.95.0) + terser-webpack-plugin: 5.3.10(@swc/core@1.7.28(@swc/helpers@0.5.5))(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))) tslib: 2.7.0 update-notifier: 6.0.2 - url-loader: 4.1.1(file-loader@6.2.0(webpack@5.95.0))(webpack@5.95.0) - webpack: 5.95.0 + url-loader: 4.1.1(file-loader@6.2.0(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))))(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))) + webpack: 5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5)) webpack-bundle-analyzer: 4.10.2 - webpack-dev-server: 4.15.2(webpack@5.95.0) + webpack-dev-server: 4.15.2(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))) webpack-merge: 5.10.0 - webpackbar: 5.0.2(webpack@5.95.0) + webpackbar: 5.0.2(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))) transitivePeerDependencies: - '@docusaurus/types' - '@parcel/css' @@ -18704,16 +18710,16 @@ snapshots: chalk: 4.1.2 tslib: 2.7.0 - '@docusaurus/mdx-loader@3.4.0(@docusaurus/types@3.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)': + '@docusaurus/mdx-loader@3.4.0(@docusaurus/types@3.4.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)': dependencies: '@docusaurus/logger': 3.4.0 - '@docusaurus/utils': 3.4.0(@docusaurus/types@3.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.6.2) - '@docusaurus/utils-validation': 3.4.0(@docusaurus/types@3.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.6.2) + '@docusaurus/utils': 3.4.0(@docusaurus/types@3.4.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(typescript@5.6.2) + '@docusaurus/utils-validation': 3.4.0(@docusaurus/types@3.4.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(typescript@5.6.2) '@mdx-js/mdx': 3.0.1 '@slorber/remark-comment': 1.0.0 escape-html: 1.0.3 estree-util-value-to-estree: 3.1.2 - file-loader: 6.2.0(webpack@5.95.0) + file-loader: 6.2.0(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))) fs-extra: 11.2.0 image-size: 1.1.1 mdast-util-mdx: 3.0.0 @@ -18729,9 +18735,9 @@ snapshots: tslib: 2.7.0 unified: 11.0.5 unist-util-visit: 5.0.0 - url-loader: 4.1.1(file-loader@6.2.0(webpack@5.95.0))(webpack@5.95.0) + url-loader: 4.1.1(file-loader@6.2.0(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))))(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))) vfile: 6.0.3 - webpack: 5.95.0 + webpack: 5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5)) transitivePeerDependencies: - '@docusaurus/types' - '@swc/core' @@ -18741,16 +18747,16 @@ snapshots: - uglify-js - webpack-cli - '@docusaurus/mdx-loader@3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)': + '@docusaurus/mdx-loader@3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)': dependencies: '@docusaurus/logger': 3.5.2 - '@docusaurus/utils': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.6.2) - '@docusaurus/utils-validation': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.6.2) + '@docusaurus/utils': 3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(typescript@5.6.2) + '@docusaurus/utils-validation': 3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(typescript@5.6.2) '@mdx-js/mdx': 3.0.1 '@slorber/remark-comment': 1.0.0 escape-html: 1.0.3 estree-util-value-to-estree: 3.1.2 - file-loader: 6.2.0(webpack@5.95.0) + file-loader: 6.2.0(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))) fs-extra: 11.2.0 image-size: 1.1.1 mdast-util-mdx: 3.0.0 @@ -18766,9 +18772,9 @@ snapshots: tslib: 2.7.0 unified: 11.0.5 unist-util-visit: 5.0.0 - url-loader: 4.1.1(file-loader@6.2.0(webpack@5.95.0))(webpack@5.95.0) + url-loader: 4.1.1(file-loader@6.2.0(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))))(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))) vfile: 6.0.3 - webpack: 5.95.0 + webpack: 5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5)) transitivePeerDependencies: - '@docusaurus/types' - '@swc/core' @@ -18778,9 +18784,9 @@ snapshots: - uglify-js - webpack-cli - '@docusaurus/module-type-aliases@3.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@docusaurus/module-type-aliases@3.4.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@docusaurus/types': 3.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@docusaurus/types': 3.4.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@types/history': 4.7.11 '@types/react': 18.3.9 '@types/react-router-config': 5.0.11 @@ -18796,9 +18802,9 @@ snapshots: - uglify-js - webpack-cli - '@docusaurus/module-type-aliases@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@docusaurus/module-type-aliases@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@docusaurus/types': 3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@docusaurus/types': 3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@types/history': 4.7.11 '@types/react': 18.3.9 '@types/react-router-config': 5.0.11 @@ -18814,17 +18820,17 @@ snapshots: - uglify-js - webpack-cli - '@docusaurus/plugin-content-blog@3.5.2(@docusaurus/plugin-content-docs@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16)': + '@docusaurus/plugin-content-blog@3.5.2(@docusaurus/plugin-content-docs@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16)': dependencies: - '@docusaurus/core': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) + '@docusaurus/core': 3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) '@docusaurus/logger': 3.5.2 - '@docusaurus/mdx-loader': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2) - '@docusaurus/plugin-content-docs': 3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) - '@docusaurus/theme-common': 3.5.2(@docusaurus/plugin-content-docs@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16))(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2) - '@docusaurus/types': 3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@docusaurus/utils': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.6.2) - '@docusaurus/utils-common': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) - '@docusaurus/utils-validation': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.6.2) + '@docusaurus/mdx-loader': 3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2) + '@docusaurus/plugin-content-docs': 3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) + '@docusaurus/theme-common': 3.5.2(@docusaurus/plugin-content-docs@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16))(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2) + '@docusaurus/types': 3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@docusaurus/utils': 3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(typescript@5.6.2) + '@docusaurus/utils-common': 3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + '@docusaurus/utils-validation': 3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(typescript@5.6.2) cheerio: 1.0.0-rc.12 feed: 4.2.2 fs-extra: 11.2.0 @@ -18836,7 +18842,7 @@ snapshots: tslib: 2.7.0 unist-util-visit: 5.0.0 utility-types: 3.11.0 - webpack: 5.95.0 + webpack: 5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5)) transitivePeerDependencies: - '@mdx-js/react' - '@parcel/css' @@ -18856,16 +18862,16 @@ snapshots: - vue-template-compiler - webpack-cli - '@docusaurus/plugin-content-docs@3.4.0(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16)': + '@docusaurus/plugin-content-docs@3.4.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16)': dependencies: - '@docusaurus/core': 3.4.0(@docusaurus/types@3.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) + '@docusaurus/core': 3.4.0(@docusaurus/types@3.4.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) '@docusaurus/logger': 3.4.0 - '@docusaurus/mdx-loader': 3.4.0(@docusaurus/types@3.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2) - '@docusaurus/module-type-aliases': 3.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@docusaurus/types': 3.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@docusaurus/utils': 3.4.0(@docusaurus/types@3.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.6.2) - '@docusaurus/utils-common': 3.4.0(@docusaurus/types@3.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) - '@docusaurus/utils-validation': 3.4.0(@docusaurus/types@3.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.6.2) + '@docusaurus/mdx-loader': 3.4.0(@docusaurus/types@3.4.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2) + '@docusaurus/module-type-aliases': 3.4.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@docusaurus/types': 3.4.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@docusaurus/utils': 3.4.0(@docusaurus/types@3.4.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(typescript@5.6.2) + '@docusaurus/utils-common': 3.4.0(@docusaurus/types@3.4.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + '@docusaurus/utils-validation': 3.4.0(@docusaurus/types@3.4.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(typescript@5.6.2) '@types/react-router-config': 5.0.11 combine-promises: 1.2.0 fs-extra: 11.2.0 @@ -18875,7 +18881,7 @@ snapshots: react-dom: 18.3.1(react@18.3.1) tslib: 2.7.0 utility-types: 3.11.0 - webpack: 5.95.0 + webpack: 5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5)) transitivePeerDependencies: - '@parcel/css' - '@rspack/core' @@ -18894,17 +18900,17 @@ snapshots: - vue-template-compiler - webpack-cli - '@docusaurus/plugin-content-docs@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16)': + '@docusaurus/plugin-content-docs@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16)': dependencies: - '@docusaurus/core': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) + '@docusaurus/core': 3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) '@docusaurus/logger': 3.5.2 - '@docusaurus/mdx-loader': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2) - '@docusaurus/module-type-aliases': 3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@docusaurus/theme-common': 3.5.2(@docusaurus/plugin-content-docs@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16))(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2) - '@docusaurus/types': 3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@docusaurus/utils': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.6.2) - '@docusaurus/utils-common': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) - '@docusaurus/utils-validation': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.6.2) + '@docusaurus/mdx-loader': 3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2) + '@docusaurus/module-type-aliases': 3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@docusaurus/theme-common': 3.5.2(@docusaurus/plugin-content-docs@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16))(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2) + '@docusaurus/types': 3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@docusaurus/utils': 3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(typescript@5.6.2) + '@docusaurus/utils-common': 3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + '@docusaurus/utils-validation': 3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(typescript@5.6.2) '@types/react-router-config': 5.0.11 combine-promises: 1.2.0 fs-extra: 11.2.0 @@ -18914,7 +18920,7 @@ snapshots: react-dom: 18.3.1(react@18.3.1) tslib: 2.7.0 utility-types: 3.11.0 - webpack: 5.95.0 + webpack: 5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5)) transitivePeerDependencies: - '@mdx-js/react' - '@parcel/css' @@ -18934,18 +18940,18 @@ snapshots: - vue-template-compiler - webpack-cli - '@docusaurus/plugin-content-pages@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16)': + '@docusaurus/plugin-content-pages@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16)': dependencies: - '@docusaurus/core': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) - '@docusaurus/mdx-loader': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2) - '@docusaurus/types': 3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@docusaurus/utils': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.6.2) - '@docusaurus/utils-validation': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.6.2) + '@docusaurus/core': 3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) + '@docusaurus/mdx-loader': 3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2) + '@docusaurus/types': 3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@docusaurus/utils': 3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(typescript@5.6.2) + '@docusaurus/utils-validation': 3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(typescript@5.6.2) fs-extra: 11.2.0 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) tslib: 2.7.0 - webpack: 5.95.0 + webpack: 5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5)) transitivePeerDependencies: - '@mdx-js/react' - '@parcel/css' @@ -18965,11 +18971,11 @@ snapshots: - vue-template-compiler - webpack-cli - '@docusaurus/plugin-debug@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16)': + '@docusaurus/plugin-debug@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16)': dependencies: - '@docusaurus/core': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) - '@docusaurus/types': 3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@docusaurus/utils': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.6.2) + '@docusaurus/core': 3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) + '@docusaurus/types': 3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@docusaurus/utils': 3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(typescript@5.6.2) fs-extra: 11.2.0 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) @@ -18994,11 +19000,11 @@ snapshots: - vue-template-compiler - webpack-cli - '@docusaurus/plugin-google-analytics@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16)': + '@docusaurus/plugin-google-analytics@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16)': dependencies: - '@docusaurus/core': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) - '@docusaurus/types': 3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@docusaurus/utils-validation': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.6.2) + '@docusaurus/core': 3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) + '@docusaurus/types': 3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@docusaurus/utils-validation': 3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(typescript@5.6.2) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) tslib: 2.7.0 @@ -19021,11 +19027,11 @@ snapshots: - vue-template-compiler - webpack-cli - '@docusaurus/plugin-google-gtag@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16)': + '@docusaurus/plugin-google-gtag@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16)': dependencies: - '@docusaurus/core': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) - '@docusaurus/types': 3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@docusaurus/utils-validation': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.6.2) + '@docusaurus/core': 3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) + '@docusaurus/types': 3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@docusaurus/utils-validation': 3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(typescript@5.6.2) '@types/gtag.js': 0.0.12 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) @@ -19049,11 +19055,11 @@ snapshots: - vue-template-compiler - webpack-cli - '@docusaurus/plugin-google-tag-manager@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16)': + '@docusaurus/plugin-google-tag-manager@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16)': dependencies: - '@docusaurus/core': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) - '@docusaurus/types': 3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@docusaurus/utils-validation': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.6.2) + '@docusaurus/core': 3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) + '@docusaurus/types': 3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@docusaurus/utils-validation': 3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(typescript@5.6.2) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) tslib: 2.7.0 @@ -19076,14 +19082,14 @@ snapshots: - vue-template-compiler - webpack-cli - '@docusaurus/plugin-sitemap@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16)': + '@docusaurus/plugin-sitemap@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16)': dependencies: - '@docusaurus/core': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) + '@docusaurus/core': 3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) '@docusaurus/logger': 3.5.2 - '@docusaurus/types': 3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@docusaurus/utils': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.6.2) - '@docusaurus/utils-common': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) - '@docusaurus/utils-validation': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.6.2) + '@docusaurus/types': 3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@docusaurus/utils': 3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(typescript@5.6.2) + '@docusaurus/utils-common': 3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + '@docusaurus/utils-validation': 3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(typescript@5.6.2) fs-extra: 11.2.0 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) @@ -19108,21 +19114,21 @@ snapshots: - vue-template-compiler - webpack-cli - '@docusaurus/preset-classic@3.5.2(@algolia/client-search@4.24.0)(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@types/react@18.3.9)(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16)': - dependencies: - '@docusaurus/core': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) - '@docusaurus/plugin-content-blog': 3.5.2(@docusaurus/plugin-content-docs@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) - '@docusaurus/plugin-content-docs': 3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) - '@docusaurus/plugin-content-pages': 3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) - '@docusaurus/plugin-debug': 3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) - '@docusaurus/plugin-google-analytics': 3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) - '@docusaurus/plugin-google-gtag': 3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) - '@docusaurus/plugin-google-tag-manager': 3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) - '@docusaurus/plugin-sitemap': 3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) - '@docusaurus/theme-classic': 3.5.2(@types/react@18.3.9)(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) - '@docusaurus/theme-common': 3.5.2(@docusaurus/plugin-content-docs@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16))(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2) - '@docusaurus/theme-search-algolia': 3.5.2(@algolia/client-search@4.24.0)(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@types/react@18.3.9)(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) - '@docusaurus/types': 3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@docusaurus/preset-classic@3.5.2(@algolia/client-search@4.24.0)(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/react@18.3.9)(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16)': + dependencies: + '@docusaurus/core': 3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) + '@docusaurus/plugin-content-blog': 3.5.2(@docusaurus/plugin-content-docs@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) + '@docusaurus/plugin-content-docs': 3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) + '@docusaurus/plugin-content-pages': 3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) + '@docusaurus/plugin-debug': 3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) + '@docusaurus/plugin-google-analytics': 3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) + '@docusaurus/plugin-google-gtag': 3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) + '@docusaurus/plugin-google-tag-manager': 3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) + '@docusaurus/plugin-sitemap': 3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) + '@docusaurus/theme-classic': 3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/react@18.3.9)(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) + '@docusaurus/theme-common': 3.5.2(@docusaurus/plugin-content-docs@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16))(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2) + '@docusaurus/theme-search-algolia': 3.5.2(@algolia/client-search@4.24.0)(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/react@18.3.9)(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) + '@docusaurus/types': 3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) transitivePeerDependencies: @@ -19162,20 +19168,20 @@ snapshots: transitivePeerDependencies: - supports-color - '@docusaurus/theme-classic@3.5.2(@types/react@18.3.9)(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16)': + '@docusaurus/theme-classic@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/react@18.3.9)(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16)': dependencies: - '@docusaurus/core': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) - '@docusaurus/mdx-loader': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2) - '@docusaurus/module-type-aliases': 3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@docusaurus/plugin-content-blog': 3.5.2(@docusaurus/plugin-content-docs@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) - '@docusaurus/plugin-content-docs': 3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) - '@docusaurus/plugin-content-pages': 3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) - '@docusaurus/theme-common': 3.5.2(@docusaurus/plugin-content-docs@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16))(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2) + '@docusaurus/core': 3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) + '@docusaurus/mdx-loader': 3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2) + '@docusaurus/module-type-aliases': 3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@docusaurus/plugin-content-blog': 3.5.2(@docusaurus/plugin-content-docs@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) + '@docusaurus/plugin-content-docs': 3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) + '@docusaurus/plugin-content-pages': 3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) + '@docusaurus/theme-common': 3.5.2(@docusaurus/plugin-content-docs@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16))(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2) '@docusaurus/theme-translations': 3.5.2 - '@docusaurus/types': 3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@docusaurus/utils': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.6.2) - '@docusaurus/utils-common': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) - '@docusaurus/utils-validation': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.6.2) + '@docusaurus/types': 3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@docusaurus/utils': 3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(typescript@5.6.2) + '@docusaurus/utils-common': 3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + '@docusaurus/utils-validation': 3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(typescript@5.6.2) '@mdx-js/react': 3.0.1(@types/react@18.3.9)(react@18.3.1) clsx: 2.1.1 copy-text-to-clipboard: 3.2.0 @@ -19210,13 +19216,13 @@ snapshots: - vue-template-compiler - webpack-cli - '@docusaurus/theme-common@3.5.2(@docusaurus/plugin-content-docs@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16))(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)': + '@docusaurus/theme-common@3.5.2(@docusaurus/plugin-content-docs@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16))(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)': dependencies: - '@docusaurus/mdx-loader': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2) - '@docusaurus/module-type-aliases': 3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@docusaurus/plugin-content-docs': 3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) - '@docusaurus/utils': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.6.2) - '@docusaurus/utils-common': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + '@docusaurus/mdx-loader': 3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2) + '@docusaurus/module-type-aliases': 3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@docusaurus/plugin-content-docs': 3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) + '@docusaurus/utils': 3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(typescript@5.6.2) + '@docusaurus/utils-common': 3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) '@types/history': 4.7.11 '@types/react': 18.3.9 '@types/react-router-config': 5.0.11 @@ -19236,12 +19242,12 @@ snapshots: - uglify-js - webpack-cli - '@docusaurus/theme-live-codeblock@3.5.2(@docusaurus/plugin-content-docs@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16))(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16)': + '@docusaurus/theme-live-codeblock@3.5.2(@docusaurus/plugin-content-docs@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16))(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16)': dependencies: - '@docusaurus/core': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) - '@docusaurus/theme-common': 3.5.2(@docusaurus/plugin-content-docs@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16))(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2) + '@docusaurus/core': 3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) + '@docusaurus/theme-common': 3.5.2(@docusaurus/plugin-content-docs@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16))(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2) '@docusaurus/theme-translations': 3.5.2 - '@docusaurus/utils-validation': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.6.2) + '@docusaurus/utils-validation': 3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(typescript@5.6.2) '@philpl/buble': 0.19.7 clsx: 2.1.1 fs-extra: 11.2.0 @@ -19270,13 +19276,13 @@ snapshots: - vue-template-compiler - webpack-cli - '@docusaurus/theme-mermaid@3.5.2(@docusaurus/plugin-content-docs@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16)': + '@docusaurus/theme-mermaid@3.5.2(@docusaurus/plugin-content-docs@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16)': dependencies: - '@docusaurus/core': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) - '@docusaurus/module-type-aliases': 3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@docusaurus/theme-common': 3.5.2(@docusaurus/plugin-content-docs@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16))(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2) - '@docusaurus/types': 3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@docusaurus/utils-validation': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.6.2) + '@docusaurus/core': 3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) + '@docusaurus/module-type-aliases': 3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@docusaurus/theme-common': 3.5.2(@docusaurus/plugin-content-docs@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16))(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2) + '@docusaurus/types': 3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@docusaurus/utils-validation': 3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(typescript@5.6.2) mermaid: 10.9.3 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) @@ -19301,16 +19307,16 @@ snapshots: - vue-template-compiler - webpack-cli - '@docusaurus/theme-search-algolia@3.5.2(@algolia/client-search@4.24.0)(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@types/react@18.3.9)(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16)': + '@docusaurus/theme-search-algolia@3.5.2(@algolia/client-search@4.24.0)(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/react@18.3.9)(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16)': dependencies: '@docsearch/react': 3.6.1(@algolia/client-search@4.24.0)(@types/react@18.3.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@docusaurus/core': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) + '@docusaurus/core': 3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) '@docusaurus/logger': 3.5.2 - '@docusaurus/plugin-content-docs': 3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) - '@docusaurus/theme-common': 3.5.2(@docusaurus/plugin-content-docs@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16))(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2) + '@docusaurus/plugin-content-docs': 3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) + '@docusaurus/theme-common': 3.5.2(@docusaurus/plugin-content-docs@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16))(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2) '@docusaurus/theme-translations': 3.5.2 - '@docusaurus/utils': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.6.2) - '@docusaurus/utils-validation': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.6.2) + '@docusaurus/utils': 3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(typescript@5.6.2) + '@docusaurus/utils-validation': 3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(typescript@5.6.2) algoliasearch: 4.24.0 algoliasearch-helper: 3.22.5(algoliasearch@4.24.0) clsx: 2.1.1 @@ -19356,7 +19362,7 @@ snapshots: '@docusaurus/tsconfig@3.5.2': {} - '@docusaurus/types@3.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@docusaurus/types@3.4.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@mdx-js/mdx': 3.0.1 '@types/history': 4.7.11 @@ -19367,7 +19373,7 @@ snapshots: react-dom: 18.3.1(react@18.3.1) react-helmet-async: 1.3.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) utility-types: 3.11.0 - webpack: 5.95.0 + webpack: 5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5)) webpack-merge: 5.10.0 transitivePeerDependencies: - '@swc/core' @@ -19376,7 +19382,7 @@ snapshots: - uglify-js - webpack-cli - '@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@mdx-js/mdx': 3.0.1 '@types/history': 4.7.11 @@ -19387,7 +19393,7 @@ snapshots: react-dom: 18.3.1(react@18.3.1) react-helmet-async: 1.3.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) utility-types: 3.11.0 - webpack: 5.95.0 + webpack: 5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5)) webpack-merge: 5.10.0 transitivePeerDependencies: - '@swc/core' @@ -19396,29 +19402,29 @@ snapshots: - uglify-js - webpack-cli - '@docusaurus/utils-common@3.4.0(@docusaurus/types@3.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1))': + '@docusaurus/utils-common@3.4.0(@docusaurus/types@3.4.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))': dependencies: tslib: 2.7.0 optionalDependencies: - '@docusaurus/types': 3.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@docusaurus/types': 3.4.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@docusaurus/utils-common@3.4.0(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))': + '@docusaurus/utils-common@3.4.0(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))': dependencies: tslib: 2.7.0 optionalDependencies: - '@docusaurus/types': 3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@docusaurus/types': 3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@docusaurus/utils-common@3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))': + '@docusaurus/utils-common@3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))': dependencies: tslib: 2.7.0 optionalDependencies: - '@docusaurus/types': 3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@docusaurus/types': 3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@docusaurus/utils-validation@3.4.0(@docusaurus/types@3.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.6.2)': + '@docusaurus/utils-validation@3.4.0(@docusaurus/types@3.4.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(typescript@5.6.2)': dependencies: '@docusaurus/logger': 3.4.0 - '@docusaurus/utils': 3.4.0(@docusaurus/types@3.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.6.2) - '@docusaurus/utils-common': 3.4.0(@docusaurus/types@3.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + '@docusaurus/utils': 3.4.0(@docusaurus/types@3.4.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(typescript@5.6.2) + '@docusaurus/utils-common': 3.4.0(@docusaurus/types@3.4.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) fs-extra: 11.2.0 joi: 17.13.3 js-yaml: 4.1.0 @@ -19433,11 +19439,11 @@ snapshots: - uglify-js - webpack-cli - '@docusaurus/utils-validation@3.4.0(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.6.2)': + '@docusaurus/utils-validation@3.4.0(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(typescript@5.6.2)': dependencies: '@docusaurus/logger': 3.4.0 - '@docusaurus/utils': 3.4.0(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.6.2) - '@docusaurus/utils-common': 3.4.0(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + '@docusaurus/utils': 3.4.0(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(typescript@5.6.2) + '@docusaurus/utils-common': 3.4.0(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) fs-extra: 11.2.0 joi: 17.13.3 js-yaml: 4.1.0 @@ -19452,11 +19458,11 @@ snapshots: - uglify-js - webpack-cli - '@docusaurus/utils-validation@3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.6.2)': + '@docusaurus/utils-validation@3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(typescript@5.6.2)': dependencies: '@docusaurus/logger': 3.5.2 - '@docusaurus/utils': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.6.2) - '@docusaurus/utils-common': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + '@docusaurus/utils': 3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(typescript@5.6.2) + '@docusaurus/utils-common': 3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) fs-extra: 11.2.0 joi: 17.13.3 js-yaml: 4.1.0 @@ -19471,13 +19477,13 @@ snapshots: - uglify-js - webpack-cli - '@docusaurus/utils@3.4.0(@docusaurus/types@3.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.6.2)': + '@docusaurus/utils@3.4.0(@docusaurus/types@3.4.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(typescript@5.6.2)': dependencies: '@docusaurus/logger': 3.4.0 - '@docusaurus/utils-common': 3.4.0(@docusaurus/types@3.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + '@docusaurus/utils-common': 3.4.0(@docusaurus/types@3.4.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) '@svgr/webpack': 8.1.0(typescript@5.6.2) escape-string-regexp: 4.0.0 - file-loader: 6.2.0(webpack@5.95.0) + file-loader: 6.2.0(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))) fs-extra: 11.2.0 github-slugger: 1.5.0 globby: 11.1.0 @@ -19490,11 +19496,11 @@ snapshots: resolve-pathname: 3.0.0 shelljs: 0.8.5 tslib: 2.7.0 - url-loader: 4.1.1(file-loader@6.2.0(webpack@5.95.0))(webpack@5.95.0) + url-loader: 4.1.1(file-loader@6.2.0(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))))(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))) utility-types: 3.11.0 - webpack: 5.95.0 + webpack: 5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5)) optionalDependencies: - '@docusaurus/types': 3.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@docusaurus/types': 3.4.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) transitivePeerDependencies: - '@swc/core' - esbuild @@ -19503,13 +19509,13 @@ snapshots: - uglify-js - webpack-cli - '@docusaurus/utils@3.4.0(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.6.2)': + '@docusaurus/utils@3.4.0(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(typescript@5.6.2)': dependencies: '@docusaurus/logger': 3.4.0 - '@docusaurus/utils-common': 3.4.0(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + '@docusaurus/utils-common': 3.4.0(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) '@svgr/webpack': 8.1.0(typescript@5.6.2) escape-string-regexp: 4.0.0 - file-loader: 6.2.0(webpack@5.95.0) + file-loader: 6.2.0(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))) fs-extra: 11.2.0 github-slugger: 1.5.0 globby: 11.1.0 @@ -19522,11 +19528,11 @@ snapshots: resolve-pathname: 3.0.0 shelljs: 0.8.5 tslib: 2.7.0 - url-loader: 4.1.1(file-loader@6.2.0(webpack@5.95.0))(webpack@5.95.0) + url-loader: 4.1.1(file-loader@6.2.0(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))))(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))) utility-types: 3.11.0 - webpack: 5.95.0 + webpack: 5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5)) optionalDependencies: - '@docusaurus/types': 3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@docusaurus/types': 3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) transitivePeerDependencies: - '@swc/core' - esbuild @@ -19535,13 +19541,13 @@ snapshots: - uglify-js - webpack-cli - '@docusaurus/utils@3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.6.2)': + '@docusaurus/utils@3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(typescript@5.6.2)': dependencies: '@docusaurus/logger': 3.5.2 - '@docusaurus/utils-common': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + '@docusaurus/utils-common': 3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) '@svgr/webpack': 8.1.0(typescript@5.6.2) escape-string-regexp: 4.0.0 - file-loader: 6.2.0(webpack@5.95.0) + file-loader: 6.2.0(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))) fs-extra: 11.2.0 github-slugger: 1.5.0 globby: 11.1.0 @@ -19554,11 +19560,11 @@ snapshots: resolve-pathname: 3.0.0 shelljs: 0.8.5 tslib: 2.7.0 - url-loader: 4.1.1(file-loader@6.2.0(webpack@5.95.0))(webpack@5.95.0) + url-loader: 4.1.1(file-loader@6.2.0(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))))(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))) utility-types: 3.11.0 - webpack: 5.95.0 + webpack: 5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5)) optionalDependencies: - '@docusaurus/types': 3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@docusaurus/types': 3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) transitivePeerDependencies: - '@swc/core' - esbuild @@ -20123,24 +20129,24 @@ snapshots: - encoding - supports-color - '@graphql-markdown/core@1.12.0(@graphql-markdown/printer-legacy@1.9.0(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(graphql@16.9.0)(prettier@3.3.3)(typescript@5.6.2))(graphql-config@5.1.2(@types/node@22.7.3)(graphql@16.9.0)(typescript@5.6.2))(graphql@16.9.0)(prettier@3.3.3)': + '@graphql-markdown/core@1.12.0(@graphql-markdown/printer-legacy@1.9.0(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(graphql@16.9.0)(prettier@3.3.3)(typescript@5.6.2))(graphql-config@5.1.2(@types/node@22.7.3)(graphql@16.9.0)(typescript@5.6.2))(graphql@16.9.0)(prettier@3.3.3)': dependencies: '@graphql-markdown/graphql': 1.1.4(graphql@16.9.0)(prettier@3.3.3) '@graphql-markdown/logger': 1.0.4 '@graphql-markdown/utils': 1.7.0(prettier@3.3.3) optionalDependencies: - '@graphql-markdown/printer-legacy': 1.9.0(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(graphql@16.9.0)(prettier@3.3.3)(typescript@5.6.2) + '@graphql-markdown/printer-legacy': 1.9.0(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(graphql@16.9.0)(prettier@3.3.3)(typescript@5.6.2) graphql-config: 5.1.2(@types/node@22.7.3)(graphql@16.9.0)(typescript@5.6.2) transitivePeerDependencies: - graphql - prettier - '@graphql-markdown/docusaurus@1.26.2(@docusaurus/logger@3.5.2)(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(graphql-config@5.1.2(@types/node@22.7.3)(graphql@16.9.0)(typescript@5.6.2))(graphql@16.9.0)(prettier@3.3.3)(typescript@5.6.2)': + '@graphql-markdown/docusaurus@1.26.2(@docusaurus/logger@3.5.2)(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(graphql-config@5.1.2(@types/node@22.7.3)(graphql@16.9.0)(typescript@5.6.2))(graphql@16.9.0)(prettier@3.3.3)(typescript@5.6.2)': dependencies: '@docusaurus/logger': 3.5.2 - '@graphql-markdown/core': 1.12.0(@graphql-markdown/printer-legacy@1.9.0(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(graphql@16.9.0)(prettier@3.3.3)(typescript@5.6.2))(graphql-config@5.1.2(@types/node@22.7.3)(graphql@16.9.0)(typescript@5.6.2))(graphql@16.9.0)(prettier@3.3.3) + '@graphql-markdown/core': 1.12.0(@graphql-markdown/printer-legacy@1.9.0(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(graphql@16.9.0)(prettier@3.3.3)(typescript@5.6.2))(graphql-config@5.1.2(@types/node@22.7.3)(graphql@16.9.0)(typescript@5.6.2))(graphql@16.9.0)(prettier@3.3.3) '@graphql-markdown/logger': 1.0.4 - '@graphql-markdown/printer-legacy': 1.9.0(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(graphql@16.9.0)(prettier@3.3.3)(typescript@5.6.2) + '@graphql-markdown/printer-legacy': 1.9.0(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(graphql@16.9.0)(prettier@3.3.3)(typescript@5.6.2) transitivePeerDependencies: - '@docusaurus/types' - '@graphql-markdown/diff' @@ -20165,9 +20171,9 @@ snapshots: '@graphql-markdown/logger@1.0.4': {} - '@graphql-markdown/printer-legacy@1.9.0(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(graphql@16.9.0)(prettier@3.3.3)(typescript@5.6.2)': + '@graphql-markdown/printer-legacy@1.9.0(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(graphql@16.9.0)(prettier@3.3.3)(typescript@5.6.2)': dependencies: - '@docusaurus/utils': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.6.2) + '@docusaurus/utils': 3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(typescript@5.6.2) '@graphql-markdown/graphql': 1.1.4(graphql@16.9.0)(prettier@3.3.3) '@graphql-markdown/utils': 1.7.0(prettier@3.3.3) transitivePeerDependencies: @@ -20505,9 +20511,9 @@ snapshots: react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - '@headlessui/tailwindcss@0.1.3(tailwindcss@3.4.13(ts-node@10.9.2(@types/node@22.7.3)(typescript@5.6.2)))': + '@headlessui/tailwindcss@0.1.3(tailwindcss@3.4.13(ts-node@10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@22.7.3)(typescript@5.6.2)))': dependencies: - tailwindcss: 3.4.13(ts-node@10.9.2(@types/node@22.7.3)(typescript@5.6.2)) + tailwindcss: 3.4.13(ts-node@10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@22.7.3)(typescript@5.6.2)) '@hookform/resolvers@3.9.0(react-hook-form@7.53.0(react@18.3.1))': dependencies: @@ -20585,7 +20591,7 @@ snapshots: jest-util: 29.7.0 slash: 3.0.0 - '@jest/core@29.7.0(babel-plugin-macros@3.1.0)(node-notifier@10.0.0)(ts-node@10.9.2(@types/node@20.16.9)(typescript@5.6.2))': + '@jest/core@29.7.0(babel-plugin-macros@3.1.0)(node-notifier@10.0.0)(ts-node@10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(typescript@5.6.2))': dependencies: '@jest/console': 29.7.0 '@jest/reporters': 29.7.0(node-notifier@10.0.0) @@ -20599,7 +20605,7 @@ snapshots: exit: 0.1.2 graceful-fs: 4.2.11 jest-changed-files: 29.7.0 - jest-config: 29.7.0(@types/node@20.16.9)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@20.16.9)(typescript@5.6.2)) + jest-config: 29.7.0(@types/node@20.16.9)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(typescript@5.6.2)) jest-haste-map: 29.7.0 jest-message-util: 29.7.0 jest-regex-util: 29.6.3 @@ -21104,14 +21110,14 @@ snapshots: pump: 3.0.2 tar-fs: 2.1.1 - '@nestjs/cache-manager@2.2.2(@nestjs/common@10.4.4(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/core@10.4.4(@nestjs/common@10.4.4(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/platform-express@10.4.4)(reflect-metadata@0.2.2)(rxjs@7.8.1))(cache-manager@5.7.6)(rxjs@7.8.1)': + '@nestjs/cache-manager@2.2.2(@nestjs/common@10.4.4(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/core@10.4.4)(cache-manager@5.7.6)(rxjs@7.8.1)': dependencies: '@nestjs/common': 10.4.4(reflect-metadata@0.2.2)(rxjs@7.8.1) '@nestjs/core': 10.4.4(@nestjs/common@10.4.4(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/platform-express@10.4.4)(reflect-metadata@0.2.2)(rxjs@7.8.1) cache-manager: 5.7.6 rxjs: 7.8.1 - '@nestjs/cli@10.4.5(@swc/core@1.7.28)': + '@nestjs/cli@10.4.5(@swc/core@1.7.28(@swc/helpers@0.5.5))': dependencies: '@angular-devkit/core': 17.3.8(chokidar@3.6.0) '@angular-devkit/schematics': 17.3.8(chokidar@3.6.0) @@ -21121,7 +21127,7 @@ snapshots: chokidar: 3.6.0 cli-table3: 0.6.5 commander: 4.1.1 - fork-ts-checker-webpack-plugin: 9.0.2(typescript@5.3.3)(webpack@5.94.0(@swc/core@1.7.28)) + fork-ts-checker-webpack-plugin: 9.0.2(typescript@5.3.3)(webpack@5.94.0(@swc/core@1.7.28(@swc/helpers@0.5.5))) glob: 10.4.2 inquirer: 8.2.6 node-emoji: 1.11.0 @@ -21130,7 +21136,7 @@ snapshots: tsconfig-paths: 4.2.0 tsconfig-paths-webpack-plugin: 4.1.0 typescript: 5.3.3 - webpack: 5.94.0(@swc/core@1.7.28) + webpack: 5.94.0(@swc/core@1.7.28(@swc/helpers@0.5.5)) webpack-node-externals: 3.0.0 optionalDependencies: '@swc/core': 1.7.28(@swc/helpers@0.5.5) @@ -21183,7 +21189,7 @@ snapshots: transitivePeerDependencies: - supports-color - '@nestjs/schedule@4.1.1(@nestjs/common@10.4.4(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/core@10.4.4(@nestjs/common@10.4.4(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/platform-express@10.4.4)(reflect-metadata@0.2.2)(rxjs@7.8.1))': + '@nestjs/schedule@4.1.1(@nestjs/common@10.4.4(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/core@10.4.4)': dependencies: '@nestjs/common': 10.4.4(reflect-metadata@0.2.2)(rxjs@7.8.1) '@nestjs/core': 10.4.4(@nestjs/common@10.4.4(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/platform-express@10.4.4)(reflect-metadata@0.2.2)(rxjs@7.8.1) @@ -21212,7 +21218,7 @@ snapshots: transitivePeerDependencies: - chokidar - '@nestjs/testing@10.4.4(@nestjs/common@10.4.4(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/core@10.4.4(@nestjs/common@10.4.4(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/platform-express@10.4.4)(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/platform-express@10.4.4(@nestjs/common@10.4.4(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/core@10.4.4))': + '@nestjs/testing@10.4.4(@nestjs/common@10.4.4(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/core@10.4.4)(@nestjs/platform-express@10.4.4)': dependencies: '@nestjs/common': 10.4.4(reflect-metadata@0.2.2)(rxjs@7.8.1) '@nestjs/core': 10.4.4(@nestjs/common@10.4.4(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/platform-express@10.4.4)(reflect-metadata@0.2.2)(rxjs@7.8.1) @@ -22732,6 +22738,8 @@ snapshots: transitivePeerDependencies: - '@types/node' + '@saucelabs/theme-github-codeblock@0.3.0': {} + '@scure/base@1.1.9': {} '@scure/bip32@1.4.0': @@ -23837,14 +23845,14 @@ snapshots: dependencies: defer-to-connect: 2.0.1 - '@tailwindcss/aspect-ratio@0.4.2(tailwindcss@3.4.13(ts-node@10.9.2(@types/node@22.7.3)(typescript@5.6.2)))': + '@tailwindcss/aspect-ratio@0.4.2(tailwindcss@3.4.13(ts-node@10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@22.7.3)(typescript@5.6.2)))': dependencies: - tailwindcss: 3.4.13(ts-node@10.9.2(@types/node@22.7.3)(typescript@5.6.2)) + tailwindcss: 3.4.13(ts-node@10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@22.7.3)(typescript@5.6.2)) - '@tailwindcss/forms@0.5.9(tailwindcss@3.4.13(ts-node@10.9.2(@types/node@22.7.3)(typescript@5.6.2)))': + '@tailwindcss/forms@0.5.9(tailwindcss@3.4.13(ts-node@10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@22.7.3)(typescript@5.6.2)))': dependencies: mini-svg-data-uri: 1.4.4 - tailwindcss: 3.4.13(ts-node@10.9.2(@types/node@22.7.3)(typescript@5.6.2)) + tailwindcss: 3.4.13(ts-node@10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@22.7.3)(typescript@5.6.2)) '@tanstack/eslint-plugin-query@5.58.1(eslint@8.57.1)(typescript@5.6.2)': dependencies: @@ -24348,11 +24356,11 @@ snapshots: '@types/webextension-polyfill@0.10.7': {} - '@types/webpack@5.28.5(@swc/core@1.7.28)(webpack-cli@5.1.4(webpack@5.95.0))': + '@types/webpack@5.28.5(@swc/core@1.7.28(@swc/helpers@0.5.5))(webpack-cli@5.1.4)': dependencies: '@types/node': 20.16.9 tapable: 2.2.1 - webpack: 5.95.0(@swc/core@1.7.28)(webpack-cli@5.1.4) + webpack: 5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(webpack-cli@5.1.4) transitivePeerDependencies: - '@swc/core' - esbuild @@ -25127,19 +25135,19 @@ snapshots: '@webassemblyjs/ast': 1.12.1 '@xtuc/long': 4.2.2 - '@webpack-cli/configtest@2.1.1(webpack-cli@5.1.4(webpack@5.95.0))(webpack@5.95.0(@swc/core@1.7.28)(webpack-cli@5.1.4))': + '@webpack-cli/configtest@2.1.1(webpack-cli@5.1.4)(webpack@5.95.0)': dependencies: - webpack: 5.95.0(@swc/core@1.7.28)(webpack-cli@5.1.4) + webpack: 5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(webpack-cli@5.1.4) webpack-cli: 5.1.4(webpack@5.95.0) - '@webpack-cli/info@2.0.2(webpack-cli@5.1.4(webpack@5.95.0))(webpack@5.95.0(@swc/core@1.7.28)(webpack-cli@5.1.4))': + '@webpack-cli/info@2.0.2(webpack-cli@5.1.4)(webpack@5.95.0)': dependencies: - webpack: 5.95.0(@swc/core@1.7.28)(webpack-cli@5.1.4) + webpack: 5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(webpack-cli@5.1.4) webpack-cli: 5.1.4(webpack@5.95.0) - '@webpack-cli/serve@2.0.5(webpack-cli@5.1.4(webpack@5.95.0))(webpack@5.95.0(@swc/core@1.7.28)(webpack-cli@5.1.4))': + '@webpack-cli/serve@2.0.5(webpack-cli@5.1.4)(webpack@5.95.0)': dependencies: - webpack: 5.95.0(@swc/core@1.7.28)(webpack-cli@5.1.4) + webpack: 5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(webpack-cli@5.1.4) webpack-cli: 5.1.4(webpack@5.95.0) '@whatwg-node/events@0.0.3': {} @@ -25630,12 +25638,12 @@ snapshots: transitivePeerDependencies: - supports-color - babel-loader@9.2.1(@babel/core@7.25.2)(webpack@5.95.0): + babel-loader@9.2.1(@babel/core@7.25.2)(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))): dependencies: '@babel/core': 7.25.2 find-cache-dir: 4.0.0 schema-utils: 4.2.0 - webpack: 5.95.0 + webpack: 5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5)) babel-plugin-dynamic-import-node@2.3.3: dependencies: @@ -26435,7 +26443,7 @@ snapshots: copy-text-to-clipboard@3.2.0: {} - copy-webpack-plugin@11.0.0(webpack@5.95.0(@swc/core@1.7.28)(webpack-cli@5.1.4)): + copy-webpack-plugin@11.0.0(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))): dependencies: fast-glob: 3.3.2 glob-parent: 6.0.2 @@ -26443,7 +26451,7 @@ snapshots: normalize-path: 3.0.0 schema-utils: 4.2.0 serialize-javascript: 6.0.2 - webpack: 5.95.0(@swc/core@1.7.28)(webpack-cli@5.1.4) + webpack: 5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5)) copy-webpack-plugin@11.0.0(webpack@5.95.0): dependencies: @@ -26453,7 +26461,7 @@ snapshots: normalize-path: 3.0.0 schema-utils: 4.2.0 serialize-javascript: 6.0.2 - webpack: 5.95.0 + webpack: 5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(webpack-cli@5.1.4) core-js-compat@3.38.1: dependencies: @@ -26523,13 +26531,13 @@ snapshots: crc-32@1.2.2: {} - create-jest@29.7.0(@types/node@20.16.9)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@20.16.9)(typescript@5.6.2)): + create-jest@29.7.0(@types/node@20.16.9)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(typescript@5.6.2)): dependencies: '@jest/types': 29.6.3 chalk: 4.1.2 exit: 0.1.2 graceful-fs: 4.2.11 - jest-config: 29.7.0(@types/node@20.16.9)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@20.16.9)(typescript@5.6.2)) + jest-config: 29.7.0(@types/node@20.16.9)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(typescript@5.6.2)) jest-util: 29.7.0 prompts: 2.4.2 transitivePeerDependencies: @@ -26593,7 +26601,7 @@ snapshots: postcss-selector-parser: 6.1.2 postcss-value-parser: 4.2.0 - css-loader@6.11.0(webpack@5.95.0(@swc/core@1.7.28)(webpack-cli@5.1.4)): + css-loader@6.11.0(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))): dependencies: icss-utils: 5.1.0(postcss@8.4.47) postcss: 8.4.47 @@ -26604,7 +26612,7 @@ snapshots: postcss-value-parser: 4.2.0 semver: 7.6.3 optionalDependencies: - webpack: 5.95.0(@swc/core@1.7.28)(webpack-cli@5.1.4) + webpack: 5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5)) css-loader@6.11.0(webpack@5.95.0): dependencies: @@ -26617,9 +26625,9 @@ snapshots: postcss-value-parser: 4.2.0 semver: 7.6.3 optionalDependencies: - webpack: 5.95.0 + webpack: 5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(webpack-cli@5.1.4) - css-minimizer-webpack-plugin@5.0.1(clean-css@5.3.3)(webpack@5.95.0): + css-minimizer-webpack-plugin@5.0.1(clean-css@5.3.3)(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))): dependencies: '@jridgewell/trace-mapping': 0.3.25 cssnano: 6.1.2(postcss@8.4.47) @@ -26627,7 +26635,7 @@ snapshots: postcss: 8.4.47 schema-utils: 4.2.0 serialize-javascript: 6.0.2 - webpack: 5.95.0 + webpack: 5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5)) optionalDependencies: clean-css: 5.3.3 @@ -27176,15 +27184,15 @@ snapshots: dependencies: typedoc-plugin-markdown: 4.2.10(typedoc@0.26.11(typescript@5.6.2)) - docusaurus-theme-search-typesense@0.20.0-0(@algolia/client-search@4.24.0)(@babel/runtime@7.25.6)(@docusaurus/core@3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16))(@docusaurus/theme-common@3.5.2(@docusaurus/plugin-content-docs@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16))(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2))(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/react@18.3.9)(algoliasearch@4.24.0)(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16): + docusaurus-theme-search-typesense@0.20.0-0(iea5eyhbiud2dlcqtud2g4pxzm): dependencies: - '@docusaurus/core': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) + '@docusaurus/core': 3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) '@docusaurus/logger': 3.4.0 - '@docusaurus/plugin-content-docs': 3.4.0(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) - '@docusaurus/theme-common': 3.5.2(@docusaurus/plugin-content-docs@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16))(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2) + '@docusaurus/plugin-content-docs': 3.4.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) + '@docusaurus/theme-common': 3.5.2(@docusaurus/plugin-content-docs@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16))(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2) '@docusaurus/theme-translations': 3.4.0 - '@docusaurus/utils': 3.4.0(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.6.2) - '@docusaurus/utils-validation': 3.4.0(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.6.2) + '@docusaurus/utils': 3.4.0(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(typescript@5.6.2) + '@docusaurus/utils-validation': 3.4.0(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(typescript@5.6.2) algoliasearch-helper: 3.22.5(algoliasearch@4.24.0) clsx: 1.2.1 eta: 2.2.0 @@ -27630,7 +27638,7 @@ snapshots: debug: 4.3.7(supports-color@8.1.1) enhanced-resolve: 5.17.1 eslint: 8.57.1 - eslint-module-utils: 2.12.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.30.0)(eslint@8.57.1))(eslint@8.57.1) + eslint-module-utils: 2.12.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.1) fast-glob: 3.3.2 get-tsconfig: 4.8.1 is-bun-module: 1.2.1 @@ -27643,26 +27651,7 @@ snapshots: - eslint-import-resolver-webpack - supports-color - eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.6.2))(eslint-plugin-import@2.30.0)(eslint@8.57.1): - dependencies: - '@nolyfill/is-core-module': 1.0.39 - debug: 4.3.7(supports-color@8.1.1) - enhanced-resolve: 5.17.1 - eslint: 8.57.1 - eslint-module-utils: 2.12.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.6.2))(eslint-plugin-import@2.30.0)(eslint@8.57.1))(eslint@8.57.1) - fast-glob: 3.3.2 - get-tsconfig: 4.8.1 - is-bun-module: 1.2.1 - is-glob: 4.0.3 - optionalDependencies: - eslint-plugin-import: 2.30.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.6.2))(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.1) - transitivePeerDependencies: - - '@typescript-eslint/parser' - - eslint-import-resolver-node - - eslint-import-resolver-webpack - - supports-color - - eslint-module-utils@2.12.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.30.0)(eslint@8.57.1))(eslint@8.57.1): + eslint-module-utils@2.12.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.1): dependencies: debug: 3.2.7 optionalDependencies: @@ -27673,17 +27662,6 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-module-utils@2.12.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.6.2))(eslint-plugin-import@2.30.0)(eslint@8.57.1))(eslint@8.57.1): - dependencies: - debug: 3.2.7 - optionalDependencies: - '@typescript-eslint/parser': 6.21.0(eslint@8.57.1)(typescript@5.6.2) - eslint: 8.57.1 - eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.6.3(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.6.2))(eslint-plugin-import@2.30.0)(eslint@8.57.1) - transitivePeerDependencies: - - supports-color - eslint-plugin-header@3.1.1(eslint@8.57.1): dependencies: eslint: 8.57.1 @@ -27699,7 +27677,7 @@ snapshots: doctrine: 2.1.0 eslint: 8.57.1 eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.12.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.6.2))(eslint-plugin-import@2.30.0)(eslint@8.57.1))(eslint@8.57.1) + eslint-module-utils: 2.12.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.1) hasown: 2.0.2 is-core-module: 2.15.1 is-glob: 4.0.3 @@ -27814,7 +27792,7 @@ snapshots: eslint-visitor-keys@4.1.0: {} - eslint-webpack-plugin@4.2.0(eslint@8.57.1)(webpack@5.95.0(@swc/core@1.7.28)(webpack-cli@5.1.4)): + eslint-webpack-plugin@4.2.0(eslint@8.57.1)(webpack@5.95.0): dependencies: '@types/eslint': 8.56.12 eslint: 8.57.1 @@ -27822,7 +27800,7 @@ snapshots: micromatch: 4.0.8 normalize-path: 3.0.0 schema-utils: 4.2.0 - webpack: 5.95.0(@swc/core@1.7.28)(webpack-cli@5.1.4) + webpack: 5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(webpack-cli@5.1.4) eslint@8.57.1: dependencies: @@ -28187,11 +28165,11 @@ snapshots: dependencies: flat-cache: 3.2.0 - file-loader@6.2.0(webpack@5.95.0): + file-loader@6.2.0(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))): dependencies: loader-utils: 2.0.4 schema-utils: 3.3.0 - webpack: 5.95.0 + webpack: 5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5)) file-system-cache@2.3.0: dependencies: @@ -28299,7 +28277,7 @@ snapshots: forever-agent@0.6.1: {} - fork-ts-checker-webpack-plugin@6.5.3(eslint@8.57.1)(typescript@5.6.2)(vue-template-compiler@2.7.16)(webpack@5.95.0): + fork-ts-checker-webpack-plugin@6.5.3(eslint@8.57.1)(typescript@5.6.2)(vue-template-compiler@2.7.16)(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))): dependencies: '@babel/code-frame': 7.24.7 '@types/json-schema': 7.0.15 @@ -28315,12 +28293,12 @@ snapshots: semver: 7.6.3 tapable: 1.1.3 typescript: 5.6.2 - webpack: 5.95.0 + webpack: 5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5)) optionalDependencies: eslint: 8.57.1 vue-template-compiler: 2.7.16 - fork-ts-checker-webpack-plugin@9.0.2(typescript@5.3.3)(webpack@5.94.0(@swc/core@1.7.28)): + fork-ts-checker-webpack-plugin@9.0.2(typescript@5.3.3)(webpack@5.94.0(@swc/core@1.7.28(@swc/helpers@0.5.5))): dependencies: '@babel/code-frame': 7.24.7 chalk: 4.1.2 @@ -28335,7 +28313,7 @@ snapshots: semver: 7.6.3 tapable: 2.2.1 typescript: 5.3.3 - webpack: 5.94.0(@swc/core@1.7.28) + webpack: 5.94.0(@swc/core@1.7.28(@swc/helpers@0.5.5)) form-data-encoder@2.1.4: {} @@ -29097,7 +29075,7 @@ snapshots: html-void-elements@3.0.0: {} - html-webpack-plugin@5.6.0(webpack@5.95.0(@swc/core@1.7.28)(webpack-cli@5.1.4)): + html-webpack-plugin@5.6.0(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))): dependencies: '@types/html-minifier-terser': 6.1.0 html-minifier-terser: 6.1.0 @@ -29105,7 +29083,7 @@ snapshots: pretty-error: 4.0.0 tapable: 2.2.1 optionalDependencies: - webpack: 5.95.0(@swc/core@1.7.28)(webpack-cli@5.1.4) + webpack: 5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5)) html-webpack-plugin@5.6.0(webpack@5.95.0): dependencies: @@ -29115,7 +29093,7 @@ snapshots: pretty-error: 4.0.0 tapable: 2.2.1 optionalDependencies: - webpack: 5.95.0 + webpack: 5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(webpack-cli@5.1.4) htmlparser2@6.1.0: dependencies: @@ -29750,16 +29728,16 @@ snapshots: - babel-plugin-macros - supports-color - jest-cli@29.7.0(@types/node@20.16.9)(babel-plugin-macros@3.1.0)(node-notifier@10.0.0)(ts-node@10.9.2(@types/node@20.16.9)(typescript@5.6.2)): + jest-cli@29.7.0(@types/node@20.16.9)(babel-plugin-macros@3.1.0)(node-notifier@10.0.0)(ts-node@10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(typescript@5.6.2)): dependencies: - '@jest/core': 29.7.0(babel-plugin-macros@3.1.0)(node-notifier@10.0.0)(ts-node@10.9.2(@types/node@20.16.9)(typescript@5.6.2)) + '@jest/core': 29.7.0(babel-plugin-macros@3.1.0)(node-notifier@10.0.0)(ts-node@10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(typescript@5.6.2)) '@jest/test-result': 29.7.0 '@jest/types': 29.6.3 chalk: 4.1.2 - create-jest: 29.7.0(@types/node@20.16.9)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@20.16.9)(typescript@5.6.2)) + create-jest: 29.7.0(@types/node@20.16.9)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(typescript@5.6.2)) exit: 0.1.2 import-local: 3.2.0 - jest-config: 29.7.0(@types/node@20.16.9)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@20.16.9)(typescript@5.6.2)) + jest-config: 29.7.0(@types/node@20.16.9)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(typescript@5.6.2)) jest-util: 29.7.0 jest-validate: 29.7.0 yargs: 17.7.2 @@ -29771,7 +29749,7 @@ snapshots: - supports-color - ts-node - jest-config@29.7.0(@types/node@20.16.9)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@20.16.9)(typescript@5.6.2)): + jest-config@29.7.0(@types/node@20.16.9)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(typescript@5.6.2)): dependencies: '@babel/core': 7.25.2 '@jest/test-sequencer': 29.7.0 @@ -29797,7 +29775,7 @@ snapshots: strip-json-comments: 3.1.1 optionalDependencies: '@types/node': 20.16.9 - ts-node: 10.9.2(@swc/core@1.7.28)(@types/node@20.16.9)(typescript@5.6.2) + ts-node: 10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(typescript@5.6.2) transitivePeerDependencies: - babel-plugin-macros - supports-color @@ -30028,12 +30006,12 @@ snapshots: merge-stream: 2.0.0 supports-color: 8.1.1 - jest@29.7.0(@types/node@20.16.9)(babel-plugin-macros@3.1.0)(node-notifier@10.0.0)(ts-node@10.9.2(@types/node@20.16.9)(typescript@5.6.2)): + jest@29.7.0(@types/node@20.16.9)(babel-plugin-macros@3.1.0)(node-notifier@10.0.0)(ts-node@10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(typescript@5.6.2)): dependencies: - '@jest/core': 29.7.0(babel-plugin-macros@3.1.0)(node-notifier@10.0.0)(ts-node@10.9.2(@types/node@20.16.9)(typescript@5.6.2)) + '@jest/core': 29.7.0(babel-plugin-macros@3.1.0)(node-notifier@10.0.0)(ts-node@10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(typescript@5.6.2)) '@jest/types': 29.6.3 import-local: 3.2.0 - jest-cli: 29.7.0(@types/node@20.16.9)(babel-plugin-macros@3.1.0)(node-notifier@10.0.0)(ts-node@10.9.2(@types/node@20.16.9)(typescript@5.6.2)) + jest-cli: 29.7.0(@types/node@20.16.9)(babel-plugin-macros@3.1.0)(node-notifier@10.0.0)(ts-node@10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(typescript@5.6.2)) optionalDependencies: node-notifier: 10.0.0 transitivePeerDependencies: @@ -31311,17 +31289,17 @@ snapshots: min-indent@1.0.1: {} - mini-css-extract-plugin@2.9.1(webpack@5.95.0(@swc/core@1.7.28)(webpack-cli@5.1.4)): + mini-css-extract-plugin@2.9.1(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))): dependencies: schema-utils: 4.2.0 tapable: 2.2.1 - webpack: 5.95.0(@swc/core@1.7.28)(webpack-cli@5.1.4) + webpack: 5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5)) mini-css-extract-plugin@2.9.1(webpack@5.95.0): dependencies: schema-utils: 4.2.0 tapable: 2.2.1 - webpack: 5.95.0 + webpack: 5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(webpack-cli@5.1.4) mini-svg-data-uri@1.4.4: {} @@ -32258,29 +32236,29 @@ snapshots: '@csstools/utilities': 1.0.0(postcss@8.4.47) postcss: 8.4.47 - postcss-load-config@4.0.2(postcss@8.4.47)(ts-node@10.9.2(@swc/core@1.7.28)(@types/node@20.16.9)(typescript@5.6.2)): + postcss-load-config@4.0.2(postcss@8.4.47)(ts-node@10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(typescript@5.6.2)): dependencies: lilconfig: 3.1.2 yaml: 2.5.1 optionalDependencies: postcss: 8.4.47 - ts-node: 10.9.2(@swc/core@1.7.28)(@types/node@20.16.9)(typescript@5.6.2) + ts-node: 10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(typescript@5.6.2) - postcss-load-config@4.0.2(postcss@8.4.47)(ts-node@10.9.2(@types/node@22.7.3)(typescript@5.6.2)): + postcss-load-config@4.0.2(postcss@8.4.47)(ts-node@10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@22.7.3)(typescript@5.6.2)): dependencies: lilconfig: 3.1.2 yaml: 2.5.1 optionalDependencies: postcss: 8.4.47 - ts-node: 10.9.2(@types/node@22.7.3)(typescript@5.6.2) + ts-node: 10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@22.7.3)(typescript@5.6.2) - postcss-loader@7.3.4(postcss@8.4.47)(typescript@5.6.2)(webpack@5.95.0(@swc/core@1.7.28)(webpack-cli@5.1.4)): + postcss-loader@7.3.4(postcss@8.4.47)(typescript@5.6.2)(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))): dependencies: cosmiconfig: 8.3.6(typescript@5.6.2) jiti: 1.21.6 postcss: 8.4.47 semver: 7.6.3 - webpack: 5.95.0(@swc/core@1.7.28)(webpack-cli@5.1.4) + webpack: 5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5)) transitivePeerDependencies: - typescript @@ -32290,7 +32268,7 @@ snapshots: jiti: 1.21.6 postcss: 8.4.47 semver: 7.6.3 - webpack: 5.95.0 + webpack: 5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(webpack-cli@5.1.4) transitivePeerDependencies: - typescript @@ -32795,7 +32773,7 @@ snapshots: react: 18.3.1 tween-functions: 1.2.0 - react-dev-utils@12.0.1(eslint@8.57.1)(typescript@5.6.2)(vue-template-compiler@2.7.16)(webpack@5.95.0): + react-dev-utils@12.0.1(eslint@8.57.1)(typescript@5.6.2)(vue-template-compiler@2.7.16)(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))): dependencies: '@babel/code-frame': 7.24.7 address: 1.2.2 @@ -32806,7 +32784,7 @@ snapshots: escape-string-regexp: 4.0.0 filesize: 8.0.7 find-up: 5.0.0 - fork-ts-checker-webpack-plugin: 6.5.3(eslint@8.57.1)(typescript@5.6.2)(vue-template-compiler@2.7.16)(webpack@5.95.0) + fork-ts-checker-webpack-plugin: 6.5.3(eslint@8.57.1)(typescript@5.6.2)(vue-template-compiler@2.7.16)(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))) global-modules: 2.0.0 globby: 11.1.0 gzip-size: 6.0.0 @@ -32821,7 +32799,7 @@ snapshots: shell-quote: 1.8.1 strip-ansi: 6.0.1 text-table: 0.2.0 - webpack: 5.95.0 + webpack: 5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5)) optionalDependencies: typescript: 5.6.2 transitivePeerDependencies: @@ -32922,11 +32900,11 @@ snapshots: sucrase: 3.35.0 use-editable: 2.3.3(react@18.3.1) - react-loadable-ssr-addon-v5-slorber@1.0.1(@docusaurus/react-loadable@6.0.0(react@18.3.1))(webpack@5.95.0): + react-loadable-ssr-addon-v5-slorber@1.0.1(@docusaurus/react-loadable@6.0.0(react@18.3.1))(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))): dependencies: '@babel/runtime': 7.25.6 react-loadable: '@docusaurus/react-loadable@6.0.0(react@18.3.1)' - webpack: 5.95.0 + webpack: 5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5)) react-number-format@5.4.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: @@ -33618,10 +33596,10 @@ snapshots: safer-buffer@2.1.2: {} - sass-loader@13.3.3(sass@1.79.3)(webpack@5.95.0(@swc/core@1.7.28)(webpack-cli@5.1.4)): + sass-loader@13.3.3(sass@1.79.3)(webpack@5.95.0): dependencies: neo-async: 2.6.2 - webpack: 5.95.0(@swc/core@1.7.28)(webpack-cli@5.1.4) + webpack: 5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(webpack-cli@5.1.4) optionalDependencies: sass: 1.79.3 @@ -34347,15 +34325,15 @@ snapshots: tailwind-merge@2.5.2: {} - tailwindcss-animate@1.0.7(tailwindcss@3.4.13(ts-node@10.9.2(@swc/core@1.7.28)(@types/node@20.16.9)(typescript@5.6.2))): + tailwindcss-animate@1.0.7(tailwindcss@3.4.13(ts-node@10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(typescript@5.6.2))): dependencies: - tailwindcss: 3.4.13(ts-node@10.9.2(@swc/core@1.7.28)(@types/node@20.16.9)(typescript@5.6.2)) + tailwindcss: 3.4.13(ts-node@10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(typescript@5.6.2)) - tailwindcss-animate@1.0.7(tailwindcss@3.4.13(ts-node@10.9.2(@types/node@22.7.3)(typescript@5.6.2))): + tailwindcss-animate@1.0.7(tailwindcss@3.4.13(ts-node@10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@22.7.3)(typescript@5.6.2))): dependencies: - tailwindcss: 3.4.13(ts-node@10.9.2(@types/node@22.7.3)(typescript@5.6.2)) + tailwindcss: 3.4.13(ts-node@10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@22.7.3)(typescript@5.6.2)) - tailwindcss@3.4.13(ts-node@10.9.2(@swc/core@1.7.28)(@types/node@20.16.9)(typescript@5.6.2)): + tailwindcss@3.4.13(ts-node@10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(typescript@5.6.2)): dependencies: '@alloc/quick-lru': 5.2.0 arg: 5.0.2 @@ -34374,7 +34352,7 @@ snapshots: postcss: 8.4.47 postcss-import: 15.1.0(postcss@8.4.47) postcss-js: 4.0.1(postcss@8.4.47) - postcss-load-config: 4.0.2(postcss@8.4.47)(ts-node@10.9.2(@swc/core@1.7.28)(@types/node@20.16.9)(typescript@5.6.2)) + postcss-load-config: 4.0.2(postcss@8.4.47)(ts-node@10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(typescript@5.6.2)) postcss-nested: 6.2.0(postcss@8.4.47) postcss-selector-parser: 6.1.2 resolve: 1.22.8 @@ -34382,7 +34360,7 @@ snapshots: transitivePeerDependencies: - ts-node - tailwindcss@3.4.13(ts-node@10.9.2(@types/node@22.7.3)(typescript@5.6.2)): + tailwindcss@3.4.13(ts-node@10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@22.7.3)(typescript@5.6.2)): dependencies: '@alloc/quick-lru': 5.2.0 arg: 5.0.2 @@ -34401,7 +34379,7 @@ snapshots: postcss: 8.4.47 postcss-import: 15.1.0(postcss@8.4.47) postcss-js: 4.0.1(postcss@8.4.47) - postcss-load-config: 4.0.2(postcss@8.4.47)(ts-node@10.9.2(@types/node@22.7.3)(typescript@5.6.2)) + postcss-load-config: 4.0.2(postcss@8.4.47)(ts-node@10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@22.7.3)(typescript@5.6.2)) postcss-nested: 6.2.0(postcss@8.4.47) postcss-selector-parser: 6.1.2 resolve: 1.22.8 @@ -34457,48 +34435,39 @@ snapshots: term-size@2.2.1: {} - terser-webpack-plugin@5.3.10(@swc/core@1.7.28)(webpack@5.94.0(@swc/core@1.7.28)): + terser-webpack-plugin@5.3.10(@swc/core@1.7.28(@swc/helpers@0.5.5))(webpack@5.94.0(@swc/core@1.7.28(@swc/helpers@0.5.5))): dependencies: '@jridgewell/trace-mapping': 0.3.25 jest-worker: 27.5.1 schema-utils: 3.3.0 serialize-javascript: 6.0.2 terser: 5.34.0 - webpack: 5.94.0(@swc/core@1.7.28) + webpack: 5.94.0(@swc/core@1.7.28(@swc/helpers@0.5.5)) optionalDependencies: '@swc/core': 1.7.28(@swc/helpers@0.5.5) - terser-webpack-plugin@5.3.10(@swc/core@1.7.28)(webpack@5.95.0(@swc/core@1.7.28)(webpack-cli@5.1.4)): + terser-webpack-plugin@5.3.10(@swc/core@1.7.28(@swc/helpers@0.5.5))(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))): dependencies: '@jridgewell/trace-mapping': 0.3.25 jest-worker: 27.5.1 schema-utils: 3.3.0 serialize-javascript: 6.0.2 terser: 5.34.0 - webpack: 5.95.0(@swc/core@1.7.28)(webpack-cli@5.1.4) + webpack: 5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5)) optionalDependencies: '@swc/core': 1.7.28(@swc/helpers@0.5.5) - terser-webpack-plugin@5.3.10(@swc/core@1.7.28)(webpack@5.95.0(@swc/core@1.7.28)): + terser-webpack-plugin@5.3.10(@swc/core@1.7.28(@swc/helpers@0.5.5))(webpack@5.95.0): dependencies: '@jridgewell/trace-mapping': 0.3.25 jest-worker: 27.5.1 schema-utils: 3.3.0 serialize-javascript: 6.0.2 terser: 5.34.0 - webpack: 5.95.0(@swc/core@1.7.28) + webpack: 5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(webpack-cli@5.1.4) optionalDependencies: '@swc/core': 1.7.28(@swc/helpers@0.5.5) - terser-webpack-plugin@5.3.10(webpack@5.95.0): - dependencies: - '@jridgewell/trace-mapping': 0.3.25 - jest-worker: 27.5.1 - schema-utils: 3.3.0 - serialize-javascript: 6.0.2 - terser: 5.34.0 - webpack: 5.95.0 - terser@5.34.0: dependencies: '@jridgewell/source-map': 0.3.6 @@ -34643,12 +34612,12 @@ snapshots: ts-interface-checker@0.1.13: {} - ts-jest@29.2.5(@babel/core@7.25.2)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.25.2))(jest@29.7.0(@types/node@20.16.9)(babel-plugin-macros@3.1.0)(node-notifier@10.0.0)(ts-node@10.9.2(@types/node@20.16.9)(typescript@5.6.2)))(typescript@5.6.2): + ts-jest@29.2.5(@babel/core@7.25.2)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.25.2))(jest@29.7.0(@types/node@20.16.9)(babel-plugin-macros@3.1.0)(node-notifier@10.0.0)(ts-node@10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(typescript@5.6.2)))(typescript@5.6.2): dependencies: bs-logger: 0.2.6 ejs: 3.1.10 fast-json-stable-stringify: 2.1.0 - jest: 29.7.0(@types/node@20.16.9)(babel-plugin-macros@3.1.0)(node-notifier@10.0.0)(ts-node@10.9.2(@types/node@20.16.9)(typescript@5.6.2)) + jest: 29.7.0(@types/node@20.16.9)(babel-plugin-macros@3.1.0)(node-notifier@10.0.0)(ts-node@10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(typescript@5.6.2)) jest-util: 29.7.0 json5: 2.2.3 lodash.memoize: 4.1.2 @@ -34662,7 +34631,7 @@ snapshots: '@jest/types': 29.6.3 babel-jest: 29.7.0(@babel/core@7.25.2) - ts-loader@9.5.1(typescript@5.6.2)(webpack@5.95.0(@swc/core@1.7.28)(webpack-cli@5.1.4)): + ts-loader@9.5.1(typescript@5.6.2)(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))): dependencies: chalk: 4.1.2 enhanced-resolve: 5.17.1 @@ -34670,9 +34639,9 @@ snapshots: semver: 7.6.3 source-map: 0.7.4 typescript: 5.6.2 - webpack: 5.95.0(@swc/core@1.7.28)(webpack-cli@5.1.4) + webpack: 5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5)) - ts-loader@9.5.1(typescript@5.6.2)(webpack@5.95.0(@swc/core@1.7.28)): + ts-loader@9.5.1(typescript@5.6.2)(webpack@5.95.0): dependencies: chalk: 4.1.2 enhanced-resolve: 5.17.1 @@ -34680,11 +34649,11 @@ snapshots: semver: 7.6.3 source-map: 0.7.4 typescript: 5.6.2 - webpack: 5.95.0(@swc/core@1.7.28) + webpack: 5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(webpack-cli@5.1.4) ts-log@2.2.5: {} - ts-node@10.9.2(@swc/core@1.7.28)(@types/node@16.18.111)(typescript@5.1.6): + ts-node@10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@16.18.111)(typescript@5.1.6): dependencies: '@cspotcode/source-map-support': 0.8.1 '@tsconfig/node10': 1.0.11 @@ -34704,7 +34673,7 @@ snapshots: optionalDependencies: '@swc/core': 1.7.28(@swc/helpers@0.5.5) - ts-node@10.9.2(@swc/core@1.7.28)(@types/node@20.16.9)(typescript@5.6.2): + ts-node@10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(typescript@5.6.2): dependencies: '@cspotcode/source-map-support': 0.8.1 '@tsconfig/node10': 1.0.11 @@ -34724,7 +34693,7 @@ snapshots: optionalDependencies: '@swc/core': 1.7.28(@swc/helpers@0.5.5) - ts-node@10.9.2(@types/node@22.7.3)(typescript@5.6.2): + ts-node@10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@22.7.3)(typescript@5.6.2): dependencies: '@cspotcode/source-map-support': 0.8.1 '@tsconfig/node10': 1.0.11 @@ -34741,6 +34710,8 @@ snapshots: typescript: 5.6.2 v8-compile-cache-lib: 3.0.1 yn: 3.1.1 + optionalDependencies: + '@swc/core': 1.7.28(@swc/helpers@0.5.5) optional: true ts-retry-promise@0.8.1: {} @@ -34910,14 +34881,14 @@ snapshots: transitivePeerDependencies: - supports-color - typescript-json-schema@0.64.0(@swc/core@1.7.28): + typescript-json-schema@0.64.0(@swc/core@1.7.28(@swc/helpers@0.5.5)): dependencies: '@types/json-schema': 7.0.15 '@types/node': 16.18.111 glob: 7.2.3 path-equal: 1.2.5 safe-stable-stringify: 2.5.0 - ts-node: 10.9.2(@swc/core@1.7.28)(@types/node@16.18.111)(typescript@5.1.6) + ts-node: 10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@16.18.111)(typescript@5.1.6) typescript: 5.1.6 yargs: 17.7.2 transitivePeerDependencies: @@ -35158,14 +35129,14 @@ snapshots: dependencies: punycode: 2.3.1 - url-loader@4.1.1(file-loader@6.2.0(webpack@5.95.0))(webpack@5.95.0): + url-loader@4.1.1(file-loader@6.2.0(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))))(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))): dependencies: loader-utils: 2.0.4 mime-types: 2.1.35 schema-utils: 3.3.0 - webpack: 5.95.0 + webpack: 5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5)) optionalDependencies: - file-loader: 6.2.0(webpack@5.95.0) + file-loader: 6.2.0(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))) url-parse@1.5.10: dependencies: @@ -35912,9 +35883,9 @@ snapshots: webpack-cli@5.1.4(webpack@5.95.0): dependencies: '@discoveryjs/json-ext': 0.5.7 - '@webpack-cli/configtest': 2.1.1(webpack-cli@5.1.4(webpack@5.95.0))(webpack@5.95.0(@swc/core@1.7.28)(webpack-cli@5.1.4)) - '@webpack-cli/info': 2.0.2(webpack-cli@5.1.4(webpack@5.95.0))(webpack@5.95.0(@swc/core@1.7.28)(webpack-cli@5.1.4)) - '@webpack-cli/serve': 2.0.5(webpack-cli@5.1.4(webpack@5.95.0))(webpack@5.95.0(@swc/core@1.7.28)(webpack-cli@5.1.4)) + '@webpack-cli/configtest': 2.1.1(webpack-cli@5.1.4)(webpack@5.95.0) + '@webpack-cli/info': 2.0.2(webpack-cli@5.1.4)(webpack@5.95.0) + '@webpack-cli/serve': 2.0.5(webpack-cli@5.1.4)(webpack@5.95.0) colorette: 2.0.20 commander: 10.0.1 cross-spawn: 7.0.5 @@ -35923,19 +35894,19 @@ snapshots: import-local: 3.2.0 interpret: 3.1.1 rechoir: 0.8.0 - webpack: 5.95.0(@swc/core@1.7.28)(webpack-cli@5.1.4) + webpack: 5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(webpack-cli@5.1.4) webpack-merge: 5.10.0 - webpack-dev-middleware@5.3.4(webpack@5.95.0): + webpack-dev-middleware@5.3.4(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))): dependencies: colorette: 2.0.20 memfs: 3.5.3 mime-types: 2.1.35 range-parser: 1.2.1 schema-utils: 4.2.0 - webpack: 5.95.0 + webpack: 5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5)) - webpack-dev-server@4.15.2(webpack@5.95.0): + webpack-dev-server@4.15.2(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))): dependencies: '@types/bonjour': 3.5.13 '@types/connect-history-api-fallback': 1.5.4 @@ -35965,10 +35936,10 @@ snapshots: serve-index: 1.9.1 sockjs: 0.3.24 spdy: 4.0.2 - webpack-dev-middleware: 5.3.4(webpack@5.95.0) + webpack-dev-middleware: 5.3.4(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))) ws: 8.18.0 optionalDependencies: - webpack: 5.95.0 + webpack: 5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5)) transitivePeerDependencies: - bufferutil - debug @@ -35987,37 +35958,7 @@ snapshots: webpack-virtual-modules@0.6.2: {} - webpack@5.94.0(@swc/core@1.7.28): - dependencies: - '@types/estree': 1.0.6 - '@webassemblyjs/ast': 1.12.1 - '@webassemblyjs/wasm-edit': 1.12.1 - '@webassemblyjs/wasm-parser': 1.12.1 - acorn: 8.12.1 - acorn-import-attributes: 1.9.5(acorn@8.12.1) - browserslist: 4.24.0 - chrome-trace-event: 1.0.4 - enhanced-resolve: 5.17.1 - es-module-lexer: 1.5.4 - eslint-scope: 5.1.1 - events: 3.3.0 - glob-to-regexp: 0.4.1 - graceful-fs: 4.2.11 - json-parse-even-better-errors: 2.3.1 - loader-runner: 4.3.0 - mime-types: 2.1.35 - neo-async: 2.6.2 - schema-utils: 3.3.0 - tapable: 2.2.1 - terser-webpack-plugin: 5.3.10(@swc/core@1.7.28)(webpack@5.94.0(@swc/core@1.7.28)) - watchpack: 2.4.2 - webpack-sources: 3.2.3 - transitivePeerDependencies: - - '@swc/core' - - esbuild - - uglify-js - - webpack@5.95.0: + webpack@5.94.0(@swc/core@1.7.28(@swc/helpers@0.5.5)): dependencies: '@types/estree': 1.0.6 '@webassemblyjs/ast': 1.12.1 @@ -36039,7 +35980,7 @@ snapshots: neo-async: 2.6.2 schema-utils: 3.3.0 tapable: 2.2.1 - terser-webpack-plugin: 5.3.10(webpack@5.95.0) + terser-webpack-plugin: 5.3.10(@swc/core@1.7.28(@swc/helpers@0.5.5))(webpack@5.94.0(@swc/core@1.7.28(@swc/helpers@0.5.5))) watchpack: 2.4.2 webpack-sources: 3.2.3 transitivePeerDependencies: @@ -36047,7 +35988,7 @@ snapshots: - esbuild - uglify-js - webpack@5.95.0(@swc/core@1.7.28): + webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5)): dependencies: '@types/estree': 1.0.6 '@webassemblyjs/ast': 1.12.1 @@ -36069,7 +36010,7 @@ snapshots: neo-async: 2.6.2 schema-utils: 3.3.0 tapable: 2.2.1 - terser-webpack-plugin: 5.3.10(@swc/core@1.7.28)(webpack@5.95.0(@swc/core@1.7.28)) + terser-webpack-plugin: 5.3.10(@swc/core@1.7.28(@swc/helpers@0.5.5))(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))) watchpack: 2.4.2 webpack-sources: 3.2.3 transitivePeerDependencies: @@ -36077,7 +36018,7 @@ snapshots: - esbuild - uglify-js - webpack@5.95.0(@swc/core@1.7.28)(webpack-cli@5.1.4): + webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(webpack-cli@5.1.4): dependencies: '@types/estree': 1.0.6 '@webassemblyjs/ast': 1.12.1 @@ -36099,7 +36040,7 @@ snapshots: neo-async: 2.6.2 schema-utils: 3.3.0 tapable: 2.2.1 - terser-webpack-plugin: 5.3.10(@swc/core@1.7.28)(webpack@5.95.0(@swc/core@1.7.28)(webpack-cli@5.1.4)) + terser-webpack-plugin: 5.3.10(@swc/core@1.7.28(@swc/helpers@0.5.5))(webpack@5.95.0) watchpack: 2.4.2 webpack-sources: 3.2.3 optionalDependencies: @@ -36109,13 +36050,13 @@ snapshots: - esbuild - uglify-js - webpackbar@5.0.2(webpack@5.95.0): + webpackbar@5.0.2(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))): dependencies: chalk: 4.1.2 consola: 2.15.3 pretty-time: 1.1.0 std-env: 3.7.0 - webpack: 5.95.0 + webpack: 5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5)) websocket-driver@0.7.4: dependencies: From 4fd9abc49e812035cc111ad628d779f46d940c77 Mon Sep 17 00:00:00 2001 From: Dr-Electron <dr-electr0n@protonmail.com> Date: Thu, 5 Dec 2024 19:25:28 +0100 Subject: [PATCH 13/97] feat(docs): Allow custom components before DocItems (#4144) --- docs/site/configs/preContent.tsx | 6 ++++++ docs/site/src/theme/DocItem/index.tsx | 26 ++++++++++++++++++++++++ docs/site/src/theme/MDXContent/index.tsx | 1 + 3 files changed, 33 insertions(+) create mode 100644 docs/site/configs/preContent.tsx create mode 100644 docs/site/src/theme/DocItem/index.tsx diff --git a/docs/site/configs/preContent.tsx b/docs/site/configs/preContent.tsx new file mode 100644 index 00000000000..7b006fc30cc --- /dev/null +++ b/docs/site/configs/preContent.tsx @@ -0,0 +1,6 @@ +import React from 'react'; +import Admonition from '@theme/Admonition'; + +export default { + '/iota-identity*': <Admonition type='info'>IOTA Identity is currently in alpha and may still be subject to significant changes</Admonition>, +}; diff --git a/docs/site/src/theme/DocItem/index.tsx b/docs/site/src/theme/DocItem/index.tsx new file mode 100644 index 00000000000..03b5768679f --- /dev/null +++ b/docs/site/src/theme/DocItem/index.tsx @@ -0,0 +1,26 @@ +/** + * SWIZZLED VERSION: 3.5.2 + * REASONS: + * - Add option to allow custom components before the DocItem + */ +import React from 'react'; +import DocItem from '@theme-original/DocItem'; +import type DocItemType from '@theme/DocItem'; +import type {WrapperProps} from '@docusaurus/types'; +import { useLocation } from '@docusaurus/router'; + +import preMDXComponents from '../../../configs/preContent'; + +type Props = WrapperProps<typeof DocItemType>; + +export default function DocItemWrapper(props: Props): JSX.Element { + const { pathname } = useLocation(); + const matchingKey = Object.keys(preMDXComponents).find((key) => new RegExp(key).test(pathname)); + + return ( + <> + {preMDXComponents[matchingKey]} + <DocItem {...props} /> + </> + ); +} diff --git a/docs/site/src/theme/MDXContent/index.tsx b/docs/site/src/theme/MDXContent/index.tsx index f2d505c0bb0..a94a55e771d 100644 --- a/docs/site/src/theme/MDXContent/index.tsx +++ b/docs/site/src/theme/MDXContent/index.tsx @@ -2,6 +2,7 @@ * SWIZZLED VERSION: 3.5.2 * REASONS: * - Add default components + * - Add FeedbackForm component */ import React from 'react'; import { MDXProvider } from '@mdx-js/react'; From 55467822c603c621e4909fb3c38f07906e5a2609 Mon Sep 17 00:00:00 2001 From: Pavlo Botnar <pavlo.botnar@gmail.com> Date: Thu, 5 Dec 2024 21:11:13 +0200 Subject: [PATCH 14/97] fix(docs/kiosk): update some Kiosk links, add more examples (#4193) * fix(docs/kiosk): update some Kiosk links, add more examples, create marketplace extension doc page --- .../developer/iota-101/nft/marketplace.mdx | 17 +++++++++++++++++ .../content/developer/iota-101/nft/rent-nft.mdx | 5 +++++ docs/content/developer/standards/kiosk-apps.mdx | 3 +++ docs/content/sidebars/developer.js | 2 +- docs/examples/move/nft_marketplace/README.md | 2 +- 5 files changed, 27 insertions(+), 2 deletions(-) create mode 100644 docs/content/developer/iota-101/nft/marketplace.mdx diff --git a/docs/content/developer/iota-101/nft/marketplace.mdx b/docs/content/developer/iota-101/nft/marketplace.mdx new file mode 100644 index 00000000000..e5c20e2fa67 --- /dev/null +++ b/docs/content/developer/iota-101/nft/marketplace.mdx @@ -0,0 +1,17 @@ +--- +description: A brief introduction to implementing NFT marketplace extension using the Kiosk Apps standard in IOTA's Move language. +--- + + + + +import Marketplace from '../../../../examples/move/nft_marketplace/README.md'; + +# Marketplace Extension + +The Marketplace Extension for [IOTA Kiosk](../../standards/kiosk.mdx) is a customizable framework that extends the functionality of the IOTA Kiosk by enabling efficient asset trading with integrated royalty management and pricing mechanism. + +Kiosk owners can list items for sale by setting prices, and enforce royalties, ensuring creators receive a percentage of each sale. Buyers can securely purchase items, with the extension validating payments and handling royalties automatically. All transactions are governed by robust transfer policies, ensuring security and compliance. + +<Marketplace /> + diff --git a/docs/content/developer/iota-101/nft/rent-nft.mdx b/docs/content/developer/iota-101/nft/rent-nft.mdx index df7f28a81c3..d4e93624b30 100644 --- a/docs/content/developer/iota-101/nft/rent-nft.mdx +++ b/docs/content/developer/iota-101/nft/rent-nft.mdx @@ -77,6 +77,11 @@ The rental smart contract utilizes th [Kiosk Apps](../../standards/kiosk-apps.md Both lenders and borrowers must install a Kiosk extension to participate. Additionally, the creator of the NFT type must create a rental policy and a `ProtectedTP` object to allow the extension to manage rentals while enforcing royalties. +## Move Module Details + +The NFT rental functionality is implemented in a single Move module: `nft_rental.move`. +You can find the source code in the [IOTA repository](https://github.com/iotaledger/iota/tree/develop/docs/examples/move/nft_marketplace/sources/rental_extension.move) under the `examples` directory. The code includes comments to help you understand the logic and structure. + ### The `nft_rental` Module The `nft_rental` module provides an API for: diff --git a/docs/content/developer/standards/kiosk-apps.mdx b/docs/content/developer/standards/kiosk-apps.mdx index 116cdccf28f..cb88f6eab24 100644 --- a/docs/content/developer/standards/kiosk-apps.mdx +++ b/docs/content/developer/standards/kiosk-apps.mdx @@ -259,5 +259,8 @@ txb.moveCall({ ## Related links - [NFT Rental](../iota-101/nft/rent-nft.mdx): An example implementation of the Kiosk Apps standard that enables renting NFTs. +- [NFT Rental Extension](https://github.com/iotaledger/iota/tree/develop/docs/examples/move/nft_marketplace/sources/rental_extension.move): An example implementation of the Kiosk Extension standard that enables renting NFTs. +- [Marketplace](../iota-101/nft/marketplace.mdx): An example implementation of the Kiosk Apps standard that enables marketplace functionality. +- [Marketplace Extension](https://github.com/iotaledger/iota/tree/develop/docs/examples/move/nft_marketplace/sources/marketplace_extension.move): Move module that contains the source code(Kiosk extension) for the marketplace app. <Quiz questions={questions} /> \ No newline at end of file diff --git a/docs/content/sidebars/developer.js b/docs/content/sidebars/developer.js index 32192dd666b..e8ac1eb1bb5 100644 --- a/docs/content/sidebars/developer.js +++ b/docs/content/sidebars/developer.js @@ -212,7 +212,7 @@ const developer = [ { type: 'category', label: 'NFT', - items: ['developer/iota-101/nft/create-nft', 'developer/iota-101/nft/rent-nft'], + items: ['developer/iota-101/nft/create-nft', 'developer/iota-101/nft/rent-nft', 'developer/iota-101/nft/marketplace'], }, { type: 'category', diff --git a/docs/examples/move/nft_marketplace/README.md b/docs/examples/move/nft_marketplace/README.md index 42cb414ab65..80b330362ff 100644 --- a/docs/examples/move/nft_marketplace/README.md +++ b/docs/examples/move/nft_marketplace/README.md @@ -1,4 +1,4 @@ -# Marketplace Guide +# Marketplace Extension Usage ## Modules From 8a30632ab6f2ba9ab3e65c5dea508495a32632b5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Eike=20Ha=C3=9F?= <eike-hass@web.de> Date: Thu, 5 Dec 2024 20:31:32 +0100 Subject: [PATCH 15/97] chore(docs): Update Identity banner (#4382) --- docs/site/configs/preContent.tsx | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/docs/site/configs/preContent.tsx b/docs/site/configs/preContent.tsx index 7b006fc30cc..a7f9798b920 100644 --- a/docs/site/configs/preContent.tsx +++ b/docs/site/configs/preContent.tsx @@ -1,6 +1,9 @@ +// Copyright (c) 2024 IOTA Stiftung +// SPDX-License-Identifier: Apache-2.0 + import React from 'react'; import Admonition from '@theme/Admonition'; export default { - '/iota-identity*': <Admonition type='info'>IOTA Identity is currently in alpha and may still be subject to significant changes</Admonition>, + '/iota-identity*': <Admonition type='info'>IOTA Identity for Rebased is currently in alpha and may still be subject to significant changes</Admonition>, }; From 84002d6721e8f8dc78469a1cbf97d7ec50483752 Mon Sep 17 00:00:00 2001 From: Thibault Martinez <thibault@iota.org> Date: Fri, 6 Dec 2024 10:52:23 +0100 Subject: [PATCH 16/97] chore(*): fix clippy 1.83's `needless_lifetimes` --- crates/iota-cluster-test/src/config.rs | 2 +- crates/iota-common/src/sync/notify_read.rs | 4 ++-- crates/iota-core/src/consensus_adapter.rs | 2 +- crates/iota-graphql-rpc/src/data/pg.rs | 2 +- crates/iota-indexer/src/handlers/tx_processor.rs | 2 +- .../src/displays/transaction_displays.rs | 8 ++++---- crates/iota-metrics/src/guards.rs | 4 ++-- crates/iota-metrics/src/histogram.rs | 2 +- crates/iota-metrics/src/metered_channel.rs | 2 +- crates/iota-metrics/src/monitored_mpsc.rs | 2 +- crates/iota-package-resolver/src/lib.rs | 2 +- .../src/displays/gas_status_displays.rs | 2 +- .../src/displays/transaction_displays.rs | 12 ++++++------ .../src/test_adapter.rs | 2 +- crates/iota/src/client_ptb/ast.rs | 2 +- crates/iota/src/client_ptb/token.rs | 4 ++-- crates/iota/src/displays/dry_run_tx_block.rs | 2 +- crates/iota/src/displays/gas_cost_summary.rs | 2 +- crates/iota/src/displays/ptb_preview.rs | 2 +- crates/iota/src/displays/status.rs | 2 +- crates/iota/src/displays/summary.rs | 2 +- crates/typed-store/src/rocks/iter.rs | 6 +++--- crates/typed-store/src/rocks/keys.rs | 4 ++-- crates/typed-store/src/rocks/mod.rs | 4 ++-- crates/typed-store/src/rocks/safe_iter.rs | 6 +++--- crates/typed-store/src/rocks/tests.rs | 4 ++-- crates/typed-store/src/rocks/values.rs | 2 +- crates/typed-store/src/sally/mod.rs | 8 ++++---- crates/typed-store/src/test_db.rs | 8 ++++---- .../src/programmable_transactions/context.rs | 4 ++-- .../src/programmable_transactions/execution.rs | 4 ++-- .../programmable_transactions/linkage_view.rs | 8 ++++---- .../latest/iota-adapter/src/temporary_store.rs | 16 ++++++++-------- .../iota-adapter/src/type_layout_resolver.rs | 6 +++--- .../iota-move-natives/src/object_runtime/mod.rs | 4 ++-- .../src/object_runtime/object_store.rs | 2 +- .../latest/iota-verifier/src/id_leak_verifier.rs | 4 ++-- iota-execution/src/latest.rs | 2 +- 38 files changed, 78 insertions(+), 78 deletions(-) diff --git a/crates/iota-cluster-test/src/config.rs b/crates/iota-cluster-test/src/config.rs index a6b3f5bb946..85814590fab 100644 --- a/crates/iota-cluster-test/src/config.rs +++ b/crates/iota-cluster-test/src/config.rs @@ -57,7 +57,7 @@ pub struct ClusterTestOpt { #[allow(dead_code)] struct ObfuscatedPgAddress<'a>(&'a Option<String>); -impl<'a> std::fmt::Display for ObfuscatedPgAddress<'a> { +impl std::fmt::Display for ObfuscatedPgAddress<'_> { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { match self.0 { None => write!(f, "None"), diff --git a/crates/iota-common/src/sync/notify_read.rs b/crates/iota-common/src/sync/notify_read.rs index 9d54bf39dc2..bb107e018c0 100644 --- a/crates/iota-common/src/sync/notify_read.rs +++ b/crates/iota-common/src/sync/notify_read.rs @@ -150,7 +150,7 @@ pub struct Registration<'a, K: Eq + Hash + Clone, V: Clone> { registration: Option<(K, oneshot::Receiver<V>)>, } -impl<'a, K: Eq + Hash + Clone + Unpin, V: Clone + Unpin> Future for Registration<'a, K, V> { +impl<K: Eq + Hash + Clone + Unpin, V: Clone + Unpin> Future for Registration<'_, K, V> { type Output = V; fn poll(mut self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Self::Output> { @@ -168,7 +168,7 @@ impl<'a, K: Eq + Hash + Clone + Unpin, V: Clone + Unpin> Future for Registration } } -impl<'a, K: Eq + Hash + Clone, V: Clone> Drop for Registration<'a, K, V> { +impl<K: Eq + Hash + Clone, V: Clone> Drop for Registration<'_, K, V> { fn drop(&mut self) { if let Some((key, receiver)) = self.registration.take() { mem::drop(receiver); diff --git a/crates/iota-core/src/consensus_adapter.rs b/crates/iota-core/src/consensus_adapter.rs index 37aaa26ccd9..46e8e9b6875 100644 --- a/crates/iota-core/src/consensus_adapter.rs +++ b/crates/iota-core/src/consensus_adapter.rs @@ -963,7 +963,7 @@ impl<'a> InflightDropGuard<'a> { } } -impl<'a> Drop for InflightDropGuard<'a> { +impl Drop for InflightDropGuard<'_> { fn drop(&mut self) { self.adapter .num_inflight_transactions diff --git a/crates/iota-graphql-rpc/src/data/pg.rs b/crates/iota-graphql-rpc/src/data/pg.rs index 84abceb5677..9e321ede79b 100644 --- a/crates/iota-graphql-rpc/src/data/pg.rs +++ b/crates/iota-graphql-rpc/src/data/pg.rs @@ -97,7 +97,7 @@ impl QueryExecutor for PgExecutor { } } -impl<'c> super::DbConnection for PgConnection<'c> { +impl super::DbConnection for PgConnection<'_> { type Connection = diesel::PgConnection; type Backend = Pg; diff --git a/crates/iota-indexer/src/handlers/tx_processor.rs b/crates/iota-indexer/src/handlers/tx_processor.rs index 2ac77bbdb06..4ab9f640402 100644 --- a/crates/iota-indexer/src/handlers/tx_processor.rs +++ b/crates/iota-indexer/src/handlers/tx_processor.rs @@ -298,7 +298,7 @@ impl<'a> EpochEndIndexingObjectStore<'a> { } } -impl<'a> iota_types::storage::ObjectStore for EpochEndIndexingObjectStore<'a> { +impl iota_types::storage::ObjectStore for EpochEndIndexingObjectStore<'_> { fn get_object( &self, object_id: &ObjectID, diff --git a/crates/iota-json-rpc-types/src/displays/transaction_displays.rs b/crates/iota-json-rpc-types/src/displays/transaction_displays.rs index 767cd646219..330649f9339 100644 --- a/crates/iota-json-rpc-types/src/displays/transaction_displays.rs +++ b/crates/iota-json-rpc-types/src/displays/transaction_displays.rs @@ -15,7 +15,7 @@ use crate::{ IotaProgrammableTransactionBlock, displays::Pretty, }; -impl<'a> Display for Pretty<'a, IotaProgrammableTransactionBlock> { +impl Display for Pretty<'_, IotaProgrammableTransactionBlock> { fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { let Pretty(ptb) = self; let IotaProgrammableTransactionBlock { inputs, commands } = ptb; @@ -82,7 +82,7 @@ impl<'a> Display for Pretty<'a, IotaProgrammableTransactionBlock> { } } -impl<'a> Display for Pretty<'a, IotaCommand> { +impl Display for Pretty<'_, IotaCommand> { fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { let Pretty(command) = self; match command { @@ -141,7 +141,7 @@ impl<'a> Display for Pretty<'a, IotaCommand> { } } -impl<'a> Display for Pretty<'a, IotaProgrammableMoveCall> { +impl Display for Pretty<'_, IotaProgrammableMoveCall> { fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { let Pretty(move_call) = self; let IotaProgrammableMoveCall { @@ -170,7 +170,7 @@ impl<'a> Display for Pretty<'a, IotaProgrammableMoveCall> { } } -impl<'a> Display for Pretty<'a, IotaArgument> { +impl Display for Pretty<'_, IotaArgument> { fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { let Pretty(argument) = self; diff --git a/crates/iota-metrics/src/guards.rs b/crates/iota-metrics/src/guards.rs index f174b806da9..86b7881833f 100644 --- a/crates/iota-metrics/src/guards.rs +++ b/crates/iota-metrics/src/guards.rs @@ -22,7 +22,7 @@ impl<'a> GaugeGuard<'a> { } } -impl<'a> Drop for GaugeGuard<'a> { +impl Drop for GaugeGuard<'_> { /// Decrements the value of the `IntGauge` when the `IntGaugeGuard` is /// dropped. fn drop(&mut self) { @@ -56,7 +56,7 @@ pub struct GaugeGuardFuture<'a, F: Sized> { _guard: GaugeGuard<'a>, } -impl<'a, F: Future> Future for GaugeGuardFuture<'a, F> { +impl<F: Future> Future for GaugeGuardFuture<'_, F> { type Output = F::Output; /// Polls the wrapped future (`f`) to determine its readiness. This function diff --git a/crates/iota-metrics/src/histogram.rs b/crates/iota-metrics/src/histogram.rs index d33bf688cc0..5a7269f2015 100644 --- a/crates/iota-metrics/src/histogram.rs +++ b/crates/iota-metrics/src/histogram.rs @@ -387,7 +387,7 @@ impl HistogramReporter { } } -impl<'a> Drop for HistogramTimerGuard<'a> { +impl Drop for HistogramTimerGuard<'_> { /// Reports the elapsed time in milliseconds to the associated histogram /// when the `HistogramTimerGuard` is dropped. fn drop(&mut self) { diff --git a/crates/iota-metrics/src/metered_channel.rs b/crates/iota-metrics/src/metered_channel.rs index 210580e1b4b..14c86ec2313 100644 --- a/crates/iota-metrics/src/metered_channel.rs +++ b/crates/iota-metrics/src/metered_channel.rs @@ -192,7 +192,7 @@ impl<'a, T> Permit<'a, T> { } } -impl<'a, T> Drop for Permit<'a, T> { +impl<T> Drop for Permit<'_, T> { /// Custom drop logic for the `Permit` to handle cases where the permit is /// dropped without sending a value. This ensures that the occupancy of /// the channel is correctly updated by decrementing the associated gauge diff --git a/crates/iota-metrics/src/monitored_mpsc.rs b/crates/iota-metrics/src/monitored_mpsc.rs index 8c8ce92c931..ce15ff7fed3 100644 --- a/crates/iota-metrics/src/monitored_mpsc.rs +++ b/crates/iota-metrics/src/monitored_mpsc.rs @@ -188,7 +188,7 @@ impl<'a, T> Permit<'a, T> { } } -impl<'a, T> Drop for Permit<'a, T> { +impl<T> Drop for Permit<'_, T> { fn drop(&mut self) { // In the case the permit is dropped without sending, we still want to decrease // the occupancy of the channel. Otherwise, receiver should be diff --git a/crates/iota-package-resolver/src/lib.rs b/crates/iota-package-resolver/src/lib.rs index 1fad3258d85..05ed900b686 100644 --- a/crates/iota-package-resolver/src/lib.rs +++ b/crates/iota-package-resolver/src/lib.rs @@ -1145,7 +1145,7 @@ impl OpenSignatureBody { } } -impl<'m, 'n> DatatypeRef<'m, 'n> { +impl DatatypeRef<'_, '_> { pub fn as_key(&self) -> DatatypeKey { DatatypeKey { package: self.package, diff --git a/crates/iota-replay/src/displays/gas_status_displays.rs b/crates/iota-replay/src/displays/gas_status_displays.rs index 0237a95449c..11858d59db7 100644 --- a/crates/iota-replay/src/displays/gas_status_displays.rs +++ b/crates/iota-replay/src/displays/gas_status_displays.rs @@ -12,7 +12,7 @@ use tabled::{ use crate::displays::Pretty; -impl<'a> Display for Pretty<'a, IotaGasStatus> { +impl Display for Pretty<'_, IotaGasStatus> { fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { let Pretty(iota_gas_status) = self; match iota_gas_status { diff --git a/crates/iota-replay/src/displays/transaction_displays.rs b/crates/iota-replay/src/displays/transaction_displays.rs index e13be0243aa..e7673957092 100644 --- a/crates/iota-replay/src/displays/transaction_displays.rs +++ b/crates/iota-replay/src/displays/transaction_displays.rs @@ -40,7 +40,7 @@ pub struct ResolvedResults { /// These Display implementations provide alternate displays that are used to /// format info contained in these Structs when calling the CLI replay command /// with an additional provided flag. -impl<'a> Display for Pretty<'a, FullPTB> { +impl Display for Pretty<'_, FullPTB> { fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { let Pretty(full_ptb) = self; let FullPTB { ptb, results } = full_ptb; @@ -146,7 +146,7 @@ impl<'a> Display for Pretty<'a, FullPTB> { } } -impl<'a> Display for Pretty<'a, Command> { +impl Display for Pretty<'_, Command> { fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { let Pretty(command) = self; match command { @@ -201,7 +201,7 @@ impl<'a> Display for Pretty<'a, Command> { } } -impl<'a> Display for Pretty<'a, ProgrammableMoveCall> { +impl Display for Pretty<'_, ProgrammableMoveCall> { fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { let Pretty(move_call) = self; let ProgrammableMoveCall { @@ -231,7 +231,7 @@ impl<'a> Display for Pretty<'a, ProgrammableMoveCall> { } } -impl<'a> Display for Pretty<'a, Argument> { +impl Display for Pretty<'_, Argument> { fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { let Pretty(argument) = self; @@ -244,7 +244,7 @@ impl<'a> Display for Pretty<'a, Argument> { write!(f, "{}", output) } } -impl<'a> Display for Pretty<'a, ResolvedResults> { +impl Display for Pretty<'_, ResolvedResults> { fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { let Pretty(ResolvedResults { mutable_reference_outputs, @@ -283,7 +283,7 @@ impl<'a> Display for Pretty<'a, ResolvedResults> { } } -impl<'a> Display for Pretty<'a, TypeTag> { +impl Display for Pretty<'_, TypeTag> { fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { let Pretty(type_tag) = self; match type_tag { diff --git a/crates/iota-transactional-test-runner/src/test_adapter.rs b/crates/iota-transactional-test-runner/src/test_adapter.rs index 2e70b822ee8..268fe616239 100644 --- a/crates/iota-transactional-test-runner/src/test_adapter.rs +++ b/crates/iota-transactional-test-runner/src/test_adapter.rs @@ -172,7 +172,7 @@ struct TxnSummary { } #[async_trait] -impl<'a> MoveTestAdapter<'a> for IotaTestAdapter { +impl MoveTestAdapter<'_> for IotaTestAdapter { type ExtraPublishArgs = IotaPublishArgs; type ExtraRunArgs = IotaRunArgs; type ExtraInitArgs = IotaInitArgs; diff --git a/crates/iota/src/client_ptb/ast.rs b/crates/iota/src/client_ptb/ast.rs index ed6f98bc3b4..e07b2dec8d7 100644 --- a/crates/iota/src/client_ptb/ast.rs +++ b/crates/iota/src/client_ptb/ast.rs @@ -430,7 +430,7 @@ impl fmt::Display for ParsedPTBCommand { struct TyDisplay<'a>(&'a ParsedType); -impl<'a> fmt::Display for TyDisplay<'a> { +impl fmt::Display for TyDisplay<'_> { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { use ParsedType::*; match self.0 { diff --git a/crates/iota/src/client_ptb/token.rs b/crates/iota/src/client_ptb/token.rs index c4e184eb288..6cae8f1ddcf 100644 --- a/crates/iota/src/client_ptb/token.rs +++ b/crates/iota/src/client_ptb/token.rs @@ -65,7 +65,7 @@ pub enum Token { Upgrade, } -impl<'l> Lexeme<'l> { +impl Lexeme<'_> { /// Returns true if this lexeme corresponds to a special error token. pub fn is_error(&self) -> bool { use Token as T; @@ -84,7 +84,7 @@ impl<'l> Lexeme<'l> { } } -impl<'a> fmt::Display for Lexeme<'a> { +impl fmt::Display for Lexeme<'_> { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { use Token as T; diff --git a/crates/iota/src/displays/dry_run_tx_block.rs b/crates/iota/src/displays/dry_run_tx_block.rs index 44f0727849d..8f4f5d3d217 100644 --- a/crates/iota/src/displays/dry_run_tx_block.rs +++ b/crates/iota/src/displays/dry_run_tx_block.rs @@ -14,7 +14,7 @@ use tabled::{ }; use crate::{client_commands::estimate_gas_budget_from_gas_cost, displays::Pretty}; -impl<'a> Display for Pretty<'a, DryRunTransactionBlockResponse> { +impl Display for Pretty<'_, DryRunTransactionBlockResponse> { fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { let Pretty(response) = self; diff --git a/crates/iota/src/displays/gas_cost_summary.rs b/crates/iota/src/displays/gas_cost_summary.rs index 8880db90553..7a0fea44fcf 100644 --- a/crates/iota/src/displays/gas_cost_summary.rs +++ b/crates/iota/src/displays/gas_cost_summary.rs @@ -8,7 +8,7 @@ use iota_types::gas::GasCostSummary; use crate::displays::Pretty; -impl<'a> Display for Pretty<'a, GasCostSummary> { +impl Display for Pretty<'_, GasCostSummary> { fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { let Pretty(gcs) = self; let GasCostSummary { diff --git a/crates/iota/src/displays/ptb_preview.rs b/crates/iota/src/displays/ptb_preview.rs index 70f6bd7d9f2..c6454ee7b2e 100644 --- a/crates/iota/src/displays/ptb_preview.rs +++ b/crates/iota/src/displays/ptb_preview.rs @@ -17,7 +17,7 @@ use crate::{ sp, }; -impl<'a> Display for PTBPreview<'a> { +impl Display for PTBPreview<'_> { fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { let mut builder = TableBuilder::default(); let columns = vec!["command", "values"]; diff --git a/crates/iota/src/displays/status.rs b/crates/iota/src/displays/status.rs index ba17d6de4cb..debe8ee3747 100644 --- a/crates/iota/src/displays/status.rs +++ b/crates/iota/src/displays/status.rs @@ -8,7 +8,7 @@ use iota_json_rpc_types::IotaExecutionStatus::{self, Failure, Success}; use crate::displays::Pretty; -impl<'a> Display for Pretty<'a, IotaExecutionStatus> { +impl Display for Pretty<'_, IotaExecutionStatus> { fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { let Pretty(status) = self; diff --git a/crates/iota/src/displays/summary.rs b/crates/iota/src/displays/summary.rs index a8db355b876..f886f2e2360 100644 --- a/crates/iota/src/displays/summary.rs +++ b/crates/iota/src/displays/summary.rs @@ -11,7 +11,7 @@ use tabled::{ use crate::{client_ptb::ptb::Summary, displays::Pretty}; -impl<'a> Display for Pretty<'a, Summary> { +impl Display for Pretty<'_, Summary> { fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { let mut builder = TableBuilder::default(); let Pretty(summary) = self; diff --git a/crates/typed-store/src/rocks/iter.rs b/crates/typed-store/src/rocks/iter.rs index 68e76d5cf61..87766b68f7c 100644 --- a/crates/typed-store/src/rocks/iter.rs +++ b/crates/typed-store/src/rocks/iter.rs @@ -57,7 +57,7 @@ impl<'a, K: DeserializeOwned, V: DeserializeOwned> Iter<'a, K, V> { } } -impl<'a, K: DeserializeOwned, V: DeserializeOwned> Iterator for Iter<'a, K, V> { +impl<K: DeserializeOwned, V: DeserializeOwned> Iterator for Iter<'_, K, V> { type Item = (K, V); fn next(&mut self) -> Option<Self::Item> { @@ -94,7 +94,7 @@ impl<'a, K: DeserializeOwned, V: DeserializeOwned> Iterator for Iter<'a, K, V> { } } -impl<'a, K, V> Drop for Iter<'a, K, V> { +impl<K, V> Drop for Iter<'_, K, V> { fn drop(&mut self) { if let Some(bytes_scanned) = self.bytes_scanned.take() { bytes_scanned.observe(self.bytes_scanned_counter as f64); @@ -166,7 +166,7 @@ impl<'a, K, V> RevIter<'a, K, V> { } } -impl<'a, K: DeserializeOwned, V: DeserializeOwned> Iterator for RevIter<'a, K, V> { +impl<K: DeserializeOwned, V: DeserializeOwned> Iterator for RevIter<'_, K, V> { type Item = (K, V); /// Will give the next item backwards diff --git a/crates/typed-store/src/rocks/keys.rs b/crates/typed-store/src/rocks/keys.rs index a50a52160ef..21be69b8a28 100644 --- a/crates/typed-store/src/rocks/keys.rs +++ b/crates/typed-store/src/rocks/keys.rs @@ -24,7 +24,7 @@ impl<'a, K: DeserializeOwned> Keys<'a, K> { } } -impl<'a, K: DeserializeOwned> Iterator for Keys<'a, K> { +impl<K: DeserializeOwned> Iterator for Keys<'_, K> { type Item = Result<K, TypedStoreError>; fn next(&mut self) -> Option<Self::Item> { @@ -44,7 +44,7 @@ impl<'a, K: DeserializeOwned> Iterator for Keys<'a, K> { } } -impl<'a, K: Serialize> Keys<'a, K> { +impl<K: Serialize> Keys<'_, K> { /// Skips all the elements that are smaller than the given key, /// and either lands on the key or the first one greater than /// the key. diff --git a/crates/typed-store/src/rocks/mod.rs b/crates/typed-store/src/rocks/mod.rs index 619ab943cf1..d142afddf15 100644 --- a/crates/typed-store/src/rocks/mod.rs +++ b/crates/typed-store/src/rocks/mod.rs @@ -1795,7 +1795,7 @@ pub enum RocksDBRawIter<'a> { ), } -impl<'a> RocksDBRawIter<'a> { +impl RocksDBRawIter<'_> { pub fn valid(&self) -> bool { delegate_iter_call!(self.valid()) } @@ -1835,7 +1835,7 @@ pub enum RocksDBIter<'a> { ), } -impl<'a> Iterator for RocksDBIter<'a> { +impl Iterator for RocksDBIter<'_> { type Item = Result<(Box<[u8]>, Box<[u8]>), Error>; fn next(&mut self) -> Option<Self::Item> { match self { diff --git a/crates/typed-store/src/rocks/safe_iter.rs b/crates/typed-store/src/rocks/safe_iter.rs index f38ca5e6909..88efa9cb20f 100644 --- a/crates/typed-store/src/rocks/safe_iter.rs +++ b/crates/typed-store/src/rocks/safe_iter.rs @@ -55,7 +55,7 @@ impl<'a, K: DeserializeOwned, V: DeserializeOwned> SafeIter<'a, K, V> { } } -impl<'a, K: DeserializeOwned, V: DeserializeOwned> Iterator for SafeIter<'a, K, V> { +impl<K: DeserializeOwned, V: DeserializeOwned> Iterator for SafeIter<'_, K, V> { type Item = Result<(K, V), TypedStoreError>; fn next(&mut self) -> Option<Self::Item> { @@ -95,7 +95,7 @@ impl<'a, K: DeserializeOwned, V: DeserializeOwned> Iterator for SafeIter<'a, K, } } -impl<'a, K, V> Drop for SafeIter<'a, K, V> { +impl<K, V> Drop for SafeIter<'_, K, V> { fn drop(&mut self) { if let Some(bytes_scanned) = self.bytes_scanned.take() { bytes_scanned.observe(self.bytes_scanned_counter as f64); @@ -160,7 +160,7 @@ impl<'a, K, V> SafeRevIter<'a, K, V> { } } -impl<'a, K: DeserializeOwned, V: DeserializeOwned> Iterator for SafeRevIter<'a, K, V> { +impl<K: DeserializeOwned, V: DeserializeOwned> Iterator for SafeRevIter<'_, K, V> { type Item = Result<(K, V), TypedStoreError>; /// Will give the next item backwards diff --git a/crates/typed-store/src/rocks/tests.rs b/crates/typed-store/src/rocks/tests.rs index 8aa3aef5771..c6e82425622 100644 --- a/crates/typed-store/src/rocks/tests.rs +++ b/crates/typed-store/src/rocks/tests.rs @@ -35,7 +35,7 @@ enum TestIteratorWrapper<'a, K, V> { // for different types of Iterator. For non-safe Iterator, it returns the key // value pair. For SafeIterator, it consumes the result (assuming no error), and // return they key value pairs. -impl<'a, K: DeserializeOwned, V: DeserializeOwned> Iterator for TestIteratorWrapper<'a, K, V> { +impl<K: DeserializeOwned, V: DeserializeOwned> Iterator for TestIteratorWrapper<'_, K, V> { type Item = (K, V); fn next(&mut self) -> Option<Self::Item> { match self { @@ -92,7 +92,7 @@ where } } -impl<'a, K: Serialize, V> TestIteratorWrapper<'a, K, V> { +impl<K: Serialize, V> TestIteratorWrapper<'_, K, V> { pub fn skip_to(self, key: &K) -> Result<Self, TypedStoreError> { match self { TestIteratorWrapper::Iter(iter) => Ok(TestIteratorWrapper::Iter(iter.skip_to(key)?)), diff --git a/crates/typed-store/src/rocks/values.rs b/crates/typed-store/src/rocks/values.rs index 0dfa38d9ed0..f3616a511b0 100644 --- a/crates/typed-store/src/rocks/values.rs +++ b/crates/typed-store/src/rocks/values.rs @@ -24,7 +24,7 @@ impl<'a, V: DeserializeOwned> Values<'a, V> { } } -impl<'a, V: DeserializeOwned> Iterator for Values<'a, V> { +impl<V: DeserializeOwned> Iterator for Values<'_, V> { type Item = Result<V, TypedStoreError>; fn next(&mut self) -> Option<Self::Item> { diff --git a/crates/typed-store/src/sally/mod.rs b/crates/typed-store/src/sally/mod.rs index 7e535e0761f..2766865b64c 100644 --- a/crates/typed-store/src/sally/mod.rs +++ b/crates/typed-store/src/sally/mod.rs @@ -427,7 +427,7 @@ pub enum SallyIter<'a, K, V> { TestDB(TestDBIter<'a, K, V>), } -impl<'a, K: DeserializeOwned, V: DeserializeOwned> Iterator for SallyIter<'a, K, V> { +impl<K: DeserializeOwned, V: DeserializeOwned> Iterator for SallyIter<'_, K, V> { type Item = Result<(K, V), TypedStoreError>; fn next(&mut self) -> Option<Self::Item> { match self { @@ -485,7 +485,7 @@ pub enum SallyRevIter<'a, K, V> { TestDB(TestDBRevIter<'a, K, V>), } -impl<'a, K: DeserializeOwned, V: DeserializeOwned> Iterator for SallyRevIter<'a, K, V> { +impl<K: DeserializeOwned, V: DeserializeOwned> Iterator for SallyRevIter<'_, K, V> { type Item = Result<(K, V), TypedStoreError>; /// Will give the next item backwards @@ -504,7 +504,7 @@ pub enum SallyKeys<'a, K> { TestDB(TestDBKeys<'a, K>), } -impl<'a, K: DeserializeOwned> Iterator for SallyKeys<'a, K> { +impl<K: DeserializeOwned> Iterator for SallyKeys<'_, K> { type Item = Result<K, TypedStoreError>; fn next(&mut self) -> Option<Self::Item> { @@ -522,7 +522,7 @@ pub enum SallyValues<'a, V> { TestDB(TestDBValues<'a, V>), } -impl<'a, V: DeserializeOwned> Iterator for SallyValues<'a, V> { +impl<V: DeserializeOwned> Iterator for SallyValues<'_, V> { type Item = Result<V, TypedStoreError>; fn next(&mut self) -> Option<Self::Item> { diff --git a/crates/typed-store/src/test_db.rs b/crates/typed-store/src/test_db.rs index 2225abb2124..01c17504ce9 100644 --- a/crates/typed-store/src/test_db.rs +++ b/crates/typed-store/src/test_db.rs @@ -74,7 +74,7 @@ pub struct TestDBValues<'a, V> { phantom: PhantomData<V>, } -impl<'a, K: DeserializeOwned, V: DeserializeOwned> Iterator for TestDBIter<'a, K, V> { +impl<K: DeserializeOwned, V: DeserializeOwned> Iterator for TestDBIter<'_, K, V> { type Item = Result<(K, V), TypedStoreError>; fn next(&mut self) -> Option<Self::Item> { @@ -173,7 +173,7 @@ impl<'a, K, V> TestDBRevIter<'a, K, V> { } } -impl<'a, K: DeserializeOwned, V: DeserializeOwned> Iterator for TestDBRevIter<'a, K, V> { +impl<K: DeserializeOwned, V: DeserializeOwned> Iterator for TestDBRevIter<'_, K, V> { type Item = Result<(K, V), TypedStoreError>; /// Will give the next item backwards @@ -182,7 +182,7 @@ impl<'a, K: DeserializeOwned, V: DeserializeOwned> Iterator for TestDBRevIter<'a } } -impl<'a, K: DeserializeOwned> Iterator for TestDBKeys<'a, K> { +impl<K: DeserializeOwned> Iterator for TestDBKeys<'_, K> { type Item = Result<K, TypedStoreError>; fn next(&mut self) -> Option<Self::Item> { @@ -200,7 +200,7 @@ impl<'a, K: DeserializeOwned> Iterator for TestDBKeys<'a, K> { } } -impl<'a, V: DeserializeOwned> Iterator for TestDBValues<'a, V> { +impl<V: DeserializeOwned> Iterator for TestDBValues<'_, V> { type Item = Result<V, TypedStoreError>; fn next(&mut self) -> Option<Self::Item> { diff --git a/iota-execution/latest/iota-adapter/src/programmable_transactions/context.rs b/iota-execution/latest/iota-adapter/src/programmable_transactions/context.rs index d8d20638fc6..cfe7ff20ee5 100644 --- a/iota-execution/latest/iota-adapter/src/programmable_transactions/context.rs +++ b/iota-execution/latest/iota-adapter/src/programmable_transactions/context.rs @@ -1019,7 +1019,7 @@ mod checked { } } - impl<'vm, 'state, 'a> TypeTagResolver for ExecutionContext<'vm, 'state, 'a> { + impl TypeTagResolver for ExecutionContext<'_, '_, '_> { /// Retrieves the `TypeTag` corresponding to the provided `Type` by /// querying the Move VM runtime. fn get_type_tag(&self, type_: &Type) -> Result<TypeTag, ExecutionError> { @@ -1464,7 +1464,7 @@ mod checked { // TODO: `DataStore` will be reworked and this is likely to disappear. // Leaving this comment around until then as testament to better days to // come... - impl<'state, 'a> DataStore for IotaDataStore<'state, 'a> { + impl DataStore for IotaDataStore<'_, '_> { fn link_context(&self) -> AccountAddress { self.linkage_view.link_context() } diff --git a/iota-execution/latest/iota-adapter/src/programmable_transactions/execution.rs b/iota-execution/latest/iota-adapter/src/programmable_transactions/execution.rs index cc70099dc59..b382a447ffc 100644 --- a/iota-execution/latest/iota-adapter/src/programmable_transactions/execution.rs +++ b/iota-execution/latest/iota-adapter/src/programmable_transactions/execution.rs @@ -1659,7 +1659,7 @@ mod checked { struct VectorElementVisitor<'a>(&'a PrimitiveArgumentLayout); - impl<'d, 'a> serde::de::Visitor<'d> for VectorElementVisitor<'a> { + impl<'d> serde::de::Visitor<'d> for VectorElementVisitor<'_> { type Value = (); fn expecting(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result { @@ -1677,7 +1677,7 @@ mod checked { struct OptionElementVisitor<'a>(&'a PrimitiveArgumentLayout); - impl<'d, 'a> serde::de::Visitor<'d> for OptionElementVisitor<'a> { + impl<'d> serde::de::Visitor<'d> for OptionElementVisitor<'_> { type Value = (); fn expecting(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result { diff --git a/iota-execution/latest/iota-adapter/src/programmable_transactions/linkage_view.rs b/iota-execution/latest/iota-adapter/src/programmable_transactions/linkage_view.rs index 40a0270c3fe..b3bdf7948a8 100644 --- a/iota-execution/latest/iota-adapter/src/programmable_transactions/linkage_view.rs +++ b/iota-execution/latest/iota-adapter/src/programmable_transactions/linkage_view.rs @@ -303,7 +303,7 @@ impl From<&MovePackage> for LinkageInfo { } } -impl<'state> LinkageResolver for LinkageView<'state> { +impl LinkageResolver for LinkageView<'_> { type Error = IotaError; fn link_context(&self) -> AccountAddress { @@ -325,7 +325,7 @@ impl<'state> LinkageResolver for LinkageView<'state> { /// Remaining implementations delegated to state_view ************************ -impl<'state> ResourceResolver for LinkageView<'state> { +impl ResourceResolver for LinkageView<'_> { type Error = IotaError; fn get_resource( @@ -337,7 +337,7 @@ impl<'state> ResourceResolver for LinkageView<'state> { } } -impl<'state> ModuleResolver for LinkageView<'state> { +impl ModuleResolver for LinkageView<'_> { type Error = IotaError; fn get_module(&self, id: &ModuleId) -> Result<Option<Vec<u8>>, Self::Error> { @@ -345,7 +345,7 @@ impl<'state> ModuleResolver for LinkageView<'state> { } } -impl<'state> BackingPackageStore for LinkageView<'state> { +impl BackingPackageStore for LinkageView<'_> { fn get_package_object(&self, package_id: &ObjectID) -> IotaResult<Option<PackageObject>> { self.resolver.get_package_object(package_id) } diff --git a/iota-execution/latest/iota-adapter/src/temporary_store.rs b/iota-execution/latest/iota-adapter/src/temporary_store.rs index 10f5a7304f5..87587c322c9 100644 --- a/iota-execution/latest/iota-adapter/src/temporary_store.rs +++ b/iota-execution/latest/iota-adapter/src/temporary_store.rs @@ -531,7 +531,7 @@ impl<'backing> TemporaryStore<'backing> { } } -impl<'backing> TemporaryStore<'backing> { +impl TemporaryStore<'_> { // check that every object read is owned directly or indirectly by sender, // sponsor, or a shared object input pub fn check_ownership_invariants( @@ -652,7 +652,7 @@ impl<'backing> TemporaryStore<'backing> { } } -impl<'backing> TemporaryStore<'backing> { +impl TemporaryStore<'_> { /// Track storage gas for each mutable input object (including the gas coin) /// and each created object. Compute storage refunds for each deleted /// object. Will *not* charge anything, gas status keeps track of @@ -736,7 +736,7 @@ impl<'backing> TemporaryStore<'backing> { // Charge gas current - end //============================================================================== -impl<'backing> TemporaryStore<'backing> { +impl TemporaryStore<'_> { pub fn advance_epoch_safe_mode( &mut self, params: &AdvanceEpochParams, @@ -757,7 +757,7 @@ type ModifiedObjectInfo<'a> = ( Option<&'a Object>, ); -impl<'backing> TemporaryStore<'backing> { +impl TemporaryStore<'_> { fn get_input_iota( &self, id: &ObjectID, @@ -968,7 +968,7 @@ impl<'backing> TemporaryStore<'backing> { } } -impl<'backing> ChildObjectResolver for TemporaryStore<'backing> { +impl ChildObjectResolver for TemporaryStore<'_> { fn read_child_object( &self, parent: &ObjectID, @@ -1016,7 +1016,7 @@ impl<'backing> ChildObjectResolver for TemporaryStore<'backing> { } } -impl<'backing> Storage for TemporaryStore<'backing> { +impl Storage for TemporaryStore<'_> { fn reset(&mut self) { self.drop_writes(); } @@ -1068,7 +1068,7 @@ impl<'backing> Storage for TemporaryStore<'backing> { } } -impl<'backing> BackingPackageStore for TemporaryStore<'backing> { +impl BackingPackageStore for TemporaryStore<'_> { fn get_package_object(&self, package_id: &ObjectID) -> IotaResult<Option<PackageObject>> { // We first check the objects in the temporary store because in non-production // code path, it is possible to read packages that are just written in @@ -1102,7 +1102,7 @@ impl<'backing> BackingPackageStore for TemporaryStore<'backing> { } } -impl<'backing> ResourceResolver for TemporaryStore<'backing> { +impl ResourceResolver for TemporaryStore<'_> { type Error = IotaError; fn get_resource( diff --git a/iota-execution/latest/iota-adapter/src/type_layout_resolver.rs b/iota-execution/latest/iota-adapter/src/type_layout_resolver.rs index 4520d29b0ad..941c3cae02a 100644 --- a/iota-execution/latest/iota-adapter/src/type_layout_resolver.rs +++ b/iota-execution/latest/iota-adapter/src/type_layout_resolver.rs @@ -37,7 +37,7 @@ impl<'state, 'vm> TypeLayoutResolver<'state, 'vm> { } } -impl<'state, 'vm> LayoutResolver for TypeLayoutResolver<'state, 'vm> { +impl LayoutResolver for TypeLayoutResolver<'_, '_> { fn get_annotated_layout( &mut self, struct_tag: &StructTag, @@ -58,13 +58,13 @@ impl<'state, 'vm> LayoutResolver for TypeLayoutResolver<'state, 'vm> { } } -impl<'state> BackingPackageStore for NullIotaResolver<'state> { +impl BackingPackageStore for NullIotaResolver<'_> { fn get_package_object(&self, package_id: &ObjectID) -> IotaResult<Option<PackageObject>> { self.0.get_package_object(package_id) } } -impl<'state> ResourceResolver for NullIotaResolver<'state> { +impl ResourceResolver for NullIotaResolver<'_> { type Error = IotaError; fn get_resource( diff --git a/iota-execution/latest/iota-move-natives/src/object_runtime/mod.rs b/iota-execution/latest/iota-move-natives/src/object_runtime/mod.rs index 9244a158540..099f3c8537d 100644 --- a/iota-execution/latest/iota-move-natives/src/object_runtime/mod.rs +++ b/iota-execution/latest/iota-move-natives/src/object_runtime/mod.rs @@ -696,7 +696,7 @@ pub fn get_all_uids( struct UIDTraversalV1<'i>(&'i mut BTreeSet<ObjectID>); struct UIDCollectorV1<'i>(&'i mut BTreeSet<ObjectID>); - impl<'i> AV::Traversal for UIDTraversalV1<'i> { + impl AV::Traversal for UIDTraversalV1<'_> { type Error = AV::Error; fn traverse_struct(&mut self, driver: &mut AV::StructDriver) -> Result<(), Self::Error> { @@ -709,7 +709,7 @@ pub fn get_all_uids( } } - impl<'i> AV::Traversal for UIDCollectorV1<'i> { + impl AV::Traversal for UIDCollectorV1<'_> { type Error = AV::Error; fn traverse_address(&mut self, value: AccountAddress) -> Result<(), Self::Error> { self.0.insert(value.into()); diff --git a/iota-execution/latest/iota-move-natives/src/object_runtime/object_store.rs b/iota-execution/latest/iota-move-natives/src/object_runtime/object_store.rs index 6883e4b6b46..50ef7d78cc3 100644 --- a/iota-execution/latest/iota-move-natives/src/object_runtime/object_store.rs +++ b/iota-execution/latest/iota-move-natives/src/object_runtime/object_store.rs @@ -164,7 +164,7 @@ macro_rules! fetch_child_object_unbounded { }}; } -impl<'a> Inner<'a> { +impl Inner<'_> { fn receive_object_from_store( &self, owner: ObjectID, diff --git a/iota-execution/latest/iota-verifier/src/id_leak_verifier.rs b/iota-execution/latest/iota-verifier/src/id_leak_verifier.rs index ab6c62783e7..6df340594d7 100644 --- a/iota-execution/latest/iota-verifier/src/id_leak_verifier.rs +++ b/iota-execution/latest/iota-verifier/src/id_leak_verifier.rs @@ -273,7 +273,7 @@ impl<'a> IDLeakAnalysis<'a> { } } -impl<'a> TransferFunctions for IDLeakAnalysis<'a> { +impl TransferFunctions for IDLeakAnalysis<'_> { type Error = ExecutionError; type State = AbstractState; @@ -301,7 +301,7 @@ impl<'a> TransferFunctions for IDLeakAnalysis<'a> { } } -impl<'a> AbstractInterpreter for IDLeakAnalysis<'a> {} +impl AbstractInterpreter for IDLeakAnalysis<'_> {} fn call( verifier: &mut IDLeakAnalysis, diff --git a/iota-execution/src/latest.rs b/iota-execution/src/latest.rs index 4f1c5ebe57d..cc556480a73 100644 --- a/iota-execution/src/latest.rs +++ b/iota-execution/src/latest.rs @@ -188,7 +188,7 @@ impl executor::Executor for Executor { } } -impl<'m> verifier::Verifier for Verifier<'m> { +impl verifier::Verifier for Verifier<'_> { fn meter(&self, config: MeterConfig) -> Box<dyn Meter> { Box::new(IotaVerifierMeter::new(config)) } From 7dbce35c6d2f03880c9cea4ca70fb62024184e4e Mon Sep 17 00:00:00 2001 From: evavirseda <evirseda@boxfish.studio> Date: Fri, 6 Dec 2024 15:36:21 +0100 Subject: [PATCH 17/97] feat(wallet & dashboard): fix review & send icon (#4373) * fix icon * feat: remove unncessary div * fix(dashboard): remove character from TxnAmount component, update text size. --------- Co-authored-by: Panteleymonchuk <panteleymonchuk@gmail.com> Co-authored-by: Bran <52735957+brancoder@users.noreply.github.com> --- .../Dialogs/SendToken/views/ReviewValuesFormView.tsx | 3 +-- .../src/ui/app/components/receipt-card/TxnAmount.tsx | 9 +-------- 2 files changed, 2 insertions(+), 10 deletions(-) diff --git a/apps/wallet-dashboard/components/Dialogs/SendToken/views/ReviewValuesFormView.tsx b/apps/wallet-dashboard/components/Dialogs/SendToken/views/ReviewValuesFormView.tsx index f278a637044..58d6e21e10b 100644 --- a/apps/wallet-dashboard/components/Dialogs/SendToken/views/ReviewValuesFormView.tsx +++ b/apps/wallet-dashboard/components/Dialogs/SendToken/views/ReviewValuesFormView.tsx @@ -53,9 +53,8 @@ export function ReviewValuesFormView({ <CardImage type={ImageType.BgSolid}> <CoinIcon coinType={coinType} - size={ImageIconSize.Small} rounded - hasCoinWrapper + size={ImageIconSize.Small} /> </CardImage> <CardBody diff --git a/apps/wallet/src/ui/app/components/receipt-card/TxnAmount.tsx b/apps/wallet/src/ui/app/components/receipt-card/TxnAmount.tsx index 2a89a992eb3..85d4ff481e0 100644 --- a/apps/wallet/src/ui/app/components/receipt-card/TxnAmount.tsx +++ b/apps/wallet/src/ui/app/components/receipt-card/TxnAmount.tsx @@ -12,7 +12,6 @@ import { CardType, ImageType, } from '@iota/apps-ui-kit'; -import { IOTA_TYPE_ARG } from '@iota/iota-sdk/utils'; interface TxnAmountProps { amount: string | number | bigint; @@ -29,13 +28,7 @@ export function TxnAmount({ amount, coinType, subtitle, approximation }: TxnAmou return Number(amount) !== 0 ? ( <Card type={CardType.Filled}> <CardImage type={ImageType.BgSolid}> - <div className="flex h-full w-full items-center justify-center rounded-full border border-shader-neutral-light-8 text-neutral-10 dark:text-neutral-92"> - <CoinIcon - coinType={coinType} - rounded - size={coinType === IOTA_TYPE_ARG ? ImageIconSize.Small : ImageIconSize.Full} - /> - </div> + <CoinIcon coinType={coinType} rounded size={ImageIconSize.Large} hasCoinWrapper /> </CardImage> <CardBody title={`${approximation ? '~' : ''}${formatAmount} ${symbol}`} From f0bbd37bdf33933b6e2ea2e81414a1206d043099 Mon Sep 17 00:00:00 2001 From: Valerii Reutov <valeriy.reutov@gmail.com> Date: Fri, 6 Dec 2024 08:18:13 -0800 Subject: [PATCH 18/97] feat(docs): add an IOTA Move VS Code extension link to the documentation (#4385) --- docs/content/developer/getting-started/iota-environment.mdx | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/docs/content/developer/getting-started/iota-environment.mdx b/docs/content/developer/getting-started/iota-environment.mdx index 3c3360d1cf9..1d8a50aeefd 100644 --- a/docs/content/developer/getting-started/iota-environment.mdx +++ b/docs/content/developer/getting-started/iota-environment.mdx @@ -34,6 +34,4 @@ IOTA provides two official SDKs that you can use to interact with the IOTA netwo ## Move IDEs and plugins -We recommend that you use the [Visual Studio Code](https://code.visualstudio.com/) IDE. - -We are currently developing a code analyzer plugin for Visual Studio Code - details to follow soon. \ No newline at end of file +We recommend that you use the [Visual Studio Code](https://code.visualstudio.com/) IDE with the [IOTA Move](https://marketplace.visualstudio.com/items?itemName=iotaledger.iota-move) extension installed. \ No newline at end of file From e1f4f0fed3363b9e28a994ef3cd8b069c79af070 Mon Sep 17 00:00:00 2001 From: Yang Hau <yuanyanghau@gmail.com> Date: Wed, 4 Dec 2024 15:46:49 +0100 Subject: [PATCH 19/97] Make comment more clear --- crates/iota-protocol-config/src/lib.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/crates/iota-protocol-config/src/lib.rs b/crates/iota-protocol-config/src/lib.rs index fe3b91a845e..0f9e6224d98 100644 --- a/crates/iota-protocol-config/src/lib.rs +++ b/crates/iota-protocol-config/src/lib.rs @@ -898,9 +898,9 @@ pub struct ProtocolConfig { /// version. random_beacon_dkg_version: Option<u64>, - /// The maximum serialised transaction size (in bytes) accepted by - /// consensus. That should be bigger than the `max_tx_size_bytes` with - /// some additional headroom. + /// The maximum serialized transaction size (in bytes) accepted by consensus. + /// `consensus_max_transaction_size_bytes` should include space for additional + /// metadata, on top of the `max_tx_size_bytes` value. consensus_max_transaction_size_bytes: Option<u64>, /// The maximum size of transactions included in a consensus block. consensus_max_transactions_in_block_bytes: Option<u64>, From e56181b3f0adac807a878fdcfc8f5d4aaa07189d Mon Sep 17 00:00:00 2001 From: evavirseda <evirseda@boxfish.studio> Date: Mon, 9 Dec 2024 10:44:20 +0100 Subject: [PATCH 20/97] feat(wallet-dashboard): style migration overview homepage (#4344) * feat: add new icon * feat: update carAction component * feat: update feature flags * feat: update icon * polish * minor fix * feat: countdown * feat: improve import and naming * feat: add hook * feat: polishes * fix imports * minor fixes * fix build * fix build * feat: rename function, variables and fix improts * feat: rename countdown and fix it * feat: remove undefined from button type * fix lint * feat: remove debris * feat: add migration banner * fix build * feat: improve naming * feat: update route * fix useffect and filter payouts * feat: improvements * feat: activate dev feature * feat: improve conditions * refactor * cleanup * fix: decouple the useGetStardustMigratableObjects hook from StardustMigration flag --------- Co-authored-by: Marc Espin <mespinsanz@gmail.com> Co-authored-by: Branko <brankobosnic1@gmail.com> --- .../src/features/features.controller.ts | 2 +- .../app/(protected)/home/page.tsx | 27 ++++------- .../app/(protected)/migrations/page.tsx | 36 ++++---------- apps/wallet-dashboard/app/globals.css | 6 +-- .../components/MigrationOverview.tsx | 39 +++++++++++++++ apps/wallet-dashboard/components/index.ts | 1 + apps/wallet-dashboard/hooks/index.ts | 1 + .../hooks/useGetStardustMigratableObjects.ts | 47 +++++++++++++++++++ 8 files changed, 109 insertions(+), 50 deletions(-) create mode 100644 apps/wallet-dashboard/components/MigrationOverview.tsx create mode 100644 apps/wallet-dashboard/hooks/useGetStardustMigratableObjects.ts diff --git a/apps/apps-backend/src/features/features.controller.ts b/apps/apps-backend/src/features/features.controller.ts index 5a83f185621..c3947236ec5 100644 --- a/apps/apps-backend/src/features/features.controller.ts +++ b/apps/apps-backend/src/features/features.controller.ts @@ -65,7 +65,7 @@ export class FeaturesController { defaultValue: false, }, [Feature.StardustMigration]: { - defaultValue: false, + defaultValue: true, }, [Feature.SupplyIncreaseVesting]: { defaultValue: true, diff --git a/apps/wallet-dashboard/app/(protected)/home/page.tsx b/apps/wallet-dashboard/app/(protected)/home/page.tsx index 61ba1487213..61f55475702 100644 --- a/apps/wallet-dashboard/app/(protected)/home/page.tsx +++ b/apps/wallet-dashboard/app/(protected)/home/page.tsx @@ -2,44 +2,35 @@ // SPDX-License-Identifier: Apache-2.0 'use client'; -import { AccountBalance, MyCoins, TransactionsOverview, StakingOverview } from '@/components'; +import { + AccountBalance, + MyCoins, + TransactionsOverview, + StakingOverview, + MigrationOverview, +} from '@/components'; import { useFeature } from '@growthbook/growthbook-react'; import { Feature } from '@iota/core'; import { useCurrentAccount, useCurrentWallet } from '@iota/dapp-kit'; -import clsx from 'clsx'; function HomeDashboardPage(): JSX.Element { const { connectionStatus } = useCurrentWallet(); const account = useCurrentAccount(); const stardustMigrationEnabled = useFeature<boolean>(Feature.StardustMigration).value; - // Add the logic here to check if the user has migration objects. - const needsMigration = false && stardustMigrationEnabled; return ( <main className="flex flex-1 flex-col items-center space-y-8 py-md"> {connectionStatus === 'connected' && account && ( <> - <div - className={clsx( - 'home-page-grid-container h-full w-full', - needsMigration && 'with-migration', - )} - > + <div className="home-page-grid-container h-full w-full"> <div style={{ gridArea: 'balance' }} className="flex grow overflow-hidden"> <AccountBalance /> </div> <div style={{ gridArea: 'staking' }} className="flex grow overflow-hidden"> <StakingOverview /> </div> - {needsMigration && ( - <div - style={{ gridArea: 'migration' }} - className="flex grow overflow-hidden" - > - Migration - </div> - )} + {stardustMigrationEnabled && <MigrationOverview />} <div style={{ gridArea: 'coins' }}> <MyCoins /> </div> diff --git a/apps/wallet-dashboard/app/(protected)/migrations/page.tsx b/apps/wallet-dashboard/app/(protected)/migrations/page.tsx index 55ac40f5e99..4d5324ac6e2 100644 --- a/apps/wallet-dashboard/app/(protected)/migrations/page.tsx +++ b/apps/wallet-dashboard/app/(protected)/migrations/page.tsx @@ -4,15 +4,10 @@ import { VirtualList } from '@/components'; import MigratePopup from '@/components/Popup/Popups/MigratePopup'; -import { useGetCurrentEpochStartTimestamp, usePopups } from '@/hooks'; -import { groupStardustObjectsByMigrationStatus } from '@/lib/utils'; +import { useGetStardustMigratableObjects, usePopups } from '@/hooks'; import { Button } from '@iota/apps-ui-kit'; import { useCurrentAccount, useIotaClient, useIotaClientContext } from '@iota/dapp-kit'; -import { - STARDUST_BASIC_OUTPUT_TYPE, - STARDUST_NFT_OUTPUT_TYPE, - useGetAllOwnedObjects, -} from '@iota/core'; +import { STARDUST_BASIC_OUTPUT_TYPE, STARDUST_NFT_OUTPUT_TYPE } from '@iota/core'; import { getNetwork, IotaObjectData } from '@iota/iota-sdk/client'; import { useQueryClient } from '@tanstack/react-query'; @@ -24,28 +19,13 @@ function MigrationDashboardPage(): JSX.Element { const iotaClient = useIotaClient(); const { network } = useIotaClientContext(); const { explorer } = getNetwork(network); - const { data: currentEpochMs } = useGetCurrentEpochStartTimestamp(); - const { data: basicOutputObjects } = useGetAllOwnedObjects(address, { - StructType: STARDUST_BASIC_OUTPUT_TYPE, - }); - const { data: nftOutputObjects } = useGetAllOwnedObjects(address, { - StructType: STARDUST_NFT_OUTPUT_TYPE, - }); - - const { migratable: migratableBasicOutputs, unmigratable: unmigratableBasicOutputs } = - groupStardustObjectsByMigrationStatus( - basicOutputObjects ?? [], - Number(currentEpochMs), - address, - ); - - const { migratable: migratableNftOutputs, unmigratable: unmigratableNftOutputs } = - groupStardustObjectsByMigrationStatus( - nftOutputObjects ?? [], - Number(currentEpochMs), - address, - ); + const { + migratableBasicOutputs, + unmigratableBasicOutputs, + migratableNftOutputs, + unmigratableNftOutputs, + } = useGetStardustMigratableObjects(address); const hasMigratableObjects = migratableBasicOutputs.length > 0 || migratableNftOutputs.length > 0; diff --git a/apps/wallet-dashboard/app/globals.css b/apps/wallet-dashboard/app/globals.css index 82c7527e111..04c6811f389 100644 --- a/apps/wallet-dashboard/app/globals.css +++ b/apps/wallet-dashboard/app/globals.css @@ -36,7 +36,7 @@ body { height: 200px; } } - .home-page-grid-container.with-migration { + .home-page-grid-container:has(.with-migration) { grid-template-areas: 'balance' 'staking' @@ -56,7 +56,7 @@ body { 'vesting vesting' 'activity activity'; } - .home-page-grid-container.with-migration { + .home-page-grid-container:has(.with-migration) { grid-template-areas: 'balance balance' 'staking migration' @@ -74,7 +74,7 @@ body { 'coins vesting vesting' 'coins activity activity'; } - .home-page-grid-container.with-migration { + .home-page-grid-container:has(.with-migration) { grid-template-areas: 'balance staking migration' 'coins vesting vesting' diff --git a/apps/wallet-dashboard/components/MigrationOverview.tsx b/apps/wallet-dashboard/components/MigrationOverview.tsx new file mode 100644 index 00000000000..9b17852f3d5 --- /dev/null +++ b/apps/wallet-dashboard/components/MigrationOverview.tsx @@ -0,0 +1,39 @@ +// Copyright (c) 2024 IOTA Stiftung +// SPDX-License-Identifier: Apache-2.0 + +import { useTheme, Theme } from '@iota/core'; +import { useRouter } from 'next/navigation'; +import { Banner } from './Banner'; +import { useCurrentAccount } from '@iota/dapp-kit'; +import { useGetStardustMigratableObjects } from '@/hooks'; + +export function MigrationOverview() { + const { theme } = useTheme(); + const router = useRouter(); + const account = useCurrentAccount(); + const address = account?.address || ''; + const { migratableBasicOutputs, migratableNftOutputs } = + useGetStardustMigratableObjects(address); + + const needsMigration = migratableBasicOutputs.length > 0 || migratableNftOutputs.length > 0; + + const videoSrc = + theme === Theme.Dark + ? 'https://files.iota.org/media/tooling/wallet-dashboard-migration-dark.mp4' + : 'https://files.iota.org/media/tooling/wallet-dashboard-migration-light.mp4'; + + function handleButtonClick() { + router.push('/migrations'); + } + return needsMigration ? ( + <div style={{ gridArea: 'migration' }} className="with-migration flex grow overflow-hidden"> + <Banner + videoSrc={videoSrc} + title="Migration" + subtitle="Fast & Easy" + onButtonClick={handleButtonClick} + buttonText="Start Migration" + /> + </div> + ) : null; +} diff --git a/apps/wallet-dashboard/components/index.ts b/apps/wallet-dashboard/components/index.ts index a1851aa5995..179f9e836ac 100644 --- a/apps/wallet-dashboard/components/index.ts +++ b/apps/wallet-dashboard/components/index.ts @@ -25,3 +25,4 @@ export * from './ValidatorStakingData'; export * from './tiles'; export * from './Toaster'; export * from './Banner'; +export * from './MigrationOverview'; diff --git a/apps/wallet-dashboard/hooks/index.ts b/apps/wallet-dashboard/hooks/index.ts index 373c4e399dc..77ea2304aa4 100644 --- a/apps/wallet-dashboard/hooks/index.ts +++ b/apps/wallet-dashboard/hooks/index.ts @@ -10,3 +10,4 @@ export * from './useCreateSendAssetTransaction'; export * from './useGetCurrentEpochStartTimestamp'; export * from './useTimelockedUnstakeTransaction'; export * from './useExplorerLinkGetter'; +export * from './useGetStardustMigratableObjects'; diff --git a/apps/wallet-dashboard/hooks/useGetStardustMigratableObjects.ts b/apps/wallet-dashboard/hooks/useGetStardustMigratableObjects.ts new file mode 100644 index 00000000000..7a5b40ce140 --- /dev/null +++ b/apps/wallet-dashboard/hooks/useGetStardustMigratableObjects.ts @@ -0,0 +1,47 @@ +// Copyright (c) 2024 IOTA Stiftung +// SPDX-License-Identifier: Apache-2.0 + +import { useGetCurrentEpochStartTimestamp } from '@/hooks'; +import { groupStardustObjectsByMigrationStatus } from '@/lib/utils'; +import { + STARDUST_BASIC_OUTPUT_TYPE, + STARDUST_NFT_OUTPUT_TYPE, + useGetAllOwnedObjects, +} from '@iota/core'; +import { IotaObjectData } from '@iota/iota-sdk/client'; + +export function useGetStardustMigratableObjects(address: string): { + migratableBasicOutputs: IotaObjectData[]; + unmigratableBasicOutputs: IotaObjectData[]; + migratableNftOutputs: IotaObjectData[]; + unmigratableNftOutputs: IotaObjectData[]; +} { + const { data: currentEpochMs } = useGetCurrentEpochStartTimestamp(); + const { data: basicOutputObjects } = useGetAllOwnedObjects(address, { + StructType: STARDUST_BASIC_OUTPUT_TYPE, + }); + const { data: nftOutputObjects } = useGetAllOwnedObjects(address, { + StructType: STARDUST_NFT_OUTPUT_TYPE, + }); + + const { migratable: migratableBasicOutputs, unmigratable: unmigratableBasicOutputs } = + groupStardustObjectsByMigrationStatus( + basicOutputObjects ?? [], + Number(currentEpochMs), + address, + ); + + const { migratable: migratableNftOutputs, unmigratable: unmigratableNftOutputs } = + groupStardustObjectsByMigrationStatus( + nftOutputObjects ?? [], + Number(currentEpochMs), + address, + ); + + return { + migratableBasicOutputs, + unmigratableBasicOutputs, + migratableNftOutputs, + unmigratableNftOutputs, + }; +} From 6dab9e57e28af5ae6648cf5728326ff33450e9fe Mon Sep 17 00:00:00 2001 From: Gino Osahon <ginowine1@gmail.com> Date: Mon, 9 Dec 2024 14:26:07 +0100 Subject: [PATCH 21/97] fix(docs) remove duplicate (#4394) --- .../iota-identity/how-tos/decentralized-identifiers/resolve.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/content/iota-identity/how-tos/decentralized-identifiers/resolve.mdx b/docs/content/iota-identity/how-tos/decentralized-identifiers/resolve.mdx index 2fec47c8a78..3f5bb7a23dd 100644 --- a/docs/content/iota-identity/how-tos/decentralized-identifiers/resolve.mdx +++ b/docs/content/iota-identity/how-tos/decentralized-identifiers/resolve.mdx @@ -33,7 +33,7 @@ The following examples demonstrate how to resolve an IOTA DID Document from its Once you have configured a `Resolver` with a `Client`, it will resolve IOTA DID Documents according to the read procedure defined in the [IOTA DID Method Specification](../../../references/iota-identity/iota-did-method-spec.mdx#read). -It fetches the the `Identity` from the network specified in the DID (see [DID Format](../../../references/iota-identity/iota-did-method-spec.mdx#did-format)), +It fetches the `Identity` from the network specified in the DID (see [DID Format](../../../references/iota-identity/iota-did-method-spec.mdx#did-format)), then extracts and validates the DID Document from it. <Tabs groupId="language" queryString> From e51c090d22c2956566933cfe2141c488a51eec36 Mon Sep 17 00:00:00 2001 From: Pavlo Botnar <pavlo.botnar@gmail.com> Date: Tue, 10 Dec 2024 10:36:51 +0200 Subject: [PATCH 22/97] fix(iota, iota-replay): fix test_profiler test by unignoring it and pass valid tx_digest (#4396) * fix(iota, iota-replay): fix test_profiler test by unignoring it and pass valid tx_digest --- crates/iota-replay/src/replay.rs | 13 +------------ crates/iota/src/unit_tests/profiler_tests.rs | 3 +-- 2 files changed, 2 insertions(+), 14 deletions(-) diff --git a/crates/iota-replay/src/replay.rs b/crates/iota-replay/src/replay.rs index a2e7ddff8d2..0c40b5c52ff 100644 --- a/crates/iota-replay/src/replay.rs +++ b/crates/iota-replay/src/replay.rs @@ -727,18 +727,7 @@ impl LocalExec { reason: "System transaction".to_string(), }); } - // Before protocol version 16, the generation of effects depends on the wrapped - // tombstones. It is not possible to retrieve such data for replay. - if tx_info.protocol_version.as_u64() < 16 { - warn!( - "Protocol version ({:?}) too old: {}, skipping transaction", - tx_info.protocol_version, tx_digest - ); - return Err(ReplayEngineError::TransactionNotSupported { - digest: *tx_digest, - reason: "Protocol version too old".to_string(), - }); - } + // Initialize the state necessary for execution // Get the input objects let input_objects = self.initialize_execution_env_state(tx_info).await?; diff --git a/crates/iota/src/unit_tests/profiler_tests.rs b/crates/iota/src/unit_tests/profiler_tests.rs index f9b6aadf208..ac053d7b032 100644 --- a/crates/iota/src/unit_tests/profiler_tests.rs +++ b/crates/iota/src/unit_tests/profiler_tests.rs @@ -36,7 +36,6 @@ fn test_macro_shows_feature_enabled() { } } -#[ignore] #[cfg(feature = "gas-profiler")] #[tokio::test(flavor = "multi_thread")] async fn test_profiler() { @@ -49,7 +48,7 @@ async fn test_profiler() { let profile_output = output_dir.path().join("profile.json"); let testnet_url = "https://api.testnet.iota.cafe".to_string(); - let tx_digest = "98KxVD14f2JgceKx4X27HaVAA2YGJ3Aazf6Y4tabpHa8".to_string(); + let tx_digest = "7qq4W43TqHg9tQPMvdAFW4Tz6J88KnPppBPR1hNKmQAd".to_string(); let cmd = ReplayToolCommand::ProfileTransaction { tx_digest, From 2ccffdf2805bf0a6cd5a5de2e44e69074c67e643 Mon Sep 17 00:00:00 2001 From: Pavlo Botnar <pavlo.botnar@gmail.com> Date: Tue, 10 Dec 2024 17:39:30 +0200 Subject: [PATCH 23/97] fix(iota-replay): verify_latest_tx_replay_testnet_mainnet but only for the testnet once mainnet is ready (#4401) * fix(iota-replay): verify_latest_tx_replay_testnet_mainnet but only for testnet till mainnet is ready Rename extract_one_system_tx to extract_one_no_system_tx --- crates/iota-replay/src/config.rs | 4 ++-- crates/iota-replay/src/tests.rs | 12 ++++++------ 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/crates/iota-replay/src/config.rs b/crates/iota-replay/src/config.rs index 09ec3e4e264..8186b3c2f2b 100644 --- a/crates/iota-replay/src/config.rs +++ b/crates/iota-replay/src/config.rs @@ -106,7 +106,7 @@ impl Default for ReplayableNetworkConfigSet { name: "testnet".to_string(), epoch_zero_start_timestamp: 0, epoch_zero_rgp: 0, - public_full_node: url_from_str("https://fullnode.testnet.iota.io:443") + public_full_node: url_from_str("https://api.testnet.iota.cafe") .expect("invalid socket address") .to_string(), }; @@ -114,7 +114,7 @@ impl Default for ReplayableNetworkConfigSet { name: "devnet".to_string(), epoch_zero_start_timestamp: 0, epoch_zero_rgp: 0, - public_full_node: url_from_str("https://fullnode.devnet.iota.io:443") + public_full_node: url_from_str("https://api.devnet.iota.cafe") .expect("invalid socket address") .to_string(), }; diff --git a/crates/iota-replay/src/tests.rs b/crates/iota-replay/src/tests.rs index a3759dcd479..73114511319 100644 --- a/crates/iota-replay/src/tests.rs +++ b/crates/iota-replay/src/tests.rs @@ -16,11 +16,10 @@ use crate::{ /// Keep searching for non-system TXs in the checkppints for this long /// Very unlikely to take this long, but we want to be sure we find one -const NUM_CHECKPOINTS_TO_ATTEMPT: usize = 1_000; +const NUM_CHECKPOINTS_TO_ATTEMPT: usize = 10_000; /// Checks that replaying the latest tx on each testnet and mainnet does not /// fail -#[ignore] #[tokio::test] async fn verify_latest_tx_replay_testnet_mainnet() { let _ = verify_latest_tx_replay_impl().await; @@ -30,7 +29,8 @@ async fn verify_latest_tx_replay_impl() { let urls: Vec<_> = default_cfg .base_network_configs .iter() - .filter(|q| q.name != "devnet") // Devnet is not always stable + // TODO: enable this when mainnet is launched + .filter(|q| q.name != "devnet" && q.name != "mainnet") // Devnet is not always stable, mainnet is not ready .map(|c| c.public_full_node.clone()) .collect(); @@ -60,7 +60,7 @@ async fn verify_latest_tx_replay_impl() { .unwrap() .transactions; - let mut non_system_txs = extract_one_system_tx(&rpc_client, txs).await; + let mut non_system_txs = extract_one_no_system_tx(&rpc_client, txs).await; num_checkpoint_trials_left -= 1; while non_system_txs.is_none() && num_checkpoint_trials_left > 0 { num_checkpoint_trials_left -= 1; @@ -71,7 +71,7 @@ async fn verify_latest_tx_replay_impl() { .await .unwrap() .transactions; - non_system_txs = extract_one_system_tx(&rpc_client, txs).await; + non_system_txs = extract_one_no_system_tx(&rpc_client, txs).await; } if non_system_txs.is_none() { @@ -101,7 +101,7 @@ async fn verify_latest_tx_replay_impl() { } } -async fn extract_one_system_tx( +async fn extract_one_no_system_tx( rpc_client: &IotaClient, mut txs: Vec<TransactionDigest>, ) -> Option<TransactionDigest> { From a1a17c4c7a4169cb7f467c21b2655674e134576b Mon Sep 17 00:00:00 2001 From: Alexander Sporn <github@alexsporn.de> Date: Wed, 11 Dec 2024 10:13:17 +0100 Subject: [PATCH 24/97] fix(docs): updated port list with 8081 tcp (#4435) --- nre/validator_tasks.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nre/validator_tasks.md b/nre/validator_tasks.md index 00f4e875b45..06d741d4131 100644 --- a/nre/validator_tasks.md +++ b/nre/validator_tasks.md @@ -91,7 +91,7 @@ Iota Node uses the following ports by default: | protocol/port | reachability | purpose | | ------------- | ---------------- | --------------------------------- | | TCP/8080 | inbound | protocol/transaction interface | -| UDP/8081 | inbound/outbound | primary interface | +| TCP/8081 | inbound/outbound | primary interface | | UDP/8084 | inbound/outbound | peer to peer state sync interface | | TCP/8443 | outbound | metrics pushing | | TCP/9184 | localhost | metrics scraping | From 332c546691c40a3b510c928331a2344de0708402 Mon Sep 17 00:00:00 2001 From: Thibault Martinez <thibault@iota.org> Date: Wed, 11 Dec 2024 11:34:49 +0100 Subject: [PATCH 25/97] fmt --- crates/iota-protocol-config/src/lib.rs | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/crates/iota-protocol-config/src/lib.rs b/crates/iota-protocol-config/src/lib.rs index 0f9e6224d98..4f204db2ac3 100644 --- a/crates/iota-protocol-config/src/lib.rs +++ b/crates/iota-protocol-config/src/lib.rs @@ -898,9 +898,10 @@ pub struct ProtocolConfig { /// version. random_beacon_dkg_version: Option<u64>, - /// The maximum serialized transaction size (in bytes) accepted by consensus. - /// `consensus_max_transaction_size_bytes` should include space for additional - /// metadata, on top of the `max_tx_size_bytes` value. + /// The maximum serialized transaction size (in bytes) accepted by + /// consensus. `consensus_max_transaction_size_bytes` should include + /// space for additional metadata, on top of the `max_tx_size_bytes` + /// value. consensus_max_transaction_size_bytes: Option<u64>, /// The maximum size of transactions included in a consensus block. consensus_max_transactions_in_block_bytes: Option<u64>, From b7e7a60b96f9cdc026b8a8e14a36e0d0acf62711 Mon Sep 17 00:00:00 2001 From: oliviasaa <oliviasaa@hotmail.com> Date: Wed, 11 Dec 2024 13:40:00 +0000 Subject: [PATCH 26/97] protocol upgrade (v2): Burn slashed rewards (phase RD 1) + changes to system epoch info event (#3739) * initial changes * add tests * remove unused function * add snapshot related files * fix(node): regenerate baselines for tests * fix(node): simplify `compute_adjusted_reward_distribution` * fix(node): update framework manifest * fix(node): add some checks and comments to the rewards tests * Update crates/iota-framework/packages/iota-system/sources/validator_set.move correction in a comment * fix(node): regenerate baselines for tests * add comments to reward distribution tests * show correct burnt amount in SystemEpochInfoEventV1 * remove parentheses * Add checks that slashed rewards are burned to tests * get burned and minted amounts directly from match function logic * fix mixed up burned and minted amounts. * update protocol config for v2 * generate v2 framework snapshot * fix(iota-protocol-config): fixed resolving protocol version for simulation tests * update swarm-config snapshots * generate snapshot for e2e tests * update open-rpc * fix(iota-indexer): tests use protocol max version instead of 1 * update framework snapshot * fix(iota-swarm-config): test baseline * fix(iota-e2e-tests): update snapshot for snapshot tests * fix(iota-e2e-tests): update snapshot-tests object ids and tx digest * fix: add comment about protocol version 2 * fix: fmt * fix: update protocol config comment Co-authored-by: Thibault Martinez <thibault@iota.org> --------- Co-authored-by: muXxer <git@muxxer.de> Co-authored-by: Andrew <i.am.andrew.cullen@gmail.com> Co-authored-by: Andrew Cullen <45826600+cyberphysic4l@users.noreply.github.com> Co-authored-by: Valerii Reutov <valeriy.reutov@gmail.com> Co-authored-by: miker83z <mirko.zichichi@iota.org> Co-authored-by: Mirko Zichichi <miker83z@proton.me> Co-authored-by: Levente Pap <levente.pap@iota.org> Co-authored-by: Thibault Martinez <thibault@iota.org> --- crates/iota-e2e-tests/tests/snapshot_tests.rs | 12 +- .../snapshots/snapshot_tests__body_fn.snap | 925 +++++++++--------- ...000000000000000000000000000000000000000001 | Bin 0 -> 11210 bytes ...000000000000000000000000000000000000000002 | Bin 0 -> 70162 bytes ...000000000000000000000000000000000000000003 | Bin 0 -> 42312 bytes ...00000000000000000000000000000000000000000b | Bin 0 -> 19869 bytes ...00000000000000000000000000000000000000107a | Bin 0 -> 8844 bytes crates/iota-framework-snapshot/manifest.json | 10 + .../sources/iota_system_state_inner.move | 35 +- .../iota-system/sources/validator_set.move | 107 +- .../tests/rewards_distribution_tests.move | 448 +++++++-- .../packages_compiled/iota-system | Bin 42427 -> 42215 bytes crates/iota-framework/published_api.txt | 5 +- .../tests/rpc-tests/governance_api.rs | 3 +- .../iota-indexer/tests/rpc-tests/read_api.rs | 12 +- crates/iota-open-rpc/spec/openrpc.json | 2 +- crates/iota-protocol-config/src/lib.rs | 20 +- ...tocol_config__test__Mainnet_version_2.snap | 270 +++++ ...tocol_config__test__Testnet_version_2.snap | 270 +++++ ...iota_protocol_config__test__version_2.snap | 278 ++++++ ...ests__genesis_config_snapshot_matches.snap | 3 +- ..._populated_genesis_snapshot_matches-2.snap | 30 +- 22 files changed, 1768 insertions(+), 662 deletions(-) create mode 100644 crates/iota-framework-snapshot/bytecode_snapshot/2/0x0000000000000000000000000000000000000000000000000000000000000001 create mode 100644 crates/iota-framework-snapshot/bytecode_snapshot/2/0x0000000000000000000000000000000000000000000000000000000000000002 create mode 100644 crates/iota-framework-snapshot/bytecode_snapshot/2/0x0000000000000000000000000000000000000000000000000000000000000003 create mode 100644 crates/iota-framework-snapshot/bytecode_snapshot/2/0x000000000000000000000000000000000000000000000000000000000000000b create mode 100644 crates/iota-framework-snapshot/bytecode_snapshot/2/0x000000000000000000000000000000000000000000000000000000000000107a create mode 100644 crates/iota-protocol-config/src/snapshots/iota_protocol_config__test__Mainnet_version_2.snap create mode 100644 crates/iota-protocol-config/src/snapshots/iota_protocol_config__test__Testnet_version_2.snap create mode 100644 crates/iota-protocol-config/src/snapshots/iota_protocol_config__test__version_2.snap diff --git a/crates/iota-e2e-tests/tests/snapshot_tests.rs b/crates/iota-e2e-tests/tests/snapshot_tests.rs index 9c482884972..65cde1c5ae8 100644 --- a/crates/iota-e2e-tests/tests/snapshot_tests.rs +++ b/crates/iota-e2e-tests/tests/snapshot_tests.rs @@ -56,19 +56,17 @@ async fn basic_read_cmd_snapshot_tests() -> Result<(), anyhow::Error> { let mut test_cluster = TestClusterBuilder::new().build().await; let context = &mut test_cluster.wallet; + // These object ids and transaction digest are picked by executing this test and + // copying over some random ids from the snapshot file let cmds = vec![ "iota client objects {ME}", // valid addr "iota client objects 0x0000000000000000000000000000000000000000000000000000000000000000", /* empty addr */ "iota client object 0x5", // valid object "iota client object 0x5 --bcs", // valid object BCS - // Simtest object IDs are not stable so these object IDs may or may not exist currently -- - // commenting them out for now. - // "iota client object 0x3b5121a0603ef7ab4cb57827fceca17db3338ef2cd76126cc1523b681df27cee", - // // valid object "iota client object - // 0x3b5121a0603ef7ab4cb57827fceca17db3338ef2cd76126cc1523b681df27cee --bcs", // valid - // object BCS + "iota client object 0x9135cb3b5aca99a1555b742bd11ddc45fba33343be182bdc161be69da2c41be1", /* valid object */ + "iota client object 0x9135cb3b5aca99a1555b742bd11ddc45fba33343be182bdc161be69da2c41be1 --bcs", /* valid object BCS */ "iota client object 0x0000000000000000000000000000000000000000000000000000000000000000", /* non-existent object */ - "iota client tx-block 5zibcom3dMckjyN16ygFwr5XNa9Exi1MmY3BQs984x1N", // valid tx digest + "iota client tx-block E5Zp4QQ84PQEceSw4JRi4VTScSAQweKSgdwp9XH4aVPd", // valid tx digest "iota client tx-block 11111111111111111111111111111111", /* non-existent tx * digest */ ]; diff --git a/crates/iota-e2e-tests/tests/snapshots/snapshot_tests__body_fn.snap b/crates/iota-e2e-tests/tests/snapshots/snapshot_tests__body_fn.snap index 90e0d1468c9..8a61ca65af0 100644 --- a/crates/iota-e2e-tests/tests/snapshots/snapshot_tests__body_fn.snap +++ b/crates/iota-e2e-tests/tests/snapshots/snapshot_tests__body_fn.snap @@ -1,21 +1,20 @@ --- source: crates/iota-e2e-tests/tests/snapshot_tests.rs expression: "run_one(cmds, context).await?" -snapshot_kind: text --- [ "iota client objects {ME}", [ { "data": { - "objectId": "0x5b0e7d31f9c3a421f94dae3511983a2be67e04a7071171da2380f82be103239f", + "objectId": "0x495af1962cebf47d1eb0cdabb02508114dc8a05c8bb4e6c18b8e81af78c8c4b5", "version": "1", - "digest": "6s1xQf5HR8HMLNaR1QxPcfV4Ys8AL94UUg7cRpD6r4WD", + "digest": "A7cf1SRMJYAqceQb78geXHujpHQuiqEggZnWu24enHu1", "type": "0x2::coin::Coin<0x2::iota::IOTA>", "owner": { "AddressOwner": "0x2868fed4dbeb23d2ace3ee3ad6e39061423c5692a2b289b39c643c0baf2d8d85" }, - "previousTransaction": "5zibcom3dMckjyN16ygFwr5XNa9Exi1MmY3BQs984x1N", + "previousTransaction": "E5Zp4QQ84PQEceSw4JRi4VTScSAQweKSgdwp9XH4aVPd", "storageRebate": "0", "content": { "dataType": "moveObject", @@ -23,7 +22,7 @@ snapshot_kind: text "fields": { "balance": "30000000000000000", "id": { - "id": "0x5b0e7d31f9c3a421f94dae3511983a2be67e04a7071171da2380f82be103239f" + "id": "0x495af1962cebf47d1eb0cdabb02508114dc8a05c8bb4e6c18b8e81af78c8c4b5" } } } @@ -31,14 +30,14 @@ snapshot_kind: text }, { "data": { - "objectId": "0x5ee269cea868091ea1c5da5f15581c2f7b1708413b3bdda3e4c9528f2b3a5bb9", + "objectId": "0x6689ff8b1b4ce68bde6f39ebd1031e0339a4036a66b7d0a85c366ac0e6817748", "version": "1", - "digest": "7mvhi6RxxMnPohJzMnCYoLHBTLUcRtwFtBXe1ZoanE6D", + "digest": "GYs13Dvcx4XAj76Q4fYfXEgFTyUvVfZYorzvFv8KBRrc", "type": "0x2::coin::Coin<0x2::iota::IOTA>", "owner": { "AddressOwner": "0x2868fed4dbeb23d2ace3ee3ad6e39061423c5692a2b289b39c643c0baf2d8d85" }, - "previousTransaction": "5zibcom3dMckjyN16ygFwr5XNa9Exi1MmY3BQs984x1N", + "previousTransaction": "E5Zp4QQ84PQEceSw4JRi4VTScSAQweKSgdwp9XH4aVPd", "storageRebate": "0", "content": { "dataType": "moveObject", @@ -46,7 +45,7 @@ snapshot_kind: text "fields": { "balance": "30000000000000000", "id": { - "id": "0x5ee269cea868091ea1c5da5f15581c2f7b1708413b3bdda3e4c9528f2b3a5bb9" + "id": "0x6689ff8b1b4ce68bde6f39ebd1031e0339a4036a66b7d0a85c366ac0e6817748" } } } @@ -54,14 +53,14 @@ snapshot_kind: text }, { "data": { - "objectId": "0x759bb64d0a576b00a8aae6d439da4a72ef7d8797282c90211bab2bc723cd48e5", + "objectId": "0x9135cb3b5aca99a1555b742bd11ddc45fba33343be182bdc161be69da2c41be1", "version": "1", - "digest": "7cuKDvum6Rx2utLqquqYZGr6K3S5xbA2fq88cqs8qjZd", + "digest": "5B8YV4P7Q93phJVPgm8MVZzsoXdSxFnKLAjAkMnLYcQb", "type": "0x2::coin::Coin<0x2::iota::IOTA>", "owner": { "AddressOwner": "0x2868fed4dbeb23d2ace3ee3ad6e39061423c5692a2b289b39c643c0baf2d8d85" }, - "previousTransaction": "5zibcom3dMckjyN16ygFwr5XNa9Exi1MmY3BQs984x1N", + "previousTransaction": "E5Zp4QQ84PQEceSw4JRi4VTScSAQweKSgdwp9XH4aVPd", "storageRebate": "0", "content": { "dataType": "moveObject", @@ -69,7 +68,7 @@ snapshot_kind: text "fields": { "balance": "30000000000000000", "id": { - "id": "0x759bb64d0a576b00a8aae6d439da4a72ef7d8797282c90211bab2bc723cd48e5" + "id": "0x9135cb3b5aca99a1555b742bd11ddc45fba33343be182bdc161be69da2c41be1" } } } @@ -77,14 +76,14 @@ snapshot_kind: text }, { "data": { - "objectId": "0xa010e1486bfd2f1d7c57a3b2c2edd369e64e8fddc1ca17667314317273cb491d", + "objectId": "0x94b18ab08b2ddd60e7db0756a605bd31589136eb861b76f49ff3b5ae688f65bc", "version": "1", - "digest": "DAFo7bkSkk2XRZv88Nb2V9jatTse1TYTqgMmVxVKGRtF", + "digest": "DXGesd5mWPPaLtwza28GDfumr9NqswcfpbcHp2LaL287", "type": "0x2::coin::Coin<0x2::iota::IOTA>", "owner": { "AddressOwner": "0x2868fed4dbeb23d2ace3ee3ad6e39061423c5692a2b289b39c643c0baf2d8d85" }, - "previousTransaction": "5zibcom3dMckjyN16ygFwr5XNa9Exi1MmY3BQs984x1N", + "previousTransaction": "E5Zp4QQ84PQEceSw4JRi4VTScSAQweKSgdwp9XH4aVPd", "storageRebate": "0", "content": { "dataType": "moveObject", @@ -92,7 +91,7 @@ snapshot_kind: text "fields": { "balance": "30000000000000000", "id": { - "id": "0xa010e1486bfd2f1d7c57a3b2c2edd369e64e8fddc1ca17667314317273cb491d" + "id": "0x94b18ab08b2ddd60e7db0756a605bd31589136eb861b76f49ff3b5ae688f65bc" } } } @@ -100,14 +99,14 @@ snapshot_kind: text }, { "data": { - "objectId": "0xb279227ad10111e5d870facc26d048a05bc440859e718cde0e3bbf257765544c", + "objectId": "0x9ee19bb4564baa0449b5160e4dccd02d5d8a54ca794aaba2130db4feb809c1f5", "version": "1", - "digest": "BZaGDacxqx5MFLFm6F3UeBVpHG5hZykqSHFoD1o5F5kq", + "digest": "zoUU8mDtdVPRCqfRKWmd5VpMNfgBHd4jVjq4gu8i9vn", "type": "0x2::coin::Coin<0x2::iota::IOTA>", "owner": { "AddressOwner": "0x2868fed4dbeb23d2ace3ee3ad6e39061423c5692a2b289b39c643c0baf2d8d85" }, - "previousTransaction": "5zibcom3dMckjyN16ygFwr5XNa9Exi1MmY3BQs984x1N", + "previousTransaction": "E5Zp4QQ84PQEceSw4JRi4VTScSAQweKSgdwp9XH4aVPd", "storageRebate": "0", "content": { "dataType": "moveObject", @@ -115,7 +114,7 @@ snapshot_kind: text "fields": { "balance": "30000000000000000", "id": { - "id": "0xb279227ad10111e5d870facc26d048a05bc440859e718cde0e3bbf257765544c" + "id": "0x9ee19bb4564baa0449b5160e4dccd02d5d8a54ca794aaba2130db4feb809c1f5" } } } @@ -130,14 +129,14 @@ snapshot_kind: text "data": { "objectId": "0x0000000000000000000000000000000000000000000000000000000000000005", "version": "1", - "digest": "73woKiMAUkS1ejdzSwyD1WLDCxsPVYURbwpMBa64Tu4h", + "digest": "8CWv4f5Nov5aRXTQa2EJk7zsNhfKVbX1fEG8VP6Wsa6d", "type": "0x3::iota_system::IotaSystemState", "owner": { "Shared": { "initial_shared_version": 1 } }, - "previousTransaction": "5zibcom3dMckjyN16ygFwr5XNa9Exi1MmY3BQs984x1N", + "previousTransaction": "E5Zp4QQ84PQEceSw4JRi4VTScSAQweKSgdwp9XH4aVPd", "storageRebate": "0", "content": { "dataType": "moveObject", @@ -158,14 +157,14 @@ snapshot_kind: text "data": { "objectId": "0x0000000000000000000000000000000000000000000000000000000000000005", "version": "1", - "digest": "73woKiMAUkS1ejdzSwyD1WLDCxsPVYURbwpMBa64Tu4h", + "digest": "8CWv4f5Nov5aRXTQa2EJk7zsNhfKVbX1fEG8VP6Wsa6d", "type": "0x3::iota_system::IotaSystemState", "owner": { "Shared": { "initial_shared_version": 1 } }, - "previousTransaction": "5zibcom3dMckjyN16ygFwr5XNa9Exi1MmY3BQs984x1N", + "previousTransaction": "E5Zp4QQ84PQEceSw4JRi4VTScSAQweKSgdwp9XH4aVPd", "storageRebate": "0", "bcs": { "dataType": "moveObject", @@ -176,6 +175,54 @@ snapshot_kind: text } } ], + "iota client object 0x9135cb3b5aca99a1555b742bd11ddc45fba33343be182bdc161be69da2c41be1", + [ + { + "data": { + "objectId": "0x9135cb3b5aca99a1555b742bd11ddc45fba33343be182bdc161be69da2c41be1", + "version": "1", + "digest": "5B8YV4P7Q93phJVPgm8MVZzsoXdSxFnKLAjAkMnLYcQb", + "type": "0x2::coin::Coin<0x2::iota::IOTA>", + "owner": { + "AddressOwner": "0x2868fed4dbeb23d2ace3ee3ad6e39061423c5692a2b289b39c643c0baf2d8d85" + }, + "previousTransaction": "E5Zp4QQ84PQEceSw4JRi4VTScSAQweKSgdwp9XH4aVPd", + "storageRebate": "0", + "content": { + "dataType": "moveObject", + "type": "0x2::coin::Coin<0x2::iota::IOTA>", + "fields": { + "balance": "30000000000000000", + "id": { + "id": "0x9135cb3b5aca99a1555b742bd11ddc45fba33343be182bdc161be69da2c41be1" + } + } + } + } + } + ], + "iota client object 0x9135cb3b5aca99a1555b742bd11ddc45fba33343be182bdc161be69da2c41be1 --bcs", + [ + { + "data": { + "objectId": "0x9135cb3b5aca99a1555b742bd11ddc45fba33343be182bdc161be69da2c41be1", + "version": "1", + "digest": "5B8YV4P7Q93phJVPgm8MVZzsoXdSxFnKLAjAkMnLYcQb", + "type": "0x2::coin::Coin<0x2::iota::IOTA>", + "owner": { + "AddressOwner": "0x2868fed4dbeb23d2ace3ee3ad6e39061423c5692a2b289b39c643c0baf2d8d85" + }, + "previousTransaction": "E5Zp4QQ84PQEceSw4JRi4VTScSAQweKSgdwp9XH4aVPd", + "storageRebate": "0", + "bcs": { + "dataType": "moveObject", + "type": "0x2::coin::Coin<0x2::iota::IOTA>", + "version": 1, + "bcsBytes": "kTXLO1rKmaFVW3Qr0R3cRfujM0O+GCvcFhvmnaLEG+EAAENP15RqAA==" + } + } + } + ], "iota client object 0x0000000000000000000000000000000000000000000000000000000000000000", [ { @@ -185,9 +232,9 @@ snapshot_kind: text } } ], - "iota client tx-block 5zibcom3dMckjyN16ygFwr5XNa9Exi1MmY3BQs984x1N", + "iota client tx-block E5Zp4QQ84PQEceSw4JRi4VTScSAQweKSgdwp9XH4aVPd", { - "digest": "5zibcom3dMckjyN16ygFwr5XNa9Exi1MmY3BQs984x1N", + "digest": "E5Zp4QQ84PQEceSw4JRi4VTScSAQweKSgdwp9XH4aVPd", "transaction": { "data": { "messageVersion": "v1", @@ -203,64 +250,64 @@ snapshot_kind: text "0x000000000000000000000000000000000000000000000000000000000000000b", "0x0000000000000000000000000000000000000000000000000000000000000403", "0x000000000000000000000000000000000000000000000000000000000000107a", - "0x018673f8b9c2eee4dd923fb6fcb3eb77d0e33d15921ac59f1c57ea7dfe4c3f40", - "0x08e1bd72a9f239c8e99a3ee8f1f4141b48ba063ecc0ebff878152e2b481b94bc", - "0x163b3f079eb959dc96768c65497ef5c3b48106439a306324c484a8d28e0ba50f", - "0x16d23fb8f64faebeea28ecdd43d96cb60ed1c5a297347d61a0c3fa4fff08944e", - "0x1a1f82376293f736136384ae03744241eb257a82f25eb223c7ef02e67442d6df", - "0x1d8f7a031fcca49d212b5bf2b57704913f7c6ca423357a01dda70a150e8a35b0", - "0x1f3119f496e7c38af65bc0f29ee79354de5f554d03d0aa433bee015e280e97b4", - "0x2438ca49fb81fc37f74d890207c3a922b27de14b474525b4fa111de094e5194c", - "0x303fac6452e9b844d960dcd60c84efbbd28b017774787c58705b67af946d7076", - "0x3238c6a409ed6951125aaea3334cf632e053e0d09507e8a53d4b4b5923b896d0", - "0x3873a7b96acdc98bfa6db49a096f8e704caa6dc7cca29aecff52abe11442dc3f", - "0x3e5b52bc91e54ac367f5987785c7b0a68869a4be2eb0a74f7bee2172e0a70dbc", - "0x3fb0323b083da0415032b289cb6e610388de91f9666a67c02df8ddd9edb00f4c", - "0x4451b2f6d468c331dafa10f4b3fbf057b89f684553bf9298d0c4f8e61df2fa95", - "0x4547fa20f95dcc6e221d18eaf933f993ee8f46f98eef1705853a71f9c917c185", - "0x49315560aecdcf0beba3cfccb2d04f29f5d95b440cb0b6dadec64349b81083d6", - "0x497d698dce0d808d05cb3543b2decd461eb67a0a832acf7e3d822ff61663acb4", - "0x4a4a868c023e670163f57e2467cccdaedef147daf5170fc9b0ce7caa48284a76", - "0x4df66b7aab12f518bfba67b0081cadb8a321870b171a98d2aceafb6804e3b003", - "0x50948c5a6a706b267a6b2c2a4a2043d28ba11c5e022198f58be4182d65987a2d", - "0x58efd4d54b74b390e2d3bbe785ec5df555c366b1a6eb616fb07c44d6c3f67c8c", - "0x5b0e7d31f9c3a421f94dae3511983a2be67e04a7071171da2380f82be103239f", - "0x5c995a223cf5e88e2d19935481d2d06b2e55977cb3615ad6784cc360a42d6501", - "0x5ee269cea868091ea1c5da5f15581c2f7b1708413b3bdda3e4c9528f2b3a5bb9", - "0x61f2f500cb861d8d92affc84519c4c0a6b794058b58607768c8e38ab275de0eb", + "0x00d74df673e00106b1a45136cf8cfae1ca792c3de53232e06d09fbf5d4f60b66", + "0x0214b29e560e3fa6b37836ed7167db0da40a1823cf8b01f0690e1b3bfb4ebdc5", + "0x04942308c8384041a5af2c13c807418d069d3a6e53519dadd1236f0344385a14", + "0x137cb52b1bbef8e93857fd3dc67f7f70f2aabc1d7d6eb4afb28e7dea87b9ccf1", + "0x2a74fa6e7b6f90225cb36fcdc3e416d1d3d9e209ab14aafff3afd2c3587c9aec", + "0x2ad996aa647ab628cf294b4d98b24c9debb351e72b4a72ee3425b7d9a41d08a8", + "0x30f537424026a4259959d4c28f4b474558ba881bb517267f9dac6e7bc7518a5d", + "0x3ad5e2039f28a1d146d5f7e2094b7e55f1cc35f34a53aa207250d51e76febbb4", + "0x3e14d7d3f210d79f29a18955f4e98676ebb40e51119ddd6d26a8add99daceb95", + "0x3e5742903bb62d61adea88aa26bad2fad57984e3eefc58a2f1810b82228e5117", + "0x42cfd74b065c48da45fe6048796ce9cdd3a380c182e7d89573fabc229e3ce4ab", + "0x4728ee263c6a7de9fcd0d4d58db500e0ceed99977f44ca323e9a521970efd085", + "0x495af1962cebf47d1eb0cdabb02508114dc8a05c8bb4e6c18b8e81af78c8c4b5", + "0x608863c1d4738cb9829f9bd7c5b3ab15123b6e6eab762dedcfacc23ec23d37c9", + "0x660e677bad9d848d1f131d14faef42025eedf0f0e14ede894760e0ebb51a80da", + "0x6689ff8b1b4ce68bde6f39ebd1031e0339a4036a66b7d0a85c366ac0e6817748", + "0x69cd03a3cc6b2e4a1eae6bef4892f642d8f87ed3d83b758cc5242034bd36f565", "0x6af2a2b7ca60bf76174adfd3e9c4957f8e937759603182f9b46c7f6c5f19c6d2", - "0x6b517df3c5888ce924d7871e550989f835335c726a43a224ce3df6b6dfa53666", - "0x759bb64d0a576b00a8aae6d439da4a72ef7d8797282c90211bab2bc723cd48e5", - "0x76472cb3b720491fb9a66db21befaed5fbc8528976bc6fb2bc3c5deeef9d114c", - "0x7c9f819b470ae3ac98b6e44eeea9b461d66a38b22a3d2f61ce62c69f68d0c71a", - "0x81c7cfd9c7fa81f57a59f14739ee82157fc6a04d48a1b0a6e1187a8898042299", - "0x85a7aabfb1d8ef14efd87338a58efcdbfaf0cab5e5fc247ccd1080dcdd3d2d7f", - "0x8cd9aca3790437fc6b1b7258c5fefb2e95ffb54134aae1fd04ba757d4286055d", - "0x8fd46357d5ae46f9ee8de7d9b6dfc9da4e497c70dbd2ce5c2fc124658798d5c9", - "0xa010e1486bfd2f1d7c57a3b2c2edd369e64e8fddc1ca17667314317273cb491d", - "0xa6e659b1120b373f598d1f6c3214d73abda596eb913857e1fa471ab4420f2e27", - "0xb271c22281276193f817eeab5291b79f5f37698a21323fbafe014e1774c3d22e", - "0xb279227ad10111e5d870facc26d048a05bc440859e718cde0e3bbf257765544c", - "0xbb43894417b1b4a4cee286133d85cae9706c217d150daf4d12168bc5e9147d78", - "0xc066a3793934a82847a3cee2a0dd84832ba1ba24b71ac0602b1a60cbbe553d17", - "0xc79de55a6454ac8e927645a08e4e9b3ce8e814ce9fc25eb7a347a91fc2228f4f", - "0xc7ee80d93a34f12ff58b0ceaf16c4e06ee6ceeb547b031b0d3eab1a8a6ca873f", - "0xd1e455eb2c367047a03756eb830bf0d2357b0c69905f0d4f3a648cc81498905e", - "0xd26171201bf3e074f1d1c694ea6ebc5d95d75b75583c393055efbca3eeb9c629", - "0xd6090aa14b28b0e907434cd8f8469b24769a80ebd722f18df48fe59e5fd47c0f", - "0xe47935c2607151b36e2e7d6971418157d7a8997ab2771ae779f5b6a2230334c9", - "0xe54599f1bb4b687498caf1e5212c6eaf0b088dcc8159d283ecf2c6287ede48dc", - "0xefd24c24d3784edec255308f6fc3619f65902ebd122f5a34b105727994326ce1", - "0xfbf79fe230691c666820739add167373a61a7faa858231f42feb961ec8fffcf5", - "0xffc04eb3011a2933dd0fbfff34cbd6759dbf999f7e2ac372e08d577c56a459cb" + "0x6b2a75a39565fe93f6f2694e79274205ec65dac6aecff0a38b3c3947e2c9e561", + "0x82054bc6567488b4924203907f0bc62f3f789e1f5edc901798c5a58042dfa1a8", + "0x8a23c86abe72190400e37fd3affc876000ad1302712cbdaf76077f7d541b6400", + "0x9045719b475148ea5e0547b2a0dd8f8aaa19a658deac6bfca7a184d1dfa13d87", + "0x9135cb3b5aca99a1555b742bd11ddc45fba33343be182bdc161be69da2c41be1", + "0x9254a40663ad7e72d73dd1f04b1eca4e0486cc9f54cdd9a7c3d4e479a8131aa0", + "0x939337494e5c4fe00e78f120459bf108367938719f717e32c845ab83e762f22c", + "0x94b18ab08b2ddd60e7db0756a605bd31589136eb861b76f49ff3b5ae688f65bc", + "0x98c27dcdc3cb082f2ae47756648c92ee054721273663cf0ad25d7f2d4fd20128", + "0x9bafea6cfb0a89e0eee6e66ec0d598848067196ed07857012e00e609e8f3ca17", + "0x9df5ecf6c7c2ed3f31b6ff471aaea04af7d331647c34ab319c8eef45dd043620", + "0x9ee19bb4564baa0449b5160e4dccd02d5d8a54ca794aaba2130db4feb809c1f5", + "0xa01451ee51efc5ef58d07e5d373b68187ee3a042553670da8a4dc613adf3ed61", + "0xa181feb7b518f4e06794c678eace3633c6b1d7222736e9d059e75ca3023b95a0", + "0xa629b978cb416fdeac008d532329429114c70e49909d97bede0f794b376eafe8", + "0xaca6bf6562b4cbbd909e6f9310c23c9517deca84e82d22dfa781c3dd980bbc95", + "0xb12dd88f42ce5db0ba12181deae915d795de5a1e4dfe87deb44a51c8dd8ced7a", + "0xc3647488b7f826d5e2602102964e93859bab9374389c1cca8799f91c2b8b1589", + "0xcc36edb95e82c14b7175ae99e58c3a27b43fb1ba7d7f1454fbda1ce66e0e5a8f", + "0xcf326c0a4f56e81beb81e1ee93cda5bd5bc5e88fa4b730a1909679b2ffb3f0d3", + "0xd3260d5e56e16920f270b3f92a40782447e360ea000aba2af08f0d1f8ad6b5f0", + "0xd43afda73e2bb89e67d8049618176ba09456438f9fcea5f8a3e91f8a1b17ecd8", + "0xd8fa8491b91a220af49eb0b54e1d5de725ca40cad8ecca989f27a2f713402490", + "0xdde2baa8f84257d47c8051b5abd214afb850211d7ee74a99c21698e8bd66f81d", + "0xe0ebce954f5f7a4f32e3fa49fa1b76bc1e56008535860b3fe78387db50f95dbd", + "0xe360ccacf592e9a2d80c7314d882d2adb850db51fd18572a6baf11a85b233e5d", + "0xe5395355afde6c5624ce706e91738cb766a8324c86ea933f38c3f8efbba38507", + "0xe8bcfc0181e426b9dfcad3785fb4db1a0d0a2b1fa40c99a36b5fe988d2a2f561", + "0xed9ffc59b7e841e0de23ac1b72c4f04a784e2fef9c46f93eed0afdd14f8d047c", + "0xeed5eebe436d3b4dedb5d25eff6275c5212fb408ab6e2d1756fd9c56b2af892d", + "0xf69faa3aa3015380b78c11aae2ee8eed497bb5ee2555e686b53e375ab90fe8cd", + "0xfe1d0d9ef3118023510cdf338ca59ae1d3e88e1ca98a3e1904d61a8620a1ad98" ], "events": [ { - "txDigest": "5zibcom3dMckjyN16ygFwr5XNa9Exi1MmY3BQs984x1N", + "txDigest": "E5Zp4QQ84PQEceSw4JRi4VTScSAQweKSgdwp9XH4aVPd", "eventSeq": "0" }, { - "txDigest": "5zibcom3dMckjyN16ygFwr5XNa9Exi1MmY3BQs984x1N", + "txDigest": "E5Zp4QQ84PQEceSw4JRi4VTScSAQweKSgdwp9XH4aVPd", "eventSeq": "1" } ] @@ -296,14 +343,14 @@ snapshot_kind: text "storageRebate": "0", "nonRefundableStorageFee": "0" }, - "transactionDigest": "5zibcom3dMckjyN16ygFwr5XNa9Exi1MmY3BQs984x1N", + "transactionDigest": "E5Zp4QQ84PQEceSw4JRi4VTScSAQweKSgdwp9XH4aVPd", "created": [ { "owner": "Immutable", "reference": { "objectId": "0x0000000000000000000000000000000000000000000000000000000000000001", "version": 1, - "digest": "4JE3kcoZSKseaSsSdgQveyB6GHU2GF3oBpg5pJ39ZSFG" + "digest": "7XoN6TGQbADiyEaVmrD6gmXJDJkX21MxGMc4pYCo9mKN" } }, { @@ -311,7 +358,7 @@ snapshot_kind: text "reference": { "objectId": "0x0000000000000000000000000000000000000000000000000000000000000002", "version": 1, - "digest": "8zNipc5CUAJYs6ak77VrFXPxQyY5vwtkUmyZz8w2j5Fq" + "digest": "5DVdPqNcu7yg8VSoQy9GwmoUprvHyK87jxnbRoac1r1S" } }, { @@ -319,7 +366,7 @@ snapshot_kind: text "reference": { "objectId": "0x0000000000000000000000000000000000000000000000000000000000000003", "version": 1, - "digest": "GCLhS6D6SeU7JstsXGPEF2PTY9rGQXNLo3A6j162jdFi" + "digest": "B7r86UhqxCjrBYVNGnSf7QBNX7EWWm7kLHZ5ht1MLAre" } }, { @@ -331,7 +378,7 @@ snapshot_kind: text "reference": { "objectId": "0x0000000000000000000000000000000000000000000000000000000000000005", "version": 1, - "digest": "73woKiMAUkS1ejdzSwyD1WLDCxsPVYURbwpMBa64Tu4h" + "digest": "8CWv4f5Nov5aRXTQa2EJk7zsNhfKVbX1fEG8VP6Wsa6d" } }, { @@ -343,7 +390,7 @@ snapshot_kind: text "reference": { "objectId": "0x0000000000000000000000000000000000000000000000000000000000000006", "version": 1, - "digest": "2iNGKB1PQafgW1o6Y3ZSkUwhxJrNbbEK4PfrqW4zxokW" + "digest": "DjXTupBThwgJcFY9YDL2Xan9bwTTA3BYrW72Dgh1AMJA" } }, { @@ -355,7 +402,7 @@ snapshot_kind: text "reference": { "objectId": "0x0000000000000000000000000000000000000000000000000000000000000008", "version": 1, - "digest": "4ZVAMTUCrpGjd97gLUnqTSvk2gqJvr7FnGopRvQkVnzn" + "digest": "aCZvLjShGf5G1AEq3jb9c3y3jxi8NhX17kFUxKwt1q1" } }, { @@ -363,7 +410,7 @@ snapshot_kind: text "reference": { "objectId": "0x000000000000000000000000000000000000000000000000000000000000000b", "version": 1, - "digest": "81neBedYgjyePBFEUdm3PPC3K6BLGjwuyyFXxaDFKbAT" + "digest": "7rF3B3o4ZHxju9pxz2eGmYhigdg5MBx4WLkyYcBaMMs9" } }, { @@ -375,7 +422,7 @@ snapshot_kind: text "reference": { "objectId": "0x0000000000000000000000000000000000000000000000000000000000000403", "version": 1, - "digest": "E7zwAronHAhg8gRcCNJrzffEcMCqyGwTRvXzk6tZYTzG" + "digest": "57nJzNa4jJBPDpbVVKcntb8rEZLhwhAsLAH7o6r6YLAb" } }, { @@ -383,55 +430,57 @@ snapshot_kind: text "reference": { "objectId": "0x000000000000000000000000000000000000000000000000000000000000107a", "version": 1, - "digest": "BvAgaA1pE6cMYg7tNZv7sdafwnYCgxk9DPseprtGCXw5" + "digest": "5Ad5TaF7cAZwf8U3rTD19oxAEfrhptBrSg9qGfYf36nY" } }, { "owner": { - "AddressOwner": "0x0b37c2167535af8a5729c44690f7be89eb248a6eb3cda5fd37ee1029949f0c29" + "AddressOwner": "0x4b2a0b010344ffda7202ecd5f76b742b78516cfcdb208e3314d65a4157654c4b" }, "reference": { - "objectId": "0x018673f8b9c2eee4dd923fb6fcb3eb77d0e33d15921ac59f1c57ea7dfe4c3f40", + "objectId": "0x00d74df673e00106b1a45136cf8cfae1ca792c3de53232e06d09fbf5d4f60b66", "version": 1, - "digest": "AkRRb1Y6sXYHYunTUhbhqZoeTF2KdJ9E2YJh8zncRof3" + "digest": "57LAitmwQMZgioGaRVybfVmZ2Yc57HrJ2Hkm7iGmX5aD" } }, { "owner": { - "AddressOwner": "0x4b578d914e64de1ca47bead61bcfa0932646e16de6063089810cfa904eb8b06f" + "ObjectOwner": "0x1d3c44ed95179381aec577194b10aaaccddc14ceedf533b9b6b4eef5535476e0" }, "reference": { - "objectId": "0x08e1bd72a9f239c8e99a3ee8f1f4141b48ba063ecc0ebff878152e2b481b94bc", + "objectId": "0x0214b29e560e3fa6b37836ed7167db0da40a1823cf8b01f0690e1b3bfb4ebdc5", "version": 1, - "digest": "FszgvFokRH5rBBNoLrTxKWBGnCAdiRqXpWYixmwBvwpf" + "digest": "3w6HwgnTmaGDCnAciokuEpZHj2NjFWv6i9KiCHqH7Nct" } }, { "owner": { - "AddressOwner": "0xb4b32db0fb2bc9170f796efb2439aeaf46fd0dc0b79af4e12d14bb87c3e9aa65" + "AddressOwner": "0x20227cfbc6699debf187d2d7bca3d253cd50f87c165516d3dc53a246a9af7182" }, "reference": { - "objectId": "0x163b3f079eb959dc96768c65497ef5c3b48106439a306324c484a8d28e0ba50f", + "objectId": "0x04942308c8384041a5af2c13c807418d069d3a6e53519dadd1236f0344385a14", "version": 1, - "digest": "2ueUhUo7CYjPNknnKCgASKC7u1ifGVYa9N2GpqNEFzoE" + "digest": "811mkHeY9LoDN16a3CSnr22AZK8R2rJa9DbDwuvDp9kd" } }, { "owner": { - "AddressOwner": "0x2f1c55f14bcab32b91bccbf9909aa2818d644d4a1f6401c37f97383e4d8275ca" + "ObjectOwner": "0xee64ad330164aaa798846df2f2df3525410779fb120765a1c5fb1f931bed784b" }, "reference": { - "objectId": "0x16d23fb8f64faebeea28ecdd43d96cb60ed1c5a297347d61a0c3fa4fff08944e", + "objectId": "0x137cb52b1bbef8e93857fd3dc67f7f70f2aabc1d7d6eb4afb28e7dea87b9ccf1", "version": 1, - "digest": "ApwvoSkL1WC5UcJWSbzGuNJHn9F5ZPuALucnMNP63sCF" + "digest": "9fG99ZbX8SPLLkLnRcah82PyLY3BSbgbLD7HKD6XntZ4" } }, { - "owner": "Immutable", + "owner": { + "AddressOwner": "0x4b578d914e64de1ca47bead61bcfa0932646e16de6063089810cfa904eb8b06f" + }, "reference": { - "objectId": "0x1a1f82376293f736136384ae03744241eb257a82f25eb223c7ef02e67442d6df", + "objectId": "0x2a74fa6e7b6f90225cb36fcdc3e416d1d3d9e209ab14aafff3afd2c3587c9aec", "version": 1, - "digest": "CJY1zNjevKH6Kya6aWr3Ri1HQsgeZFCf9qR4HqH72Fnt" + "digest": "E37WvCF8d2asqAJH7MtR9rnyiWeHqjgsQqL4gbjAwgLk" } }, { @@ -439,349 +488,347 @@ snapshot_kind: text "AddressOwner": "0x44f42943b20151d6a0c3cb0f84006b3441bb3378c668a6df71fa36cb441538c8" }, "reference": { - "objectId": "0x1d8f7a031fcca49d212b5bf2b57704913f7c6ca423357a01dda70a150e8a35b0", + "objectId": "0x2ad996aa647ab628cf294b4d98b24c9debb351e72b4a72ee3425b7d9a41d08a8", "version": 1, - "digest": "7yn1SCAHPQVAmJANbtPKjkZyzpN675SHdNBNwdFfXGbZ" + "digest": "F5fPj6gyhcWnNMJTnxis1goTvTNUXYr69zJudZaqMt2t" } }, { - "owner": { - "AddressOwner": "0x44f42943b20151d6a0c3cb0f84006b3441bb3378c668a6df71fa36cb441538c8" - }, + "owner": "Immutable", "reference": { - "objectId": "0x1f3119f496e7c38af65bc0f29ee79354de5f554d03d0aa433bee015e280e97b4", + "objectId": "0x30f537424026a4259959d4c28f4b474558ba881bb517267f9dac6e7bc7518a5d", "version": 1, - "digest": "59iXLqERWshXAXJqsVuwRRmoxW4AXLv5jnH3cPxRwAXw" + "digest": "CF2vkHV4X8YVrhgVKRafUDX7HmSbxSkvmwFYFPkEE4PM" } }, { "owner": { - "AddressOwner": "0x4b2a0b010344ffda7202ecd5f76b742b78516cfcdb208e3314d65a4157654c4b" + "AddressOwner": "0x7a9730f69d7c9eed4058b7e3ad9019adffdf63a94ef73cd2fb0217f3b9eb6eb1" }, "reference": { - "objectId": "0x2438ca49fb81fc37f74d890207c3a922b27de14b474525b4fa111de094e5194c", + "objectId": "0x3ad5e2039f28a1d146d5f7e2094b7e55f1cc35f34a53aa207250d51e76febbb4", "version": 1, - "digest": "A5e18Gy41Bxq2McoH7FbiYJFfU1yx26XRgvDk31KbRTz" + "digest": "2B9M7nEmFp1jcPM72pd7qXNNenQZwdp5dGu4xoykGeXZ" } }, { "owner": { - "AddressOwner": "0x20227cfbc6699debf187d2d7bca3d253cd50f87c165516d3dc53a246a9af7182" + "AddressOwner": "0x7a9730f69d7c9eed4058b7e3ad9019adffdf63a94ef73cd2fb0217f3b9eb6eb1" }, "reference": { - "objectId": "0x303fac6452e9b844d960dcd60c84efbbd28b017774787c58705b67af946d7076", + "objectId": "0x3e14d7d3f210d79f29a18955f4e98676ebb40e51119ddd6d26a8add99daceb95", "version": 1, - "digest": "D582bFMq1ftKpRhrcFeRLhEJUbfrRZZLA6Ymgs87S6cC" + "digest": "A6ZSdzLj5Bvv27zaQoFm5rUkS91sK8nJKfntqKbHepUb" } }, { "owner": { - "AddressOwner": "0x0b37c2167535af8a5729c44690f7be89eb248a6eb3cda5fd37ee1029949f0c29" + "AddressOwner": "0x4b578d914e64de1ca47bead61bcfa0932646e16de6063089810cfa904eb8b06f" }, "reference": { - "objectId": "0x3238c6a409ed6951125aaea3334cf632e053e0d09507e8a53d4b4b5923b896d0", + "objectId": "0x3e5742903bb62d61adea88aa26bad2fad57984e3eefc58a2f1810b82228e5117", "version": 1, - "digest": "GZiR6Qj8jF3vb8Eq3AF3zrCrqGcHpKPFv3MYRCn4RLsT" + "digest": "3MVJSV5RKkXLxsTdHqPQERjnmAQAoxkkiRv1Q6G8zHaU" } }, { "owner": { - "ObjectOwner": "0xce3d02f2a570935f50158318f1f0f8706fb80873afce7bb914625c1082225399" + "AddressOwner": "0x4b578d914e64de1ca47bead61bcfa0932646e16de6063089810cfa904eb8b06f" }, "reference": { - "objectId": "0x3873a7b96acdc98bfa6db49a096f8e704caa6dc7cca29aecff52abe11442dc3f", + "objectId": "0x42cfd74b065c48da45fe6048796ce9cdd3a380c182e7d89573fabc229e3ce4ab", "version": 1, - "digest": "DmLPuMUMQHtu4hRNpXbcjqtRKWrJqPLUDnZw84GmgaUZ" + "digest": "5AzKkrWAReMDgNF2bbiveSDDWvJpQzSX7xHRHNJu9Phy" } }, { "owner": { - "ObjectOwner": "0xce3d02f2a570935f50158318f1f0f8706fb80873afce7bb914625c1082225399" + "AddressOwner": "0x2f1c55f14bcab32b91bccbf9909aa2818d644d4a1f6401c37f97383e4d8275ca" }, "reference": { - "objectId": "0x3e5b52bc91e54ac367f5987785c7b0a68869a4be2eb0a74f7bee2172e0a70dbc", + "objectId": "0x4728ee263c6a7de9fcd0d4d58db500e0ceed99977f44ca323e9a521970efd085", "version": 1, - "digest": "ARd1kECfyCcc3TUTnFZrdYRAGX6xn9G3ZKNtQKNDEA8R" + "digest": "781mLWh1jZYNUxtypVJ4XWvHvvga91AZyRfrtXSG53RZ" } }, { "owner": { - "AddressOwner": "0x0b37c2167535af8a5729c44690f7be89eb248a6eb3cda5fd37ee1029949f0c29" + "AddressOwner": "0x2868fed4dbeb23d2ace3ee3ad6e39061423c5692a2b289b39c643c0baf2d8d85" }, "reference": { - "objectId": "0x3fb0323b083da0415032b289cb6e610388de91f9666a67c02df8ddd9edb00f4c", + "objectId": "0x495af1962cebf47d1eb0cdabb02508114dc8a05c8bb4e6c18b8e81af78c8c4b5", "version": 1, - "digest": "EidyXR5ajBRafVgkEA1cm598AdyK66F2NBub16VyE9aB" + "digest": "A7cf1SRMJYAqceQb78geXHujpHQuiqEggZnWu24enHu1" } }, { "owner": { - "AddressOwner": "0x7a9730f69d7c9eed4058b7e3ad9019adffdf63a94ef73cd2fb0217f3b9eb6eb1" + "AddressOwner": "0x7dbda9c2efa8255eea64cf28b64294ffed6af432f53b661d24f3807895ee828d" }, "reference": { - "objectId": "0x4451b2f6d468c331dafa10f4b3fbf057b89f684553bf9298d0c4f8e61df2fa95", + "objectId": "0x608863c1d4738cb9829f9bd7c5b3ab15123b6e6eab762dedcfacc23ec23d37c9", "version": 1, - "digest": "33vUxz6x2MsvDWTQWpFpjWQbPbbZhUxPyn3uwSDfAVQx" + "digest": "6NnLvzoYdm9qBrrsgCj3x2vtrQeMceUt1QuBSvxvgXq5" } }, { "owner": { - "ObjectOwner": "0xce3d02f2a570935f50158318f1f0f8706fb80873afce7bb914625c1082225399" + "ObjectOwner": "0xaca630a6c6d4a9e7a7b033174b3952dfd7c2edeea9fa3a356e97d1a5bc31dae0" }, "reference": { - "objectId": "0x4547fa20f95dcc6e221d18eaf933f993ee8f46f98eef1705853a71f9c917c185", + "objectId": "0x660e677bad9d848d1f131d14faef42025eedf0f0e14ede894760e0ebb51a80da", "version": 1, - "digest": "J3kRd8hXaaV2mFKES9k7X2NnjxDCGcFAUoXCqsY2reZJ" + "digest": "EJiD9QzGf9afkBrdYyCfsg9f7Cx64oSLDTVMuvxc2jb2" } }, { "owner": { - "ObjectOwner": "0xbc4cf4a6e17ba874f668896d13e8dda92bab7a8870b3118d26fd67501028c2f3" + "AddressOwner": "0x2868fed4dbeb23d2ace3ee3ad6e39061423c5692a2b289b39c643c0baf2d8d85" }, "reference": { - "objectId": "0x49315560aecdcf0beba3cfccb2d04f29f5d95b440cb0b6dadec64349b81083d6", + "objectId": "0x6689ff8b1b4ce68bde6f39ebd1031e0339a4036a66b7d0a85c366ac0e6817748", "version": 1, - "digest": "BRyi5NozgWp2Aji5hM8p83M8VgyR3PYg7G27MiYR2B9z" + "digest": "GYs13Dvcx4XAj76Q4fYfXEgFTyUvVfZYorzvFv8KBRrc" } }, { "owner": { - "ObjectOwner": "0x672bba3ef273000a1627a5f128022e261e36a85db6c508b917aa3139a2e9720d" + "AddressOwner": "0x44f42943b20151d6a0c3cb0f84006b3441bb3378c668a6df71fa36cb441538c8" }, "reference": { - "objectId": "0x497d698dce0d808d05cb3543b2decd461eb67a0a832acf7e3d822ff61663acb4", + "objectId": "0x69cd03a3cc6b2e4a1eae6bef4892f642d8f87ed3d83b758cc5242034bd36f565", "version": 1, - "digest": "242fQBuczzCLdXuMZ7FZwR9m86DacJxUTC5xuUW62DSG" + "digest": "FSfz1Dtc26vvg9ASRGoVHGg1WVbVqLcBtvrcYtTt6bLe" } }, { "owner": { - "AddressOwner": "0x7a9730f69d7c9eed4058b7e3ad9019adffdf63a94ef73cd2fb0217f3b9eb6eb1" + "ObjectOwner": "0x0000000000000000000000000000000000000000000000000000000000000005" }, "reference": { - "objectId": "0x4a4a868c023e670163f57e2467cccdaedef147daf5170fc9b0ce7caa48284a76", + "objectId": "0x6af2a2b7ca60bf76174adfd3e9c4957f8e937759603182f9b46c7f6c5f19c6d2", "version": 1, - "digest": "AWztWHzVjwd5rYXr7ork1gYC54JqtGpwHNdFA9i6gA16" + "digest": "Er8zLC9VrCrgZZcnhjLkA73mZ3J63rxiboYV6EsqmhN2" } }, { "owner": { - "AddressOwner": "0x7a9730f69d7c9eed4058b7e3ad9019adffdf63a94ef73cd2fb0217f3b9eb6eb1" + "AddressOwner": "0x0b37c2167535af8a5729c44690f7be89eb248a6eb3cda5fd37ee1029949f0c29" }, "reference": { - "objectId": "0x4df66b7aab12f518bfba67b0081cadb8a321870b171a98d2aceafb6804e3b003", + "objectId": "0x6b2a75a39565fe93f6f2694e79274205ec65dac6aecff0a38b3c3947e2c9e561", "version": 1, - "digest": "EPxkpuZZYcjDJq9AzNLMPM8vsY1URjow7nmDuxQQ1QCb" + "digest": "Hy3XSG83B625ywGh161TYQ2VqBJzKxFccgp1fL3Zjbob" } }, { "owner": { - "ObjectOwner": "0xce3d02f2a570935f50158318f1f0f8706fb80873afce7bb914625c1082225399" + "AddressOwner": "0xb4b32db0fb2bc9170f796efb2439aeaf46fd0dc0b79af4e12d14bb87c3e9aa65" }, "reference": { - "objectId": "0x50948c5a6a706b267a6b2c2a4a2043d28ba11c5e022198f58be4182d65987a2d", + "objectId": "0x82054bc6567488b4924203907f0bc62f3f789e1f5edc901798c5a58042dfa1a8", "version": 1, - "digest": "9SGZtrm6U2rsCqiaFoVQEUSreYstnrCRg6f2EzwKGHq" + "digest": "DRYTDtLfuoxayHMXVqxuuWvv4DJnjgZQvoZebdCoGszX" } }, { "owner": { - "AddressOwner": "0x20227cfbc6699debf187d2d7bca3d253cd50f87c165516d3dc53a246a9af7182" + "AddressOwner": "0x2f1c55f14bcab32b91bccbf9909aa2818d644d4a1f6401c37f97383e4d8275ca" }, "reference": { - "objectId": "0x58efd4d54b74b390e2d3bbe785ec5df555c366b1a6eb616fb07c44d6c3f67c8c", + "objectId": "0x8a23c86abe72190400e37fd3affc876000ad1302712cbdaf76077f7d541b6400", "version": 1, - "digest": "FbrF4mnrw5oXKX1trYT2NoENq7CaSGVZfXj5XitjSqhH" + "digest": "2fqjooDKXPoqAFBjzh6cGr53zuTfngNLuHzJoPoR7uvk" } }, { "owner": { - "AddressOwner": "0x2868fed4dbeb23d2ace3ee3ad6e39061423c5692a2b289b39c643c0baf2d8d85" + "AddressOwner": "0xb4b32db0fb2bc9170f796efb2439aeaf46fd0dc0b79af4e12d14bb87c3e9aa65" }, "reference": { - "objectId": "0x5b0e7d31f9c3a421f94dae3511983a2be67e04a7071171da2380f82be103239f", + "objectId": "0x9045719b475148ea5e0547b2a0dd8f8aaa19a658deac6bfca7a184d1dfa13d87", "version": 1, - "digest": "6s1xQf5HR8HMLNaR1QxPcfV4Ys8AL94UUg7cRpD6r4WD" + "digest": "9puPcXBGsDq9hTfkFMUHpmruAkuqsqQmBt6b2ChxRU2f" } }, { "owner": { - "ObjectOwner": "0x1dd0079cb68a9c0dc5cbbb0c9c5d831bb56ed88c4a12c647f1352832092d11dc" + "AddressOwner": "0x2868fed4dbeb23d2ace3ee3ad6e39061423c5692a2b289b39c643c0baf2d8d85" }, "reference": { - "objectId": "0x5c995a223cf5e88e2d19935481d2d06b2e55977cb3615ad6784cc360a42d6501", + "objectId": "0x9135cb3b5aca99a1555b742bd11ddc45fba33343be182bdc161be69da2c41be1", "version": 1, - "digest": "2ih9uvSzKBSv9YhrNZdMokhPcZgZ8gTt48TyUToB6JgX" + "digest": "5B8YV4P7Q93phJVPgm8MVZzsoXdSxFnKLAjAkMnLYcQb" } }, { "owner": { - "AddressOwner": "0x2868fed4dbeb23d2ace3ee3ad6e39061423c5692a2b289b39c643c0baf2d8d85" + "ObjectOwner": "0xaca630a6c6d4a9e7a7b033174b3952dfd7c2edeea9fa3a356e97d1a5bc31dae0" }, "reference": { - "objectId": "0x5ee269cea868091ea1c5da5f15581c2f7b1708413b3bdda3e4c9528f2b3a5bb9", + "objectId": "0x9254a40663ad7e72d73dd1f04b1eca4e0486cc9f54cdd9a7c3d4e479a8131aa0", "version": 1, - "digest": "7mvhi6RxxMnPohJzMnCYoLHBTLUcRtwFtBXe1ZoanE6D" + "digest": "Du8gWCJQvqcsNBEpSYTDSB2aaRyVEG8h7niCPhKQtZFf" } }, { "owner": { - "AddressOwner": "0x7dbda9c2efa8255eea64cf28b64294ffed6af432f53b661d24f3807895ee828d" + "AddressOwner": "0x44f42943b20151d6a0c3cb0f84006b3441bb3378c668a6df71fa36cb441538c8" }, "reference": { - "objectId": "0x61f2f500cb861d8d92affc84519c4c0a6b794058b58607768c8e38ab275de0eb", + "objectId": "0x939337494e5c4fe00e78f120459bf108367938719f717e32c845ab83e762f22c", "version": 1, - "digest": "AvgJes9PZYnWwM9KZmEiBZamurEgezPZUBB2gVJzvEgb" + "digest": "5RBuu4Mz4xV3bQAdU8DQnXLppZtpjGToNcoVujUfpxwG" } }, { "owner": { - "ObjectOwner": "0x0000000000000000000000000000000000000000000000000000000000000005" + "AddressOwner": "0x2868fed4dbeb23d2ace3ee3ad6e39061423c5692a2b289b39c643c0baf2d8d85" }, "reference": { - "objectId": "0x6af2a2b7ca60bf76174adfd3e9c4957f8e937759603182f9b46c7f6c5f19c6d2", + "objectId": "0x94b18ab08b2ddd60e7db0756a605bd31589136eb861b76f49ff3b5ae688f65bc", "version": 1, - "digest": "36ayTWhEK1Ez85fRT6j93sMbQtxo3V55FDsJSnWXTFe5" + "digest": "DXGesd5mWPPaLtwza28GDfumr9NqswcfpbcHp2LaL287" } }, { "owner": { - "AddressOwner": "0x4b578d914e64de1ca47bead61bcfa0932646e16de6063089810cfa904eb8b06f" + "ObjectOwner": "0xaca630a6c6d4a9e7a7b033174b3952dfd7c2edeea9fa3a356e97d1a5bc31dae0" }, "reference": { - "objectId": "0x6b517df3c5888ce924d7871e550989f835335c726a43a224ce3df6b6dfa53666", + "objectId": "0x98c27dcdc3cb082f2ae47756648c92ee054721273663cf0ad25d7f2d4fd20128", "version": 1, - "digest": "ARFnQexwF3Q6CDzCgnQfH1v8gY9YAfpXLq4K89FU9koJ" + "digest": "h6NdgxuL5GUffJJjUicoXB1yDDv3qytM1PJFXQQvxdi" } }, { "owner": { - "AddressOwner": "0x2868fed4dbeb23d2ace3ee3ad6e39061423c5692a2b289b39c643c0baf2d8d85" + "AddressOwner": "0x2f1c55f14bcab32b91bccbf9909aa2818d644d4a1f6401c37f97383e4d8275ca" }, "reference": { - "objectId": "0x759bb64d0a576b00a8aae6d439da4a72ef7d8797282c90211bab2bc723cd48e5", + "objectId": "0x9bafea6cfb0a89e0eee6e66ec0d598848067196ed07857012e00e609e8f3ca17", "version": 1, - "digest": "7cuKDvum6Rx2utLqquqYZGr6K3S5xbA2fq88cqs8qjZd" + "digest": "3yh2VHtBQACirSUeoFC6YGUimULgQEAeXVHQYzC8423e" } }, { "owner": { - "AddressOwner": "0x2f1c55f14bcab32b91bccbf9909aa2818d644d4a1f6401c37f97383e4d8275ca" + "ObjectOwner": "0x7a85e205f86b500a8597a0e3258cfd36cb5e39c04580f5598e501dc31aa55979" }, "reference": { - "objectId": "0x76472cb3b720491fb9a66db21befaed5fbc8528976bc6fb2bc3c5deeef9d114c", + "objectId": "0x9df5ecf6c7c2ed3f31b6ff471aaea04af7d331647c34ab319c8eef45dd043620", "version": 1, - "digest": "zQeqLseHTy2tGhRk4gwvQGoCtUkRd4LqGjKuuvW2Xh1" + "digest": "Fnr1EGFNzyCZgEjLJAYYzHfWrxdLdD1epz2ToST4bTQY" } }, { "owner": { - "AddressOwner": "0x44f42943b20151d6a0c3cb0f84006b3441bb3378c668a6df71fa36cb441538c8" + "AddressOwner": "0x2868fed4dbeb23d2ace3ee3ad6e39061423c5692a2b289b39c643c0baf2d8d85" }, "reference": { - "objectId": "0x7c9f819b470ae3ac98b6e44eeea9b461d66a38b22a3d2f61ce62c69f68d0c71a", + "objectId": "0x9ee19bb4564baa0449b5160e4dccd02d5d8a54ca794aaba2130db4feb809c1f5", "version": 1, - "digest": "EsxwZdo265ZPbYh99YeTGunSWrMj8dXyNBw2H1E9D9eL" + "digest": "zoUU8mDtdVPRCqfRKWmd5VpMNfgBHd4jVjq4gu8i9vn" } }, { "owner": { - "AddressOwner": "0x20227cfbc6699debf187d2d7bca3d253cd50f87c165516d3dc53a246a9af7182" + "ObjectOwner": "0xaca630a6c6d4a9e7a7b033174b3952dfd7c2edeea9fa3a356e97d1a5bc31dae0" }, "reference": { - "objectId": "0x81c7cfd9c7fa81f57a59f14739ee82157fc6a04d48a1b0a6e1187a8898042299", + "objectId": "0xa01451ee51efc5ef58d07e5d373b68187ee3a042553670da8a4dc613adf3ed61", "version": 1, - "digest": "8ESph921vnJz6UaENHxg2ytx68MtT4UoxNpPgWTT99a5" + "digest": "BUizCaTGo3YEdsuDzodmKs9njztBmrQbpNA5DXiLcXZt" } }, { "owner": { - "AddressOwner": "0x2f1c55f14bcab32b91bccbf9909aa2818d644d4a1f6401c37f97383e4d8275ca" + "ObjectOwner": "0x337b119cf80fabd2c403926df427294e0d1c5444a317a42b1c9dbdbc07375f1b" }, "reference": { - "objectId": "0x85a7aabfb1d8ef14efd87338a58efcdbfaf0cab5e5fc247ccd1080dcdd3d2d7f", + "objectId": "0xa181feb7b518f4e06794c678eace3633c6b1d7222736e9d059e75ca3023b95a0", "version": 1, - "digest": "277zG7Ypo7ruZu1WMxXDUoApdKnUYLBvrws1KkqzHuFm" + "digest": "CYWkB4L1JxphwGcDyzdFZQfNcfbhV33jWxNkRxgcquSH" } }, { "owner": { - "AddressOwner": "0xb4b32db0fb2bc9170f796efb2439aeaf46fd0dc0b79af4e12d14bb87c3e9aa65" + "AddressOwner": "0x7a9730f69d7c9eed4058b7e3ad9019adffdf63a94ef73cd2fb0217f3b9eb6eb1" }, "reference": { - "objectId": "0x8cd9aca3790437fc6b1b7258c5fefb2e95ffb54134aae1fd04ba757d4286055d", + "objectId": "0xa629b978cb416fdeac008d532329429114c70e49909d97bede0f794b376eafe8", "version": 1, - "digest": "AEXYy8VGP4NX8xpTs7LHiuZYfzTwFiRypmiQrZy9waNY" + "digest": "6Mtsb7P5EAb696MW6fHanVamZe9zSR8kbnAf7kfZd4n8" } }, { "owner": { - "AddressOwner": "0xb4b32db0fb2bc9170f796efb2439aeaf46fd0dc0b79af4e12d14bb87c3e9aa65" + "AddressOwner": "0x44f42943b20151d6a0c3cb0f84006b3441bb3378c668a6df71fa36cb441538c8" }, "reference": { - "objectId": "0x8fd46357d5ae46f9ee8de7d9b6dfc9da4e497c70dbd2ce5c2fc124658798d5c9", + "objectId": "0xaca6bf6562b4cbbd909e6f9310c23c9517deca84e82d22dfa781c3dd980bbc95", "version": 1, - "digest": "3xUtUi7VT3NzhFGUGsAJbSaimrdSTb2ujoesjNukQjS8" + "digest": "Akr7cJiBjxTYvEm5GttimcB7NVBu8qEU3JEMggT2NkVS" } }, { "owner": { - "AddressOwner": "0x2868fed4dbeb23d2ace3ee3ad6e39061423c5692a2b289b39c643c0baf2d8d85" + "AddressOwner": "0x2f1c55f14bcab32b91bccbf9909aa2818d644d4a1f6401c37f97383e4d8275ca" }, "reference": { - "objectId": "0xa010e1486bfd2f1d7c57a3b2c2edd369e64e8fddc1ca17667314317273cb491d", + "objectId": "0xb12dd88f42ce5db0ba12181deae915d795de5a1e4dfe87deb44a51c8dd8ced7a", "version": 1, - "digest": "DAFo7bkSkk2XRZv88Nb2V9jatTse1TYTqgMmVxVKGRtF" + "digest": "AqgNX8aLoZyCfmq3N3F3kaMTRWpQCQnZ8uzxJvfckbFM" } }, { "owner": { - "AddressOwner": "0x44f42943b20151d6a0c3cb0f84006b3441bb3378c668a6df71fa36cb441538c8" + "AddressOwner": "0x0b37c2167535af8a5729c44690f7be89eb248a6eb3cda5fd37ee1029949f0c29" }, "reference": { - "objectId": "0xa6e659b1120b373f598d1f6c3214d73abda596eb913857e1fa471ab4420f2e27", + "objectId": "0xc3647488b7f826d5e2602102964e93859bab9374389c1cca8799f91c2b8b1589", "version": 1, - "digest": "E3tr1QPatiEWCjxUNrbKfyRgkNq8tBeiTKFKGyA7g9vk" + "digest": "65ZbHUaDjGRnqwUVGHiSVeHV1Koxpcmk2pPKv9Uj9wYR" } }, { "owner": { - "AddressOwner": "0x2f1c55f14bcab32b91bccbf9909aa2818d644d4a1f6401c37f97383e4d8275ca" + "AddressOwner": "0x4b578d914e64de1ca47bead61bcfa0932646e16de6063089810cfa904eb8b06f" }, "reference": { - "objectId": "0xb271c22281276193f817eeab5291b79f5f37698a21323fbafe014e1774c3d22e", + "objectId": "0xcc36edb95e82c14b7175ae99e58c3a27b43fb1ba7d7f1454fbda1ce66e0e5a8f", "version": 1, - "digest": "GjnVg1dHinKTEkLLZYLedhgmLkmNddYhYM9pUZrUDrzc" + "digest": "4X4Mmi3CynwtZsuonDK26HvV4SyQ4d4SykRdn1KLu22a" } }, { "owner": { - "AddressOwner": "0x2868fed4dbeb23d2ace3ee3ad6e39061423c5692a2b289b39c643c0baf2d8d85" + "AddressOwner": "0x0b37c2167535af8a5729c44690f7be89eb248a6eb3cda5fd37ee1029949f0c29" }, "reference": { - "objectId": "0xb279227ad10111e5d870facc26d048a05bc440859e718cde0e3bbf257765544c", + "objectId": "0xcf326c0a4f56e81beb81e1ee93cda5bd5bc5e88fa4b730a1909679b2ffb3f0d3", "version": 1, - "digest": "BZaGDacxqx5MFLFm6F3UeBVpHG5hZykqSHFoD1o5F5kq" + "digest": "DcBPndnKeykAEYA7cmTz7PW7u2pg46nUB7JDEG2gEaQj" } }, { "owner": { - "AddressOwner": "0xb4b32db0fb2bc9170f796efb2439aeaf46fd0dc0b79af4e12d14bb87c3e9aa65" + "AddressOwner": "0x20227cfbc6699debf187d2d7bca3d253cd50f87c165516d3dc53a246a9af7182" }, "reference": { - "objectId": "0xbb43894417b1b4a4cee286133d85cae9706c217d150daf4d12168bc5e9147d78", + "objectId": "0xd3260d5e56e16920f270b3f92a40782447e360ea000aba2af08f0d1f8ad6b5f0", "version": 1, - "digest": "E9CuCY7GpGsGHb6cjKdSrrWc3xmRN3wjp4FqjZ22DmoT" + "digest": "2W8RQHXqNzdkhKPUCmawicG7iHgvR6BXYMCiktweVruJ" } }, { "owner": { - "ObjectOwner": "0xc2bda3bfc534a80abf077c5be16ba9a0832c206ab8e230605d6839b7d87c2038" + "AddressOwner": "0xb4b32db0fb2bc9170f796efb2439aeaf46fd0dc0b79af4e12d14bb87c3e9aa65" }, "reference": { - "objectId": "0xc066a3793934a82847a3cee2a0dd84832ba1ba24b71ac0602b1a60cbbe553d17", + "objectId": "0xd43afda73e2bb89e67d8049618176ba09456438f9fcea5f8a3e91f8a1b17ecd8", "version": 1, - "digest": "DWvQzrbs9HQQ411fc6f9QtEFerRLv956sUyRzY1M9HPJ" + "digest": "8PrSccVLMdHmUji4HbGeUvxh8WTHDnzqk75tWz67Tf8d" } }, { @@ -789,19 +836,19 @@ snapshot_kind: text "AddressOwner": "0x4b578d914e64de1ca47bead61bcfa0932646e16de6063089810cfa904eb8b06f" }, "reference": { - "objectId": "0xc79de55a6454ac8e927645a08e4e9b3ce8e814ce9fc25eb7a347a91fc2228f4f", + "objectId": "0xd8fa8491b91a220af49eb0b54e1d5de725ca40cad8ecca989f27a2f713402490", "version": 1, - "digest": "6avmJYgcDx3Ha6XXNTRCZeHACaaERgC4AkNDCE1a8TGA" + "digest": "F7NGNkMwvuPkKEuvnYgErENvp1HqQfWkMNySiKssSy6b" } }, { "owner": { - "AddressOwner": "0x4b578d914e64de1ca47bead61bcfa0932646e16de6063089810cfa904eb8b06f" + "AddressOwner": "0x20227cfbc6699debf187d2d7bca3d253cd50f87c165516d3dc53a246a9af7182" }, "reference": { - "objectId": "0xc7ee80d93a34f12ff58b0ceaf16c4e06ee6ceeb547b031b0d3eab1a8a6ca873f", + "objectId": "0xdde2baa8f84257d47c8051b5abd214afb850211d7ee74a99c21698e8bd66f81d", "version": 1, - "digest": "F3PmgDERQbRNn44B6on5QPxNVXCLUn18L33fNgv1cazu" + "digest": "3ue34riJ3GWEcmegp2kzVEpnHgWzamPaCZTx7kpjc5ZL" } }, { @@ -809,29 +856,29 @@ snapshot_kind: text "AddressOwner": "0x2f1c55f14bcab32b91bccbf9909aa2818d644d4a1f6401c37f97383e4d8275ca" }, "reference": { - "objectId": "0xd1e455eb2c367047a03756eb830bf0d2357b0c69905f0d4f3a648cc81498905e", + "objectId": "0xe0ebce954f5f7a4f32e3fa49fa1b76bc1e56008535860b3fe78387db50f95dbd", "version": 1, - "digest": "C2SeaJLLw3x6ShuvPfND8mXCAvLgNz293iTtu5L1SWCW" + "digest": "kNSMhUBQszVBjveLRYdxX9JEUiLzdV3vCzz9ikaYL1n" } }, { "owner": { - "AddressOwner": "0x7dbda9c2efa8255eea64cf28b64294ffed6af432f53b661d24f3807895ee828d" + "AddressOwner": "0x44f42943b20151d6a0c3cb0f84006b3441bb3378c668a6df71fa36cb441538c8" }, "reference": { - "objectId": "0xd26171201bf3e074f1d1c694ea6ebc5d95d75b75583c393055efbca3eeb9c629", + "objectId": "0xe360ccacf592e9a2d80c7314d882d2adb850db51fd18572a6baf11a85b233e5d", "version": 1, - "digest": "AVs21Q7q1cFThjfKGkzGSSaKsQCjWo3NtDcBDPCCKM76" + "digest": "A2VPHWvMEQHPWw1m5oX6vVZcAwsmkLyCvotCx4MrNjzG" } }, { "owner": { - "ObjectOwner": "0x8ee7b25e9189b59bcedfe3525114b47d4602ce383d1ddbbc3e49d95134fd8286" + "AddressOwner": "0xb4b32db0fb2bc9170f796efb2439aeaf46fd0dc0b79af4e12d14bb87c3e9aa65" }, "reference": { - "objectId": "0xd6090aa14b28b0e907434cd8f8469b24769a80ebd722f18df48fe59e5fd47c0f", + "objectId": "0xe5395355afde6c5624ce706e91738cb766a8324c86ea933f38c3f8efbba38507", "version": 1, - "digest": "4yuGdRvF2jHEwP7yfNE56bWPNY9v4b4wDzDngue7sHxb" + "digest": "DLCXf4UxpB6CMKQ7tSvdpMLZzAj5z2Qfuox7qHNefKqR" } }, { @@ -839,47 +886,47 @@ snapshot_kind: text "AddressOwner": "0x7dbda9c2efa8255eea64cf28b64294ffed6af432f53b661d24f3807895ee828d" }, "reference": { - "objectId": "0xe47935c2607151b36e2e7d6971418157d7a8997ab2771ae779f5b6a2230334c9", + "objectId": "0xe8bcfc0181e426b9dfcad3785fb4db1a0d0a2b1fa40c99a36b5fe988d2a2f561", "version": 1, - "digest": "GTBQbGkLPeC4hbkBB6QtzPC7P1zngzPdh2tAyPUnS8c" + "digest": "2eMPqCumhC9U4G5rJmSr1ZKxftCS264Z8csh9zBbe4aQ" } }, { "owner": { - "AddressOwner": "0x4b578d914e64de1ca47bead61bcfa0932646e16de6063089810cfa904eb8b06f" + "AddressOwner": "0x7dbda9c2efa8255eea64cf28b64294ffed6af432f53b661d24f3807895ee828d" }, "reference": { - "objectId": "0xe54599f1bb4b687498caf1e5212c6eaf0b088dcc8159d283ecf2c6287ede48dc", + "objectId": "0xed9ffc59b7e841e0de23ac1b72c4f04a784e2fef9c46f93eed0afdd14f8d047c", "version": 1, - "digest": "Cs9n9dTaq4n8KjEDib829cYFgPQRsyubTQRzX1upqE6x" + "digest": "69xyHdtHM8S6Voaqv4VHX5p7kxehGDVEAosn236u3EYH" } }, { - "owner": { - "AddressOwner": "0xb4b32db0fb2bc9170f796efb2439aeaf46fd0dc0b79af4e12d14bb87c3e9aa65" - }, + "owner": "Immutable", "reference": { - "objectId": "0xefd24c24d3784edec255308f6fc3619f65902ebd122f5a34b105727994326ce1", + "objectId": "0xeed5eebe436d3b4dedb5d25eff6275c5212fb408ab6e2d1756fd9c56b2af892d", "version": 1, - "digest": "FNNTstnHpGPZCv6PNrv7dcodbfXkA4xiz71ZUtiVKYcY" + "digest": "HyUxFE4PT5azA17c56oxTLkT81weUpxi5ZkoCxefEbyC" } }, { "owner": { - "AddressOwner": "0x44f42943b20151d6a0c3cb0f84006b3441bb3378c668a6df71fa36cb441538c8" + "ObjectOwner": "0x723bc96ed7aa917e131832dd0c60b9b54bb74f5d6c7c5edb89251db0b2881d58" }, "reference": { - "objectId": "0xfbf79fe230691c666820739add167373a61a7faa858231f42feb961ec8fffcf5", + "objectId": "0xf69faa3aa3015380b78c11aae2ee8eed497bb5ee2555e686b53e375ab90fe8cd", "version": 1, - "digest": "2FRzkPVb45cxXoE68vu5QcfM9T7WypPFu199wSHeXUWj" + "digest": "6e9719u3ETKKnmysHMKE5kJoPcV6qGc8gLkoecxbibcm" } }, { - "owner": "Immutable", + "owner": { + "AddressOwner": "0xb4b32db0fb2bc9170f796efb2439aeaf46fd0dc0b79af4e12d14bb87c3e9aa65" + }, "reference": { - "objectId": "0xffc04eb3011a2933dd0fbfff34cbd6759dbf999f7e2ac372e08d577c56a459cb", + "objectId": "0xfe1d0d9ef3118023510cdf338ca59ae1d3e88e1ca98a3e1904d61a8620a1ad98", "version": 1, - "digest": "FVzi8BDkddrv8mDQE6DG5JxD7THHn1PKLqzSj5sovdAc" + "digest": "7iwW12UgvrywkA79tKwWSZ5AviKqcgKytqz9dWwZLDoh" } } ], @@ -893,12 +940,12 @@ snapshot_kind: text "digest": "11111111111111111111111111111111" } }, - "eventsDigest": "HvJEc58b44AonQBEvAqrxrG5GmZUBc284MWDDNCirwNT" + "eventsDigest": "652jxdjvsGZDUHS3GoacF4VaCqx614uQNBBNuHSFZsWL" }, "events": [ { "id": { - "txDigest": "5zibcom3dMckjyN16ygFwr5XNa9Exi1MmY3BQs984x1N", + "txDigest": "E5Zp4QQ84PQEceSw4JRi4VTScSAQweKSgdwp9XH4aVPd", "eventSeq": "0" }, "packageId": "0x000000000000000000000000000000000000000000000000000000000000107a", @@ -906,13 +953,13 @@ snapshot_kind: text "sender": "0x0000000000000000000000000000000000000000000000000000000000000000", "type": "0x2::display::DisplayCreated<0x107a::nft::Nft>", "parsedJson": { - "id": "0xffc04eb3011a2933dd0fbfff34cbd6759dbf999f7e2ac372e08d577c56a459cb" + "id": "0xeed5eebe436d3b4dedb5d25eff6275c5212fb408ab6e2d1756fd9c56b2af892d" }, - "bcs": "JDM3MXfy5KRcXneqNjftj86a4vwAgXavnUbYjyJPxxsc" + "bcs": "H5KEdze24AHvBWWazyGUYQRmhE3zFDzH85xKo3PGYFYg" }, { "id": { - "txDigest": "5zibcom3dMckjyN16ygFwr5XNa9Exi1MmY3BQs984x1N", + "txDigest": "E5Zp4QQ84PQEceSw4JRi4VTScSAQweKSgdwp9XH4aVPd", "eventSeq": "1" }, "packageId": "0x000000000000000000000000000000000000000000000000000000000000107a", @@ -956,10 +1003,10 @@ snapshot_kind: text } ] }, - "id": "0xffc04eb3011a2933dd0fbfff34cbd6759dbf999f7e2ac372e08d577c56a459cb", + "id": "0xeed5eebe436d3b4dedb5d25eff6275c5212fb408ab6e2d1756fd9c56b2af892d", "version": 1 }, - "bcs": "32c8gaMxAbF5n7wL32Kdpi5pBQy2PGi7t3onffny9jqe2gaDRgL1VDGq8Qdf7iMRM4tBvAxYsetLqrYETRwRew9c7x9XTW9aw4K9dDM1KZfHC5jj2QMRwbEHALCq9vYszTEk8A5F3x1rR1edmQyMMY7mKPRCGoRymgHdDSN6gcN6F7HBf3ya4ybxTpZax5RE4tawq5kbjSJnGNe54KAsAtqMpnJsSJ1PP5Z91r3CkDB3gKAeDah1WxySJMBgdpoJbzcniQJBQQ4ppTBFoe1FBhES9fcsbpKhMNxqyMi19TdopYSpDJHgfhPs1urgbMuNTJR6fNjbDsfY1a1DgeW7QAxpcQENY4gY4qFsWX86W8bC8K4kJYuxEEfcGCrJ16Rj2svNVE9gEeDKeRFfCH6gc9Je35Gd4chRcCjkgDoKcqzyB2vDiUrtCCbRGBrJa77x3y4TmucBM5v7LVs8eha6hEAEYQG5CDQdxTmTR6k" + "bcs": "2tpynDmB6yz6PBwHubkQHtuoUCpW2Ko34tEUKCUYU4hDbWkG2JELHHSrtenbXE8EcA9CHviCfpsdnvYbUpg58KW4EJBsb4tzfqEgPzNRmtWxM29JmEfgYygghy3oRsnjudFohMUgoKCCZbka4UHMvpVqKvEz9CKM9KrSvZFMEz6n2vyCUnuD6WZ7nKuTWmZD9SDKC7sx7VNCcE3iPnfN7gTJELP3UT7zNxWF1HnitZPdVdvgQwFmNsxpX881CXboKPSij3yRiLZauDknV6TDvus5QxB9sP7SioVbYSWMZoTdha1FAqRHWBT9r5buiKVj7WxKZiAm3ijfsVS47GbQ1xV3GSTvngJ4yUTp5TxFcdxRU18LsuvkTdMNwo9rwzyn1aKM3rHxCJ3fQgzBPVZ1Q5ENmHHfHpCxwprrYsktWCKM5RHErbTNog6PyB9D1wchgkNqaGvhFNmRP6bittnM33wBgoJ9MhE9CcADVeU" } ], "objectChanges": [ @@ -967,7 +1014,7 @@ snapshot_kind: text "type": "published", "packageId": "0x0000000000000000000000000000000000000000000000000000000000000001", "version": "1", - "digest": "4JE3kcoZSKseaSsSdgQveyB6GHU2GF3oBpg5pJ39ZSFG", + "digest": "7XoN6TGQbADiyEaVmrD6gmXJDJkX21MxGMc4pYCo9mKN", "modules": [ "address", "ascii", @@ -993,7 +1040,7 @@ snapshot_kind: text "type": "published", "packageId": "0x0000000000000000000000000000000000000000000000000000000000000002", "version": "1", - "digest": "8zNipc5CUAJYs6ak77VrFXPxQyY5vwtkUmyZz8w2j5Fq", + "digest": "5DVdPqNcu7yg8VSoQy9GwmoUprvHyK87jxnbRoac1r1S", "modules": [ "address", "authenticator_state", @@ -1056,7 +1103,7 @@ snapshot_kind: text "type": "published", "packageId": "0x0000000000000000000000000000000000000000000000000000000000000003", "version": "1", - "digest": "GCLhS6D6SeU7JstsXGPEF2PTY9rGQXNLo3A6j162jdFi", + "digest": "B7r86UhqxCjrBYVNGnSf7QBNX7EWWm7kLHZ5ht1MLAre", "modules": [ "genesis", "iota_system", @@ -1082,7 +1129,7 @@ snapshot_kind: text "objectType": "0x3::iota_system::IotaSystemState", "objectId": "0x0000000000000000000000000000000000000000000000000000000000000005", "version": "1", - "digest": "73woKiMAUkS1ejdzSwyD1WLDCxsPVYURbwpMBa64Tu4h" + "digest": "8CWv4f5Nov5aRXTQa2EJk7zsNhfKVbX1fEG8VP6Wsa6d" }, { "type": "created", @@ -1095,7 +1142,7 @@ snapshot_kind: text "objectType": "0x2::clock::Clock", "objectId": "0x0000000000000000000000000000000000000000000000000000000000000006", "version": "1", - "digest": "2iNGKB1PQafgW1o6Y3ZSkUwhxJrNbbEK4PfrqW4zxokW" + "digest": "DjXTupBThwgJcFY9YDL2Xan9bwTTA3BYrW72Dgh1AMJA" }, { "type": "created", @@ -1108,13 +1155,13 @@ snapshot_kind: text "objectType": "0x2::random::Random", "objectId": "0x0000000000000000000000000000000000000000000000000000000000000008", "version": "1", - "digest": "4ZVAMTUCrpGjd97gLUnqTSvk2gqJvr7FnGopRvQkVnzn" + "digest": "aCZvLjShGf5G1AEq3jb9c3y3jxi8NhX17kFUxKwt1q1" }, { "type": "published", "packageId": "0x000000000000000000000000000000000000000000000000000000000000000b", "version": "1", - "digest": "81neBedYgjyePBFEUdm3PPC3K6BLGjwuyyFXxaDFKbAT", + "digest": "7rF3B3o4ZHxju9pxz2eGmYhigdg5MBx4WLkyYcBaMMs9", "modules": [ "bridge", "chain_ids", @@ -1137,13 +1184,13 @@ snapshot_kind: text "objectType": "0x2::deny_list::DenyList", "objectId": "0x0000000000000000000000000000000000000000000000000000000000000403", "version": "1", - "digest": "E7zwAronHAhg8gRcCNJrzffEcMCqyGwTRvXzk6tZYTzG" + "digest": "57nJzNa4jJBPDpbVVKcntb8rEZLhwhAsLAH7o6r6YLAb" }, { "type": "published", "packageId": "0x000000000000000000000000000000000000000000000000000000000000107a", "version": "1", - "digest": "BvAgaA1pE6cMYg7tNZv7sdafwnYCgxk9DPseprtGCXw5", + "digest": "5Ad5TaF7cAZwf8U3rTD19oxAEfrhptBrSg9qGfYf36nY", "modules": [ "address_unlock_condition", "alias", @@ -1163,65 +1210,56 @@ snapshot_kind: text "type": "created", "sender": "0x0000000000000000000000000000000000000000000000000000000000000000", "owner": { - "AddressOwner": "0x0b37c2167535af8a5729c44690f7be89eb248a6eb3cda5fd37ee1029949f0c29" + "AddressOwner": "0x4b2a0b010344ffda7202ecd5f76b742b78516cfcdb208e3314d65a4157654c4b" }, - "objectType": "0x3::validator_cap::UnverifiedValidatorOperationCap", - "objectId": "0x018673f8b9c2eee4dd923fb6fcb3eb77d0e33d15921ac59f1c57ea7dfe4c3f40", + "objectType": "0x2::coin::Coin<0x2::iota::IOTA>", + "objectId": "0x00d74df673e00106b1a45136cf8cfae1ca792c3de53232e06d09fbf5d4f60b66", "version": "1", - "digest": "AkRRb1Y6sXYHYunTUhbhqZoeTF2KdJ9E2YJh8zncRof3" + "digest": "57LAitmwQMZgioGaRVybfVmZ2Yc57HrJ2Hkm7iGmX5aD" }, { "type": "created", "sender": "0x0000000000000000000000000000000000000000000000000000000000000000", "owner": { - "AddressOwner": "0x4b578d914e64de1ca47bead61bcfa0932646e16de6063089810cfa904eb8b06f" + "ObjectOwner": "0x1d3c44ed95179381aec577194b10aaaccddc14ceedf533b9b6b4eef5535476e0" }, - "objectType": "0x2::coin::Coin<0x2::iota::IOTA>", - "objectId": "0x08e1bd72a9f239c8e99a3ee8f1f4141b48ba063ecc0ebff878152e2b481b94bc", + "objectType": "0x2::dynamic_field::Field<u64, 0x3::staking_pool::PoolTokenExchangeRate>", + "objectId": "0x0214b29e560e3fa6b37836ed7167db0da40a1823cf8b01f0690e1b3bfb4ebdc5", "version": "1", - "digest": "FszgvFokRH5rBBNoLrTxKWBGnCAdiRqXpWYixmwBvwpf" + "digest": "3w6HwgnTmaGDCnAciokuEpZHj2NjFWv6i9KiCHqH7Nct" }, { "type": "created", "sender": "0x0000000000000000000000000000000000000000000000000000000000000000", "owner": { - "AddressOwner": "0xb4b32db0fb2bc9170f796efb2439aeaf46fd0dc0b79af4e12d14bb87c3e9aa65" + "AddressOwner": "0x20227cfbc6699debf187d2d7bca3d253cd50f87c165516d3dc53a246a9af7182" }, "objectType": "0x2::coin::Coin<0x2::iota::IOTA>", - "objectId": "0x163b3f079eb959dc96768c65497ef5c3b48106439a306324c484a8d28e0ba50f", + "objectId": "0x04942308c8384041a5af2c13c807418d069d3a6e53519dadd1236f0344385a14", "version": "1", - "digest": "2ueUhUo7CYjPNknnKCgASKC7u1ifGVYa9N2GpqNEFzoE" + "digest": "811mkHeY9LoDN16a3CSnr22AZK8R2rJa9DbDwuvDp9kd" }, { "type": "created", "sender": "0x0000000000000000000000000000000000000000000000000000000000000000", "owner": { - "AddressOwner": "0x2f1c55f14bcab32b91bccbf9909aa2818d644d4a1f6401c37f97383e4d8275ca" + "ObjectOwner": "0xee64ad330164aaa798846df2f2df3525410779fb120765a1c5fb1f931bed784b" }, - "objectType": "0x2::coin::Coin<0x2::iota::IOTA>", - "objectId": "0x16d23fb8f64faebeea28ecdd43d96cb60ed1c5a297347d61a0c3fa4fff08944e", - "version": "1", - "digest": "ApwvoSkL1WC5UcJWSbzGuNJHn9F5ZPuALucnMNP63sCF" - }, - { - "type": "created", - "sender": "0x0000000000000000000000000000000000000000000000000000000000000000", - "owner": "Immutable", - "objectType": "0x2::coin::CoinMetadata<0x2::iota::IOTA>", - "objectId": "0x1a1f82376293f736136384ae03744241eb257a82f25eb223c7ef02e67442d6df", + "objectType": "0x2::dynamic_field::Field<u64, 0x3::staking_pool::PoolTokenExchangeRate>", + "objectId": "0x137cb52b1bbef8e93857fd3dc67f7f70f2aabc1d7d6eb4afb28e7dea87b9ccf1", "version": "1", - "digest": "CJY1zNjevKH6Kya6aWr3Ri1HQsgeZFCf9qR4HqH72Fnt" + "digest": "9fG99ZbX8SPLLkLnRcah82PyLY3BSbgbLD7HKD6XntZ4" }, { "type": "created", "sender": "0x0000000000000000000000000000000000000000000000000000000000000000", "owner": { - "AddressOwner": "0x44f42943b20151d6a0c3cb0f84006b3441bb3378c668a6df71fa36cb441538c8" + "AddressOwner": "0x4b578d914e64de1ca47bead61bcfa0932646e16de6063089810cfa904eb8b06f" }, "objectType": "0x2::coin::Coin<0x2::iota::IOTA>", - "objectId": "0x1d8f7a031fcca49d212b5bf2b57704913f7c6ca423357a01dda70a150e8a35b0", + "objectId": "0x2a74fa6e7b6f90225cb36fcdc3e416d1d3d9e209ab14aafff3afd2c3587c9aec", "version": "1", - "digest": "7yn1SCAHPQVAmJANbtPKjkZyzpN675SHdNBNwdFfXGbZ" + "digest": "E37WvCF8d2asqAJH7MtR9rnyiWeHqjgsQqL4gbjAwgLk" }, { "type": "created", @@ -1230,185 +1268,183 @@ snapshot_kind: text "AddressOwner": "0x44f42943b20151d6a0c3cb0f84006b3441bb3378c668a6df71fa36cb441538c8" }, "objectType": "0x2::coin::Coin<0x2::iota::IOTA>", - "objectId": "0x1f3119f496e7c38af65bc0f29ee79354de5f554d03d0aa433bee015e280e97b4", + "objectId": "0x2ad996aa647ab628cf294b4d98b24c9debb351e72b4a72ee3425b7d9a41d08a8", "version": "1", - "digest": "59iXLqERWshXAXJqsVuwRRmoxW4AXLv5jnH3cPxRwAXw" + "digest": "F5fPj6gyhcWnNMJTnxis1goTvTNUXYr69zJudZaqMt2t" }, { "type": "created", "sender": "0x0000000000000000000000000000000000000000000000000000000000000000", - "owner": { - "AddressOwner": "0x4b2a0b010344ffda7202ecd5f76b742b78516cfcdb208e3314d65a4157654c4b" - }, - "objectType": "0x2::coin::Coin<0x2::iota::IOTA>", - "objectId": "0x2438ca49fb81fc37f74d890207c3a922b27de14b474525b4fa111de094e5194c", + "owner": "Immutable", + "objectType": "0x2::coin::CoinMetadata<0x2::iota::IOTA>", + "objectId": "0x30f537424026a4259959d4c28f4b474558ba881bb517267f9dac6e7bc7518a5d", "version": "1", - "digest": "A5e18Gy41Bxq2McoH7FbiYJFfU1yx26XRgvDk31KbRTz" + "digest": "CF2vkHV4X8YVrhgVKRafUDX7HmSbxSkvmwFYFPkEE4PM" }, { "type": "created", "sender": "0x0000000000000000000000000000000000000000000000000000000000000000", "owner": { - "AddressOwner": "0x20227cfbc6699debf187d2d7bca3d253cd50f87c165516d3dc53a246a9af7182" + "AddressOwner": "0x7a9730f69d7c9eed4058b7e3ad9019adffdf63a94ef73cd2fb0217f3b9eb6eb1" }, "objectType": "0x3::staking_pool::StakedIota", - "objectId": "0x303fac6452e9b844d960dcd60c84efbbd28b017774787c58705b67af946d7076", + "objectId": "0x3ad5e2039f28a1d146d5f7e2094b7e55f1cc35f34a53aa207250d51e76febbb4", "version": "1", - "digest": "D582bFMq1ftKpRhrcFeRLhEJUbfrRZZLA6Ymgs87S6cC" + "digest": "2B9M7nEmFp1jcPM72pd7qXNNenQZwdp5dGu4xoykGeXZ" }, { "type": "created", "sender": "0x0000000000000000000000000000000000000000000000000000000000000000", "owner": { - "AddressOwner": "0x0b37c2167535af8a5729c44690f7be89eb248a6eb3cda5fd37ee1029949f0c29" + "AddressOwner": "0x7a9730f69d7c9eed4058b7e3ad9019adffdf63a94ef73cd2fb0217f3b9eb6eb1" }, - "objectType": "0x3::staking_pool::StakedIota", - "objectId": "0x3238c6a409ed6951125aaea3334cf632e053e0d09507e8a53d4b4b5923b896d0", + "objectType": "0x2::coin::Coin<0x2::iota::IOTA>", + "objectId": "0x3e14d7d3f210d79f29a18955f4e98676ebb40e51119ddd6d26a8add99daceb95", "version": "1", - "digest": "GZiR6Qj8jF3vb8Eq3AF3zrCrqGcHpKPFv3MYRCn4RLsT" + "digest": "A6ZSdzLj5Bvv27zaQoFm5rUkS91sK8nJKfntqKbHepUb" }, { "type": "created", "sender": "0x0000000000000000000000000000000000000000000000000000000000000000", "owner": { - "ObjectOwner": "0xce3d02f2a570935f50158318f1f0f8706fb80873afce7bb914625c1082225399" + "AddressOwner": "0x4b578d914e64de1ca47bead61bcfa0932646e16de6063089810cfa904eb8b06f" }, - "objectType": "0x2::dynamic_field::Field<0x2::object::ID, address>", - "objectId": "0x3873a7b96acdc98bfa6db49a096f8e704caa6dc7cca29aecff52abe11442dc3f", + "objectType": "0x2::coin::Coin<0x2::iota::IOTA>", + "objectId": "0x3e5742903bb62d61adea88aa26bad2fad57984e3eefc58a2f1810b82228e5117", "version": "1", - "digest": "DmLPuMUMQHtu4hRNpXbcjqtRKWrJqPLUDnZw84GmgaUZ" + "digest": "3MVJSV5RKkXLxsTdHqPQERjnmAQAoxkkiRv1Q6G8zHaU" }, { "type": "created", "sender": "0x0000000000000000000000000000000000000000000000000000000000000000", "owner": { - "ObjectOwner": "0xce3d02f2a570935f50158318f1f0f8706fb80873afce7bb914625c1082225399" + "AddressOwner": "0x4b578d914e64de1ca47bead61bcfa0932646e16de6063089810cfa904eb8b06f" }, - "objectType": "0x2::dynamic_field::Field<0x2::object::ID, address>", - "objectId": "0x3e5b52bc91e54ac367f5987785c7b0a68869a4be2eb0a74f7bee2172e0a70dbc", + "objectType": "0x2::coin::Coin<0x2::iota::IOTA>", + "objectId": "0x42cfd74b065c48da45fe6048796ce9cdd3a380c182e7d89573fabc229e3ce4ab", "version": "1", - "digest": "ARd1kECfyCcc3TUTnFZrdYRAGX6xn9G3ZKNtQKNDEA8R" + "digest": "5AzKkrWAReMDgNF2bbiveSDDWvJpQzSX7xHRHNJu9Phy" }, { "type": "created", "sender": "0x0000000000000000000000000000000000000000000000000000000000000000", "owner": { - "AddressOwner": "0x0b37c2167535af8a5729c44690f7be89eb248a6eb3cda5fd37ee1029949f0c29" + "AddressOwner": "0x2f1c55f14bcab32b91bccbf9909aa2818d644d4a1f6401c37f97383e4d8275ca" }, "objectType": "0x2::coin::Coin<0x2::iota::IOTA>", - "objectId": "0x3fb0323b083da0415032b289cb6e610388de91f9666a67c02df8ddd9edb00f4c", + "objectId": "0x4728ee263c6a7de9fcd0d4d58db500e0ceed99977f44ca323e9a521970efd085", "version": "1", - "digest": "EidyXR5ajBRafVgkEA1cm598AdyK66F2NBub16VyE9aB" + "digest": "781mLWh1jZYNUxtypVJ4XWvHvvga91AZyRfrtXSG53RZ" }, { "type": "created", "sender": "0x0000000000000000000000000000000000000000000000000000000000000000", "owner": { - "AddressOwner": "0x7a9730f69d7c9eed4058b7e3ad9019adffdf63a94ef73cd2fb0217f3b9eb6eb1" + "AddressOwner": "0x2868fed4dbeb23d2ace3ee3ad6e39061423c5692a2b289b39c643c0baf2d8d85" }, - "objectType": "0x3::staking_pool::StakedIota", - "objectId": "0x4451b2f6d468c331dafa10f4b3fbf057b89f684553bf9298d0c4f8e61df2fa95", + "objectType": "0x2::coin::Coin<0x2::iota::IOTA>", + "objectId": "0x495af1962cebf47d1eb0cdabb02508114dc8a05c8bb4e6c18b8e81af78c8c4b5", "version": "1", - "digest": "33vUxz6x2MsvDWTQWpFpjWQbPbbZhUxPyn3uwSDfAVQx" + "digest": "A7cf1SRMJYAqceQb78geXHujpHQuiqEggZnWu24enHu1" }, { "type": "created", "sender": "0x0000000000000000000000000000000000000000000000000000000000000000", "owner": { - "ObjectOwner": "0xce3d02f2a570935f50158318f1f0f8706fb80873afce7bb914625c1082225399" + "AddressOwner": "0x7dbda9c2efa8255eea64cf28b64294ffed6af432f53b661d24f3807895ee828d" }, - "objectType": "0x2::dynamic_field::Field<0x2::object::ID, address>", - "objectId": "0x4547fa20f95dcc6e221d18eaf933f993ee8f46f98eef1705853a71f9c917c185", + "objectType": "0x3::staking_pool::StakedIota", + "objectId": "0x608863c1d4738cb9829f9bd7c5b3ab15123b6e6eab762dedcfacc23ec23d37c9", "version": "1", - "digest": "J3kRd8hXaaV2mFKES9k7X2NnjxDCGcFAUoXCqsY2reZJ" + "digest": "6NnLvzoYdm9qBrrsgCj3x2vtrQeMceUt1QuBSvxvgXq5" }, { "type": "created", "sender": "0x0000000000000000000000000000000000000000000000000000000000000000", "owner": { - "ObjectOwner": "0xbc4cf4a6e17ba874f668896d13e8dda92bab7a8870b3118d26fd67501028c2f3" + "ObjectOwner": "0xaca630a6c6d4a9e7a7b033174b3952dfd7c2edeea9fa3a356e97d1a5bc31dae0" }, - "objectType": "0x2::dynamic_field::Field<u64, 0x3::staking_pool::PoolTokenExchangeRate>", - "objectId": "0x49315560aecdcf0beba3cfccb2d04f29f5d95b440cb0b6dadec64349b81083d6", + "objectType": "0x2::dynamic_field::Field<0x2::object::ID, address>", + "objectId": "0x660e677bad9d848d1f131d14faef42025eedf0f0e14ede894760e0ebb51a80da", "version": "1", - "digest": "BRyi5NozgWp2Aji5hM8p83M8VgyR3PYg7G27MiYR2B9z" + "digest": "EJiD9QzGf9afkBrdYyCfsg9f7Cx64oSLDTVMuvxc2jb2" }, { "type": "created", "sender": "0x0000000000000000000000000000000000000000000000000000000000000000", "owner": { - "ObjectOwner": "0x672bba3ef273000a1627a5f128022e261e36a85db6c508b917aa3139a2e9720d" + "AddressOwner": "0x2868fed4dbeb23d2ace3ee3ad6e39061423c5692a2b289b39c643c0baf2d8d85" }, - "objectType": "0x2::dynamic_field::Field<u64, 0x3::staking_pool::PoolTokenExchangeRate>", - "objectId": "0x497d698dce0d808d05cb3543b2decd461eb67a0a832acf7e3d822ff61663acb4", + "objectType": "0x2::coin::Coin<0x2::iota::IOTA>", + "objectId": "0x6689ff8b1b4ce68bde6f39ebd1031e0339a4036a66b7d0a85c366ac0e6817748", "version": "1", - "digest": "242fQBuczzCLdXuMZ7FZwR9m86DacJxUTC5xuUW62DSG" + "digest": "GYs13Dvcx4XAj76Q4fYfXEgFTyUvVfZYorzvFv8KBRrc" }, { "type": "created", "sender": "0x0000000000000000000000000000000000000000000000000000000000000000", "owner": { - "AddressOwner": "0x7a9730f69d7c9eed4058b7e3ad9019adffdf63a94ef73cd2fb0217f3b9eb6eb1" + "AddressOwner": "0x44f42943b20151d6a0c3cb0f84006b3441bb3378c668a6df71fa36cb441538c8" }, - "objectType": "0x3::validator_cap::UnverifiedValidatorOperationCap", - "objectId": "0x4a4a868c023e670163f57e2467cccdaedef147daf5170fc9b0ce7caa48284a76", + "objectType": "0x2::coin::Coin<0x2::iota::IOTA>", + "objectId": "0x69cd03a3cc6b2e4a1eae6bef4892f642d8f87ed3d83b758cc5242034bd36f565", "version": "1", - "digest": "AWztWHzVjwd5rYXr7ork1gYC54JqtGpwHNdFA9i6gA16" + "digest": "FSfz1Dtc26vvg9ASRGoVHGg1WVbVqLcBtvrcYtTt6bLe" }, { "type": "created", "sender": "0x0000000000000000000000000000000000000000000000000000000000000000", "owner": { - "AddressOwner": "0x7a9730f69d7c9eed4058b7e3ad9019adffdf63a94ef73cd2fb0217f3b9eb6eb1" + "ObjectOwner": "0x0000000000000000000000000000000000000000000000000000000000000005" }, - "objectType": "0x2::coin::Coin<0x2::iota::IOTA>", - "objectId": "0x4df66b7aab12f518bfba67b0081cadb8a321870b171a98d2aceafb6804e3b003", + "objectType": "0x2::dynamic_field::Field<u64, 0x3::iota_system_state_inner::IotaSystemStateV1>", + "objectId": "0x6af2a2b7ca60bf76174adfd3e9c4957f8e937759603182f9b46c7f6c5f19c6d2", "version": "1", - "digest": "EPxkpuZZYcjDJq9AzNLMPM8vsY1URjow7nmDuxQQ1QCb" + "digest": "Er8zLC9VrCrgZZcnhjLkA73mZ3J63rxiboYV6EsqmhN2" }, { "type": "created", "sender": "0x0000000000000000000000000000000000000000000000000000000000000000", "owner": { - "ObjectOwner": "0xce3d02f2a570935f50158318f1f0f8706fb80873afce7bb914625c1082225399" + "AddressOwner": "0x0b37c2167535af8a5729c44690f7be89eb248a6eb3cda5fd37ee1029949f0c29" }, - "objectType": "0x2::dynamic_field::Field<0x2::object::ID, address>", - "objectId": "0x50948c5a6a706b267a6b2c2a4a2043d28ba11c5e022198f58be4182d65987a2d", + "objectType": "0x3::staking_pool::StakedIota", + "objectId": "0x6b2a75a39565fe93f6f2694e79274205ec65dac6aecff0a38b3c3947e2c9e561", "version": "1", - "digest": "9SGZtrm6U2rsCqiaFoVQEUSreYstnrCRg6f2EzwKGHq" + "digest": "Hy3XSG83B625ywGh161TYQ2VqBJzKxFccgp1fL3Zjbob" }, { "type": "created", "sender": "0x0000000000000000000000000000000000000000000000000000000000000000", "owner": { - "AddressOwner": "0x20227cfbc6699debf187d2d7bca3d253cd50f87c165516d3dc53a246a9af7182" + "AddressOwner": "0xb4b32db0fb2bc9170f796efb2439aeaf46fd0dc0b79af4e12d14bb87c3e9aa65" }, - "objectType": "0x3::validator_cap::UnverifiedValidatorOperationCap", - "objectId": "0x58efd4d54b74b390e2d3bbe785ec5df555c366b1a6eb616fb07c44d6c3f67c8c", + "objectType": "0x2::coin::Coin<0x2::iota::IOTA>", + "objectId": "0x82054bc6567488b4924203907f0bc62f3f789e1f5edc901798c5a58042dfa1a8", "version": "1", - "digest": "FbrF4mnrw5oXKX1trYT2NoENq7CaSGVZfXj5XitjSqhH" + "digest": "DRYTDtLfuoxayHMXVqxuuWvv4DJnjgZQvoZebdCoGszX" }, { "type": "created", "sender": "0x0000000000000000000000000000000000000000000000000000000000000000", "owner": { - "AddressOwner": "0x2868fed4dbeb23d2ace3ee3ad6e39061423c5692a2b289b39c643c0baf2d8d85" + "AddressOwner": "0x2f1c55f14bcab32b91bccbf9909aa2818d644d4a1f6401c37f97383e4d8275ca" }, "objectType": "0x2::coin::Coin<0x2::iota::IOTA>", - "objectId": "0x5b0e7d31f9c3a421f94dae3511983a2be67e04a7071171da2380f82be103239f", + "objectId": "0x8a23c86abe72190400e37fd3affc876000ad1302712cbdaf76077f7d541b6400", "version": "1", - "digest": "6s1xQf5HR8HMLNaR1QxPcfV4Ys8AL94UUg7cRpD6r4WD" + "digest": "2fqjooDKXPoqAFBjzh6cGr53zuTfngNLuHzJoPoR7uvk" }, { "type": "created", "sender": "0x0000000000000000000000000000000000000000000000000000000000000000", "owner": { - "ObjectOwner": "0x1dd0079cb68a9c0dc5cbbb0c9c5d831bb56ed88c4a12c647f1352832092d11dc" + "AddressOwner": "0xb4b32db0fb2bc9170f796efb2439aeaf46fd0dc0b79af4e12d14bb87c3e9aa65" }, - "objectType": "0x2::dynamic_field::Field<u64, 0x2::random::RandomInner>", - "objectId": "0x5c995a223cf5e88e2d19935481d2d06b2e55977cb3615ad6784cc360a42d6501", + "objectType": "0x2::coin::Coin<0x2::iota::IOTA>", + "objectId": "0x9045719b475148ea5e0547b2a0dd8f8aaa19a658deac6bfca7a184d1dfa13d87", "version": "1", - "digest": "2ih9uvSzKBSv9YhrNZdMokhPcZgZ8gTt48TyUToB6JgX" + "digest": "9puPcXBGsDq9hTfkFMUHpmruAkuqsqQmBt6b2ChxRU2f" }, { "type": "created", @@ -1417,53 +1453,53 @@ snapshot_kind: text "AddressOwner": "0x2868fed4dbeb23d2ace3ee3ad6e39061423c5692a2b289b39c643c0baf2d8d85" }, "objectType": "0x2::coin::Coin<0x2::iota::IOTA>", - "objectId": "0x5ee269cea868091ea1c5da5f15581c2f7b1708413b3bdda3e4c9528f2b3a5bb9", + "objectId": "0x9135cb3b5aca99a1555b742bd11ddc45fba33343be182bdc161be69da2c41be1", "version": "1", - "digest": "7mvhi6RxxMnPohJzMnCYoLHBTLUcRtwFtBXe1ZoanE6D" + "digest": "5B8YV4P7Q93phJVPgm8MVZzsoXdSxFnKLAjAkMnLYcQb" }, { "type": "created", "sender": "0x0000000000000000000000000000000000000000000000000000000000000000", "owner": { - "AddressOwner": "0x7dbda9c2efa8255eea64cf28b64294ffed6af432f53b661d24f3807895ee828d" + "ObjectOwner": "0xaca630a6c6d4a9e7a7b033174b3952dfd7c2edeea9fa3a356e97d1a5bc31dae0" }, - "objectType": "0x3::validator_cap::UnverifiedValidatorOperationCap", - "objectId": "0x61f2f500cb861d8d92affc84519c4c0a6b794058b58607768c8e38ab275de0eb", + "objectType": "0x2::dynamic_field::Field<0x2::object::ID, address>", + "objectId": "0x9254a40663ad7e72d73dd1f04b1eca4e0486cc9f54cdd9a7c3d4e479a8131aa0", "version": "1", - "digest": "AvgJes9PZYnWwM9KZmEiBZamurEgezPZUBB2gVJzvEgb" + "digest": "Du8gWCJQvqcsNBEpSYTDSB2aaRyVEG8h7niCPhKQtZFf" }, { "type": "created", "sender": "0x0000000000000000000000000000000000000000000000000000000000000000", "owner": { - "ObjectOwner": "0x0000000000000000000000000000000000000000000000000000000000000005" + "AddressOwner": "0x44f42943b20151d6a0c3cb0f84006b3441bb3378c668a6df71fa36cb441538c8" }, - "objectType": "0x2::dynamic_field::Field<u64, 0x3::iota_system_state_inner::IotaSystemStateV1>", - "objectId": "0x6af2a2b7ca60bf76174adfd3e9c4957f8e937759603182f9b46c7f6c5f19c6d2", + "objectType": "0x2::coin::Coin<0x2::iota::IOTA>", + "objectId": "0x939337494e5c4fe00e78f120459bf108367938719f717e32c845ab83e762f22c", "version": "1", - "digest": "36ayTWhEK1Ez85fRT6j93sMbQtxo3V55FDsJSnWXTFe5" + "digest": "5RBuu4Mz4xV3bQAdU8DQnXLppZtpjGToNcoVujUfpxwG" }, { "type": "created", "sender": "0x0000000000000000000000000000000000000000000000000000000000000000", "owner": { - "AddressOwner": "0x4b578d914e64de1ca47bead61bcfa0932646e16de6063089810cfa904eb8b06f" + "AddressOwner": "0x2868fed4dbeb23d2ace3ee3ad6e39061423c5692a2b289b39c643c0baf2d8d85" }, "objectType": "0x2::coin::Coin<0x2::iota::IOTA>", - "objectId": "0x6b517df3c5888ce924d7871e550989f835335c726a43a224ce3df6b6dfa53666", + "objectId": "0x94b18ab08b2ddd60e7db0756a605bd31589136eb861b76f49ff3b5ae688f65bc", "version": "1", - "digest": "ARFnQexwF3Q6CDzCgnQfH1v8gY9YAfpXLq4K89FU9koJ" + "digest": "DXGesd5mWPPaLtwza28GDfumr9NqswcfpbcHp2LaL287" }, { "type": "created", "sender": "0x0000000000000000000000000000000000000000000000000000000000000000", "owner": { - "AddressOwner": "0x2868fed4dbeb23d2ace3ee3ad6e39061423c5692a2b289b39c643c0baf2d8d85" + "ObjectOwner": "0xaca630a6c6d4a9e7a7b033174b3952dfd7c2edeea9fa3a356e97d1a5bc31dae0" }, - "objectType": "0x2::coin::Coin<0x2::iota::IOTA>", - "objectId": "0x759bb64d0a576b00a8aae6d439da4a72ef7d8797282c90211bab2bc723cd48e5", + "objectType": "0x2::dynamic_field::Field<0x2::object::ID, address>", + "objectId": "0x98c27dcdc3cb082f2ae47756648c92ee054721273663cf0ad25d7f2d4fd20128", "version": "1", - "digest": "7cuKDvum6Rx2utLqquqYZGr6K3S5xbA2fq88cqs8qjZd" + "digest": "h6NdgxuL5GUffJJjUicoXB1yDDv3qytM1PJFXQQvxdi" }, { "type": "created", @@ -1472,141 +1508,141 @@ snapshot_kind: text "AddressOwner": "0x2f1c55f14bcab32b91bccbf9909aa2818d644d4a1f6401c37f97383e4d8275ca" }, "objectType": "0x2::coin::Coin<0x2::iota::IOTA>", - "objectId": "0x76472cb3b720491fb9a66db21befaed5fbc8528976bc6fb2bc3c5deeef9d114c", + "objectId": "0x9bafea6cfb0a89e0eee6e66ec0d598848067196ed07857012e00e609e8f3ca17", "version": "1", - "digest": "zQeqLseHTy2tGhRk4gwvQGoCtUkRd4LqGjKuuvW2Xh1" + "digest": "3yh2VHtBQACirSUeoFC6YGUimULgQEAeXVHQYzC8423e" }, { "type": "created", "sender": "0x0000000000000000000000000000000000000000000000000000000000000000", "owner": { - "AddressOwner": "0x44f42943b20151d6a0c3cb0f84006b3441bb3378c668a6df71fa36cb441538c8" + "ObjectOwner": "0x7a85e205f86b500a8597a0e3258cfd36cb5e39c04580f5598e501dc31aa55979" }, - "objectType": "0x2::coin::Coin<0x2::iota::IOTA>", - "objectId": "0x7c9f819b470ae3ac98b6e44eeea9b461d66a38b22a3d2f61ce62c69f68d0c71a", + "objectType": "0x2::dynamic_field::Field<u64, 0x3::staking_pool::PoolTokenExchangeRate>", + "objectId": "0x9df5ecf6c7c2ed3f31b6ff471aaea04af7d331647c34ab319c8eef45dd043620", "version": "1", - "digest": "EsxwZdo265ZPbYh99YeTGunSWrMj8dXyNBw2H1E9D9eL" + "digest": "Fnr1EGFNzyCZgEjLJAYYzHfWrxdLdD1epz2ToST4bTQY" }, { "type": "created", "sender": "0x0000000000000000000000000000000000000000000000000000000000000000", "owner": { - "AddressOwner": "0x20227cfbc6699debf187d2d7bca3d253cd50f87c165516d3dc53a246a9af7182" + "AddressOwner": "0x2868fed4dbeb23d2ace3ee3ad6e39061423c5692a2b289b39c643c0baf2d8d85" }, "objectType": "0x2::coin::Coin<0x2::iota::IOTA>", - "objectId": "0x81c7cfd9c7fa81f57a59f14739ee82157fc6a04d48a1b0a6e1187a8898042299", + "objectId": "0x9ee19bb4564baa0449b5160e4dccd02d5d8a54ca794aaba2130db4feb809c1f5", "version": "1", - "digest": "8ESph921vnJz6UaENHxg2ytx68MtT4UoxNpPgWTT99a5" + "digest": "zoUU8mDtdVPRCqfRKWmd5VpMNfgBHd4jVjq4gu8i9vn" }, { "type": "created", "sender": "0x0000000000000000000000000000000000000000000000000000000000000000", "owner": { - "AddressOwner": "0x2f1c55f14bcab32b91bccbf9909aa2818d644d4a1f6401c37f97383e4d8275ca" + "ObjectOwner": "0xaca630a6c6d4a9e7a7b033174b3952dfd7c2edeea9fa3a356e97d1a5bc31dae0" }, - "objectType": "0x2::coin::Coin<0x2::iota::IOTA>", - "objectId": "0x85a7aabfb1d8ef14efd87338a58efcdbfaf0cab5e5fc247ccd1080dcdd3d2d7f", + "objectType": "0x2::dynamic_field::Field<0x2::object::ID, address>", + "objectId": "0xa01451ee51efc5ef58d07e5d373b68187ee3a042553670da8a4dc613adf3ed61", "version": "1", - "digest": "277zG7Ypo7ruZu1WMxXDUoApdKnUYLBvrws1KkqzHuFm" + "digest": "BUizCaTGo3YEdsuDzodmKs9njztBmrQbpNA5DXiLcXZt" }, { "type": "created", "sender": "0x0000000000000000000000000000000000000000000000000000000000000000", "owner": { - "AddressOwner": "0xb4b32db0fb2bc9170f796efb2439aeaf46fd0dc0b79af4e12d14bb87c3e9aa65" + "ObjectOwner": "0x337b119cf80fabd2c403926df427294e0d1c5444a317a42b1c9dbdbc07375f1b" }, - "objectType": "0x2::coin::Coin<0x2::iota::IOTA>", - "objectId": "0x8cd9aca3790437fc6b1b7258c5fefb2e95ffb54134aae1fd04ba757d4286055d", + "objectType": "0x2::dynamic_field::Field<u64, 0x3::staking_pool::PoolTokenExchangeRate>", + "objectId": "0xa181feb7b518f4e06794c678eace3633c6b1d7222736e9d059e75ca3023b95a0", "version": "1", - "digest": "AEXYy8VGP4NX8xpTs7LHiuZYfzTwFiRypmiQrZy9waNY" + "digest": "CYWkB4L1JxphwGcDyzdFZQfNcfbhV33jWxNkRxgcquSH" }, { "type": "created", "sender": "0x0000000000000000000000000000000000000000000000000000000000000000", "owner": { - "AddressOwner": "0xb4b32db0fb2bc9170f796efb2439aeaf46fd0dc0b79af4e12d14bb87c3e9aa65" + "AddressOwner": "0x7a9730f69d7c9eed4058b7e3ad9019adffdf63a94ef73cd2fb0217f3b9eb6eb1" }, - "objectType": "0x2::coin::Coin<0x2::iota::IOTA>", - "objectId": "0x8fd46357d5ae46f9ee8de7d9b6dfc9da4e497c70dbd2ce5c2fc124658798d5c9", + "objectType": "0x3::validator_cap::UnverifiedValidatorOperationCap", + "objectId": "0xa629b978cb416fdeac008d532329429114c70e49909d97bede0f794b376eafe8", "version": "1", - "digest": "3xUtUi7VT3NzhFGUGsAJbSaimrdSTb2ujoesjNukQjS8" + "digest": "6Mtsb7P5EAb696MW6fHanVamZe9zSR8kbnAf7kfZd4n8" }, { "type": "created", "sender": "0x0000000000000000000000000000000000000000000000000000000000000000", "owner": { - "AddressOwner": "0x2868fed4dbeb23d2ace3ee3ad6e39061423c5692a2b289b39c643c0baf2d8d85" + "AddressOwner": "0x44f42943b20151d6a0c3cb0f84006b3441bb3378c668a6df71fa36cb441538c8" }, "objectType": "0x2::coin::Coin<0x2::iota::IOTA>", - "objectId": "0xa010e1486bfd2f1d7c57a3b2c2edd369e64e8fddc1ca17667314317273cb491d", + "objectId": "0xaca6bf6562b4cbbd909e6f9310c23c9517deca84e82d22dfa781c3dd980bbc95", "version": "1", - "digest": "DAFo7bkSkk2XRZv88Nb2V9jatTse1TYTqgMmVxVKGRtF" + "digest": "Akr7cJiBjxTYvEm5GttimcB7NVBu8qEU3JEMggT2NkVS" }, { "type": "created", "sender": "0x0000000000000000000000000000000000000000000000000000000000000000", "owner": { - "AddressOwner": "0x44f42943b20151d6a0c3cb0f84006b3441bb3378c668a6df71fa36cb441538c8" + "AddressOwner": "0x2f1c55f14bcab32b91bccbf9909aa2818d644d4a1f6401c37f97383e4d8275ca" }, "objectType": "0x2::coin::Coin<0x2::iota::IOTA>", - "objectId": "0xa6e659b1120b373f598d1f6c3214d73abda596eb913857e1fa471ab4420f2e27", + "objectId": "0xb12dd88f42ce5db0ba12181deae915d795de5a1e4dfe87deb44a51c8dd8ced7a", "version": "1", - "digest": "E3tr1QPatiEWCjxUNrbKfyRgkNq8tBeiTKFKGyA7g9vk" + "digest": "AqgNX8aLoZyCfmq3N3F3kaMTRWpQCQnZ8uzxJvfckbFM" }, { "type": "created", "sender": "0x0000000000000000000000000000000000000000000000000000000000000000", "owner": { - "AddressOwner": "0x2f1c55f14bcab32b91bccbf9909aa2818d644d4a1f6401c37f97383e4d8275ca" + "AddressOwner": "0x0b37c2167535af8a5729c44690f7be89eb248a6eb3cda5fd37ee1029949f0c29" }, - "objectType": "0x2::coin::Coin<0x2::iota::IOTA>", - "objectId": "0xb271c22281276193f817eeab5291b79f5f37698a21323fbafe014e1774c3d22e", + "objectType": "0x3::validator_cap::UnverifiedValidatorOperationCap", + "objectId": "0xc3647488b7f826d5e2602102964e93859bab9374389c1cca8799f91c2b8b1589", "version": "1", - "digest": "GjnVg1dHinKTEkLLZYLedhgmLkmNddYhYM9pUZrUDrzc" + "digest": "65ZbHUaDjGRnqwUVGHiSVeHV1Koxpcmk2pPKv9Uj9wYR" }, { "type": "created", "sender": "0x0000000000000000000000000000000000000000000000000000000000000000", "owner": { - "AddressOwner": "0x2868fed4dbeb23d2ace3ee3ad6e39061423c5692a2b289b39c643c0baf2d8d85" + "AddressOwner": "0x4b578d914e64de1ca47bead61bcfa0932646e16de6063089810cfa904eb8b06f" }, "objectType": "0x2::coin::Coin<0x2::iota::IOTA>", - "objectId": "0xb279227ad10111e5d870facc26d048a05bc440859e718cde0e3bbf257765544c", + "objectId": "0xcc36edb95e82c14b7175ae99e58c3a27b43fb1ba7d7f1454fbda1ce66e0e5a8f", "version": "1", - "digest": "BZaGDacxqx5MFLFm6F3UeBVpHG5hZykqSHFoD1o5F5kq" + "digest": "4X4Mmi3CynwtZsuonDK26HvV4SyQ4d4SykRdn1KLu22a" }, { "type": "created", "sender": "0x0000000000000000000000000000000000000000000000000000000000000000", "owner": { - "AddressOwner": "0xb4b32db0fb2bc9170f796efb2439aeaf46fd0dc0b79af4e12d14bb87c3e9aa65" + "AddressOwner": "0x0b37c2167535af8a5729c44690f7be89eb248a6eb3cda5fd37ee1029949f0c29" }, "objectType": "0x2::coin::Coin<0x2::iota::IOTA>", - "objectId": "0xbb43894417b1b4a4cee286133d85cae9706c217d150daf4d12168bc5e9147d78", + "objectId": "0xcf326c0a4f56e81beb81e1ee93cda5bd5bc5e88fa4b730a1909679b2ffb3f0d3", "version": "1", - "digest": "E9CuCY7GpGsGHb6cjKdSrrWc3xmRN3wjp4FqjZ22DmoT" + "digest": "DcBPndnKeykAEYA7cmTz7PW7u2pg46nUB7JDEG2gEaQj" }, { "type": "created", "sender": "0x0000000000000000000000000000000000000000000000000000000000000000", "owner": { - "ObjectOwner": "0xc2bda3bfc534a80abf077c5be16ba9a0832c206ab8e230605d6839b7d87c2038" + "AddressOwner": "0x20227cfbc6699debf187d2d7bca3d253cd50f87c165516d3dc53a246a9af7182" }, - "objectType": "0x2::dynamic_field::Field<u64, 0x3::staking_pool::PoolTokenExchangeRate>", - "objectId": "0xc066a3793934a82847a3cee2a0dd84832ba1ba24b71ac0602b1a60cbbe553d17", + "objectType": "0x3::validator_cap::UnverifiedValidatorOperationCap", + "objectId": "0xd3260d5e56e16920f270b3f92a40782447e360ea000aba2af08f0d1f8ad6b5f0", "version": "1", - "digest": "DWvQzrbs9HQQ411fc6f9QtEFerRLv956sUyRzY1M9HPJ" + "digest": "2W8RQHXqNzdkhKPUCmawicG7iHgvR6BXYMCiktweVruJ" }, { "type": "created", "sender": "0x0000000000000000000000000000000000000000000000000000000000000000", "owner": { - "AddressOwner": "0x4b578d914e64de1ca47bead61bcfa0932646e16de6063089810cfa904eb8b06f" + "AddressOwner": "0xb4b32db0fb2bc9170f796efb2439aeaf46fd0dc0b79af4e12d14bb87c3e9aa65" }, "objectType": "0x2::coin::Coin<0x2::iota::IOTA>", - "objectId": "0xc79de55a6454ac8e927645a08e4e9b3ce8e814ce9fc25eb7a347a91fc2228f4f", + "objectId": "0xd43afda73e2bb89e67d8049618176ba09456438f9fcea5f8a3e91f8a1b17ecd8", "version": "1", - "digest": "6avmJYgcDx3Ha6XXNTRCZeHACaaERgC4AkNDCE1a8TGA" + "digest": "8PrSccVLMdHmUji4HbGeUvxh8WTHDnzqk75tWz67Tf8d" }, { "type": "created", @@ -1615,95 +1651,106 @@ snapshot_kind: text "AddressOwner": "0x4b578d914e64de1ca47bead61bcfa0932646e16de6063089810cfa904eb8b06f" }, "objectType": "0x2::coin::Coin<0x2::iota::IOTA>", - "objectId": "0xc7ee80d93a34f12ff58b0ceaf16c4e06ee6ceeb547b031b0d3eab1a8a6ca873f", + "objectId": "0xd8fa8491b91a220af49eb0b54e1d5de725ca40cad8ecca989f27a2f713402490", "version": "1", - "digest": "F3PmgDERQbRNn44B6on5QPxNVXCLUn18L33fNgv1cazu" + "digest": "F7NGNkMwvuPkKEuvnYgErENvp1HqQfWkMNySiKssSy6b" }, { "type": "created", "sender": "0x0000000000000000000000000000000000000000000000000000000000000000", "owner": { - "AddressOwner": "0x2f1c55f14bcab32b91bccbf9909aa2818d644d4a1f6401c37f97383e4d8275ca" + "AddressOwner": "0x20227cfbc6699debf187d2d7bca3d253cd50f87c165516d3dc53a246a9af7182" }, - "objectType": "0x2::coin::Coin<0x2::iota::IOTA>", - "objectId": "0xd1e455eb2c367047a03756eb830bf0d2357b0c69905f0d4f3a648cc81498905e", + "objectType": "0x3::staking_pool::StakedIota", + "objectId": "0xdde2baa8f84257d47c8051b5abd214afb850211d7ee74a99c21698e8bd66f81d", "version": "1", - "digest": "C2SeaJLLw3x6ShuvPfND8mXCAvLgNz293iTtu5L1SWCW" + "digest": "3ue34riJ3GWEcmegp2kzVEpnHgWzamPaCZTx7kpjc5ZL" }, { "type": "created", "sender": "0x0000000000000000000000000000000000000000000000000000000000000000", "owner": { - "AddressOwner": "0x7dbda9c2efa8255eea64cf28b64294ffed6af432f53b661d24f3807895ee828d" + "AddressOwner": "0x2f1c55f14bcab32b91bccbf9909aa2818d644d4a1f6401c37f97383e4d8275ca" }, - "objectType": "0x3::staking_pool::StakedIota", - "objectId": "0xd26171201bf3e074f1d1c694ea6ebc5d95d75b75583c393055efbca3eeb9c629", + "objectType": "0x2::coin::Coin<0x2::iota::IOTA>", + "objectId": "0xe0ebce954f5f7a4f32e3fa49fa1b76bc1e56008535860b3fe78387db50f95dbd", "version": "1", - "digest": "AVs21Q7q1cFThjfKGkzGSSaKsQCjWo3NtDcBDPCCKM76" + "digest": "kNSMhUBQszVBjveLRYdxX9JEUiLzdV3vCzz9ikaYL1n" }, { "type": "created", "sender": "0x0000000000000000000000000000000000000000000000000000000000000000", "owner": { - "ObjectOwner": "0x8ee7b25e9189b59bcedfe3525114b47d4602ce383d1ddbbc3e49d95134fd8286" + "AddressOwner": "0x44f42943b20151d6a0c3cb0f84006b3441bb3378c668a6df71fa36cb441538c8" }, - "objectType": "0x2::dynamic_field::Field<u64, 0x3::staking_pool::PoolTokenExchangeRate>", - "objectId": "0xd6090aa14b28b0e907434cd8f8469b24769a80ebd722f18df48fe59e5fd47c0f", + "objectType": "0x2::coin::Coin<0x2::iota::IOTA>", + "objectId": "0xe360ccacf592e9a2d80c7314d882d2adb850db51fd18572a6baf11a85b233e5d", "version": "1", - "digest": "4yuGdRvF2jHEwP7yfNE56bWPNY9v4b4wDzDngue7sHxb" + "digest": "A2VPHWvMEQHPWw1m5oX6vVZcAwsmkLyCvotCx4MrNjzG" }, { "type": "created", "sender": "0x0000000000000000000000000000000000000000000000000000000000000000", "owner": { - "AddressOwner": "0x7dbda9c2efa8255eea64cf28b64294ffed6af432f53b661d24f3807895ee828d" + "AddressOwner": "0xb4b32db0fb2bc9170f796efb2439aeaf46fd0dc0b79af4e12d14bb87c3e9aa65" }, "objectType": "0x2::coin::Coin<0x2::iota::IOTA>", - "objectId": "0xe47935c2607151b36e2e7d6971418157d7a8997ab2771ae779f5b6a2230334c9", + "objectId": "0xe5395355afde6c5624ce706e91738cb766a8324c86ea933f38c3f8efbba38507", "version": "1", - "digest": "GTBQbGkLPeC4hbkBB6QtzPC7P1zngzPdh2tAyPUnS8c" + "digest": "DLCXf4UxpB6CMKQ7tSvdpMLZzAj5z2Qfuox7qHNefKqR" }, { "type": "created", "sender": "0x0000000000000000000000000000000000000000000000000000000000000000", "owner": { - "AddressOwner": "0x4b578d914e64de1ca47bead61bcfa0932646e16de6063089810cfa904eb8b06f" + "AddressOwner": "0x7dbda9c2efa8255eea64cf28b64294ffed6af432f53b661d24f3807895ee828d" }, "objectType": "0x2::coin::Coin<0x2::iota::IOTA>", - "objectId": "0xe54599f1bb4b687498caf1e5212c6eaf0b088dcc8159d283ecf2c6287ede48dc", + "objectId": "0xe8bcfc0181e426b9dfcad3785fb4db1a0d0a2b1fa40c99a36b5fe988d2a2f561", "version": "1", - "digest": "Cs9n9dTaq4n8KjEDib829cYFgPQRsyubTQRzX1upqE6x" + "digest": "2eMPqCumhC9U4G5rJmSr1ZKxftCS264Z8csh9zBbe4aQ" }, { "type": "created", "sender": "0x0000000000000000000000000000000000000000000000000000000000000000", "owner": { - "AddressOwner": "0xb4b32db0fb2bc9170f796efb2439aeaf46fd0dc0b79af4e12d14bb87c3e9aa65" + "AddressOwner": "0x7dbda9c2efa8255eea64cf28b64294ffed6af432f53b661d24f3807895ee828d" }, - "objectType": "0x2::coin::Coin<0x2::iota::IOTA>", - "objectId": "0xefd24c24d3784edec255308f6fc3619f65902ebd122f5a34b105727994326ce1", + "objectType": "0x3::validator_cap::UnverifiedValidatorOperationCap", + "objectId": "0xed9ffc59b7e841e0de23ac1b72c4f04a784e2fef9c46f93eed0afdd14f8d047c", "version": "1", - "digest": "FNNTstnHpGPZCv6PNrv7dcodbfXkA4xiz71ZUtiVKYcY" + "digest": "69xyHdtHM8S6Voaqv4VHX5p7kxehGDVEAosn236u3EYH" + }, + { + "type": "created", + "sender": "0x0000000000000000000000000000000000000000000000000000000000000000", + "owner": "Immutable", + "objectType": "0x2::display::Display<0x107a::nft::Nft>", + "objectId": "0xeed5eebe436d3b4dedb5d25eff6275c5212fb408ab6e2d1756fd9c56b2af892d", + "version": "1", + "digest": "HyUxFE4PT5azA17c56oxTLkT81weUpxi5ZkoCxefEbyC" }, { "type": "created", "sender": "0x0000000000000000000000000000000000000000000000000000000000000000", "owner": { - "AddressOwner": "0x44f42943b20151d6a0c3cb0f84006b3441bb3378c668a6df71fa36cb441538c8" + "ObjectOwner": "0x723bc96ed7aa917e131832dd0c60b9b54bb74f5d6c7c5edb89251db0b2881d58" }, - "objectType": "0x2::coin::Coin<0x2::iota::IOTA>", - "objectId": "0xfbf79fe230691c666820739add167373a61a7faa858231f42feb961ec8fffcf5", + "objectType": "0x2::dynamic_field::Field<u64, 0x2::random::RandomInner>", + "objectId": "0xf69faa3aa3015380b78c11aae2ee8eed497bb5ee2555e686b53e375ab90fe8cd", "version": "1", - "digest": "2FRzkPVb45cxXoE68vu5QcfM9T7WypPFu199wSHeXUWj" + "digest": "6e9719u3ETKKnmysHMKE5kJoPcV6qGc8gLkoecxbibcm" }, { "type": "created", "sender": "0x0000000000000000000000000000000000000000000000000000000000000000", - "owner": "Immutable", - "objectType": "0x2::display::Display<0x107a::nft::Nft>", - "objectId": "0xffc04eb3011a2933dd0fbfff34cbd6759dbf999f7e2ac372e08d577c56a459cb", + "owner": { + "AddressOwner": "0xb4b32db0fb2bc9170f796efb2439aeaf46fd0dc0b79af4e12d14bb87c3e9aa65" + }, + "objectType": "0x2::coin::Coin<0x2::iota::IOTA>", + "objectId": "0xfe1d0d9ef3118023510cdf338ca59ae1d3e88e1ca98a3e1904d61a8620a1ad98", "version": "1", - "digest": "FVzi8BDkddrv8mDQE6DG5JxD7THHn1PKLqzSj5sovdAc" + "digest": "7iwW12UgvrywkA79tKwWSZ5AviKqcgKytqz9dWwZLDoh" } ], "timestampMs": "1641175496000", diff --git a/crates/iota-framework-snapshot/bytecode_snapshot/2/0x0000000000000000000000000000000000000000000000000000000000000001 b/crates/iota-framework-snapshot/bytecode_snapshot/2/0x0000000000000000000000000000000000000000000000000000000000000001 new file mode 100644 index 0000000000000000000000000000000000000000..6aae601648984df646a52a28b178d6962f81f810 GIT binary patch literal 11210 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%0ALTs4x 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 literal 0 HcmV?d00001 diff --git a/crates/iota-framework-snapshot/bytecode_snapshot/2/0x0000000000000000000000000000000000000000000000000000000000000002 b/crates/iota-framework-snapshot/bytecode_snapshot/2/0x0000000000000000000000000000000000000000000000000000000000000002 new file mode 100644 index 0000000000000000000000000000000000000000..6e14adb5fdfdc868a99e684fff0c9ffbdb2e0669 GIT binary patch literal 70162 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 literal 0 HcmV?d00001 diff --git a/crates/iota-framework-snapshot/bytecode_snapshot/2/0x0000000000000000000000000000000000000000000000000000000000000003 b/crates/iota-framework-snapshot/bytecode_snapshot/2/0x0000000000000000000000000000000000000000000000000000000000000003 new file mode 100644 index 0000000000000000000000000000000000000000..ddf88e95212806251eeeef47ef00ba83d826e46e GIT binary patch literal 42312 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 W<AdUXv6dp1(|p!HrSe<-%>NITFys^f literal 0 HcmV?d00001 diff --git a/crates/iota-framework-snapshot/bytecode_snapshot/2/0x000000000000000000000000000000000000000000000000000000000000000b b/crates/iota-framework-snapshot/bytecode_snapshot/2/0x000000000000000000000000000000000000000000000000000000000000000b new file mode 100644 index 0000000000000000000000000000000000000000..a28b3206877e3f7ff9dc74c46f0f029d2cc7ed92 GIT binary patch literal 19869 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 DVeU-Z literal 0 HcmV?d00001 diff --git a/crates/iota-framework-snapshot/bytecode_snapshot/2/0x000000000000000000000000000000000000000000000000000000000000107a b/crates/iota-framework-snapshot/bytecode_snapshot/2/0x000000000000000000000000000000000000000000000000000000000000107a new file mode 100644 index 0000000000000000000000000000000000000000..56d912f6c893cd11aa06d9bd3c7746ca3386b53f GIT binary patch literal 8844 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 literal 0 HcmV?d00001 diff --git a/crates/iota-framework-snapshot/manifest.json b/crates/iota-framework-snapshot/manifest.json index 71466febef4..261265acff2 100644 --- a/crates/iota-framework-snapshot/manifest.json +++ b/crates/iota-framework-snapshot/manifest.json @@ -8,5 +8,15 @@ "0x000000000000000000000000000000000000000000000000000000000000000b", "0x000000000000000000000000000000000000000000000000000000000000107a" ] + }, + "2": { + "git_revision": "f20be52f200b", + "package_ids": [ + "0x0000000000000000000000000000000000000000000000000000000000000001", + "0x0000000000000000000000000000000000000000000000000000000000000002", + "0x0000000000000000000000000000000000000000000000000000000000000003", + "0x000000000000000000000000000000000000000000000000000000000000000b", + "0x000000000000000000000000000000000000000000000000000000000000107a" + ] } } \ No newline at end of file diff --git a/crates/iota-framework/packages/iota-system/sources/iota_system_state_inner.move b/crates/iota-framework/packages/iota-system/sources/iota_system_state_inner.move index 5e701a31961..2097871e915 100644 --- a/crates/iota-framework/packages/iota-system/sources/iota_system_state_inner.move +++ b/crates/iota-framework/packages/iota-system/sources/iota_system_state_inner.move @@ -675,6 +675,9 @@ module iota_system::iota_system_state_inner { let storage_charge_value = storage_charge.value(); let computation_charge = computation_reward.value(); + // Mints or burns tokens depending on the target reward. + // Since not all rewards are distributed in case of slashed validators, + // tokens might be minted here and burnt in the same epoch change. let (mut total_validator_rewards, minted_tokens_amount, mut burnt_tokens_amount) = match_computation_reward_to_target_reward( validator_target_reward, computation_reward, @@ -701,7 +704,7 @@ module iota_system::iota_system_state_inner { let new_total_stake = self.validators.total_stake(); let remaining_validator_rewards_amount_after_distribution = total_validator_rewards.value(); - let total_validator_rewards_distributed = total_validator_rewards_amount_before_distribution - remaining_validator_rewards_amount_after_distribution; + let total_stake_rewards_distributed = total_validator_rewards_amount_before_distribution - remaining_validator_rewards_amount_after_distribution; self.protocol_version = next_protocol_version; @@ -731,9 +734,9 @@ module iota_system::iota_system_state_inner { storage_rebate: storage_rebate_amount, storage_fund_balance: self.storage_fund.total_balance(), total_gas_fees: computation_charge, - total_stake_rewards_distributed: total_validator_rewards_distributed, + total_stake_rewards_distributed, burnt_tokens_amount, - minted_tokens_amount + minted_tokens_amount, } ); self.safe_mode = false; @@ -751,24 +754,22 @@ module iota_system::iota_system_state_inner { /// and the amount of computation fees burned in this epoch. fun match_computation_reward_to_target_reward( validator_target_reward: u64, - mut computation_reward: Balance<IOTA>, + mut computation_charges: Balance<IOTA>, iota_treasury_cap: &mut iota::iota::IotaTreasuryCap, ctx: &TxContext, ): (Balance<IOTA>, u64, u64) { - let mut burnt_tokens_amount = 0; - let mut minted_tokens_amount = 0; - if (computation_reward.value() < validator_target_reward) { - let tokens_to_mint = validator_target_reward - computation_reward.value(); - let new_tokens = iota_treasury_cap.mint_balance(tokens_to_mint, ctx); - minted_tokens_amount = new_tokens.value(); - computation_reward.join(new_tokens); - } else if (computation_reward.value() > validator_target_reward) { - let tokens_to_burn = computation_reward.value() - validator_target_reward; - let rewards_to_burn = computation_reward.split(tokens_to_burn); - burnt_tokens_amount = rewards_to_burn.value(); - iota_treasury_cap.burn_balance(rewards_to_burn, ctx); + let burnt_tokens_amount = computation_charges.value(); + let minted_tokens_amount = validator_target_reward; + if (burnt_tokens_amount < minted_tokens_amount) { + let actual_amount_to_mint = minted_tokens_amount - burnt_tokens_amount; + let balance_to_mint = iota_treasury_cap.mint_balance(actual_amount_to_mint, ctx); + computation_charges.join(balance_to_mint); + } else if (burnt_tokens_amount > minted_tokens_amount) { + let actual_amount_to_burn = burnt_tokens_amount - minted_tokens_amount; + let balance_to_burn = computation_charges.split(actual_amount_to_burn); + iota_treasury_cap.burn_balance(balance_to_burn, ctx); }; - (computation_reward, minted_tokens_amount, burnt_tokens_amount) + (computation_charges, minted_tokens_amount, burnt_tokens_amount) } /// Return the current epoch number. Useful for applications that need a coarse-grained concept of time, diff --git a/crates/iota-framework/packages/iota-system/sources/validator_set.move b/crates/iota-framework/packages/iota-system/sources/validator_set.move index b0579a00205..8c8215e8ba8 100644 --- a/crates/iota-framework/packages/iota-system/sources/validator_set.move +++ b/crates/iota-framework/packages/iota-system/sources/validator_set.move @@ -11,7 +11,7 @@ module iota_system::validator_set { use iota_system::staking_pool::{PoolTokenExchangeRate, StakedIota, pool_id}; use iota::priority_queue as pq; use iota::vec_map::{Self, VecMap}; - use iota::vec_set::VecSet; + use iota::vec_set::{Self, VecSet}; use iota::table::{Self, Table}; use iota::event; use iota::table_vec::{Self, TableVec}; @@ -341,28 +341,14 @@ module iota_system::validator_set { // punished. let slashed_validators = compute_slashed_validators(self, *validator_report_records); - let total_slashed_validator_voting_power = sum_voting_power_by_addresses(&self.active_validators, &slashed_validators); - - // Compute the reward adjustments of slashed validators, to be taken into - // account in adjusted reward computation. - let (total_staking_reward_adjustment, individual_staking_reward_adjustments) = - compute_reward_adjustments( - get_validator_indices(&self.active_validators, &slashed_validators), - reward_slashing_rate, - &unadjusted_staking_reward_amounts, - ); - - // Compute the adjusted amounts of stake each validator should get given the tallying rule - // reward adjustments we computed before. + // Compute the adjusted amounts of stake each validator should get according to the tallying rule. // `compute_adjusted_reward_distribution` must be called before `distribute_reward` and `adjust_stake_and_gas_price` to // make sure we are using the current epoch's stake information to compute reward distribution. let adjusted_staking_reward_amounts = compute_adjusted_reward_distribution( &self.active_validators, - total_voting_power, - total_slashed_validator_voting_power, unadjusted_staking_reward_amounts, - total_staking_reward_adjustment, - individual_staking_reward_adjustments, + get_validator_indices_set(&self.active_validators, &slashed_validators), + reward_slashing_rate, ); // Distribute the rewards before adjusting stake so that we immediately start compounding @@ -638,18 +624,17 @@ module iota_system::validator_set { option::none() } - - /// Given a vector of validator addresses, return their indices in the validator set. + /// Given a vector of validator addresses, return a set of all indices of the validators. /// Aborts if any address isn't in the given validator set. - fun get_validator_indices(validators: &vector<ValidatorV1>, validator_addresses: &vector<address>): vector<u64> { + fun get_validator_indices_set(validators: &vector<ValidatorV1>, validator_addresses: &vector<address>): VecSet<u64> { let length = validator_addresses.length(); let mut i = 0; - let mut res = vector[]; + let mut res = vec_set::empty(); while (i < length) { let addr = validator_addresses[i]; let index_opt = find_validator(validators, addr); assert!(index_opt.is_some(), ENotAValidator); - res.push_back(index_opt.destroy_some()); + res.insert(index_opt.destroy_some()); i = i + 1; }; res @@ -941,35 +926,6 @@ module iota_system::validator_set { } } - /// Compute both the individual reward adjustments and total reward adjustment for staking rewards. - fun compute_reward_adjustments( - mut slashed_validator_indices: vector<u64>, - reward_slashing_rate: u64, - unadjusted_staking_reward_amounts: &vector<u64>, - ): ( - u64, // sum of staking reward adjustments - VecMap<u64, u64>, // mapping of individual validator's staking reward adjustment from index -> amount - ) { - let mut total_staking_reward_adjustment = 0; - let mut individual_staking_reward_adjustments = vec_map::empty(); - - while (!slashed_validator_indices.is_empty()) { - let validator_index = slashed_validator_indices.pop_back(); - - // Use the slashing rate to compute the amount of staking rewards slashed from this punished validator. - let unadjusted_staking_reward = unadjusted_staking_reward_amounts[validator_index]; - let staking_reward_adjustment_u128 = - unadjusted_staking_reward as u128 * (reward_slashing_rate as u128) - / BASIS_POINT_DENOMINATOR; - - // Insert into individual mapping and record into the total adjustment sum. - individual_staking_reward_adjustments.insert(validator_index, staking_reward_adjustment_u128 as u64); - total_staking_reward_adjustment = total_staking_reward_adjustment + (staking_reward_adjustment_u128 as u64); - }; - - (total_staking_reward_adjustment, individual_staking_reward_adjustments) - } - /// Process the validator report records of the epoch and return the addresses of the /// non-performant validators according to the input threshold. fun compute_slashed_validators( @@ -1023,44 +979,37 @@ module iota_system::validator_set { /// The staking rewards are shared with the stakers. fun compute_adjusted_reward_distribution( validators: &vector<ValidatorV1>, - total_voting_power: u64, - total_slashed_validator_voting_power: u64, unadjusted_staking_reward_amounts: vector<u64>, - total_staking_reward_adjustment: u64, - individual_staking_reward_adjustments: VecMap<u64, u64>, + slashed_validator_indices_set: VecSet<u64>, + reward_slashing_rate: u64, ): vector<u64> { - let total_unslashed_validator_voting_power = total_voting_power - total_slashed_validator_voting_power; let mut adjusted_staking_reward_amounts = vector[]; - + + // Loop through each validator and adjust rewards as necessary let length = validators.length(); - let mut i = 0; while (i < length) { - let validator = &validators[i]; - // Integer divisions will truncate the results. Because of this, we expect that at the end - // there will be some reward remaining in `total_reward`. - // Use u128 to avoid multiplication overflow. - let voting_power = validator.voting_power() as u128; - - // Compute adjusted staking reward. let unadjusted_staking_reward_amount = unadjusted_staking_reward_amounts[i]; - let adjusted_staking_reward_amount = - // If the validator is one of the slashed ones, then subtract the adjustment. - if (individual_staking_reward_adjustments.contains(&i)) { - let adjustment = individual_staking_reward_adjustments[&i]; - unadjusted_staking_reward_amount - adjustment - } else { - // Otherwise the slashed rewards should be distributed among the unslashed - // validators so add the corresponding adjustment. - let adjustment = total_staking_reward_adjustment as u128 * voting_power - / (total_unslashed_validator_voting_power as u128); - unadjusted_staking_reward_amount + (adjustment as u64) - }; + + // Check if the validator is slashed + let adjusted_staking_reward_amount = if (slashed_validator_indices_set.contains(&i)) { + // Use the slashing rate to compute the amount of staking rewards slashed from this punished validator. + // Use u128 to avoid multiplication overflow. + let staking_reward_adjustment_u128 = ((unadjusted_staking_reward_amount as u128) * (reward_slashing_rate as u128)) / BASIS_POINT_DENOMINATOR; + unadjusted_staking_reward_amount - (staking_reward_adjustment_u128 as u64) + } else { + // Otherwise, unadjusted staking reward amount is assigned to the unslashed validators + unadjusted_staking_reward_amount + }; + adjusted_staking_reward_amounts.push_back(adjusted_staking_reward_amount); - + + // Move to the next validator i = i + 1; }; + // The sum of the adjusted staking rewards may not be equal to the total staking reward, + // because of integer division truncation and the slashing of the rewards for the slashed validators. adjusted_staking_reward_amounts } diff --git a/crates/iota-framework/packages/iota-system/tests/rewards_distribution_tests.move b/crates/iota-framework/packages/iota-system/tests/rewards_distribution_tests.move index b8ad5e8b7f5..b57fb2e841e 100644 --- a/crates/iota-framework/packages/iota-system/tests/rewards_distribution_tests.move +++ b/crates/iota-framework/packages/iota-system/tests/rewards_distribution_tests.move @@ -47,22 +47,50 @@ module iota_system::rewards_distribution_tests { // need to advance epoch so validator's staking starts counting advance_epoch(scenario); + assert_validator_total_stake_amounts( + validator_addrs(), + vector[ + 100 * NANOS_PER_IOTA, + 200 * NANOS_PER_IOTA, + 300 * NANOS_PER_IOTA, + 400 * NANOS_PER_IOTA, + ], + scenario + ); + advance_epoch_with_reward_amounts(0, 100, scenario); + + // rewards of 100 IOTA are split evenly between the validators + // => +25 IOTA for each validator assert_validator_total_stake_amounts( validator_addrs(), - vector[125 * NANOS_PER_IOTA, 225 * NANOS_PER_IOTA, 325 * NANOS_PER_IOTA, 425 * NANOS_PER_IOTA], + vector[ + (100 + 25) * NANOS_PER_IOTA, + (200 + 25) * NANOS_PER_IOTA, + (300 + 25) * NANOS_PER_IOTA, + (400 + 25) * NANOS_PER_IOTA, + ], scenario ); stake_with(VALIDATOR_ADDR_2, VALIDATOR_ADDR_2, 720, scenario); advance_epoch(scenario); + advance_epoch_with_reward_amounts(0, 100, scenario); + // Even though validator 2 has a lot more stake now, it should not get more rewards because // the voting power is capped at 10%. + // rewards of 100 IOTA are split evenly between the validators + // => +25 IOTA for each validator assert_validator_total_stake_amounts( validator_addrs(), - vector[150 * NANOS_PER_IOTA, 970 * NANOS_PER_IOTA, 350 * NANOS_PER_IOTA, 450 * NANOS_PER_IOTA], + vector[ + (125 + 25) * NANOS_PER_IOTA, + (225 + 720 + 25) * NANOS_PER_IOTA, + (325 + 25) * NANOS_PER_IOTA, + (425 + 25) * NANOS_PER_IOTA, + ], scenario ); @@ -77,9 +105,31 @@ module iota_system::rewards_distribution_tests { // need to advance epoch so validator's staking starts counting advance_epoch(scenario); + + assert_validator_total_stake_amounts( + validator_addrs(), + vector[ + 100_000_000 * NANOS_PER_IOTA, + 200_000_000 * NANOS_PER_IOTA, + 300_000_000 * NANOS_PER_IOTA, + 400_000_000 * NANOS_PER_IOTA, + ], + scenario + ); advance_epoch_with_reward_amounts(0, 100, scenario); - assert_validator_total_stake_amounts(validator_addrs(), vector[100_000_025 * NANOS_PER_IOTA, 200_000_025 * NANOS_PER_IOTA, 300_000_025 * NANOS_PER_IOTA, 400_000_025 * NANOS_PER_IOTA], scenario); + + // rewards of 100 IOTA are split evenly between the validators + // => +25 IOTA for each validator + assert_validator_total_stake_amounts( + validator_addrs(), + vector[ + (100_000_000 + 25) * NANOS_PER_IOTA, + (200_000_000 + 25) * NANOS_PER_IOTA, + (300_000_000 + 25) * NANOS_PER_IOTA, + (400_000_000 + 25) * NANOS_PER_IOTA, + ], + scenario); scenario_val.end(); } @@ -98,6 +148,7 @@ module iota_system::rewards_distribution_tests { advance_epoch_with_target_reward_amounts(validator_target_reward, 0, computation_reward, scenario); let new_supply = total_supply(scenario); + // Since the target reward and computation reward are the same, no new tokens should // have been minted, so the supply should stay constant. assert!(prev_supply == new_supply, 0); @@ -120,6 +171,7 @@ module iota_system::rewards_distribution_tests { advance_epoch_with_target_reward_amounts(validator_target_reward, 0, computation_reward, scenario); let new_supply = total_supply(scenario); + // The difference between target reward and computation reward should have been burned. assert_eq(prev_supply - (computation_reward - validator_target_reward) * NANOS_PER_IOTA, new_supply); @@ -141,6 +193,7 @@ module iota_system::rewards_distribution_tests { advance_epoch_with_target_reward_amounts(validator_target_reward, 0, computation_reward, scenario); let new_supply = total_supply(scenario); + // The difference between target reward and computation reward should have been minted. assert_eq(prev_supply + (validator_target_reward - computation_reward) * NANOS_PER_IOTA, new_supply); @@ -153,27 +206,39 @@ module iota_system::rewards_distribution_tests { let mut scenario_val = test_scenario::begin(VALIDATOR_ADDR_1); let scenario = &mut scenario_val; + // need to advance epoch so validator's staking starts counting advance_epoch(scenario); - // V1: 100, V2: 200, V3: 300, V4: 400 - advance_epoch_with_target_reward_amounts(800, 0, 400, scenario); + assert_validator_total_stake_amounts( + validator_addrs(), + vector[ + 100 * NANOS_PER_IOTA, + 200 * NANOS_PER_IOTA, + 300 * NANOS_PER_IOTA, + 400 * NANOS_PER_IOTA, + ], + scenario + ); // The computation reward is lower than the target reward, so 400 IOTA should be minted. - // Each validator pool has 25% of the voting power and thus gets 25% of the reward (200 IOTA). + advance_epoch_with_target_reward_amounts(800, 0, 400, scenario); + + // Each validator pool has 25% of the voting power and thus gets 25% of the reward. + // => +200 IOTA for each validator assert_validator_total_stake_amounts( validator_addrs(), vector[ - (100 + 200) * NANOS_PER_IOTA, - (200 + 200) * NANOS_PER_IOTA, - (300 + 200) * NANOS_PER_IOTA, - (400 + 200) * NANOS_PER_IOTA, + (100 + 200) * NANOS_PER_IOTA, + (200 + 200) * NANOS_PER_IOTA, + (300 + 200) * NANOS_PER_IOTA, + (400 + 200) * NANOS_PER_IOTA, ], scenario ); unstake(VALIDATOR_ADDR_1, 0, scenario); - // Validator should get the entire reward of 200 plus its initially staked 100 IOTA. + // Validator 1 should get the entire reward of 200 plus its initially staked 100 IOTA. assert_eq(total_iota_balance(VALIDATOR_ADDR_1, scenario), (100+200) * NANOS_PER_IOTA); scenario_val.end(); @@ -185,27 +250,39 @@ module iota_system::rewards_distribution_tests { let mut scenario_val = test_scenario::begin(VALIDATOR_ADDR_1); let scenario = &mut scenario_val; + // need to advance epoch so validator's staking starts counting advance_epoch(scenario); - // V1: 100, V2: 200, V3: 300, V4: 400 - advance_epoch_with_target_reward_amounts(800, 0, 1000, scenario); + assert_validator_total_stake_amounts( + validator_addrs(), + vector[ + 100 * NANOS_PER_IOTA, + 200 * NANOS_PER_IOTA, + 300 * NANOS_PER_IOTA, + 400 * NANOS_PER_IOTA, + ], + scenario + ); // The computation reward is higher than the target reward, so 200 IOTA should be burned. - // Each validator pool has 25% of the voting power and thus gets 25% of the reward (200 IOTA). + advance_epoch_with_target_reward_amounts(800, 0, 1000, scenario); + + // Each validator pool has 25% of the voting power and thus gets 25% of the reward. + // => +200 IOTA for each validator assert_validator_total_stake_amounts( validator_addrs(), vector[ - (100 + 200) * NANOS_PER_IOTA, - (200 + 200) * NANOS_PER_IOTA, - (300 + 200) * NANOS_PER_IOTA, - (400 + 200) * NANOS_PER_IOTA, + (100 + 200) * NANOS_PER_IOTA, + (200 + 200) * NANOS_PER_IOTA, + (300 + 200) * NANOS_PER_IOTA, + (400 + 200) * NANOS_PER_IOTA, ], scenario ); unstake(VALIDATOR_ADDR_1, 0, scenario); - // Validator should get the entire reward of 200 plus its initially staked 100 IOTA. + // Validator 1 should get the entire reward of 200 plus its initially staked 100 IOTA. assert_eq(total_iota_balance(VALIDATOR_ADDR_1, scenario), (100+200) * NANOS_PER_IOTA); scenario_val.end(); @@ -219,15 +296,28 @@ module iota_system::rewards_distribution_tests { stake_with(STAKER_ADDR_1, VALIDATOR_ADDR_1, 100, scenario); stake_with(STAKER_ADDR_2, VALIDATOR_ADDR_2, 50, scenario); + + // need to advance epoch so validator's staking starts counting advance_epoch(scenario); - // V1: 200, V2: 250, V3: 300, V4: 400 + + assert_validator_total_stake_amounts( + validator_addrs(), + vector[ + (100 + 100) * NANOS_PER_IOTA, + (200 + 50) * NANOS_PER_IOTA, + 300 * NANOS_PER_IOTA, + 400 * NANOS_PER_IOTA, + ], + scenario + ); set_commission_rate_and_advance_epoch(VALIDATOR_ADDR_1, 500, scenario); // 5% commission + // The computation reward is lower than the target reward, so 400 IOTA should be minted. advance_epoch_with_target_reward_amounts(800, 0, 400, scenario); - // The computation reward is lower than the target reward, so 400 IOTA should be minted. - // Each validator pool has 25% of the voting power and thus gets 25% of the reward (200 IOTA each). + // Each validator pool has 25% of the voting power and thus gets 25% of the reward. + // => +200 IOTA for each validator assert_validator_total_stake_amounts( validator_addrs(), vector[ @@ -260,32 +350,78 @@ module iota_system::rewards_distribution_tests { stake_with(STAKER_ADDR_1, VALIDATOR_ADDR_1, 200, scenario); stake_with(STAKER_ADDR_2, VALIDATOR_ADDR_2, 100, scenario); - advance_epoch(scenario); - assert_validator_total_stake_amounts(validator_addrs(), vector[300 * NANOS_PER_IOTA, 300 * NANOS_PER_IOTA, 300 * NANOS_PER_IOTA, 400 * NANOS_PER_IOTA], scenario); - assert_validator_self_stake_amounts(validator_addrs(), vector[100 * NANOS_PER_IOTA, 200 * NANOS_PER_IOTA, 300 * NANOS_PER_IOTA, 400 * NANOS_PER_IOTA], scenario); + // need to advance epoch so validator's staking starts counting + advance_epoch(scenario); - // Each pool gets 30 IOTA. + assert_validator_total_stake_amounts( + validator_addrs(), + vector[ + (100 + 200) * NANOS_PER_IOTA, + (200 + 100) * NANOS_PER_IOTA, + 300 * NANOS_PER_IOTA, + 400 * NANOS_PER_IOTA, + ], + scenario); + + assert_validator_self_stake_amounts( + validator_addrs(), + vector[ + 100 * NANOS_PER_IOTA, + 200 * NANOS_PER_IOTA, + 300 * NANOS_PER_IOTA, + 400 * NANOS_PER_IOTA, + ], scenario); + + // Each validator pool has 25% of the voting power and thus gets 25% of the reward. + // => +30 IOTA for each pool + // Validator 1 gets 100/300 * 30 IOTA => +10 IOTA for validator 1 + // Validator 2 gets 200/300 * 30 IOTA => +20 IOTA for validator 2 + // Validators 3 and 4 have all the stake in the pool => +30 IOTA for validators 3 and 4 advance_epoch_with_reward_amounts(0, 120, scenario); - assert_validator_self_stake_amounts(validator_addrs(), vector[110 * NANOS_PER_IOTA, 220 * NANOS_PER_IOTA, 330 * NANOS_PER_IOTA, 430 * NANOS_PER_IOTA], scenario); + assert_validator_self_stake_amounts( + validator_addrs(), + vector[ + (100 + 10) * NANOS_PER_IOTA, + (200 + 20) * NANOS_PER_IOTA, + (300 + 30) * NANOS_PER_IOTA, + (400 + 30) * NANOS_PER_IOTA, + ], + scenario); + unstake(STAKER_ADDR_1, 0, scenario); stake_with(STAKER_ADDR_2, VALIDATOR_ADDR_1, 600, scenario); - // Each pool gets 30 IOTA. + + // Each validator pool has 25% of the voting power and thus gets 25% of the reward. + // => +30 IOTA for each pool advance_epoch_with_reward_amounts(0, 120, scenario); - // staker 1 receives only 20 IOTA of rewards, not 40 since we are using pre-epoch exchange rate. - assert_eq(total_iota_balance(STAKER_ADDR_1, scenario), 220 * NANOS_PER_IOTA); - assert_validator_self_stake_amounts(validator_addrs(), vector[140 * NANOS_PER_IOTA, 240 * NANOS_PER_IOTA, 360 * NANOS_PER_IOTA, 460 * NANOS_PER_IOTA], scenario); + // staker 1 receives only 200/300*30=20 IOTA of rewards, (not 40) since we are using pre-epoch exchange rate. + assert_eq(total_iota_balance(STAKER_ADDR_1, scenario), (200 + 20) * NANOS_PER_IOTA); + // The recent changes in stake are not valid for this epoch yet. Thus: + // Validators 1, 3 and 4 have all the stake in the pool => +30 IOTA for validators 1, 3 and 4 + // Validator 2 gets 200/300 * 30 IOTA => +20 IOTA for validator + assert_validator_self_stake_amounts( + validator_addrs(), + vector[ + (110 + 30) * NANOS_PER_IOTA, + (220 + 20) * NANOS_PER_IOTA, + (330 + 30) * NANOS_PER_IOTA, + (430 + 30) * NANOS_PER_IOTA, + ], + scenario); + unstake(STAKER_ADDR_2, 0, scenario); - assert_eq(total_iota_balance(STAKER_ADDR_2, scenario), 120 * NANOS_PER_IOTA); // 20 IOTA of rewards received + // staker 2 receives its available principal (100 IOTA) + 100/300*60=20 IOTA of rewards, relative to 2 epochs. + // The stake added in the last epoch (600 IOTA) is not unstaked yet. + assert_eq(total_iota_balance(STAKER_ADDR_2, scenario), (100 + 20) * NANOS_PER_IOTA); + // +10 IOTA for each pool advance_epoch_with_reward_amounts(0, 40, scenario); - unstake(STAKER_ADDR_2, 0, scenario); // unstake 600 principal IOTA - // additional 600 IOTA of principal and 46 IOTA of rewards withdrawn to Coin<IOTA> - // For this stake, the staking exchange rate is 100 : 140 and the unstaking - // exchange rate is 528 : 750 -ish so the total iota withdraw will be: - // (600 * 100 / 140) * 750 / 528 = ~608. Together with the 120 IOTA we already have, - // that would be about 728 IOTA. + // unstakes the additional 600 IOTA of principal + rewards relative to past epoch + // the rewarded amount is 600/740*10 IOTA + // staker 2's balance is then ~120 + 600 + 8.1081081 + unstake(STAKER_ADDR_2, 0, scenario); // TODO: Come up with better numbers and clean it up! assert_eq(total_iota_balance(STAKER_ADDR_2, scenario), 728108108107); scenario_val.end(); @@ -300,6 +436,7 @@ module iota_system::rewards_distribution_tests { // stake a large amount stake_with(STAKER_ADDR_1, VALIDATOR_ADDR_1, 200000000, scenario); + // need to advance epoch so validator's staking starts counting advance_epoch(scenario); advance_epoch_with_reward_amounts(0, 150000, scenario); @@ -324,28 +461,80 @@ module iota_system::rewards_distribution_tests { stake_with(STAKER_ADDR_1, VALIDATOR_ADDR_1, 100, scenario); stake_with(STAKER_ADDR_2, VALIDATOR_ADDR_2, 100, scenario); + + // need to advance epoch so validator's staking starts counting advance_epoch(scenario); + // Pool's stake: // V1: 200, V2: 300, V3: 300, V4: 400 set_commission_rate_and_advance_epoch(VALIDATOR_ADDR_2, 2000, scenario); // 20% commission + + // Each validator pool has 25% of the voting power and thus gets 25% of the reward. + // => +30 IOTA for each pool advance_epoch_with_reward_amounts(0, 120, scenario); - // V1: 230, V2: 330, V3: 330, V4: 430 - // 2 IOTA, or 20 % of staker_2's rewards, goes to validator_2 - assert_validator_non_self_stake_amounts(validator_addrs(), vector[115 * NANOS_PER_IOTA, 108 * NANOS_PER_IOTA, 0, 0], scenario); - assert_validator_self_stake_amounts(validator_addrs(), vector[115 * NANOS_PER_IOTA, 222 * NANOS_PER_IOTA, 330 * NANOS_PER_IOTA, 430 * NANOS_PER_IOTA], scenario); + + // staker 1 gets 100/200*30 IOTA => +15 IOTA + // staker 2 would get 100/300*30 IOTA = 10 IOTA. However, since the commission rate is 20% for this pool, they get 8 IOTA + assert_validator_non_self_stake_amounts( + validator_addrs(), + vector[ + (100 + 15) * NANOS_PER_IOTA, + (100 + 8) * NANOS_PER_IOTA, + 0, + 0, + ], + scenario); + + // Validator 1 gets 100/200*30 => +15 IOTA + // Validator 2 gets 200/300*30 + 2 (from the commission) => +22 IOTA + // Validators 3 and 4 have all the pool stake and get +30 IOTA each. + assert_validator_self_stake_amounts( + validator_addrs(), + vector[ + (100 + 15) * NANOS_PER_IOTA, + (200 + 22) * NANOS_PER_IOTA, + (300 + 30) * NANOS_PER_IOTA, + (400 + 30) * NANOS_PER_IOTA, + ], + scenario); set_commission_rate_and_advance_epoch(VALIDATOR_ADDR_1, 1000, scenario); // 10% commission + // +60 IOTA for each pool advance_epoch_with_reward_amounts(0, 240, scenario); - assert_validator_total_stake_amounts(validator_addrs(), vector[290 * NANOS_PER_IOTA, 390 * NANOS_PER_IOTA, 390 * NANOS_PER_IOTA, 490 * NANOS_PER_IOTA], scenario); + assert_validator_total_stake_amounts( + validator_addrs(), + vector[ + (230 + 60) * NANOS_PER_IOTA, + (330 + 60) * NANOS_PER_IOTA, + (330 + 60) * NANOS_PER_IOTA, + (430 + 60) * NANOS_PER_IOTA, + ], scenario); // Staker 1 rewards in the recent distribution is 0.9 x 30 = 27 IOTA // Validator 1 rewards in the recent distribution is 60 - 27 = 33 IOTA // Staker 2 amounts for 0.8 * 60 * (108 / 330) + 108 = 123.709 IOTA // Validator 2 amounts for 390 - 123.709 = 266.291 IOTA - assert_validator_non_self_stake_amounts(validator_addrs(), vector[142 * NANOS_PER_IOTA, 123709090909, 0, 0], scenario); - assert_validator_self_stake_amounts(validator_addrs(), vector[148 * NANOS_PER_IOTA, 266290909091, 390 * NANOS_PER_IOTA, 490 * NANOS_PER_IOTA], scenario); + assert_validator_non_self_stake_amounts( + validator_addrs(), + vector[ + 142 * NANOS_PER_IOTA, + 123709090909, + 0, + 0, + ], + scenario); + + assert_validator_self_stake_amounts( + validator_addrs(), + vector[ + 148 * NANOS_PER_IOTA, + 266290909091, + 390 * NANOS_PER_IOTA, + 490 * NANOS_PER_IOTA, + ], + scenario); scenario_val.end(); } @@ -357,6 +546,8 @@ module iota_system::rewards_distribution_tests { let scenario = &mut scenario_val; stake_with(STAKER_ADDR_1, VALIDATOR_ADDR_1, 100, scenario); + + // need to advance epoch so validator's staking starts counting advance_epoch(scenario); // V1: 200, V2: 200, V3: 300, V4: 400 @@ -397,7 +588,9 @@ module iota_system::rewards_distribution_tests { set_up_iota_system_state(); let mut scenario_val = test_scenario::begin(VALIDATOR_ADDR_1); let scenario = &mut scenario_val; + let initial_supply = total_supply(scenario); + // need to advance epoch so validator's staking starts counting advance_epoch(scenario); stake_with(STAKER_ADDR_1, VALIDATOR_ADDR_1, 100, scenario); @@ -405,7 +598,7 @@ module iota_system::rewards_distribution_tests { advance_epoch(scenario); - // validator_2 is reported by 3 other validators, so 75% of total stake. + // validator_2 is reported by 3 other validators, so 75% of total stake, since the voting power is capped at 10%. report_validator(VALIDATOR_ADDR_1, VALIDATOR_ADDR_2, scenario); report_validator(VALIDATOR_ADDR_3, VALIDATOR_ADDR_2, scenario); report_validator(VALIDATOR_ADDR_4, VALIDATOR_ADDR_2, scenario); @@ -415,24 +608,38 @@ module iota_system::rewards_distribution_tests { // 3600 IOTA of total rewards, 50% threshold and 10% reward slashing. // So validator_2 is the only one whose rewards should get slashed. + // Each pool would get +900 IOTA, disregarding the slashing rate + // Validator 1 gets 100/200*900 = +450 IOTA + // Validator 2 would get 200/300*900 = +600 IOTA (disregarding slashing) + // Validators 3 and 4 have all the pool stake, so they get +900 IOTA each advance_epoch_with_reward_amounts_and_slashing_rates( 0, 3600, 1000, scenario ); // Without reward slashing, the validator's stakes should be [100+450, 200+600, 300+900, 400+900] // after the last epoch advancement. - // Since 60 IOTA, or 10% of validator_2's rewards (600) are slashed, she only has 800 - 60 = 740 now. - // There are in total 90 IOTA of rewards slashed (60 from the validator, and 30 from her staker) - // so the unslashed validators each get their share of additional rewards, which is 30. - assert_validator_self_stake_amounts(validator_addrs(), vector[565 * NANOS_PER_IOTA, 740 * NANOS_PER_IOTA, 1230 * NANOS_PER_IOTA, 1330 * NANOS_PER_IOTA], scenario); + // Since 60 IOTA, or 10% of validator_2's rewards (600) are slashed, she only has 200 + 600 - 60 = 740 now. + // Note that the slashed rewards are not distributed to the other validators. + assert_validator_self_stake_amounts( + validator_addrs(), + vector[ + (100 + 450) * NANOS_PER_IOTA, + (200 + 600 - 60) * NANOS_PER_IOTA, + (300 + 900) * NANOS_PER_IOTA, + (400 + 900) * NANOS_PER_IOTA, + ], + scenario); // Unstake so we can check the stake rewards as well. unstake(STAKER_ADDR_1, 0, scenario); unstake(STAKER_ADDR_2, 0, scenario); - // Same analysis as above. Delegator 1 has 3 additional IOTA, and 10% of staker 2's rewards are slashed. - assert!(total_iota_balance(STAKER_ADDR_1, scenario) == 565 * NANOS_PER_IOTA); - assert!(total_iota_balance(STAKER_ADDR_2, scenario) == 370 * NANOS_PER_IOTA); + // Same analysis as above. Delegator 1 gets 450 IOTA, and 10% of staker 2's rewards (30 IOTA) are slashed. + assert!(total_iota_balance(STAKER_ADDR_1, scenario) == (100 + 450) * NANOS_PER_IOTA); + assert!(total_iota_balance(STAKER_ADDR_2, scenario) == (100 + 300 - 30) * NANOS_PER_IOTA); + + // Ensure that the slashed rewards are burned. + assert_eq(total_supply(scenario), initial_supply - 90 * NANOS_PER_IOTA); scenario_val.end(); } @@ -441,7 +648,9 @@ module iota_system::rewards_distribution_tests { set_up_iota_system_state(); let mut scenario_val = test_scenario::begin(VALIDATOR_ADDR_1); let scenario = &mut scenario_val; + let initial_supply = total_supply(scenario); + // need to advance epoch so validator's staking starts counting advance_epoch(scenario); stake_with(STAKER_ADDR_1, VALIDATOR_ADDR_1, 100, scenario); @@ -449,14 +658,17 @@ module iota_system::rewards_distribution_tests { advance_epoch(scenario); - // validator_2 is reported by 3 other validators, so 75% of total stake. + // validator_2 is reported by 3 other validators, so 75% of total stake, since the voting power is capped at 10%. report_validator(VALIDATOR_ADDR_1, VALIDATOR_ADDR_2, scenario); report_validator(VALIDATOR_ADDR_3, VALIDATOR_ADDR_2, scenario); report_validator(VALIDATOR_ADDR_4, VALIDATOR_ADDR_2, scenario); - // 3600 IOTA of total rewards, 100% reward slashing. // So validator_2 is the only one whose rewards should get slashed. + // Each pool would get +900 IOTA, disregarding the slashing rate + // Validator 1 gets 100/200*900 = +450 IOTA + // Validator 2 would get 200/300*900 = +600 IOTA (disregarding slashing) + // Validators 3 and 4 have all the pool stake, so they get +900 IOTA each advance_epoch_with_reward_amounts_and_slashing_rates( 0, 3600, 10_000, scenario ); @@ -464,16 +676,27 @@ module iota_system::rewards_distribution_tests { // Without reward slashing, the validator's stakes should be [100+450, 200+600, 300+900, 400+900] // after the last epoch advancement. // The entire rewards of validator 2's staking pool are slashed, which is 900 IOTA. - // so the unslashed validators each get their share of additional rewards, which is 300. - assert_validator_self_stake_amounts(validator_addrs(), vector[(550 + 150) * NANOS_PER_IOTA, 200 * NANOS_PER_IOTA, (1200 + 300) * NANOS_PER_IOTA, (1300 + 300) * NANOS_PER_IOTA], scenario); + assert_validator_self_stake_amounts( + validator_addrs(), + vector[ + (100 + 450) * NANOS_PER_IOTA, + (200 + 600 - 600) * NANOS_PER_IOTA, + (300 + 900) * NANOS_PER_IOTA, + (400 + 900) * NANOS_PER_IOTA, + ], + scenario); // Unstake so we can check the stake rewards as well. unstake(STAKER_ADDR_1, 0, scenario); unstake(STAKER_ADDR_2, 0, scenario); - // Same analysis as above. Staker 1 has 150 additional IOTA, and since all of staker 2's rewards are slashed she only gets back her principal. - assert!(total_iota_balance(STAKER_ADDR_1, scenario) == (550 + 150) * NANOS_PER_IOTA); - assert!(total_iota_balance(STAKER_ADDR_2, scenario) == 100 * NANOS_PER_IOTA); + // Same analysis as above. Staker 1 gets 450 IOTA as rewards, and since all of staker 2's rewards are slashed she only gets back her principal. + assert!(total_iota_balance(STAKER_ADDR_1, scenario) == (100 + 450) * NANOS_PER_IOTA); + assert!(total_iota_balance(STAKER_ADDR_2, scenario) == (100 + 300 - 300) * NANOS_PER_IOTA); + + // Ensure that the slashed rewards are burned. + assert_eq(total_supply(scenario), initial_supply - 900 * NANOS_PER_IOTA); + scenario_val.end(); } @@ -482,41 +705,64 @@ module iota_system::rewards_distribution_tests { set_up_iota_system_state(); let mut scenario_val = test_scenario::begin(VALIDATOR_ADDR_1); let scenario = &mut scenario_val; + let initial_supply = total_supply(scenario); - // Put 300 IOTA into the storage fund. + // Put 300 IOTA into the storage fund. This should not change the pools' stake or give rewards. advance_epoch_with_reward_amounts(300, 0, scenario); + assert_validator_total_stake_amounts( + validator_addrs(), + vector[ + 100 * NANOS_PER_IOTA, + 200 * NANOS_PER_IOTA, + 300 * NANOS_PER_IOTA, + 400 * NANOS_PER_IOTA, + ], scenario); // Add a few stakes. - stake_with(STAKER_ADDR_1, VALIDATOR_ADDR_3, 100, scenario); + stake_with(STAKER_ADDR_1, VALIDATOR_ADDR_3, 200, scenario); stake_with(STAKER_ADDR_2, VALIDATOR_ADDR_4, 100, scenario); + + // need to advance epoch so validator's staking starts counting advance_epoch(scenario); - // validator_4 is reported by 3 other validators, so 75% of total stake. + // validator_4 is reported by 3 other validators, so 75% of total stake, since the voting power is capped at 10%. report_validator(VALIDATOR_ADDR_1, VALIDATOR_ADDR_4, scenario); report_validator(VALIDATOR_ADDR_2, VALIDATOR_ADDR_4, scenario); report_validator(VALIDATOR_ADDR_3, VALIDATOR_ADDR_4, scenario); // 1000 IOTA of storage charges, 1500 IOTA of computation rewards, 50% slashing threshold // and 20% slashing rate + // because of the voting power cap, each pool gets +375 IOTA advance_epoch_with_reward_amounts_and_slashing_rates( 1000, 1500, 2000, scenario ); - // Each unslashed validator staking pool gets 375 IOTA of computation rewards + 25 IOTA (1/3) of validator 4's slashed computation reward, - // so in total it gets 400 IOTA of rewards. - // Validator 3's should get (375 + 25) * 3/4 = 300 in computation rewards. - // Validator 4's should get (375 - 75) * 4/5 = 240 in computation rewards. - assert_validator_self_stake_amounts(validator_addrs(), vector[500 * NANOS_PER_IOTA, 600 * NANOS_PER_IOTA, 600 * NANOS_PER_IOTA, 640 * NANOS_PER_IOTA], scenario); + // Validator 1 should get 375 * 1 = 375 in rewards. + // Validator 2 should get 375 * 1 = 375 in rewards. + // Validator 3 should get 375 * 3/5 = 225 in rewards. + // Validator 4 should get (375 - 75) * 4/5 = 240 in rewards. + assert_validator_self_stake_amounts( + validator_addrs(), + vector[ + (100 + 375) * NANOS_PER_IOTA, + (200 + 375) * NANOS_PER_IOTA, + (300 + 225) * NANOS_PER_IOTA, + (400 + 240) * NANOS_PER_IOTA, + ], + scenario); // Unstake so we can check the stake rewards as well. unstake(STAKER_ADDR_1, 0, scenario); unstake(STAKER_ADDR_2, 0, scenario); - // Staker 1 gets (375 + 25) * 1/4 = 100 IOTA of rewards. - assert_eq(total_iota_balance(STAKER_ADDR_1, scenario), (100 + 100) * NANOS_PER_IOTA); + // Staker 1 gets 375 * 2/5 = 150 IOTA of rewards. + assert_eq(total_iota_balance(STAKER_ADDR_1, scenario), (200 + 150) * NANOS_PER_IOTA); // Staker 2 gets (375 - 75) * 1/5 = 60 IOTA of rewards. assert_eq(total_iota_balance(STAKER_ADDR_2, scenario), (100 + 60) * NANOS_PER_IOTA); + // Ensure that the slashed rewards are burned. + assert_eq(total_supply(scenario), initial_supply - 75 * NANOS_PER_IOTA); + scenario_val.end(); } @@ -527,6 +773,7 @@ module iota_system::rewards_distribution_tests { set_up_iota_system_state(); let mut scenario_val = test_scenario::begin(VALIDATOR_ADDR_1); let scenario = &mut scenario_val; + let initial_supply = total_supply(scenario); slash_all_validators(scenario); @@ -535,7 +782,14 @@ module iota_system::rewards_distribution_tests { ); // All validators should have 0 rewards added so their stake stays the same. - assert_validator_self_stake_amounts(validator_addrs(), vector[100 * NANOS_PER_IOTA, 200 * NANOS_PER_IOTA, 300 * NANOS_PER_IOTA, 400 * NANOS_PER_IOTA], scenario); + assert_validator_self_stake_amounts( + validator_addrs(), + vector[ + 100 * NANOS_PER_IOTA, + 200 * NANOS_PER_IOTA, + 300 * NANOS_PER_IOTA, + 400 * NANOS_PER_IOTA, + ], scenario); scenario.next_tx(@0x0); // Storage fund balance should be the same as before. @@ -545,6 +799,9 @@ module iota_system::rewards_distribution_tests { // The entire 1000 IOTA of storage charges should go to the object rebate portion of the storage fund. assert_eq(system_state.get_storage_fund_object_rebates(), 1000 * NANOS_PER_IOTA); + // Ensure that the slashed rewards are burned. + assert_eq(system_state.get_total_iota_supply(), initial_supply - 500 * NANOS_PER_IOTA); + test_scenario::return_shared(system_state); scenario_val.end(); } @@ -557,28 +814,45 @@ module iota_system::rewards_distribution_tests { stake_with(STAKER_ADDR_1, VALIDATOR_ADDR_1, 220, scenario); + // since the voting power is capped at 10%, each pool gets +10 IOTA + // Pools' stake after this are + // P1: 100 + 220 + 10 = 330; P2: 200 + 10 = 210; P3: 300 + 10 = 310; P4: 400 + 10 = 410 advance_epoch_with_reward_amounts(0, 40, scenario); stake_with(STAKER_ADDR_2, VALIDATOR_ADDR_1, 480, scenario); - // Staker 1 gets 2/3 * 1/4 * 120 = 20 IOTA here. + // Here, each pool gets +30 IOTA + // Staker 1 gets 220/330 * 30 = +20 IOTA, totalling 240 IOTA of stake + // Pools' stake after this are + // P1: 330 + 480 + 30 = 840; P2: 210 + 30 = 240; P3: 310 + 30 = 340; P4: 410 + 30 = 440 advance_epoch_with_reward_amounts(0, 120, scenario); stake_with(STAKER_ADDR_1, VALIDATOR_ADDR_1, 130, scenario); stake_with(STAKER_ADDR_3, VALIDATOR_ADDR_1, 390, scenario); - // Staker 1 gets 20 IOTA here and staker 2 gets 40 IOTA here. + // Here, each pool gets +70 IOTA + // Staker 1 gets 240/840*70 = +20 IOTA, totalling 390 IOTA of stake + // Staker 2 gets 480/840*70 = +40 IOTA, totalling 520 IOTA of stake + // Pools' stake after this are + // P1: 840 + 130 + 390 + 70 = 1430; P2: 240 + 70 = 310; P3: 340 + 70 = 410; P4: 440 + 70 = 510 advance_epoch_with_reward_amounts(0, 280, scenario); + stake_with(STAKER_ADDR_3, VALIDATOR_ADDR_1, 280, scenario); stake_with(STAKER_ADDR_4, VALIDATOR_ADDR_1, 1400, scenario); - // Staker 1 gets 30 IOTA, staker 2 gets 40 IOTA and staker 3 gets 30 IOTA. + // Here, each pool gets +110 IOTA + // Staker 1 gets 390/1430*110 = +30 IOTA, totalling 420 IOTA of stake + // Staker 2 gets 520/1430*110 = +40 IOTA, totalling 560 IOTA of stake + // Staker 3 gets 390/1430*110 = +30 IOTA, totalling 700 IOTA of stake + // Pools' stake after this are + // P1: 1430 + 280 + 1400 + 110 = 3220; P2: 310 + 110 = 420 + // P3: 410 + 110 = 520; P4: 510 + 110 = 620 advance_epoch_with_reward_amounts(0, 440, scenario); scenario.next_tx(@0x0); let mut system_state = scenario.take_shared<IotaSystemState>(); // Check that we have the right amount of IOTA in the staking pool. - assert_eq(system_state.validator_stake_amount(VALIDATOR_ADDR_1), 140 * 23 * NANOS_PER_IOTA); + assert_eq(system_state.validator_stake_amount(VALIDATOR_ADDR_1), 3220 * NANOS_PER_IOTA); test_scenario::return_shared(system_state); // Withdraw all stakes at once. @@ -589,22 +863,16 @@ module iota_system::rewards_distribution_tests { unstake(STAKER_ADDR_3, 0, scenario); unstake(STAKER_ADDR_4, 0, scenario); - // staker 1's first stake was active for 3 epochs so got 20 * 3 = 60 IOTA of rewards - // and her second stake was active for only one epoch and got 10 IOTA of rewards. - assert_eq(total_iota_balance(STAKER_ADDR_1, scenario), (220 + 130 + 20 * 3 + 10) * NANOS_PER_IOTA); - // staker 2's stake was active for 2 epochs so got 40 * 2 = 80 IOTA of rewards - assert_eq(total_iota_balance(STAKER_ADDR_2, scenario), (480 + 40 * 2) * NANOS_PER_IOTA); - // staker 3's first stake was active for 1 epoch and got 30 IOTA of rewards - // and her second stake didn't get any rewards. - assert_eq(total_iota_balance(STAKER_ADDR_3, scenario), (390 + 280 + 30) * NANOS_PER_IOTA); - // staker 4 joined and left in an epoch where no rewards were earned so she got no rewards. + assert_eq(total_iota_balance(STAKER_ADDR_1, scenario), 420 * NANOS_PER_IOTA); + assert_eq(total_iota_balance(STAKER_ADDR_2, scenario), 560 * NANOS_PER_IOTA); + assert_eq(total_iota_balance(STAKER_ADDR_3, scenario), 700 * NANOS_PER_IOTA); assert_eq(total_iota_balance(STAKER_ADDR_4, scenario), 1400 * NANOS_PER_IOTA); advance_epoch_with_reward_amounts(0, 0, scenario); scenario.next_tx(@0x0); let mut system_state = scenario.take_shared<IotaSystemState>(); - // Since all the stakes are gone the pool is empty except for the validator's original stake. + // Since all the stakes are gone the pool is empty except for the validator's stake. assert_eq(system_state.validator_stake_amount(VALIDATOR_ADDR_1), 140 * NANOS_PER_IOTA); test_scenario::return_shared(system_state); scenario_val.end(); @@ -704,6 +972,11 @@ module iota_system::rewards_distribution_tests { scenario_val.end(); } + // This will set up the IOTA system state with the following validator stakes: + // Valdiator 1 => 100 + // Valdiator 2 => 200 + // Valdiator 3 => 300 + // Valdiator 4 => 400 fun set_up_iota_system_state() { let mut scenario_val = test_scenario::begin(@0x0); let scenario = &mut scenario_val; @@ -719,6 +992,11 @@ module iota_system::rewards_distribution_tests { scenario_val.end(); } + // This will set up the IOTA system state with the following validator stakes: + // Valdiator 1 => 100000000 + // Valdiator 2 => 200000000 + // Valdiator 3 => 300000000 + // Valdiator 4 => 400000000 fun set_up_iota_system_state_with_big_amounts() { let mut scenario_val = test_scenario::begin(@0x0); let scenario = &mut scenario_val; diff --git a/crates/iota-framework/packages_compiled/iota-system b/crates/iota-framework/packages_compiled/iota-system index 794306b98142dfe55cb92017511b45f591c8bf16..3869d79f95f3508a1974c1a7269951910377df11 100644 GIT binary patch delta 3635 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 delta 3849 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 VR3{Xit+UGD)$o8hcQAXS=0Eoe1TFvo diff --git a/crates/iota-framework/published_api.txt b/crates/iota-framework/published_api.txt index fc186af1667..72299612773 100644 --- a/crates/iota-framework/published_api.txt +++ b/crates/iota-framework/published_api.txt @@ -508,7 +508,7 @@ find_validator find_validator_from_table_vec fun 0x3::validator_set -get_validator_indices +get_validator_indices_set fun 0x3::validator_set get_validator_mut @@ -565,9 +565,6 @@ calculate_total_stakes adjust_stake_and_gas_price fun 0x3::validator_set -compute_reward_adjustments - fun - 0x3::validator_set compute_slashed_validators fun 0x3::validator_set diff --git a/crates/iota-indexer/tests/rpc-tests/governance_api.rs b/crates/iota-indexer/tests/rpc-tests/governance_api.rs index 3f662fef1d3..f79f35b607a 100644 --- a/crates/iota-indexer/tests/rpc-tests/governance_api.rs +++ b/crates/iota-indexer/tests/rpc-tests/governance_api.rs @@ -5,6 +5,7 @@ use iota_json_rpc_api::{GovernanceReadApiClient, TransactionBuilderClient}; use iota_json_rpc_types::{ DelegatedStake, DelegatedTimelockedStake, StakeStatus, TransactionBlockBytes, }; +use iota_protocol_config::ProtocolVersion; use iota_test_transaction_builder::TestTransactionBuilder; use iota_types::{ IOTA_FRAMEWORK_ADDRESS, IOTA_SYSTEM_ADDRESS, @@ -484,7 +485,7 @@ fn get_latest_iota_system_state() { indexer_wait_for_checkpoint(store, 1).await; let system_state = client.get_latest_iota_system_state().await.unwrap(); - assert_eq!(system_state.protocol_version, 1); + assert_eq!(system_state.protocol_version, ProtocolVersion::MAX.as_u64()); assert_eq!(system_state.system_state_version, 1); }); } diff --git a/crates/iota-indexer/tests/rpc-tests/read_api.rs b/crates/iota-indexer/tests/rpc-tests/read_api.rs index 382c6ea4ad3..94f0aa0f47c 100644 --- a/crates/iota-indexer/tests/rpc-tests/read_api.rs +++ b/crates/iota-indexer/tests/rpc-tests/read_api.rs @@ -8,6 +8,7 @@ use iota_json_rpc_types::{ CheckpointId, IotaGetPastObjectRequest, IotaObjectDataOptions, IotaObjectResponse, IotaObjectResponseQuery, IotaTransactionBlockResponse, IotaTransactionBlockResponseOptions, }; +use iota_protocol_config::ProtocolVersion; use iota_types::{ base_types::{ObjectID, SequenceNumber}, digests::TransactionDigest, @@ -1099,7 +1100,10 @@ fn get_protocol_config() { assert_eq!(fullnode_protocol_config, indexer_protocol_config); - let indexer_protocol_config = client.get_protocol_config(Some(1u64.into())).await.unwrap(); + let indexer_protocol_config = client + .get_protocol_config(Some(ProtocolVersion::MAX.as_u64().into())) + .await + .unwrap(); assert_eq!(fullnode_protocol_config, indexer_protocol_config); }); @@ -1122,7 +1126,11 @@ fn get_protocol_config_invalid_protocol_version() { assert!(rpc_call_error_msg_matches( result, - r#"{"code":-32603,"message":"Unsupported protocol version requested. Min supported: 1, max supported: 1"}"#, + &format!( + r#"{{"code":-32603,"message":"Unsupported protocol version requested. Min supported: {}, max supported: {}"}}"#, + ProtocolVersion::MIN.as_u64(), + ProtocolVersion::MAX.as_u64() + ), )); }); } diff --git a/crates/iota-open-rpc/spec/openrpc.json b/crates/iota-open-rpc/spec/openrpc.json index dfcd4ecccc2..f5ca3c7c01e 100644 --- a/crates/iota-open-rpc/spec/openrpc.json +++ b/crates/iota-open-rpc/spec/openrpc.json @@ -1300,7 +1300,7 @@ "name": "Result", "value": { "minSupportedProtocolVersion": "1", - "maxSupportedProtocolVersion": "1", + "maxSupportedProtocolVersion": "2", "protocolVersion": "1", "featureFlags": { "accept_zklogin_in_multisig": false, diff --git a/crates/iota-protocol-config/src/lib.rs b/crates/iota-protocol-config/src/lib.rs index 4f204db2ac3..a216a4efefb 100644 --- a/crates/iota-protocol-config/src/lib.rs +++ b/crates/iota-protocol-config/src/lib.rs @@ -16,11 +16,13 @@ use tracing::{info, warn}; /// The minimum and maximum protocol versions supported by this build. const MIN_PROTOCOL_VERSION: u64 = 1; -pub const MAX_PROTOCOL_VERSION: u64 = 1; +pub const MAX_PROTOCOL_VERSION: u64 = 2; // Record history of protocol version allocations here: // // Version 1: Original version. +// Version 2: Don't redistribute slashed staking rewards, fix computation of +// SystemEpochInfoEventV1. #[derive(Copy, Clone, Debug, Hash, Serialize, Deserialize, PartialEq, Eq, PartialOrd, Ord)] pub struct ProtocolVersion(u64); @@ -37,10 +39,10 @@ impl ProtocolVersion { #[cfg(not(msim))] const MAX_ALLOWED: Self = Self::MAX; - // We create 4 additional "fake" versions in simulator builds so that we can + // We create 3 additional "fake" versions in simulator builds so that we can // test upgrades. #[cfg(msim)] - pub const MAX_ALLOWED: Self = Self(MAX_PROTOCOL_VERSION + 4); + pub const MAX_ALLOWED: Self = Self(MAX_PROTOCOL_VERSION + 3); pub fn new(v: u64) -> Self { Self(v) @@ -1160,8 +1162,8 @@ impl ProtocolConfig { #[cfg(msim)] { // populate the fake simulator version # with a different base tx cost. - if version == ProtocolVersion::MAX_ALLOWED { - let mut config = Self::get_for_version_impl(version - 1, Chain::Unknown); + if version > ProtocolVersion::MAX { + let mut config = Self::get_for_version_impl(ProtocolVersion::MAX, Chain::Unknown); config.base_tx_cost_fixed = Some(config.base_tx_cost_fixed() + 1000); return config; } @@ -1632,15 +1634,11 @@ impl ProtocolConfig { cfg.feature_flags.passkey_auth = true; } - // Ignore this check for the fake versions for - // `test_choose_next_system_packages`. TODO: remove the never_loop - // attribute when the version 2 is added. - #[allow(clippy::never_loop)] - #[cfg(not(msim))] for cur in 2..=version.0 { match cur { 1 => unreachable!(), - + // version 2 is a new framework version but with no config changes + 2 => {} // Use this template when making changes: // // // modify an existing constant. diff --git a/crates/iota-protocol-config/src/snapshots/iota_protocol_config__test__Mainnet_version_2.snap b/crates/iota-protocol-config/src/snapshots/iota_protocol_config__test__Mainnet_version_2.snap new file mode 100644 index 00000000000..3f0064e48a4 --- /dev/null +++ b/crates/iota-protocol-config/src/snapshots/iota_protocol_config__test__Mainnet_version_2.snap @@ -0,0 +1,270 @@ +--- +source: crates/iota-protocol-config/src/lib.rs +expression: "ProtocolConfig::get_for_version(cur, *chain_id)" +snapshot_kind: text +--- +version: 2 +feature_flags: + consensus_transaction_ordering: ByGasPrice + per_object_congestion_control_mode: TotalTxCount + zklogin_max_epoch_upper_bound_delta: 30 +max_tx_size_bytes: 131072 +max_input_objects: 2048 +max_size_written_objects: 5000000 +max_size_written_objects_system_tx: 50000000 +max_serialized_tx_effects_size_bytes: 524288 +max_serialized_tx_effects_size_bytes_system_tx: 8388608 +max_gas_payment_objects: 256 +max_modules_in_publish: 64 +max_package_dependencies: 32 +max_arguments: 512 +max_type_arguments: 16 +max_type_argument_depth: 16 +max_pure_argument_size: 16384 +max_programmable_tx_commands: 1024 +move_binary_format_version: 7 +min_move_binary_format_version: 6 +binary_module_handles: 100 +binary_struct_handles: 300 +binary_function_handles: 1500 +binary_function_instantiations: 750 +binary_signatures: 1000 +binary_constant_pool: 4000 +binary_identifiers: 10000 +binary_address_identifiers: 100 +binary_struct_defs: 200 +binary_struct_def_instantiations: 100 +binary_function_defs: 1000 +binary_field_handles: 500 +binary_field_instantiations: 250 +binary_friend_decls: 100 +max_move_object_size: 256000 +max_move_package_size: 102400 +max_publish_or_upgrade_per_ptb: 5 +max_tx_gas: 50000000000 +max_gas_price: 100000 +max_gas_computation_bucket: 5000000 +gas_rounding_step: 1000 +max_loop_depth: 5 +max_generic_instantiation_length: 32 +max_function_parameters: 128 +max_basic_blocks: 1024 +max_value_stack_size: 1024 +max_type_nodes: 256 +max_push_size: 10000 +max_struct_definitions: 200 +max_function_definitions: 1000 +max_fields_in_struct: 32 +max_dependency_depth: 100 +max_num_event_emit: 1024 +max_num_new_move_object_ids: 2048 +max_num_new_move_object_ids_system_tx: 32768 +max_num_deleted_move_object_ids: 2048 +max_num_deleted_move_object_ids_system_tx: 32768 +max_num_transferred_move_object_ids: 2048 +max_num_transferred_move_object_ids_system_tx: 32768 +max_event_emit_size: 256000 +max_event_emit_size_total: 65536000 +max_move_vector_len: 262144 +max_move_identifier_len: 128 +max_move_value_depth: 128 +max_back_edges_per_function: 10000 +max_back_edges_per_module: 10000 +max_verifier_meter_ticks_per_function: 16000000 +max_meter_ticks_per_module: 16000000 +max_meter_ticks_per_package: 16000000 +object_runtime_max_num_cached_objects: 1000 +object_runtime_max_num_cached_objects_system_tx: 16000 +object_runtime_max_num_store_entries: 1000 +object_runtime_max_num_store_entries_system_tx: 16000 +base_tx_cost_fixed: 1000 +package_publish_cost_fixed: 1000 +base_tx_cost_per_byte: 0 +package_publish_cost_per_byte: 80 +obj_access_cost_read_per_byte: 15 +obj_access_cost_mutate_per_byte: 40 +obj_access_cost_delete_per_byte: 40 +obj_access_cost_verify_per_byte: 200 +gas_model_version: 1 +obj_data_cost_refundable: 100 +obj_metadata_cost_non_refundable: 50 +storage_rebate_rate: 10000 +reward_slashing_rate: 10000 +storage_gas_price: 76 +validator_target_reward: 767000000000000 +max_transactions_per_checkpoint: 10000 +max_checkpoint_size_bytes: 31457280 +buffer_stake_for_protocol_upgrade_bps: 5000 +address_from_bytes_cost_base: 52 +address_to_u256_cost_base: 52 +address_from_u256_cost_base: 52 +config_read_setting_impl_cost_base: 100 +config_read_setting_impl_cost_per_byte: 40 +dynamic_field_hash_type_and_key_cost_base: 100 +dynamic_field_hash_type_and_key_type_cost_per_byte: 2 +dynamic_field_hash_type_and_key_value_cost_per_byte: 2 +dynamic_field_hash_type_and_key_type_tag_cost_per_byte: 2 +dynamic_field_add_child_object_cost_base: 100 +dynamic_field_add_child_object_type_cost_per_byte: 10 +dynamic_field_add_child_object_value_cost_per_byte: 10 +dynamic_field_add_child_object_struct_tag_cost_per_byte: 10 +dynamic_field_borrow_child_object_cost_base: 100 +dynamic_field_borrow_child_object_child_ref_cost_per_byte: 10 +dynamic_field_borrow_child_object_type_cost_per_byte: 10 +dynamic_field_remove_child_object_cost_base: 100 +dynamic_field_remove_child_object_child_cost_per_byte: 2 +dynamic_field_remove_child_object_type_cost_per_byte: 2 +dynamic_field_has_child_object_cost_base: 100 +dynamic_field_has_child_object_with_ty_cost_base: 100 +dynamic_field_has_child_object_with_ty_type_cost_per_byte: 2 +dynamic_field_has_child_object_with_ty_type_tag_cost_per_byte: 2 +event_emit_cost_base: 52 +event_emit_value_size_derivation_cost_per_byte: 2 +event_emit_tag_size_derivation_cost_per_byte: 5 +event_emit_output_cost_per_byte: 10 +object_borrow_uid_cost_base: 52 +object_delete_impl_cost_base: 52 +object_record_new_uid_cost_base: 52 +transfer_transfer_internal_cost_base: 52 +transfer_freeze_object_cost_base: 52 +transfer_share_object_cost_base: 52 +transfer_receive_object_cost_base: 52 +tx_context_derive_id_cost_base: 52 +types_is_one_time_witness_cost_base: 52 +types_is_one_time_witness_type_tag_cost_per_byte: 2 +types_is_one_time_witness_type_cost_per_byte: 2 +validator_validate_metadata_cost_base: 52 +validator_validate_metadata_data_cost_per_byte: 2 +crypto_invalid_arguments_cost: 100 +bls12381_bls12381_min_sig_verify_cost_base: 52 +bls12381_bls12381_min_sig_verify_msg_cost_per_byte: 2 +bls12381_bls12381_min_sig_verify_msg_cost_per_block: 2 +bls12381_bls12381_min_pk_verify_cost_base: 52 +bls12381_bls12381_min_pk_verify_msg_cost_per_byte: 2 +bls12381_bls12381_min_pk_verify_msg_cost_per_block: 2 +ecdsa_k1_ecrecover_keccak256_cost_base: 52 +ecdsa_k1_ecrecover_keccak256_msg_cost_per_byte: 2 +ecdsa_k1_ecrecover_keccak256_msg_cost_per_block: 2 +ecdsa_k1_ecrecover_sha256_cost_base: 52 +ecdsa_k1_ecrecover_sha256_msg_cost_per_byte: 2 +ecdsa_k1_ecrecover_sha256_msg_cost_per_block: 2 +ecdsa_k1_decompress_pubkey_cost_base: 52 +ecdsa_k1_secp256k1_verify_keccak256_cost_base: 52 +ecdsa_k1_secp256k1_verify_keccak256_msg_cost_per_byte: 2 +ecdsa_k1_secp256k1_verify_keccak256_msg_cost_per_block: 2 +ecdsa_k1_secp256k1_verify_sha256_cost_base: 52 +ecdsa_k1_secp256k1_verify_sha256_msg_cost_per_byte: 2 +ecdsa_k1_secp256k1_verify_sha256_msg_cost_per_block: 2 +ecdsa_r1_ecrecover_keccak256_cost_base: 52 +ecdsa_r1_ecrecover_keccak256_msg_cost_per_byte: 2 +ecdsa_r1_ecrecover_keccak256_msg_cost_per_block: 2 +ecdsa_r1_ecrecover_sha256_cost_base: 52 +ecdsa_r1_ecrecover_sha256_msg_cost_per_byte: 2 +ecdsa_r1_ecrecover_sha256_msg_cost_per_block: 2 +ecdsa_r1_secp256r1_verify_keccak256_cost_base: 52 +ecdsa_r1_secp256r1_verify_keccak256_msg_cost_per_byte: 2 +ecdsa_r1_secp256r1_verify_keccak256_msg_cost_per_block: 2 +ecdsa_r1_secp256r1_verify_sha256_cost_base: 52 +ecdsa_r1_secp256r1_verify_sha256_msg_cost_per_byte: 2 +ecdsa_r1_secp256r1_verify_sha256_msg_cost_per_block: 2 +ecvrf_ecvrf_verify_cost_base: 52 +ecvrf_ecvrf_verify_alpha_string_cost_per_byte: 2 +ecvrf_ecvrf_verify_alpha_string_cost_per_block: 2 +ed25519_ed25519_verify_cost_base: 52 +ed25519_ed25519_verify_msg_cost_per_byte: 2 +ed25519_ed25519_verify_msg_cost_per_block: 2 +groth16_prepare_verifying_key_bls12381_cost_base: 52 +groth16_prepare_verifying_key_bn254_cost_base: 52 +groth16_verify_groth16_proof_internal_bls12381_cost_base: 52 +groth16_verify_groth16_proof_internal_bls12381_cost_per_public_input: 2 +groth16_verify_groth16_proof_internal_bn254_cost_base: 52 +groth16_verify_groth16_proof_internal_bn254_cost_per_public_input: 2 +groth16_verify_groth16_proof_internal_public_input_cost_per_byte: 2 +hash_blake2b256_cost_base: 52 +hash_blake2b256_data_cost_per_byte: 2 +hash_blake2b256_data_cost_per_block: 2 +hash_keccak256_cost_base: 52 +hash_keccak256_data_cost_per_byte: 2 +hash_keccak256_data_cost_per_block: 2 +group_ops_bls12381_decode_scalar_cost: 52 +group_ops_bls12381_decode_g1_cost: 52 +group_ops_bls12381_decode_g2_cost: 52 +group_ops_bls12381_decode_gt_cost: 52 +group_ops_bls12381_scalar_add_cost: 52 +group_ops_bls12381_g1_add_cost: 52 +group_ops_bls12381_g2_add_cost: 52 +group_ops_bls12381_gt_add_cost: 52 +group_ops_bls12381_scalar_sub_cost: 52 +group_ops_bls12381_g1_sub_cost: 52 +group_ops_bls12381_g2_sub_cost: 52 +group_ops_bls12381_gt_sub_cost: 52 +group_ops_bls12381_scalar_mul_cost: 52 +group_ops_bls12381_g1_mul_cost: 52 +group_ops_bls12381_g2_mul_cost: 52 +group_ops_bls12381_gt_mul_cost: 52 +group_ops_bls12381_scalar_div_cost: 52 +group_ops_bls12381_g1_div_cost: 52 +group_ops_bls12381_g2_div_cost: 52 +group_ops_bls12381_gt_div_cost: 52 +group_ops_bls12381_g1_hash_to_base_cost: 52 +group_ops_bls12381_g2_hash_to_base_cost: 52 +group_ops_bls12381_g1_hash_to_cost_per_byte: 2 +group_ops_bls12381_g2_hash_to_cost_per_byte: 2 +group_ops_bls12381_g1_msm_base_cost: 52 +group_ops_bls12381_g2_msm_base_cost: 52 +group_ops_bls12381_g1_msm_base_cost_per_input: 52 +group_ops_bls12381_g2_msm_base_cost_per_input: 52 +group_ops_bls12381_msm_max_len: 32 +group_ops_bls12381_pairing_cost: 52 +hmac_hmac_sha3_256_cost_base: 52 +hmac_hmac_sha3_256_input_cost_per_byte: 2 +hmac_hmac_sha3_256_input_cost_per_block: 2 +check_zklogin_id_cost_base: 200 +check_zklogin_issuer_cost_base: 200 +bcs_per_byte_serialized_cost: 2 +bcs_legacy_min_output_size_cost: 1 +bcs_failure_cost: 52 +hash_sha2_256_base_cost: 52 +hash_sha2_256_per_byte_cost: 2 +hash_sha2_256_legacy_min_input_len_cost: 1 +hash_sha3_256_base_cost: 52 +hash_sha3_256_per_byte_cost: 2 +hash_sha3_256_legacy_min_input_len_cost: 1 +type_name_get_base_cost: 52 +type_name_get_per_byte_cost: 2 +string_check_utf8_base_cost: 52 +string_check_utf8_per_byte_cost: 2 +string_is_char_boundary_base_cost: 52 +string_sub_string_base_cost: 52 +string_sub_string_per_byte_cost: 2 +string_index_of_base_cost: 52 +string_index_of_per_byte_pattern_cost: 2 +string_index_of_per_byte_searched_cost: 2 +vector_empty_base_cost: 52 +vector_length_base_cost: 52 +vector_push_back_base_cost: 52 +vector_push_back_legacy_per_abstract_memory_unit_cost: 2 +vector_borrow_base_cost: 52 +vector_pop_back_base_cost: 52 +vector_destroy_empty_base_cost: 52 +vector_swap_base_cost: 52 +debug_print_base_cost: 52 +debug_print_stack_trace_base_cost: 52 +execution_version: 1 +consensus_bad_nodes_stake_threshold: 20 +max_jwk_votes_per_validator_per_epoch: 240 +max_age_of_jwk_in_epochs: 1 +random_beacon_reduction_allowed_delta: 800 +random_beacon_reduction_lower_bound: 1000 +random_beacon_dkg_timeout_round: 3000 +random_beacon_min_round_interval_ms: 500 +random_beacon_dkg_version: 1 +consensus_max_transaction_size_bytes: 262144 +consensus_max_transactions_in_block_bytes: 524288 +consensus_max_num_transactions_in_block: 512 +max_deferral_rounds_for_congestion_control: 10 +min_checkpoint_interval_ms: 200 +checkpoint_summary_version_specific_data: 1 +max_soft_bundle_size: 5 +bridge_should_try_to_finalize_committee: false +max_accumulated_txn_cost_per_object_in_mysticeti_commit: 10 diff --git a/crates/iota-protocol-config/src/snapshots/iota_protocol_config__test__Testnet_version_2.snap b/crates/iota-protocol-config/src/snapshots/iota_protocol_config__test__Testnet_version_2.snap new file mode 100644 index 00000000000..89cf049133a --- /dev/null +++ b/crates/iota-protocol-config/src/snapshots/iota_protocol_config__test__Testnet_version_2.snap @@ -0,0 +1,270 @@ +--- +source: crates/iota-protocol-config/src/lib.rs +expression: "ProtocolConfig::get_for_version(cur, *chain_id)" +snapshot_kind: text +--- +version: 2 +feature_flags: + consensus_transaction_ordering: ByGasPrice + per_object_congestion_control_mode: TotalTxCount + zklogin_max_epoch_upper_bound_delta: 30 +max_tx_size_bytes: 131072 +max_input_objects: 2048 +max_size_written_objects: 5000000 +max_size_written_objects_system_tx: 50000000 +max_serialized_tx_effects_size_bytes: 524288 +max_serialized_tx_effects_size_bytes_system_tx: 8388608 +max_gas_payment_objects: 256 +max_modules_in_publish: 64 +max_package_dependencies: 32 +max_arguments: 512 +max_type_arguments: 16 +max_type_argument_depth: 16 +max_pure_argument_size: 16384 +max_programmable_tx_commands: 1024 +move_binary_format_version: 7 +min_move_binary_format_version: 6 +binary_module_handles: 100 +binary_struct_handles: 300 +binary_function_handles: 1500 +binary_function_instantiations: 750 +binary_signatures: 1000 +binary_constant_pool: 4000 +binary_identifiers: 10000 +binary_address_identifiers: 100 +binary_struct_defs: 200 +binary_struct_def_instantiations: 100 +binary_function_defs: 1000 +binary_field_handles: 500 +binary_field_instantiations: 250 +binary_friend_decls: 100 +max_move_object_size: 256000 +max_move_package_size: 102400 +max_publish_or_upgrade_per_ptb: 5 +max_tx_gas: 50000000000 +max_gas_price: 100000 +max_gas_computation_bucket: 5000000 +gas_rounding_step: 1000 +max_loop_depth: 5 +max_generic_instantiation_length: 32 +max_function_parameters: 128 +max_basic_blocks: 1024 +max_value_stack_size: 1024 +max_type_nodes: 256 +max_push_size: 10000 +max_struct_definitions: 200 +max_function_definitions: 1000 +max_fields_in_struct: 32 +max_dependency_depth: 100 +max_num_event_emit: 1024 +max_num_new_move_object_ids: 2048 +max_num_new_move_object_ids_system_tx: 32768 +max_num_deleted_move_object_ids: 2048 +max_num_deleted_move_object_ids_system_tx: 32768 +max_num_transferred_move_object_ids: 2048 +max_num_transferred_move_object_ids_system_tx: 32768 +max_event_emit_size: 256000 +max_event_emit_size_total: 65536000 +max_move_vector_len: 262144 +max_move_identifier_len: 128 +max_move_value_depth: 128 +max_back_edges_per_function: 10000 +max_back_edges_per_module: 10000 +max_verifier_meter_ticks_per_function: 16000000 +max_meter_ticks_per_module: 16000000 +max_meter_ticks_per_package: 16000000 +object_runtime_max_num_cached_objects: 1000 +object_runtime_max_num_cached_objects_system_tx: 16000 +object_runtime_max_num_store_entries: 1000 +object_runtime_max_num_store_entries_system_tx: 16000 +base_tx_cost_fixed: 1000 +package_publish_cost_fixed: 1000 +base_tx_cost_per_byte: 0 +package_publish_cost_per_byte: 80 +obj_access_cost_read_per_byte: 15 +obj_access_cost_mutate_per_byte: 40 +obj_access_cost_delete_per_byte: 40 +obj_access_cost_verify_per_byte: 200 +gas_model_version: 1 +obj_data_cost_refundable: 100 +obj_metadata_cost_non_refundable: 50 +storage_rebate_rate: 10000 +reward_slashing_rate: 10000 +storage_gas_price: 76 +validator_target_reward: 767000000000000 +max_transactions_per_checkpoint: 10000 +max_checkpoint_size_bytes: 31457280 +buffer_stake_for_protocol_upgrade_bps: 5000 +address_from_bytes_cost_base: 52 +address_to_u256_cost_base: 52 +address_from_u256_cost_base: 52 +config_read_setting_impl_cost_base: 100 +config_read_setting_impl_cost_per_byte: 40 +dynamic_field_hash_type_and_key_cost_base: 100 +dynamic_field_hash_type_and_key_type_cost_per_byte: 2 +dynamic_field_hash_type_and_key_value_cost_per_byte: 2 +dynamic_field_hash_type_and_key_type_tag_cost_per_byte: 2 +dynamic_field_add_child_object_cost_base: 100 +dynamic_field_add_child_object_type_cost_per_byte: 10 +dynamic_field_add_child_object_value_cost_per_byte: 10 +dynamic_field_add_child_object_struct_tag_cost_per_byte: 10 +dynamic_field_borrow_child_object_cost_base: 100 +dynamic_field_borrow_child_object_child_ref_cost_per_byte: 10 +dynamic_field_borrow_child_object_type_cost_per_byte: 10 +dynamic_field_remove_child_object_cost_base: 100 +dynamic_field_remove_child_object_child_cost_per_byte: 2 +dynamic_field_remove_child_object_type_cost_per_byte: 2 +dynamic_field_has_child_object_cost_base: 100 +dynamic_field_has_child_object_with_ty_cost_base: 100 +dynamic_field_has_child_object_with_ty_type_cost_per_byte: 2 +dynamic_field_has_child_object_with_ty_type_tag_cost_per_byte: 2 +event_emit_cost_base: 52 +event_emit_value_size_derivation_cost_per_byte: 2 +event_emit_tag_size_derivation_cost_per_byte: 5 +event_emit_output_cost_per_byte: 10 +object_borrow_uid_cost_base: 52 +object_delete_impl_cost_base: 52 +object_record_new_uid_cost_base: 52 +transfer_transfer_internal_cost_base: 52 +transfer_freeze_object_cost_base: 52 +transfer_share_object_cost_base: 52 +transfer_receive_object_cost_base: 52 +tx_context_derive_id_cost_base: 52 +types_is_one_time_witness_cost_base: 52 +types_is_one_time_witness_type_tag_cost_per_byte: 2 +types_is_one_time_witness_type_cost_per_byte: 2 +validator_validate_metadata_cost_base: 52 +validator_validate_metadata_data_cost_per_byte: 2 +crypto_invalid_arguments_cost: 100 +bls12381_bls12381_min_sig_verify_cost_base: 52 +bls12381_bls12381_min_sig_verify_msg_cost_per_byte: 2 +bls12381_bls12381_min_sig_verify_msg_cost_per_block: 2 +bls12381_bls12381_min_pk_verify_cost_base: 52 +bls12381_bls12381_min_pk_verify_msg_cost_per_byte: 2 +bls12381_bls12381_min_pk_verify_msg_cost_per_block: 2 +ecdsa_k1_ecrecover_keccak256_cost_base: 52 +ecdsa_k1_ecrecover_keccak256_msg_cost_per_byte: 2 +ecdsa_k1_ecrecover_keccak256_msg_cost_per_block: 2 +ecdsa_k1_ecrecover_sha256_cost_base: 52 +ecdsa_k1_ecrecover_sha256_msg_cost_per_byte: 2 +ecdsa_k1_ecrecover_sha256_msg_cost_per_block: 2 +ecdsa_k1_decompress_pubkey_cost_base: 52 +ecdsa_k1_secp256k1_verify_keccak256_cost_base: 52 +ecdsa_k1_secp256k1_verify_keccak256_msg_cost_per_byte: 2 +ecdsa_k1_secp256k1_verify_keccak256_msg_cost_per_block: 2 +ecdsa_k1_secp256k1_verify_sha256_cost_base: 52 +ecdsa_k1_secp256k1_verify_sha256_msg_cost_per_byte: 2 +ecdsa_k1_secp256k1_verify_sha256_msg_cost_per_block: 2 +ecdsa_r1_ecrecover_keccak256_cost_base: 52 +ecdsa_r1_ecrecover_keccak256_msg_cost_per_byte: 2 +ecdsa_r1_ecrecover_keccak256_msg_cost_per_block: 2 +ecdsa_r1_ecrecover_sha256_cost_base: 52 +ecdsa_r1_ecrecover_sha256_msg_cost_per_byte: 2 +ecdsa_r1_ecrecover_sha256_msg_cost_per_block: 2 +ecdsa_r1_secp256r1_verify_keccak256_cost_base: 52 +ecdsa_r1_secp256r1_verify_keccak256_msg_cost_per_byte: 2 +ecdsa_r1_secp256r1_verify_keccak256_msg_cost_per_block: 2 +ecdsa_r1_secp256r1_verify_sha256_cost_base: 52 +ecdsa_r1_secp256r1_verify_sha256_msg_cost_per_byte: 2 +ecdsa_r1_secp256r1_verify_sha256_msg_cost_per_block: 2 +ecvrf_ecvrf_verify_cost_base: 52 +ecvrf_ecvrf_verify_alpha_string_cost_per_byte: 2 +ecvrf_ecvrf_verify_alpha_string_cost_per_block: 2 +ed25519_ed25519_verify_cost_base: 52 +ed25519_ed25519_verify_msg_cost_per_byte: 2 +ed25519_ed25519_verify_msg_cost_per_block: 2 +groth16_prepare_verifying_key_bls12381_cost_base: 52 +groth16_prepare_verifying_key_bn254_cost_base: 52 +groth16_verify_groth16_proof_internal_bls12381_cost_base: 52 +groth16_verify_groth16_proof_internal_bls12381_cost_per_public_input: 2 +groth16_verify_groth16_proof_internal_bn254_cost_base: 52 +groth16_verify_groth16_proof_internal_bn254_cost_per_public_input: 2 +groth16_verify_groth16_proof_internal_public_input_cost_per_byte: 2 +hash_blake2b256_cost_base: 52 +hash_blake2b256_data_cost_per_byte: 2 +hash_blake2b256_data_cost_per_block: 2 +hash_keccak256_cost_base: 52 +hash_keccak256_data_cost_per_byte: 2 +hash_keccak256_data_cost_per_block: 2 +group_ops_bls12381_decode_scalar_cost: 52 +group_ops_bls12381_decode_g1_cost: 52 +group_ops_bls12381_decode_g2_cost: 52 +group_ops_bls12381_decode_gt_cost: 52 +group_ops_bls12381_scalar_add_cost: 52 +group_ops_bls12381_g1_add_cost: 52 +group_ops_bls12381_g2_add_cost: 52 +group_ops_bls12381_gt_add_cost: 52 +group_ops_bls12381_scalar_sub_cost: 52 +group_ops_bls12381_g1_sub_cost: 52 +group_ops_bls12381_g2_sub_cost: 52 +group_ops_bls12381_gt_sub_cost: 52 +group_ops_bls12381_scalar_mul_cost: 52 +group_ops_bls12381_g1_mul_cost: 52 +group_ops_bls12381_g2_mul_cost: 52 +group_ops_bls12381_gt_mul_cost: 52 +group_ops_bls12381_scalar_div_cost: 52 +group_ops_bls12381_g1_div_cost: 52 +group_ops_bls12381_g2_div_cost: 52 +group_ops_bls12381_gt_div_cost: 52 +group_ops_bls12381_g1_hash_to_base_cost: 52 +group_ops_bls12381_g2_hash_to_base_cost: 52 +group_ops_bls12381_g1_hash_to_cost_per_byte: 2 +group_ops_bls12381_g2_hash_to_cost_per_byte: 2 +group_ops_bls12381_g1_msm_base_cost: 52 +group_ops_bls12381_g2_msm_base_cost: 52 +group_ops_bls12381_g1_msm_base_cost_per_input: 52 +group_ops_bls12381_g2_msm_base_cost_per_input: 52 +group_ops_bls12381_msm_max_len: 32 +group_ops_bls12381_pairing_cost: 52 +hmac_hmac_sha3_256_cost_base: 52 +hmac_hmac_sha3_256_input_cost_per_byte: 2 +hmac_hmac_sha3_256_input_cost_per_block: 2 +check_zklogin_id_cost_base: 200 +check_zklogin_issuer_cost_base: 200 +bcs_per_byte_serialized_cost: 2 +bcs_legacy_min_output_size_cost: 1 +bcs_failure_cost: 52 +hash_sha2_256_base_cost: 52 +hash_sha2_256_per_byte_cost: 2 +hash_sha2_256_legacy_min_input_len_cost: 1 +hash_sha3_256_base_cost: 52 +hash_sha3_256_per_byte_cost: 2 +hash_sha3_256_legacy_min_input_len_cost: 1 +type_name_get_base_cost: 52 +type_name_get_per_byte_cost: 2 +string_check_utf8_base_cost: 52 +string_check_utf8_per_byte_cost: 2 +string_is_char_boundary_base_cost: 52 +string_sub_string_base_cost: 52 +string_sub_string_per_byte_cost: 2 +string_index_of_base_cost: 52 +string_index_of_per_byte_pattern_cost: 2 +string_index_of_per_byte_searched_cost: 2 +vector_empty_base_cost: 52 +vector_length_base_cost: 52 +vector_push_back_base_cost: 52 +vector_push_back_legacy_per_abstract_memory_unit_cost: 2 +vector_borrow_base_cost: 52 +vector_pop_back_base_cost: 52 +vector_destroy_empty_base_cost: 52 +vector_swap_base_cost: 52 +debug_print_base_cost: 52 +debug_print_stack_trace_base_cost: 52 +execution_version: 1 +consensus_bad_nodes_stake_threshold: 20 +max_jwk_votes_per_validator_per_epoch: 240 +max_age_of_jwk_in_epochs: 1 +random_beacon_reduction_allowed_delta: 800 +random_beacon_reduction_lower_bound: 1000 +random_beacon_dkg_timeout_round: 3000 +random_beacon_min_round_interval_ms: 500 +random_beacon_dkg_version: 1 +consensus_max_transaction_size_bytes: 262144 +consensus_max_transactions_in_block_bytes: 524288 +consensus_max_num_transactions_in_block: 512 +max_deferral_rounds_for_congestion_control: 10 +min_checkpoint_interval_ms: 200 +checkpoint_summary_version_specific_data: 1 +max_soft_bundle_size: 5 +bridge_should_try_to_finalize_committee: true +max_accumulated_txn_cost_per_object_in_mysticeti_commit: 10 diff --git a/crates/iota-protocol-config/src/snapshots/iota_protocol_config__test__version_2.snap b/crates/iota-protocol-config/src/snapshots/iota_protocol_config__test__version_2.snap new file mode 100644 index 00000000000..e23a99f7062 --- /dev/null +++ b/crates/iota-protocol-config/src/snapshots/iota_protocol_config__test__version_2.snap @@ -0,0 +1,278 @@ +--- +source: crates/iota-protocol-config/src/lib.rs +expression: "ProtocolConfig::get_for_version(cur, *chain_id)" +snapshot_kind: text +--- +version: 2 +feature_flags: + consensus_transaction_ordering: ByGasPrice + enable_poseidon: true + enable_group_ops_native_function_msm: true + per_object_congestion_control_mode: TotalTxCount + zklogin_max_epoch_upper_bound_delta: 30 + enable_vdf: true + passkey_auth: true +max_tx_size_bytes: 131072 +max_input_objects: 2048 +max_size_written_objects: 5000000 +max_size_written_objects_system_tx: 50000000 +max_serialized_tx_effects_size_bytes: 524288 +max_serialized_tx_effects_size_bytes_system_tx: 8388608 +max_gas_payment_objects: 256 +max_modules_in_publish: 64 +max_package_dependencies: 32 +max_arguments: 512 +max_type_arguments: 16 +max_type_argument_depth: 16 +max_pure_argument_size: 16384 +max_programmable_tx_commands: 1024 +move_binary_format_version: 7 +min_move_binary_format_version: 6 +binary_module_handles: 100 +binary_struct_handles: 300 +binary_function_handles: 1500 +binary_function_instantiations: 750 +binary_signatures: 1000 +binary_constant_pool: 4000 +binary_identifiers: 10000 +binary_address_identifiers: 100 +binary_struct_defs: 200 +binary_struct_def_instantiations: 100 +binary_function_defs: 1000 +binary_field_handles: 500 +binary_field_instantiations: 250 +binary_friend_decls: 100 +max_move_object_size: 256000 +max_move_package_size: 102400 +max_publish_or_upgrade_per_ptb: 5 +max_tx_gas: 50000000000 +max_gas_price: 100000 +max_gas_computation_bucket: 5000000 +gas_rounding_step: 1000 +max_loop_depth: 5 +max_generic_instantiation_length: 32 +max_function_parameters: 128 +max_basic_blocks: 1024 +max_value_stack_size: 1024 +max_type_nodes: 256 +max_push_size: 10000 +max_struct_definitions: 200 +max_function_definitions: 1000 +max_fields_in_struct: 32 +max_dependency_depth: 100 +max_num_event_emit: 1024 +max_num_new_move_object_ids: 2048 +max_num_new_move_object_ids_system_tx: 32768 +max_num_deleted_move_object_ids: 2048 +max_num_deleted_move_object_ids_system_tx: 32768 +max_num_transferred_move_object_ids: 2048 +max_num_transferred_move_object_ids_system_tx: 32768 +max_event_emit_size: 256000 +max_event_emit_size_total: 65536000 +max_move_vector_len: 262144 +max_move_identifier_len: 128 +max_move_value_depth: 128 +max_back_edges_per_function: 10000 +max_back_edges_per_module: 10000 +max_verifier_meter_ticks_per_function: 16000000 +max_meter_ticks_per_module: 16000000 +max_meter_ticks_per_package: 16000000 +object_runtime_max_num_cached_objects: 1000 +object_runtime_max_num_cached_objects_system_tx: 16000 +object_runtime_max_num_store_entries: 1000 +object_runtime_max_num_store_entries_system_tx: 16000 +base_tx_cost_fixed: 1000 +package_publish_cost_fixed: 1000 +base_tx_cost_per_byte: 0 +package_publish_cost_per_byte: 80 +obj_access_cost_read_per_byte: 15 +obj_access_cost_mutate_per_byte: 40 +obj_access_cost_delete_per_byte: 40 +obj_access_cost_verify_per_byte: 200 +gas_model_version: 1 +obj_data_cost_refundable: 100 +obj_metadata_cost_non_refundable: 50 +storage_rebate_rate: 10000 +reward_slashing_rate: 10000 +storage_gas_price: 76 +validator_target_reward: 767000000000000 +max_transactions_per_checkpoint: 10000 +max_checkpoint_size_bytes: 31457280 +buffer_stake_for_protocol_upgrade_bps: 5000 +address_from_bytes_cost_base: 52 +address_to_u256_cost_base: 52 +address_from_u256_cost_base: 52 +config_read_setting_impl_cost_base: 100 +config_read_setting_impl_cost_per_byte: 40 +dynamic_field_hash_type_and_key_cost_base: 100 +dynamic_field_hash_type_and_key_type_cost_per_byte: 2 +dynamic_field_hash_type_and_key_value_cost_per_byte: 2 +dynamic_field_hash_type_and_key_type_tag_cost_per_byte: 2 +dynamic_field_add_child_object_cost_base: 100 +dynamic_field_add_child_object_type_cost_per_byte: 10 +dynamic_field_add_child_object_value_cost_per_byte: 10 +dynamic_field_add_child_object_struct_tag_cost_per_byte: 10 +dynamic_field_borrow_child_object_cost_base: 100 +dynamic_field_borrow_child_object_child_ref_cost_per_byte: 10 +dynamic_field_borrow_child_object_type_cost_per_byte: 10 +dynamic_field_remove_child_object_cost_base: 100 +dynamic_field_remove_child_object_child_cost_per_byte: 2 +dynamic_field_remove_child_object_type_cost_per_byte: 2 +dynamic_field_has_child_object_cost_base: 100 +dynamic_field_has_child_object_with_ty_cost_base: 100 +dynamic_field_has_child_object_with_ty_type_cost_per_byte: 2 +dynamic_field_has_child_object_with_ty_type_tag_cost_per_byte: 2 +event_emit_cost_base: 52 +event_emit_value_size_derivation_cost_per_byte: 2 +event_emit_tag_size_derivation_cost_per_byte: 5 +event_emit_output_cost_per_byte: 10 +object_borrow_uid_cost_base: 52 +object_delete_impl_cost_base: 52 +object_record_new_uid_cost_base: 52 +transfer_transfer_internal_cost_base: 52 +transfer_freeze_object_cost_base: 52 +transfer_share_object_cost_base: 52 +transfer_receive_object_cost_base: 52 +tx_context_derive_id_cost_base: 52 +types_is_one_time_witness_cost_base: 52 +types_is_one_time_witness_type_tag_cost_per_byte: 2 +types_is_one_time_witness_type_cost_per_byte: 2 +validator_validate_metadata_cost_base: 52 +validator_validate_metadata_data_cost_per_byte: 2 +crypto_invalid_arguments_cost: 100 +bls12381_bls12381_min_sig_verify_cost_base: 52 +bls12381_bls12381_min_sig_verify_msg_cost_per_byte: 2 +bls12381_bls12381_min_sig_verify_msg_cost_per_block: 2 +bls12381_bls12381_min_pk_verify_cost_base: 52 +bls12381_bls12381_min_pk_verify_msg_cost_per_byte: 2 +bls12381_bls12381_min_pk_verify_msg_cost_per_block: 2 +ecdsa_k1_ecrecover_keccak256_cost_base: 52 +ecdsa_k1_ecrecover_keccak256_msg_cost_per_byte: 2 +ecdsa_k1_ecrecover_keccak256_msg_cost_per_block: 2 +ecdsa_k1_ecrecover_sha256_cost_base: 52 +ecdsa_k1_ecrecover_sha256_msg_cost_per_byte: 2 +ecdsa_k1_ecrecover_sha256_msg_cost_per_block: 2 +ecdsa_k1_decompress_pubkey_cost_base: 52 +ecdsa_k1_secp256k1_verify_keccak256_cost_base: 52 +ecdsa_k1_secp256k1_verify_keccak256_msg_cost_per_byte: 2 +ecdsa_k1_secp256k1_verify_keccak256_msg_cost_per_block: 2 +ecdsa_k1_secp256k1_verify_sha256_cost_base: 52 +ecdsa_k1_secp256k1_verify_sha256_msg_cost_per_byte: 2 +ecdsa_k1_secp256k1_verify_sha256_msg_cost_per_block: 2 +ecdsa_r1_ecrecover_keccak256_cost_base: 52 +ecdsa_r1_ecrecover_keccak256_msg_cost_per_byte: 2 +ecdsa_r1_ecrecover_keccak256_msg_cost_per_block: 2 +ecdsa_r1_ecrecover_sha256_cost_base: 52 +ecdsa_r1_ecrecover_sha256_msg_cost_per_byte: 2 +ecdsa_r1_ecrecover_sha256_msg_cost_per_block: 2 +ecdsa_r1_secp256r1_verify_keccak256_cost_base: 52 +ecdsa_r1_secp256r1_verify_keccak256_msg_cost_per_byte: 2 +ecdsa_r1_secp256r1_verify_keccak256_msg_cost_per_block: 2 +ecdsa_r1_secp256r1_verify_sha256_cost_base: 52 +ecdsa_r1_secp256r1_verify_sha256_msg_cost_per_byte: 2 +ecdsa_r1_secp256r1_verify_sha256_msg_cost_per_block: 2 +ecvrf_ecvrf_verify_cost_base: 52 +ecvrf_ecvrf_verify_alpha_string_cost_per_byte: 2 +ecvrf_ecvrf_verify_alpha_string_cost_per_block: 2 +ed25519_ed25519_verify_cost_base: 52 +ed25519_ed25519_verify_msg_cost_per_byte: 2 +ed25519_ed25519_verify_msg_cost_per_block: 2 +groth16_prepare_verifying_key_bls12381_cost_base: 52 +groth16_prepare_verifying_key_bn254_cost_base: 52 +groth16_verify_groth16_proof_internal_bls12381_cost_base: 52 +groth16_verify_groth16_proof_internal_bls12381_cost_per_public_input: 2 +groth16_verify_groth16_proof_internal_bn254_cost_base: 52 +groth16_verify_groth16_proof_internal_bn254_cost_per_public_input: 2 +groth16_verify_groth16_proof_internal_public_input_cost_per_byte: 2 +hash_blake2b256_cost_base: 52 +hash_blake2b256_data_cost_per_byte: 2 +hash_blake2b256_data_cost_per_block: 2 +hash_keccak256_cost_base: 52 +hash_keccak256_data_cost_per_byte: 2 +hash_keccak256_data_cost_per_block: 2 +poseidon_bn254_cost_base: 260 +poseidon_bn254_cost_per_block: 10 +group_ops_bls12381_decode_scalar_cost: 52 +group_ops_bls12381_decode_g1_cost: 52 +group_ops_bls12381_decode_g2_cost: 52 +group_ops_bls12381_decode_gt_cost: 52 +group_ops_bls12381_scalar_add_cost: 52 +group_ops_bls12381_g1_add_cost: 52 +group_ops_bls12381_g2_add_cost: 52 +group_ops_bls12381_gt_add_cost: 52 +group_ops_bls12381_scalar_sub_cost: 52 +group_ops_bls12381_g1_sub_cost: 52 +group_ops_bls12381_g2_sub_cost: 52 +group_ops_bls12381_gt_sub_cost: 52 +group_ops_bls12381_scalar_mul_cost: 52 +group_ops_bls12381_g1_mul_cost: 52 +group_ops_bls12381_g2_mul_cost: 52 +group_ops_bls12381_gt_mul_cost: 52 +group_ops_bls12381_scalar_div_cost: 52 +group_ops_bls12381_g1_div_cost: 52 +group_ops_bls12381_g2_div_cost: 52 +group_ops_bls12381_gt_div_cost: 52 +group_ops_bls12381_g1_hash_to_base_cost: 52 +group_ops_bls12381_g2_hash_to_base_cost: 52 +group_ops_bls12381_g1_hash_to_cost_per_byte: 2 +group_ops_bls12381_g2_hash_to_cost_per_byte: 2 +group_ops_bls12381_g1_msm_base_cost: 52 +group_ops_bls12381_g2_msm_base_cost: 52 +group_ops_bls12381_g1_msm_base_cost_per_input: 52 +group_ops_bls12381_g2_msm_base_cost_per_input: 52 +group_ops_bls12381_msm_max_len: 32 +group_ops_bls12381_pairing_cost: 52 +hmac_hmac_sha3_256_cost_base: 52 +hmac_hmac_sha3_256_input_cost_per_byte: 2 +hmac_hmac_sha3_256_input_cost_per_block: 2 +check_zklogin_id_cost_base: 200 +check_zklogin_issuer_cost_base: 200 +vdf_verify_vdf_cost: 1500 +vdf_hash_to_input_cost: 100 +bcs_per_byte_serialized_cost: 2 +bcs_legacy_min_output_size_cost: 1 +bcs_failure_cost: 52 +hash_sha2_256_base_cost: 52 +hash_sha2_256_per_byte_cost: 2 +hash_sha2_256_legacy_min_input_len_cost: 1 +hash_sha3_256_base_cost: 52 +hash_sha3_256_per_byte_cost: 2 +hash_sha3_256_legacy_min_input_len_cost: 1 +type_name_get_base_cost: 52 +type_name_get_per_byte_cost: 2 +string_check_utf8_base_cost: 52 +string_check_utf8_per_byte_cost: 2 +string_is_char_boundary_base_cost: 52 +string_sub_string_base_cost: 52 +string_sub_string_per_byte_cost: 2 +string_index_of_base_cost: 52 +string_index_of_per_byte_pattern_cost: 2 +string_index_of_per_byte_searched_cost: 2 +vector_empty_base_cost: 52 +vector_length_base_cost: 52 +vector_push_back_base_cost: 52 +vector_push_back_legacy_per_abstract_memory_unit_cost: 2 +vector_borrow_base_cost: 52 +vector_pop_back_base_cost: 52 +vector_destroy_empty_base_cost: 52 +vector_swap_base_cost: 52 +debug_print_base_cost: 52 +debug_print_stack_trace_base_cost: 52 +execution_version: 1 +consensus_bad_nodes_stake_threshold: 20 +max_jwk_votes_per_validator_per_epoch: 240 +max_age_of_jwk_in_epochs: 1 +random_beacon_reduction_allowed_delta: 800 +random_beacon_reduction_lower_bound: 1000 +random_beacon_dkg_timeout_round: 3000 +random_beacon_min_round_interval_ms: 500 +random_beacon_dkg_version: 1 +consensus_max_transaction_size_bytes: 262144 +consensus_max_transactions_in_block_bytes: 524288 +consensus_max_num_transactions_in_block: 512 +max_deferral_rounds_for_congestion_control: 10 +min_checkpoint_interval_ms: 200 +checkpoint_summary_version_specific_data: 1 +max_soft_bundle_size: 5 +bridge_should_try_to_finalize_committee: true +max_accumulated_txn_cost_per_object_in_mysticeti_commit: 10 diff --git a/crates/iota-swarm-config/tests/snapshots/snapshot_tests__genesis_config_snapshot_matches.snap b/crates/iota-swarm-config/tests/snapshots/snapshot_tests__genesis_config_snapshot_matches.snap index 560f4a795b4..1011bf3fa69 100644 --- a/crates/iota-swarm-config/tests/snapshots/snapshot_tests__genesis_config_snapshot_matches.snap +++ b/crates/iota-swarm-config/tests/snapshots/snapshot_tests__genesis_config_snapshot_matches.snap @@ -1,12 +1,13 @@ --- source: crates/iota-swarm-config/tests/snapshot_tests.rs expression: genesis_config +snapshot_kind: text --- ssfn_config_info: ~ validator_config_info: ~ parameters: chain_start_timestamp_ms: 0 - protocol_version: 1 + protocol_version: 2 allow_insertion_of_extra_objects: true epoch_duration_ms: 86400000 accounts: diff --git a/crates/iota-swarm-config/tests/snapshots/snapshot_tests__populated_genesis_snapshot_matches-2.snap b/crates/iota-swarm-config/tests/snapshots/snapshot_tests__populated_genesis_snapshot_matches-2.snap index 147ad24674c..c4a877d419f 100644 --- a/crates/iota-swarm-config/tests/snapshots/snapshot_tests__populated_genesis_snapshot_matches-2.snap +++ b/crates/iota-swarm-config/tests/snapshots/snapshot_tests__populated_genesis_snapshot_matches-2.snap @@ -3,12 +3,12 @@ source: crates/iota-swarm-config/tests/snapshot_tests.rs expression: genesis.iota_system_object().into_genesis_version_for_tooling() --- epoch: 0 -protocol_version: 1 +protocol_version: 2 system_state_version: 1 iota_treasury_cap: inner: id: - id: "0x934856dbf1a6032f66ee5ff2e959767c8efc379e69bd3087e78cdb051df2f876" + id: "0xc0a3df051577bcc903e0199da102f7f6f2a91efd10b974cf02abf758c940b2c4" total_supply: value: "751500000000000000" validators: @@ -244,13 +244,13 @@ validators: next_epoch_primary_address: ~ extra_fields: id: - id: "0xe8024a1572d13ddd22144a52f5bb90f9d93f0057d8a7f6886833a8558c5f42dc" + id: "0xaed6692f9414d47c421b568a78db64aad24df4ec5f907da2df9691ca8f8d8060" size: 0 voting_power: 10000 - operation_cap_id: "0xced7229b5da6ab4e03dbd482bfc0d31444f1530d0ae1020d55531f80051034de" + operation_cap_id: "0x27c7b6a423462fd937f9592b0a6460552d6dbe39529af7b31c1078d4a4278cee" gas_price: 1000 staking_pool: - id: "0x7bc82accfac70f4e347e02c215f509b1b22a1ac63f5edd784d16d0e95e1e3840" + id: "0x6d23d6ca509804be5b4366dfc8999117cee38954b222aa1869d2cd544caf65e1" activation_epoch: 0 deactivation_epoch: ~ iota_balance: 1500000000000000 @@ -258,14 +258,14 @@ validators: value: 0 pool_token_balance: 1500000000000000 exchange_rates: - id: "0xe82a41af6638521838d31f97bc54c191f0ce1a1781c35ac3d9a4e8499494e0c2" + id: "0x40c803c53c8e36a656201bc8742de9e8fac5fa2ed6b26b66e2698e1f221d6558" size: 1 pending_stake: 0 pending_total_iota_withdraw: 0 pending_pool_token_withdraw: 0 extra_fields: id: - id: "0x3589b1f00ea0f4019cd46b56d29b2286c1ec783e52e84415008747fb1d8c9043" + id: "0x783db4410eb618c9d4c739a0e8045a9ec4724f7ec4aeed22a298d682abffe508" size: 0 commission_rate: 200 next_epoch_stake: 1500000000000000 @@ -273,27 +273,27 @@ validators: next_epoch_commission_rate: 200 extra_fields: id: - id: "0x83acc826eb238b984c7bae9e964952dd72902a031d1f555cc4b0676495fc930e" + id: "0x73293ec9fb51bd0ad2cc3ec7b735fc274dbbef266c2e5a49425ab3940c494fb6" size: 0 pending_active_validators: contents: - id: "0xb98e2c63a08a2c27b9d14288105e784144c65dfdb081951e9794d385dcdf378b" + id: "0xd66fd1d251b3d564a7426c73cc67ca639b7423090081fcf79eb3dc0b40f63a7c" size: 0 pending_removals: [] staking_pool_mappings: - id: "0x17d4a3fab108e0275cfbd2b1966444e99419185643d340b5d1b425faab103cee" + id: "0x014b69d82717bfeb39f32586c065cad188d0fedc5c071bdcc710aaab2a245b7a" size: 1 inactive_validators: - id: "0xe7da2643c898e967489e2227ed2d36a0c8db61410e937dcfea7d915065736bc8" + id: "0x701c488df2bbfb7eae3ec279ad32702870a5750e6cd7f514c781c0859e916424" size: 0 validator_candidates: - id: "0x7c28f48d2427b54a9b018b62a2caaadd39ce209d779396f8ee23a4f7fc8d4901" + id: "0x39c06666a86631d172a296315d8c536add0cb612764a14be70ba269593527253" size: 0 at_risk_validators: contents: [] extra_fields: id: - id: "0x520c8bed0efe1861657f5b33eea0745aeeabfd4d1887172831a99c4fed274b4d" + id: "0x3db8221a6b41c7a07005b9cf9ed2b71cb45a0512181ed26e45422b1a56842a86" size: 0 storage_fund: total_object_storage_rebates: @@ -310,7 +310,7 @@ parameters: validator_low_stake_grace_period: 7 extra_fields: id: - id: "0x4b729e195cfcf8f19c9508866d464aea19e48db9a721114e5a6159d53abf310f" + id: "0xc3250b13a30f434b6fe6ac4f7747b761d7e06b377619f73e9c044fb6fbcb9043" size: 0 iota_system_admin_cap: dummy_field: false @@ -327,5 +327,5 @@ safe_mode_non_refundable_storage_fee: 0 epoch_start_timestamp_ms: 10 extra_fields: id: - id: "0x3ff2b204a8ce9d05936b477dbcf16285afbd069216734afbe1ae0798be0bb0e4" + id: "0x03afbe024fb0454cdd8498212b32b5c4f4000bb7335e4a54f2f1415481d68e3a" size: 0 From 55c14e81969aeecfde3538063e66bca5fe06286b Mon Sep 17 00:00:00 2001 From: Thoralf-M <46689931+Thoralf-M@users.noreply.github.com> Date: Wed, 11 Dec 2024 15:04:35 +0100 Subject: [PATCH 27/97] feat(workflows): add windows builds to release (#4431) --- .github/workflows/release.yml | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 7addd9967a9..f96bae10dc4 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -46,10 +46,10 @@ jobs: matrix: os: [ self-hosted, # ubuntu-x86_64 + # TODO: uncomment when runners are public available https://github.com/iotaledger/iota/issues/4421 + # ubuntu-arm64, # ubuntu-arm64 macos-latest, # macos-arm64 - # windows-latest (windows-x86_64) is disabled because we need to add custom logic for authenticating - # git for private repositories during the build (needed for iota-msim) - # MrSquaare/ssh-setup-action@v3 does not support windows + windows-latest, # windows-x86_64 ] fail-fast: false runs-on: ${{ matrix.os }} @@ -108,10 +108,10 @@ jobs: if: ${{ matrix.os == 'windows-latest' }} shell: bash run: | - choco install postgresql12 --force --params '/Password:root' - echo "C:\Program Files\PostgreSQL\12\bin" >> $GITHUB_PATH - echo "C:\Program Files\PostgreSQL\12\lib" >> $GITHUB_PATH - echo "PQ_LIB_DIR=C:\Program Files\PostgreSQL\12\lib" >> $GITHUB_ENV + choco install postgresql16 --force --params '/Password:root' + echo "C:\Program Files\PostgreSQL\16\bin" >> $GITHUB_PATH + echo "C:\Program Files\PostgreSQL\16\lib" >> $GITHUB_PATH + echo "PQ_LIB_DIR=C:\Program Files\PostgreSQL\16\lib" >> $GITHUB_ENV echo "PG_DATABASE_URL=postgres://postgres:root@localhost/" >> $GITHUB_ENV echo "PG_EXAMPLE_DATABASE_URL=postgres://postgres:root@localhost/diesel_example" >> $GITHUB_ENV @@ -126,6 +126,7 @@ jobs: run: | brew install postgresql + # TODO: uncomment when runners are public available https://github.com/iotaledger/iota/issues/4421 # NOTE: Self-hosted runners should already have postgres installed # - name: Install postgres (Ubuntu arm64) # if: ${{ matrix.os == 'ubuntu-arm64' }} From d2c04ac282d28604c9c857606e607a53319c73b6 Mon Sep 17 00:00:00 2001 From: Panteleymonchuk <panteleymonchuk@gmail.com> Date: Wed, 11 Dec 2024 17:19:11 +0200 Subject: [PATCH 28/97] feat(wallet-dashboard): style staked vesting overview (#4303) * feat(dashboard): style vesting * feat(dashboard): show properly data * fix(wallet-dashboard): wrong buttonType for dist * feat(dashboard): update UI after resolve conflicts. * feat(dashboard): add earned amount * feat(wallet-dashboard): implement StakedTimelockObject component and refactor vesting page * feat(dashboard): add Stake button to Staked Vesting title and simplify StakeDialog prop * feat(dashboard): add useStakeRewardStatus hook and integrate into StakedTimelockObject component * feat(vesting): update vesting interface and calculations to use bigint for improved precision * feat(dashboard): add loader, change style, fix BigInt round issue. * refactor(dashboard): move StakeState and STATUS_COPY to useStakeRewardStatus hook * feat(dashboard): implement bigInt to tests. * fix(dashboard): adjust padding for sidebar overlap on small screens and improve flex layout in vesting page * feat(dashboard): update estimatedReward and principal to use BigInt for improved precision --- apps/core/src/components/stake/StakedCard.tsx | 78 +---- apps/core/src/hooks/index.ts | 1 + apps/core/src/hooks/useStakeRewardStatus.ts | 92 ++++++ .../app/(protected)/layout.tsx | 11 +- .../app/(protected)/vesting/page.tsx | 272 ++++++++++-------- apps/wallet-dashboard/components/index.ts | 1 + .../StakedTimelockObject.tsx | 74 +++++ .../staked-timelock-object/index.ts | 4 + .../lib/interfaces/vesting.interface.ts | 13 +- .../lib/utils/vesting/vesting.spec.ts | 78 +++-- .../lib/utils/vesting/vesting.ts | 40 ++- 11 files changed, 426 insertions(+), 238 deletions(-) create mode 100644 apps/core/src/hooks/useStakeRewardStatus.ts create mode 100644 apps/wallet-dashboard/components/staked-timelock-object/StakedTimelockObject.tsx create mode 100644 apps/wallet-dashboard/components/staked-timelock-object/index.ts diff --git a/apps/core/src/components/stake/StakedCard.tsx b/apps/core/src/components/stake/StakedCard.tsx index dad5c6f091a..58bc5c82f20 100644 --- a/apps/core/src/components/stake/StakedCard.tsx +++ b/apps/core/src/components/stake/StakedCard.tsx @@ -7,27 +7,10 @@ import { Card, CardImage, CardType, CardBody, CardAction, CardActionType } from import { useMemo } from 'react'; import { useIotaClientQuery } from '@iota/dapp-kit'; import { ImageIcon } from '../icon'; -import { determineCountDownText, ExtendedDelegatedStake } from '../../utils'; -import { TimeUnit, useFormatCoin, useGetTimeBeforeEpochNumber, useTimeAgo } from '../../hooks'; -import { NUM_OF_EPOCH_BEFORE_STAKING_REWARDS_REDEEMABLE } from '../../constants'; +import { ExtendedDelegatedStake } from '../../utils'; +import { useFormatCoin, useStakeRewardStatus } from '../../hooks'; import React from 'react'; -export enum StakeState { - WarmUp = 'WARM_UP', - Earning = 'EARNING', - CoolDown = 'COOL_DOWN', - Withdraw = 'WITHDRAW', - InActive = 'IN_ACTIVE', -} - -const STATUS_COPY: { [key in StakeState]: string } = { - [StakeState.WarmUp]: 'Starts Earning', - [StakeState.Earning]: 'Staking Rewards', - [StakeState.CoolDown]: 'Available to withdraw', - [StakeState.Withdraw]: 'Withdraw', - [StakeState.InActive]: 'Inactive', -}; - interface StakedCardProps { extendedStake: ExtendedDelegatedStake; currentEpoch: number; @@ -45,48 +28,20 @@ export function StakedCard({ }: StakedCardProps) { const { principal, stakeRequestEpoch, estimatedReward, validatorAddress } = extendedStake; - // TODO: Once two step withdraw is available, add cool down and withdraw now logic - // For cool down epoch, show Available to withdraw add rewards to principal - // Reward earning epoch is 2 epochs after stake request epoch - const earningRewardsEpoch = - Number(stakeRequestEpoch) + NUM_OF_EPOCH_BEFORE_STAKING_REWARDS_REDEEMABLE; - const isEarnedRewards = currentEpoch >= Number(earningRewardsEpoch); - const delegationState = inactiveValidator - ? StakeState.InActive - : isEarnedRewards - ? StakeState.Earning - : StakeState.WarmUp; - - const rewards = isEarnedRewards && estimatedReward ? BigInt(estimatedReward) : 0n; + const { rewards, title, subtitle } = useStakeRewardStatus({ + stakeRequestEpoch, + currentEpoch, + estimatedReward, + inactiveValidator, + }); // For inactive validator, show principal + rewards const [principalStaked, symbol] = useFormatCoin( inactiveValidator ? principal + rewards : principal, IOTA_TYPE_ARG, ); - const [rewardsStaked] = useFormatCoin(rewards, IOTA_TYPE_ARG); - - // Applicable only for warm up - const epochBeforeRewards = delegationState === StakeState.WarmUp ? earningRewardsEpoch : null; - - const statusText = { - // Epoch time before earning - [StakeState.WarmUp]: `Epoch #${earningRewardsEpoch}`, - [StakeState.Earning]: `${rewardsStaked} ${symbol}`, - // Epoch time before redrawing - [StakeState.CoolDown]: `Epoch #`, - [StakeState.Withdraw]: 'Now', - [StakeState.InActive]: 'Not earning rewards', - }; const { data } = useIotaClientQuery('getLatestIotaSystemState'); - const { data: rewardEpochTime } = useGetTimeBeforeEpochNumber(Number(epochBeforeRewards) || 0); - const timeAgo = useTimeAgo({ - timeFrom: rewardEpochTime || null, - shortedTimeLabel: false, - shouldEnd: true, - maxTimeUnit: TimeUnit.ONE_HOUR, - }); const validatorMeta = useMemo(() => { if (!data) return null; @@ -97,17 +52,6 @@ export function StakedCard({ ); }, [validatorAddress, data]); - const rewardTime = () => { - if (Number(epochBeforeRewards) && rewardEpochTime > 0) { - return determineCountDownText({ - timeAgo, - label: 'in', - }); - } - - return statusText[delegationState]; - }; - return ( <Card testId="staked-card" type={CardType.Default} isHoverable onClick={onClick}> <CardImage> @@ -118,11 +62,7 @@ export function StakedCard({ /> </CardImage> <CardBody title={validatorMeta?.name || ''} subtitle={`${principalStaked} ${symbol}`} /> - <CardAction - title={rewardTime()} - subtitle={STATUS_COPY[delegationState]} - type={CardActionType.SupportingText} - /> + <CardAction title={title} subtitle={subtitle} type={CardActionType.SupportingText} /> </Card> ); } diff --git a/apps/core/src/hooks/index.ts b/apps/core/src/hooks/index.ts index 122b9b01294..89aced3f57f 100644 --- a/apps/core/src/hooks/index.ts +++ b/apps/core/src/hooks/index.ts @@ -46,5 +46,6 @@ export * from './useNFTBasicData'; export * from './useOwnedNFT'; export * from './useNftDetails'; export * from './useCountdownByTimestamp'; +export * from './useStakeRewardStatus'; export * from './stake'; diff --git a/apps/core/src/hooks/useStakeRewardStatus.ts b/apps/core/src/hooks/useStakeRewardStatus.ts new file mode 100644 index 00000000000..415b3efc5ac --- /dev/null +++ b/apps/core/src/hooks/useStakeRewardStatus.ts @@ -0,0 +1,92 @@ +// Copyright (c) 2024 IOTA Stiftung +// SPDX-License-Identifier: Apache-2.0 + +import { IOTA_TYPE_ARG } from '@iota/iota-sdk/utils'; +import { NUM_OF_EPOCH_BEFORE_STAKING_REWARDS_REDEEMABLE } from '../constants'; +import { useFormatCoin, useGetTimeBeforeEpochNumber, useTimeAgo, TimeUnit } from '.'; +import { determineCountDownText } from '../utils'; + +export function useStakeRewardStatus({ + stakeRequestEpoch, + currentEpoch, + inactiveValidator, + estimatedReward, +}: { + stakeRequestEpoch: string; + currentEpoch: number; + inactiveValidator: boolean; + estimatedReward?: string | number | bigint; +}) { + // TODO: Once two step withdraw is available, add cool down and withdraw now logic + // For cool down epoch, show Available to withdraw add rewards to principal + // Reward earning epoch is 2 epochs after stake request epoch + const earningRewardsEpoch = + Number(stakeRequestEpoch) + NUM_OF_EPOCH_BEFORE_STAKING_REWARDS_REDEEMABLE; + + const isEarnedRewards = currentEpoch >= Number(earningRewardsEpoch); + + const delegationState = inactiveValidator + ? StakeState.InActive + : isEarnedRewards + ? StakeState.Earning + : StakeState.WarmUp; + + const rewards = isEarnedRewards && estimatedReward ? BigInt(estimatedReward) : 0n; + + const [rewardsStaked, symbol] = useFormatCoin(rewards, IOTA_TYPE_ARG); + + // Applicable only for warm up + const epochBeforeRewards = delegationState === StakeState.WarmUp ? earningRewardsEpoch : null; + + const statusText = { + // Epoch time before earning + [StakeState.WarmUp]: `Epoch #${earningRewardsEpoch}`, + [StakeState.Earning]: `${rewardsStaked} ${symbol}`, + // Epoch time before redrawing + [StakeState.CoolDown]: `Epoch #`, + [StakeState.Withdraw]: 'Now', + [StakeState.InActive]: 'Not earning rewards', + }; + + const { data: rewardEpochTime } = useGetTimeBeforeEpochNumber(Number(epochBeforeRewards) || 0); + + const timeAgo = useTimeAgo({ + timeFrom: rewardEpochTime || null, + shortedTimeLabel: false, + shouldEnd: true, + maxTimeUnit: TimeUnit.ONE_HOUR, + }); + + const rewardTime = () => { + if (Number(epochBeforeRewards) && rewardEpochTime > 0) { + return determineCountDownText({ + timeAgo, + label: 'in', + }); + } + + return statusText[delegationState]; + }; + + return { + rewards, + title: rewardTime(), + subtitle: STATUS_COPY[delegationState], + }; +} +export enum StakeState { + WarmUp = 'WARM_UP', + Earning = 'EARNING', + CoolDown = 'COOL_DOWN', + Withdraw = 'WITHDRAW', + InActive = 'IN_ACTIVE', +} +export const STATUS_COPY: { + [key in StakeState]: string; +} = { + [StakeState.WarmUp]: 'Starts Earning', + [StakeState.Earning]: 'Staking Rewards', + [StakeState.CoolDown]: 'Available to withdraw', + [StakeState.Withdraw]: 'Withdraw', + [StakeState.InActive]: 'Inactive', +}; diff --git a/apps/wallet-dashboard/app/(protected)/layout.tsx b/apps/wallet-dashboard/app/(protected)/layout.tsx index 8d42d2ff757..a77c8922ab9 100644 --- a/apps/wallet-dashboard/app/(protected)/layout.tsx +++ b/apps/wallet-dashboard/app/(protected)/layout.tsx @@ -25,11 +25,14 @@ function DashboardLayout({ children }: PropsWithChildren): JSX.Element { <Sidebar /> </div> - <div className="container relative flex min-h-screen flex-col"> - <div className="sticky top-0 z-10 backdrop-blur-lg"> - <TopNav /> + {/* This padding need to have aligned left/right content's position, because of sidebar overlap on the small screens */} + <div className="pl-[72px]"> + <div className="container relative flex min-h-screen flex-col"> + <div className="sticky top-0 z-10 backdrop-blur-lg"> + <TopNav /> + </div> + <div className="flex-1 py-md--rs">{children}</div> </div> - <div className="flex-1 py-md--rs">{children}</div> </div> <div className="fixed bottom-5 right-5"> diff --git a/apps/wallet-dashboard/app/(protected)/vesting/page.tsx b/apps/wallet-dashboard/app/(protected)/vesting/page.tsx index 0488681830d..b925d57e97c 100644 --- a/apps/wallet-dashboard/app/(protected)/vesting/page.tsx +++ b/apps/wallet-dashboard/app/(protected)/vesting/page.tsx @@ -6,6 +6,7 @@ import { Banner, StakeDialog, + StakeDialogView, TimelockedUnstakePopup, useStakeDialog, VestingScheduleDialog, @@ -37,8 +38,9 @@ import { CardType, ImageType, ImageShape, - ButtonType, Button, + ButtonType, + LoadingIndicator, } from '@iota/apps-ui-kit'; import { Theme, @@ -52,19 +54,26 @@ import { useCountdownByTimestamp, Feature, } from '@iota/core'; -import { useCurrentAccount, useIotaClient, useSignAndExecuteTransaction } from '@iota/dapp-kit'; +import { + useCurrentAccount, + useIotaClient, + useIotaClientQuery, + useSignAndExecuteTransaction, +} from '@iota/dapp-kit'; import { IotaValidatorSummary } from '@iota/iota-sdk/client'; import { IOTA_TYPE_ARG } from '@iota/iota-sdk/utils'; import { Calendar, StarHex } from '@iota/ui-icons'; import { useQueryClient } from '@tanstack/react-query'; import { useRouter } from 'next/navigation'; import { useEffect, useState } from 'react'; +import { StakedTimelockObject } from '@/components'; function VestingDashboardPage(): JSX.Element { const account = useCurrentAccount(); const queryClient = useQueryClient(); const iotaClient = useIotaClient(); const router = useRouter(); + const { data: system } = useIotaClientQuery('getLatestIotaSystemState'); const [isVestingScheduleDialogOpen, setIsVestingScheduleDialogOpen] = useState(false); const { addNotification } = useNotifications(); const { openPopup, closePopup } = usePopups(); @@ -73,7 +82,10 @@ function VestingDashboardPage(): JSX.Element { const { data: timelockedObjects } = useGetAllOwnedObjects(account?.address || '', { StructType: TIMELOCK_IOTA_TYPE, }); - const { data: timelockedStakedObjects } = useGetTimelockedStakedObjects(account?.address || ''); + + const { data: timelockedStakedObjects, isLoading: istimelockedStakedObjectsLoading } = + useGetTimelockedStakedObjects(account?.address || ''); + const { mutateAsync: signAndExecuteTransaction } = useSignAndExecuteTransaction(); const { theme } = useTheme(); @@ -151,6 +163,16 @@ function VestingDashboardPage(): JSX.Element { ); } + const [totalStakedFormatted, totalStakedSymbol] = useFormatCoin( + vestingSchedule.totalStaked, + IOTA_TYPE_ARG, + ); + + const [totalEarnedFormatted, totalEarnedSymbol] = useFormatCoin( + vestingSchedule.totalEarned, + IOTA_TYPE_ARG, + ); + const unlockedTimelockedObjects = timelockedMapped?.filter((timelockedObject) => isTimelockedUnlockable(timelockedObject, Number(currentEpochMs)), ); @@ -232,75 +254,85 @@ function VestingDashboardPage(): JSX.Element { router.push('/'); } }, [router, supplyIncreaseVestingEnabled]); + + if (istimelockedStakedObjectsLoading) { + return ( + <div className="flex w-full max-w-4xl items-start justify-center justify-self-center"> + <LoadingIndicator /> + </div> + ); + } + return ( - <div className="flex w-full max-w-xl flex-col gap-lg justify-self-center"> - <Panel> - <Title title="Vesting" size={TitleSize.Medium} /> - <div className="flex flex-col gap-md p-lg pt-sm"> - <div className="flex h-24 flex-row gap-4"> - <DisplayStats - label="Total Vested" - value={formattedTotalVested} - supportingLabel={vestedSymbol} - /> - <DisplayStats - label="Total Locked" - value={formattedTotalLocked} - supportingLabel={lockedSymbol} - tooltipText="Total amount of IOTA that is still locked in your account." - tooltipPosition={TooltipPosition.Right} - /> + <div className="flex w-full max-w-4xl flex-col items-stretch justify-center gap-lg justify-self-center md:flex-row"> + <div className="flex w-full flex-col gap-lg md:w-1/2"> + <Panel> + <Title title="Vesting" size={TitleSize.Medium} /> + <div className="flex flex-col gap-md p-lg pt-sm"> + <div className="flex h-24 flex-row gap-4"> + <DisplayStats + label="Total Vested" + value={formattedTotalVested} + supportingLabel={vestedSymbol} + /> + <DisplayStats + label="Total Locked" + value={formattedTotalLocked} + supportingLabel={lockedSymbol} + tooltipText="Total amount of IOTA that is still locked in your account." + tooltipPosition={TooltipPosition.Right} + /> + </div> + <Card type={CardType.Outlined}> + <CardImage type={ImageType.BgSolid} shape={ImageShape.SquareRounded}> + <StarHex className="h-5 w-5 text-primary-30 dark:text-primary-80" /> + </CardImage> + <CardBody + title={`${formattedAvailableClaiming} ${availableClaimingSymbol}`} + subtitle="Available Rewards" + /> + <CardAction + type={CardActionType.Button} + onClick={handleCollect} + title="Collect" + buttonType={ButtonType.Primary} + buttonDisabled={ + !vestingSchedule.availableClaiming || + vestingSchedule.availableClaiming === 0n + } + /> + </Card> + <Card type={CardType.Outlined}> + <CardImage type={ImageType.BgSolid} shape={ImageShape.SquareRounded}> + <Calendar className="h-5 w-5 text-primary-30 dark:text-primary-80" /> + </CardImage> + <CardBody + title={`${formattedNextPayout} ${nextPayoutSymbol}`} + subtitle={`Next payout ${ + nextPayout?.expirationTimestampMs + ? formattedLastPayoutExpirationTime + : '' + }`} + /> + <CardAction + type={CardActionType.Button} + onClick={openReceiveTokenPopup} + title="See All" + buttonType={ButtonType.Secondary} + buttonDisabled={!vestingPortfolio} + /> + </Card> + {vestingPortfolio && ( + <VestingScheduleDialog + open={isVestingScheduleDialogOpen} + setOpen={setIsVestingScheduleDialogOpen} + vestingPortfolio={vestingPortfolio} + /> + )} </div> - <Card type={CardType.Outlined}> - <CardImage type={ImageType.BgSolid} shape={ImageShape.SquareRounded}> - <StarHex className="h-5 w-5 text-primary-30 dark:text-primary-80" /> - </CardImage> - <CardBody - title={`${formattedAvailableClaiming} ${availableClaimingSymbol}`} - subtitle="Available Rewards" - /> - <CardAction - type={CardActionType.Button} - onClick={handleCollect} - title="Collect" - buttonType={ButtonType.Primary} - buttonDisabled={ - !vestingSchedule.availableClaiming || - vestingSchedule.availableClaiming === 0 - } - /> - </Card> - <Card type={CardType.Outlined}> - <CardImage type={ImageType.BgSolid} shape={ImageShape.SquareRounded}> - <Calendar className="h-5 w-5 text-primary-30 dark:text-primary-80" /> - </CardImage> - <CardBody - title={`${formattedNextPayout} ${nextPayoutSymbol}`} - subtitle={`Next payout ${ - nextPayout?.expirationTimestampMs - ? formattedLastPayoutExpirationTime - : '' - }`} - /> - <CardAction - type={CardActionType.Button} - onClick={openReceiveTokenPopup} - title="See All" - buttonType={ButtonType.Secondary} - buttonDisabled={!vestingPortfolio} - /> - </Card> - {vestingPortfolio && ( - <VestingScheduleDialog - open={isVestingScheduleDialogOpen} - setOpen={setIsVestingScheduleDialogOpen} - vestingPortfolio={vestingPortfolio} - /> - )} - </div> - </Panel> - {timelockedstakedMapped.length === 0 ? ( - <> + </Panel> + + {timelockedstakedMapped.length === 0 ? ( <Banner videoSrc={videoSrc} title="Stake Vested Tokens" @@ -308,56 +340,64 @@ function VestingDashboardPage(): JSX.Element { onButtonClick={() => handleNewStake()} buttonText="Stake" /> - </> - ) : ( - <div className="flex w-1/2 flex-col items-center justify-center space-y-4 pt-12"> - <h1>Staked Vesting</h1> - <div className="flex flex-row space-x-4"> - <div className="flex flex-col items-center rounded-lg border p-4"> - <span>Your stake</span> - <span>{vestingSchedule.totalStaked}</span> + ) : null} + </div> + + {timelockedstakedMapped.length !== 0 ? ( + <div className="flex w-full md:w-1/2"> + <Panel> + <Title + title="Staked Vesting" + trailingElement={ + <Button + type={ButtonType.Primary} + text="Stake" + onClick={() => { + setStakeDialogView(StakeDialogView.SelectValidator); + }} + /> + } + /> + + <div className="flex flex-col px-lg py-sm"> + <div className="flex flex-row gap-md"> + <DisplayStats + label="Your stake" + value={`${totalStakedFormatted} ${totalStakedSymbol}`} + /> + <DisplayStats + label="Earned" + value={`${totalEarnedFormatted} ${totalEarnedSymbol}`} + /> + </div> </div> - <div className="flex flex-col items-center rounded-lg border p-4"> - <span>Total Unlocked</span> - <span>{vestingSchedule.totalUnlocked}</span> + <div className="flex flex-col px-lg py-sm"> + <div className="flex w-full flex-col items-center justify-center space-y-4 pt-4"> + {system && + timelockedStakedObjectsGrouped?.map( + (timelockedStakedObject) => { + return ( + <StakedTimelockObject + key={ + timelockedStakedObject.validatorAddress + + timelockedStakedObject.stakeRequestEpoch + + timelockedStakedObject.label + } + getValidatorByAddress={getValidatorByAddress} + timelockedStakedObject={timelockedStakedObject} + handleUnstake={handleUnstake} + currentEpoch={Number(system.epoch)} + /> + ); + }, + )} + </div> </div> - </div> - <div className="flex w-full flex-col items-center justify-center space-y-4 pt-4"> - {timelockedStakedObjectsGrouped?.map((timelockedStakedObject) => { - return ( - <div - key={ - timelockedStakedObject.validatorAddress + - timelockedStakedObject.stakeRequestEpoch + - timelockedStakedObject.label - } - className="flex w-full flex-row items-center justify-center space-x-4" - > - <span> - Validator:{' '} - {getValidatorByAddress( - timelockedStakedObject.validatorAddress, - )?.name || timelockedStakedObject.validatorAddress} - </span> - <span> - Stake Request Epoch:{' '} - {timelockedStakedObject.stakeRequestEpoch} - </span> - <span>Stakes: {timelockedStakedObject.stakes.length}</span> - - <Button - onClick={() => handleUnstake(timelockedStakedObject)} - text="Unstake" - /> - </div> - ); - })} - </div> - <Button onClick={() => handleNewStake()} text="Stake" /> + </Panel> </div> - )} + ) : null} <StakeDialog - isTimelockedStaking={true} + isTimelockedStaking stakedDetails={selectedStake} onSuccess={handleOnSuccess} isOpen={isDialogStakeOpen} diff --git a/apps/wallet-dashboard/components/index.ts b/apps/wallet-dashboard/components/index.ts index 179f9e836ac..37ff834be4f 100644 --- a/apps/wallet-dashboard/components/index.ts +++ b/apps/wallet-dashboard/components/index.ts @@ -26,3 +26,4 @@ export * from './tiles'; export * from './Toaster'; export * from './Banner'; export * from './MigrationOverview'; +export * from './staked-timelock-object'; diff --git a/apps/wallet-dashboard/components/staked-timelock-object/StakedTimelockObject.tsx b/apps/wallet-dashboard/components/staked-timelock-object/StakedTimelockObject.tsx new file mode 100644 index 00000000000..8696705bc12 --- /dev/null +++ b/apps/wallet-dashboard/components/staked-timelock-object/StakedTimelockObject.tsx @@ -0,0 +1,74 @@ +// Copyright (c) 2024 IOTA Stiftung +// SPDX-License-Identifier: Apache-2.0 +'use client'; +import { TimelockedStakedObjectsGrouped } from '@/lib/utils'; +import { Card, CardImage, CardBody, CardAction, CardActionType } from '@iota/apps-ui-kit'; +import { useFormatCoin, ImageIcon, ImageIconSize, useStakeRewardStatus } from '@iota/core'; +import { IOTA_TYPE_ARG } from '@iota/iota-sdk/utils'; +import { IotaValidatorSummary } from '@iota/iota-sdk/client'; + +export interface StakedTimelockObjectProps { + timelockedStakedObject: TimelockedStakedObjectsGrouped; + handleUnstake: (timelockedStakedObject: TimelockedStakedObjectsGrouped) => void; + getValidatorByAddress: (validatorAddress: string) => IotaValidatorSummary | undefined; + currentEpoch: number; +} + +export function StakedTimelockObject({ + getValidatorByAddress, + timelockedStakedObject, + handleUnstake, + currentEpoch, +}: StakedTimelockObjectProps) { + const name = + getValidatorByAddress(timelockedStakedObject.validatorAddress)?.name || + timelockedStakedObject.validatorAddress; + + // TODO probably we could calculate estimated reward on grouping stage. + const summary = timelockedStakedObject.stakes.reduce( + (acc, stake) => { + const estimatedReward = stake.status === 'Active' ? stake.estimatedReward : 0; + + return { + principal: BigInt(stake.principal) + acc.principal, + estimatedReward: BigInt(estimatedReward) + acc.estimatedReward, + stakeRequestEpoch: stake.stakeRequestEpoch, + }; + }, + { + principal: 0n, + estimatedReward: 0n, + stakeRequestEpoch: '', + }, + ); + + const supportingText = useStakeRewardStatus({ + currentEpoch, + stakeRequestEpoch: summary.stakeRequestEpoch, + estimatedReward: summary.estimatedReward, + inactiveValidator: false, + }); + + const [sumPrincipalFormatted, sumPrincipalSymbol] = useFormatCoin( + summary.principal, + IOTA_TYPE_ARG, + ); + + return ( + <Card onClick={() => handleUnstake(timelockedStakedObject)}> + <CardImage> + <ImageIcon src={null} label={name} fallback={name} size={ImageIconSize.Large} /> + </CardImage> + <CardBody + title={name} + subtitle={`${sumPrincipalFormatted} ${sumPrincipalSymbol}`} + isTextTruncated + /> + <CardAction + type={CardActionType.SupportingText} + title={supportingText.title} + subtitle={supportingText.subtitle} + /> + </Card> + ); +} diff --git a/apps/wallet-dashboard/components/staked-timelock-object/index.ts b/apps/wallet-dashboard/components/staked-timelock-object/index.ts new file mode 100644 index 00000000000..2be2613f3ef --- /dev/null +++ b/apps/wallet-dashboard/components/staked-timelock-object/index.ts @@ -0,0 +1,4 @@ +// Copyright (c) 2024 IOTA Stiftung +// SPDX-License-Identifier: Apache-2.0 + +export * from './StakedTimelockObject'; diff --git a/apps/wallet-dashboard/lib/interfaces/vesting.interface.ts b/apps/wallet-dashboard/lib/interfaces/vesting.interface.ts index c997986f065..ba846d71e6c 100644 --- a/apps/wallet-dashboard/lib/interfaces/vesting.interface.ts +++ b/apps/wallet-dashboard/lib/interfaces/vesting.interface.ts @@ -14,10 +14,11 @@ export interface SupplyIncreaseVestingPayout { export type SupplyIncreaseVestingPortfolio = SupplyIncreaseVestingPayout[]; export interface VestingOverview { - totalVested: number; - totalUnlocked: number; - totalLocked: number; - totalStaked: number; - availableClaiming: number; - availableStaking: number; + totalVested: bigint; + totalUnlocked: bigint; + totalLocked: bigint; + totalStaked: bigint; + totalEarned: bigint; + availableClaiming: bigint; + availableStaking: bigint; } diff --git a/apps/wallet-dashboard/lib/utils/vesting/vesting.spec.ts b/apps/wallet-dashboard/lib/utils/vesting/vesting.spec.ts index 5e1cea77657..e0bb1f37bd5 100644 --- a/apps/wallet-dashboard/lib/utils/vesting/vesting.spec.ts +++ b/apps/wallet-dashboard/lib/utils/vesting/vesting.spec.ts @@ -21,6 +21,10 @@ import { const MOCKED_CURRENT_EPOCH_TIMESTAMP = Date.now() + MILLISECONDS_PER_HOUR * 6; // 6 hours later +function bigIntRound(n: number) { + return BigInt(Math.floor(n)); +} + describe('get last supply increase vesting payout', () => { it('should get the object with highest expirationTimestampMs', () => { const timelockedObjects = MOCKED_SUPPLY_INCREASE_VESTING_TIMELOCKED_OBJECTS; @@ -121,11 +125,12 @@ describe('vesting overview', () => { it('should get correct vesting overview data with timelocked objects', () => { const timelockedObjects = MOCKED_SUPPLY_INCREASE_VESTING_TIMELOCKED_OBJECTS; const lastPayout = timelockedObjects[timelockedObjects.length - 1]; - const totalAmount = + const totalAmount = bigIntRound( (SUPPLY_INCREASE_STAKER_VESTING_DURATION * SUPPLY_INCREASE_VESTING_PAYOUTS_IN_1_YEAR * lastPayout.locked.value) / - 0.9; + 0.9, + ); const vestingOverview = getVestingOverview(timelockedObjects, Date.now()); expect(vestingOverview.totalVested).toEqual(totalAmount); @@ -140,25 +145,31 @@ describe('vesting overview', () => { const lockedAmount = vestingPortfolio.reduce( (acc, current) => - current.expirationTimestampMs > Date.now() ? acc + current.amount : acc, - 0, + current.expirationTimestampMs > Date.now() + ? acc + bigIntRound(current.amount) + : acc, + 0n, ); expect(vestingOverview.totalLocked).toEqual(lockedAmount); expect(vestingOverview.totalUnlocked).toEqual(totalAmount - lockedAmount); // In this scenario there are no staked objects - expect(vestingOverview.totalStaked).toEqual(0); + expect(vestingOverview.totalStaked).toEqual(0n); const lockedObjectsAmount = timelockedObjects.reduce( (acc, current) => - current.expirationTimestampMs > Date.now() ? acc + current.locked.value : acc, - 0, + current.expirationTimestampMs > Date.now() + ? acc + bigIntRound(current.locked.value) + : acc, + 0n, ); const unlockedObjectsAmount = timelockedObjects.reduce( (acc, current) => - current.expirationTimestampMs <= Date.now() ? acc + current.locked.value : acc, - 0, + current.expirationTimestampMs <= Date.now() + ? acc + bigIntRound(current.locked.value) + : acc, + 0n, ); expect(vestingOverview.availableClaiming).toEqual(unlockedObjectsAmount); @@ -172,11 +183,13 @@ describe('vesting overview', () => { const lastPayout = extendedTimelockedStakedObjects[extendedTimelockedStakedObjects.length - 1]; const lastPayoutValue = Number(lastPayout.principal); - const totalAmount = + const totalAmount = bigIntRound( (SUPPLY_INCREASE_STAKER_VESTING_DURATION * SUPPLY_INCREASE_VESTING_PAYOUTS_IN_1_YEAR * lastPayoutValue) / - 0.9; + 0.9, + ); + const vestingOverview = getVestingOverview(extendedTimelockedStakedObjects, Date.now()); expect(vestingOverview.totalVested).toEqual(totalAmount); @@ -190,18 +203,20 @@ describe('vesting overview', () => { const lockedAmount = vestingPortfolio.reduce( (acc, current) => - current.expirationTimestampMs > Date.now() ? acc + current.amount : acc, - 0, + current.expirationTimestampMs > Date.now() + ? acc + bigIntRound(current.amount) + : acc, + 0n, ); expect(vestingOverview.totalLocked).toEqual(lockedAmount); expect(vestingOverview.totalUnlocked).toEqual(totalAmount - lockedAmount); - let totalStaked: number = 0; + let totalStaked = 0n; for (const timelockedStakedObject of timelockedStakedObjects) { const stakesAmount = timelockedStakedObject.stakes.reduce( - (acc, current) => acc + Number(current.principal), - 0, + (acc, current) => acc + bigIntRound(Number(current.principal)), + 0n, ); totalStaked += stakesAmount; } @@ -209,8 +224,8 @@ describe('vesting overview', () => { expect(vestingOverview.totalStaked).toEqual(totalStaked); // In this scenario there are no objects to stake or claim because they are all staked - expect(vestingOverview.availableClaiming).toEqual(0); - expect(vestingOverview.availableStaking).toEqual(0); + expect(vestingOverview.availableClaiming).toEqual(0n); + expect(vestingOverview.availableStaking).toEqual(0n); }); it('should get correct vesting overview data with mixed objects', () => { @@ -224,11 +239,12 @@ describe('vesting overview', () => { mixedObjects, MOCKED_CURRENT_EPOCH_TIMESTAMP, )!; - const totalAmount = + const totalAmount = bigIntRound( (SUPPLY_INCREASE_STAKER_VESTING_DURATION * SUPPLY_INCREASE_VESTING_PAYOUTS_IN_1_YEAR * lastPayout.amount) / - 0.9; + 0.9, + ); const vestingOverview = getVestingOverview(mixedObjects, Date.now()); expect(vestingOverview.totalVested).toEqual(totalAmount); @@ -243,16 +259,18 @@ describe('vesting overview', () => { const lockedAmount = vestingPortfolio.reduce( (acc, current) => - current.expirationTimestampMs > Date.now() ? acc + current.amount : acc, - 0, + current.expirationTimestampMs > Date.now() + ? acc + bigIntRound(current.amount) + : acc, + 0n, ); expect(vestingOverview.totalLocked).toEqual(lockedAmount); expect(vestingOverview.totalUnlocked).toEqual(totalAmount - lockedAmount); const totalStaked = extendedTimelockedStakedObjects.reduce( - (acc, current) => acc + Number(current.principal), - 0, + (acc, current) => acc + bigIntRound(Number(current.principal)), + 0n, ); expect(vestingOverview.totalStaked).toEqual(totalStaked); @@ -260,13 +278,17 @@ describe('vesting overview', () => { const timelockObjects = mixedObjects.filter(isTimelockedObject); const availableClaiming = timelockObjects.reduce( (acc, current) => - current.expirationTimestampMs <= Date.now() ? acc + current.locked.value : acc, - 0, + current.expirationTimestampMs <= Date.now() + ? acc + bigIntRound(current.locked.value) + : acc, + 0n, ); const availableStaking = timelockObjects.reduce( (acc, current) => - current.expirationTimestampMs > Date.now() ? acc + current.locked.value : acc, - 0, + current.expirationTimestampMs > Date.now() + ? acc + bigIntRound(current.locked.value) + : acc, + 0n, ); expect(vestingOverview.availableClaiming).toEqual(availableClaiming); expect(vestingOverview.availableStaking).toEqual(availableStaking); diff --git a/apps/wallet-dashboard/lib/utils/vesting/vesting.ts b/apps/wallet-dashboard/lib/utils/vesting/vesting.ts index c4bd743b5ef..e0bb8a29158 100644 --- a/apps/wallet-dashboard/lib/utils/vesting/vesting.ts +++ b/apps/wallet-dashboard/lib/utils/vesting/vesting.ts @@ -149,52 +149,61 @@ export function getVestingOverview( if (vestingObjects.length === 0 || !latestPayout) { return { - totalVested: 0, - totalUnlocked: 0, - totalLocked: 0, - totalStaked: 0, - availableClaiming: 0, - availableStaking: 0, + totalVested: 0n, + totalUnlocked: 0n, + totalLocked: 0n, + totalStaked: 0n, + totalEarned: 0n, + availableClaiming: 0n, + availableStaking: 0n, }; } const userType = getSupplyIncreaseVestingUserType([latestPayout]); const vestingPayoutsCount = getSupplyIncreaseVestingPayoutsCount(userType!); // Note: we add the initial payout to the total rewards, 10% of the total rewards are paid out immediately - const totalVestedAmount = (vestingPayoutsCount * latestPayout.amount) / 0.9; + const totalVestedAmount = BigInt(Math.floor((vestingPayoutsCount * latestPayout.amount) / 0.9)); const vestingPortfolio = buildSupplyIncreaseVestingSchedule( latestPayout, currentEpochTimestamp, ); const totalLockedAmount = vestingPortfolio.reduce( (acc, current) => - current.expirationTimestampMs > currentEpochTimestamp ? acc + current.amount : acc, - 0, + current.expirationTimestampMs > currentEpochTimestamp + ? acc + BigInt(current.amount) + : acc, + 0n, ); const totalUnlockedVestedAmount = totalVestedAmount - totalLockedAmount; const timelockedStakedObjects = vestingObjects.filter(isTimelockedStakedIota); const totalStaked = timelockedStakedObjects.reduce( - (acc, current) => acc + Number(current.principal), - 0, + (acc, current) => acc + BigInt(current.principal), + 0n, ); + const totalEarned = timelockedStakedObjects + .filter((t) => t.status === 'Active') + .reduce((acc, current) => { + return acc + BigInt(current.estimatedReward); + }, 0n); + const timelockedObjects = vestingObjects.filter(isTimelockedObject); const totalAvailableClaimingAmount = timelockedObjects.reduce( (acc, current) => current.expirationTimestampMs <= currentEpochTimestamp - ? acc + current.locked.value + ? acc + BigInt(current.locked.value) : acc, - 0, + 0n, ); const totalAvailableStakingAmount = timelockedObjects.reduce( (acc, current) => current.expirationTimestampMs > currentEpochTimestamp && current.locked.value >= MIN_STAKING_THRESHOLD - ? acc + current.locked.value + ? acc + BigInt(current.locked.value) : acc, - 0, + 0n, ); return { @@ -202,6 +211,7 @@ export function getVestingOverview( totalUnlocked: totalUnlockedVestedAmount, totalLocked: totalLockedAmount, totalStaked: totalStaked, + totalEarned: totalEarned, availableClaiming: totalAvailableClaimingAmount, availableStaking: totalAvailableStakingAmount, }; From 9b5f33fbf3fa0df5f2e9d2d95a98f117888d935c Mon Sep 17 00:00:00 2001 From: Pavlo Botnar <pavlo.botnar@gmail.com> Date: Wed, 11 Dec 2024 23:10:11 +0200 Subject: [PATCH 29/97] feat(iota-genesis-builder): add address swap map for swapping origin addresses to destination during the migration process (#4314) * feat(iota-genesis-builder): add address swap map for swapping origin addresses to destination during the migration process --------- Co-authored-by: DaughterOfMars <chloedaughterofmars@gmail.com> --- Cargo.lock | 1 + crates/iota-genesis-builder/Cargo.toml | 1 + crates/iota-genesis-builder/src/main.rs | 19 +- .../src/stardust/migration/executor.rs | 37 ++- .../src/stardust/migration/migration.rs | 30 ++- .../src/stardust/migration/tests/basic.rs | 7 +- .../src/stardust/migration/tests/mod.rs | 14 +- .../stardust/migration/verification/alias.rs | 19 +- .../stardust/migration/verification/basic.rs | 31 ++- .../migration/verification/foundry.rs | 6 +- .../stardust/migration/verification/mod.rs | 12 +- .../stardust/migration/verification/nft.rs | 29 +- .../stardust/migration/verification/util.rs | 9 +- .../src/stardust/types/address_swap_map.rs | 255 ++++++++++++++++++ .../src/stardust/types/mod.rs | 1 + 15 files changed, 409 insertions(+), 62 deletions(-) create mode 100644 crates/iota-genesis-builder/src/stardust/types/address_swap_map.rs diff --git a/Cargo.lock b/Cargo.lock index a6985400c04..272c5b18d44 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -6630,6 +6630,7 @@ dependencies = [ "bigdecimal", "camino", "clap", + "csv", "fastcrypto", "flate2", "fs_extra", diff --git a/crates/iota-genesis-builder/Cargo.toml b/crates/iota-genesis-builder/Cargo.toml index 81d3c77ffe1..c62d44ebfbf 100644 --- a/crates/iota-genesis-builder/Cargo.toml +++ b/crates/iota-genesis-builder/Cargo.toml @@ -16,6 +16,7 @@ bcs.workspace = true bigdecimal = "0.4" camino.workspace = true clap.workspace = true +csv = "1.2" fastcrypto.workspace = true flate2.workspace = true fs_extra = "1.3" diff --git a/crates/iota-genesis-builder/src/main.rs b/crates/iota-genesis-builder/src/main.rs index ba782f7b042..403080b5ee7 100644 --- a/crates/iota-genesis-builder/src/main.rs +++ b/crates/iota-genesis-builder/src/main.rs @@ -13,7 +13,7 @@ use iota_genesis_builder::{ stardust::{ migration::{Migration, MigrationTargetNetwork}, parse::HornetSnapshotParser, - types::output_header::OutputHeader, + types::{address_swap_map::AddressSwapMap, output_header::OutputHeader}, }, }; use iota_sdk::types::block::{ @@ -42,6 +42,11 @@ enum Snapshot { Iota { #[clap(long, help = "Path to the Iota Hornet full-snapshot file")] snapshot_path: String, + #[clap( + long, + help = "Path to the address swap map file. This must be a CSV file with two columns, where an entry contains in the first column an IotaAddress present in the Hornet full-snapshot and in the second column an IotaAddress that will be used for the swap." + )] + address_swap_map_path: String, #[clap(long, value_parser = clap::value_parser!(MigrationTargetNetwork), help = "Target network for migration")] target_network: MigrationTargetNetwork, }, @@ -56,11 +61,17 @@ fn main() -> Result<()> { // Parse the CLI arguments let cli = Cli::parse(); - let (snapshot_path, target_network, coin_type) = match cli.snapshot { + let (snapshot_path, address_swap_map_path, target_network, coin_type) = match cli.snapshot { Snapshot::Iota { snapshot_path, + address_swap_map_path, target_network, - } => (snapshot_path, target_network, CoinType::Iota), + } => ( + snapshot_path, + address_swap_map_path, + target_network, + CoinType::Iota, + ), }; // Start the Hornet snapshot parser @@ -73,12 +84,14 @@ fn main() -> Result<()> { CoinType::Iota => scale_amount_for_iota(snapshot_parser.total_supply()?)?, }; + let address_swap_map = AddressSwapMap::from_csv(&address_swap_map_path)?; // Prepare the migration using the parser output stream let migration = Migration::new( snapshot_parser.target_milestone_timestamp(), total_supply, target_network, coin_type, + address_swap_map, )?; // Prepare the writer for the objects snapshot diff --git a/crates/iota-genesis-builder/src/stardust/migration/executor.rs b/crates/iota-genesis-builder/src/stardust/migration/executor.rs index 816123dba63..d11f85c8c00 100644 --- a/crates/iota-genesis-builder/src/stardust/migration/executor.rs +++ b/crates/iota-genesis-builder/src/stardust/migration/executor.rs @@ -35,7 +35,6 @@ use iota_types::{ stardust::{ coin_type::CoinType, output::{Nft, foundry::create_foundry_amount_coin}, - stardust_to_iota_address, stardust_to_iota_address_owner, }, timelock::timelock, transaction::{ @@ -53,7 +52,10 @@ use crate::{ MigrationTargetNetwork, PACKAGE_DEPS, create_migration_context, package_module_bytes, verification::created_objects::CreatedObjects, }, - types::{output_header::OutputHeader, token_scheme::SimpleTokenSchemeU64}, + types::{ + address_swap_map::AddressSwapMap, output_header::OutputHeader, + token_scheme::SimpleTokenSchemeU64, + }, }, }; @@ -307,6 +309,7 @@ impl Executor { header: &OutputHeader, alias: &AliasOutput, coin_type: CoinType, + address_swap_map: &mut AddressSwapMap, ) -> Result<CreatedObjects> { let mut created_objects = CreatedObjects::default(); @@ -316,7 +319,8 @@ impl Executor { let move_alias = iota_types::stardust::output::Alias::try_from_stardust(alias_id, alias)?; // TODO: We should ensure that no circular ownership exists. - let alias_output_owner = stardust_to_iota_address_owner(alias.governor_address())?; + let alias_output_owner = + address_swap_map.swap_stardust_to_iota_address_owner(alias.governor_address())?; let package_deps = InputObjects::new(self.load_packages(PACKAGE_DEPS).collect()); let version = package_deps.lamport_timestamp(&[]); @@ -558,10 +562,14 @@ impl Executor { basic_output: &BasicOutput, target_milestone_timestamp_sec: u32, coin_type: &CoinType, + address_swap_map: &mut AddressSwapMap, ) -> Result<CreatedObjects> { let mut basic = iota_types::stardust::output::BasicOutput::new(header.new_object_id(), basic_output)?; - let owner: IotaAddress = basic_output.address().to_string().parse()?; + + let basic_objects_owner = + address_swap_map.swap_stardust_to_iota_address(basic_output.address())?; + let mut created_objects = CreatedObjects::default(); // The minimum version of the manually created objects @@ -570,11 +578,12 @@ impl Executor { let object = if basic.is_simple_coin(target_milestone_timestamp_sec) { if !basic_output.native_tokens().is_empty() { - let coins = self.create_native_token_coins(basic_output.native_tokens(), owner)?; + let coins = self + .create_native_token_coins(basic_output.native_tokens(), basic_objects_owner)?; created_objects.set_native_tokens(coins)?; } let amount_coin = basic.into_genesis_coin_object( - owner, + basic_objects_owner, &self.protocol_config, &self.tx_context, version, @@ -596,7 +605,7 @@ impl Executor { basic.native_tokens.id = UID::new(self.tx_context.fresh_id()); } let object = basic.to_genesis_object( - owner, + basic_objects_owner, &self.protocol_config, &self.tx_context, version, @@ -618,10 +627,12 @@ impl Executor { output_id: OutputId, basic_output: &BasicOutput, target_milestone_timestamp: u32, + address_swap_map: &mut AddressSwapMap, ) -> Result<CreatedObjects> { let mut created_objects = CreatedObjects::default(); - let owner: IotaAddress = basic_output.address().to_string().parse()?; + let basic_output_owner = + address_swap_map.swap_stardust_to_iota_address(basic_output.address())?; let package_deps = InputObjects::new(self.load_packages(PACKAGE_DEPS).collect()); let version = package_deps.lamport_timestamp(&[]); @@ -631,7 +642,7 @@ impl Executor { let object = timelock::to_genesis_object( timelock, - owner, + basic_output_owner, &self.protocol_config, &self.tx_context, version, @@ -648,6 +659,7 @@ impl Executor { header: &OutputHeader, nft: &NftOutput, coin_type: CoinType, + address_swap_map: &mut AddressSwapMap, ) -> Result<CreatedObjects> { let mut created_objects = CreatedObjects::default(); @@ -657,8 +669,11 @@ impl Executor { let move_nft = Nft::try_from_stardust(nft_id, nft)?; // TODO: We should ensure that no circular ownership exists. - let nft_output_owner_address = stardust_to_iota_address(nft.address())?; - let nft_output_owner = stardust_to_iota_address_owner(nft.address())?; + let nft_output_owner_address = + address_swap_map.swap_stardust_to_iota_address(nft.address())?; + + let nft_output_owner = + address_swap_map.swap_stardust_to_iota_address_owner(nft.address())?; let package_deps = InputObjects::new(self.load_packages(PACKAGE_DEPS).collect()); let version = package_deps.lamport_timestamp(&[]); diff --git a/crates/iota-genesis-builder/src/stardust/migration/migration.rs b/crates/iota-genesis-builder/src/stardust/migration/migration.rs index c07efda78ec..96ef8c7fd2a 100644 --- a/crates/iota-genesis-builder/src/stardust/migration/migration.rs +++ b/crates/iota-genesis-builder/src/stardust/migration/migration.rs @@ -32,7 +32,7 @@ use crate::stardust::{ verification::{created_objects::CreatedObjects, verify_outputs}, }, native_token::package_data::NativeTokenPackageData, - types::output_header::OutputHeader, + types::{address_swap_map::AddressSwapMap, output_header::OutputHeader}, }; /// We fix the protocol version used in the migration. @@ -74,6 +74,7 @@ pub struct Migration { /// The coin type to use in order to migrate outputs. Can only be equal to /// `Iota` at the moment. Is fixed for the entire migration process. coin_type: CoinType, + address_swap_map: AddressSwapMap, } impl Migration { @@ -84,6 +85,7 @@ impl Migration { total_supply: u64, target_network: MigrationTargetNetwork, coin_type: CoinType, + address_swap_map: AddressSwapMap, ) -> Result<Self> { let executor = Executor::new( ProtocolVersion::new(MIGRATION_PROTOCOL_VERSION), @@ -96,6 +98,7 @@ impl Migration { executor, output_objects_map: Default::default(), coin_type, + address_swap_map, }) } @@ -135,7 +138,7 @@ impl Migration { .collect::<Vec<_>>(); info!("Verifying ledger state..."); self.verify_ledger_state(&outputs)?; - + self.address_swap_map.verify_all_addresses_swapped()?; Ok(()) } @@ -194,14 +197,18 @@ impl Migration { ) -> Result<()> { for (header, output) in outputs { let created = match output { - Output::Alias(alias) => { - self.executor - .create_alias_objects(header, alias, self.coin_type)? - } - Output::Nft(nft) => { - self.executor - .create_nft_objects(header, nft, self.coin_type)? - } + Output::Alias(alias) => self.executor.create_alias_objects( + header, + alias, + self.coin_type, + &mut self.address_swap_map, + )?, + Output::Nft(nft) => self.executor.create_nft_objects( + header, + nft, + self.coin_type, + &mut self.address_swap_map, + )?, Output::Basic(basic) => { // All timelocked vested rewards(basic outputs with the specific ID format) // should be migrated as TimeLock<Balance<IOTA>> objects. @@ -214,6 +221,7 @@ impl Migration { header.output_id(), basic, self.target_milestone_timestamp_sec, + &mut self.address_swap_map, )? } else { self.executor.create_basic_objects( @@ -221,6 +229,7 @@ impl Migration { basic, self.target_milestone_timestamp_sec, &self.coin_type, + &mut self.address_swap_map, )? } } @@ -244,6 +253,7 @@ impl Migration { self.target_milestone_timestamp_sec, self.total_supply, self.executor.store(), + &self.address_swap_map, )?; Ok(()) } diff --git a/crates/iota-genesis-builder/src/stardust/migration/tests/basic.rs b/crates/iota-genesis-builder/src/stardust/migration/tests/basic.rs index 3888ef58d1e..b503be9862c 100644 --- a/crates/iota-genesis-builder/src/stardust/migration/tests/basic.rs +++ b/crates/iota-genesis-builder/src/stardust/migration/tests/basic.rs @@ -32,7 +32,7 @@ use crate::stardust::{ random_output_header, unlock_object, }, }, - types::output_header::OutputHeader, + types::{address_swap_map::AddressSwapMap, output_header::OutputHeader}, }; /// Test the id of a `BasicOutput` that is transformed to a simple coin. @@ -53,6 +53,7 @@ fn basic_simple_coin_id() { 1_000_000, MigrationTargetNetwork::Mainnet, CoinType::Iota, + AddressSwapMap::default(), ) .unwrap(); migration @@ -103,6 +104,7 @@ fn basic_simple_coin_id_with_expired_timelock() { 1_000_000, MigrationTargetNetwork::Mainnet, CoinType::Iota, + AddressSwapMap::default(), ) .unwrap(); migration @@ -139,6 +141,7 @@ fn basic_id() { 1_000_000, MigrationTargetNetwork::Mainnet, CoinType::Iota, + AddressSwapMap::default(), ) .unwrap(); migration @@ -183,6 +186,7 @@ fn basic_simple_coin_migration_with_native_token() { 1_000_000, MigrationTargetNetwork::Mainnet, CoinType::Iota, + AddressSwapMap::default(), ) .unwrap(); migration.run_migration(outputs).unwrap(); @@ -225,6 +229,7 @@ fn basic_simple_coin_migration_with_native_tokens() { 1_000_000, MigrationTargetNetwork::Mainnet, CoinType::Iota, + AddressSwapMap::default(), ) .unwrap(); migration.run_migration(outputs.clone()).unwrap(); diff --git a/crates/iota-genesis-builder/src/stardust/migration/tests/mod.rs b/crates/iota-genesis-builder/src/stardust/migration/tests/mod.rs index b55599cdb5a..f694f1b8758 100644 --- a/crates/iota-genesis-builder/src/stardust/migration/tests/mod.rs +++ b/crates/iota-genesis-builder/src/stardust/migration/tests/mod.rs @@ -39,7 +39,10 @@ use crate::stardust::{ }, verification::created_objects::CreatedObjects, }, - types::{output_header::OutputHeader, output_index::random_output_index}, + types::{ + address_swap_map::AddressSwapMap, output_header::OutputHeader, + output_index::random_output_index, + }, }; mod alias; @@ -63,8 +66,13 @@ fn run_migration( outputs: impl IntoIterator<Item = (OutputHeader, Output)>, coin_type: CoinType, ) -> anyhow::Result<(Executor, HashMap<OutputId, CreatedObjects>)> { - let mut migration = - Migration::new(1, total_supply, MigrationTargetNetwork::Mainnet, coin_type)?; + let mut migration = Migration::new( + 1, + total_supply, + MigrationTargetNetwork::Mainnet, + coin_type, + AddressSwapMap::default(), + )?; migration.run_migration(outputs)?; Ok(migration.into_parts()) } diff --git a/crates/iota-genesis-builder/src/stardust/migration/verification/alias.rs b/crates/iota-genesis-builder/src/stardust/migration/verification/alias.rs index f8cf0e1b23a..bc75037c894 100644 --- a/crates/iota-genesis-builder/src/stardust/migration/verification/alias.rs +++ b/crates/iota-genesis-builder/src/stardust/migration/verification/alias.rs @@ -17,15 +17,18 @@ use iota_types::{ }, }; -use crate::stardust::migration::{ - executor::FoundryLedgerData, - verification::{ - created_objects::CreatedObjects, - util::{ - verify_address_owner, verify_issuer_feature, verify_metadata_feature, - verify_native_tokens, verify_parent, verify_sender_feature, +use crate::stardust::{ + migration::{ + executor::FoundryLedgerData, + verification::{ + created_objects::CreatedObjects, + util::{ + verify_address_owner, verify_issuer_feature, verify_metadata_feature, + verify_native_tokens, verify_parent, verify_sender_feature, + }, }, }, + types::address_swap_map::AddressSwapMap, }; pub(super) fn verify_alias_output( @@ -35,6 +38,7 @@ pub(super) fn verify_alias_output( foundry_data: &HashMap<stardust::TokenId, FoundryLedgerData>, storage: &InMemoryStorage, total_value: &mut u64, + address_swap_map: &AddressSwapMap, ) -> anyhow::Result<()> { let alias_id = ObjectID::new(*output.alias_id_non_null(&output_id)); @@ -53,6 +57,7 @@ pub(super) fn verify_alias_output( output.governor_address(), created_output_obj, "alias output", + address_swap_map, )?; // Alias Owner diff --git a/crates/iota-genesis-builder/src/stardust/migration/verification/basic.rs b/crates/iota-genesis-builder/src/stardust/migration/verification/basic.rs index 8748efba4a3..ddd9efb6889 100644 --- a/crates/iota-genesis-builder/src/stardust/migration/verification/basic.rs +++ b/crates/iota-genesis-builder/src/stardust/migration/verification/basic.rs @@ -18,17 +18,20 @@ use iota_types::{ }, }; -use crate::stardust::migration::{ - executor::FoundryLedgerData, - verification::{ - created_objects::CreatedObjects, - util::{ - verify_address_owner, verify_coin, verify_expiration_unlock_condition, - verify_metadata_feature, verify_native_tokens, verify_parent, verify_sender_feature, - verify_storage_deposit_unlock_condition, verify_tag_feature, - verify_timelock_unlock_condition, +use crate::stardust::{ + migration::{ + executor::FoundryLedgerData, + verification::{ + created_objects::CreatedObjects, + util::{ + verify_address_owner, verify_coin, verify_expiration_unlock_condition, + verify_metadata_feature, verify_native_tokens, verify_parent, + verify_sender_feature, verify_storage_deposit_unlock_condition, verify_tag_feature, + verify_timelock_unlock_condition, + }, }, }, + types::address_swap_map::AddressSwapMap, }; pub(super) fn verify_basic_output( @@ -39,6 +42,7 @@ pub(super) fn verify_basic_output( target_milestone_timestamp: u32, storage: &InMemoryStorage, total_value: &mut u64, + address_swap_map: &AddressSwapMap, ) -> Result<()> { // If this is a timelocked vested reward, a `Timelock<Balance>` is created. if is_timelocked_vested_reward(output_id, output, target_milestone_timestamp) { @@ -120,7 +124,12 @@ pub(super) fn verify_basic_output( created_output_obj.owner, ); } else { - verify_address_owner(output.address(), created_output_obj, "basic output")?; + verify_address_owner( + output.address(), + created_output_obj, + "basic output", + address_swap_map, + )?; } // Amount @@ -191,7 +200,7 @@ pub(super) fn verify_basic_output( .as_coin_maybe() .ok_or_else(|| anyhow!("expected a coin"))?; - verify_address_owner(output.address(), created_coin_obj, "coin")?; + verify_address_owner(output.address(), created_coin_obj, "coin", address_swap_map)?; verify_coin(output.amount(), &created_coin)?; *total_value += created_coin.value(); diff --git a/crates/iota-genesis-builder/src/stardust/migration/verification/foundry.rs b/crates/iota-genesis-builder/src/stardust/migration/verification/foundry.rs index da43737ee98..68aed45cfe3 100644 --- a/crates/iota-genesis-builder/src/stardust/migration/verification/foundry.rs +++ b/crates/iota-genesis-builder/src/stardust/migration/verification/foundry.rs @@ -23,7 +23,7 @@ use crate::stardust::{ }, }, native_token::package_data::NativeTokenPackageData, - types::token_scheme::SimpleTokenSchemeU64, + types::{address_swap_map::AddressSwapMap, token_scheme::SimpleTokenSchemeU64}, }; pub(super) fn verify_foundry_output( @@ -33,6 +33,7 @@ pub(super) fn verify_foundry_output( foundry_data: &HashMap<TokenId, FoundryLedgerData>, storage: &InMemoryStorage, total_value: &mut u64, + address_swap_map: &AddressSwapMap, ) -> Result<()> { let foundry_data = foundry_data .get(&output.token_id()) @@ -54,7 +55,7 @@ pub(super) fn verify_foundry_output( .as_coin_maybe() .ok_or_else(|| anyhow!("expected a coin"))?; - verify_address_owner(alias_address, created_coin_obj, "coin")?; + verify_address_owner(alias_address, created_coin_obj, "coin", address_swap_map)?; verify_coin(output.amount(), &created_coin)?; *total_value += created_coin.value(); @@ -239,6 +240,7 @@ pub(super) fn verify_foundry_output( alias_address, coin_manager_treasury_cap_obj, "coin manager treasury cap", + address_swap_map, )?; verify_parent(&output_id, alias_address, storage)?; diff --git a/crates/iota-genesis-builder/src/stardust/migration/verification/mod.rs b/crates/iota-genesis-builder/src/stardust/migration/verification/mod.rs index b2d506680f6..983b19edc96 100644 --- a/crates/iota-genesis-builder/src/stardust/migration/verification/mod.rs +++ b/crates/iota-genesis-builder/src/stardust/migration/verification/mod.rs @@ -11,7 +11,10 @@ use iota_sdk::types::block::output::{Output, OutputId, TokenId}; use iota_types::in_memory_storage::InMemoryStorage; use self::created_objects::CreatedObjects; -use crate::stardust::{migration::executor::FoundryLedgerData, types::output_header::OutputHeader}; +use crate::stardust::{ + migration::executor::FoundryLedgerData, + types::{address_swap_map::AddressSwapMap, output_header::OutputHeader}, +}; pub mod alias; pub mod basic; @@ -27,6 +30,7 @@ pub(crate) fn verify_outputs<'a>( target_milestone_timestamp: u32, total_supply: u64, storage: &InMemoryStorage, + address_swap_map: &AddressSwapMap, ) -> anyhow::Result<()> { let mut total_value = 0; for (header, output) in outputs { @@ -41,6 +45,7 @@ pub(crate) fn verify_outputs<'a>( target_milestone_timestamp, storage, &mut total_value, + address_swap_map, )?; } ensure!( @@ -58,6 +63,7 @@ fn verify_output( target_milestone_timestamp: u32, storage: &InMemoryStorage, total_value: &mut u64, + address_swap_map: &AddressSwapMap, ) -> anyhow::Result<()> { match output { Output::Alias(output) => alias::verify_alias_output( @@ -67,6 +73,7 @@ fn verify_output( foundry_data, storage, total_value, + address_swap_map, ), Output::Basic(output) => basic::verify_basic_output( header.output_id(), @@ -76,6 +83,7 @@ fn verify_output( target_milestone_timestamp, storage, total_value, + address_swap_map, ), Output::Foundry(output) => foundry::verify_foundry_output( header.output_id(), @@ -84,6 +92,7 @@ fn verify_output( foundry_data, storage, total_value, + address_swap_map, ), Output::Nft(output) => nft::verify_nft_output( header.output_id(), @@ -92,6 +101,7 @@ fn verify_output( foundry_data, storage, total_value, + address_swap_map, ), // Treasury outputs aren't used since Stardust, so no need to verify anything here. Output::Treasury(_) => return Ok(()), diff --git a/crates/iota-genesis-builder/src/stardust/migration/verification/nft.rs b/crates/iota-genesis-builder/src/stardust/migration/verification/nft.rs index 04ac251af6d..2d2bdc6fccb 100644 --- a/crates/iota-genesis-builder/src/stardust/migration/verification/nft.rs +++ b/crates/iota-genesis-builder/src/stardust/migration/verification/nft.rs @@ -15,17 +15,20 @@ use iota_types::{ stardust::output::{NFT_DYNAMIC_OBJECT_FIELD_KEY, NFT_DYNAMIC_OBJECT_FIELD_KEY_TYPE}, }; -use crate::stardust::migration::{ - executor::FoundryLedgerData, - verification::{ - created_objects::CreatedObjects, - util::{ - verify_address_owner, verify_expiration_unlock_condition, verify_issuer_feature, - verify_metadata_feature, verify_native_tokens, verify_parent, verify_sender_feature, - verify_storage_deposit_unlock_condition, verify_tag_feature, - verify_timelock_unlock_condition, +use crate::stardust::{ + migration::{ + executor::FoundryLedgerData, + verification::{ + created_objects::CreatedObjects, + util::{ + verify_address_owner, verify_expiration_unlock_condition, verify_issuer_feature, + verify_metadata_feature, verify_native_tokens, verify_parent, + verify_sender_feature, verify_storage_deposit_unlock_condition, verify_tag_feature, + verify_timelock_unlock_condition, + }, }, }, + types::address_swap_map::AddressSwapMap, }; pub(super) fn verify_nft_output( @@ -35,6 +38,7 @@ pub(super) fn verify_nft_output( foundry_data: &HashMap<TokenId, FoundryLedgerData>, storage: &InMemoryStorage, total_value: &mut u64, + address_swap_map: &AddressSwapMap, ) -> anyhow::Result<()> { let created_output_obj = created_objects.output().and_then(|id| { storage @@ -61,7 +65,12 @@ pub(super) fn verify_nft_output( created_output_obj.owner, ); } else { - verify_address_owner(output.address(), created_output_obj, "nft output")?; + verify_address_owner( + output.address(), + created_output_obj, + "nft output", + address_swap_map, + )?; } // NFT Owner diff --git a/crates/iota-genesis-builder/src/stardust/migration/verification/util.rs b/crates/iota-genesis-builder/src/stardust/migration/verification/util.rs index ea1672f6942..5c62e3fc8e7 100644 --- a/crates/iota-genesis-builder/src/stardust/migration/verification/util.rs +++ b/crates/iota-genesis-builder/src/stardust/migration/verification/util.rs @@ -22,13 +22,14 @@ use iota_types::{ object::{Object, Owner}, stardust::{ output::{Alias, Nft, unlock_conditions}, - stardust_to_iota_address, stardust_to_iota_address_owner, + stardust_to_iota_address, }, }; use tracing::warn; use crate::stardust::{ - migration::executor::FoundryLedgerData, types::token_scheme::MAX_ALLOWED_U64_SUPPLY, + migration::executor::FoundryLedgerData, + types::{address_swap_map::AddressSwapMap, token_scheme::MAX_ALLOWED_U64_SUPPLY}, }; pub(super) fn verify_native_tokens<NtKind: NativeTokenKind>( @@ -279,8 +280,10 @@ pub(super) fn verify_address_owner( owning_address: &Address, obj: &Object, name: &str, + address_swap_map: &AddressSwapMap, ) -> Result<()> { - let expected_owner = stardust_to_iota_address_owner(owning_address)?; + let expected_owner = address_swap_map.stardust_to_iota_address_owner(owning_address)?; + ensure!( obj.owner == expected_owner, "{name} owner mismatch: found {}, expected {}", diff --git a/crates/iota-genesis-builder/src/stardust/types/address_swap_map.rs b/crates/iota-genesis-builder/src/stardust/types/address_swap_map.rs new file mode 100644 index 00000000000..7dae6fb6e00 --- /dev/null +++ b/crates/iota-genesis-builder/src/stardust/types/address_swap_map.rs @@ -0,0 +1,255 @@ +// Copyright (c) 2024 IOTA Stiftung +// SPDX-License-Identifier: Apache-2.0 + +use std::collections::HashMap; + +use iota_sdk::types::block::address::Address as StardustAddress; +use iota_types::{base_types::IotaAddress, object::Owner, stardust::stardust_to_iota_address}; + +type OriginAddress = IotaAddress; + +#[derive(Debug)] +pub struct DestinationAddress { + address: IotaAddress, + swapped: bool, +} + +impl DestinationAddress { + fn new(address: IotaAddress) -> Self { + Self { + address, + swapped: false, + } + } + + fn address(&self) -> IotaAddress { + self.address + } + + fn is_swapped(&self) -> bool { + self.swapped + } + + fn set_swapped(&mut self) { + self.swapped = true; + } +} + +#[derive(Debug, Default)] +pub struct AddressSwapMap { + addresses: HashMap<OriginAddress, DestinationAddress>, +} + +impl AddressSwapMap { + /// Retrieves the destination address for a given origin address. + pub fn destination_address(&self, origin_address: &OriginAddress) -> Option<IotaAddress> { + self.addresses + .get(origin_address) + .map(DestinationAddress::address) + } + + /// Retrieves the destination address for a given origin address. + /// Marks the origin address as swapped if found. + fn swap_destination_address(&mut self, origin_address: &OriginAddress) -> Option<IotaAddress> { + self.addresses.get_mut(origin_address).map(|destination| { + // Mark the origin address as swapped + destination.set_swapped(); + destination.address() + }) + } + + /// Verifies that all addresses have been swapped at least once. + /// Returns an error if any address is not swapped. + pub fn verify_all_addresses_swapped(&self) -> anyhow::Result<()> { + let unswapped_addresses = self + .addresses + .values() + .filter_map(|a| (!a.is_swapped()).then_some(a.address())) + .collect::<Vec<_>>(); + if !unswapped_addresses.is_empty() { + anyhow::bail!("unswapped addresses: {:?}", unswapped_addresses); + } + + Ok(()) + } + + /// Converts a [`StardustAddress`] to an [`Owner`] by first + /// converting it to an [`IotaAddress`] and then checking against the + /// swap map for potential address substitutions. + /// + /// If the address exists in the swap map, it is swapped with the + /// mapped destination address before being wrapped into an [`Owner`]. + pub fn stardust_to_iota_address_owner( + &self, + stardust_address: impl Into<StardustAddress>, + ) -> anyhow::Result<Owner> { + let mut address = stardust_to_iota_address(stardust_address)?; + if let Some(addr) = self.destination_address(&address) { + address = addr; + } + Ok(Owner::AddressOwner(address)) + } + + /// Converts a [`StardustAddress`] to an [`Owner`] by first + /// converting it to an [`IotaAddress`] and then checking against the + /// swap map for potential address substitutions. + /// + /// If the address exists in the swap map, it is swapped with the + /// mapped destination address before being wrapped into an [`Owner`]. + pub fn swap_stardust_to_iota_address_owner( + &mut self, + stardust_address: impl Into<StardustAddress>, + ) -> anyhow::Result<Owner> { + let mut address = stardust_to_iota_address(stardust_address)?; + if let Some(addr) = self.swap_destination_address(&address) { + address = addr; + } + Ok(Owner::AddressOwner(address)) + } + + /// Converts a [`StardustAddress`] to an [`IotaAddress`] and + /// checks against the swap map for potential address + /// substitutions. + /// + /// If the address exists in the swap map, it is swapped with the + /// mapped destination address before being returned as an + /// [`IotaAddress`]. + pub fn swap_stardust_to_iota_address( + &mut self, + stardust_address: impl Into<StardustAddress>, + ) -> anyhow::Result<IotaAddress> { + let mut address: IotaAddress = stardust_to_iota_address(stardust_address)?; + if let Some(addr) = self.swap_destination_address(&address) { + address = addr; + } + Ok(address) + } + + /// Initializes an [`AddressSwapMap`] by reading address pairs from a CSV + /// file. + /// + /// The function expects the file to contain two columns: the origin address + /// (first column) and the destination address (second column). These are + /// parsed into a [`HashMap`] that maps origin addresses to tuples + /// containing the destination address and a flag initialized to + /// `false`. + /// + /// # Example CSV File + /// ```csv + /// Origin,Destination + /// iota1qp8h9augeh6tk3uvlxqfapuwv93atv63eqkpru029p6sgvr49eufyz7katr,0xa12b4d6ec3f9a28437d5c8f3e96ba72d3c4e8f5ac98d17b1a3b8e9f2c71d4a3c + /// iota1qp7h2lkjhs6tk3uvlxqfjhlfw34atv63eqkpru356p6sgvr76eufyz1opkh,0x42d8c182eb1f3b2366d353eed4eb02a31d1d7982c0fd44683811d7036be3a85e + /// ``` + /// + /// # Parameters + /// - `file_path`: The relative path to the CSV file containing the address + /// mappings. + /// + /// # Returns + /// - An [`AddressSwapMap`] containing the parsed mappings. + /// + /// # Errors + /// - Returns an error if the file cannot be found, read, or parsed + /// correctly. + /// - Returns an error if the origin or destination addresses cannot be + /// parsed into an [`IotaAddress`]. + pub fn from_csv(file_path: &str) -> Result<AddressSwapMap, anyhow::Error> { + let current_dir = std::env::current_dir()?; + let file_path = current_dir.join(file_path); + let mut reader = csv::ReaderBuilder::new().from_path(file_path)?; + let mut addresses = HashMap::new(); + + verify_headers(reader.headers()?)?; + + for result in reader.records() { + let record = result?; + let origin: OriginAddress = + stardust_to_iota_address(StardustAddress::try_from_bech32(&record[0])?)?; + let destination: DestinationAddress = DestinationAddress::new(record[1].parse()?); + addresses.insert(origin, destination); + } + + Ok(AddressSwapMap { addresses }) + } + + #[cfg(test)] + pub fn addresses(&self) -> &HashMap<OriginAddress, DestinationAddress> { + &self.addresses + } +} + +fn verify_headers(headers: &csv::StringRecord) -> Result<(), anyhow::Error> { + const LEFT_HEADER: &str = "Origin"; + const RIGHT_HEADER: &str = "Destination"; + + if &headers[0] != LEFT_HEADER && &headers[1] != RIGHT_HEADER { + anyhow::bail!("Invalid CSV headers"); + } + Ok(()) +} + +#[cfg(test)] +mod tests { + use std::io::Write; + + use tempfile::NamedTempFile; + + use crate::stardust::types::address_swap_map::AddressSwapMap; + + fn write_temp_file(content: &str) -> NamedTempFile { + let mut file = NamedTempFile::new().unwrap(); + writeln!(file, "{}", content).unwrap(); + file + } + + #[test] + fn test_from_csv_valid_file() { + let content = "Origin,Destination\n\ + iota1qp8h9augeh6tk3uvlxqfapuwv93atv63eqkpru029p6sgvr49eufyz7katr,0xa12b4d6ec3f9a28437d5c8f3e96ba72d3c4e8f5ac98d17b1a3b8e9f2c71d4a3c"; + let file = write_temp_file(content); + let file_path = file.path().to_str().unwrap(); + let result = AddressSwapMap::from_csv(file_path); + assert!(result.is_ok()); + let map = result.unwrap(); + assert_eq!(map.addresses().len(), 1); + } + + #[test] + fn test_from_csv_missing_file() { + let result = AddressSwapMap::from_csv("nonexistent_file.csv"); + assert!(result.is_err()); + } + + #[test] + fn test_from_csv_invalid_headers() { + let content = "wrong_header1,wrong_header2\n\ + iota1qp8h9augeh6tk3uvlxqfapuwv93atv63eqkpru029p6sgvr49eufyz7katr,0xa12b4d6ec3f9a28437d5c8f3e96ba72d3c4e8f5ac98d17b1a3b8e9f2c71d4a3c"; + let file = write_temp_file(content); + let file_path = file.path().to_str().unwrap(); + let result = AddressSwapMap::from_csv(file_path); + assert!(result.is_err()); + } + + #[test] + fn test_from_csv_invalid_record() { + let content = "Origin,Destination\n\ + iota1qp8h9augeh6tk3uvlxqfapuwv93atv63eqkpru029p6sgvr49eufyz7katr,0xa12b4d6ec3f9a28437d5c8f3e96ba72d3c4e8f5ac98d17b1a3b8e9f2c71d4a3c,invalid_number"; + let file = write_temp_file(content); + let file_path = file.path().to_str().unwrap(); + let result = AddressSwapMap::from_csv(file_path); + + assert!(result.is_err()); + } + + #[test] + fn test_from_csv_empty_file() { + let content = "Origin,Destination"; + let file = write_temp_file(content); + let file_path = file.path().to_str().unwrap(); + let result = AddressSwapMap::from_csv(file_path); + assert!(result.is_ok()); + let map = result.unwrap(); + + assert_eq!(map.addresses().len(), 0); + } +} diff --git a/crates/iota-genesis-builder/src/stardust/types/mod.rs b/crates/iota-genesis-builder/src/stardust/types/mod.rs index cf2a0681889..49ea9368cf5 100644 --- a/crates/iota-genesis-builder/src/stardust/types/mod.rs +++ b/crates/iota-genesis-builder/src/stardust/types/mod.rs @@ -1,6 +1,7 @@ // Copyright (c) 2024 IOTA Stiftung // SPDX-License-Identifier: Apache-2.0 +pub mod address_swap_map; pub mod output_header; pub mod output_index; pub mod snapshot; From 415e2471cf434141ddbb9d644f24d6d8c623f1d4 Mon Sep 17 00:00:00 2001 From: cpl121 <100352899+cpl121@users.noreply.github.com> Date: Thu, 12 Dec 2024 09:24:38 +0100 Subject: [PATCH 30/97] feat: add loading screen (#4445) --- apps/wallet-dashboard/app/page.tsx | 84 ++++++++++++++++-------------- 1 file changed, 45 insertions(+), 39 deletions(-) diff --git a/apps/wallet-dashboard/app/page.tsx b/apps/wallet-dashboard/app/page.tsx index c96c01faec9..8901eec400a 100644 --- a/apps/wallet-dashboard/app/page.tsx +++ b/apps/wallet-dashboard/app/page.tsx @@ -3,17 +3,21 @@ 'use client'; -import { ConnectButton, useCurrentAccount, useCurrentWallet } from '@iota/dapp-kit'; -import { useEffect } from 'react'; +import { ConnectButton, useCurrentWallet, useAutoConnectWallet } from '@iota/dapp-kit'; import { redirect } from 'next/navigation'; import { IotaLogoWeb } from '@iota/ui-icons'; import { HOMEPAGE_ROUTE } from '@/lib/constants/routes.constants'; import { Theme, useTheme } from '@iota/core'; +import { LoadingIndicator } from '@iota/apps-ui-kit'; function HomeDashboardPage(): JSX.Element { const { theme } = useTheme(); - const { connectionStatus } = useCurrentWallet(); - const account = useCurrentAccount(); + const { isConnected } = useCurrentWallet(); + const autoConnect = useAutoConnectWallet(); + + if (isConnected) { + redirect(HOMEPAGE_ROUTE.path); + } const CURRENT_YEAR = new Date().getFullYear(); const videoSrc = @@ -21,45 +25,47 @@ function HomeDashboardPage(): JSX.Element { ? 'https://files.iota.org/media/tooling/wallet-dashboard-welcome-dark.mp4' : 'https://files.iota.org/media/tooling/wallet-dashboard-welcome-light.mp4'; - useEffect(() => { - if (connectionStatus === 'connected' && account) { - redirect(HOMEPAGE_ROUTE.path); - } - }, [connectionStatus, account]); - return ( <main className="flex h-screen"> - <div className="relative hidden sm:flex md:w-1/3"> - <video - key={theme} - src={videoSrc} - autoPlay - muted - loop - className="absolute right-0 top-0 h-full w-full min-w-fit object-cover" - disableRemotePlayback - ></video> - </div> - <div className="flex h-full w-full flex-col items-center justify-between p-md sm:p-2xl"> - <IotaLogoWeb width={130} height={32} /> - <div className="flex max-w-sm flex-col items-center gap-8 text-center"> - <div className="flex flex-col items-center gap-4"> - <span className="text-headline-sm text-neutral-40">Welcome to</span> - <h1 className="text-display-lg text-neutral-10 dark:text-neutral-100"> - IOTA Wallet - </h1> - <span className="text-title-lg text-neutral-40"> - Connecting you to the decentralized web and IOTA network - </span> + {autoConnect === 'idle' ? ( + <div className="flex w-full justify-center"> + <LoadingIndicator size="w-16 h-16" /> + </div> + ) : ( + <> + <div className="relative hidden sm:flex md:w-1/3"> + <video + key={theme} + src={videoSrc} + autoPlay + muted + loop + className="absolute right-0 top-0 h-full w-full min-w-fit object-cover" + disableRemotePlayback + ></video> </div> - <div className="[&_button]:!bg-neutral-90 [&_button]:dark:!bg-neutral-20"> - <ConnectButton connectText="Connect" /> + <div className="flex h-full w-full flex-col items-center justify-between p-md sm:p-2xl"> + <IotaLogoWeb width={130} height={32} /> + <div className="flex max-w-sm flex-col items-center gap-8 text-center"> + <div className="flex flex-col items-center gap-4"> + <span className="text-headline-sm text-neutral-40">Welcome to</span> + <h1 className="text-display-lg text-neutral-10 dark:text-neutral-100"> + IOTA Wallet + </h1> + <span className="text-title-lg text-neutral-40"> + Connecting you to the decentralized web and IOTA network + </span> + </div> + <div className="[&_button]:!bg-neutral-90 [&_button]:dark:!bg-neutral-20"> + <ConnectButton connectText="Connect" /> + </div> + </div> + <div className="text-body-lg text-neutral-60"> + © IOTA Foundation {CURRENT_YEAR} + </div> </div> - </div> - <div className="text-body-lg text-neutral-60"> - © IOTA Foundation {CURRENT_YEAR} - </div> - </div> + </> + )} </main> ); } From f6c35ae4406e69ef6e9841346be5089e071621e3 Mon Sep 17 00:00:00 2001 From: Dr-Electron <dr-electr0n@protonmail.com> Date: Thu, 12 Dec 2024 09:25:54 +0100 Subject: [PATCH 31/97] fix: Override package.json ownership in external crates (#4464) * fix: Override package.json ownership in external crates * Update .github/CODEOWNERS --- .github/CODEOWNERS | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index f77a9c2b71b..38bb6687fd2 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -7,10 +7,6 @@ # Changes to the genesis builder should be approved by Konstantinos or Mirko at least /crates/iota-genesis-builder/ @kodemartin @miker83z -# vm-language team -/iota-execution/ @iotaledger/vm-language -/external-crates/ @iotaledger/vm-language - # infrastructure team /docker/ @iotaledger/infrastructure @iotaledger/node @iotaledger/devops-admin /crates/iota-json-rpc*/ @iotaledger/infrastructure @@ -61,6 +57,11 @@ prettier.config.js @iotaledger/tooling turbo.json @iotaledger/tooling vercel.json @iotaledger/tooling +# vm-language team +# Needs to be after package.json ownership definition to override it +/iota-execution/ @iotaledger/vm-language +/external-crates/ @iotaledger/vm-language + # Docs and examples are for DevEx to approve upon /docs/ @iotaledger/devx /examples/ @iotaledger/devx From f11d8ccf59bc9c172890f50bd700ae110e51a71a Mon Sep 17 00:00:00 2001 From: Thibault Martinez <thibault@iota.org> Date: Thu, 12 Dec 2024 09:27:46 +0100 Subject: [PATCH 32/97] chore(ci): remove `tag-docker-hub-images` (#4441) * chore(ci): remove `tag-docker-hub-images` * fmt --- .github/workflows/release.yml | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index f96bae10dc4..cd3e0cc9b07 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -228,15 +228,3 @@ jobs: # env: # # https://github.com/settings/tokens/new?scopes=public_repo,workflow # COMMITTER_TOKEN: ${{ secrets.HOMEBREW_GH_FORMULA_BUMP }} -# -# # Tag all iota images with release tag, so that they can be easily found -# tag-docker-hub-images: -# runs-on: ubuntu-latest -# steps: -# - name: Dispatch Tagging of images in DockerHub, in MystenLabs/sui-operations -# uses: peter-evans/repository-dispatch@ff45666b9427631e3450c54a1bcbee4d9ff4d7c0 # v3.0.0 -# with: -# repository: iotaledger/iota -# token: ${{ secrets.DOCKER_BINARY_BUILDS_DISPATCH }} -# event-type: tag-docker-images -# client-payload: '{"iota_commit": "${{ github.sha }}", "repo_name": "all", "tag": "${{ env.TAG_NAME }}"}' From c477d40a1019a98cc8b6d0e373bc4e2e57f794e5 Mon Sep 17 00:00:00 2001 From: JCNoguera <88061365+VmMad@users.noreply.github.com> Date: Thu, 12 Dec 2024 10:55:29 +0100 Subject: [PATCH 33/97] feat(dashboard): add migration overview (#4329) * feat(dashboard): add migration overview * feat: refine values * fix: update summarizeMigratableObjectValues function --- .../app/(protected)/migrations/page.tsx | 154 ++++++++++++------ apps/wallet-dashboard/lib/utils/migration.ts | 60 ++++++- 2 files changed, 163 insertions(+), 51 deletions(-) diff --git a/apps/wallet-dashboard/app/(protected)/migrations/page.tsx b/apps/wallet-dashboard/app/(protected)/migrations/page.tsx index 4d5324ac6e2..544f352e963 100644 --- a/apps/wallet-dashboard/app/(protected)/migrations/page.tsx +++ b/apps/wallet-dashboard/app/(protected)/migrations/page.tsx @@ -2,14 +2,32 @@ // SPDX-License-Identifier: Apache-2.0 'use client'; -import { VirtualList } from '@/components'; import MigratePopup from '@/components/Popup/Popups/MigratePopup'; -import { useGetStardustMigratableObjects, usePopups } from '@/hooks'; -import { Button } from '@iota/apps-ui-kit'; -import { useCurrentAccount, useIotaClient, useIotaClientContext } from '@iota/dapp-kit'; -import { STARDUST_BASIC_OUTPUT_TYPE, STARDUST_NFT_OUTPUT_TYPE } from '@iota/core'; -import { getNetwork, IotaObjectData } from '@iota/iota-sdk/client'; +import { usePopups } from '@/hooks'; +import { summarizeMigratableObjectValues } from '@/lib/utils'; +import { + Button, + ButtonSize, + ButtonType, + Card, + CardBody, + CardImage, + ImageShape, + Panel, + Title, +} from '@iota/apps-ui-kit'; +import { useCurrentAccount, useIotaClient } from '@iota/dapp-kit'; +import { STARDUST_BASIC_OUTPUT_TYPE, STARDUST_NFT_OUTPUT_TYPE, useFormatCoin } from '@iota/core'; +import { useGetStardustMigratableObjects } from '@/hooks'; import { useQueryClient } from '@tanstack/react-query'; +import { Assets, Clock, IotaLogoMark, Tokens } from '@iota/ui-icons'; +import { IOTA_TYPE_ARG } from '@iota/iota-sdk/utils'; + +interface MigrationDisplayCard { + title: string; + subtitle: string; + icon: React.FC; +} function MigrationDashboardPage(): JSX.Element { const account = useCurrentAccount(); @@ -17,8 +35,6 @@ function MigrationDashboardPage(): JSX.Element { const { openPopup, closePopup } = usePopups(); const queryClient = useQueryClient(); const iotaClient = useIotaClient(); - const { network } = useIotaClientContext(); - const { explorer } = getNetwork(network); const { migratableBasicOutputs, @@ -30,12 +46,6 @@ function MigrationDashboardPage(): JSX.Element { const hasMigratableObjects = migratableBasicOutputs.length > 0 || migratableNftOutputs.length > 0; - const virtualItem = (asset: IotaObjectData): JSX.Element => ( - <a href={`${explorer}/object/${asset.objectId}`} target="_blank" rel="noreferrer"> - {asset.objectId} - </a> - ); - function handleOnSuccess(digest: string): void { iotaClient .waitForTransaction({ @@ -73,41 +83,93 @@ function MigrationDashboardPage(): JSX.Element { ); } + const { + accumulatedIotaAmount: accumulatedTimelockedIotaAmount, + totalNativeTokens, + totalVisualAssets, + } = summarizeMigratableObjectValues({ + migratableBasicOutputs, + migratableNftOutputs, + address, + }); + + const [timelockedIotaTokens, symbol] = useFormatCoin( + accumulatedTimelockedIotaAmount, + IOTA_TYPE_ARG, + ); + + const MIGRATION_CARDS: MigrationDisplayCard[] = [ + { + title: `${timelockedIotaTokens} ${symbol}`, + subtitle: 'IOTA Tokens', + icon: IotaLogoMark, + }, + { + title: `${totalNativeTokens}`, + subtitle: 'Native Tokens', + icon: Tokens, + }, + { + title: `${totalVisualAssets}`, + subtitle: 'Visual Assets', + icon: Assets, + }, + ]; + + const timelockedAssetsAmount = unmigratableBasicOutputs.length + unmigratableNftOutputs.length; + const TIMELOCKED_ASSETS_CARDS: MigrationDisplayCard[] = [ + { + title: `${timelockedAssetsAmount}`, + subtitle: 'Time-locked', + icon: Clock, + }, + ]; + return ( <div className="flex h-full w-full flex-wrap items-center justify-center space-y-4"> - <div className="flex w-1/2 flex-col"> - <h1>Migratable Basic Outputs: {migratableBasicOutputs.length}</h1> - <VirtualList - items={migratableBasicOutputs} - estimateSize={() => 30} - render={virtualItem} - /> - </div> - <div className="flex w-1/2 flex-col"> - <h1>Unmigratable Basic Outputs: {unmigratableBasicOutputs.length}</h1> - <VirtualList - items={unmigratableBasicOutputs} - estimateSize={() => 30} - render={virtualItem} - /> - </div> - <div className="flex w-1/2 flex-col"> - <h1>Migratable NFT Outputs: {migratableNftOutputs.length}</h1> - <VirtualList - items={migratableNftOutputs} - estimateSize={() => 30} - render={virtualItem} - /> - </div> - <div className="flex w-1/2 flex-col"> - <h1>Unmigratable NFT Outputs: {unmigratableNftOutputs.length}</h1> - <VirtualList - items={unmigratableNftOutputs} - estimateSize={() => 30} - render={virtualItem} - /> + <div className="flex w-full flex-row justify-center"> + <div className="flex w-1/3 flex-col gap-md--rs"> + <Panel> + <Title + title="Migration" + trailingElement={ + <Button + text="Migrate All" + disabled={!hasMigratableObjects} + onClick={openMigratePopup} + size={ButtonSize.Small} + /> + } + /> + <div className="flex flex-col gap-xs p-md--rs"> + {MIGRATION_CARDS.map((card) => ( + <Card key={card.subtitle}> + <CardImage shape={ImageShape.SquareRounded}> + <card.icon /> + </CardImage> + <CardBody title={card.title} subtitle={card.subtitle} /> + </Card> + ))} + <Button text="See All" type={ButtonType.Ghost} fullWidth /> + </div> + </Panel> + + <Panel> + <Title title="Time-locked Assets" /> + <div className="flex flex-col gap-xs p-md--rs"> + {TIMELOCKED_ASSETS_CARDS.map((card) => ( + <Card key={card.subtitle}> + <CardImage shape={ImageShape.SquareRounded}> + <card.icon /> + </CardImage> + <CardBody title={card.title} subtitle={card.subtitle} /> + </Card> + ))} + <Button text="See All" type={ButtonType.Ghost} fullWidth /> + </div> + </Panel> + </div> </div> - <Button text="Migrate" disabled={!hasMigratableObjects} onClick={openMigratePopup} /> </div> ); } diff --git a/apps/wallet-dashboard/lib/utils/migration.ts b/apps/wallet-dashboard/lib/utils/migration.ts index 49f54b89867..ee129d4d211 100644 --- a/apps/wallet-dashboard/lib/utils/migration.ts +++ b/apps/wallet-dashboard/lib/utils/migration.ts @@ -20,17 +20,14 @@ export function groupStardustObjectsByMigrationStatus( const epochUnix = epochTimestamp / 1000; for (const outputObject of stardustOutputObjects) { - const outputObjectFields = ( - outputObject.content as unknown as { - fields: CommonOutputObjectWithUc; - } - ).fields; + const outputObjectFields = extractOutputFields(outputObject); if (outputObjectFields.expiration_uc) { const unlockableAddress = outputObjectFields.expiration_uc.fields.unix_time <= epochUnix ? outputObjectFields.expiration_uc.fields.return_address : outputObjectFields.expiration_uc.fields.owner; + if (unlockableAddress !== address) { unmigratable.push(outputObject); continue; @@ -49,3 +46,56 @@ export function groupStardustObjectsByMigrationStatus( return { migratable, unmigratable }; } + +interface MigratableObjectsData { + totalNativeTokens: number; + totalVisualAssets: number; + accumulatedIotaAmount: number; +} + +export function summarizeMigratableObjectValues({ + migratableBasicOutputs, + migratableNftOutputs, + address, +}: { + migratableBasicOutputs: IotaObjectData[]; + migratableNftOutputs: IotaObjectData[]; + address: string; +}): MigratableObjectsData { + let totalNativeTokens = 0; + let totalIotaAmount = 0; + + const totalVisualAssets = migratableNftOutputs.length; + const outputObjects = [...migratableBasicOutputs, ...migratableNftOutputs]; + + for (const output of outputObjects) { + const outputObjectFields = extractOutputFields(output); + + totalIotaAmount += parseInt(outputObjectFields.balance); + totalNativeTokens += parseInt(outputObjectFields.native_tokens.fields.size); + totalIotaAmount += extractStorageDepositReturnAmount(outputObjectFields, address) || 0; + } + + return { totalNativeTokens, totalVisualAssets, accumulatedIotaAmount: totalIotaAmount }; +} + +function extractStorageDepositReturnAmount( + { storage_deposit_return_uc }: CommonOutputObjectWithUc, + address: string, +): number | null { + if ( + storage_deposit_return_uc?.fields && + storage_deposit_return_uc?.fields.return_address === address + ) { + return parseInt(storage_deposit_return_uc?.fields.return_amount); + } + return null; +} + +function extractOutputFields(outputObject: IotaObjectData): CommonOutputObjectWithUc { + return ( + outputObject.content as unknown as { + fields: CommonOutputObjectWithUc; + } + ).fields; +} From 3090a3b79d19b53d3fbc0500bbd3627a9572ee21 Mon Sep 17 00:00:00 2001 From: Marc Espin <mespinsanz@gmail.com> Date: Thu, 12 Dec 2024 11:34:43 +0100 Subject: [PATCH 34/97] fix(pnpm): Update happy-dom to 15.11.7 (#4468) --- apps/explorer/package.json | 2 +- apps/wallet/package.json | 2 +- pnpm-lock.yaml | 889 ++++++++++++++++++++----------------- 3 files changed, 475 insertions(+), 418 deletions(-) diff --git a/apps/explorer/package.json b/apps/explorer/package.json index 7b26ec2aff6..8982b0a9d72 100644 --- a/apps/explorer/package.json +++ b/apps/explorer/package.json @@ -86,7 +86,7 @@ "@vitejs/plugin-react": "^4.3.1", "@vitest/ui": "^0.33.0", "autoprefixer": "^10.4.19", - "happy-dom": "^10.5.1", + "happy-dom": "^15.11.7", "onchange": "^7.1.0", "postcss": "^8.4.31", "start-server-and-test": "^2.0.0", diff --git a/apps/wallet/package.json b/apps/wallet/package.json index c652c639d4c..a240f6170bb 100644 --- a/apps/wallet/package.json +++ b/apps/wallet/package.json @@ -63,7 +63,7 @@ "dotenv": "^16.4.5", "eslint-webpack-plugin": "^4.0.1", "git-rev-sync": "^3.0.2", - "happy-dom": "^10.5.1", + "happy-dom": "^15.11.7", "html-webpack-plugin": "^5.5.3", "mini-css-extract-plugin": "^2.7.6", "onchange": "^7.1.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index d1595c130be..5233dee99b1 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -59,7 +59,7 @@ importers: version: 9.1.0(eslint@8.57.1) eslint-import-resolver-typescript: specifier: ^3.6.1 - version: 3.6.3(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.30.0)(eslint@8.57.1) + version: 3.6.3(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.6.2))(eslint-plugin-import@2.30.0)(eslint@8.57.1) eslint-plugin-header: specifier: ^3.1.1 version: 3.1.1(eslint@8.57.1) @@ -119,7 +119,7 @@ importers: version: link:../../sdk/typescript '@nestjs/cache-manager': specifier: ^2.2.2 - version: 2.2.2(@nestjs/common@10.4.4(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/core@10.4.4)(cache-manager@5.7.6)(rxjs@7.8.1) + version: 2.2.2(@nestjs/common@10.4.4(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/core@10.4.4(@nestjs/common@10.4.4(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/platform-express@10.4.4)(reflect-metadata@0.2.2)(rxjs@7.8.1))(cache-manager@5.7.6)(rxjs@7.8.1) '@nestjs/common': specifier: ^10.0.0 version: 10.4.4(reflect-metadata@0.2.2)(rxjs@7.8.1) @@ -134,7 +134,7 @@ importers: version: 10.4.4(@nestjs/common@10.4.4(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/core@10.4.4) '@nestjs/schedule': specifier: ^4.0.2 - version: 4.1.1(@nestjs/common@10.4.4(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/core@10.4.4) + version: 4.1.1(@nestjs/common@10.4.4(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/core@10.4.4(@nestjs/common@10.4.4(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/platform-express@10.4.4)(reflect-metadata@0.2.2)(rxjs@7.8.1)) cache-manager: specifier: ^5.6.1 version: 5.7.6 @@ -144,13 +144,13 @@ importers: devDependencies: '@nestjs/cli': specifier: ^10.0.0 - version: 10.4.5(@swc/core@1.7.28(@swc/helpers@0.5.5)) + version: 10.4.5(@swc/core@1.7.28) '@nestjs/schematics': specifier: ^10.0.0 version: 10.1.4(chokidar@3.6.0)(typescript@5.6.2) '@nestjs/testing': specifier: ^10.0.0 - version: 10.4.4(@nestjs/common@10.4.4(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/core@10.4.4)(@nestjs/platform-express@10.4.4) + version: 10.4.4(@nestjs/common@10.4.4(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/core@10.4.4(@nestjs/common@10.4.4(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/platform-express@10.4.4)(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/platform-express@10.4.4(@nestjs/common@10.4.4(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/core@10.4.4)) '@types/express': specifier: ^4.17.17 version: 4.17.21 @@ -180,7 +180,7 @@ importers: version: 5.2.1(@types/eslint@8.56.12)(eslint-config-prettier@9.1.0(eslint@8.57.1))(eslint@8.57.1)(prettier@3.3.3) jest: specifier: ^29.5.0 - version: 29.7.0(@types/node@20.16.9)(babel-plugin-macros@3.1.0)(node-notifier@10.0.0)(ts-node@10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(typescript@5.6.2)) + version: 29.7.0(@types/node@20.16.9)(babel-plugin-macros@3.1.0)(node-notifier@10.0.0)(ts-node@10.9.2(@types/node@20.16.9)(typescript@5.6.2)) prettier: specifier: ^3.3.1 version: 3.3.3 @@ -192,13 +192,13 @@ importers: version: 6.3.4 ts-jest: specifier: ^29.1.0 - version: 29.2.5(@babel/core@7.25.2)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.25.2))(jest@29.7.0(@types/node@20.16.9)(babel-plugin-macros@3.1.0)(node-notifier@10.0.0)(ts-node@10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(typescript@5.6.2)))(typescript@5.6.2) + version: 29.2.5(@babel/core@7.25.2)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.25.2))(jest@29.7.0(@types/node@20.16.9)(babel-plugin-macros@3.1.0)(node-notifier@10.0.0)(ts-node@10.9.2(@types/node@20.16.9)(typescript@5.6.2)))(typescript@5.6.2) ts-loader: specifier: ^9.4.4 - version: 9.5.1(typescript@5.6.2)(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))) + version: 9.5.1(typescript@5.6.2)(webpack@5.95.0(@swc/core@1.7.28)) ts-node: specifier: ^10.9.1 - version: 10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(typescript@5.6.2) + version: 10.9.2(@swc/core@1.7.28)(@types/node@20.16.9)(typescript@5.6.2) tsconfig-paths: specifier: ^4.2.0 version: 4.2.0 @@ -277,13 +277,13 @@ importers: devDependencies: '@headlessui/tailwindcss': specifier: ^0.1.3 - version: 0.1.3(tailwindcss@3.4.13(ts-node@10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@22.7.3)(typescript@5.6.2))) + version: 0.1.3(tailwindcss@3.4.13(ts-node@10.9.2(@types/node@22.7.3)(typescript@5.6.2))) '@tailwindcss/aspect-ratio': specifier: ^0.4.2 - version: 0.4.2(tailwindcss@3.4.13(ts-node@10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@22.7.3)(typescript@5.6.2))) + version: 0.4.2(tailwindcss@3.4.13(ts-node@10.9.2(@types/node@22.7.3)(typescript@5.6.2))) '@tailwindcss/forms': specifier: ^0.5.7 - version: 0.5.9(tailwindcss@3.4.13(ts-node@10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@22.7.3)(typescript@5.6.2))) + version: 0.5.9(tailwindcss@3.4.13(ts-node@10.9.2(@types/node@22.7.3)(typescript@5.6.2))) '@types/react': specifier: ^18.3.3 version: 18.3.9 @@ -295,7 +295,7 @@ importers: version: 8.4.47 tailwindcss: specifier: ^3.3.3 - version: 3.4.13(ts-node@10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@22.7.3)(typescript@5.6.2)) + version: 3.4.13(ts-node@10.9.2(@types/node@22.7.3)(typescript@5.6.2)) typescript: specifier: ^5.5.3 version: 5.6.2 @@ -304,7 +304,7 @@ importers: version: 5.4.8(@types/node@22.7.3)(sass@1.79.3)(terser@5.34.0) vitest: specifier: ^2.0.1 - version: 2.1.1(@types/node@22.7.3)(happy-dom@10.11.2)(jsdom@24.1.3)(msw@2.4.9(typescript@5.6.2))(sass@1.79.3)(terser@5.34.0) + version: 2.1.1(@types/node@22.7.3)(happy-dom@15.11.7)(jsdom@24.1.3)(msw@2.4.9(typescript@5.6.2))(sass@1.79.3)(terser@5.34.0) apps/explorer: dependencies: @@ -505,8 +505,8 @@ importers: specifier: ^10.4.19 version: 10.4.20(postcss@8.4.47) happy-dom: - specifier: ^10.5.1 - version: 10.11.2 + specifier: ^15.11.7 + version: 15.11.7 onchange: specifier: ^7.1.0 version: 7.1.0 @@ -518,7 +518,7 @@ importers: version: 2.0.8 tailwindcss: specifier: ^3.3.3 - version: 3.4.13(ts-node@10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(typescript@5.6.2)) + version: 3.4.13(ts-node@10.9.2(@swc/core@1.7.28)(@types/node@20.16.9)(typescript@5.6.2)) tsconfig-paths: specifier: ^4.2.0 version: 4.2.0 @@ -533,7 +533,7 @@ importers: version: 3.3.0(rollup@4.22.4)(typescript@5.6.2)(vite@5.4.8(@types/node@20.16.9)(sass@1.79.3)(terser@5.34.0)) vitest: specifier: ^2.0.1 - version: 2.1.1(@types/node@20.16.9)(@vitest/ui@0.33.0)(happy-dom@10.11.2)(jsdom@24.1.3)(msw@2.4.9(typescript@5.6.2))(sass@1.79.3)(terser@5.34.0) + version: 2.1.1(@types/node@20.16.9)(@vitest/ui@0.33.0)(happy-dom@15.11.7)(jsdom@24.1.3)(msw@2.4.9(typescript@5.6.2))(sass@1.79.3)(terser@5.34.0) apps/ui-icons: devDependencies: @@ -645,7 +645,7 @@ importers: version: 4.0.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@7.6.20) tailwindcss: specifier: ^3.3.3 - version: 3.4.13(ts-node@10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(typescript@5.6.2)) + version: 3.4.13(ts-node@10.9.2(@swc/core@1.7.28)(@types/node@20.16.9)(typescript@5.6.2)) typescript: specifier: ^5.5.3 version: 5.6.2 @@ -910,7 +910,7 @@ importers: version: 0.10.7 '@types/webpack': specifier: ^5.28.1 - version: 5.28.5(@swc/core@1.7.28(@swc/helpers@0.5.5))(webpack-cli@5.1.4) + version: 5.28.5(@swc/core@1.7.28)(webpack-cli@5.1.4(webpack@5.95.0)) '@types/zxcvbn': specifier: ^4.4.1 version: 4.4.5 @@ -919,31 +919,31 @@ importers: version: 4.3.1(vite@5.4.8(@types/node@20.16.9)(sass@1.79.3)(terser@5.34.0)) copy-webpack-plugin: specifier: ^11.0.0 - version: 11.0.0(webpack@5.95.0) + version: 11.0.0(webpack@5.95.0(@swc/core@1.7.28)(webpack-cli@5.1.4)) cross-env: specifier: ^7.0.3 version: 7.0.3 css-loader: specifier: ^6.7.3 - version: 6.11.0(webpack@5.95.0) + version: 6.11.0(webpack@5.95.0(@swc/core@1.7.28)(webpack-cli@5.1.4)) dotenv: specifier: ^16.4.5 version: 16.4.5 eslint-webpack-plugin: specifier: ^4.0.1 - version: 4.2.0(eslint@8.57.1)(webpack@5.95.0) + version: 4.2.0(eslint@8.57.1)(webpack@5.95.0(@swc/core@1.7.28)(webpack-cli@5.1.4)) git-rev-sync: specifier: ^3.0.2 version: 3.0.2 happy-dom: - specifier: ^10.5.1 - version: 10.11.2 + specifier: ^15.11.7 + version: 15.11.7 html-webpack-plugin: specifier: ^5.5.3 - version: 5.6.0(webpack@5.95.0) + version: 5.6.0(webpack@5.95.0(@swc/core@1.7.28)(webpack-cli@5.1.4)) mini-css-extract-plugin: specifier: ^2.7.6 - version: 2.9.1(webpack@5.95.0) + version: 2.9.1(webpack@5.95.0(@swc/core@1.7.28)(webpack-cli@5.1.4)) onchange: specifier: ^7.1.0 version: 7.1.0 @@ -952,7 +952,7 @@ importers: version: 8.4.47 postcss-loader: specifier: ^7.3.3 - version: 7.3.4(postcss@8.4.47)(typescript@5.6.2)(webpack@5.95.0) + version: 7.3.4(postcss@8.4.47)(typescript@5.6.2)(webpack@5.95.0(@swc/core@1.7.28)(webpack-cli@5.1.4)) postcss-preset-env: specifier: ^9.0.0 version: 9.6.0(postcss@8.4.47) @@ -961,19 +961,19 @@ importers: version: 1.79.3 sass-loader: specifier: ^13.3.2 - version: 13.3.3(sass@1.79.3)(webpack@5.95.0) + version: 13.3.3(sass@1.79.3)(webpack@5.95.0(@swc/core@1.7.28)(webpack-cli@5.1.4)) tailwindcss: specifier: ^3.3.3 - version: 3.4.13(ts-node@10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(typescript@5.6.2)) + version: 3.4.13(ts-node@10.9.2(@swc/core@1.7.28)(@types/node@20.16.9)(typescript@5.6.2)) tailwindcss-animate: specifier: ^1.0.7 - version: 1.0.7(tailwindcss@3.4.13(ts-node@10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(typescript@5.6.2))) + version: 1.0.7(tailwindcss@3.4.13(ts-node@10.9.2(@swc/core@1.7.28)(@types/node@20.16.9)(typescript@5.6.2))) ts-loader: specifier: ^9.4.4 - version: 9.5.1(typescript@5.6.2)(webpack@5.95.0) + version: 9.5.1(typescript@5.6.2)(webpack@5.95.0(@swc/core@1.7.28)(webpack-cli@5.1.4)) ts-node: specifier: ^10.9.1 - version: 10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(typescript@5.6.2) + version: 10.9.2(@swc/core@1.7.28)(@types/node@20.16.9)(typescript@5.6.2) tsconfig-paths: specifier: ^4.2.0 version: 4.2.0 @@ -988,13 +988,13 @@ importers: version: 4.3.2(typescript@5.6.2)(vite@5.4.8(@types/node@20.16.9)(sass@1.79.3)(terser@5.34.0)) vitest: specifier: ^2.0.1 - version: 2.1.1(@types/node@20.16.9)(@vitest/ui@0.33.0)(happy-dom@10.11.2)(jsdom@24.1.3)(msw@2.4.9(typescript@5.6.2))(sass@1.79.3)(terser@5.34.0) + version: 2.1.1(@types/node@20.16.9)(@vitest/ui@0.33.0)(happy-dom@15.11.7)(jsdom@24.1.3)(msw@2.4.9(typescript@5.6.2))(sass@1.79.3)(terser@5.34.0) web-ext: specifier: ^7.6.2 version: 7.12.0(body-parser@1.20.3) webpack: specifier: ^5.79.0 - version: 5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(webpack-cli@5.1.4) + version: 5.95.0(@swc/core@1.7.28)(webpack-cli@5.1.4) webpack-cli: specifier: ^5.0.1 version: 5.1.4(webpack@5.95.0) @@ -1067,16 +1067,16 @@ importers: version: 14.2.3(eslint@8.57.1)(typescript@5.6.2) jest: specifier: ^29.5.0 - version: 29.7.0(@types/node@20.16.9)(babel-plugin-macros@3.1.0)(node-notifier@10.0.0)(ts-node@10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(typescript@5.6.2)) + version: 29.7.0(@types/node@20.16.9)(babel-plugin-macros@3.1.0)(node-notifier@10.0.0)(ts-node@10.9.2(@types/node@20.16.9)(typescript@5.6.2)) postcss: specifier: ^8.4.31 version: 8.4.47 tailwindcss: specifier: ^3.3.3 - version: 3.4.13(ts-node@10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(typescript@5.6.2)) + version: 3.4.13(ts-node@10.9.2(@swc/core@1.7.28)(@types/node@20.16.9)(typescript@5.6.2)) ts-jest: specifier: ^29.1.0 - version: 29.2.5(@babel/core@7.25.2)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.25.2))(jest@29.7.0(@types/node@20.16.9)(babel-plugin-macros@3.1.0)(node-notifier@10.0.0)(ts-node@10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(typescript@5.6.2)))(typescript@5.6.2) + version: 29.2.5(@babel/core@7.25.2)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.25.2))(jest@29.7.0(@types/node@20.16.9)(babel-plugin-macros@3.1.0)(node-notifier@10.0.0)(ts-node@10.9.2(@types/node@20.16.9)(typescript@5.6.2)))(typescript@5.6.2) typescript: specifier: ^5.5.3 version: 5.6.2 @@ -1116,7 +1116,7 @@ importers: devDependencies: '@headlessui/tailwindcss': specifier: ^0.1.3 - version: 0.1.3(tailwindcss@3.4.13(ts-node@10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@22.7.3)(typescript@5.6.2))) + version: 0.1.3(tailwindcss@3.4.13(ts-node@10.9.2(@types/node@22.7.3)(typescript@5.6.2))) '@types/react': specifier: ^18.3.3 version: 18.3.9 @@ -1134,7 +1134,7 @@ importers: version: 8.4.47 tailwindcss: specifier: ^3.3.3 - version: 3.4.13(ts-node@10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@22.7.3)(typescript@5.6.2)) + version: 3.4.13(ts-node@10.9.2(@types/node@22.7.3)(typescript@5.6.2)) typescript: specifier: ^5.5.3 version: 5.6.2 @@ -1228,7 +1228,7 @@ importers: devDependencies: '@tailwindcss/forms': specifier: ^0.5.7 - version: 0.5.9(tailwindcss@3.4.13(ts-node@10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@22.7.3)(typescript@5.6.2))) + version: 0.5.9(tailwindcss@3.4.13(ts-node@10.9.2(@types/node@22.7.3)(typescript@5.6.2))) '@tsconfig/docusaurus': specifier: ^2.0.3 version: 2.0.3 @@ -1249,10 +1249,10 @@ importers: version: 8.4.47 tailwindcss: specifier: ^3.3.3 - version: 3.4.13(ts-node@10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@22.7.3)(typescript@5.6.2)) + version: 3.4.13(ts-node@10.9.2(@types/node@22.7.3)(typescript@5.6.2)) tailwindcss-animate: specifier: ^1.0.7 - version: 1.0.7(tailwindcss@3.4.13(ts-node@10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@22.7.3)(typescript@5.6.2))) + version: 1.0.7(tailwindcss@3.4.13(ts-node@10.9.2(@types/node@22.7.3)(typescript@5.6.2))) typescript: specifier: ^5.5.3 version: 5.6.2 @@ -1298,7 +1298,7 @@ importers: version: 8.4.47 tailwindcss: specifier: ^3.3.3 - version: 3.4.13(ts-node@10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@22.7.3)(typescript@5.6.2)) + version: 3.4.13(ts-node@10.9.2(@types/node@22.7.3)(typescript@5.6.2)) typescript: specifier: ^5.5.3 version: 5.6.2 @@ -1316,25 +1316,25 @@ importers: version: 3.6.1(@algolia/client-search@4.24.0)(@types/react@18.3.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@docusaurus/core': specifier: 3.5.2 - version: 3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) + version: 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) '@docusaurus/preset-classic': specifier: 3.5.2 - version: 3.5.2(@algolia/client-search@4.24.0)(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/react@18.3.9)(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) + version: 3.5.2(@algolia/client-search@4.24.0)(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@types/react@18.3.9)(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) '@docusaurus/remark-plugin-npm2yarn': specifier: ^3.5.2 version: 3.5.2 '@docusaurus/theme-common': specifier: ^3.5.2 - version: 3.5.2(@docusaurus/plugin-content-docs@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16))(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2) + version: 3.5.2(@docusaurus/plugin-content-docs@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16))(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2) '@docusaurus/theme-live-codeblock': specifier: ^3.5.2 - version: 3.5.2(@docusaurus/plugin-content-docs@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16))(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) + version: 3.5.2(@docusaurus/plugin-content-docs@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16))(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) '@docusaurus/theme-mermaid': specifier: ^3.5.2 - version: 3.5.2(@docusaurus/plugin-content-docs@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) + version: 3.5.2(@docusaurus/plugin-content-docs@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) '@docusaurus/theme-search-algolia': specifier: ^3.5.2 - version: 3.5.2(@algolia/client-search@4.24.0)(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/react@18.3.9)(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) + version: 3.5.2(@algolia/client-search@4.24.0)(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@types/react@18.3.9)(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) '@emotion/react': specifier: ^11.11.4 version: 11.13.3(@types/react@18.3.9)(react@18.3.1) @@ -1343,7 +1343,7 @@ importers: version: 11.13.0(@emotion/react@11.13.3(@types/react@18.3.9)(react@18.3.1))(@types/react@18.3.9)(react@18.3.1) '@graphql-markdown/docusaurus': specifier: ^1.24.1 - version: 1.26.2(@docusaurus/logger@3.5.2)(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(graphql-config@5.1.2(@types/node@22.7.3)(graphql@16.9.0)(typescript@5.6.2))(graphql@16.9.0)(prettier@3.3.3)(typescript@5.6.2) + version: 1.26.2(@docusaurus/logger@3.5.2)(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(graphql-config@5.1.2(@types/node@22.7.3)(graphql@16.9.0)(typescript@5.6.2))(graphql@16.9.0)(prettier@3.3.3)(typescript@5.6.2) '@graphql-tools/graphql-file-loader': specifier: ^8.0.1 version: 8.0.1(graphql@16.9.0) @@ -1379,7 +1379,7 @@ importers: version: 3.2.0 docusaurus-theme-search-typesense: specifier: 0.20.0-0 - version: 0.20.0-0(iea5eyhbiud2dlcqtud2g4pxzm) + version: 0.20.0-0(@algolia/client-search@4.24.0)(@babel/runtime@7.25.6)(@docusaurus/core@3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16))(@docusaurus/theme-common@3.5.2(@docusaurus/plugin-content-docs@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16))(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2))(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/react@18.3.9)(algoliasearch@4.24.0)(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) dotenv: specifier: ^16.4.5 version: 16.4.5 @@ -1436,7 +1436,7 @@ importers: version: 6.0.0 tailwindcss: specifier: ^3.3.3 - version: 3.4.13(ts-node@10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@22.7.3)(typescript@5.6.2)) + version: 3.4.13(ts-node@10.9.2(@types/node@22.7.3)(typescript@5.6.2)) web3: specifier: ^4.2.2 version: 4.13.0(typescript@5.6.2)(zod@3.23.8) @@ -1446,13 +1446,13 @@ importers: version: 7.25.2(@babel/core@7.25.2) '@docusaurus/module-type-aliases': specifier: 3.5.2 - version: 3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@docusaurus/tsconfig': specifier: 3.5.2 version: 3.5.2 '@docusaurus/types': specifier: 3.5.2 - version: 3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@metamask/providers': specifier: ^10.2.1 version: 10.2.1 @@ -1495,7 +1495,7 @@ importers: version: 5.6.2 vitest: specifier: ^2.0.1 - version: 2.1.1(@types/node@22.7.3)(happy-dom@10.11.2)(jsdom@24.1.3)(msw@2.4.9(typescript@5.6.2))(sass@1.79.3)(terser@5.34.0) + version: 2.1.1(@types/node@22.7.3)(happy-dom@15.11.7)(jsdom@24.1.3)(msw@2.4.9(typescript@5.6.2))(sass@1.79.3)(terser@5.34.0) sdk/build-scripts: dependencies: @@ -1758,7 +1758,7 @@ importers: version: 5.4.8(@types/node@22.7.3)(sass@1.79.3)(terser@5.34.0) vitest: specifier: ^2.0.1 - version: 2.1.1(@types/node@22.7.3)(happy-dom@10.11.2)(jsdom@24.1.3)(msw@2.4.9(typescript@5.6.2))(sass@1.79.3)(terser@5.34.0) + version: 2.1.1(@types/node@22.7.3)(happy-dom@15.11.7)(jsdom@24.1.3)(msw@2.4.9(typescript@5.6.2))(sass@1.79.3)(terser@5.34.0) sdk/graphql-transport: dependencies: @@ -1813,7 +1813,7 @@ importers: version: 5.6.2 vitest: specifier: ^2.0.1 - version: 2.1.1(@types/node@20.16.9)(@vitest/ui@0.33.0)(happy-dom@10.11.2)(jsdom@24.1.3)(msw@2.4.9(typescript@5.6.2))(sass@1.79.3)(terser@5.34.0) + version: 2.1.1(@types/node@20.16.9)(@vitest/ui@0.33.0)(happy-dom@15.11.7)(jsdom@24.1.3)(msw@2.4.9(typescript@5.6.2))(sass@1.79.3)(terser@5.34.0) wait-on: specifier: ^7.2.0 version: 7.2.0 @@ -1847,7 +1847,7 @@ importers: version: 5.4.8(@types/node@22.7.3)(sass@1.79.3)(terser@5.34.0) vitest: specifier: ^2.0.1 - version: 2.1.1(@types/node@22.7.3)(happy-dom@10.11.2)(jsdom@24.1.3)(msw@2.4.9(typescript@5.6.2))(sass@1.79.3)(terser@5.34.0) + version: 2.1.1(@types/node@22.7.3)(happy-dom@15.11.7)(jsdom@24.1.3)(msw@2.4.9(typescript@5.6.2))(sass@1.79.3)(terser@5.34.0) wait-on: specifier: ^7.2.0 version: 7.2.0 @@ -1887,7 +1887,7 @@ importers: version: 5.6.2 vitest: specifier: ^2.0.1 - version: 2.1.1(@types/node@20.16.9)(@vitest/ui@0.33.0)(happy-dom@10.11.2)(jsdom@24.1.3)(msw@2.4.9(typescript@5.6.2))(sass@1.79.3)(terser@5.34.0) + version: 2.1.1(@types/node@20.16.9)(@vitest/ui@0.33.0)(happy-dom@15.11.7)(jsdom@24.1.3)(msw@2.4.9(typescript@5.6.2))(sass@1.79.3)(terser@5.34.0) sdk/move-bytecode-template: devDependencies: @@ -1902,7 +1902,7 @@ importers: version: 5.6.2 vitest: specifier: ^2.0.1 - version: 2.1.1(@types/node@22.7.3)(happy-dom@10.11.2)(jsdom@24.1.3)(msw@2.4.9(typescript@5.6.2))(sass@1.79.3)(terser@5.34.0) + version: 2.1.1(@types/node@22.7.3)(happy-dom@15.11.7)(jsdom@24.1.3)(msw@2.4.9(typescript@5.6.2))(sass@1.79.3)(terser@5.34.0) wasm-pack: specifier: ^0.13.0 version: 0.13.0 @@ -2005,7 +2005,7 @@ importers: version: 5.4.8(@types/node@20.16.9)(sass@1.79.3)(terser@5.34.0) vitest: specifier: ^2.0.1 - version: 2.1.1(@types/node@20.16.9)(@vitest/ui@0.33.0)(happy-dom@10.11.2)(jsdom@24.1.3)(msw@2.4.9(typescript@5.6.2))(sass@1.79.3)(terser@5.34.0) + version: 2.1.1(@types/node@20.16.9)(@vitest/ui@0.33.0)(happy-dom@15.11.7)(jsdom@24.1.3)(msw@2.4.9(typescript@5.6.2))(sass@1.79.3)(terser@5.34.0) wait-on: specifier: ^7.2.0 version: 7.2.0 @@ -2030,7 +2030,7 @@ importers: version: 5.6.2 typescript-json-schema: specifier: ^0.64.0 - version: 0.64.0(@swc/core@1.7.28(@swc/helpers@0.5.5)) + version: 0.64.0(@swc/core@1.7.28) packages: @@ -10823,8 +10823,9 @@ packages: engines: {node: '>=0.4.7'} hasBin: true - happy-dom@10.11.2: - resolution: {integrity: sha512-rzgmLjLkhyaOdFEyU8CWXzbgyCyM7wJHLqhaoeEVSTyur1fjcUaiNTHx+D4CPaLvx16tGy+SBPd9TVnP/kzL3w==} + happy-dom@15.11.7: + resolution: {integrity: sha512-KyrFvnl+J9US63TEzwoiJOQzZBJY7KgBushJA8X61DMbNsH+2ONkDuLDnCnwUiPTF42tLoEmrPyoqbenVA5zrg==} + engines: {node: '>=18.0.0'} har-schema@2.0.0: resolution: {integrity: sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==} @@ -16508,10 +16509,6 @@ packages: resolution: {integrity: sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==} engines: {node: '>=0.8.0'} - whatwg-encoding@2.0.0: - resolution: {integrity: sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==} - engines: {node: '>=12'} - whatwg-encoding@3.1.1: resolution: {integrity: sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==} engines: {node: '>=18'} @@ -18503,7 +18500,7 @@ snapshots: transitivePeerDependencies: - '@algolia/client-search' - '@docusaurus/core@3.4.0(@docusaurus/types@3.4.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16)': + '@docusaurus/core@3.4.0(@docusaurus/types@3.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16)': dependencies: '@babel/core': 7.25.2 '@babel/generator': 7.25.6 @@ -18517,12 +18514,12 @@ snapshots: '@babel/traverse': 7.25.6 '@docusaurus/cssnano-preset': 3.4.0 '@docusaurus/logger': 3.4.0 - '@docusaurus/mdx-loader': 3.4.0(@docusaurus/types@3.4.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2) - '@docusaurus/utils': 3.4.0(@docusaurus/types@3.4.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(typescript@5.6.2) - '@docusaurus/utils-common': 3.4.0(@docusaurus/types@3.4.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) - '@docusaurus/utils-validation': 3.4.0(@docusaurus/types@3.4.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(typescript@5.6.2) + '@docusaurus/mdx-loader': 3.4.0(@docusaurus/types@3.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2) + '@docusaurus/utils': 3.4.0(@docusaurus/types@3.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.6.2) + '@docusaurus/utils-common': 3.4.0(@docusaurus/types@3.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + '@docusaurus/utils-validation': 3.4.0(@docusaurus/types@3.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.6.2) autoprefixer: 10.4.20(postcss@8.4.47) - babel-loader: 9.2.1(@babel/core@7.25.2)(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))) + babel-loader: 9.2.1(@babel/core@7.25.2)(webpack@5.95.0) babel-plugin-dynamic-import-node: 2.3.3 boxen: 6.2.1 chalk: 4.1.2 @@ -18531,34 +18528,34 @@ snapshots: cli-table3: 0.6.5 combine-promises: 1.2.0 commander: 5.1.0 - copy-webpack-plugin: 11.0.0(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))) + copy-webpack-plugin: 11.0.0(webpack@5.95.0) core-js: 3.38.1 - css-loader: 6.11.0(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))) - css-minimizer-webpack-plugin: 5.0.1(clean-css@5.3.3)(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))) + css-loader: 6.11.0(webpack@5.95.0) + css-minimizer-webpack-plugin: 5.0.1(clean-css@5.3.3)(webpack@5.95.0) cssnano: 6.1.2(postcss@8.4.47) del: 6.1.1 detect-port: 1.6.1 escape-html: 1.0.3 eta: 2.2.0 eval: 0.1.8 - file-loader: 6.2.0(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))) + file-loader: 6.2.0(webpack@5.95.0) fs-extra: 11.2.0 html-minifier-terser: 7.2.0 html-tags: 3.3.1 - html-webpack-plugin: 5.6.0(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))) + html-webpack-plugin: 5.6.0(webpack@5.95.0) leven: 3.1.0 lodash: 4.17.21 - mini-css-extract-plugin: 2.9.1(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))) + mini-css-extract-plugin: 2.9.1(webpack@5.95.0) p-map: 4.0.0 postcss: 8.4.47 - postcss-loader: 7.3.4(postcss@8.4.47)(typescript@5.6.2)(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))) + postcss-loader: 7.3.4(postcss@8.4.47)(typescript@5.6.2)(webpack@5.95.0) prompts: 2.4.2 react: 18.3.1 - react-dev-utils: 12.0.1(eslint@8.57.1)(typescript@5.6.2)(vue-template-compiler@2.7.16)(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))) + react-dev-utils: 12.0.1(eslint@8.57.1)(typescript@5.6.2)(vue-template-compiler@2.7.16)(webpack@5.95.0) react-dom: 18.3.1(react@18.3.1) react-helmet-async: 1.3.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react-loadable: '@docusaurus/react-loadable@6.0.0(react@18.3.1)' - react-loadable-ssr-addon-v5-slorber: 1.0.1(@docusaurus/react-loadable@6.0.0(react@18.3.1))(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))) + react-loadable-ssr-addon-v5-slorber: 1.0.1(@docusaurus/react-loadable@6.0.0(react@18.3.1))(webpack@5.95.0) react-router: 5.3.4(react@18.3.1) react-router-config: 5.1.1(react-router@5.3.4(react@18.3.1))(react@18.3.1) react-router-dom: 5.3.4(react@18.3.1) @@ -18566,15 +18563,15 @@ snapshots: semver: 7.6.3 serve-handler: 6.1.5 shelljs: 0.8.5 - terser-webpack-plugin: 5.3.10(@swc/core@1.7.28(@swc/helpers@0.5.5))(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))) + terser-webpack-plugin: 5.3.10(webpack@5.95.0) tslib: 2.7.0 update-notifier: 6.0.2 - url-loader: 4.1.1(file-loader@6.2.0(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))))(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))) - webpack: 5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5)) + url-loader: 4.1.1(file-loader@6.2.0(webpack@5.95.0))(webpack@5.95.0) + webpack: 5.95.0 webpack-bundle-analyzer: 4.10.2 - webpack-dev-server: 4.15.2(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))) + webpack-dev-server: 4.15.2(webpack@5.95.0) webpack-merge: 5.10.0 - webpackbar: 5.0.2(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))) + webpackbar: 5.0.2(webpack@5.95.0) transitivePeerDependencies: - '@docusaurus/types' - '@parcel/css' @@ -18594,7 +18591,7 @@ snapshots: - vue-template-compiler - webpack-cli - '@docusaurus/core@3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16)': + '@docusaurus/core@3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16)': dependencies: '@babel/core': 7.25.2 '@babel/generator': 7.25.6 @@ -18608,13 +18605,13 @@ snapshots: '@babel/traverse': 7.25.6 '@docusaurus/cssnano-preset': 3.5.2 '@docusaurus/logger': 3.5.2 - '@docusaurus/mdx-loader': 3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2) - '@docusaurus/utils': 3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(typescript@5.6.2) - '@docusaurus/utils-common': 3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) - '@docusaurus/utils-validation': 3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(typescript@5.6.2) + '@docusaurus/mdx-loader': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2) + '@docusaurus/utils': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.6.2) + '@docusaurus/utils-common': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + '@docusaurus/utils-validation': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.6.2) '@mdx-js/react': 3.0.1(@types/react@18.3.9)(react@18.3.1) autoprefixer: 10.4.20(postcss@8.4.47) - babel-loader: 9.2.1(@babel/core@7.25.2)(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))) + babel-loader: 9.2.1(@babel/core@7.25.2)(webpack@5.95.0) babel-plugin-dynamic-import-node: 2.3.3 boxen: 6.2.1 chalk: 4.1.2 @@ -18623,34 +18620,34 @@ snapshots: cli-table3: 0.6.5 combine-promises: 1.2.0 commander: 5.1.0 - copy-webpack-plugin: 11.0.0(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))) + copy-webpack-plugin: 11.0.0(webpack@5.95.0) core-js: 3.38.1 - css-loader: 6.11.0(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))) - css-minimizer-webpack-plugin: 5.0.1(clean-css@5.3.3)(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))) + css-loader: 6.11.0(webpack@5.95.0) + css-minimizer-webpack-plugin: 5.0.1(clean-css@5.3.3)(webpack@5.95.0) cssnano: 6.1.2(postcss@8.4.47) del: 6.1.1 detect-port: 1.6.1 escape-html: 1.0.3 eta: 2.2.0 eval: 0.1.8 - file-loader: 6.2.0(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))) + file-loader: 6.2.0(webpack@5.95.0) fs-extra: 11.2.0 html-minifier-terser: 7.2.0 html-tags: 3.3.1 - html-webpack-plugin: 5.6.0(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))) + html-webpack-plugin: 5.6.0(webpack@5.95.0) leven: 3.1.0 lodash: 4.17.21 - mini-css-extract-plugin: 2.9.1(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))) + mini-css-extract-plugin: 2.9.1(webpack@5.95.0) p-map: 4.0.0 postcss: 8.4.47 - postcss-loader: 7.3.4(postcss@8.4.47)(typescript@5.6.2)(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))) + postcss-loader: 7.3.4(postcss@8.4.47)(typescript@5.6.2)(webpack@5.95.0) prompts: 2.4.2 react: 18.3.1 - react-dev-utils: 12.0.1(eslint@8.57.1)(typescript@5.6.2)(vue-template-compiler@2.7.16)(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))) + react-dev-utils: 12.0.1(eslint@8.57.1)(typescript@5.6.2)(vue-template-compiler@2.7.16)(webpack@5.95.0) react-dom: 18.3.1(react@18.3.1) react-helmet-async: 1.3.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react-loadable: '@docusaurus/react-loadable@6.0.0(react@18.3.1)' - react-loadable-ssr-addon-v5-slorber: 1.0.1(@docusaurus/react-loadable@6.0.0(react@18.3.1))(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))) + react-loadable-ssr-addon-v5-slorber: 1.0.1(@docusaurus/react-loadable@6.0.0(react@18.3.1))(webpack@5.95.0) react-router: 5.3.4(react@18.3.1) react-router-config: 5.1.1(react-router@5.3.4(react@18.3.1))(react@18.3.1) react-router-dom: 5.3.4(react@18.3.1) @@ -18658,15 +18655,15 @@ snapshots: semver: 7.6.3 serve-handler: 6.1.5 shelljs: 0.8.5 - terser-webpack-plugin: 5.3.10(@swc/core@1.7.28(@swc/helpers@0.5.5))(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))) + terser-webpack-plugin: 5.3.10(webpack@5.95.0) tslib: 2.7.0 update-notifier: 6.0.2 - url-loader: 4.1.1(file-loader@6.2.0(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))))(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))) - webpack: 5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5)) + url-loader: 4.1.1(file-loader@6.2.0(webpack@5.95.0))(webpack@5.95.0) + webpack: 5.95.0 webpack-bundle-analyzer: 4.10.2 - webpack-dev-server: 4.15.2(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))) + webpack-dev-server: 4.15.2(webpack@5.95.0) webpack-merge: 5.10.0 - webpackbar: 5.0.2(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))) + webpackbar: 5.0.2(webpack@5.95.0) transitivePeerDependencies: - '@docusaurus/types' - '@parcel/css' @@ -18710,16 +18707,16 @@ snapshots: chalk: 4.1.2 tslib: 2.7.0 - '@docusaurus/mdx-loader@3.4.0(@docusaurus/types@3.4.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)': + '@docusaurus/mdx-loader@3.4.0(@docusaurus/types@3.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)': dependencies: '@docusaurus/logger': 3.4.0 - '@docusaurus/utils': 3.4.0(@docusaurus/types@3.4.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(typescript@5.6.2) - '@docusaurus/utils-validation': 3.4.0(@docusaurus/types@3.4.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(typescript@5.6.2) + '@docusaurus/utils': 3.4.0(@docusaurus/types@3.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.6.2) + '@docusaurus/utils-validation': 3.4.0(@docusaurus/types@3.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.6.2) '@mdx-js/mdx': 3.0.1 '@slorber/remark-comment': 1.0.0 escape-html: 1.0.3 estree-util-value-to-estree: 3.1.2 - file-loader: 6.2.0(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))) + file-loader: 6.2.0(webpack@5.95.0) fs-extra: 11.2.0 image-size: 1.1.1 mdast-util-mdx: 3.0.0 @@ -18735,9 +18732,9 @@ snapshots: tslib: 2.7.0 unified: 11.0.5 unist-util-visit: 5.0.0 - url-loader: 4.1.1(file-loader@6.2.0(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))))(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))) + url-loader: 4.1.1(file-loader@6.2.0(webpack@5.95.0))(webpack@5.95.0) vfile: 6.0.3 - webpack: 5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5)) + webpack: 5.95.0 transitivePeerDependencies: - '@docusaurus/types' - '@swc/core' @@ -18747,16 +18744,16 @@ snapshots: - uglify-js - webpack-cli - '@docusaurus/mdx-loader@3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)': + '@docusaurus/mdx-loader@3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)': dependencies: '@docusaurus/logger': 3.5.2 - '@docusaurus/utils': 3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(typescript@5.6.2) - '@docusaurus/utils-validation': 3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(typescript@5.6.2) + '@docusaurus/utils': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.6.2) + '@docusaurus/utils-validation': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.6.2) '@mdx-js/mdx': 3.0.1 '@slorber/remark-comment': 1.0.0 escape-html: 1.0.3 estree-util-value-to-estree: 3.1.2 - file-loader: 6.2.0(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))) + file-loader: 6.2.0(webpack@5.95.0) fs-extra: 11.2.0 image-size: 1.1.1 mdast-util-mdx: 3.0.0 @@ -18772,9 +18769,9 @@ snapshots: tslib: 2.7.0 unified: 11.0.5 unist-util-visit: 5.0.0 - url-loader: 4.1.1(file-loader@6.2.0(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))))(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))) + url-loader: 4.1.1(file-loader@6.2.0(webpack@5.95.0))(webpack@5.95.0) vfile: 6.0.3 - webpack: 5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5)) + webpack: 5.95.0 transitivePeerDependencies: - '@docusaurus/types' - '@swc/core' @@ -18784,9 +18781,9 @@ snapshots: - uglify-js - webpack-cli - '@docusaurus/module-type-aliases@3.4.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@docusaurus/module-type-aliases@3.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@docusaurus/types': 3.4.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@docusaurus/types': 3.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@types/history': 4.7.11 '@types/react': 18.3.9 '@types/react-router-config': 5.0.11 @@ -18802,9 +18799,9 @@ snapshots: - uglify-js - webpack-cli - '@docusaurus/module-type-aliases@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@docusaurus/module-type-aliases@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@docusaurus/types': 3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@docusaurus/types': 3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@types/history': 4.7.11 '@types/react': 18.3.9 '@types/react-router-config': 5.0.11 @@ -18820,17 +18817,17 @@ snapshots: - uglify-js - webpack-cli - '@docusaurus/plugin-content-blog@3.5.2(@docusaurus/plugin-content-docs@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16)': + '@docusaurus/plugin-content-blog@3.5.2(@docusaurus/plugin-content-docs@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16)': dependencies: - '@docusaurus/core': 3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) + '@docusaurus/core': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) '@docusaurus/logger': 3.5.2 - '@docusaurus/mdx-loader': 3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2) - '@docusaurus/plugin-content-docs': 3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) - '@docusaurus/theme-common': 3.5.2(@docusaurus/plugin-content-docs@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16))(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2) - '@docusaurus/types': 3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@docusaurus/utils': 3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(typescript@5.6.2) - '@docusaurus/utils-common': 3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) - '@docusaurus/utils-validation': 3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(typescript@5.6.2) + '@docusaurus/mdx-loader': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2) + '@docusaurus/plugin-content-docs': 3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) + '@docusaurus/theme-common': 3.5.2(@docusaurus/plugin-content-docs@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16))(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2) + '@docusaurus/types': 3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@docusaurus/utils': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.6.2) + '@docusaurus/utils-common': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + '@docusaurus/utils-validation': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.6.2) cheerio: 1.0.0-rc.12 feed: 4.2.2 fs-extra: 11.2.0 @@ -18842,7 +18839,7 @@ snapshots: tslib: 2.7.0 unist-util-visit: 5.0.0 utility-types: 3.11.0 - webpack: 5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5)) + webpack: 5.95.0 transitivePeerDependencies: - '@mdx-js/react' - '@parcel/css' @@ -18862,16 +18859,16 @@ snapshots: - vue-template-compiler - webpack-cli - '@docusaurus/plugin-content-docs@3.4.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16)': + '@docusaurus/plugin-content-docs@3.4.0(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16)': dependencies: - '@docusaurus/core': 3.4.0(@docusaurus/types@3.4.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) + '@docusaurus/core': 3.4.0(@docusaurus/types@3.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) '@docusaurus/logger': 3.4.0 - '@docusaurus/mdx-loader': 3.4.0(@docusaurus/types@3.4.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2) - '@docusaurus/module-type-aliases': 3.4.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@docusaurus/types': 3.4.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@docusaurus/utils': 3.4.0(@docusaurus/types@3.4.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(typescript@5.6.2) - '@docusaurus/utils-common': 3.4.0(@docusaurus/types@3.4.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) - '@docusaurus/utils-validation': 3.4.0(@docusaurus/types@3.4.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(typescript@5.6.2) + '@docusaurus/mdx-loader': 3.4.0(@docusaurus/types@3.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2) + '@docusaurus/module-type-aliases': 3.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@docusaurus/types': 3.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@docusaurus/utils': 3.4.0(@docusaurus/types@3.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.6.2) + '@docusaurus/utils-common': 3.4.0(@docusaurus/types@3.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + '@docusaurus/utils-validation': 3.4.0(@docusaurus/types@3.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.6.2) '@types/react-router-config': 5.0.11 combine-promises: 1.2.0 fs-extra: 11.2.0 @@ -18881,7 +18878,7 @@ snapshots: react-dom: 18.3.1(react@18.3.1) tslib: 2.7.0 utility-types: 3.11.0 - webpack: 5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5)) + webpack: 5.95.0 transitivePeerDependencies: - '@parcel/css' - '@rspack/core' @@ -18900,17 +18897,17 @@ snapshots: - vue-template-compiler - webpack-cli - '@docusaurus/plugin-content-docs@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16)': + '@docusaurus/plugin-content-docs@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16)': dependencies: - '@docusaurus/core': 3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) + '@docusaurus/core': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) '@docusaurus/logger': 3.5.2 - '@docusaurus/mdx-loader': 3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2) - '@docusaurus/module-type-aliases': 3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@docusaurus/theme-common': 3.5.2(@docusaurus/plugin-content-docs@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16))(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2) - '@docusaurus/types': 3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@docusaurus/utils': 3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(typescript@5.6.2) - '@docusaurus/utils-common': 3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) - '@docusaurus/utils-validation': 3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(typescript@5.6.2) + '@docusaurus/mdx-loader': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2) + '@docusaurus/module-type-aliases': 3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@docusaurus/theme-common': 3.5.2(@docusaurus/plugin-content-docs@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16))(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2) + '@docusaurus/types': 3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@docusaurus/utils': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.6.2) + '@docusaurus/utils-common': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + '@docusaurus/utils-validation': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.6.2) '@types/react-router-config': 5.0.11 combine-promises: 1.2.0 fs-extra: 11.2.0 @@ -18920,7 +18917,7 @@ snapshots: react-dom: 18.3.1(react@18.3.1) tslib: 2.7.0 utility-types: 3.11.0 - webpack: 5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5)) + webpack: 5.95.0 transitivePeerDependencies: - '@mdx-js/react' - '@parcel/css' @@ -18940,18 +18937,18 @@ snapshots: - vue-template-compiler - webpack-cli - '@docusaurus/plugin-content-pages@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16)': + '@docusaurus/plugin-content-pages@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16)': dependencies: - '@docusaurus/core': 3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) - '@docusaurus/mdx-loader': 3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2) - '@docusaurus/types': 3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@docusaurus/utils': 3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(typescript@5.6.2) - '@docusaurus/utils-validation': 3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(typescript@5.6.2) + '@docusaurus/core': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) + '@docusaurus/mdx-loader': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2) + '@docusaurus/types': 3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@docusaurus/utils': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.6.2) + '@docusaurus/utils-validation': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.6.2) fs-extra: 11.2.0 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) tslib: 2.7.0 - webpack: 5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5)) + webpack: 5.95.0 transitivePeerDependencies: - '@mdx-js/react' - '@parcel/css' @@ -18971,11 +18968,11 @@ snapshots: - vue-template-compiler - webpack-cli - '@docusaurus/plugin-debug@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16)': + '@docusaurus/plugin-debug@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16)': dependencies: - '@docusaurus/core': 3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) - '@docusaurus/types': 3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@docusaurus/utils': 3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(typescript@5.6.2) + '@docusaurus/core': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) + '@docusaurus/types': 3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@docusaurus/utils': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.6.2) fs-extra: 11.2.0 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) @@ -19000,11 +18997,11 @@ snapshots: - vue-template-compiler - webpack-cli - '@docusaurus/plugin-google-analytics@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16)': + '@docusaurus/plugin-google-analytics@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16)': dependencies: - '@docusaurus/core': 3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) - '@docusaurus/types': 3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@docusaurus/utils-validation': 3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(typescript@5.6.2) + '@docusaurus/core': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) + '@docusaurus/types': 3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@docusaurus/utils-validation': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.6.2) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) tslib: 2.7.0 @@ -19027,11 +19024,11 @@ snapshots: - vue-template-compiler - webpack-cli - '@docusaurus/plugin-google-gtag@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16)': + '@docusaurus/plugin-google-gtag@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16)': dependencies: - '@docusaurus/core': 3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) - '@docusaurus/types': 3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@docusaurus/utils-validation': 3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(typescript@5.6.2) + '@docusaurus/core': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) + '@docusaurus/types': 3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@docusaurus/utils-validation': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.6.2) '@types/gtag.js': 0.0.12 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) @@ -19055,11 +19052,11 @@ snapshots: - vue-template-compiler - webpack-cli - '@docusaurus/plugin-google-tag-manager@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16)': + '@docusaurus/plugin-google-tag-manager@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16)': dependencies: - '@docusaurus/core': 3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) - '@docusaurus/types': 3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@docusaurus/utils-validation': 3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(typescript@5.6.2) + '@docusaurus/core': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) + '@docusaurus/types': 3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@docusaurus/utils-validation': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.6.2) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) tslib: 2.7.0 @@ -19082,14 +19079,14 @@ snapshots: - vue-template-compiler - webpack-cli - '@docusaurus/plugin-sitemap@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16)': + '@docusaurus/plugin-sitemap@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16)': dependencies: - '@docusaurus/core': 3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) + '@docusaurus/core': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) '@docusaurus/logger': 3.5.2 - '@docusaurus/types': 3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@docusaurus/utils': 3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(typescript@5.6.2) - '@docusaurus/utils-common': 3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) - '@docusaurus/utils-validation': 3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(typescript@5.6.2) + '@docusaurus/types': 3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@docusaurus/utils': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.6.2) + '@docusaurus/utils-common': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + '@docusaurus/utils-validation': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.6.2) fs-extra: 11.2.0 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) @@ -19114,21 +19111,21 @@ snapshots: - vue-template-compiler - webpack-cli - '@docusaurus/preset-classic@3.5.2(@algolia/client-search@4.24.0)(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/react@18.3.9)(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16)': - dependencies: - '@docusaurus/core': 3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) - '@docusaurus/plugin-content-blog': 3.5.2(@docusaurus/plugin-content-docs@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) - '@docusaurus/plugin-content-docs': 3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) - '@docusaurus/plugin-content-pages': 3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) - '@docusaurus/plugin-debug': 3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) - '@docusaurus/plugin-google-analytics': 3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) - '@docusaurus/plugin-google-gtag': 3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) - '@docusaurus/plugin-google-tag-manager': 3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) - '@docusaurus/plugin-sitemap': 3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) - '@docusaurus/theme-classic': 3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/react@18.3.9)(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) - '@docusaurus/theme-common': 3.5.2(@docusaurus/plugin-content-docs@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16))(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2) - '@docusaurus/theme-search-algolia': 3.5.2(@algolia/client-search@4.24.0)(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/react@18.3.9)(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) - '@docusaurus/types': 3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@docusaurus/preset-classic@3.5.2(@algolia/client-search@4.24.0)(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@types/react@18.3.9)(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16)': + dependencies: + '@docusaurus/core': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) + '@docusaurus/plugin-content-blog': 3.5.2(@docusaurus/plugin-content-docs@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) + '@docusaurus/plugin-content-docs': 3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) + '@docusaurus/plugin-content-pages': 3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) + '@docusaurus/plugin-debug': 3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) + '@docusaurus/plugin-google-analytics': 3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) + '@docusaurus/plugin-google-gtag': 3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) + '@docusaurus/plugin-google-tag-manager': 3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) + '@docusaurus/plugin-sitemap': 3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) + '@docusaurus/theme-classic': 3.5.2(@types/react@18.3.9)(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) + '@docusaurus/theme-common': 3.5.2(@docusaurus/plugin-content-docs@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16))(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2) + '@docusaurus/theme-search-algolia': 3.5.2(@algolia/client-search@4.24.0)(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@types/react@18.3.9)(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) + '@docusaurus/types': 3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) transitivePeerDependencies: @@ -19168,20 +19165,20 @@ snapshots: transitivePeerDependencies: - supports-color - '@docusaurus/theme-classic@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/react@18.3.9)(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16)': + '@docusaurus/theme-classic@3.5.2(@types/react@18.3.9)(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16)': dependencies: - '@docusaurus/core': 3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) - '@docusaurus/mdx-loader': 3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2) - '@docusaurus/module-type-aliases': 3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@docusaurus/plugin-content-blog': 3.5.2(@docusaurus/plugin-content-docs@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) - '@docusaurus/plugin-content-docs': 3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) - '@docusaurus/plugin-content-pages': 3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) - '@docusaurus/theme-common': 3.5.2(@docusaurus/plugin-content-docs@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16))(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2) + '@docusaurus/core': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) + '@docusaurus/mdx-loader': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2) + '@docusaurus/module-type-aliases': 3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@docusaurus/plugin-content-blog': 3.5.2(@docusaurus/plugin-content-docs@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) + '@docusaurus/plugin-content-docs': 3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) + '@docusaurus/plugin-content-pages': 3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) + '@docusaurus/theme-common': 3.5.2(@docusaurus/plugin-content-docs@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16))(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2) '@docusaurus/theme-translations': 3.5.2 - '@docusaurus/types': 3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@docusaurus/utils': 3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(typescript@5.6.2) - '@docusaurus/utils-common': 3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) - '@docusaurus/utils-validation': 3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(typescript@5.6.2) + '@docusaurus/types': 3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@docusaurus/utils': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.6.2) + '@docusaurus/utils-common': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + '@docusaurus/utils-validation': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.6.2) '@mdx-js/react': 3.0.1(@types/react@18.3.9)(react@18.3.1) clsx: 2.1.1 copy-text-to-clipboard: 3.2.0 @@ -19216,13 +19213,13 @@ snapshots: - vue-template-compiler - webpack-cli - '@docusaurus/theme-common@3.5.2(@docusaurus/plugin-content-docs@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16))(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)': + '@docusaurus/theme-common@3.5.2(@docusaurus/plugin-content-docs@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16))(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)': dependencies: - '@docusaurus/mdx-loader': 3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2) - '@docusaurus/module-type-aliases': 3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@docusaurus/plugin-content-docs': 3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) - '@docusaurus/utils': 3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(typescript@5.6.2) - '@docusaurus/utils-common': 3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + '@docusaurus/mdx-loader': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2) + '@docusaurus/module-type-aliases': 3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@docusaurus/plugin-content-docs': 3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) + '@docusaurus/utils': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.6.2) + '@docusaurus/utils-common': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) '@types/history': 4.7.11 '@types/react': 18.3.9 '@types/react-router-config': 5.0.11 @@ -19242,12 +19239,12 @@ snapshots: - uglify-js - webpack-cli - '@docusaurus/theme-live-codeblock@3.5.2(@docusaurus/plugin-content-docs@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16))(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16)': + '@docusaurus/theme-live-codeblock@3.5.2(@docusaurus/plugin-content-docs@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16))(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16)': dependencies: - '@docusaurus/core': 3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) - '@docusaurus/theme-common': 3.5.2(@docusaurus/plugin-content-docs@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16))(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2) + '@docusaurus/core': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) + '@docusaurus/theme-common': 3.5.2(@docusaurus/plugin-content-docs@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16))(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2) '@docusaurus/theme-translations': 3.5.2 - '@docusaurus/utils-validation': 3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(typescript@5.6.2) + '@docusaurus/utils-validation': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.6.2) '@philpl/buble': 0.19.7 clsx: 2.1.1 fs-extra: 11.2.0 @@ -19276,13 +19273,13 @@ snapshots: - vue-template-compiler - webpack-cli - '@docusaurus/theme-mermaid@3.5.2(@docusaurus/plugin-content-docs@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16)': + '@docusaurus/theme-mermaid@3.5.2(@docusaurus/plugin-content-docs@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16)': dependencies: - '@docusaurus/core': 3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) - '@docusaurus/module-type-aliases': 3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@docusaurus/theme-common': 3.5.2(@docusaurus/plugin-content-docs@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16))(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2) - '@docusaurus/types': 3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@docusaurus/utils-validation': 3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(typescript@5.6.2) + '@docusaurus/core': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) + '@docusaurus/module-type-aliases': 3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@docusaurus/theme-common': 3.5.2(@docusaurus/plugin-content-docs@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16))(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2) + '@docusaurus/types': 3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@docusaurus/utils-validation': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.6.2) mermaid: 10.9.3 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) @@ -19307,16 +19304,16 @@ snapshots: - vue-template-compiler - webpack-cli - '@docusaurus/theme-search-algolia@3.5.2(@algolia/client-search@4.24.0)(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/react@18.3.9)(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16)': + '@docusaurus/theme-search-algolia@3.5.2(@algolia/client-search@4.24.0)(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@types/react@18.3.9)(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16)': dependencies: '@docsearch/react': 3.6.1(@algolia/client-search@4.24.0)(@types/react@18.3.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@docusaurus/core': 3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) + '@docusaurus/core': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) '@docusaurus/logger': 3.5.2 - '@docusaurus/plugin-content-docs': 3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) - '@docusaurus/theme-common': 3.5.2(@docusaurus/plugin-content-docs@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16))(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2) + '@docusaurus/plugin-content-docs': 3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) + '@docusaurus/theme-common': 3.5.2(@docusaurus/plugin-content-docs@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16))(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2) '@docusaurus/theme-translations': 3.5.2 - '@docusaurus/utils': 3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(typescript@5.6.2) - '@docusaurus/utils-validation': 3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(typescript@5.6.2) + '@docusaurus/utils': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.6.2) + '@docusaurus/utils-validation': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.6.2) algoliasearch: 4.24.0 algoliasearch-helper: 3.22.5(algoliasearch@4.24.0) clsx: 2.1.1 @@ -19362,7 +19359,7 @@ snapshots: '@docusaurus/tsconfig@3.5.2': {} - '@docusaurus/types@3.4.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@docusaurus/types@3.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@mdx-js/mdx': 3.0.1 '@types/history': 4.7.11 @@ -19373,7 +19370,7 @@ snapshots: react-dom: 18.3.1(react@18.3.1) react-helmet-async: 1.3.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) utility-types: 3.11.0 - webpack: 5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5)) + webpack: 5.95.0 webpack-merge: 5.10.0 transitivePeerDependencies: - '@swc/core' @@ -19382,7 +19379,7 @@ snapshots: - uglify-js - webpack-cli - '@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@mdx-js/mdx': 3.0.1 '@types/history': 4.7.11 @@ -19393,7 +19390,7 @@ snapshots: react-dom: 18.3.1(react@18.3.1) react-helmet-async: 1.3.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) utility-types: 3.11.0 - webpack: 5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5)) + webpack: 5.95.0 webpack-merge: 5.10.0 transitivePeerDependencies: - '@swc/core' @@ -19402,29 +19399,29 @@ snapshots: - uglify-js - webpack-cli - '@docusaurus/utils-common@3.4.0(@docusaurus/types@3.4.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))': + '@docusaurus/utils-common@3.4.0(@docusaurus/types@3.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1))': dependencies: tslib: 2.7.0 optionalDependencies: - '@docusaurus/types': 3.4.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@docusaurus/types': 3.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@docusaurus/utils-common@3.4.0(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))': + '@docusaurus/utils-common@3.4.0(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))': dependencies: tslib: 2.7.0 optionalDependencies: - '@docusaurus/types': 3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@docusaurus/types': 3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@docusaurus/utils-common@3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))': + '@docusaurus/utils-common@3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))': dependencies: tslib: 2.7.0 optionalDependencies: - '@docusaurus/types': 3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@docusaurus/types': 3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@docusaurus/utils-validation@3.4.0(@docusaurus/types@3.4.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(typescript@5.6.2)': + '@docusaurus/utils-validation@3.4.0(@docusaurus/types@3.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.6.2)': dependencies: '@docusaurus/logger': 3.4.0 - '@docusaurus/utils': 3.4.0(@docusaurus/types@3.4.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(typescript@5.6.2) - '@docusaurus/utils-common': 3.4.0(@docusaurus/types@3.4.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + '@docusaurus/utils': 3.4.0(@docusaurus/types@3.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.6.2) + '@docusaurus/utils-common': 3.4.0(@docusaurus/types@3.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) fs-extra: 11.2.0 joi: 17.13.3 js-yaml: 4.1.0 @@ -19439,11 +19436,11 @@ snapshots: - uglify-js - webpack-cli - '@docusaurus/utils-validation@3.4.0(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(typescript@5.6.2)': + '@docusaurus/utils-validation@3.4.0(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.6.2)': dependencies: '@docusaurus/logger': 3.4.0 - '@docusaurus/utils': 3.4.0(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(typescript@5.6.2) - '@docusaurus/utils-common': 3.4.0(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + '@docusaurus/utils': 3.4.0(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.6.2) + '@docusaurus/utils-common': 3.4.0(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) fs-extra: 11.2.0 joi: 17.13.3 js-yaml: 4.1.0 @@ -19458,11 +19455,11 @@ snapshots: - uglify-js - webpack-cli - '@docusaurus/utils-validation@3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(typescript@5.6.2)': + '@docusaurus/utils-validation@3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.6.2)': dependencies: '@docusaurus/logger': 3.5.2 - '@docusaurus/utils': 3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(typescript@5.6.2) - '@docusaurus/utils-common': 3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + '@docusaurus/utils': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.6.2) + '@docusaurus/utils-common': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) fs-extra: 11.2.0 joi: 17.13.3 js-yaml: 4.1.0 @@ -19477,13 +19474,13 @@ snapshots: - uglify-js - webpack-cli - '@docusaurus/utils@3.4.0(@docusaurus/types@3.4.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(typescript@5.6.2)': + '@docusaurus/utils@3.4.0(@docusaurus/types@3.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.6.2)': dependencies: '@docusaurus/logger': 3.4.0 - '@docusaurus/utils-common': 3.4.0(@docusaurus/types@3.4.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + '@docusaurus/utils-common': 3.4.0(@docusaurus/types@3.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) '@svgr/webpack': 8.1.0(typescript@5.6.2) escape-string-regexp: 4.0.0 - file-loader: 6.2.0(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))) + file-loader: 6.2.0(webpack@5.95.0) fs-extra: 11.2.0 github-slugger: 1.5.0 globby: 11.1.0 @@ -19496,11 +19493,11 @@ snapshots: resolve-pathname: 3.0.0 shelljs: 0.8.5 tslib: 2.7.0 - url-loader: 4.1.1(file-loader@6.2.0(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))))(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))) + url-loader: 4.1.1(file-loader@6.2.0(webpack@5.95.0))(webpack@5.95.0) utility-types: 3.11.0 - webpack: 5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5)) + webpack: 5.95.0 optionalDependencies: - '@docusaurus/types': 3.4.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@docusaurus/types': 3.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) transitivePeerDependencies: - '@swc/core' - esbuild @@ -19509,13 +19506,13 @@ snapshots: - uglify-js - webpack-cli - '@docusaurus/utils@3.4.0(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(typescript@5.6.2)': + '@docusaurus/utils@3.4.0(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.6.2)': dependencies: '@docusaurus/logger': 3.4.0 - '@docusaurus/utils-common': 3.4.0(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + '@docusaurus/utils-common': 3.4.0(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) '@svgr/webpack': 8.1.0(typescript@5.6.2) escape-string-regexp: 4.0.0 - file-loader: 6.2.0(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))) + file-loader: 6.2.0(webpack@5.95.0) fs-extra: 11.2.0 github-slugger: 1.5.0 globby: 11.1.0 @@ -19528,11 +19525,11 @@ snapshots: resolve-pathname: 3.0.0 shelljs: 0.8.5 tslib: 2.7.0 - url-loader: 4.1.1(file-loader@6.2.0(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))))(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))) + url-loader: 4.1.1(file-loader@6.2.0(webpack@5.95.0))(webpack@5.95.0) utility-types: 3.11.0 - webpack: 5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5)) + webpack: 5.95.0 optionalDependencies: - '@docusaurus/types': 3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@docusaurus/types': 3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) transitivePeerDependencies: - '@swc/core' - esbuild @@ -19541,13 +19538,13 @@ snapshots: - uglify-js - webpack-cli - '@docusaurus/utils@3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(typescript@5.6.2)': + '@docusaurus/utils@3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.6.2)': dependencies: '@docusaurus/logger': 3.5.2 - '@docusaurus/utils-common': 3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + '@docusaurus/utils-common': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) '@svgr/webpack': 8.1.0(typescript@5.6.2) escape-string-regexp: 4.0.0 - file-loader: 6.2.0(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))) + file-loader: 6.2.0(webpack@5.95.0) fs-extra: 11.2.0 github-slugger: 1.5.0 globby: 11.1.0 @@ -19560,11 +19557,11 @@ snapshots: resolve-pathname: 3.0.0 shelljs: 0.8.5 tslib: 2.7.0 - url-loader: 4.1.1(file-loader@6.2.0(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))))(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))) + url-loader: 4.1.1(file-loader@6.2.0(webpack@5.95.0))(webpack@5.95.0) utility-types: 3.11.0 - webpack: 5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5)) + webpack: 5.95.0 optionalDependencies: - '@docusaurus/types': 3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@docusaurus/types': 3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) transitivePeerDependencies: - '@swc/core' - esbuild @@ -20129,24 +20126,24 @@ snapshots: - encoding - supports-color - '@graphql-markdown/core@1.12.0(@graphql-markdown/printer-legacy@1.9.0(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(graphql@16.9.0)(prettier@3.3.3)(typescript@5.6.2))(graphql-config@5.1.2(@types/node@22.7.3)(graphql@16.9.0)(typescript@5.6.2))(graphql@16.9.0)(prettier@3.3.3)': + '@graphql-markdown/core@1.12.0(@graphql-markdown/printer-legacy@1.9.0(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(graphql@16.9.0)(prettier@3.3.3)(typescript@5.6.2))(graphql-config@5.1.2(@types/node@22.7.3)(graphql@16.9.0)(typescript@5.6.2))(graphql@16.9.0)(prettier@3.3.3)': dependencies: '@graphql-markdown/graphql': 1.1.4(graphql@16.9.0)(prettier@3.3.3) '@graphql-markdown/logger': 1.0.4 '@graphql-markdown/utils': 1.7.0(prettier@3.3.3) optionalDependencies: - '@graphql-markdown/printer-legacy': 1.9.0(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(graphql@16.9.0)(prettier@3.3.3)(typescript@5.6.2) + '@graphql-markdown/printer-legacy': 1.9.0(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(graphql@16.9.0)(prettier@3.3.3)(typescript@5.6.2) graphql-config: 5.1.2(@types/node@22.7.3)(graphql@16.9.0)(typescript@5.6.2) transitivePeerDependencies: - graphql - prettier - '@graphql-markdown/docusaurus@1.26.2(@docusaurus/logger@3.5.2)(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(graphql-config@5.1.2(@types/node@22.7.3)(graphql@16.9.0)(typescript@5.6.2))(graphql@16.9.0)(prettier@3.3.3)(typescript@5.6.2)': + '@graphql-markdown/docusaurus@1.26.2(@docusaurus/logger@3.5.2)(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(graphql-config@5.1.2(@types/node@22.7.3)(graphql@16.9.0)(typescript@5.6.2))(graphql@16.9.0)(prettier@3.3.3)(typescript@5.6.2)': dependencies: '@docusaurus/logger': 3.5.2 - '@graphql-markdown/core': 1.12.0(@graphql-markdown/printer-legacy@1.9.0(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(graphql@16.9.0)(prettier@3.3.3)(typescript@5.6.2))(graphql-config@5.1.2(@types/node@22.7.3)(graphql@16.9.0)(typescript@5.6.2))(graphql@16.9.0)(prettier@3.3.3) + '@graphql-markdown/core': 1.12.0(@graphql-markdown/printer-legacy@1.9.0(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(graphql@16.9.0)(prettier@3.3.3)(typescript@5.6.2))(graphql-config@5.1.2(@types/node@22.7.3)(graphql@16.9.0)(typescript@5.6.2))(graphql@16.9.0)(prettier@3.3.3) '@graphql-markdown/logger': 1.0.4 - '@graphql-markdown/printer-legacy': 1.9.0(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(graphql@16.9.0)(prettier@3.3.3)(typescript@5.6.2) + '@graphql-markdown/printer-legacy': 1.9.0(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(graphql@16.9.0)(prettier@3.3.3)(typescript@5.6.2) transitivePeerDependencies: - '@docusaurus/types' - '@graphql-markdown/diff' @@ -20171,9 +20168,9 @@ snapshots: '@graphql-markdown/logger@1.0.4': {} - '@graphql-markdown/printer-legacy@1.9.0(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(graphql@16.9.0)(prettier@3.3.3)(typescript@5.6.2)': + '@graphql-markdown/printer-legacy@1.9.0(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(graphql@16.9.0)(prettier@3.3.3)(typescript@5.6.2)': dependencies: - '@docusaurus/utils': 3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(typescript@5.6.2) + '@docusaurus/utils': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.6.2) '@graphql-markdown/graphql': 1.1.4(graphql@16.9.0)(prettier@3.3.3) '@graphql-markdown/utils': 1.7.0(prettier@3.3.3) transitivePeerDependencies: @@ -20511,9 +20508,9 @@ snapshots: react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - '@headlessui/tailwindcss@0.1.3(tailwindcss@3.4.13(ts-node@10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@22.7.3)(typescript@5.6.2)))': + '@headlessui/tailwindcss@0.1.3(tailwindcss@3.4.13(ts-node@10.9.2(@types/node@22.7.3)(typescript@5.6.2)))': dependencies: - tailwindcss: 3.4.13(ts-node@10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@22.7.3)(typescript@5.6.2)) + tailwindcss: 3.4.13(ts-node@10.9.2(@types/node@22.7.3)(typescript@5.6.2)) '@hookform/resolvers@3.9.0(react-hook-form@7.53.0(react@18.3.1))': dependencies: @@ -20591,7 +20588,7 @@ snapshots: jest-util: 29.7.0 slash: 3.0.0 - '@jest/core@29.7.0(babel-plugin-macros@3.1.0)(node-notifier@10.0.0)(ts-node@10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(typescript@5.6.2))': + '@jest/core@29.7.0(babel-plugin-macros@3.1.0)(node-notifier@10.0.0)(ts-node@10.9.2(@types/node@20.16.9)(typescript@5.6.2))': dependencies: '@jest/console': 29.7.0 '@jest/reporters': 29.7.0(node-notifier@10.0.0) @@ -20605,7 +20602,7 @@ snapshots: exit: 0.1.2 graceful-fs: 4.2.11 jest-changed-files: 29.7.0 - jest-config: 29.7.0(@types/node@20.16.9)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(typescript@5.6.2)) + jest-config: 29.7.0(@types/node@20.16.9)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@20.16.9)(typescript@5.6.2)) jest-haste-map: 29.7.0 jest-message-util: 29.7.0 jest-regex-util: 29.6.3 @@ -21110,14 +21107,14 @@ snapshots: pump: 3.0.2 tar-fs: 2.1.1 - '@nestjs/cache-manager@2.2.2(@nestjs/common@10.4.4(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/core@10.4.4)(cache-manager@5.7.6)(rxjs@7.8.1)': + '@nestjs/cache-manager@2.2.2(@nestjs/common@10.4.4(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/core@10.4.4(@nestjs/common@10.4.4(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/platform-express@10.4.4)(reflect-metadata@0.2.2)(rxjs@7.8.1))(cache-manager@5.7.6)(rxjs@7.8.1)': dependencies: '@nestjs/common': 10.4.4(reflect-metadata@0.2.2)(rxjs@7.8.1) '@nestjs/core': 10.4.4(@nestjs/common@10.4.4(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/platform-express@10.4.4)(reflect-metadata@0.2.2)(rxjs@7.8.1) cache-manager: 5.7.6 rxjs: 7.8.1 - '@nestjs/cli@10.4.5(@swc/core@1.7.28(@swc/helpers@0.5.5))': + '@nestjs/cli@10.4.5(@swc/core@1.7.28)': dependencies: '@angular-devkit/core': 17.3.8(chokidar@3.6.0) '@angular-devkit/schematics': 17.3.8(chokidar@3.6.0) @@ -21127,7 +21124,7 @@ snapshots: chokidar: 3.6.0 cli-table3: 0.6.5 commander: 4.1.1 - fork-ts-checker-webpack-plugin: 9.0.2(typescript@5.3.3)(webpack@5.94.0(@swc/core@1.7.28(@swc/helpers@0.5.5))) + fork-ts-checker-webpack-plugin: 9.0.2(typescript@5.3.3)(webpack@5.94.0(@swc/core@1.7.28)) glob: 10.4.2 inquirer: 8.2.6 node-emoji: 1.11.0 @@ -21136,7 +21133,7 @@ snapshots: tsconfig-paths: 4.2.0 tsconfig-paths-webpack-plugin: 4.1.0 typescript: 5.3.3 - webpack: 5.94.0(@swc/core@1.7.28(@swc/helpers@0.5.5)) + webpack: 5.94.0(@swc/core@1.7.28) webpack-node-externals: 3.0.0 optionalDependencies: '@swc/core': 1.7.28(@swc/helpers@0.5.5) @@ -21189,7 +21186,7 @@ snapshots: transitivePeerDependencies: - supports-color - '@nestjs/schedule@4.1.1(@nestjs/common@10.4.4(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/core@10.4.4)': + '@nestjs/schedule@4.1.1(@nestjs/common@10.4.4(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/core@10.4.4(@nestjs/common@10.4.4(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/platform-express@10.4.4)(reflect-metadata@0.2.2)(rxjs@7.8.1))': dependencies: '@nestjs/common': 10.4.4(reflect-metadata@0.2.2)(rxjs@7.8.1) '@nestjs/core': 10.4.4(@nestjs/common@10.4.4(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/platform-express@10.4.4)(reflect-metadata@0.2.2)(rxjs@7.8.1) @@ -21218,7 +21215,7 @@ snapshots: transitivePeerDependencies: - chokidar - '@nestjs/testing@10.4.4(@nestjs/common@10.4.4(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/core@10.4.4)(@nestjs/platform-express@10.4.4)': + '@nestjs/testing@10.4.4(@nestjs/common@10.4.4(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/core@10.4.4(@nestjs/common@10.4.4(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/platform-express@10.4.4)(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/platform-express@10.4.4(@nestjs/common@10.4.4(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/core@10.4.4))': dependencies: '@nestjs/common': 10.4.4(reflect-metadata@0.2.2)(rxjs@7.8.1) '@nestjs/core': 10.4.4(@nestjs/common@10.4.4(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/platform-express@10.4.4)(reflect-metadata@0.2.2)(rxjs@7.8.1) @@ -23845,14 +23842,14 @@ snapshots: dependencies: defer-to-connect: 2.0.1 - '@tailwindcss/aspect-ratio@0.4.2(tailwindcss@3.4.13(ts-node@10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@22.7.3)(typescript@5.6.2)))': + '@tailwindcss/aspect-ratio@0.4.2(tailwindcss@3.4.13(ts-node@10.9.2(@types/node@22.7.3)(typescript@5.6.2)))': dependencies: - tailwindcss: 3.4.13(ts-node@10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@22.7.3)(typescript@5.6.2)) + tailwindcss: 3.4.13(ts-node@10.9.2(@types/node@22.7.3)(typescript@5.6.2)) - '@tailwindcss/forms@0.5.9(tailwindcss@3.4.13(ts-node@10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@22.7.3)(typescript@5.6.2)))': + '@tailwindcss/forms@0.5.9(tailwindcss@3.4.13(ts-node@10.9.2(@types/node@22.7.3)(typescript@5.6.2)))': dependencies: mini-svg-data-uri: 1.4.4 - tailwindcss: 3.4.13(ts-node@10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@22.7.3)(typescript@5.6.2)) + tailwindcss: 3.4.13(ts-node@10.9.2(@types/node@22.7.3)(typescript@5.6.2)) '@tanstack/eslint-plugin-query@5.58.1(eslint@8.57.1)(typescript@5.6.2)': dependencies: @@ -24356,11 +24353,11 @@ snapshots: '@types/webextension-polyfill@0.10.7': {} - '@types/webpack@5.28.5(@swc/core@1.7.28(@swc/helpers@0.5.5))(webpack-cli@5.1.4)': + '@types/webpack@5.28.5(@swc/core@1.7.28)(webpack-cli@5.1.4(webpack@5.95.0))': dependencies: '@types/node': 20.16.9 tapable: 2.2.1 - webpack: 5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(webpack-cli@5.1.4) + webpack: 5.95.0(@swc/core@1.7.28)(webpack-cli@5.1.4) transitivePeerDependencies: - '@swc/core' - esbuild @@ -24975,7 +24972,7 @@ snapshots: pathe: 1.1.2 picocolors: 1.1.0 sirv: 2.0.4 - vitest: 2.1.1(@types/node@20.16.9)(@vitest/ui@0.33.0)(happy-dom@10.11.2)(jsdom@24.1.3)(msw@2.4.9(typescript@5.6.2))(sass@1.79.3)(terser@5.34.0) + vitest: 2.1.1(@types/node@20.16.9)(@vitest/ui@0.33.0)(happy-dom@15.11.7)(jsdom@24.1.3)(msw@2.4.9(typescript@5.6.2))(sass@1.79.3)(terser@5.34.0) '@vitest/utils@0.33.0': dependencies: @@ -25135,19 +25132,19 @@ snapshots: '@webassemblyjs/ast': 1.12.1 '@xtuc/long': 4.2.2 - '@webpack-cli/configtest@2.1.1(webpack-cli@5.1.4)(webpack@5.95.0)': + '@webpack-cli/configtest@2.1.1(webpack-cli@5.1.4(webpack@5.95.0))(webpack@5.95.0(@swc/core@1.7.28)(webpack-cli@5.1.4))': dependencies: - webpack: 5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(webpack-cli@5.1.4) + webpack: 5.95.0(@swc/core@1.7.28)(webpack-cli@5.1.4) webpack-cli: 5.1.4(webpack@5.95.0) - '@webpack-cli/info@2.0.2(webpack-cli@5.1.4)(webpack@5.95.0)': + '@webpack-cli/info@2.0.2(webpack-cli@5.1.4(webpack@5.95.0))(webpack@5.95.0(@swc/core@1.7.28)(webpack-cli@5.1.4))': dependencies: - webpack: 5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(webpack-cli@5.1.4) + webpack: 5.95.0(@swc/core@1.7.28)(webpack-cli@5.1.4) webpack-cli: 5.1.4(webpack@5.95.0) - '@webpack-cli/serve@2.0.5(webpack-cli@5.1.4)(webpack@5.95.0)': + '@webpack-cli/serve@2.0.5(webpack-cli@5.1.4(webpack@5.95.0))(webpack@5.95.0(@swc/core@1.7.28)(webpack-cli@5.1.4))': dependencies: - webpack: 5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(webpack-cli@5.1.4) + webpack: 5.95.0(@swc/core@1.7.28)(webpack-cli@5.1.4) webpack-cli: 5.1.4(webpack@5.95.0) '@whatwg-node/events@0.0.3': {} @@ -25638,12 +25635,12 @@ snapshots: transitivePeerDependencies: - supports-color - babel-loader@9.2.1(@babel/core@7.25.2)(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))): + babel-loader@9.2.1(@babel/core@7.25.2)(webpack@5.95.0): dependencies: '@babel/core': 7.25.2 find-cache-dir: 4.0.0 schema-utils: 4.2.0 - webpack: 5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5)) + webpack: 5.95.0 babel-plugin-dynamic-import-node@2.3.3: dependencies: @@ -26443,7 +26440,7 @@ snapshots: copy-text-to-clipboard@3.2.0: {} - copy-webpack-plugin@11.0.0(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))): + copy-webpack-plugin@11.0.0(webpack@5.95.0(@swc/core@1.7.28)(webpack-cli@5.1.4)): dependencies: fast-glob: 3.3.2 glob-parent: 6.0.2 @@ -26451,7 +26448,7 @@ snapshots: normalize-path: 3.0.0 schema-utils: 4.2.0 serialize-javascript: 6.0.2 - webpack: 5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5)) + webpack: 5.95.0(@swc/core@1.7.28)(webpack-cli@5.1.4) copy-webpack-plugin@11.0.0(webpack@5.95.0): dependencies: @@ -26461,7 +26458,7 @@ snapshots: normalize-path: 3.0.0 schema-utils: 4.2.0 serialize-javascript: 6.0.2 - webpack: 5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(webpack-cli@5.1.4) + webpack: 5.95.0 core-js-compat@3.38.1: dependencies: @@ -26531,13 +26528,13 @@ snapshots: crc-32@1.2.2: {} - create-jest@29.7.0(@types/node@20.16.9)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(typescript@5.6.2)): + create-jest@29.7.0(@types/node@20.16.9)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@20.16.9)(typescript@5.6.2)): dependencies: '@jest/types': 29.6.3 chalk: 4.1.2 exit: 0.1.2 graceful-fs: 4.2.11 - jest-config: 29.7.0(@types/node@20.16.9)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(typescript@5.6.2)) + jest-config: 29.7.0(@types/node@20.16.9)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@20.16.9)(typescript@5.6.2)) jest-util: 29.7.0 prompts: 2.4.2 transitivePeerDependencies: @@ -26601,7 +26598,7 @@ snapshots: postcss-selector-parser: 6.1.2 postcss-value-parser: 4.2.0 - css-loader@6.11.0(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))): + css-loader@6.11.0(webpack@5.95.0(@swc/core@1.7.28)(webpack-cli@5.1.4)): dependencies: icss-utils: 5.1.0(postcss@8.4.47) postcss: 8.4.47 @@ -26612,7 +26609,7 @@ snapshots: postcss-value-parser: 4.2.0 semver: 7.6.3 optionalDependencies: - webpack: 5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5)) + webpack: 5.95.0(@swc/core@1.7.28)(webpack-cli@5.1.4) css-loader@6.11.0(webpack@5.95.0): dependencies: @@ -26625,9 +26622,9 @@ snapshots: postcss-value-parser: 4.2.0 semver: 7.6.3 optionalDependencies: - webpack: 5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(webpack-cli@5.1.4) + webpack: 5.95.0 - css-minimizer-webpack-plugin@5.0.1(clean-css@5.3.3)(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))): + css-minimizer-webpack-plugin@5.0.1(clean-css@5.3.3)(webpack@5.95.0): dependencies: '@jridgewell/trace-mapping': 0.3.25 cssnano: 6.1.2(postcss@8.4.47) @@ -26635,7 +26632,7 @@ snapshots: postcss: 8.4.47 schema-utils: 4.2.0 serialize-javascript: 6.0.2 - webpack: 5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5)) + webpack: 5.95.0 optionalDependencies: clean-css: 5.3.3 @@ -27184,15 +27181,15 @@ snapshots: dependencies: typedoc-plugin-markdown: 4.2.10(typedoc@0.26.11(typescript@5.6.2)) - docusaurus-theme-search-typesense@0.20.0-0(iea5eyhbiud2dlcqtud2g4pxzm): + docusaurus-theme-search-typesense@0.20.0-0(@algolia/client-search@4.24.0)(@babel/runtime@7.25.6)(@docusaurus/core@3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16))(@docusaurus/theme-common@3.5.2(@docusaurus/plugin-content-docs@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16))(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2))(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/react@18.3.9)(algoliasearch@4.24.0)(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16): dependencies: - '@docusaurus/core': 3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) + '@docusaurus/core': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) '@docusaurus/logger': 3.4.0 - '@docusaurus/plugin-content-docs': 3.4.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) - '@docusaurus/theme-common': 3.5.2(@docusaurus/plugin-content-docs@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16))(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2) + '@docusaurus/plugin-content-docs': 3.4.0(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) + '@docusaurus/theme-common': 3.5.2(@docusaurus/plugin-content-docs@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16))(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2) '@docusaurus/theme-translations': 3.4.0 - '@docusaurus/utils': 3.4.0(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(typescript@5.6.2) - '@docusaurus/utils-validation': 3.4.0(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(typescript@5.6.2) + '@docusaurus/utils': 3.4.0(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.6.2) + '@docusaurus/utils-validation': 3.4.0(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.6.2) algoliasearch-helper: 3.22.5(algoliasearch@4.24.0) clsx: 1.2.1 eta: 2.2.0 @@ -27638,7 +27635,26 @@ snapshots: debug: 4.3.7(supports-color@8.1.1) enhanced-resolve: 5.17.1 eslint: 8.57.1 - eslint-module-utils: 2.12.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.1) + eslint-module-utils: 2.12.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.30.0)(eslint@8.57.1))(eslint@8.57.1) + fast-glob: 3.3.2 + get-tsconfig: 4.8.1 + is-bun-module: 1.2.1 + is-glob: 4.0.3 + optionalDependencies: + eslint-plugin-import: 2.30.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.6.2))(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.1) + transitivePeerDependencies: + - '@typescript-eslint/parser' + - eslint-import-resolver-node + - eslint-import-resolver-webpack + - supports-color + + eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.6.2))(eslint-plugin-import@2.30.0)(eslint@8.57.1): + dependencies: + '@nolyfill/is-core-module': 1.0.39 + debug: 4.3.7(supports-color@8.1.1) + enhanced-resolve: 5.17.1 + eslint: 8.57.1 + eslint-module-utils: 2.12.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.6.2))(eslint-plugin-import@2.30.0)(eslint@8.57.1))(eslint@8.57.1) fast-glob: 3.3.2 get-tsconfig: 4.8.1 is-bun-module: 1.2.1 @@ -27651,7 +27667,7 @@ snapshots: - eslint-import-resolver-webpack - supports-color - eslint-module-utils@2.12.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.1): + eslint-module-utils@2.12.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.30.0)(eslint@8.57.1))(eslint@8.57.1): dependencies: debug: 3.2.7 optionalDependencies: @@ -27662,6 +27678,17 @@ snapshots: transitivePeerDependencies: - supports-color + eslint-module-utils@2.12.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.6.2))(eslint-plugin-import@2.30.0)(eslint@8.57.1))(eslint@8.57.1): + dependencies: + debug: 3.2.7 + optionalDependencies: + '@typescript-eslint/parser': 6.21.0(eslint@8.57.1)(typescript@5.6.2) + eslint: 8.57.1 + eslint-import-resolver-node: 0.3.9 + eslint-import-resolver-typescript: 3.6.3(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.6.2))(eslint-plugin-import@2.30.0)(eslint@8.57.1) + transitivePeerDependencies: + - supports-color + eslint-plugin-header@3.1.1(eslint@8.57.1): dependencies: eslint: 8.57.1 @@ -27677,7 +27704,7 @@ snapshots: doctrine: 2.1.0 eslint: 8.57.1 eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.12.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.1) + eslint-module-utils: 2.12.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.6.2))(eslint-plugin-import@2.30.0)(eslint@8.57.1))(eslint@8.57.1) hasown: 2.0.2 is-core-module: 2.15.1 is-glob: 4.0.3 @@ -27792,7 +27819,7 @@ snapshots: eslint-visitor-keys@4.1.0: {} - eslint-webpack-plugin@4.2.0(eslint@8.57.1)(webpack@5.95.0): + eslint-webpack-plugin@4.2.0(eslint@8.57.1)(webpack@5.95.0(@swc/core@1.7.28)(webpack-cli@5.1.4)): dependencies: '@types/eslint': 8.56.12 eslint: 8.57.1 @@ -27800,7 +27827,7 @@ snapshots: micromatch: 4.0.8 normalize-path: 3.0.0 schema-utils: 4.2.0 - webpack: 5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(webpack-cli@5.1.4) + webpack: 5.95.0(@swc/core@1.7.28)(webpack-cli@5.1.4) eslint@8.57.1: dependencies: @@ -28165,11 +28192,11 @@ snapshots: dependencies: flat-cache: 3.2.0 - file-loader@6.2.0(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))): + file-loader@6.2.0(webpack@5.95.0): dependencies: loader-utils: 2.0.4 schema-utils: 3.3.0 - webpack: 5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5)) + webpack: 5.95.0 file-system-cache@2.3.0: dependencies: @@ -28277,7 +28304,7 @@ snapshots: forever-agent@0.6.1: {} - fork-ts-checker-webpack-plugin@6.5.3(eslint@8.57.1)(typescript@5.6.2)(vue-template-compiler@2.7.16)(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))): + fork-ts-checker-webpack-plugin@6.5.3(eslint@8.57.1)(typescript@5.6.2)(vue-template-compiler@2.7.16)(webpack@5.95.0): dependencies: '@babel/code-frame': 7.24.7 '@types/json-schema': 7.0.15 @@ -28293,12 +28320,12 @@ snapshots: semver: 7.6.3 tapable: 1.1.3 typescript: 5.6.2 - webpack: 5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5)) + webpack: 5.95.0 optionalDependencies: eslint: 8.57.1 vue-template-compiler: 2.7.16 - fork-ts-checker-webpack-plugin@9.0.2(typescript@5.3.3)(webpack@5.94.0(@swc/core@1.7.28(@swc/helpers@0.5.5))): + fork-ts-checker-webpack-plugin@9.0.2(typescript@5.3.3)(webpack@5.94.0(@swc/core@1.7.28)): dependencies: '@babel/code-frame': 7.24.7 chalk: 4.1.2 @@ -28313,7 +28340,7 @@ snapshots: semver: 7.6.3 tapable: 2.2.1 typescript: 5.3.3 - webpack: 5.94.0(@swc/core@1.7.28(@swc/helpers@0.5.5)) + webpack: 5.94.0(@swc/core@1.7.28) form-data-encoder@2.1.4: {} @@ -28813,13 +28840,10 @@ snapshots: optionalDependencies: uglify-js: 3.19.3 - happy-dom@10.11.2: + happy-dom@15.11.7: dependencies: - css.escape: 1.5.1 entities: 4.5.0 - iconv-lite: 0.6.3 webidl-conversions: 7.0.0 - whatwg-encoding: 2.0.0 whatwg-mimetype: 3.0.0 har-schema@2.0.0: {} @@ -29075,7 +29099,7 @@ snapshots: html-void-elements@3.0.0: {} - html-webpack-plugin@5.6.0(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))): + html-webpack-plugin@5.6.0(webpack@5.95.0(@swc/core@1.7.28)(webpack-cli@5.1.4)): dependencies: '@types/html-minifier-terser': 6.1.0 html-minifier-terser: 6.1.0 @@ -29083,7 +29107,7 @@ snapshots: pretty-error: 4.0.0 tapable: 2.2.1 optionalDependencies: - webpack: 5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5)) + webpack: 5.95.0(@swc/core@1.7.28)(webpack-cli@5.1.4) html-webpack-plugin@5.6.0(webpack@5.95.0): dependencies: @@ -29093,7 +29117,7 @@ snapshots: pretty-error: 4.0.0 tapable: 2.2.1 optionalDependencies: - webpack: 5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(webpack-cli@5.1.4) + webpack: 5.95.0 htmlparser2@6.1.0: dependencies: @@ -29728,16 +29752,16 @@ snapshots: - babel-plugin-macros - supports-color - jest-cli@29.7.0(@types/node@20.16.9)(babel-plugin-macros@3.1.0)(node-notifier@10.0.0)(ts-node@10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(typescript@5.6.2)): + jest-cli@29.7.0(@types/node@20.16.9)(babel-plugin-macros@3.1.0)(node-notifier@10.0.0)(ts-node@10.9.2(@types/node@20.16.9)(typescript@5.6.2)): dependencies: - '@jest/core': 29.7.0(babel-plugin-macros@3.1.0)(node-notifier@10.0.0)(ts-node@10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(typescript@5.6.2)) + '@jest/core': 29.7.0(babel-plugin-macros@3.1.0)(node-notifier@10.0.0)(ts-node@10.9.2(@types/node@20.16.9)(typescript@5.6.2)) '@jest/test-result': 29.7.0 '@jest/types': 29.6.3 chalk: 4.1.2 - create-jest: 29.7.0(@types/node@20.16.9)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(typescript@5.6.2)) + create-jest: 29.7.0(@types/node@20.16.9)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@20.16.9)(typescript@5.6.2)) exit: 0.1.2 import-local: 3.2.0 - jest-config: 29.7.0(@types/node@20.16.9)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(typescript@5.6.2)) + jest-config: 29.7.0(@types/node@20.16.9)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@20.16.9)(typescript@5.6.2)) jest-util: 29.7.0 jest-validate: 29.7.0 yargs: 17.7.2 @@ -29749,7 +29773,7 @@ snapshots: - supports-color - ts-node - jest-config@29.7.0(@types/node@20.16.9)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(typescript@5.6.2)): + jest-config@29.7.0(@types/node@20.16.9)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@20.16.9)(typescript@5.6.2)): dependencies: '@babel/core': 7.25.2 '@jest/test-sequencer': 29.7.0 @@ -29775,7 +29799,7 @@ snapshots: strip-json-comments: 3.1.1 optionalDependencies: '@types/node': 20.16.9 - ts-node: 10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(typescript@5.6.2) + ts-node: 10.9.2(@swc/core@1.7.28)(@types/node@20.16.9)(typescript@5.6.2) transitivePeerDependencies: - babel-plugin-macros - supports-color @@ -30006,12 +30030,12 @@ snapshots: merge-stream: 2.0.0 supports-color: 8.1.1 - jest@29.7.0(@types/node@20.16.9)(babel-plugin-macros@3.1.0)(node-notifier@10.0.0)(ts-node@10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(typescript@5.6.2)): + jest@29.7.0(@types/node@20.16.9)(babel-plugin-macros@3.1.0)(node-notifier@10.0.0)(ts-node@10.9.2(@types/node@20.16.9)(typescript@5.6.2)): dependencies: - '@jest/core': 29.7.0(babel-plugin-macros@3.1.0)(node-notifier@10.0.0)(ts-node@10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(typescript@5.6.2)) + '@jest/core': 29.7.0(babel-plugin-macros@3.1.0)(node-notifier@10.0.0)(ts-node@10.9.2(@types/node@20.16.9)(typescript@5.6.2)) '@jest/types': 29.6.3 import-local: 3.2.0 - jest-cli: 29.7.0(@types/node@20.16.9)(babel-plugin-macros@3.1.0)(node-notifier@10.0.0)(ts-node@10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(typescript@5.6.2)) + jest-cli: 29.7.0(@types/node@20.16.9)(babel-plugin-macros@3.1.0)(node-notifier@10.0.0)(ts-node@10.9.2(@types/node@20.16.9)(typescript@5.6.2)) optionalDependencies: node-notifier: 10.0.0 transitivePeerDependencies: @@ -31289,17 +31313,17 @@ snapshots: min-indent@1.0.1: {} - mini-css-extract-plugin@2.9.1(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))): + mini-css-extract-plugin@2.9.1(webpack@5.95.0(@swc/core@1.7.28)(webpack-cli@5.1.4)): dependencies: schema-utils: 4.2.0 tapable: 2.2.1 - webpack: 5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5)) + webpack: 5.95.0(@swc/core@1.7.28)(webpack-cli@5.1.4) mini-css-extract-plugin@2.9.1(webpack@5.95.0): dependencies: schema-utils: 4.2.0 tapable: 2.2.1 - webpack: 5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(webpack-cli@5.1.4) + webpack: 5.95.0 mini-svg-data-uri@1.4.4: {} @@ -32236,29 +32260,29 @@ snapshots: '@csstools/utilities': 1.0.0(postcss@8.4.47) postcss: 8.4.47 - postcss-load-config@4.0.2(postcss@8.4.47)(ts-node@10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(typescript@5.6.2)): + postcss-load-config@4.0.2(postcss@8.4.47)(ts-node@10.9.2(@swc/core@1.7.28)(@types/node@20.16.9)(typescript@5.6.2)): dependencies: lilconfig: 3.1.2 yaml: 2.5.1 optionalDependencies: postcss: 8.4.47 - ts-node: 10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(typescript@5.6.2) + ts-node: 10.9.2(@swc/core@1.7.28)(@types/node@20.16.9)(typescript@5.6.2) - postcss-load-config@4.0.2(postcss@8.4.47)(ts-node@10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@22.7.3)(typescript@5.6.2)): + postcss-load-config@4.0.2(postcss@8.4.47)(ts-node@10.9.2(@types/node@22.7.3)(typescript@5.6.2)): dependencies: lilconfig: 3.1.2 yaml: 2.5.1 optionalDependencies: postcss: 8.4.47 - ts-node: 10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@22.7.3)(typescript@5.6.2) + ts-node: 10.9.2(@types/node@22.7.3)(typescript@5.6.2) - postcss-loader@7.3.4(postcss@8.4.47)(typescript@5.6.2)(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))): + postcss-loader@7.3.4(postcss@8.4.47)(typescript@5.6.2)(webpack@5.95.0(@swc/core@1.7.28)(webpack-cli@5.1.4)): dependencies: cosmiconfig: 8.3.6(typescript@5.6.2) jiti: 1.21.6 postcss: 8.4.47 semver: 7.6.3 - webpack: 5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5)) + webpack: 5.95.0(@swc/core@1.7.28)(webpack-cli@5.1.4) transitivePeerDependencies: - typescript @@ -32268,7 +32292,7 @@ snapshots: jiti: 1.21.6 postcss: 8.4.47 semver: 7.6.3 - webpack: 5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(webpack-cli@5.1.4) + webpack: 5.95.0 transitivePeerDependencies: - typescript @@ -32773,7 +32797,7 @@ snapshots: react: 18.3.1 tween-functions: 1.2.0 - react-dev-utils@12.0.1(eslint@8.57.1)(typescript@5.6.2)(vue-template-compiler@2.7.16)(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))): + react-dev-utils@12.0.1(eslint@8.57.1)(typescript@5.6.2)(vue-template-compiler@2.7.16)(webpack@5.95.0): dependencies: '@babel/code-frame': 7.24.7 address: 1.2.2 @@ -32784,7 +32808,7 @@ snapshots: escape-string-regexp: 4.0.0 filesize: 8.0.7 find-up: 5.0.0 - fork-ts-checker-webpack-plugin: 6.5.3(eslint@8.57.1)(typescript@5.6.2)(vue-template-compiler@2.7.16)(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))) + fork-ts-checker-webpack-plugin: 6.5.3(eslint@8.57.1)(typescript@5.6.2)(vue-template-compiler@2.7.16)(webpack@5.95.0) global-modules: 2.0.0 globby: 11.1.0 gzip-size: 6.0.0 @@ -32799,7 +32823,7 @@ snapshots: shell-quote: 1.8.1 strip-ansi: 6.0.1 text-table: 0.2.0 - webpack: 5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5)) + webpack: 5.95.0 optionalDependencies: typescript: 5.6.2 transitivePeerDependencies: @@ -32900,11 +32924,11 @@ snapshots: sucrase: 3.35.0 use-editable: 2.3.3(react@18.3.1) - react-loadable-ssr-addon-v5-slorber@1.0.1(@docusaurus/react-loadable@6.0.0(react@18.3.1))(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))): + react-loadable-ssr-addon-v5-slorber@1.0.1(@docusaurus/react-loadable@6.0.0(react@18.3.1))(webpack@5.95.0): dependencies: '@babel/runtime': 7.25.6 react-loadable: '@docusaurus/react-loadable@6.0.0(react@18.3.1)' - webpack: 5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5)) + webpack: 5.95.0 react-number-format@5.4.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: @@ -33596,10 +33620,10 @@ snapshots: safer-buffer@2.1.2: {} - sass-loader@13.3.3(sass@1.79.3)(webpack@5.95.0): + sass-loader@13.3.3(sass@1.79.3)(webpack@5.95.0(@swc/core@1.7.28)(webpack-cli@5.1.4)): dependencies: neo-async: 2.6.2 - webpack: 5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(webpack-cli@5.1.4) + webpack: 5.95.0(@swc/core@1.7.28)(webpack-cli@5.1.4) optionalDependencies: sass: 1.79.3 @@ -34325,15 +34349,15 @@ snapshots: tailwind-merge@2.5.2: {} - tailwindcss-animate@1.0.7(tailwindcss@3.4.13(ts-node@10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(typescript@5.6.2))): + tailwindcss-animate@1.0.7(tailwindcss@3.4.13(ts-node@10.9.2(@swc/core@1.7.28)(@types/node@20.16.9)(typescript@5.6.2))): dependencies: - tailwindcss: 3.4.13(ts-node@10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(typescript@5.6.2)) + tailwindcss: 3.4.13(ts-node@10.9.2(@swc/core@1.7.28)(@types/node@20.16.9)(typescript@5.6.2)) - tailwindcss-animate@1.0.7(tailwindcss@3.4.13(ts-node@10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@22.7.3)(typescript@5.6.2))): + tailwindcss-animate@1.0.7(tailwindcss@3.4.13(ts-node@10.9.2(@types/node@22.7.3)(typescript@5.6.2))): dependencies: - tailwindcss: 3.4.13(ts-node@10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@22.7.3)(typescript@5.6.2)) + tailwindcss: 3.4.13(ts-node@10.9.2(@types/node@22.7.3)(typescript@5.6.2)) - tailwindcss@3.4.13(ts-node@10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(typescript@5.6.2)): + tailwindcss@3.4.13(ts-node@10.9.2(@swc/core@1.7.28)(@types/node@20.16.9)(typescript@5.6.2)): dependencies: '@alloc/quick-lru': 5.2.0 arg: 5.0.2 @@ -34352,7 +34376,7 @@ snapshots: postcss: 8.4.47 postcss-import: 15.1.0(postcss@8.4.47) postcss-js: 4.0.1(postcss@8.4.47) - postcss-load-config: 4.0.2(postcss@8.4.47)(ts-node@10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(typescript@5.6.2)) + postcss-load-config: 4.0.2(postcss@8.4.47)(ts-node@10.9.2(@swc/core@1.7.28)(@types/node@20.16.9)(typescript@5.6.2)) postcss-nested: 6.2.0(postcss@8.4.47) postcss-selector-parser: 6.1.2 resolve: 1.22.8 @@ -34360,7 +34384,7 @@ snapshots: transitivePeerDependencies: - ts-node - tailwindcss@3.4.13(ts-node@10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@22.7.3)(typescript@5.6.2)): + tailwindcss@3.4.13(ts-node@10.9.2(@types/node@22.7.3)(typescript@5.6.2)): dependencies: '@alloc/quick-lru': 5.2.0 arg: 5.0.2 @@ -34379,7 +34403,7 @@ snapshots: postcss: 8.4.47 postcss-import: 15.1.0(postcss@8.4.47) postcss-js: 4.0.1(postcss@8.4.47) - postcss-load-config: 4.0.2(postcss@8.4.47)(ts-node@10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@22.7.3)(typescript@5.6.2)) + postcss-load-config: 4.0.2(postcss@8.4.47)(ts-node@10.9.2(@types/node@22.7.3)(typescript@5.6.2)) postcss-nested: 6.2.0(postcss@8.4.47) postcss-selector-parser: 6.1.2 resolve: 1.22.8 @@ -34435,39 +34459,48 @@ snapshots: term-size@2.2.1: {} - terser-webpack-plugin@5.3.10(@swc/core@1.7.28(@swc/helpers@0.5.5))(webpack@5.94.0(@swc/core@1.7.28(@swc/helpers@0.5.5))): + terser-webpack-plugin@5.3.10(@swc/core@1.7.28)(webpack@5.94.0(@swc/core@1.7.28)): dependencies: '@jridgewell/trace-mapping': 0.3.25 jest-worker: 27.5.1 schema-utils: 3.3.0 serialize-javascript: 6.0.2 terser: 5.34.0 - webpack: 5.94.0(@swc/core@1.7.28(@swc/helpers@0.5.5)) + webpack: 5.94.0(@swc/core@1.7.28) optionalDependencies: '@swc/core': 1.7.28(@swc/helpers@0.5.5) - terser-webpack-plugin@5.3.10(@swc/core@1.7.28(@swc/helpers@0.5.5))(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))): + terser-webpack-plugin@5.3.10(@swc/core@1.7.28)(webpack@5.95.0(@swc/core@1.7.28)(webpack-cli@5.1.4)): dependencies: '@jridgewell/trace-mapping': 0.3.25 jest-worker: 27.5.1 schema-utils: 3.3.0 serialize-javascript: 6.0.2 terser: 5.34.0 - webpack: 5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5)) + webpack: 5.95.0(@swc/core@1.7.28)(webpack-cli@5.1.4) optionalDependencies: '@swc/core': 1.7.28(@swc/helpers@0.5.5) - terser-webpack-plugin@5.3.10(@swc/core@1.7.28(@swc/helpers@0.5.5))(webpack@5.95.0): + terser-webpack-plugin@5.3.10(@swc/core@1.7.28)(webpack@5.95.0(@swc/core@1.7.28)): dependencies: '@jridgewell/trace-mapping': 0.3.25 jest-worker: 27.5.1 schema-utils: 3.3.0 serialize-javascript: 6.0.2 terser: 5.34.0 - webpack: 5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(webpack-cli@5.1.4) + webpack: 5.95.0(@swc/core@1.7.28) optionalDependencies: '@swc/core': 1.7.28(@swc/helpers@0.5.5) + terser-webpack-plugin@5.3.10(webpack@5.95.0): + dependencies: + '@jridgewell/trace-mapping': 0.3.25 + jest-worker: 27.5.1 + schema-utils: 3.3.0 + serialize-javascript: 6.0.2 + terser: 5.34.0 + webpack: 5.95.0 + terser@5.34.0: dependencies: '@jridgewell/source-map': 0.3.6 @@ -34612,12 +34645,12 @@ snapshots: ts-interface-checker@0.1.13: {} - ts-jest@29.2.5(@babel/core@7.25.2)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.25.2))(jest@29.7.0(@types/node@20.16.9)(babel-plugin-macros@3.1.0)(node-notifier@10.0.0)(ts-node@10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(typescript@5.6.2)))(typescript@5.6.2): + ts-jest@29.2.5(@babel/core@7.25.2)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.25.2))(jest@29.7.0(@types/node@20.16.9)(babel-plugin-macros@3.1.0)(node-notifier@10.0.0)(ts-node@10.9.2(@types/node@20.16.9)(typescript@5.6.2)))(typescript@5.6.2): dependencies: bs-logger: 0.2.6 ejs: 3.1.10 fast-json-stable-stringify: 2.1.0 - jest: 29.7.0(@types/node@20.16.9)(babel-plugin-macros@3.1.0)(node-notifier@10.0.0)(ts-node@10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(typescript@5.6.2)) + jest: 29.7.0(@types/node@20.16.9)(babel-plugin-macros@3.1.0)(node-notifier@10.0.0)(ts-node@10.9.2(@types/node@20.16.9)(typescript@5.6.2)) jest-util: 29.7.0 json5: 2.2.3 lodash.memoize: 4.1.2 @@ -34631,7 +34664,7 @@ snapshots: '@jest/types': 29.6.3 babel-jest: 29.7.0(@babel/core@7.25.2) - ts-loader@9.5.1(typescript@5.6.2)(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))): + ts-loader@9.5.1(typescript@5.6.2)(webpack@5.95.0(@swc/core@1.7.28)(webpack-cli@5.1.4)): dependencies: chalk: 4.1.2 enhanced-resolve: 5.17.1 @@ -34639,9 +34672,9 @@ snapshots: semver: 7.6.3 source-map: 0.7.4 typescript: 5.6.2 - webpack: 5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5)) + webpack: 5.95.0(@swc/core@1.7.28)(webpack-cli@5.1.4) - ts-loader@9.5.1(typescript@5.6.2)(webpack@5.95.0): + ts-loader@9.5.1(typescript@5.6.2)(webpack@5.95.0(@swc/core@1.7.28)): dependencies: chalk: 4.1.2 enhanced-resolve: 5.17.1 @@ -34649,11 +34682,11 @@ snapshots: semver: 7.6.3 source-map: 0.7.4 typescript: 5.6.2 - webpack: 5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(webpack-cli@5.1.4) + webpack: 5.95.0(@swc/core@1.7.28) ts-log@2.2.5: {} - ts-node@10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@16.18.111)(typescript@5.1.6): + ts-node@10.9.2(@swc/core@1.7.28)(@types/node@16.18.111)(typescript@5.1.6): dependencies: '@cspotcode/source-map-support': 0.8.1 '@tsconfig/node10': 1.0.11 @@ -34673,7 +34706,7 @@ snapshots: optionalDependencies: '@swc/core': 1.7.28(@swc/helpers@0.5.5) - ts-node@10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(typescript@5.6.2): + ts-node@10.9.2(@swc/core@1.7.28)(@types/node@20.16.9)(typescript@5.6.2): dependencies: '@cspotcode/source-map-support': 0.8.1 '@tsconfig/node10': 1.0.11 @@ -34693,7 +34726,7 @@ snapshots: optionalDependencies: '@swc/core': 1.7.28(@swc/helpers@0.5.5) - ts-node@10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@22.7.3)(typescript@5.6.2): + ts-node@10.9.2(@types/node@22.7.3)(typescript@5.6.2): dependencies: '@cspotcode/source-map-support': 0.8.1 '@tsconfig/node10': 1.0.11 @@ -34710,8 +34743,6 @@ snapshots: typescript: 5.6.2 v8-compile-cache-lib: 3.0.1 yn: 3.1.1 - optionalDependencies: - '@swc/core': 1.7.28(@swc/helpers@0.5.5) optional: true ts-retry-promise@0.8.1: {} @@ -34881,14 +34912,14 @@ snapshots: transitivePeerDependencies: - supports-color - typescript-json-schema@0.64.0(@swc/core@1.7.28(@swc/helpers@0.5.5)): + typescript-json-schema@0.64.0(@swc/core@1.7.28): dependencies: '@types/json-schema': 7.0.15 '@types/node': 16.18.111 glob: 7.2.3 path-equal: 1.2.5 safe-stable-stringify: 2.5.0 - ts-node: 10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@16.18.111)(typescript@5.1.6) + ts-node: 10.9.2(@swc/core@1.7.28)(@types/node@16.18.111)(typescript@5.1.6) typescript: 5.1.6 yargs: 17.7.2 transitivePeerDependencies: @@ -35129,14 +35160,14 @@ snapshots: dependencies: punycode: 2.3.1 - url-loader@4.1.1(file-loader@6.2.0(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))))(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))): + url-loader@4.1.1(file-loader@6.2.0(webpack@5.95.0))(webpack@5.95.0): dependencies: loader-utils: 2.0.4 mime-types: 2.1.35 schema-utils: 3.3.0 - webpack: 5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5)) + webpack: 5.95.0 optionalDependencies: - file-loader: 6.2.0(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))) + file-loader: 6.2.0(webpack@5.95.0) url-parse@1.5.10: dependencies: @@ -35428,7 +35459,7 @@ snapshots: sass: 1.79.3 terser: 5.34.0 - vitest@2.1.1(@types/node@20.16.9)(@vitest/ui@0.33.0)(happy-dom@10.11.2)(jsdom@24.1.3)(msw@2.4.9(typescript@5.6.2))(sass@1.79.3)(terser@5.34.0): + vitest@2.1.1(@types/node@20.16.9)(@vitest/ui@0.33.0)(happy-dom@15.11.7)(jsdom@24.1.3)(msw@2.4.9(typescript@5.6.2))(sass@1.79.3)(terser@5.34.0): dependencies: '@vitest/expect': 2.1.1 '@vitest/mocker': 2.1.1(msw@2.4.9(typescript@5.6.2))(vite@5.4.8(@types/node@20.16.9)(sass@1.79.3)(terser@5.34.0)) @@ -35452,7 +35483,7 @@ snapshots: optionalDependencies: '@types/node': 20.16.9 '@vitest/ui': 0.33.0(vitest@2.1.1) - happy-dom: 10.11.2 + happy-dom: 15.11.7 jsdom: 24.1.3 transitivePeerDependencies: - less @@ -35465,7 +35496,7 @@ snapshots: - supports-color - terser - vitest@2.1.1(@types/node@22.7.3)(happy-dom@10.11.2)(jsdom@24.1.3)(msw@2.4.9(typescript@5.6.2))(sass@1.79.3)(terser@5.34.0): + vitest@2.1.1(@types/node@22.7.3)(happy-dom@15.11.7)(jsdom@24.1.3)(msw@2.4.9(typescript@5.6.2))(sass@1.79.3)(terser@5.34.0): dependencies: '@vitest/expect': 2.1.1 '@vitest/mocker': 2.1.1(msw@2.4.9(typescript@5.6.2))(vite@5.4.8(@types/node@22.7.3)(sass@1.79.3)(terser@5.34.0)) @@ -35488,7 +35519,7 @@ snapshots: why-is-node-running: 2.3.0 optionalDependencies: '@types/node': 22.7.3 - happy-dom: 10.11.2 + happy-dom: 15.11.7 jsdom: 24.1.3 transitivePeerDependencies: - less @@ -35883,9 +35914,9 @@ snapshots: webpack-cli@5.1.4(webpack@5.95.0): dependencies: '@discoveryjs/json-ext': 0.5.7 - '@webpack-cli/configtest': 2.1.1(webpack-cli@5.1.4)(webpack@5.95.0) - '@webpack-cli/info': 2.0.2(webpack-cli@5.1.4)(webpack@5.95.0) - '@webpack-cli/serve': 2.0.5(webpack-cli@5.1.4)(webpack@5.95.0) + '@webpack-cli/configtest': 2.1.1(webpack-cli@5.1.4(webpack@5.95.0))(webpack@5.95.0(@swc/core@1.7.28)(webpack-cli@5.1.4)) + '@webpack-cli/info': 2.0.2(webpack-cli@5.1.4(webpack@5.95.0))(webpack@5.95.0(@swc/core@1.7.28)(webpack-cli@5.1.4)) + '@webpack-cli/serve': 2.0.5(webpack-cli@5.1.4(webpack@5.95.0))(webpack@5.95.0(@swc/core@1.7.28)(webpack-cli@5.1.4)) colorette: 2.0.20 commander: 10.0.1 cross-spawn: 7.0.5 @@ -35894,19 +35925,19 @@ snapshots: import-local: 3.2.0 interpret: 3.1.1 rechoir: 0.8.0 - webpack: 5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(webpack-cli@5.1.4) + webpack: 5.95.0(@swc/core@1.7.28)(webpack-cli@5.1.4) webpack-merge: 5.10.0 - webpack-dev-middleware@5.3.4(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))): + webpack-dev-middleware@5.3.4(webpack@5.95.0): dependencies: colorette: 2.0.20 memfs: 3.5.3 mime-types: 2.1.35 range-parser: 1.2.1 schema-utils: 4.2.0 - webpack: 5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5)) + webpack: 5.95.0 - webpack-dev-server@4.15.2(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))): + webpack-dev-server@4.15.2(webpack@5.95.0): dependencies: '@types/bonjour': 3.5.13 '@types/connect-history-api-fallback': 1.5.4 @@ -35936,10 +35967,10 @@ snapshots: serve-index: 1.9.1 sockjs: 0.3.24 spdy: 4.0.2 - webpack-dev-middleware: 5.3.4(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))) + webpack-dev-middleware: 5.3.4(webpack@5.95.0) ws: 8.18.0 optionalDependencies: - webpack: 5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5)) + webpack: 5.95.0 transitivePeerDependencies: - bufferutil - debug @@ -35958,7 +35989,37 @@ snapshots: webpack-virtual-modules@0.6.2: {} - webpack@5.94.0(@swc/core@1.7.28(@swc/helpers@0.5.5)): + webpack@5.94.0(@swc/core@1.7.28): + dependencies: + '@types/estree': 1.0.6 + '@webassemblyjs/ast': 1.12.1 + '@webassemblyjs/wasm-edit': 1.12.1 + '@webassemblyjs/wasm-parser': 1.12.1 + acorn: 8.12.1 + acorn-import-attributes: 1.9.5(acorn@8.12.1) + browserslist: 4.24.0 + chrome-trace-event: 1.0.4 + enhanced-resolve: 5.17.1 + es-module-lexer: 1.5.4 + eslint-scope: 5.1.1 + events: 3.3.0 + glob-to-regexp: 0.4.1 + graceful-fs: 4.2.11 + json-parse-even-better-errors: 2.3.1 + loader-runner: 4.3.0 + mime-types: 2.1.35 + neo-async: 2.6.2 + schema-utils: 3.3.0 + tapable: 2.2.1 + terser-webpack-plugin: 5.3.10(@swc/core@1.7.28)(webpack@5.94.0(@swc/core@1.7.28)) + watchpack: 2.4.2 + webpack-sources: 3.2.3 + transitivePeerDependencies: + - '@swc/core' + - esbuild + - uglify-js + + webpack@5.95.0: dependencies: '@types/estree': 1.0.6 '@webassemblyjs/ast': 1.12.1 @@ -35980,7 +36041,7 @@ snapshots: neo-async: 2.6.2 schema-utils: 3.3.0 tapable: 2.2.1 - terser-webpack-plugin: 5.3.10(@swc/core@1.7.28(@swc/helpers@0.5.5))(webpack@5.94.0(@swc/core@1.7.28(@swc/helpers@0.5.5))) + terser-webpack-plugin: 5.3.10(webpack@5.95.0) watchpack: 2.4.2 webpack-sources: 3.2.3 transitivePeerDependencies: @@ -35988,7 +36049,7 @@ snapshots: - esbuild - uglify-js - webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5)): + webpack@5.95.0(@swc/core@1.7.28): dependencies: '@types/estree': 1.0.6 '@webassemblyjs/ast': 1.12.1 @@ -36010,7 +36071,7 @@ snapshots: neo-async: 2.6.2 schema-utils: 3.3.0 tapable: 2.2.1 - terser-webpack-plugin: 5.3.10(@swc/core@1.7.28(@swc/helpers@0.5.5))(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))) + terser-webpack-plugin: 5.3.10(@swc/core@1.7.28)(webpack@5.95.0(@swc/core@1.7.28)) watchpack: 2.4.2 webpack-sources: 3.2.3 transitivePeerDependencies: @@ -36018,7 +36079,7 @@ snapshots: - esbuild - uglify-js - webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(webpack-cli@5.1.4): + webpack@5.95.0(@swc/core@1.7.28)(webpack-cli@5.1.4): dependencies: '@types/estree': 1.0.6 '@webassemblyjs/ast': 1.12.1 @@ -36040,7 +36101,7 @@ snapshots: neo-async: 2.6.2 schema-utils: 3.3.0 tapable: 2.2.1 - terser-webpack-plugin: 5.3.10(@swc/core@1.7.28(@swc/helpers@0.5.5))(webpack@5.95.0) + terser-webpack-plugin: 5.3.10(@swc/core@1.7.28)(webpack@5.95.0(@swc/core@1.7.28)(webpack-cli@5.1.4)) watchpack: 2.4.2 webpack-sources: 3.2.3 optionalDependencies: @@ -36050,13 +36111,13 @@ snapshots: - esbuild - uglify-js - webpackbar@5.0.2(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))): + webpackbar@5.0.2(webpack@5.95.0): dependencies: chalk: 4.1.2 consola: 2.15.3 pretty-time: 1.1.0 std-env: 3.7.0 - webpack: 5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5)) + webpack: 5.95.0 websocket-driver@0.7.4: dependencies: @@ -36066,10 +36127,6 @@ snapshots: websocket-extensions@0.1.4: {} - whatwg-encoding@2.0.0: - dependencies: - iconv-lite: 0.6.3 - whatwg-encoding@3.1.1: dependencies: iconv-lite: 0.6.3 From 2a755892a5b358500b2767c2ad557d3b31437fe3 Mon Sep 17 00:00:00 2001 From: Levente Pap <levente.pap@iota.org> Date: Thu, 12 Dec 2024 11:52:36 +0100 Subject: [PATCH 35/97] feat: bump iota to v0.8.0-alpha (#4446) * feat: bump iota to v0.8.0-alpha * fix: graphql-e2e-tests --- Cargo.lock | 232 +++++++++--------- Cargo.toml | 2 +- .../tests/call/simple.exp | 6 +- crates/iota-open-rpc/spec/openrpc.json | 2 +- 4 files changed, 121 insertions(+), 121 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 272c5b18d44..c0b1c6e29bf 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1831,7 +1831,7 @@ checksum = "230c5f1ca6a325a32553f8640d31ac9b49f2411e901e427570154868b46da4f7" [[package]] name = "bin-version" -version = "0.7.0-alpha" +version = "0.8.0-alpha" dependencies = [ "const-str", "git-version", @@ -3669,14 +3669,14 @@ checksum = "fea41bba32d969b513997752735605054bc0dfa92b4c56bf1189f2e174be7a10" [[package]] name = "docs-examples" -version = "0.7.0-alpha" +version = "0.8.0-alpha" dependencies = [ "anyhow", "bcs", "bip32", "iota-keys", "iota-move-build", - "iota-sdk 0.7.0-alpha", + "iota-sdk 0.8.0-alpha", "move-binary-format", "move-core-types", "serde_json", @@ -5714,7 +5714,7 @@ checksum = "8bb03732005da905c88227371639bf1ad885cc712789c011c31c5fb3ab3ccf02" [[package]] name = "iota" -version = "0.7.0-alpha" +version = "0.8.0-alpha" dependencies = [ "anemo", "anyhow", @@ -5759,7 +5759,7 @@ dependencies = [ "iota-package-management", "iota-protocol-config", "iota-replay", - "iota-sdk 0.7.0-alpha", + "iota-sdk 0.8.0-alpha", "iota-simulator", "iota-source-validation", "iota-swarm", @@ -5838,7 +5838,7 @@ dependencies = [ [[package]] name = "iota-adapter-transactional-tests" -version = "0.7.0-alpha" +version = "0.8.0-alpha" dependencies = [ "datatest-stable", "iota-transactional-test-runner", @@ -5846,7 +5846,7 @@ dependencies = [ [[package]] name = "iota-analytics-indexer" -version = "0.7.0-alpha" +version = "0.8.0-alpha" dependencies = [ "anyhow", "arrow", @@ -5897,7 +5897,7 @@ dependencies = [ [[package]] name = "iota-analytics-indexer-derive" -version = "0.7.0-alpha" +version = "0.8.0-alpha" dependencies = [ "proc-macro2 1.0.86", "quote 1.0.37", @@ -5906,7 +5906,7 @@ dependencies = [ [[package]] name = "iota-archival" -version = "0.7.0-alpha" +version = "0.8.0-alpha" dependencies = [ "anyhow", "byteorder", @@ -5938,7 +5938,7 @@ dependencies = [ [[package]] name = "iota-authority-aggregation" -version = "0.7.0-alpha" +version = "0.8.0-alpha" dependencies = [ "futures", "iota-metrics", @@ -5949,7 +5949,7 @@ dependencies = [ [[package]] name = "iota-aws-orchestrator" -version = "0.7.0-alpha" +version = "0.8.0-alpha" dependencies = [ "async-trait", "aws-config", @@ -5980,7 +5980,7 @@ dependencies = [ [[package]] name = "iota-benchmark" -version = "0.7.0-alpha" +version = "0.8.0-alpha" dependencies = [ "anyhow", "async-trait", @@ -6002,7 +6002,7 @@ dependencies = [ "iota-metrics", "iota-network", "iota-protocol-config", - "iota-sdk 0.7.0-alpha", + "iota-sdk 0.8.0-alpha", "iota-simulator", "iota-storage", "iota-surfer", @@ -6030,7 +6030,7 @@ dependencies = [ [[package]] name = "iota-bridge" -version = "0.7.0-alpha" +version = "0.8.0-alpha" dependencies = [ "anyhow", "arc-swap", @@ -6052,7 +6052,7 @@ dependencies = [ "iota-json-rpc-types", "iota-keys", "iota-metrics", - "iota-sdk 0.7.0-alpha", + "iota-sdk 0.8.0-alpha", "iota-test-transaction-builder", "iota-types", "lru 0.12.4", @@ -6079,7 +6079,7 @@ dependencies = [ [[package]] name = "iota-bridge-cli" -version = "0.7.0-alpha" +version = "0.8.0-alpha" dependencies = [ "anyhow", "clap", @@ -6090,7 +6090,7 @@ dependencies = [ "iota-config", "iota-json-rpc-types", "iota-keys", - "iota-sdk 0.7.0-alpha", + "iota-sdk 0.8.0-alpha", "iota-types", "move-core-types", "reqwest 0.12.7", @@ -6105,7 +6105,7 @@ dependencies = [ [[package]] name = "iota-bridge-indexer" -version = "0.7.0-alpha" +version = "0.8.0-alpha" dependencies = [ "anyhow", "async-trait", @@ -6121,7 +6121,7 @@ dependencies = [ "iota-indexer-builder", "iota-json-rpc-types", "iota-metrics", - "iota-sdk 0.7.0-alpha", + "iota-sdk 0.8.0-alpha", "iota-test-transaction-builder", "iota-types", "prometheus", @@ -6135,7 +6135,7 @@ dependencies = [ [[package]] name = "iota-cluster-test" -version = "0.7.0-alpha" +version = "0.8.0-alpha" dependencies = [ "anyhow", "async-trait", @@ -6153,7 +6153,7 @@ dependencies = [ "iota-json", "iota-json-rpc-types", "iota-keys", - "iota-sdk 0.7.0-alpha", + "iota-sdk 0.8.0-alpha", "iota-swarm", "iota-swarm-config", "iota-test-transaction-builder", @@ -6175,7 +6175,7 @@ dependencies = [ [[package]] name = "iota-common" -version = "0.7.0-alpha" +version = "0.8.0-alpha" dependencies = [ "futures", "parking_lot 0.12.3", @@ -6184,7 +6184,7 @@ dependencies = [ [[package]] name = "iota-config" -version = "0.7.0-alpha" +version = "0.8.0-alpha" dependencies = [ "anemo", "anyhow", @@ -6211,7 +6211,7 @@ dependencies = [ [[package]] name = "iota-core" -version = "0.7.0-alpha" +version = "0.8.0-alpha" dependencies = [ "anemo", "anyhow", @@ -6313,7 +6313,7 @@ dependencies = [ [[package]] name = "iota-cost" -version = "0.7.0-alpha" +version = "0.8.0-alpha" dependencies = [ "anyhow", "bcs", @@ -6368,7 +6368,7 @@ dependencies = [ [[package]] name = "iota-data-ingestion" -version = "0.7.0-alpha" +version = "0.8.0-alpha" dependencies = [ "anyhow", "async-trait", @@ -6402,7 +6402,7 @@ dependencies = [ [[package]] name = "iota-data-ingestion-core" -version = "0.7.0-alpha" +version = "0.8.0-alpha" dependencies = [ "anyhow", "async-trait", @@ -6429,7 +6429,7 @@ dependencies = [ [[package]] name = "iota-e2e-tests" -version = "0.7.0-alpha" +version = "0.8.0-alpha" dependencies = [ "anyhow", "async-trait", @@ -6460,7 +6460,7 @@ dependencies = [ "iota-node", "iota-protocol-config", "iota-rest-api", - "iota-sdk 0.7.0-alpha", + "iota-sdk 0.8.0-alpha", "iota-simulator", "iota-storage", "iota-swarm", @@ -6491,7 +6491,7 @@ dependencies = [ [[package]] name = "iota-enum-compat-util" -version = "0.7.0-alpha" +version = "0.8.0-alpha" dependencies = [ "serde_yaml", ] @@ -6529,7 +6529,7 @@ dependencies = [ [[package]] name = "iota-faucet" -version = "0.7.0-alpha" +version = "0.8.0-alpha" dependencies = [ "anyhow", "async-recursion", @@ -6543,7 +6543,7 @@ dependencies = [ "iota-json-rpc-types", "iota-keys", "iota-metrics", - "iota-sdk 0.7.0-alpha", + "iota-sdk 0.8.0-alpha", "iota-types", "parking_lot 0.12.3", "prometheus", @@ -6567,7 +6567,7 @@ dependencies = [ [[package]] name = "iota-framework" -version = "0.7.0-alpha" +version = "0.8.0-alpha" dependencies = [ "anyhow", "bcs", @@ -6588,7 +6588,7 @@ dependencies = [ [[package]] name = "iota-framework-snapshot" -version = "0.7.0-alpha" +version = "0.8.0-alpha" dependencies = [ "anyhow", "bcs", @@ -6603,7 +6603,7 @@ dependencies = [ [[package]] name = "iota-framework-tests" -version = "0.7.0-alpha" +version = "0.8.0-alpha" dependencies = [ "datatest-stable", "iota-adapter-latest", @@ -6623,7 +6623,7 @@ dependencies = [ [[package]] name = "iota-genesis-builder" -version = "0.7.0-alpha" +version = "0.8.0-alpha" dependencies = [ "anyhow", "bcs", @@ -6676,7 +6676,7 @@ dependencies = [ [[package]] name = "iota-genesis-common" -version = "0.7.0-alpha" +version = "0.8.0-alpha" dependencies = [ "iota-execution", "iota-protocol-config", @@ -6686,7 +6686,7 @@ dependencies = [ [[package]] name = "iota-graphql-config" -version = "0.7.0-alpha" +version = "0.8.0-alpha" dependencies = [ "quote 1.0.37", "syn 1.0.109", @@ -6694,7 +6694,7 @@ dependencies = [ [[package]] name = "iota-graphql-e2e-tests" -version = "0.7.0-alpha" +version = "0.8.0-alpha" dependencies = [ "datatest-stable", "iota-graphql-rpc", @@ -6705,7 +6705,7 @@ dependencies = [ [[package]] name = "iota-graphql-rpc" -version = "0.7.0-alpha" +version = "0.8.0-alpha" dependencies = [ "anyhow", "async-graphql", @@ -6744,7 +6744,7 @@ dependencies = [ "iota-package-resolver", "iota-protocol-config", "iota-rest-api", - "iota-sdk 0.7.0-alpha", + "iota-sdk 0.8.0-alpha", "iota-swarm-config", "iota-test-transaction-builder", "iota-types", @@ -6784,7 +6784,7 @@ dependencies = [ [[package]] name = "iota-graphql-rpc-client" -version = "0.7.0-alpha" +version = "0.8.0-alpha" dependencies = [ "anyhow", "async-graphql", @@ -6799,14 +6799,14 @@ dependencies = [ [[package]] name = "iota-graphql-rpc-headers" -version = "0.7.0-alpha" +version = "0.8.0-alpha" dependencies = [ "axum", ] [[package]] name = "iota-indexer" -version = "0.7.0-alpha" +version = "0.8.0-alpha" dependencies = [ "anyhow", "async-trait", @@ -6835,7 +6835,7 @@ dependencies = [ "iota-package-resolver", "iota-protocol-config", "iota-rest-api", - "iota-sdk 0.7.0-alpha", + "iota-sdk 0.8.0-alpha", "iota-swarm-config", "iota-test-transaction-builder", "iota-transaction-builder", @@ -6868,7 +6868,7 @@ dependencies = [ [[package]] name = "iota-indexer-builder" -version = "0.7.0-alpha" +version = "0.8.0-alpha" dependencies = [ "anyhow", "async-trait", @@ -6883,7 +6883,7 @@ dependencies = [ [[package]] name = "iota-json" -version = "0.7.0-alpha" +version = "0.8.0-alpha" dependencies = [ "anyhow", "bcs", @@ -6902,7 +6902,7 @@ dependencies = [ [[package]] name = "iota-json-rpc" -version = "0.7.0-alpha" +version = "0.8.0-alpha" dependencies = [ "anyhow", "arc-swap", @@ -6956,7 +6956,7 @@ dependencies = [ [[package]] name = "iota-json-rpc-api" -version = "0.7.0-alpha" +version = "0.8.0-alpha" dependencies = [ "anyhow", "fastcrypto", @@ -6975,7 +6975,7 @@ dependencies = [ [[package]] name = "iota-json-rpc-tests" -version = "0.7.0-alpha" +version = "0.8.0-alpha" dependencies = [ "anyhow", "async-trait", @@ -6994,7 +6994,7 @@ dependencies = [ "iota-open-rpc", "iota-open-rpc-macros", "iota-protocol-config", - "iota-sdk 0.7.0-alpha", + "iota-sdk 0.8.0-alpha", "iota-simulator", "iota-swarm-config", "iota-test-transaction-builder", @@ -7013,7 +7013,7 @@ dependencies = [ [[package]] name = "iota-json-rpc-types" -version = "0.7.0-alpha" +version = "0.8.0-alpha" dependencies = [ "anyhow", "bcs", @@ -7042,7 +7042,7 @@ dependencies = [ [[package]] name = "iota-keys" -version = "0.7.0-alpha" +version = "0.8.0-alpha" dependencies = [ "anyhow", "bip32", @@ -7061,7 +7061,7 @@ dependencies = [ [[package]] name = "iota-light-client" -version = "0.7.0-alpha" +version = "0.8.0-alpha" dependencies = [ "anyhow", "async-trait", @@ -7073,7 +7073,7 @@ dependencies = [ "iota-json-rpc-types", "iota-package-resolver", "iota-rest-api", - "iota-sdk 0.7.0-alpha", + "iota-sdk 0.8.0-alpha", "iota-types", "move-binary-format", "move-core-types", @@ -7085,7 +7085,7 @@ dependencies = [ [[package]] name = "iota-macros" -version = "0.7.0-alpha" +version = "0.8.0-alpha" dependencies = [ "futures", "iota-proc-macros", @@ -7095,7 +7095,7 @@ dependencies = [ [[package]] name = "iota-metric-checker" -version = "0.7.0-alpha" +version = "0.8.0-alpha" dependencies = [ "anyhow", "backoff", @@ -7116,7 +7116,7 @@ dependencies = [ [[package]] name = "iota-metrics" -version = "0.7.0-alpha" +version = "0.8.0-alpha" dependencies = [ "anemo", "anemo-tower", @@ -7139,7 +7139,7 @@ dependencies = [ [[package]] name = "iota-move" -version = "0.7.0-alpha" +version = "0.8.0-alpha" dependencies = [ "anyhow", "better_any", @@ -7177,7 +7177,7 @@ dependencies = [ [[package]] name = "iota-move-build" -version = "0.7.0-alpha" +version = "0.8.0-alpha" dependencies = [ "anyhow", "fastcrypto", @@ -7200,7 +7200,7 @@ dependencies = [ [[package]] name = "iota-move-lsp" -version = "0.7.0-alpha" +version = "0.8.0-alpha" dependencies = [ "bin-version", "clap", @@ -7231,7 +7231,7 @@ dependencies = [ [[package]] name = "iota-network" -version = "0.7.0-alpha" +version = "0.8.0-alpha" dependencies = [ "anemo", "anemo-build", @@ -7269,7 +7269,7 @@ dependencies = [ [[package]] name = "iota-network-stack" -version = "0.7.0-alpha" +version = "0.8.0-alpha" dependencies = [ "anemo", "bcs", @@ -7292,7 +7292,7 @@ dependencies = [ [[package]] name = "iota-node" -version = "0.7.0-alpha" +version = "0.8.0-alpha" dependencies = [ "anemo", "anemo-tower", @@ -7342,7 +7342,7 @@ dependencies = [ [[package]] name = "iota-open-rpc" -version = "0.7.0-alpha" +version = "0.8.0-alpha" dependencies = [ "anyhow", "bcs", @@ -7366,7 +7366,7 @@ dependencies = [ [[package]] name = "iota-open-rpc-macros" -version = "0.7.0-alpha" +version = "0.8.0-alpha" dependencies = [ "derive-syn-parse", "itertools 0.13.0", @@ -7378,7 +7378,7 @@ dependencies = [ [[package]] name = "iota-package-dump" -version = "0.7.0-alpha" +version = "0.8.0-alpha" dependencies = [ "anyhow", "bcs", @@ -7395,11 +7395,11 @@ dependencies = [ [[package]] name = "iota-package-management" -version = "0.7.0-alpha" +version = "0.8.0-alpha" dependencies = [ "anyhow", "iota-json-rpc-types", - "iota-sdk 0.7.0-alpha", + "iota-sdk 0.8.0-alpha", "iota-types", "move-core-types", "move-package", @@ -7410,7 +7410,7 @@ dependencies = [ [[package]] name = "iota-package-resolver" -version = "0.7.0-alpha" +version = "0.8.0-alpha" dependencies = [ "async-trait", "bcs", @@ -7433,7 +7433,7 @@ dependencies = [ [[package]] name = "iota-proc-macros" -version = "0.7.0-alpha" +version = "0.8.0-alpha" dependencies = [ "msim-macros", "proc-macro2 1.0.86", @@ -7443,7 +7443,7 @@ dependencies = [ [[package]] name = "iota-protocol-config" -version = "0.7.0-alpha" +version = "0.8.0-alpha" dependencies = [ "clap", "insta", @@ -7457,7 +7457,7 @@ dependencies = [ [[package]] name = "iota-protocol-config-macros" -version = "0.7.0-alpha" +version = "0.8.0-alpha" dependencies = [ "proc-macro2 1.0.86", "quote 1.0.37", @@ -7466,7 +7466,7 @@ dependencies = [ [[package]] name = "iota-replay" -version = "0.7.0-alpha" +version = "0.8.0-alpha" dependencies = [ "anyhow", "async-recursion", @@ -7482,7 +7482,7 @@ dependencies = [ "iota-json-rpc-api", "iota-json-rpc-types", "iota-protocol-config", - "iota-sdk 0.7.0-alpha", + "iota-sdk 0.8.0-alpha", "iota-storage", "iota-transaction-checks", "iota-types", @@ -7513,7 +7513,7 @@ dependencies = [ [[package]] name = "iota-rest-api" -version = "0.7.0-alpha" +version = "0.8.0-alpha" dependencies = [ "anyhow", "async-trait", @@ -7544,7 +7544,7 @@ dependencies = [ [[package]] name = "iota-rosetta" -version = "0.7.0-alpha" +version = "0.8.0-alpha" dependencies = [ "anyhow", "async-trait", @@ -7562,7 +7562,7 @@ dependencies = [ "iota-metrics", "iota-move-build", "iota-node", - "iota-sdk 0.7.0-alpha", + "iota-sdk 0.8.0-alpha", "iota-swarm-config", "iota-types", "move-core-types", @@ -7586,7 +7586,7 @@ dependencies = [ [[package]] name = "iota-rpc-loadgen" -version = "0.7.0-alpha" +version = "0.8.0-alpha" dependencies = [ "anyhow", "async-trait", @@ -7596,7 +7596,7 @@ dependencies = [ "futures", "iota-json-rpc-types", "iota-keys", - "iota-sdk 0.7.0-alpha", + "iota-sdk 0.8.0-alpha", "iota-types", "itertools 0.13.0", "serde", @@ -7631,7 +7631,7 @@ dependencies = [ [[package]] name = "iota-sdk" -version = "0.7.0-alpha" +version = "0.8.0-alpha" dependencies = [ "anyhow", "async-trait", @@ -7709,7 +7709,7 @@ dependencies = [ [[package]] name = "iota-simulator" -version = "0.7.0-alpha" +version = "0.8.0-alpha" dependencies = [ "anemo", "anemo-tower", @@ -7731,7 +7731,7 @@ dependencies = [ [[package]] name = "iota-single-node-benchmark" -version = "0.7.0-alpha" +version = "0.8.0-alpha" dependencies = [ "async-trait", "bcs", @@ -7766,7 +7766,7 @@ dependencies = [ [[package]] name = "iota-snapshot" -version = "0.7.0-alpha" +version = "0.8.0-alpha" dependencies = [ "anyhow", "bcs", @@ -7794,7 +7794,7 @@ dependencies = [ [[package]] name = "iota-source-validation" -version = "0.7.0-alpha" +version = "0.8.0-alpha" dependencies = [ "anyhow", "colored", @@ -7804,7 +7804,7 @@ dependencies = [ "iota-json-rpc-types", "iota-move-build", "iota-package-management", - "iota-sdk 0.7.0-alpha", + "iota-sdk 0.8.0-alpha", "iota-test-transaction-builder", "iota-types", "move-binary-format", @@ -7826,7 +7826,7 @@ dependencies = [ [[package]] name = "iota-source-validation-service" -version = "0.7.0-alpha" +version = "0.8.0-alpha" dependencies = [ "anyhow", "axum", @@ -7842,7 +7842,7 @@ dependencies = [ "iota-metrics", "iota-move", "iota-move-build", - "iota-sdk 0.7.0-alpha", + "iota-sdk 0.8.0-alpha", "iota-source-validation", "jsonrpsee", "move-compiler", @@ -7865,7 +7865,7 @@ dependencies = [ [[package]] name = "iota-storage" -version = "0.7.0-alpha" +version = "0.8.0-alpha" dependencies = [ "anyhow", "async-trait", @@ -7919,7 +7919,7 @@ dependencies = [ [[package]] name = "iota-surfer" -version = "0.7.0-alpha" +version = "0.8.0-alpha" dependencies = [ "async-trait", "bcs", @@ -7948,7 +7948,7 @@ dependencies = [ [[package]] name = "iota-swarm" -version = "0.7.0-alpha" +version = "0.8.0-alpha" dependencies = [ "anyhow", "futures", @@ -7973,7 +7973,7 @@ dependencies = [ [[package]] name = "iota-swarm-config" -version = "0.7.0-alpha" +version = "0.8.0-alpha" dependencies = [ "anemo", "anyhow", @@ -8000,12 +8000,12 @@ dependencies = [ [[package]] name = "iota-test-transaction-builder" -version = "0.7.0-alpha" +version = "0.8.0-alpha" dependencies = [ "bcs", "iota-genesis-builder", "iota-move-build", - "iota-sdk 0.7.0-alpha", + "iota-sdk 0.8.0-alpha", "iota-types", "move-core-types", "shared-crypto", @@ -8013,7 +8013,7 @@ dependencies = [ [[package]] name = "iota-tls" -version = "0.7.0-alpha" +version = "0.8.0-alpha" dependencies = [ "anyhow", "axum", @@ -8034,7 +8034,7 @@ dependencies = [ [[package]] name = "iota-tool" -version = "0.7.0-alpha" +version = "0.8.0-alpha" dependencies = [ "anemo", "anemo-cli", @@ -8056,7 +8056,7 @@ dependencies = [ "iota-package-dump", "iota-protocol-config", "iota-replay", - "iota-sdk 0.7.0-alpha", + "iota-sdk 0.8.0-alpha", "iota-snapshot", "iota-storage", "iota-types", @@ -8079,7 +8079,7 @@ dependencies = [ [[package]] name = "iota-transaction-builder" -version = "0.7.0-alpha" +version = "0.8.0-alpha" dependencies = [ "anyhow", "async-trait", @@ -8095,7 +8095,7 @@ dependencies = [ [[package]] name = "iota-transaction-checks" -version = "0.7.0-alpha" +version = "0.8.0-alpha" dependencies = [ "fastcrypto-zkp", "iota-config", @@ -8109,7 +8109,7 @@ dependencies = [ [[package]] name = "iota-transactional-test-runner" -version = "0.7.0-alpha" +version = "0.8.0-alpha" dependencies = [ "anyhow", "async-trait", @@ -8158,7 +8158,7 @@ dependencies = [ [[package]] name = "iota-types" -version = "0.7.0-alpha" +version = "0.8.0-alpha" dependencies = [ "anemo", "anyhow", @@ -8239,7 +8239,7 @@ dependencies = [ [[package]] name = "iota-upgrade-compatibility-transactional-tests" -version = "0.7.0-alpha" +version = "0.8.0-alpha" dependencies = [ "anyhow", "datatest-stable", @@ -8253,7 +8253,7 @@ dependencies = [ [[package]] name = "iota-util-mem" -version = "0.7.0-alpha" +version = "0.8.0-alpha" dependencies = [ "cfg-if", "ed25519-consensus", @@ -8271,7 +8271,7 @@ dependencies = [ [[package]] name = "iota-util-mem-derive" -version = "0.7.0-alpha" +version = "0.8.0-alpha" dependencies = [ "proc-macro2 1.0.86", "syn 1.0.109", @@ -8295,7 +8295,7 @@ dependencies = [ [[package]] name = "iota-verifier-transactional-tests" -version = "0.7.0-alpha" +version = "0.8.0-alpha" dependencies = [ "datatest-stable", "iota-transactional-test-runner", @@ -11766,7 +11766,7 @@ dependencies = [ [[package]] name = "prometheus-closure-metric" -version = "0.7.0-alpha" +version = "0.8.0-alpha" dependencies = [ "anyhow", "prometheus", @@ -13569,7 +13569,7 @@ dependencies = [ [[package]] name = "shared-crypto" -version = "0.7.0-alpha" +version = "0.8.0-alpha" dependencies = [ "bcs", "eyre", @@ -13705,7 +13705,7 @@ dependencies = [ [[package]] name = "simulacrum" -version = "0.7.0-alpha" +version = "0.8.0-alpha" dependencies = [ "anyhow", "async-trait", @@ -14421,7 +14421,7 @@ dependencies = [ [[package]] name = "telemetry-subscribers" -version = "0.7.0-alpha" +version = "0.8.0-alpha" dependencies = [ "atomic_float", "bytes", @@ -14497,7 +14497,7 @@ checksum = "3369f5ac52d5eb6ab48c6b4ffdc8efbcad6b89c765749064ba298f2c68a16a76" [[package]] name = "test-cluster" -version = "0.7.0-alpha" +version = "0.8.0-alpha" dependencies = [ "anyhow", "bcs", @@ -14517,7 +14517,7 @@ dependencies = [ "iota-metrics", "iota-node", "iota-protocol-config", - "iota-sdk 0.7.0-alpha", + "iota-sdk 0.8.0-alpha", "iota-simulator", "iota-swarm", "iota-swarm-config", @@ -15238,7 +15238,7 @@ dependencies = [ [[package]] name = "transaction-fuzzer" -version = "0.7.0-alpha" +version = "0.8.0-alpha" dependencies = [ "iota-core", "iota-move-build", @@ -15344,7 +15344,7 @@ dependencies = [ [[package]] name = "typed-store" -version = "0.7.0-alpha" +version = "0.8.0-alpha" dependencies = [ "async-trait", "bcs", @@ -15375,7 +15375,7 @@ dependencies = [ [[package]] name = "typed-store-derive" -version = "0.7.0-alpha" +version = "0.8.0-alpha" dependencies = [ "itertools 0.13.0", "proc-macro2 1.0.86", @@ -15385,7 +15385,7 @@ dependencies = [ [[package]] name = "typed-store-error" -version = "0.7.0-alpha" +version = "0.8.0-alpha" dependencies = [ "serde", "thiserror", @@ -15393,7 +15393,7 @@ dependencies = [ [[package]] name = "typed-store-workspace-hack" -version = "0.7.0-alpha" +version = "0.8.0-alpha" dependencies = [ "libc", "memchr", diff --git a/Cargo.toml b/Cargo.toml index d9a5cb5b76b..277ac3a5492 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -161,7 +161,7 @@ members = [ [workspace.package] # This version string will be inherited by iota-core, iota-faucet, iota-node, iota-tools, iota-sdk, iota-move-build, and iota crates. -version = "0.7.0-alpha" +version = "0.8.0-alpha" [profile.release] # debug = 1 means line charts only, which is minimum needed for good stack traces diff --git a/crates/iota-graphql-e2e-tests/tests/call/simple.exp b/crates/iota-graphql-e2e-tests/tests/call/simple.exp index b4c44eda117..732d92b4bd4 100644 --- a/crates/iota-graphql-e2e-tests/tests/call/simple.exp +++ b/crates/iota-graphql-e2e-tests/tests/call/simple.exp @@ -114,11 +114,11 @@ task 15, lines 64-69: Headers: { "content-type": "application/json", "content-length": "157", - "x-iota-rpc-version": "0.7.0-testing-no-sha", + "x-iota-rpc-version": "0.8.0-testing-no-sha", "vary": "origin, access-control-request-method, access-control-request-headers", "access-control-allow-origin": "*", } -Service version: 0.7.0-testing-no-sha +Service version: 0.8.0-testing-no-sha Response: { "data": { "checkpoint": { @@ -375,7 +375,7 @@ Response: { "data": { "serviceConfig": { "availableVersions": [ - "0.7" + "0.8" ] } } diff --git a/crates/iota-open-rpc/spec/openrpc.json b/crates/iota-open-rpc/spec/openrpc.json index f5ca3c7c01e..5a54a311381 100644 --- a/crates/iota-open-rpc/spec/openrpc.json +++ b/crates/iota-open-rpc/spec/openrpc.json @@ -12,7 +12,7 @@ "name": "Apache-2.0", "url": "https://raw.githubusercontent.com/iotaledger/iota/main/LICENSE" }, - "version": "0.7.0-alpha" + "version": "0.8.0-alpha" }, "methods": [ { From b6e2f4014f78414484dd4508df551924d9aa1ca3 Mon Sep 17 00:00:00 2001 From: Junwei <v860117@gmail.com> Date: Thu, 12 Dec 2024 20:03:10 +0800 Subject: [PATCH 36/97] fix(workflow): remove duplicate definition (#4474) --- .github/workflows/release_docker.yml | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/.github/workflows/release_docker.yml b/.github/workflows/release_docker.yml index 0cdf3645e19..9acbe8dcc40 100644 --- a/.github/workflows/release_docker.yml +++ b/.github/workflows/release_docker.yml @@ -87,8 +87,6 @@ jobs: with: context: . file: docker/iota-node/Dockerfile - build-args: | - RUST_IMAGE_VERSION=${{ env.TOOLCHAIN_VERSION }}-bookworm platforms: linux/amd64 tags: ${{ steps.meta-node.outputs.tags }} push: true @@ -96,6 +94,7 @@ jobs: build-args: | GIT_REVISION=${{ env.GIT_REVISION }} BUILD_DATE=${{ env.BUILD_DATE }} + RUST_IMAGE_VERSION=${{ env.TOOLCHAIN_VERSION }}-bookworm build-iota-indexer: if: github.event_name == 'workflow_dispatch' && github.event.inputs.iota_indexer == 'true' || github.event_name == 'release' @@ -157,8 +156,6 @@ jobs: with: context: . file: docker/iota-indexer/Dockerfile - build-args: | - RUST_IMAGE_VERSION=${{ env.TOOLCHAIN_VERSION }}-bookworm platforms: linux/amd64 tags: ${{ steps.meta-indexer.outputs.tags }} push: true @@ -166,6 +163,7 @@ jobs: build-args: | GIT_REVISION=${{ env.GIT_REVISION }} BUILD_DATE=${{ env.BUILD_DATE }} + RUST_IMAGE_VERSION=${{ env.TOOLCHAIN_VERSION }}-bookworm build-iota-tools: if: github.event_name == 'workflow_dispatch' && github.event.inputs.iota_tools == 'true' || github.event_name == 'release' @@ -227,8 +225,6 @@ jobs: with: context: . file: docker/iota-tools/Dockerfile - build-args: | - RUST_IMAGE_VERSION=${{ env.TOOLCHAIN_VERSION }}-bookworm platforms: linux/amd64 tags: ${{ steps.meta-tools.outputs.tags }} push: true @@ -236,6 +232,7 @@ jobs: build-args: | GIT_REVISION=${{ env.GIT_REVISION }} BUILD_DATE=${{ env.BUILD_DATE }} + RUST_IMAGE_VERSION=${{ env.TOOLCHAIN_VERSION }}-bookworm build-iota-graphql-rpc: if: github.event_name == 'workflow_dispatch' && github.event.inputs.iota_graphql_rpc == 'true' || github.event_name == 'release' @@ -297,8 +294,6 @@ jobs: with: context: . file: docker/iota-graphql-rpc/Dockerfile - build-args: | - RUST_IMAGE_VERSION=${{ env.TOOLCHAIN_VERSION }}-bookworm platforms: linux/amd64 tags: ${{ steps.meta-tools.outputs.tags }} push: true @@ -306,3 +301,4 @@ jobs: build-args: | GIT_REVISION=${{ env.GIT_REVISION }} BUILD_DATE=${{ env.BUILD_DATE }} + RUST_IMAGE_VERSION=${{ env.TOOLCHAIN_VERSION }}-bookworm From 2b73ad7ac94573d1169cf8e13f2d28d6c03b234c Mon Sep 17 00:00:00 2001 From: JannemanDev <j.oonk@fontys.nl> Date: Thu, 12 Dec 2024 13:17:39 +0100 Subject: [PATCH 37/97] fix(docs): Fix typo (#4145) --- docs/content/developer/iota-move-ctf/introduction.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/content/developer/iota-move-ctf/introduction.mdx b/docs/content/developer/iota-move-ctf/introduction.mdx index 1b33e9f4639..c455535f862 100644 --- a/docs/content/developer/iota-move-ctf/introduction.mdx +++ b/docs/content/developer/iota-move-ctf/introduction.mdx @@ -21,7 +21,7 @@ The CTF contract are already deployed on the IOTA Testnet. To get started, you n 1. [Install the IOTA CLI Tool](../getting-started/install-iota.mdx) 2. [Connect to an IOTA Network](../getting-started/connect.mdx) -3. [Create and Address](../getting-started/get-address.mdx) +3. [Create an Address](../getting-started/get-address.mdx) 4. [Fund Your Address](../getting-started/get-coins.mdx) 5. Get the flags! From 882cbc4fb58c058415ad31d777894f12e1d6ac06 Mon Sep 17 00:00:00 2001 From: evavirseda <evirseda@boxfish.studio> Date: Thu, 12 Dec 2024 17:20:37 +0100 Subject: [PATCH 38/97] feat(sdk/dappkit): fix styles in the dropdown (#4374) * feat: fix styels * feat: add scrollable content * add item height --- .../src/components/AccountDropdownMenu.css.ts | 9 ++++++++- .../src/components/AccountDropdownMenu.tsx | 16 +++++++++------- 2 files changed, 17 insertions(+), 8 deletions(-) diff --git a/sdk/dapp-kit/src/components/AccountDropdownMenu.css.ts b/sdk/dapp-kit/src/components/AccountDropdownMenu.css.ts index ef0b38e5e9f..54b2ca54071 100644 --- a/sdk/dapp-kit/src/components/AccountDropdownMenu.css.ts +++ b/sdk/dapp-kit/src/components/AccountDropdownMenu.css.ts @@ -18,7 +18,7 @@ export const menuContent = style({ display: 'flex', flexDirection: 'column', width: 180, - maxHeight: 200, + maxHeight: 300, marginTop: 4, padding: 8, gap: 8, @@ -26,8 +26,15 @@ export const menuContent = style({ backgroundColor: themeVars.backgroundColors.dropdownMenu, }); +export const scrollableContent = style({ + overflowY: 'auto', + maxHeight: 300, + flexGrow: 1, +}); + export const menuItem = style({ padding: 8, + height: 40, userSelect: 'none', outline: 'none', display: 'flex', diff --git a/sdk/dapp-kit/src/components/AccountDropdownMenu.tsx b/sdk/dapp-kit/src/components/AccountDropdownMenu.tsx index cb602d9ebe1..9981b316814 100644 --- a/sdk/dapp-kit/src/components/AccountDropdownMenu.tsx +++ b/sdk/dapp-kit/src/components/AccountDropdownMenu.tsx @@ -41,13 +41,15 @@ export function AccountDropdownMenu({ currentAccount, size = 'lg' }: AccountDrop <DropdownMenu.Portal> <StyleMarker className={styles.menuContainer}> <DropdownMenu.Content className={styles.menuContent}> - {accounts.map((account) => ( - <AccountDropdownMenuItem - key={account.address} - account={account} - active={currentAccount.address === account.address} - /> - ))} + <div className={styles.scrollableContent}> + {accounts.map((account) => ( + <AccountDropdownMenuItem + key={account.address} + account={account} + active={currentAccount.address === account.address} + /> + ))} + </div> <DropdownMenu.Separator className={styles.separator} /> <DropdownMenu.Item className={clsx(styles.menuItem)} From c879d571086c2dda27d61c0a5ec8cabf59a13c3d Mon Sep 17 00:00:00 2001 From: JCNoguera <88061365+VmMad@users.noreply.github.com> Date: Thu, 12 Dec 2024 19:52:09 +0100 Subject: [PATCH 39/97] chore(explorer): only show max 15 elents in the activity table (#4482) --- apps/explorer/src/pages/home/Home.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/explorer/src/pages/home/Home.tsx b/apps/explorer/src/pages/home/Home.tsx index 057cb1c9e64..1cee4ba88ab 100644 --- a/apps/explorer/src/pages/home/Home.tsx +++ b/apps/explorer/src/pages/home/Home.tsx @@ -19,7 +19,7 @@ import { } from '~/components'; import { useNetwork } from '~/hooks'; -const TRANSACTIONS_LIMIT = 25; +const TRANSACTIONS_LIMIT = 15; function Home(): JSX.Element { const [network] = useNetwork(); From 4c11b01732b66a61c5c82c3290f954d78234d94f Mon Sep 17 00:00:00 2001 From: JCNoguera <88061365+VmMad@users.noreply.github.com> Date: Thu, 12 Dec 2024 19:53:35 +0100 Subject: [PATCH 40/97] fix(ui-kit): only call onClick if `Card` is not disabled (#4479) --- apps/ui-kit/src/lib/components/molecules/card/Card.tsx | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/apps/ui-kit/src/lib/components/molecules/card/Card.tsx b/apps/ui-kit/src/lib/components/molecules/card/Card.tsx index 1870f2e77c9..cc1b8368349 100644 --- a/apps/ui-kit/src/lib/components/molecules/card/Card.tsx +++ b/apps/ui-kit/src/lib/components/molecules/card/Card.tsx @@ -46,9 +46,14 @@ export function Card({ children, testId, }: CardProps) { + function handleOnClick() { + if (!isDisabled) { + onClick?.(); + } + } return ( <div - onClick={onClick} + onClick={handleOnClick} className={cx( 'relative inline-flex w-full items-center gap-3 rounded-xl px-sm py-xs', CARD_TYPE_CLASSES[type], From 9864dcb05fd8aef29d3cc152f3c3224a50bde4ed Mon Sep 17 00:00:00 2001 From: cpl121 <100352899+cpl121@users.noreply.github.com> Date: Thu, 12 Dec 2024 20:10:38 +0100 Subject: [PATCH 41/97] feat(sdk): add kiosk rules package id to .env.defaults for testnet(#4434) * feat(sdk): add kiosk rules package id to .env.defaults * feat(sdk): add a changeset --- .changeset/silly-bulldogs-divide.md | 6 ++++++ sdk/.env.defaults | 8 +++++++- 2 files changed, 13 insertions(+), 1 deletion(-) create mode 100644 .changeset/silly-bulldogs-divide.md diff --git a/.changeset/silly-bulldogs-divide.md b/.changeset/silly-bulldogs-divide.md new file mode 100644 index 00000000000..9db48e0918f --- /dev/null +++ b/.changeset/silly-bulldogs-divide.md @@ -0,0 +1,6 @@ +--- +'@iota/kiosk': minor +'@iota/iota-sdk': minor +--- + +Add default royalty, kiosk lock, floor price & personal kiosk rules package ids to testnet network diff --git a/sdk/.env.defaults b/sdk/.env.defaults index 2d1458fa6dc..e876e2d7a9b 100644 --- a/sdk/.env.defaults +++ b/sdk/.env.defaults @@ -10,7 +10,13 @@ IOTA_NETWORKS = ' "url": "https://api.testnet.iota.cafe", "explorer": "https://explorer.rebased.iota.org", "chain": "iota:testnet", - "faucet": "https://faucet.testnet.iota.cafe" + "faucet": "https://faucet.testnet.iota.cafe", + "kiosk": { + "royaltyRulePackageId": "0x975f749f57701209454e4b9b9e33825ccb6a9abf57de2ce86979e5fa86c343f2", + "kioskLockRulePackageId": "0x975f749f57701209454e4b9b9e33825ccb6a9abf57de2ce86979e5fa86c343f2", + "floorPriceRulePackageId": "0x975f749f57701209454e4b9b9e33825ccb6a9abf57de2ce86979e5fa86c343f2", + "personalKioskRulePackageId": "0x975f749f57701209454e4b9b9e33825ccb6a9abf57de2ce86979e5fa86c343f2" + } }, "devnet": { "id": "devnet", From a183192c71d66329c2d730f466dddaaa4ef978c1 Mon Sep 17 00:00:00 2001 From: Thoralf-M <46689931+Thoralf-M@users.noreply.github.com> Date: Fri, 13 Dec 2024 09:50:00 +0100 Subject: [PATCH 42/97] feat(workflows): add release_move_ide.yml (#4332) * feat(workflows): add release_move_ide.yml * Fix target and filename, make binaries executable, update package.json * Remove push: branches: * Don't install nextest * Remove outdated comment --- .github/workflows/release_move_ide.yml | 143 ++++++++++++++++++ .../move-analyzer/editors/code/package.json | 7 +- .../editors/code/scripts/create_from_local.sh | 119 +++++++++++++++ .../move-analyzer/editors/code/src/context.ts | 4 +- 4 files changed, 268 insertions(+), 5 deletions(-) create mode 100644 .github/workflows/release_move_ide.yml create mode 100755 external-crates/move/crates/move-analyzer/editors/code/scripts/create_from_local.sh diff --git a/.github/workflows/release_move_ide.yml b/.github/workflows/release_move_ide.yml new file mode 100644 index 00000000000..553b02e1f86 --- /dev/null +++ b/.github/workflows/release_move_ide.yml @@ -0,0 +1,143 @@ +name: Release Move IDE to VS Marketplace + +on: + ## Allow triggering this workflow manually via GitHub CLI/web + workflow_dispatch: + +env: + CARGO_TERM_COLOR: always + # Disable incremental compilation. + # + # Incremental compilation is useful as part of an edit-build-test-edit cycle, + # as it lets the compiler avoid recompiling code that hasn't changed. However, + # on CI, we're not making small edits; we're almost always building the entire + # project from scratch. Thus, incremental compilation on CI actually + # introduces *additional* overhead to support making future builds + # faster...but no future builds will ever occur in any given CI environment. + # + # See https://matklad.github.io/2021/09/04/fast-rust-builds.html#ci-workflow + # for details. + CARGO_INCREMENTAL: 0 + # Allow more retries for network requests in cargo (downloading crates) and + # rustup (installing toolchains). This should help to reduce flaky CI failures + # from transient network timeouts or other issues. + CARGO_NET_RETRY: 10 + RUSTUP_MAX_RETRIES: 10 + # Don't emit giant backtraces in the CI logs. + RUST_BACKTRACE: short + TMP_BUILD_DIR: "./tmp/" + +jobs: + build-move-analyzer: + name: Build move-analyzer + strategy: + matrix: + os: [ + self-hosted, # ubuntu-x86_64 + macos-latest, # macos-arm64 + macos-latest-large, # macos-x86_64 + windows-latest, # windows-x86_64 + ] + fail-fast: false + runs-on: ${{ matrix.os }} + steps: + - uses: actions/checkout@eef61447b9ff4aafe5dcd4e0bbf5d482be7e7871 # pin@v4 + - name: Set os/arch variables (Windows) + if: ${{ matrix.os == 'windows-latest' }} + shell: bash + run: | + export arch=$(uname -m) + export os_type="windows-${arch}" + echo "os_type=${os_type}" >> $GITHUB_ENV + echo "extention=$(echo ".exe")" >> $GITHUB_ENV + + - name: Set os/arch variables (self hosted ubuntu) + if: ${{ matrix.os == 'self-hosted' }} + shell: bash + run: | + export arch=$(uname -m) + export os_type="linux-${arch}" + echo "os_type=${os_type}" >> $GITHUB_ENV + + - name: Set os/arch variables + if: ${{ matrix.os == 'macos-latest' }} + shell: bash + run: | + export arch=$(uname -m) + export system_os=$(echo ${{ matrix.os }} | cut -d- -f1) + export os_type="${system_os}-${arch}" + echo "os_type=${system_os}-${arch}" >> $GITHUB_ENV + + - name: Cargo build for ${{ matrix.os }} platform + shell: bash + run: | + [ -f ~/.cargo/env ] && source ~/.cargo/env ; cargo build --bin move-analyzer --release + + # Filenames need to match external-crates/move/crates/move-analyzer/editors/code/scripts/create_from_local.sh + - name: Rename binaries for ${{ matrix.os }} + shell: bash + run: | + if [ ${{ matrix.os }} == "macos-latest" ]; then + OS_TARGET="macos-arm64" + elif [ ${{ matrix.os }} == "macos-latest-large" ]; then + OS_TARGET="macos-x86_64" + elif [ ${{ matrix.os }} == "windows-latest" ]; then + OS_TARGET="windows-x86_64" + elif [ ${{ matrix.os }} == "self-hosted" ]; then + OS_TARGET="ubuntu-x86_64" + else + echo "Unknown OS" ${{ matrix.os }} + exit 1 + fi + + mkdir -p ${{ env.TMP_BUILD_DIR }} + mv ./target/release/move-analyzer${{ env.extention }} ${{ env.TMP_BUILD_DIR }}/move-analyzer-$OS_TARGET${{ env.extention }} + + - name: Print built file + run: ls -R ${{ env.TMP_BUILD_DIR }} + + - name: Upload move-analyzer binary + uses: actions/upload-artifact@v4 + with: + name: ${{ matrix.os }}-move-analyzer + path: ${{ env.TMP_BUILD_DIR }} + if-no-files-found: error + + build-and-publish-vs-code-extension: + name: Build and publish VS Code extension with move-analyzer binaries + needs: build-move-analyzer + runs-on: self-hosted + steps: + - name: Checkout + uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # Pin v4.1.1 + with: + ref: ${{ github.event.inputs.iota_repo_ref || github.ref }} + + - name: Download move-analyzer binaries + uses: actions/download-artifact@v4 + with: + merge-multiple: true + path: "external-crates/move/crates/move-analyzer/editors/code/move-analyzer-binaries" + + - name: Print downloaded binaries + run: ls -R external-crates/move/crates/move-analyzer/editors/code/move-analyzer-binaries + + - name: Setup Node + uses: actions/setup-node@60edb5dd545a775178f52524783378180af0d1f8 # pin@v4.0.2 + with: + node-version: "20" + + - name: Install dependencies + working-directory: ./external-crates/move/crates/move-analyzer/editors/code + run: | + npm install + npm install --save-dev @types/node @types/semver + npm install -g vsce + sudo apt install zsh -y + + - name: Build and publish VS Code extension with move-analyzer binaries + working-directory: external-crates/move/crates/move-analyzer/editors/code/ + run: | + # Set the Personal Access Token to publish to the Visual Studio Marketplace + export VSCE_PAT=${{ secrets.VS_MARKETPLACE_TOKEN }} + ./scripts/create_from_local.sh -pub move-analyzer-binaries diff --git a/external-crates/move/crates/move-analyzer/editors/code/package.json b/external-crates/move/crates/move-analyzer/editors/code/package.json index 7d23d4246b1..c5199da4812 100644 --- a/external-crates/move/crates/move-analyzer/editors/code/package.json +++ b/external-crates/move/crates/move-analyzer/editors/code/package.json @@ -23,6 +23,7 @@ "keywords": [ "move", "Iota", + "iotaledger", "IOTA Foundation" ], "main": "./out/src/main.js", @@ -124,13 +125,13 @@ "menus": { "commandPalette": [ { - "command": "iota.serverVersion" + "command": "iota-move.serverVersion" }, { - "command": "iota.build" + "command": "iota-move.build" }, { - "command": "iota.test" + "command": "iota-move.test" } ] } diff --git a/external-crates/move/crates/move-analyzer/editors/code/scripts/create_from_local.sh b/external-crates/move/crates/move-analyzer/editors/code/scripts/create_from_local.sh new file mode 100755 index 00000000000..0f9cd3c89e2 --- /dev/null +++ b/external-crates/move/crates/move-analyzer/editors/code/scripts/create_from_local.sh @@ -0,0 +1,119 @@ +#!/bin/zsh +# Copyright (c) Mysten Labs, Inc. +# Modifications Copyright (c) 2024 IOTA Stiftung +# SPDX-License-Identifier: Apache-2.0 + +set -e + +usage() { + SCRIPT_NAME=$(basename "$1") + >&2 echo "Usage: $SCRIPT_NAME -pkg|-pub [-h] BINDIR" + >&2 echo "" + >&2 echo "Options:" + >&2 echo " -pub Publish extensions for all targets" + >&2 echo " -pkg Package extensions for all targets" + >&2 echo " -h Print this message" + >&2 echo " BINDIR Directory containing pre-built IOTA move-analyzer binaries" +} + +clean_tmp_dir() { + test -d "$TMP_DIR" && rm -fr "$TMP_DIR" +} + +if [[ "$@" == "" ]]; then + usage $0 + exit 1 +fi + +BIN_DIR="" +for cmd in "$@" +do + if [[ "$cmd" == "-h" ]]; then + usage $0 + exit 0 + elif [[ "$cmd" == "-pkg" ]]; then + OP="package" + OPTS="-omove-VSCODE_OS.vsix" + elif [[ "$cmd" == "-pub" ]]; then + OP="publish" + OPTS="" + else + BIN_DIR=$cmd + + if [[ ! -d "$BIN_DIR" ]]; then + echo IOTA binary directory $BIN_DIR does not exist + usage $0 + exit 1 + fi + fi +done + +if [[ $BIN_DIR == "" ]]; then + # directory storing IOTA binaries have not been defined + usage $0 + exit 1 +fi + +# a map from os version identifiers in IOTA's binary distribution to os version identifiers +# representing VSCode's target platforms used for creating platform-specific plugin distributions +declare -A SUPPORTED_OS +SUPPORTED_OS[macos-arm64]=darwin-arm64 +SUPPORTED_OS[macos-x86_64]=darwin-x64 +SUPPORTED_OS[ubuntu-x86_64]=linux-x64 +SUPPORTED_OS[windows-x86_64]=win32-x64 + +TMP_DIR=$( mktemp -d -t vscode-createXXX ) +trap "clean_tmp_dir $TMP_DIR" EXIT + +BIN_FILES=($BIN_DIR/*) + +if (( ${#BIN_FILES[@]} != 4 )); then + echo "IOTA binary directory $BIN_DIR should only contain binaries for the four supported platforms" + exit 1 +fi + + +for IOTA_MOVE_ANALYZER_BIN in "${BIN_FILES[@]}"; do + echo "Processing" $IOTA_MOVE_ANALYZER_BIN + # Extract just the file name + FILE_NAME=${IOTA_MOVE_ANALYZER_BIN##*/} + # Get the OS target + OS_TARGET="${FILE_NAME#move-analyzer-}" + # Remove ".exe" for Windows + OS_TARGET="${OS_TARGET%.exe}" + + if [[ ! -v SUPPORTED_OS[$OS_TARGET] ]]; then + echo "Found IOTA binary archive for a platform that is not supported: $IOTA_MOVE_ANALYZER_BIN" + echo "Supported platforms:" + for PLATFORM in ${(k)SUPPORTED_OS}; do + echo "\t$PLATFORM" + done + exit 1 + fi + + # copy move-analyzer binary to the appropriate location where it's picked up when bundling the + # extension + LANG_SERVER_DIR="language-server" + # remove existing one to have only the binary for the target OS + rm -rf $LANG_SERVER_DIR + mkdir $LANG_SERVER_DIR + + # Copy renamed + if [[ "$IOTA_MOVE_ANALYZER_BIN" == *.exe ]]; then + cp $IOTA_MOVE_ANALYZER_BIN $LANG_SERVER_DIR/move-analyzer.exe + else + cp $IOTA_MOVE_ANALYZER_BIN $LANG_SERVER_DIR/move-analyzer + # Make binaries executable + chmod +x $LANG_SERVER_DIR/move-analyzer + fi + + VSCODE_OS=${SUPPORTED_OS[$OS_TARGET]} + vsce "$OP" ${OPTS//VSCODE_OS/$VSCODE_OS} --target "$VSCODE_OS" + + rm -rf $LANG_SERVER_DIR + +done + + +# build a "generic" version of the extension that does not bundle the move-analyzer binary +vsce "$OP" ${OPTS//VSCODE_OS/generic} diff --git a/external-crates/move/crates/move-analyzer/editors/code/src/context.ts b/external-crates/move/crates/move-analyzer/editors/code/src/context.ts index 686af1638a2..c377e52a620 100644 --- a/external-crates/move/crates/move-analyzer/editors/code/src/context.ts +++ b/external-crates/move/crates/move-analyzer/editors/code/src/context.ts @@ -359,7 +359,7 @@ export class Context { await vscode.window.showInformationMessage( `The move-analyzer binary at the user-specified path ('${this.configuration.serverPath}') ` + 'is not working. See troubleshooting instructions in the README file accompanying ' + - 'Move VSCode extension by IOTA Foundation in the VSCode marketplace', + 'Move VSCode extension by iotaledger in the VSCode marketplace', { modal: true }, items, ); @@ -410,7 +410,7 @@ export class Context { await vscode.window.showErrorMessage( 'Pre-built move-analyzer binary is not available for this platform. ' + 'Follow the instructions to manually install the language server in the README ' + - 'file accompanying Move VSCode extension by IOTA Foundation in the VSCode marketplace', + 'file accompanying Move VSCode extension by iotaledger in the VSCode marketplace', { modal: true }, items, ); From 1dea4c02ae575101024541538156d3f86b4dcf65 Mon Sep 17 00:00:00 2001 From: Konstantinos Demartinos <konstantinos.demartinos@iota.org> Date: Fri, 13 Dec 2024 11:55:13 +0200 Subject: [PATCH 43/97] fix(ci): use dedicated rosetta config dir (#4473) * fix(ci): use dedicated rosetta config dir * Add rosetta workflow and diff tag * dprint * validation --------- Co-authored-by: Chloe Martin <chloedaughterofmars@gmail.com> --- .github/actions/diffs/action.yml | 3 ++ .github/scripts/rosetta/setup.sh | 8 +++-- .github/workflows/_rosetta.yml | 55 +++++++++++++++++++++++++++++++ .github/workflows/_rust_tests.yml | 33 ------------------- .github/workflows/hierarchy.yml | 12 +++++++ 5 files changed, 76 insertions(+), 35 deletions(-) create mode 100644 .github/workflows/_rosetta.yml diff --git a/.github/actions/diffs/action.yml b/.github/actions/diffs/action.yml index c7bc240b392..f940c9b26d9 100644 --- a/.github/actions/diffs/action.yml +++ b/.github/actions/diffs/action.yml @@ -59,6 +59,9 @@ runs: - "examples/**" - "iota_programmability/**" - ".github/workflows/_move_tests.yml" + isRosetta: + - ".github/scripts/rosetta/**" + - "crates/iota-rosetta/**" isExternalCrates: - "external-crates/move/crates/**" isReleaseNotesEligible: diff --git a/.github/scripts/rosetta/setup.sh b/.github/scripts/rosetta/setup.sh index 6ad5bef07a6..308006ca289 100755 --- a/.github/scripts/rosetta/setup.sh +++ b/.github/scripts/rosetta/setup.sh @@ -7,11 +7,15 @@ echo "Install binaries" cargo install --locked --bin iota --path crates/iota cargo install --locked --bin iota-rosetta --path crates/iota-rosetta +echo "create dedicated config dir for IOTA genesis" +CONFIG_DIR="~/.iota/rosetta_config" +mkdir -p $CONFIG_DIR + echo "run IOTA genesis" -iota genesis +iota genesis -f --working-dir $CONFIG_DIR echo "generate rosetta configuration" iota-rosetta generate-rosetta-cli-config --online-url http://127.0.0.1:9002 --offline-url http://127.0.0.1:9003 echo "install rosetta-cli" -curl -sSfL https://raw.githubusercontent.com/coinbase/rosetta-cli/master/scripts/install.sh | sh -s \ No newline at end of file +curl -sSfL https://raw.githubusercontent.com/coinbase/rosetta-cli/master/scripts/install.sh | sh -s diff --git a/.github/workflows/_rosetta.yml b/.github/workflows/_rosetta.yml new file mode 100644 index 00000000000..423158a1f47 --- /dev/null +++ b/.github/workflows/_rosetta.yml @@ -0,0 +1,55 @@ +name: Rosetta validation + +on: workflow_call + +concurrency: + group: rosetta-validation-${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }} + cancel-in-progress: ${{ github.ref != 'refs/heads/develop' }} + +env: + CARGO_TERM_COLOR: always + RUST_LOG: "error" + # Don't emit giant backtraces in the CI logs. + RUST_BACKTRACE: short + CARGO_INCREMENTAL: 0 + # Allow more retries for network requests in cargo (downloading crates) and + # rustup (installing toolchains). This should help to reduce flaky CI failures + # from transient network timeouts or other issues. + CARGO_NET_RETRY: 10 + RUSTUP_MAX_RETRIES: 10 + # RUSTFLAGS: -D warnings + RUSTDOCFLAGS: -D warnings + +jobs: + validation: + timeout-minutes: 45 + runs-on: [self-hosted] + steps: + - uses: actions/checkout@eef61447b9ff4aafe5dcd4e0bbf5d482be7e7871 # v4.2.1 + + - name: Setup environment + run: .github/scripts/rosetta/setup.sh + shell: bash + + - name: Start local IOTA network + run: | + iota start --no-full-node & + shell: bash + + - name: Start Rosetta servers + run: .github/scripts/rosetta/start_rosetta.sh + shell: bash + + - name: Sleep for 20 seconds + run: sleep 20s + shell: bash + + - name: Run check:construction test + run: | + ./bin/rosetta-cli --configuration-file rosetta_cli.json check:construction + shell: bash + + - name: Run check:data test + run: | + ./bin/rosetta-cli --configuration-file rosetta_cli.json check:data + shell: bash diff --git a/.github/workflows/_rust_tests.yml b/.github/workflows/_rust_tests.yml index da2303c56e4..75a96614c06 100644 --- a/.github/workflows/_rust_tests.yml +++ b/.github/workflows/_rust_tests.yml @@ -159,39 +159,6 @@ jobs: eval ${command} - rosetta-validation: - timeout-minutes: 45 - runs-on: [self-hosted] - steps: - - uses: actions/checkout@eef61447b9ff4aafe5dcd4e0bbf5d482be7e7871 # v4.2.1 - - - name: Setup environment - run: .github/scripts/rosetta/setup.sh - shell: bash - - - name: Start local IOTA network - run: | - iota start --no-full-node & - shell: bash - - - name: Start Rosetta servers - run: .github/scripts/rosetta/start_rosetta.sh - shell: bash - - - name: Sleep for 20 seconds - run: sleep 20s - shell: bash - - - name: Run check:construction test - run: | - ./bin/rosetta-cli --configuration-file rosetta_cli.json check:construction - shell: bash - - - name: Run check:data test - run: | - ./bin/rosetta-cli --configuration-file rosetta_cli.json check:data - shell: bash - graphql-rpc: name: graphql-rpc timeout-minutes: 45 diff --git a/.github/workflows/hierarchy.yml b/.github/workflows/hierarchy.yml index 9c61f02a77d..c5def7a8b1b 100644 --- a/.github/workflows/hierarchy.yml +++ b/.github/workflows/hierarchy.yml @@ -20,6 +20,7 @@ jobs: outputs: isRust: ${{ steps.diff.outputs.isRust }} isMove: ${{ steps.diff.outputs.isMove }} + isRosetta: ${{ steps.diff.outputs.isRosetta }} isDoc: ${{ steps.diff.outputs.isDoc }} isReleaseNotesEligible: ${{ steps.diff.outputs.isReleaseNotesEligible }} isExternalCrates: ${{ steps.diff.outputs.isExternalCrates }} @@ -107,6 +108,17 @@ jobs: with: isRust: ${{ needs.diff.outputs.isRust == 'true' }} + rosetta: + needs: + - diff + - dprint-format + - license-check + - typos + if: | + !cancelled() && !failure() && + (needs.diff.outputs.isRosetta == 'true' || needs.diff.outputs.isRust == 'true') + uses: ./.github/workflows/_rosetta.yml + e2e: if: (!cancelled() && !failure() && (!github.event.pull_request.draft || github.ref_name == 'develop')) needs: From 18f998d10bcd74fc4475934624a6e53a18c1a5e6 Mon Sep 17 00:00:00 2001 From: Marc Espin <mespinsanz@gmail.com> Date: Fri, 13 Dec 2024 11:43:53 +0100 Subject: [PATCH 44/97] refactor(wallet-dashboard): Clean up unused components (#4487) --- .../transactions/StakeTransactionCard.tsx | 47 --------------- .../transactions/UnstakeTransactionCard.tsx | 58 ------------------- .../components/transactions/index.ts | 2 - sdk/typescript/src/version.ts | 2 +- 4 files changed, 1 insertion(+), 108 deletions(-) delete mode 100644 apps/wallet-dashboard/components/transactions/StakeTransactionCard.tsx delete mode 100644 apps/wallet-dashboard/components/transactions/UnstakeTransactionCard.tsx diff --git a/apps/wallet-dashboard/components/transactions/StakeTransactionCard.tsx b/apps/wallet-dashboard/components/transactions/StakeTransactionCard.tsx deleted file mode 100644 index adfc74a33ec..00000000000 --- a/apps/wallet-dashboard/components/transactions/StakeTransactionCard.tsx +++ /dev/null @@ -1,47 +0,0 @@ -// Copyright (c) Mysten Labs, Inc. -// Modifications Copyright (c) 2024 IOTA Stiftung -// SPDX-License-Identifier: Apache-2.0 - -import { Box } from '..'; -import { TransactionAmount } from './'; -import { formatPercentageDisplay, useGetValidatorsApy } from '@iota/core'; -import type { IotaEvent } from '@iota/iota-sdk/client'; -import { IOTA_TYPE_ARG } from '@iota/iota-sdk/utils'; - -interface StakeTransactionCardProps { - event: IotaEvent; -} - -export default function StakeTransactionCard({ event }: StakeTransactionCardProps) { - const json = event.parsedJson as { amount: string; validator_address: string; epoch: string }; - const validatorAddress = json?.validator_address; - const stakedAmount = json?.amount; - - const { data: rollingAverageApys } = useGetValidatorsApy(); - - const { apy, isApyApproxZero } = rollingAverageApys?.[validatorAddress] ?? { - apy: null, - }; - - return ( - <Box> - <div className="divide-gray-40 flex flex-col divide-x-0 divide-y divide-solid"> - {stakedAmount && ( - <TransactionAmount - amount={stakedAmount} - coinType={IOTA_TYPE_ARG} - label="Stake" - /> - )} - <div className="flex flex-col"> - <div className="flex w-full justify-between py-3.5"> - <div className="text-steel flex items-baseline justify-center gap-1"> - APY - </div> - {formatPercentageDisplay(apy, '--', isApyApproxZero)} - </div> - </div> - </div> - </Box> - ); -} diff --git a/apps/wallet-dashboard/components/transactions/UnstakeTransactionCard.tsx b/apps/wallet-dashboard/components/transactions/UnstakeTransactionCard.tsx deleted file mode 100644 index 92419a8c3ec..00000000000 --- a/apps/wallet-dashboard/components/transactions/UnstakeTransactionCard.tsx +++ /dev/null @@ -1,58 +0,0 @@ -// Copyright (c) Mysten Labs, Inc. -// Modifications Copyright (c) 2024 IOTA Stiftung -// SPDX-License-Identifier: Apache-2.0 - -import { useFormatCoin } from '@iota/core'; -import type { IotaEvent } from '@iota/iota-sdk/client'; -import { IOTA_TYPE_ARG } from '@iota/iota-sdk/utils'; -import { Box } from '..'; -import { TransactionAmount } from './'; - -interface UnstakeTransactionCardProps { - event: IotaEvent; -} - -export default function UnstakeTransactionCard({ event }: UnstakeTransactionCardProps) { - const eventJson = event.parsedJson as { - principal_amount?: number; - reward_amount?: number; - validator_address?: string; - }; - const principalAmount = eventJson?.principal_amount || 0; - const rewardAmount = eventJson?.reward_amount || 0; - const totalAmount = Number(principalAmount) + Number(rewardAmount); - const [formatPrinciple, symbol] = useFormatCoin(principalAmount, IOTA_TYPE_ARG); - const [formattedRewards] = useFormatCoin(rewardAmount || 0, IOTA_TYPE_ARG); - - return ( - <Box> - <div className="divide-gray-40 flex flex-col divide-x-0 divide-y divide-solid"> - {totalAmount && ( - <TransactionAmount - amount={totalAmount} - coinType={IOTA_TYPE_ARG} - label="Total" - /> - )} - - <div className="flex w-full justify-between py-3.5"> - <div className="text-steel flex items-baseline gap-1">Your IOTA Stake</div> - - <div className="text-steel flex items-baseline gap-1"> - {formatPrinciple} {symbol} - </div> - </div> - - <div className="flex w-full justify-between py-3.5"> - <div className="text-steel flex items-baseline gap-1"> - Staking Rewards Earned - </div> - - <div className="text-steel flex items-baseline gap-1"> - {formattedRewards} {symbol} - </div> - </div> - </div> - </Box> - ); -} diff --git a/apps/wallet-dashboard/components/transactions/index.ts b/apps/wallet-dashboard/components/transactions/index.ts index 509933e7c10..1dc714be773 100644 --- a/apps/wallet-dashboard/components/transactions/index.ts +++ b/apps/wallet-dashboard/components/transactions/index.ts @@ -2,8 +2,6 @@ // SPDX-License-Identifier: Apache-2.0 export { default as TransactionAmount } from './TransactionAmount'; -export { default as StakeTransactionCard } from './StakeTransactionCard'; -export { default as UnstakeTransactionCard } from './UnstakeTransactionCard'; export { default as TransactionSummary } from './TransactionSummary'; export * from './TransactionTile'; export { default as TransactionIcon } from './TransactionIcon'; diff --git a/sdk/typescript/src/version.ts b/sdk/typescript/src/version.ts index 5f991cdfb70..8e619f300a4 100644 --- a/sdk/typescript/src/version.ts +++ b/sdk/typescript/src/version.ts @@ -5,4 +5,4 @@ // This file is generated by genversion.mjs. Do not edit it directly. export const PACKAGE_VERSION = '0.3.1'; -export const TARGETED_RPC_VERSION = '0.7.0-alpha'; +export const TARGETED_RPC_VERSION = '0.8.0-alpha'; From 1520c91068b7cd00027612f6bb8c6efb05c07bea Mon Sep 17 00:00:00 2001 From: Pavlo Botnar <pavlo.botnar@gmail.com> Date: Fri, 13 Dec 2024 13:10:39 +0200 Subject: [PATCH 45/97] fix(iota-genesis-builder): address_swap_map_path becomes optional (#4490) --- crates/iota-genesis-builder/src/main.rs | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/crates/iota-genesis-builder/src/main.rs b/crates/iota-genesis-builder/src/main.rs index 403080b5ee7..e0adc0db630 100644 --- a/crates/iota-genesis-builder/src/main.rs +++ b/crates/iota-genesis-builder/src/main.rs @@ -46,7 +46,7 @@ enum Snapshot { long, help = "Path to the address swap map file. This must be a CSV file with two columns, where an entry contains in the first column an IotaAddress present in the Hornet full-snapshot and in the second column an IotaAddress that will be used for the swap." )] - address_swap_map_path: String, + address_swap_map_path: Option<String>, #[clap(long, value_parser = clap::value_parser!(MigrationTargetNetwork), help = "Target network for migration")] target_network: MigrationTargetNetwork, }, @@ -84,7 +84,11 @@ fn main() -> Result<()> { CoinType::Iota => scale_amount_for_iota(snapshot_parser.total_supply()?)?, }; - let address_swap_map = AddressSwapMap::from_csv(&address_swap_map_path)?; + let address_swap_map = if let Some(address_swap_map_path) = address_swap_map_path { + AddressSwapMap::from_csv(&address_swap_map_path)? + } else { + AddressSwapMap::default() + }; // Prepare the migration using the parser output stream let migration = Migration::new( snapshot_parser.target_milestone_timestamp(), From cf7ec2bd6de6bf6054e53ea718c9a61fe5d39a40 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 13 Dec 2024 12:31:33 +0100 Subject: [PATCH 46/97] Version Packages (#4484) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Begoña Alvarez <balvarez@boxfish.studio> --- .changeset/silly-bulldogs-divide.md | 6 ------ sdk/create-dapp/CHANGELOG.md | 8 ++++++++ sdk/create-dapp/package.json | 2 +- sdk/dapp-kit/CHANGELOG.md | 8 ++++++++ sdk/dapp-kit/package.json | 2 +- sdk/graphql-transport/CHANGELOG.md | 7 +++++++ sdk/graphql-transport/package.json | 2 +- sdk/kiosk/CHANGELOG.md | 12 ++++++++++++ sdk/kiosk/package.json | 2 +- sdk/typescript/CHANGELOG.md | 7 +++++++ sdk/typescript/package.json | 2 +- sdk/typescript/src/version.ts | 2 +- sdk/wallet-standard/CHANGELOG.md | 7 +++++++ sdk/wallet-standard/package.json | 2 +- 14 files changed, 56 insertions(+), 13 deletions(-) delete mode 100644 .changeset/silly-bulldogs-divide.md diff --git a/.changeset/silly-bulldogs-divide.md b/.changeset/silly-bulldogs-divide.md deleted file mode 100644 index 9db48e0918f..00000000000 --- a/.changeset/silly-bulldogs-divide.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -'@iota/kiosk': minor -'@iota/iota-sdk': minor ---- - -Add default royalty, kiosk lock, floor price & personal kiosk rules package ids to testnet network diff --git a/sdk/create-dapp/CHANGELOG.md b/sdk/create-dapp/CHANGELOG.md index 1354dbff338..d04a319a617 100644 --- a/sdk/create-dapp/CHANGELOG.md +++ b/sdk/create-dapp/CHANGELOG.md @@ -1,5 +1,13 @@ # @iota/create-dapp +## 0.2.2 + +### Patch Changes + +- Updated dependencies [9864dcb] + - @iota/iota-sdk@0.4.0 + - @iota/dapp-kit@0.3.2 + ## 0.2.1 ### Patch Changes diff --git a/sdk/create-dapp/package.json b/sdk/create-dapp/package.json index af275038111..29361e97cce 100644 --- a/sdk/create-dapp/package.json +++ b/sdk/create-dapp/package.json @@ -3,7 +3,7 @@ "author": "IOTA Foundation <info@iota.org>", "description": "A CLI for creating new IOTA dApps", "homepage": "https://docs.iota.org/references/ts-sdk/typescript/", - "version": "0.2.1", + "version": "0.2.2", "license": "Apache-2.0", "files": [ "CHANGELOG.md", diff --git a/sdk/dapp-kit/CHANGELOG.md b/sdk/dapp-kit/CHANGELOG.md index c385559519c..224182b16a1 100644 --- a/sdk/dapp-kit/CHANGELOG.md +++ b/sdk/dapp-kit/CHANGELOG.md @@ -1,5 +1,13 @@ # @iota/dapp-kit +## 0.3.2 + +### Patch Changes + +- Updated dependencies [9864dcb] + - @iota/iota-sdk@0.4.0 + - @iota/wallet-standard@0.2.2 + ## 0.3.1 ### Patch Changes diff --git a/sdk/dapp-kit/package.json b/sdk/dapp-kit/package.json index 4060a691508..096b7694d2e 100644 --- a/sdk/dapp-kit/package.json +++ b/sdk/dapp-kit/package.json @@ -3,7 +3,7 @@ "author": "IOTA Foundation <info@iota.org>", "description": "A collection of React hooks and components for interacting with the IOTA blockchain and wallets.", "homepage": "https://docs.iota.org/references/ts-sdk/dapp-kit/", - "version": "0.3.1", + "version": "0.3.2", "license": "Apache-2.0", "files": [ "CHANGELOG.md", diff --git a/sdk/graphql-transport/CHANGELOG.md b/sdk/graphql-transport/CHANGELOG.md index 09c3bda7086..ab39c68ca55 100644 --- a/sdk/graphql-transport/CHANGELOG.md +++ b/sdk/graphql-transport/CHANGELOG.md @@ -1,5 +1,12 @@ # @iota/graphql-transport +## 0.2.2 + +### Patch Changes + +- Updated dependencies [9864dcb] + - @iota/iota-sdk@0.4.0 + ## 0.2.1 ### Patch Changes diff --git a/sdk/graphql-transport/package.json b/sdk/graphql-transport/package.json index 2227a81a102..262ab7e6e3d 100644 --- a/sdk/graphql-transport/package.json +++ b/sdk/graphql-transport/package.json @@ -1,6 +1,6 @@ { "name": "@iota/graphql-transport", - "version": "0.2.1", + "version": "0.2.2", "description": "A GraphQL transport to allow IotaClient to work with RPC 2.0", "license": "Apache-2.0", "author": "IOTA Foundation <info@iota.org>", diff --git a/sdk/kiosk/CHANGELOG.md b/sdk/kiosk/CHANGELOG.md index 64072a1683d..893388e7e87 100644 --- a/sdk/kiosk/CHANGELOG.md +++ b/sdk/kiosk/CHANGELOG.md @@ -1,5 +1,17 @@ # @iota/kiosk +## 0.3.0 + +### Minor Changes + +- 9864dcb: Add default royalty, kiosk lock, floor price & personal kiosk rules package ids to + testnet network + +### Patch Changes + +- Updated dependencies [9864dcb] + - @iota/iota-sdk@0.4.0 + ## 0.2.1 ### Patch Changes diff --git a/sdk/kiosk/package.json b/sdk/kiosk/package.json index ac2524cfc11..e210f5b4661 100644 --- a/sdk/kiosk/package.json +++ b/sdk/kiosk/package.json @@ -2,7 +2,7 @@ "name": "@iota/kiosk", "author": "IOTA Foundation <info@iota.org>", "description": "IOTA Kiosk library", - "version": "0.2.1", + "version": "0.3.0", "license": "Apache-2.0", "type": "commonjs", "main": "./dist/cjs/index.js", diff --git a/sdk/typescript/CHANGELOG.md b/sdk/typescript/CHANGELOG.md index 21d1242a7af..d69da4adad8 100644 --- a/sdk/typescript/CHANGELOG.md +++ b/sdk/typescript/CHANGELOG.md @@ -1,5 +1,12 @@ # @iota/iota-sdk +## 0.4.0 + +### Minor Changes + +- 9864dcb: Add default royalty, kiosk lock, floor price & personal kiosk rules package ids to + testnet network + ## 0.3.1 ### Patch Changes diff --git a/sdk/typescript/package.json b/sdk/typescript/package.json index 2285a952c73..45cf01555b8 100644 --- a/sdk/typescript/package.json +++ b/sdk/typescript/package.json @@ -3,7 +3,7 @@ "author": "IOTA Foundation <info@iota.org>", "description": "IOTA TypeScript API", "homepage": "https://docs.iota.org/references/ts-sdk/typescript/", - "version": "0.3.1", + "version": "0.4.0", "license": "Apache-2.0", "sideEffects": false, "files": [ diff --git a/sdk/typescript/src/version.ts b/sdk/typescript/src/version.ts index 8e619f300a4..d2405a15cce 100644 --- a/sdk/typescript/src/version.ts +++ b/sdk/typescript/src/version.ts @@ -4,5 +4,5 @@ // This file is generated by genversion.mjs. Do not edit it directly. -export const PACKAGE_VERSION = '0.3.1'; +export const PACKAGE_VERSION = '0.4.0'; export const TARGETED_RPC_VERSION = '0.8.0-alpha'; diff --git a/sdk/wallet-standard/CHANGELOG.md b/sdk/wallet-standard/CHANGELOG.md index f66c15f48d7..bc16a2364f5 100644 --- a/sdk/wallet-standard/CHANGELOG.md +++ b/sdk/wallet-standard/CHANGELOG.md @@ -1,5 +1,12 @@ # @iota/wallet-standard +## 0.2.2 + +### Patch Changes + +- Updated dependencies [9864dcb] + - @iota/iota-sdk@0.4.0 + ## 0.2.1 ### Patch Changes diff --git a/sdk/wallet-standard/package.json b/sdk/wallet-standard/package.json index 2939771ea80..09593d4d8ef 100644 --- a/sdk/wallet-standard/package.json +++ b/sdk/wallet-standard/package.json @@ -1,6 +1,6 @@ { "name": "@iota/wallet-standard", - "version": "0.2.1", + "version": "0.2.2", "description": "A suite of standard utilities for implementing wallets based on the Wallet Standard.", "license": "Apache-2.0", "author": "IOTA Foundation <info@iota.org>", From 3befeadb92c51f4879c765ace612fec507062ad1 Mon Sep 17 00:00:00 2001 From: Lucas Tortora <85233773+lucas-tortora@users.noreply.github.com> Date: Fri, 13 Dec 2024 09:35:26 -0300 Subject: [PATCH 47/97] fix(devx): fix move.toml and build-test.mdx (#4456) * fix(devx): fix move.toml and build-test.mdx * dprint --- docs/content/developer/getting-started/build-test.mdx | 2 +- examples/move/first_package/Move.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/content/developer/getting-started/build-test.mdx b/docs/content/developer/getting-started/build-test.mdx index 69b5289b910..6c4db2d6cf3 100644 --- a/docs/content/developer/getting-started/build-test.mdx +++ b/docs/content/developer/getting-started/build-test.mdx @@ -60,7 +60,7 @@ Test result: OK. Total tests: 0; passed: 0; failed: 0 ### Add Tests -You can add your first unit test by copying the following public test function and adding it to `first_package_tests` file, within the `tests` directory. +You can add your first unit test by copying the following public test function and adding it to the `first_package` file. ```move #[test] diff --git a/examples/move/first_package/Move.toml b/examples/move/first_package/Move.toml index 9003fc5d467..df18f6f1957 100644 --- a/examples/move/first_package/Move.toml +++ b/examples/move/first_package/Move.toml @@ -5,7 +5,7 @@ edition = "2024.beta" # edition = "legacy" to use legacy (pre-2024) Move # authors = ["..."] # e.g., ["Joe Smith (joesmith@noemail.com)", "John Snow (johnsnow@noemail.com)"] [dependencies] -Iota = { local = "../../../crates/iota-framework/packages/iota-framework" } +Iota = { git = "https://github.com/iotaledger/iota.git", subdir = "crates/iota-framework/packages/iota-framework", rev = "testnet" } # For remote import, use the `{ git = "...", subdir = "...", rev = "..." }`. # Revision can be a branch, a tag, and a commit hash. From 61572267f42fa5ec3127984415097f8fad5324af Mon Sep 17 00:00:00 2001 From: Dr-Electron <dr-electr0n@protonmail.com> Date: Fri, 13 Dec 2024 14:27:50 +0100 Subject: [PATCH 48/97] feat(docs): port glossary over from current Wiki (#3716) --- .../iota-architecture/iota-security.mdx | 2 +- .../transaction-lifecycle.mdx | 30 ++--- docs/content/operator/genesis.mdx | 2 +- .../operator/iota-full-node/overview.mdx | 2 +- docs/content/operator/observability.mdx | 2 +- docs/content/operator/validator-committee.mdx | 26 ++--- docs/content/references/iota-compared.mdx | 8 +- docs/content/references/iota-glossary.mdx | 92 +--------------- docs/content/references/research-papers.mdx | 2 +- docs/site/config/jargon.js | 35 ++++++ docs/site/docusaurus.config.js | 7 +- docs/site/package.json | 3 + docs/site/src/components/Glossary/index.tsx | 53 +++++++++ docs/site/src/css/custom.css | 104 +++++++++++++++++- pnpm-lock.yaml | 103 +++++++++++++++++ 15 files changed, 339 insertions(+), 132 deletions(-) create mode 100644 docs/site/config/jargon.js create mode 100644 docs/site/src/components/Glossary/index.tsx diff --git a/docs/content/about-iota/iota-architecture/iota-security.mdx b/docs/content/about-iota/iota-architecture/iota-security.mdx index bb6633c8fd9..f524ccf7030 100644 --- a/docs/content/about-iota/iota-architecture/iota-security.mdx +++ b/docs/content/about-iota/iota-architecture/iota-security.mdx @@ -47,7 +47,7 @@ Move allows for shared assets. Although these shared assets are public in princi ### Certification and Finalization -When you submit a transaction in IOTA, all the validators must agree that it's valid. Once they agree, they create a certificate to confirm its validity, and this certificate must also be shared with all validators. Even if some validators don't follow the rules, the transaction can still be finalized by the majority of validators who do follow the IOTA protocol. This process uses cryptographic methods to ensure that validators who don't follow the rules can't trick the system into accepting false information and that misbehaving validators can't stop the system from processing transactions. +When you submit a transaction in IOTA, all the validators must agree that it's valid. Once they agree, they create a _certificate_ to confirm its validity, and this _certificate_ must also be shared with all validators. Even if some validators don't follow the rules, the transaction can still be finalized by the majority of validators who do follow the IOTA protocol. This process uses cryptographic methods to ensure that validators who don't follow the rules can't trick the system into accepting false information and that misbehaving validators can't stop the system from processing transactions. ### Gas and Transaction Execution diff --git a/docs/content/about-iota/iota-architecture/transaction-lifecycle.mdx b/docs/content/about-iota/iota-architecture/transaction-lifecycle.mdx index f2146ee274a..599dff115f7 100644 --- a/docs/content/about-iota/iota-architecture/transaction-lifecycle.mdx +++ b/docs/content/about-iota/iota-architecture/transaction-lifecycle.mdx @@ -18,13 +18,13 @@ import ThemedImage from '@theme/ThemedImage'; 2. **Submit to Validators**: The IOTA protocol sends the transaction to every validator. The validators validate the transaction. If valid, the validators sign it and return the signed transaction to the client. -3. **Form a Transaction Certificate**: After collecting responses from a supermajority of validators, the client can form a transaction certificate. Unlike consensus-based blockchains, IOTA validators are not burdened by needing to propagate signatures or aggregate certificates; this is the responsibility of the client or gateway. +3. **Form a Transaction Certificate**: After collecting responses from a supermajority of validators, the client can form a transaction _certificate_. Unlike consensus-based blockchains, IOTA validators are not burdened by needing to propagate signatures or aggregate _certificate_s; this is the responsibility of the client or gateway. -4. **Send the Certificate**: The client sends the assembled certificate back to all validators. The validators check its validity and acknowledge receipt. If the transaction involves only owned objects, IOTA can process and execute it immediately without waiting for consensus (**fast path consensus**). All certificates are forwarded to the IOTA DAG-based consensus protocol. +4. **Send the Certificate**: The client sends the assembled _certificate_ back to all validators. The validators check its validity and acknowledge receipt. If the transaction involves only owned objects, IOTA can process and execute it immediately without waiting for consensus (**fast path consensus**). All _certificate_s are forwarded to the IOTA DAG-based consensus protocol. -5. **Consensus and Execution**: The IOTA DAG-based consensus protocol eventually produces a total order of certificates. Validators check and execute certificates that involve shared objects. +5. **Consensus and Execution**: The IOTA DAG-based consensus protocol eventually produces a total order of _certificate_s. Validators check and execute _certificate_s that involve shared objects. -6. **Effect Certificate**: Clients can gather responses from a supermajority of validators, assemble them into an effect certificate, and use it as proof that the transaction is settled. +6. **Effect Certificate**: Clients can gather responses from a supermajority of validators, assemble them into an effect _certificate_, and use it as proof that the transaction is settled. 7. **Checkpoints and Reconfiguration**: IOTA forms checkpoints for every consensus commit, which are also used to drive the reconfiguration protocol. @@ -42,13 +42,13 @@ Your wallet app sends the signed transaction to a full node, which then broadcas ### Transaction Certification -Validators receive the transaction from the full node. They check if it's valid and lock the involved objects to prevent double-spending. After validation, they send their signature back to the full node. When the full node collects enough validator signatures (a quorum), it creates a transaction certificate, which includes the transaction and the validator signatures. +Validators receive the transaction from the full node. They check if it's valid and lock the involved objects to prevent double-spending. After validation, they send their signature back to the full node. When the full node collects enough validator signatures (a quorum), it creates a transaction _certificate_, which includes the transaction and the validator signatures. ### Transaction Finalization -The full node broadcasts this transaction certificate to all validators. Validators verify the certificate, execute the transaction, and unlock the previously locked objects. They then sign the transaction effects (a detailed list of changes) and return these signed effects to the full node. The full node verifies these effects and, once it has enough signatures, forms an effects certificate. +The full node broadcasts this transaction _certificate_ to all validators. Validators verify the _certificate_, execute the transaction, and unlock the previously locked objects. They then sign the transaction effects (a detailed list of changes) and return these signed effects to the full node. The full node verifies these effects and, once it has enough signatures, forms an effects _certificate_. -Your wallet app receives this effects certificate, which you can show to the coffee shop to prove that the transaction is complete and irreversible. +Your wallet app receives this effects _certificate_, which you can show to the coffee shop to prove that the transaction is complete and irreversible. ## Transaction Life Cycle @@ -67,13 +67,13 @@ After submission to a full node, the certification process begins. The full node If these checks pass, the validator locks the input objects to the transaction, preventing double-spending, and proceeds to sign the transaction and returns the signature to the node. The node needs signatures from a majority of validators to certify the transaction. -The full node collects these signatures in parallel to speed up the process. Once it has enough signatures (a quorum), the transaction is certified, forming a **transaction certificate**. +The full node collects these signatures in parallel to speed up the process. Once it has enough signatures (a quorum), the transaction is certified, forming a **transaction _certificate_**. Even if some validators are dishonest, the principle of "quorum intersection" ensures that as long as most validators are honest, double-spending is prevented. An honest validator will not sign two transactions that try to use the same object at the same time. ### Execution -Certified transactions are then sent to validators for **execution**. Validators verify the certificate signatures to ensure the transaction is valid and not attempting to double-spend. +Certified transactions are then sent to validators for **execution**. Validators verify the _certificate_ signatures to ensure the transaction is valid and not attempting to double-spend. Depending on whether the transaction uses shared input objects, the validators will either: @@ -90,9 +90,9 @@ After the transaction is executed, the validator signs off on the effects of the * The amount of gas spent. * The transaction's execution status (either success or an error code). -The full node then gathers these signed effects from a majority of validators, forming an **effects certificate**, which guarantees that the transaction is final. +The full node then gathers these signed effects from a majority of validators, forming an **effects _certificate_**, which guarantees that the transaction is final. -Once you or the full node sees an effects certificate, you can be sure that the transaction will be included in a [checkpoint](#checkpoints), meaning it can't be undone. This certificate can also serve as proof that you sent the NFT to your friend since it can't be faked due to the validator signatures. +Once you or the full node sees an effects _certificate_, you can be sure that the transaction will be included in a [checkpoint](#checkpoints), meaning it can't be undone. This _certificate_ can also serve as proof that you sent the NFT to your friend since it can't be faked due to the validator signatures. ### Checkpoints @@ -109,25 +109,25 @@ Transaction finality means that once a transaction is executed, it can't be reve ### Settlement Finality -After executing a transaction, validators send back the signed effects to the network. When a majority of validators have executed the transaction and the [effects certificate](#effects-certificate) exists, the transaction's effects (like transfers or newly created objects) are implemented. This allows the network to process new transactions that depend on these effects. +After executing a transaction, validators send back the signed effects to the network. When a majority of validators have executed the transaction and the [effects _certificate_](#effects-certificate) exists, the transaction's effects (like transfers or newly created objects) are implemented. This allows the network to process new transactions that depend on these effects. Settlement finality depends on [object ownership](../../developer/iota-101/objects/object-ownership/object-ownership.mdx). For transactions involving only owned objects, this happens quickly, in under half a second. For those involving shared objects, it happens shortly after consensus, which can take a few seconds. At this point, the transaction reaches settlement finality, meaning the network can now process more transactions using the same input objects. ### Checkpoint Processing -The [real-world example](#real-world-example) at the beginning of the article demonstrates a finalized transaction through an effects certificate. However, if a full node goes offline before collecting all signatures, your wallet app will try another full node. If your phone dies during this process, the coffee shop will still see your payment on its terminal connected to a different full node, thanks to checkpoints. +The [real-world example](#real-world-example) at the beginning of the article demonstrates a finalized transaction through an effects _certificate_. However, if a full node goes offline before collecting all signatures, your wallet app will try another full node. If your phone dies during this process, the coffee shop will still see your payment on its terminal connected to a different full node, thanks to checkpoints. A checkpoint contains a list of transactions and is signed by a majority of validators, making it final. If a full node learns about your transaction through checkpoints, it ensures that the transaction will be finalized. ### Local Execution on a Full Node -Before sending back an effects certificate, a full node might execute the transaction locally if the request asks it to. This is more important for high-frequency applications like gaming but can add unnecessary delay for simple transactions like buying coffee. The `WaitForLocalExecution` parameter requests this local execution, while you can use the `WaitForEffects` parameter for a quicker response. +Before sending back an effects _certificate_, a full node might execute the transaction locally if the request asks it to. This is more important for high-frequency applications like gaming but can add unnecessary delay for simple transactions like buying coffee. The `WaitForLocalExecution` parameter requests this local execution, while you can use the `WaitForEffects` parameter for a quicker response. Additionally, when any app builds a transaction, the full node is usually in charge of choosing the object that is used to pay for the transaction's gas. Since gas is paid in IOTA, which is a shared object, if the full node is not up-to-date, it could potentially lead to an invalid transaction or even a [client equivocation](../../developer/iota-101/transactions/sponsored-transactions/about-sponsored-transactions.mdx#risk-considerations). You can avoid this unwanted behavior by sending the `WaitForLocalExecution` parameter. ### Epoch Change -Every ~24 hours, the IOTA network undergoes an epoch change, during which staking rewards are calculated and distributed, validator metadata is updated, and other network processes occur. User transactions are paused during this time. If your transaction is submitted at the epoch boundary, it may need resubmission in the new epoch. Transactions that were certified but not yet finalized will be reverted. Any transaction certificate from the previous epoch will become invalid, so the full node will resubmit the invalid transactions. +Every ~24 hours, the IOTA network undergoes an epoch change, during which staking rewards are calculated and distributed, validator metadata is updated, and other network processes occur. User transactions are paused during this time. If your transaction is submitted at the epoch boundary, it may need resubmission in the new epoch. Transactions that were certified but not yet finalized will be reverted. Any transaction _certificate_ from the previous epoch will become invalid, so the full node will resubmit the invalid transactions. ### Verifying Finality diff --git a/docs/content/operator/genesis.mdx b/docs/content/operator/genesis.mdx index cd5d30a6146..c2f87446c06 100644 --- a/docs/content/operator/genesis.mdx +++ b/docs/content/operator/genesis.mdx @@ -2,7 +2,7 @@ title: Genesis --- -Genesis is the initial state of the IOTA blockchain. To launch a network, the initial committee of validators collaborate by providing their validator information (public keys, network addresses, and so on) to a shared workspace. After all of the initial validators have contributed their information, IOTA generates the initial, unsigned genesis checkpoint (checkpoint with sequence number 0) and each validator provides their signature. IOTA aggregates these signatures to form a certificate on the genesis checkpoint. IOTA bundles this checkpoint, as well as the initial objects, together into a single genesis.blob file that is used to initialize the state when running the `iota-node` binary for both validators and Full nodes. +Genesis is the initial state of the IOTA blockchain. To launch a network, the initial committee of validators collaborate by providing their validator information (public keys, network addresses, and so on) to a shared workspace. After all of the initial validators have contributed their information, IOTA generates the initial, unsigned genesis checkpoint (checkpoint with sequence number 0) and each validator provides their signature. IOTA aggregates these signatures to form a _certificate_ on the genesis checkpoint. IOTA bundles this checkpoint, as well as the initial objects, together into a single genesis.blob file that is used to initialize the state when running the `iota-node` binary for both validators and Full nodes. ## Genesis blob locations diff --git a/docs/content/operator/iota-full-node/overview.mdx b/docs/content/operator/iota-full-node/overview.mdx index 00f91922651..cfb80e6b4f8 100644 --- a/docs/content/operator/iota-full-node/overview.mdx +++ b/docs/content/operator/iota-full-node/overview.mdx @@ -24,7 +24,7 @@ IOTA Full nodes: IOTA Full nodes sync with validators to receive new transactions on the network. -A transaction requires a few round trips to 2f+1 validators to form a transaction certificate (TxCert). +A transaction requires a few round trips to 2f+1 validators to form a transaction _certificate_ (TxCert). This synchronization process includes: diff --git a/docs/content/operator/observability.mdx b/docs/content/operator/observability.mdx index 03676ee1447..6467539eed0 100644 --- a/docs/content/operator/observability.mdx +++ b/docs/content/operator/observability.mdx @@ -99,7 +99,7 @@ To generate detailed span start and end logs, define the `IOTA_JSON_SPAN_LOGS` e You can send this output to a tool or service for indexing, alerts, aggregation, and analysis. -The following example output shows certificate processing in the authority with span logging. Note the `START` and `END` annotations, and notice how `DB_UPDATE_STATE` which is nested is embedded within `PROCESS_CERT`. Also notice `elapsed_milliseconds`, which logs the duration of each span. +The following example output shows _certificate_ processing in the authority with span logging. Note the `START` and `END` annotations, and notice how `DB_UPDATE_STATE` which is nested is embedded within `PROCESS_CERT`. Also notice `elapsed_milliseconds`, which logs the duration of each span. ```bash {"v":0,"name":"iota","msg":"[PROCESS_CERT - START]","level":20,"hostname":"Evan-MLbook.lan","pid":51425,"time":"2022-03-08T22:48:11.241421Z","target":"iota_core::authority_server","line":67,"file":"iota_core/src/authority_server.rs","tx_digest":"t#d1385064287c2ad67e4019dd118d487a39ca91a40e0fd8e678dbc32e112a1493"} diff --git a/docs/content/operator/validator-committee.mdx b/docs/content/operator/validator-committee.mdx index 598939eeffb..85920009733 100644 --- a/docs/content/operator/validator-committee.mdx +++ b/docs/content/operator/validator-committee.mdx @@ -1,6 +1,6 @@ --- title: Validator Committee -description: IOTA has a committee of validators to verify on-chain transactions. Epochs, quorums, transactions, certificates, and consensus are touch points for this committee. +description: IOTA has a committee of validators to verify on-chain transactions. Epochs, quorums, transactions, _certificate_s, and consensus are touch points for this committee. --- import Quiz from '@site/src/components/Quiz'; @@ -20,38 +20,38 @@ Operation of the IOTA network is temporally partitioned into non-overlapping, ap A quorum is a set of validators whose combined voting power is greater than two-thirds (>2/3) of the total during a particular epoch. For example, in an IOTA instance operated by four validators that all have the same voting power, any group containing three validators is a quorum. -The quorum size of >2/3 ensures Byzantine fault tolerance (BFT). A validator commits a transaction (durably store the transaction and update its internal state with the effects of the transaction) only if it is accompanied by cryptographic signatures from a quorum. IOTA calls the combination of the transaction and the quorum signatures on its bytes a *certificate*. The policy of committing only certificates ensures Byzantine fault tolerance: if >2/3 of the validators faithfully follow the protocol, they are guaranteed to eventually agree on both the set of committed certificates and their effects. +The quorum size of >2/3 ensures Byzantine fault tolerance (BFT). A validator commits a transaction (durably store the transaction and update its internal state with the effects of the transaction) only if it is accompanied by cryptographic signatures from a quorum. IOTA calls the combination of the transaction and the quorum signatures on its bytes a _certificate_. The policy of committing only _certificate_s ensures Byzantine fault tolerance: if >2/3 of the validators faithfully follow the protocol, they are guaranteed to eventually agree on both the set of committed _certificate_s and their effects. ## Write requests -A validator can handle two types of write requests: transactions and certificates. At a high level, a client: +A validator can handle two types of write requests: transactions and _certificate_s. At a high level, a client: -- Communicates a transaction to a quorum of validators to collect the signatures required to form a certificate. -- Submits a certificate to a validator to commit state changes on that validator. +- Communicates a transaction to a quorum of validators to collect the signatures required to form a _certificate_. +- Submits a _certificate_ to a validator to commit state changes on that validator. ### Transactions -When a validator receives a transaction from a client, it first performs transaction validity checks (validity of the sender's signature). If the checks pass, the validator locks all owned-objects and signs the transaction bytes, then returns the signature to the client. The client repeats this process with multiple validators until it has collected signatures on its transaction from a quorum, thereby forming a certificate. +When a validator receives a transaction from a client, it first performs transaction validity checks (validity of the sender's signature). If the checks pass, the validator locks all owned-objects and signs the transaction bytes, then returns the signature to the client. The client repeats this process with multiple validators until it has collected signatures on its transaction from a quorum, thereby forming a _certificate_. -The process of collecting validator signatures on a transaction into a certificate and the process of submitting certificates can be performed in parallel. The client can simultaneously multicast transactions/certificates to an arbitrary number of validators. Alternatively, a client can outsource either or both of these tasks to a third-party service provider. This provider must be trusted for liveness (it can refuse to form a certificate), but not for safety (it cannot change the effects of the transaction, and does not need the user's secret key). +The process of collecting validator signatures on a transaction into a _certificate_ and the process of submitting _certificate_s can be performed in parallel. The client can simultaneously multicast transactions/_certificate_s to an arbitrary number of validators. Alternatively, a client can outsource either or both of these tasks to a third-party service provider. This provider must be trusted for liveness (it can refuse to form a _certificate_), but not for safety (it cannot change the effects of the transaction, and does not need the user's secret key). ### Certificates -After the client forms a certificate, it submits it to the validators, which perform certificate validity checks. These checks ensure the signers are validators in the current epoch, and the signatures are cryptographically valid. If the checks pass, the validators execute the transaction inside the certificate. Execution of a transaction either succeeds and commits all of its effects or aborts and has no effect other than debiting the transaction's gas input. Some reasons a transaction might abort include an explicit abort instruction, a runtime error such as division by zero, or exceeding the maximum gas budget. Whether it succeeds or aborts, the validator durably stores the certificate indexed by the hash of its inner transaction. +After the client forms a _certificate_, it submits it to the validators, which perform _certificate_ validity checks. These checks ensure the signers are validators in the current epoch, and the signatures are cryptographically valid. If the checks pass, the validators execute the transaction inside the _certificate_. Execution of a transaction either succeeds and commits all of its effects or aborts and has no effect other than debiting the transaction's gas input. Some reasons a transaction might abort include an explicit abort instruction, a runtime error such as division by zero, or exceeding the maximum gas budget. Whether it succeeds or aborts, the validator durably stores the _certificate_ indexed by the hash of its inner transaction. -If a client collects a quorum of signatures on the effects of the transaction, then the client has a promise of finality. This means that transaction effects persist on the shared database and are actually committed and visible to everyone by the end of the epoch. This does not mean that the latency is a full epoch, because you can use the effects certificate to convince anyone of the transactions finality, as well as to access the effects and issue new transactions. As with transactions, you can parallelize the process of sharing a certificate with validators and (if desired) outsource to a third-party service provider. +If a client collects a quorum of signatures on the effects of the transaction, then the client has a promise of finality. This means that transaction effects persist on the shared database and are actually committed and visible to everyone by the end of the epoch. This does not mean that the latency is a full epoch, because you can use the effects _certificate_ to convince anyone of the transactions finality, as well as to access the effects and issue new transactions. As with transactions, you can parallelize the process of sharing a _certificate_ with validators and (if desired) outsource to a third-party service provider. ## The role of Narwhal and Bullshark IOTA takes advantage of Narwhal and Bullshark as its mempool and consensus engines. Narwhal/Bullshark (N/B) is also implemented in IOTA so that when Byzantine agreement is required it uses a high-throughput DAG-based consensus to manage shared locks while execution on different shared objects is parallelized. -Narwhal enables the parallel ordering of transactions into batches that are collected into concurrently proposed blocks, and Bullshark defines an algorithm for executing the DAG that these blocks form. N/B combined builds a DAG of blocks, concurrently proposed, and creates an order between those blocks as a byproduct of the building of the DAG. But that order is overlaid on top of the causal order of IOTA transactions (the "payload" of Narwhal/Bullshark here), and does not substitute for it: +Narwhal enables the parallel ordering of transactions into batches that are collected into concurrently proposed blocks, and Bullshark defines an algorithm for executing the DAG that these blocks form. N/B combined builds a DAG of blocks, concurrently proposed, and creates an order between those blocks as a byproduct of the building of the DAG. But that order is overlaid on top of the _causal order_ of IOTA transactions (the "payload" of Narwhal/Bullshark here), and does not substitute for it: - N/B operates in OX, rather than XO mode (O = order, X = execute); the execution occurs after the Narwhal/Bullshark ordering. - The output of N/B is therefore a sequence of transactions, with interdependencies stored in the transaction data itself. -Consensus sequences certificates of transactions. These represent transactions that have already been presented to 2/3 of validators that checked that all their owned objects are available to be operated on and signed the transaction. Upon a certificate being sequenced, IOTA sets the lock of the shared objects at the next available version to map to the execution of that certificate. So for example if you have a shared object X at version 2, and you sequence certificate T, IOTA stores T -> [(X, 2)]. That is all you do when IOTA reaches consensus, and as a result IOTA can ingest a lot of sequenced transactions. +Consensus sequences _certificate_s of transactions. These represent transactions that have already been presented to 2/3 of validators that checked that all their owned objects are available to be operated on and signed the transaction. Upon a _certificate_ being sequenced, IOTA sets the lock of the shared objects at the next available version to map to the execution of that _certificate_. So for example if you have a shared object X at version 2, and you sequence _certificate_ T, IOTA stores T -> [(X, 2)]. That is all you do when IOTA reaches consensus, and as a result IOTA can ingest a lot of sequenced transactions. -Now, after this is done IOTA can execute all certificates that have their locks set, on one or multiple cores. Obviously, transactions for earlier versions of objects need to be processed first (causally), and that reduces the degree of concurrency. The read and write set of the transaction can be statically determined from its versioned object inputs--execution can only read/write an object that was an input to the transaction, or that was created by the transaction. +Now, after this is done IOTA can execute all _certificate_s that have their locks set, on one or multiple cores. Obviously, transactions for earlier versions of objects need to be processed first (causally), and that reduces the degree of concurrency. The read and write set of the transaction can be statically determined from its versioned object inputs--execution can only read/write an object that was an input to the transaction, or that was created by the transaction. -<Quiz questions={questions} /> \ No newline at end of file +<Quiz questions={questions} /> diff --git a/docs/content/references/iota-compared.mdx b/docs/content/references/iota-compared.mdx index 90de98f1d04..0126c647a66 100644 --- a/docs/content/references/iota-compared.mdx +++ b/docs/content/references/iota-compared.mdx @@ -29,16 +29,16 @@ This doesn't mean that IOTA as a platform never orders transactions with respect ## A collaborative approach to transaction submission -IOTA validates transactions individually, rather than batching them in the traditional blocks. The key advantage of this approach is low latency; each successful transaction quickly obtains a certificate of finality that proves to anyone that the transaction will persists its effects on the IOTA network. +IOTA validates transactions individually, rather than batching them in the traditional blocks. The key advantage of this approach is low latency; each successful transaction quickly obtains a _certificate_ of finality that proves to anyone that the transaction will persists its effects on the IOTA network. But the process of submitting a transaction is a bit more involved. That little more work occurs on the network. (With bandwidth getting cheaper, this is less of a concern.) Whereas a usual blockchain can accept a bunch of transactions from the same author in a fire-and-forget mode, IOTA transaction submission follows these steps: 1. Sender broadcasts a transaction to all IOTA validators. 1. IOTA validators send individual votes on this transaction to the sender. 1. Each vote has a certain weight since each validator has weight based upon the rules of [Proof of Stake](https://en.wikipedia.org/wiki/Proof_of_work). -1. Sender collects a Byzantine-resistant-majority of these votes into a _certificate_ and broadcasts it to all IOTA validators. +1. Sender collects a Byzantine-resistant-majority of these votes into a __certificate__ and broadcasts it to all IOTA validators. 1. The validators execute the transaction and sign the results. When the client receives a Byzantine-resistant-majority of the results _finality_ is reached, ie., assurance the transaction will not be dropped (revoked). -1. Optionally, the sender assembles the votes to a certificate detailing the effects of the transaction. +1. Optionally, the sender assembles the votes to a _certificate_ detailing the effects of the transaction. While those steps demand more of the sender, performing them efficiently can still yield a cryptographic proof of finality with minimum latency. Aside from crafting the original transaction itself, the session management for a transaction does not require access to any private keys and can be delegated to a third party. @@ -49,7 +49,7 @@ Because IOTA focuses on managing specific objects rather than a single aggregate - Every object in IOTA has a unique version number. - Every new version is created from a transaction that may involve several dependencies, themselves versioned objects. -As a consequence, a IOTA Validator can exhibit a causal history of an object, showing its history since genesis. IOTA explicitly makes the bet that in many cases, the ordering of that causal history with the causal history of another object is irrelevant; and in the few cases where this information is relevant, IOTA makes this relationship explicit in the data. +As a consequence, a IOTA Validator can exhibit a _causal history_ of an object, showing its history since genesis. IOTA explicitly makes the bet that in many cases, the ordering of that _causal history_ with the _causal history_ of another object is irrelevant; and in the few cases where this information is relevant, IOTA makes this relationship explicit in the data. ## Causal order vs. total order diff --git a/docs/content/references/iota-glossary.mdx b/docs/content/references/iota-glossary.mdx index d6b592a54d5..9593a486845 100644 --- a/docs/content/references/iota-glossary.mdx +++ b/docs/content/references/iota-glossary.mdx @@ -2,96 +2,8 @@ title: Glossary slug: /iota-glossary --- +import Glossary from '@site/src/components/Glossary'; Find terms used in IOTA defined below. -### Causal history - -Causal history is the relationship between an object in IOTA and its direct predecessors and successors. This history is essential to the causal order IOTA uses to process transactions. In contrast, other blockchains read the entire state of their world for each transaction, -introducing latency. - -### Causal order - -[Causal order](https://www.scattered-thoughts.net/writing/causal-ordering/) is a representation of the relationship between transactions and the objects they produce, laid out as dependencies. Validators cannot execute a transaction dependent on objects created by a prior transaction that has not finished. Rather than total order, IOTA uses causal order (a partial order). - -### Certificate - -A certificate is the mechanism proving a transaction was approved or certified. Validators vote on transactions, and aggregators collect a Byzantine-resistant-majority of these votes into a certificate and broadcasts it to all IOTA validators, thereby ensuring finality. - -### Epoch - -Operation of the IOTA network is temporally partitioned into non-overlapping, fixed-duration epochs. During a particular epoch, the set of validators participating in the network is fixed. - -### Equivocation - -Equivocation in blockchains is the malicious action of dishonest actors giving conflicting information for the same message, such as inconsistent or duplicate voting. - -### Eventual consistency - -[Eventual consistency](https://en.wikipedia.org/wiki/Eventual_consistency) is the consensus model employed by IOTA; if one honest validator -certifies the transaction, all of the other honest validators will too eventually. - -### Finality - -[Finality](https://medium.com/mechanism-labs/finality-in-blockchain-consensus-d1f83c120a9a) is the assurance a transaction will not be revoked. This stage is considered closure for an exchange or other blockchain transaction. - -### Gas - -[Gas](https://ethereum.org/en/developers/docs/gas/) refers to the computational effort required for executing operations on the IOTA network. In IOTA, gas is paid with the network's native currency IOTA. The cost of executing a transaction in IOTA units is referred to as the transaction fee. - -### Genesis - -Genesis is the initial act of creating accounts and gas objects for a IOTA network. IOTA provides a `genesis` command that allows users to create and inspect the genesis object setting up the network for operation. - -### Multi-writer objects - -Multi-writer objects are objects that are owned by more than one address. Transactions affecting multi-writer objects require consensus in IOTA. This contrasts with transactions affecting only single-writer objects, which require only a confirmation of the owner's address contents. - -### Object - -The basic unit of storage in IOTA is object. In contrast to many other blockchains, where storage is centered around address and each address contains a key-value store, IOTA's storage is centered around objects. IOTA objects have one of the following primary states: - -- _Immutable_ - the object cannot be modified. -- _Mutable_ - the object can be changed. - -Further, mutable objects are divided into these categories: - -- _Owned_ - the object can be modified only by its owner. -- _Shared_ - the object can be modified by anyone. - -Immutable objects do not need this distinction because they have no owner. - -### Proof-of-stake - -[Proof-of-stake](https://en.wikipedia.org/wiki/Proof_of_stake) is a blockchain consensus mechanism where the voting weights of validators or validators is proportional to a bonded amount of the network's native currency (called their stake in the network). This mitigates [Sybil attacks](https://en.wikipedia.org/wiki/Sybil_attack) by forcing bad actors to gain a large stake in the blockchain first. - -### Single-writer objects - -Single-writer objects are owned by one address. In IOTA, transactions affecting only single-writer objects owned by the same address may proceed with only a verification of the sender's address, greatly speeding transaction times. These are _simple transactions_. See Single-Writer Apps for example applications of this simple transaction model. - -### Smart contract - -A [smart contract](https://en.wikipedia.org/wiki/Smart_contract) is an agreement based upon the protocol for conducting transactions in a blockchain. In IOTA, smart contracts are written in [Solidity/EVM or Move](../developer/evm-to-move/evm-to-move.mdx). - -### IOTA - -IOTA refers to the IOTA blockchain, and the [IOTA open source project](https://github.com/iotaledger/iota/) as a whole, or the native token to the IOTA network. - -### Total order - -[Total order](https://en.wikipedia.org/wiki/Total_order) refers to the ordered presentation of the history of all transactions processed by a traditional blockchain up to a given time. This is maintained by many blockchain systems, as the only way to process transactions. In contrast, IOTA uses a causal (partial) order wherever possible and safe. - -### Transaction - -A transaction in IOTA is a change to the blockchain. This may be a _simple transaction_ affecting only single-writer, single-address objects, such as minting an NFT or transferring an NFT or another token. These transactions may bypass the consensus protocol in IOTA. - -More _complex transactions_ affecting objects that are shared or owned by multiple addresses, such as asset management and other DeFi use cases, do go through consensus. - -### Transfer - -A transfer is switching the owner address of a token to a new one via command in IOTA. This is accomplished via the IOTA CLI client command line interface. It is one of the more common of many commands available in the CLI client. - -### Validator - -A validator in IOTA plays a passive role analogous to the more active role of validators and minors in other blockchains. In IOTA, validators do not continuously participate in the consensus protocol but are called into action only when receiving a transaction or -certificate. +<Glossary/> diff --git a/docs/content/references/research-papers.mdx b/docs/content/references/research-papers.mdx index 49b064fd219..53ca90d660e 100644 --- a/docs/content/references/research-papers.mdx +++ b/docs/content/references/research-papers.mdx @@ -42,7 +42,7 @@ This document contains a list of research papers that are relevant to IOTA. to add strong privacy to FastPay transactions (but IOTA does not plan to do this). - **Summary:** We introduce Zef, the first Byzantine-Fault Tolerant (BFT) protocol to support payments in anonymous digital coins at arbitrary scale. Zef follows the communication and security model of FastPay: both protocols are asynchronous, low-latency, linearly-scalable, and powered by partially-trusted - sharded validators. Zef further introduces opaque coins represented as off-chain certificates that are bound to user accounts. In order to hide the face + sharded validators. Zef further introduces opaque coins represented as off-chain _certificate_s that are bound to user accounts. In order to hide the face values of coins when a payment operation consumes or creates them, Zef uses random commitments and NIZK proofs. Created coins are made unlinkable using the blind and randomizable threshold anonymous credentials of [Coconut](https://arxiv.org/pdf/1802.07344.pdf). To control storage costs associated with coin replay prevention, Zef accounts are designed so that data can be safely removed once an account is deactivated. Besides the specifications and a detailed diff --git a/docs/site/config/jargon.js b/docs/site/config/jargon.js new file mode 100644 index 00000000000..669bc6d8cff --- /dev/null +++ b/docs/site/config/jargon.js @@ -0,0 +1,35 @@ +module.exports = { + 'causal history': 'Causal history is the relationship between an object in IOTA and its direct predecessors and successors. This history is essential to the causal order IOTA uses to process transactions. In contrast, other blockchains read the entire state of their world for each transaction, introducing latency.', + 'causal order': '<a href="https://www.scattered-thoughts.net/writing/causal-ordering/">Causal order</a> is a representation of the relationship between transactions and the objects they produce, laid out as dependencies. Validators cannot execute a transaction dependent on objects created by a prior transaction that has not finished. Rather than total order, IOTA uses causal order (a partial order).', + certificate: 'A certificate is the mechanism proving a transaction was approved or certified. Validators vote on transactions, and aggregators collect a Byzantine-resistant majority of these votes into a certificate and broadcasts it to all IOTA validators, thereby ensuring finality.', + epoch: 'Operation of the IOTA network is temporally partitioned into non-overlapping, fixed-duration epochs. During a particular epoch, the set of validators participating in the network is fixed.', + equivocation: 'Equivocation in blockchains is the malicious action of dishonest actors giving conflicting information for the same message, such as inconsistent or duplicate voting.', + 'eventual consistency': '<a href="https://en.wikipedia.org/wiki/Eventual_consistency">Eventual consistency</a> is the consensus model employed by IOTA; if one honest validator certifies the transaction, all of the other honest validators will too eventually.', + finality: '<a href="https://medium.com/mechanism-labs/finality-in-blockchain-consensus-d1f83c120a9a">Finality</a> is the assurance a transaction will not be revoked. This stage is considered closure for an exchange or other blockchain transaction.', + gas: '<a href="https://ethereum.org/en/developers/docs/gas/">Gas</a> refers to the computational effort required for executing operations on the IOTA network. In IOTA, gas is paid with the network\'s native currency IOTA. The cost of executing a transaction in IOTA units is referred to as the transaction fee.', + genesis: 'Genesis is the initial act of creating accounts and gas objects for a IOTA network. IOTA provides a `genesis` command that allows users to create and inspect the genesis object setting up the network for operation.', + 'multi-writer objects': 'Multi-writer objects are objects that are owned by more than one address. Transactions affecting multi-writer objects require consensus in IOTA. This contrasts with transactions affecting only single-writer objects, which require only a confirmation of the owner\'s address contents.', + object: ` + The basic unit of storage in IOTA is object. In contrast to many other blockchains, where storage is centered around address and each address contains a key-value store, IOTA\'s storage is centered around objects. IOTA objects have one of the following primary states:<br/> + <br/> + - <i>Immutable</i> - the object cannot be modified.<br/> + - <i>Mutable</i> - the object can be changed.<br/> + <br/> + Further, mutable objects are divided into these categories:<br/> + <br/> + - <i>Owned</i> - the object can be modified only by its owner.<br/> + - <i>Shared</i> - the object can be modified by anyone.<br/> + <br/> + Immutable objects do not need this distinction because they have no owner. + `, + PoS: '<a href="https://en.wikipedia.org/wiki/Proof_of_stake">Proof-of-stake</a> is a blockchain consensus mechanism where the voting weights of validators or validators is proportional to a bonded amount of the network\'s native currency (called their stake in the network). This mitigates <a href="https://en.wikipedia.org/wiki/Sybil_attack">Sybil attacks</a> by forcing bad actors to gain a large stake in the blockchain first.', + 'single-writer objects': 'Single-writer objects are owned by one address. In IOTA, transactions affecting only single-writer objects owned by the same address may proceed with only a verification of the sender\'s address, greatly speeding transaction times. These are simple transactions. See Single-Writer Apps for example applications of this simple transaction model.', + 'smart contract': 'A <a href="https://en.wikipedia.org/wiki/Smart_contract">smart contract</a> is an agreement based upon the protocol for conducting transactions in a blockchain. In IOTA, smart contracts are written in <a href="../developer/evm-to-move">Solidity/EVM or Move</a>.', + iota: 'IOTA refers to the IOTA blockchain, and the <a href="https://github.com/iotaledger/iota/">IOTA open source project</a> as a whole, or the native token to the IOTA network.', + 'total order': '<a href="https://en.wikipedia.org/wiki/Total_order">Total order</a> refers to the ordered presentation of the history of all transactions processed by a traditional blockchain up to a given time. This is maintained by many blockchain systems, as the only way to process transactions. In contrast, IOTA uses a causal (partial) order wherever possible and safe.', + transaction: ` + A transaction in IOTA is a change to the blockchain. This may be a <i>simple transaction</i> affecting only single-writer, single-address objects, such as minting an NFT or transferring an NFT or another token. These transactions may bypass the consensus protocol in IOTA.<br/> + More <i>complex transactions</i> affecting objects that are shared or owned by multiple addresses, such as asset management and other DeFi use cases, go through the<a href = "https://github.com/iotaledger/iota/tree/develop/narwhal">Narwhal and Bullshark</a> DAG - based mempool and efficient Byzantine Fault Tolerant(BFT) consensus. + `, + transfer: 'A transfer is switching the owner address of a token to a new one via command in IOTA. This is accomplished via the IOTA CLI client command line interface. It is one of the more common of many commands available in the CLI client.', + validator: 'A validator in IOTA plays a passive role analogous to the more active role of validators and minors in other blockchains. In IOTA, validators do not continuously participate in the consensus protocol but are called into action only when receiving a transaction or certificate.'}; diff --git a/docs/site/docusaurus.config.js b/docs/site/docusaurus.config.js index bdb717867cb..42fc2d4a79a 100644 --- a/docs/site/docusaurus.config.js +++ b/docs/site/docusaurus.config.js @@ -10,6 +10,8 @@ import codeImport from "remark-code-import"; require("dotenv").config(); +const jargonConfig = require('./config/jargon.js'); + /** @type {import('@docusaurus/types').Config} */ const config = { title: "IOTA Documentation", @@ -158,7 +160,10 @@ const config = { ], [codeImport, { rootDir: path.resolve(__dirname, `../../`) }], ], - rehypePlugins: [katex], + rehypePlugins: [ + katex, + [require('rehype-jargon'), { jargon: jargonConfig}] + ], }, theme: { customCss: [ diff --git a/docs/site/package.json b/docs/site/package.json index 5f0f7503310..3962ebe7ef2 100644 --- a/docs/site/package.json +++ b/docs/site/package.json @@ -20,6 +20,7 @@ }, "dependencies": { "@amplitude/analytics-browser": "^1.10.3", + "@artsy/to-title-case": "^1.1.0", "@docsearch/react": "^3.6.0", "@docusaurus/core": "3.5.2", "@docusaurus/preset-classic": "3.5.2", @@ -48,6 +49,7 @@ "graphql-config": "^5.0.3", "gray-matter": "^4.0.3", "hast-util-is-element": "^1.1.0", + "html-react-parser": "^5.1.18", "lodash": "^4.17.21", "markdown-to-jsx": "^7.4.7", "plugin-image-zoom": "github:flexanalytics/plugin-image-zoom", @@ -59,6 +61,7 @@ "react-scrollspy-navigation": "^1.0.3", "react-syntax-highlighter": "^15.5.0", "react-ui-scrollspy": "^2.3.0", + "rehype-jargon": "^3.1.0", "rehype-katex": "^7.0.0", "remark-math": "^6.0.0", "tailwindcss": "^3.3.3", diff --git a/docs/site/src/components/Glossary/index.tsx b/docs/site/src/components/Glossary/index.tsx new file mode 100644 index 00000000000..1a495afe0a3 --- /dev/null +++ b/docs/site/src/components/Glossary/index.tsx @@ -0,0 +1,53 @@ +import React from 'react'; +import Heading from '@theme/Heading'; +import { toTitleCase } from '@artsy/to-title-case'; +import { clsx } from 'clsx'; +import parse from 'html-react-parser'; + +export default function Glossary() { + const glossary = require('@site/config/jargon.js'); + + const sortedGlossary = Object.keys(glossary) + .sort(function (a, b) { + return a.toLowerCase().localeCompare(b.toLowerCase()); + }) + .reduce((acc, key) => { + acc[key] = glossary[key]; + return acc; + }, {}); + + let char = ''; + return ( + <> + {Object.entries(sortedGlossary).map(([key, value]) => { + let heading = null; + if (key.charAt(0).toLowerCase() !== char.toLowerCase()) { + char = key.charAt(0); + heading = char; + } + + return ( + <> + {heading && ( + <Heading + as='h2' + id={char} + title={char} + > + {char.toUpperCase()} + </Heading> + )} + <Heading + as='h3' + id={key} + title={key} + > + {toTitleCase(key)} + </Heading> + <p>{parse(value)}</p> + </> + ); + })} + </> + ); +} \ No newline at end of file diff --git a/docs/site/src/css/custom.css b/docs/site/src/css/custom.css index 59c5136435d..85816995775 100644 --- a/docs/site/src/css/custom.css +++ b/docs/site/src/css/custom.css @@ -29,6 +29,7 @@ --ifm-font-family-base: "Inter", sans-serif; --ifm-menu-color: #011829; --ifm-menu-color-background-active: transparent; + --ifm-hover-overlay: var(--ifm-color-emphasis-100); --docusaurus-highlighted-code-line-bg: rgba(0, 0, 0, 0.1); --iota-black: #111111; --iota-blue: #6fbcf0; @@ -89,7 +90,7 @@ } /* For readability concerns, you should choose a lighter palette in dark mode. */ -[data-theme="dark"] { +html[data-theme="dark"] { --ifm-color-primary: #4ca2ff; --ifm-color-primary-dark: #2b91ff; --ifm-color-primary-darker: #1a88ff; @@ -102,6 +103,7 @@ --ifm-menu-color-background-active: transparent; --ifm-navbar-sidebar-link-color: #f7f7f8; --ifm-navbar-sidebar-background-color: black; + --ifm-hover-overlay: var(--ifm-color-emphasis-100); } .active-scroll-spy { @@ -112,16 +114,20 @@ [data-theme="dark"] img.balance-coin-token { filter: invert(1); } + .table-of-contents__link--active { color: #525860; font-weight: 600; } +/* Hide ToC from imported READMEs */ .hidden-text{ display: none; } + [data-theme="dark"] .table-of-contents__link--active { color: white; } + /** navbar overrides */ [data-theme="light"] .clean-btn:hover { background-color: #525860; @@ -172,17 +178,21 @@ color: white; font-weight: 500; } + .pagination-nav__label--blue, .pagination-nav__sublabel--blue { color: white; } + .pagination-nav { display: flex; justify-content: space-between; } + [data-theme="light"] .pagination-nav__link { border: 1px solid #d8e1f4; } + .pagination-nav__link { background-color: transparent; border-radius: 0px; @@ -193,6 +203,7 @@ width: fit-content; min-width: 240px; } + .pagination-nav__label { color: white; } @@ -204,6 +215,7 @@ flex-direction: column; justify-content: space-between !important; } + .page-nav-content-light { display: flex; align-items: center; @@ -212,6 +224,7 @@ color: white !important; flex-direction: row-reverse; } + .page-nav-content-blue { display: flex; align-items: center; @@ -219,31 +232,38 @@ width: 100%; color: white !important; } + .page-nav-arrow--light, .pagination-nav__sublabel--light { color: white; } + .pagination-nav__label--light { color: black; } + [data-theme="dark"] .page-nav-arrow--light, .pagination-nav__sublabel--light, .pagination-nav__label--light { color: white; } + [data-theme="light"] .page-nav-arrow--light, .pagination-nav__label--light { color: black; } + [data-theme="light"] .pagination-nav__sublabel--light { color: #909fbe; } + [data-theme="dark"] .pagination-nav__label--light { color: white; } html[data-theme="dark"] { background-color: var(--iota-black); } + /** setup global style overrides */ body { font-family: var(--primaryFont); @@ -256,6 +276,7 @@ h1 { font-weight: 500; letter-spacing: -0.04em; } + .h1 { letter-spacing: -2.88px; margin-top: 0; @@ -273,6 +294,7 @@ h2 { line-height: 2.125rem; letter-spacing: -0.04em; } + .h2 { letter-spacing: -1.62px; margin-top: 0; @@ -316,24 +338,30 @@ h4 { line-height: 1.75rem; letter-spacing: -2%; } + @media screen and (max-width: 767px) { + h1, .h1 { font-size: 3.5rem; } + h2, .h2 { font-size: 2rem; } + h3, .h3 { font-size: 1.5rem; } + h4, .h4 { font-size: 1.2rem; } } + @media screen and (max-width: 599px) { .pagination-nav{ display: flex; @@ -350,10 +378,12 @@ h4 { .h2 { font-size: 1.7rem; } + h3, .h3 { font-size: 1.2rem; } + h4, .h4 { font-size: 1rem; @@ -365,19 +395,24 @@ h4 { border-bottom: 1px solid var(--iota-line); background-color: black; } + .navbar__title { width: 10px; } + .navbar__toggle path { stroke: var(--iota-white); } + .navbar__items { color: rgba(255, 255, 255, 0.7); } + .navbar__items .navbar__brand { width: 17%; color: rgba(255, 255, 255, 0.7); } + .navbar__items .navbar__item.navbar__link { /* font-family: var(--headerFont); */ font-size: 0.9375rem; @@ -408,10 +443,12 @@ h4 { [data-theme='light'] .DocSearch { --docsearch-searchbox-background: var(--ifm-background-color-dark); } + .DocSearch-Button-Container { width: 100%; justify-content: space-between; } + .DocSearch-Button { width: 12.5rem; height: 2.625rem !important; @@ -423,18 +460,22 @@ h4 { font-family: var(--primaryFont); letter-spacing: -0.01em; } + @media screen and (max-width: 599px) { .DocSearch-Button { width: initial; } } + .DocSearch-Search-Icon { order: 2; margin-left: auto; } + .DocSearch-Search-Icon path { stroke: var(--iota-white); } + .DocSearch-Button-Keys { display: none !important; } @@ -443,6 +484,7 @@ h4 { row-gap: 1rem; column-gap: 1rem; } + .markdown h1:first-child { margin-top: 1rem; } @@ -453,12 +495,15 @@ h4 { color: var(--iota-white); background: var(--iota-hero-dark); } -.button--success{ + +.button--success { background: var(--iota-success-dark); } -.button--danger{ + +.button--danger { background: var(--iota-issue-dark); } + .button-cta { letter-spacing: -0.3px; cursor: pointer; @@ -480,22 +525,26 @@ h4 { justify-content: center; gap: 1rem; } + .button-cta:hover { background-color: var(--iota-button-hover); color: var(--iota-white); text-decoration: none; } + .button-cta:after { content: url("data:image/svg+xml,%3Csvg width='18' height='19' viewBox='0 0 18 19' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M5 5.5H14V14.5' stroke='%23ABBDCC' stroke-width='2'/%3E%3Cpath d='M14 5.5L3 16.5' stroke='%23ABBDCC' stroke-width='2'/%3E%3C/svg%3E"); width: 18px; height: 18px; padding-bottom: 2px; } + @media (max-width: 1050px) { .navbar .button-cta { display: none; } } + .footer { background-color: black; } @@ -504,10 +553,57 @@ h4 { .text-white { color: var(--iota-white); } + .text-gray { color: var(--iota-gray); } +/*------------Jargon---------------*/ +/* Add a dashed line under jargon terms */ +.jargon-term { + text-decoration: underline var(--ifm-color-primary-light); +} + +/* Add a question mark behind/above jargon terms */ +.jargon-term::after { + content: '?'; + font-weight: bold; + display: inline-block; + transform: translate(0, -0.5em); + font-size: 75%; + color: var(--ifm-color-primary-light); + margin-left: 3px; +} + +/* Hover behavior for the therm itself */ +.jargon-term:hover { + position: relative; + text-decoration: none; + cursor: help; +} + +/* Hide info by default */ +.jargon-term .jargon-info { + display: none; +} + +/* Show info on hover */ +.jargon-term:hover .jargon-info { + display: block; + position: absolute; + top: 1.5em; + left: 0; + background: var(--ifm-hover-overlay); + border: 1px solid var(--ifm-color-primary-light); + padding: 1rem; + border-radius: 4px; + font-size: 90%; + min-width: 250px; + max-width: 450px; + z-index: 1; +} +/*---------------------------------*/ + /* Ensure equations are scrollable on smaller screens */ .katex-display { overflow-x: scroll; @@ -526,4 +622,4 @@ h4 { .katex-display { max-width: 100%; overflow-wrap: break-word; -} \ No newline at end of file +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 5233dee99b1..e765a5f6859 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1311,6 +1311,9 @@ importers: '@amplitude/analytics-browser': specifier: ^1.10.3 version: 1.13.6 + '@artsy/to-title-case': + specifier: ^1.1.0 + version: 1.1.0 '@docsearch/react': specifier: ^3.6.0 version: 3.6.1(@algolia/client-search@4.24.0)(@types/react@18.3.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) @@ -1395,6 +1398,9 @@ importers: hast-util-is-element: specifier: ^1.1.0 version: 1.1.0 + html-react-parser: + specifier: ^5.1.18 + version: 5.1.18(@types/react@18.3.9)(react@18.3.1) lodash: specifier: ^4.17.21 version: 4.17.21 @@ -1428,6 +1434,9 @@ importers: react-ui-scrollspy: specifier: ^2.3.0 version: 2.3.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rehype-jargon: + specifier: ^3.1.0 + version: 3.1.0 rehype-katex: specifier: ^7.0.0 version: 7.0.1 @@ -2224,6 +2233,9 @@ packages: resolution: {integrity: sha512-xhlTqH0m31mnsG0tIP4ETgfSB6gXDaYYsUWTrlUV93fFQPI9dd8hE0Ot6MHLCtqgB32hwJAC3YZMWlXZw7AleA==} engines: {node: '>=14'} + '@artsy/to-title-case@1.1.0': + resolution: {integrity: sha512-n2GISILNv3X9xVjkUC1thoOl7rVKPeDskobQJsC5G8poFpF4HNxxSJD97NjvCK3Ai1RplSMsN2MCmMAy7plx9Q==} + '@aw-web-design/x-default-browser@1.4.126': resolution: {integrity: sha512-Xk1sIhyNC/esHGGVjL/niHLowM0csl/kFO5uawBy4IrWwy0o1G8LGt3jP6nmWGz+USxeeqbihAmp/oVZju6wug==} hasBin: true @@ -10880,6 +10892,9 @@ packages: hast-util-from-html-isomorphic@2.0.0: resolution: {integrity: sha512-zJfpXq44yff2hmE0XmwEOzdWin5xwH+QIhMLOScpX91e/NSGPsAzNCvLQDIEPyO2TXi+lBmU6hjLIhV8MwP2kw==} + hast-util-from-html@2.0.1: + resolution: {integrity: sha512-RXQBLMl9kjKVNkJTIO6bZyb2n+cUH8LFaSSzo82jiLT6Tfc+Pt7VQCS+/h3YwG4jaNE2TA2sdJisGWR+aJrp0g==} + hast-util-from-html@2.0.3: resolution: {integrity: sha512-CUSRHXyKjzHov8yKsQjGOElXy/3EKpyX56ELnkHH34vDVw1N1XSQ1ZcAvTyAPtGqLTuKP/uxM+aLkSPqF/EtMw==} @@ -10954,6 +10969,9 @@ packages: hpack.js@2.1.6: resolution: {integrity: sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==} + html-dom-parser@5.0.10: + resolution: {integrity: sha512-GwArYL3V3V8yU/mLKoFF7HlLBv80BZ2Ey1BzfVNRpAci0cEKhFHI/Qh8o8oyt3qlAMLlK250wsxLdYX4viedvg==} + html-encoding-sniffer@4.0.0: resolution: {integrity: sha512-Y22oTqIU4uuPgEemfz7NDJz6OeKf12Lsu+QC+s3BVpda64lTiMYCyGwg5ki4vFxkMwQdeZDl2adZoqUgdFuTgQ==} engines: {node: '>=18'} @@ -10974,6 +10992,15 @@ packages: engines: {node: ^14.13.1 || >=16.0.0} hasBin: true + html-react-parser@5.1.18: + resolution: {integrity: sha512-65BwC0zzrdeW96jB2FRr5f1ovBhRMpLPJNvwkY5kA8Ay5xdL9t/RH2/uUTM7p+cl5iM88i6dDk4LXtfMnRmaJQ==} + peerDependencies: + '@types/react': 0.14 || 15 || 16 || 17 || 18 + react: 0.14 || 15 || 16 || 17 || 18 + peerDependenciesMeta: + '@types/react': + optional: true + html-tags@3.3.1: resolution: {integrity: sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ==} engines: {node: '>=8'} @@ -10999,6 +11026,9 @@ packages: htmlparser2@8.0.2: resolution: {integrity: sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==} + htmlparser2@9.1.0: + resolution: {integrity: sha512-5zfg6mHUoaer/97TxnGpxmbR7zJtPwIYFMZ/H5ucTlPZhKvtum05yiPK3Mgai3a0DyVxv7qYqoweaEd2nrYQzQ==} + http-cache-semantics@4.1.1: resolution: {integrity: sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==} @@ -12042,12 +12072,18 @@ packages: lodash.debounce@4.0.8: resolution: {integrity: sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==} + lodash.deburr@4.1.0: + resolution: {integrity: sha512-m/M1U1f3ddMCs6Hq2tAsYThTBDaAKFDX3dwDo97GEYzamXi9SqUpjWi/Rrj/gf3X2n8ktwgZrlP1z6E3v/IExQ==} + lodash.get@4.4.2: resolution: {integrity: sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==} lodash.isequal@4.5.0: resolution: {integrity: sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==} + lodash.isnumber@3.0.3: + resolution: {integrity: sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==} + lodash.memoize@4.1.2: resolution: {integrity: sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==} @@ -12063,6 +12099,9 @@ packages: lodash.uniq@4.5.0: resolution: {integrity: sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==} + lodash.upperfirst@4.3.1: + resolution: {integrity: sha512-sReKOYJIJf74dhJONhU4e0/shzi1trVbSWDOhKYE5XV2O+H7Sb2Dihwuc7xWxVl+DgFPyTqIN3zMfT9cq5iWDg==} + lodash@4.17.21: resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} @@ -14156,6 +14195,9 @@ packages: react: ^0.14 || ^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 react-dom: ^0.14 || ^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 + react-property@2.0.2: + resolution: {integrity: sha512-+PbtI3VuDV0l6CleQMsx2gtK0JZbZKbpdu5ynr+lbsuvtmgbNcS3VM0tuY2QjFNOcWxvXeHjDpy42RO+4U2rug==} + react-redux@8.1.3: resolution: {integrity: sha512-n0ZrutD7DaX/j9VscF+uTALI3oUPa/pO4Z3soOBIjuRn/FzVu6aehhysxZCLi6y7duMf52WNZGMl7CtuK5EnRw==} peerDependencies: @@ -14455,6 +14497,10 @@ packages: resolution: {integrity: sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==} hasBin: true + rehype-jargon@3.1.0: + resolution: {integrity: sha512-DTvSVI0MPa9Gen7oiob71ROG+ztagQ2KIDbM/1vUsZvrh0f8G2YyxrNoS4AL0WQHbHwwNzg/wLz301B3u+Tq7Q==} + engines: {node: '>=18', npm: '>=9'} + rehype-katex@7.0.1: resolution: {integrity: sha512-OiM2wrZ/wuhKkigASodFoo8wimG3H12LWQaH8qSPVJn9apWKFSH3YOCtbKpBorTVw/eI7cuT21XBbvwEswbIOA==} @@ -15215,6 +15261,9 @@ packages: resolution: {integrity: sha512-V1LGY4UUo0jgwC+ELQ2BNWfPa17TIuwBLg+j1AA/9RPzKINl1lhxVEu2r+ZTTO8aetIsUzE5Qj6LMSBkoGYKKw==} engines: {node: '>=14.16'} + style-to-js@1.1.16: + resolution: {integrity: sha512-/Q6ld50hKYPH3d/r6nr117TZkHR0w0kGGIVfpG9N6D8NymRPM9RqCUv4pRpJ62E5DqOYx2AFpbZMyCPnjQCnOw==} + style-to-object@0.4.4: resolution: {integrity: sha512-HYNoHZa2GorYNyqiCaBgsxvcJIn7OHq6inEga+E6Ke3m5JkoqpQbnFssk4jwe+K7AhGa2fcha4wSOf1Kn01dMg==} @@ -17120,6 +17169,12 @@ snapshots: transitivePeerDependencies: - encoding + '@artsy/to-title-case@1.1.0': + dependencies: + lodash.deburr: 4.1.0 + lodash.isnumber: 3.0.3 + lodash.upperfirst: 4.3.1 + '@aw-web-design/x-default-browser@1.4.126': dependencies: default-browser-id: 3.0.0 @@ -28892,6 +28947,15 @@ snapshots: hast-util-from-html: 2.0.3 unist-util-remove-position: 5.0.0 + hast-util-from-html@2.0.1: + dependencies: + '@types/hast': 3.0.4 + devlop: 1.1.0 + hast-util-from-parse5: 8.0.1 + parse5: 7.1.2 + vfile: 6.0.3 + vfile-message: 4.0.2 + hast-util-from-html@2.0.3: dependencies: '@types/hast': 3.0.4 @@ -29067,6 +29131,11 @@ snapshots: readable-stream: 2.3.8 wbuf: 1.7.3 + html-dom-parser@5.0.10: + dependencies: + domhandler: 5.0.3 + htmlparser2: 9.1.0 + html-encoding-sniffer@4.0.0: dependencies: whatwg-encoding: 3.1.1 @@ -29095,6 +29164,16 @@ snapshots: relateurl: 0.2.7 terser: 5.34.0 + html-react-parser@5.1.18(@types/react@18.3.9)(react@18.3.1): + dependencies: + domhandler: 5.0.3 + html-dom-parser: 5.0.10 + react: 18.3.1 + react-property: 2.0.2 + style-to-js: 1.1.16 + optionalDependencies: + '@types/react': 18.3.9 + html-tags@3.3.1: {} html-void-elements@3.0.0: {} @@ -29133,6 +29212,13 @@ snapshots: domutils: 3.1.0 entities: 4.5.0 + htmlparser2@9.1.0: + dependencies: + domelementtype: 2.3.0 + domhandler: 5.0.3 + domutils: 3.1.0 + entities: 4.5.0 + http-cache-semantics@4.1.1: {} http-call@5.3.0: @@ -30384,10 +30470,14 @@ snapshots: lodash.debounce@4.0.8: {} + lodash.deburr@4.1.0: {} + lodash.get@4.4.2: {} lodash.isequal@4.5.0: {} + lodash.isnumber@3.0.3: {} + lodash.memoize@4.1.2: {} lodash.merge@4.6.2: {} @@ -30398,6 +30488,8 @@ snapshots: lodash.uniq@4.5.0: {} + lodash.upperfirst@4.3.1: {} + lodash@4.17.21: {} log-chopper@1.0.2: @@ -32935,6 +33027,8 @@ snapshots: react: 18.3.1 react-dom: 18.3.1(react@18.3.1) + react-property@2.0.2: {} + react-redux@8.1.3(@types/react-dom@18.3.0)(@types/react@18.3.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(redux@4.2.1): dependencies: '@babel/runtime': 7.25.6 @@ -33287,6 +33381,11 @@ snapshots: dependencies: jsesc: 0.5.0 + rehype-jargon@3.1.0: + dependencies: + hast-util-from-html: 2.0.1 + unist-util-visit: 5.0.0 + rehype-katex@7.0.1: dependencies: '@types/hast': 3.0.4 @@ -34241,6 +34340,10 @@ snapshots: strip-json-comments@5.0.0: {} + style-to-js@1.1.16: + dependencies: + style-to-object: 1.0.8 + style-to-object@0.4.4: dependencies: inline-style-parser: 0.1.1 From 17a73b1ce5bd4f23651828cd160b3229cfa2fe05 Mon Sep 17 00:00:00 2001 From: Dr-Electron <dr-electr0n@protonmail.com> Date: Fri, 13 Dec 2024 14:58:36 +0100 Subject: [PATCH 49/97] fix[docs]: Swizzle CodeBlock to allow multiple CodeBlocks to coexist (#4404) --- docs/site/docusaurus.config.js | 4 ++-- docs/site/src/theme/CodeBlock/index.tsx | 29 +++++++++++++++++++++++++ 2 files changed, 31 insertions(+), 2 deletions(-) create mode 100644 docs/site/src/theme/CodeBlock/index.tsx diff --git a/docs/site/docusaurus.config.js b/docs/site/docusaurus.config.js index 42fc2d4a79a..feb04ab538a 100644 --- a/docs/site/docusaurus.config.js +++ b/docs/site/docusaurus.config.js @@ -191,8 +191,8 @@ const config = { type: "text/css", }, ], - themes: ["@docusaurus/theme-live-codeblock", "@docusaurus/theme-mermaid", 'docusaurus-theme-search-typesense', - '@saucelabs/theme-github-codeblock'], + themes: ["@docusaurus/theme-mermaid", 'docusaurus-theme-search-typesense', + '@saucelabs/theme-github-codeblock', '@docusaurus/theme-live-codeblock'], themeConfig: /** @type {import('@docusaurus/preset-classic').ThemeConfig} */ ({ diff --git a/docs/site/src/theme/CodeBlock/index.tsx b/docs/site/src/theme/CodeBlock/index.tsx new file mode 100644 index 00000000000..11c54f01d83 --- /dev/null +++ b/docs/site/src/theme/CodeBlock/index.tsx @@ -0,0 +1,29 @@ +/** + * SWIZZLED VERSION: 3.5.2 + * REASONS: + * - Add check for reference CodeBlock so it can coexist with the original CodeBlock and the live code block + */ +import React from 'react'; +import CodeBlock from '@theme-original/CodeBlock'; +import ReferenceCodeBlock from '@saucelabs/theme-github-codeblock/build/theme/ReferenceCodeBlock'; +import { ReferenceCodeBlockProps } from '@saucelabs/theme-github-codeblock/build/theme/types'; +import type CodeBlockType from '@theme/CodeBlock'; +import type {WrapperProps} from '@docusaurus/types'; + +type Props = WrapperProps<typeof CodeBlockType>; + +function isReferenceCodeBlockType(props: object): props is ReferenceCodeBlockProps { + return 'reference' in props + || ('metastring' in props && typeof props.metastring === 'string' && props.metastring.split(' ').includes('reference')); +} + +// Wrap CodeBlock to check if it is a reference (saucepans) CodeBlock. +// If it isn't, we just return the live plugin CodeBlock which will check, +// if the CodeBlock is a live CodeBlock or the original CodeBlock +export default function CodeBlockWrapper(props: ReferenceCodeBlockProps | Props): JSX.Element { + return ( + <> + {isReferenceCodeBlockType(props) ? <ReferenceCodeBlock {...props} /> : <CodeBlock {...props} />} + </> + ); +} From d7b4ec1aaf93492742524e0833623ac83c30d023 Mon Sep 17 00:00:00 2001 From: Dr-Electron <dr-electr0n@protonmail.com> Date: Fri, 13 Dec 2024 16:28:45 +0100 Subject: [PATCH 50/97] fix(docs): fix admonitions (#4455) --- docs/content/_snippets/info-high-traffic.mdx | 7 +++++++ docs/content/_snippets/warn-ml-rpcs.mdx | 9 --------- docs/content/references/iota-api.mdx | 2 +- .../references/iota-api/rpc-best-practices.mdx | 4 ++-- .../references/ts-sdk/typescript/index.mdx | 17 ++++------------- 5 files changed, 14 insertions(+), 25 deletions(-) create mode 100644 docs/content/_snippets/info-high-traffic.mdx delete mode 100644 docs/content/_snippets/warn-ml-rpcs.mdx diff --git a/docs/content/_snippets/info-high-traffic.mdx b/docs/content/_snippets/info-high-traffic.mdx new file mode 100644 index 00000000000..734ea92ab9e --- /dev/null +++ b/docs/content/_snippets/info-high-traffic.mdx @@ -0,0 +1,7 @@ +:::info + +It is suggested to use dedicated nodes/shared services rather than public endpoints for production apps with high traffic volume. + +You can either run your own Full nodes, or outsource this to a professional infrastructure provider (preferred for apps that have high traffic). + +::: \ No newline at end of file diff --git a/docs/content/_snippets/warn-ml-rpcs.mdx b/docs/content/_snippets/warn-ml-rpcs.mdx deleted file mode 100644 index d54a7bd25aa..00000000000 --- a/docs/content/_snippets/warn-ml-rpcs.mdx +++ /dev/null @@ -1,9 +0,0 @@ -:::caution - -Use dedicated nodes/shared services rather than public endpoints for production apps. The public endpoints maintained -by the IOTA Foundation are rate-limited, and support only 100 requests -per 30 seconds. Do not use public endpoints in production applications with high traffic volume. - -You can either run your own Full nodes, or outsource this to a professional infrastructure provider (preferred for apps that have high traffic). - -::: \ No newline at end of file diff --git a/docs/content/references/iota-api.mdx b/docs/content/references/iota-api.mdx index ac1d15e9f42..01a192f4c31 100644 --- a/docs/content/references/iota-api.mdx +++ b/docs/content/references/iota-api.mdx @@ -5,7 +5,7 @@ title: IOTA RPC :::info -The IOTA RPC is upgrading from JSON-RPC to GraphQL. See [GraphQL for IOTA RPC](../developer/graphql-rpc.mdx) for more information. +Checkout our experimental [GraphQL for IOTA RPC](../developer/graphql-rpc.mdx) as an alternative option. ::: diff --git a/docs/content/references/iota-api/rpc-best-practices.mdx b/docs/content/references/iota-api/rpc-best-practices.mdx index f7da7c10835..cae50a7227b 100644 --- a/docs/content/references/iota-api/rpc-best-practices.mdx +++ b/docs/content/references/iota-api/rpc-best-practices.mdx @@ -2,11 +2,11 @@ title: RPC Best Practices --- -import WarnMlRpcs from "../../_snippets/warn-ml-rpcs.mdx"; +import HighTrafficRpcs from "../../_snippets/info-high-traffic.mdx"; This topic provides some best practices for configuring your RPC settings to ensure a reliable infrastructure for your projects and services built on IOTA. -<WarnMlRpcs /> +<HighTrafficRpcs /> ## RPC provisioning guidance diff --git a/docs/content/references/ts-sdk/typescript/index.mdx b/docs/content/references/ts-sdk/typescript/index.mdx index f155c2b3822..f1bc88e8908 100644 --- a/docs/content/references/ts-sdk/typescript/index.mdx +++ b/docs/content/references/ts-sdk/typescript/index.mdx @@ -1,5 +1,6 @@ import NetworkInfo from "@site/src/components/NetworkInfo/index.tsx"; import { Networks } from '@site/src/components/constant.tsx'; +import HighTrafficRpcs from "@site/../content/_snippets/info-high-traffic.mdx"; # IOTA TypeScript SDK Quick Start @@ -16,6 +17,9 @@ npm i @iota/iota-sdk The following table lists the locations for IOTA networks. +{ /* TODO: https://github.com/iotaledger/iota/issues/4497 */ } +<HighTrafficRpcs /> + ## IOTA Testnet <NetworkInfo.Move {...Networks['iota_move_testnet']}/> @@ -30,19 +34,6 @@ To create a local IOTA network, you can refer to [Local Development](/developer/ <NetworkInfo.Move {...Networks['iota_localnet']}/> -:::warning - -Use dedicated nodes/shared services rather than public endpoints for production apps. The public -endpoints maintained by the IOTA Foundation (`api.<NETWORK>.iota.cafe:443`) are rate-limited, and support -only 100 requests per 30 seconds or so. Do not use public endpoints in production applications with -high traffic volume. - -You can either run your own Full nodes, or outsource this to a professional infrastructure provider -(preferred for apps that have high traffic). You can find a list of reliable RPC endpoint providers -for IOTA on the [IOTA Dev Portal](https://iota.io/developers#dev-tools) using the **Node Service** tab. - -::: - ## Migrate to version 0.38.0 The IOTA TypeScript SDK was refactored beginning with version 0.38.0. If you are updating from an From 855f5fd46ee89969e0790146ee735b5f524c5619 Mon Sep 17 00:00:00 2001 From: Dr-Electron <dr-electr0n@protonmail.com> Date: Fri, 13 Dec 2024 16:43:18 +0100 Subject: [PATCH 51/97] fix(docs): Fix architecture diagram and questions (#4451) --- .../getting-started/getting-started.mdx | 2 +- .../getting-started/local-network.mdx | 1 - .../dark/iota-architecture.svg | 2 +- .../iota-architecture.svg | 2 +- .../developer/getting-started/connect.json | 2 +- .../getting-started/create-a-package.json | 39 +++--- .../getting-started/local-network.json | 122 ++++++++++++------ 7 files changed, 113 insertions(+), 57 deletions(-) diff --git a/docs/content/developer/getting-started/getting-started.mdx b/docs/content/developer/getting-started/getting-started.mdx index 76a0fa944ef..ae2bdb4fff8 100644 --- a/docs/content/developer/getting-started/getting-started.mdx +++ b/docs/content/developer/getting-started/getting-started.mdx @@ -10,7 +10,7 @@ tags: # Getting Started IOTA Rebased introduces layer 1 Move smart contracts to the IOTA ecosystem. This valuable addition enhances IOTA by -offering programmability on layer1, complementing [IOTA EVM](../../about-iota/about-iota.mdx#iota-evm-and-shimmer-evm) on layer 2. +offering programmability on layer 1, complementing [IOTA EVM](../../about-iota/about-iota.mdx#iota-evm-and-shimmer-evm) on layer 2. The guides in this section will guide you as you start your IOTA Rebased journey. We recommend that you start by [setting up your development environment](iota-environment.mdx), and then move on diff --git a/docs/content/developer/getting-started/local-network.mdx b/docs/content/developer/getting-started/local-network.mdx index ff670dacf55..8451b219379 100644 --- a/docs/content/developer/getting-started/local-network.mdx +++ b/docs/content/developer/getting-started/local-network.mdx @@ -274,5 +274,4 @@ pnpm add <PATH_TO_YOUR_REPO>/sdk/typescript and the locally compiled version of `@iota/iota-sdk` package will be installed for your application. - <Quiz questions={questions} /> diff --git a/docs/site/static/img/concepts/execution-architecture/dark/iota-architecture.svg b/docs/site/static/img/concepts/execution-architecture/dark/iota-architecture.svg index 7b929d828ab..ab6607556e2 100644 --- a/docs/site/static/img/concepts/execution-architecture/dark/iota-architecture.svg +++ b/docs/site/static/img/concepts/execution-architecture/dark/iota-architecture.svg @@ -1,4 +1,4 @@ <?xml version="1.0" encoding="UTF-8"?> <!-- Do not edit this file with editors other than draw.io --> <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> -<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="1157px" height="747px" viewBox="-0.5 -0.5 1157 747" content="<mxfile host="Electron" agent="Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) draw.io/24.7.17 Chrome/128.0.6613.36 Electron/32.0.1 Safari/537.36" version="24.7.17"> <diagram name="Page-1" id="jhOoJUkd9Zucpb-pnEYY"> <mxGraphModel dx="1623" dy="1938" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="850" pageHeight="1100" background="none" math="0" shadow="0"> <root> <mxCell id="0" /> <mxCell id="1" parent="0" /> <mxCell id="3kIInuhs_YmBb0iZ2eFI-7" value="&lt;b&gt;Execution layer&lt;/b&gt;" style="verticalAlign=top;align=left;shape=cube;size=10;direction=west;fontStyle=0;html=1;boundedLbl=1;spacingLeft=5;whiteSpace=wrap;rounded=1;strokeWidth=1;shadow=1;" parent="1" vertex="1"> <mxGeometry x="495" y="25" width="440" height="450" as="geometry" /> </mxCell> <mxCell id="3kIInuhs_YmBb0iZ2eFI-63" value="" style="rounded=1;whiteSpace=wrap;html=1;hachureGap=4;fontFamily=Helvetica;strokeColor=default;fillColor=default;glass=0;" parent="3kIInuhs_YmBb0iZ2eFI-7" vertex="1"> <mxGeometry x="10.003376623376589" y="39.550041395623865" width="393.8931818181818" height="227.41573033707866" as="geometry" /> </mxCell> <mxCell id="3kIInuhs_YmBb0iZ2eFI-8" value="&lt;b&gt;Adapter&lt;/b&gt;" style="verticalAlign=top;align=center;shape=cube;size=10;direction=south;html=1;boundedLbl=1;spacingLeft=5;whiteSpace=wrap;rounded=1;" parent="3kIInuhs_YmBb0iZ2eFI-7" vertex="1"> <mxGeometry width="170" height="190" relative="1" as="geometry"> <mxPoint x="30" y="55" as="offset" /> </mxGeometry> </mxCell> <mxCell id="3kIInuhs_YmBb0iZ2eFI-43" value="" style="group;rounded=1;" parent="3kIInuhs_YmBb0iZ2eFI-7" vertex="1" connectable="0"> <mxGeometry x="38.86363636363636" y="304.0449438202247" width="102.27272727272727" height="118.65168539325842" as="geometry" /> </mxCell> <mxCell id="3kIInuhs_YmBb0iZ2eFI-9" value="&lt;b&gt;MoveVM&lt;/b&gt;" style="verticalAlign=top;align=center;shape=cube;size=10;direction=south;html=1;boundedLbl=1;spacingLeft=5;whiteSpace=wrap;rounded=1;" parent="3kIInuhs_YmBb0iZ2eFI-43" vertex="1"> <mxGeometry width="102.27272727272727" height="79.10112359550561" as="geometry" /> </mxCell> <mxCell id="3kIInuhs_YmBb0iZ2eFI-41" value="move-execution/move-vm-runtime" style="rounded=1;whiteSpace=wrap;html=1;" parent="3kIInuhs_YmBb0iZ2eFI-43" vertex="1"> <mxGeometry y="79.10112359550561" width="92.04545454545455" height="39.550561797752806" as="geometry" /> </mxCell> <mxCell id="3kIInuhs_YmBb0iZ2eFI-44" value="" style="group;rounded=1;" parent="3kIInuhs_YmBb0iZ2eFI-7" vertex="1" connectable="0"> <mxGeometry x="296.59090909090907" y="306.51685393258424" width="102.27272727272727" height="118.65168539325842" as="geometry" /> </mxCell> <mxCell id="3kIInuhs_YmBb0iZ2eFI-13" value="&lt;b&gt;Framework&lt;/b&gt;" style="verticalAlign=top;align=center;shape=cube;size=10;direction=south;html=1;boundedLbl=1;spacingLeft=5;whiteSpace=wrap;rounded=1;" parent="3kIInuhs_YmBb0iZ2eFI-44" vertex="1"> <mxGeometry width="102.27272727272727" height="79.10112359550561" as="geometry" /> </mxCell> <mxCell id="3kIInuhs_YmBb0iZ2eFI-42" value="iota-framework crate" style="rounded=1;whiteSpace=wrap;html=1;" parent="3kIInuhs_YmBb0iZ2eFI-44" vertex="1"> <mxGeometry y="79.10112359550561" width="92.04545454545455" height="39.550561797752806" as="geometry" /> </mxCell> <mxCell id="3kIInuhs_YmBb0iZ2eFI-56" value="Init" style="edgeStyle=orthogonalEdgeStyle;rounded=1;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0;entryY=0;entryDx=0;entryDy=45;entryPerimeter=0;curved=0;" parent="3kIInuhs_YmBb0iZ2eFI-7" source="3kIInuhs_YmBb0iZ2eFI-39" target="3kIInuhs_YmBb0iZ2eFI-9" edge="1"> <mxGeometry relative="1" as="geometry" /> </mxCell> <mxCell id="3kIInuhs_YmBb0iZ2eFI-58" value="" style="group;rounded=1;" parent="3kIInuhs_YmBb0iZ2eFI-7" vertex="1" connectable="0"> <mxGeometry x="46.16883116883113" y="88.98824364281488" width="378.4090909090909" height="168.0904080425784" as="geometry" /> </mxCell> <mxCell id="3kIInuhs_YmBb0iZ2eFI-40" value="" style="group;rounded=1;" parent="3kIInuhs_YmBb0iZ2eFI-58" vertex="1" connectable="0"> <mxGeometry width="128.57142857142858" height="138.42696629213484" as="geometry" /> </mxCell> <mxCell id="3kIInuhs_YmBb0iZ2eFI-10" value="&lt;b&gt;Execution-engine&lt;/b&gt;" style="verticalAlign=top;align=center;shape=cube;size=10;direction=south;html=1;boundedLbl=1;spacingLeft=5;whiteSpace=wrap;rounded=1;" parent="3kIInuhs_YmBb0iZ2eFI-40" vertex="1"> <mxGeometry width="128.57142857142856" height="92.63157894736842" as="geometry" /> </mxCell> <mxCell id="3kIInuhs_YmBb0iZ2eFI-39" value="...execution/&lt;span style=&quot;font-family: &amp;quot;Helvetica Neue&amp;quot;; font-size: 13px;&quot;&gt;iota&lt;/span&gt;-adapter/execution-engine" style="rounded=1;whiteSpace=wrap;html=1;" parent="3kIInuhs_YmBb0iZ2eFI-58" vertex="1"> <mxGeometry x="5.849999999999999" y="92.6274157303371" width="109.575" height="45.79955056179776" as="geometry" /> </mxCell> <mxCell id="3kIInuhs_YmBb0iZ2eFI-61" style="edgeStyle=orthogonalEdgeStyle;rounded=1;hachureGap=4;orthogonalLoop=1;jettySize=auto;html=1;exitX=0;exitY=0;exitDx=45;exitDy=100;exitPerimeter=0;entryX=1;entryY=0.206;entryDx=0;entryDy=0;entryPerimeter=0;fontFamily=Architects Daughter;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DArchitects%2BDaughter;curved=0;" parent="3kIInuhs_YmBb0iZ2eFI-7" source="3kIInuhs_YmBb0iZ2eFI-13" target="3kIInuhs_YmBb0iZ2eFI-8" edge="1"> <mxGeometry relative="1" as="geometry" /> </mxCell> <mxCell id="3kIInuhs_YmBb0iZ2eFI-62" value="&lt;h4&gt;&lt;font face=&quot;Helvetica&quot;&gt;native fns etc&lt;/font&gt;&lt;/h4&gt;" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];sketch=1;hachureGap=4;jiggle=2;curveFitting=1;fontFamily=Architects Daughter;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DArchitects%2BDaughter;rounded=1;" parent="3kIInuhs_YmBb0iZ2eFI-61" vertex="1" connectable="0"> <mxGeometry x="-0.1741" y="-1" relative="1" as="geometry"> <mxPoint as="offset" /> </mxGeometry> </mxCell> <mxCell id="3kIInuhs_YmBb0iZ2eFI-45" value="" style="group;rounded=1;" parent="3kIInuhs_YmBb0iZ2eFI-7" vertex="1" connectable="0"> <mxGeometry x="276.1363636363636" y="98.87640449438204" width="102.27272727272727" height="118.65168539325842" as="geometry" /> </mxCell> <mxCell id="3kIInuhs_YmBb0iZ2eFI-48" value="" style="group;rounded=1;" parent="3kIInuhs_YmBb0iZ2eFI-45" vertex="1" connectable="0"> <mxGeometry width="102.27272727272727" height="118.65168539325842" as="geometry" /> </mxCell> <mxCell id="3kIInuhs_YmBb0iZ2eFI-46" value="&lt;b&gt;Object runtime&lt;/b&gt;" style="verticalAlign=top;align=center;shape=cube;size=10;direction=south;html=1;boundedLbl=1;spacingLeft=5;whiteSpace=wrap;rounded=1;" parent="3kIInuhs_YmBb0iZ2eFI-48" vertex="1"> <mxGeometry width="102.27272727272727" height="79.10112359550561" as="geometry" /> </mxCell> <mxCell id="3kIInuhs_YmBb0iZ2eFI-47" value="...execution/&lt;span style=&quot;font-family: &amp;quot;Helvetica Neue&amp;quot;; font-size: 13px;&quot;&gt;iota&lt;/span&gt;-move-natives" style="rounded=1;whiteSpace=wrap;html=1;" parent="3kIInuhs_YmBb0iZ2eFI-48" vertex="1"> <mxGeometry y="79.10112359550561" width="92.04545454545455" height="39.550561797752806" as="geometry" /> </mxCell> <mxCell id="3kIInuhs_YmBb0iZ2eFI-64" value="&lt;span style=&quot;caret-color: rgb(0, 0, 0); font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; letter-spacing: normal; text-align: center; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration: none; float: none; display: inline !important;&quot;&gt;&lt;b style=&quot;&quot;&gt;iota-execution crate&lt;/b&gt;&lt;/span&gt;" style="text;whiteSpace=wrap;html=1;fontFamily=Architects Daughter;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DArchitects%2BDaughter;rounded=1;fillColor=default;fontColor=default;" parent="3kIInuhs_YmBb0iZ2eFI-7" vertex="1"> <mxGeometry x="268.5363636363636" y="49.43820224719101" width="117.47045454545454" height="29.662921348314605" as="geometry" /> </mxCell> <mxCell id="3kIInuhs_YmBb0iZ2eFI-15" value="&lt;b&gt;Nodes network(Iota node)&lt;/b&gt;" style="verticalAlign=top;align=left;shape=cube;size=10;direction=south;fontStyle=0;html=1;boundedLbl=1;spacingLeft=5;whiteSpace=wrap;rounded=1;shadow=1;strokeWidth=1;" parent="1" vertex="1"> <mxGeometry x="-210" y="30" width="380" height="430" as="geometry" /> </mxCell> <mxCell id="3kIInuhs_YmBb0iZ2eFI-16" value="&lt;b&gt;Node&lt;/b&gt;" style="verticalAlign=top;align=center;shape=cube;size=10;direction=south;html=1;boundedLbl=1;spacingLeft=5;whiteSpace=wrap;rounded=1;" parent="3kIInuhs_YmBb0iZ2eFI-15" vertex="1"> <mxGeometry width="330" height="370" relative="1" as="geometry"> <mxPoint x="20" y="40" as="offset" /> </mxGeometry> </mxCell> <mxCell id="3kIInuhs_YmBb0iZ2eFI-17" value="&lt;b&gt;API&lt;/b&gt;" style="verticalAlign=top;align=center;shape=cube;size=10;direction=south;html=1;boundedLbl=1;spacingLeft=5;whiteSpace=wrap;rounded=1;" parent="3kIInuhs_YmBb0iZ2eFI-15" vertex="1"> <mxGeometry x="42.2239247311828" y="92.97297297297297" width="85.80645161290323" height="267.2972972972973" as="geometry" /> </mxCell> <mxCell id="3kIInuhs_YmBb0iZ2eFI-18" value="&lt;b&gt;Ledger storage&lt;/b&gt;" style="shape=cylinder3;whiteSpace=wrap;html=1;boundedLbl=1;backgroundOutline=1;size=15;rounded=1;" parent="3kIInuhs_YmBb0iZ2eFI-15" vertex="1"> <mxGeometry x="253.33129032258068" y="296.9044851994852" width="73.5483870967742" height="92.97297297297297" as="geometry" /> </mxCell> <mxCell id="3kIInuhs_YmBb0iZ2eFI-65" value="&lt;b&gt;Indexer&lt;/b&gt;&lt;div&gt;&lt;b&gt;(read/sync db)&lt;/b&gt;&lt;/div&gt;" style="shape=cylinder3;whiteSpace=wrap;html=1;boundedLbl=1;backgroundOutline=1;size=15;rounded=1;" parent="3kIInuhs_YmBb0iZ2eFI-15" vertex="1"> <mxGeometry x="153.22580645161293" y="296.9044851994852" width="73.5483870967742" height="92.97297297297297" as="geometry" /> </mxCell> <mxCell id="3kIInuhs_YmBb0iZ2eFI-19" value="&lt;b&gt;Consensus engine&lt;/b&gt;" style="verticalAlign=top;align=center;shape=cube;size=10;direction=south;html=1;boundedLbl=1;spacingLeft=5;whiteSpace=wrap;rounded=1;" parent="3kIInuhs_YmBb0iZ2eFI-15" vertex="1"> <mxGeometry x="142.5" y="81.91" width="97.5" height="78.09" as="geometry" /> </mxCell> <mxCell id="3kIInuhs_YmBb0iZ2eFI-20" value="&lt;b&gt;Network&lt;/b&gt;" style="verticalAlign=top;align=center;shape=cube;size=10;direction=south;html=1;boundedLbl=1;spacingLeft=5;whiteSpace=wrap;rounded=1;" parent="3kIInuhs_YmBb0iZ2eFI-15" vertex="1"> <mxGeometry x="141.25" y="185.91" width="97.5" height="81.43" as="geometry" /> </mxCell> <mxCell id="C7P2nbfdh_euxFz_vEXo-1" value="&lt;b&gt;Core&lt;/b&gt;" style="verticalAlign=top;align=center;shape=cube;size=10;direction=south;html=1;boundedLbl=1;spacingLeft=5;whiteSpace=wrap;rounded=1;" parent="3kIInuhs_YmBb0iZ2eFI-15" vertex="1"> <mxGeometry x="251.77" y="150" width="75.11" height="60" as="geometry" /> </mxCell> <mxCell id="3kIInuhs_YmBb0iZ2eFI-34" value="" style="group;rounded=1;" parent="1" vertex="1" connectable="0"> <mxGeometry x="-150" y="500" width="120" height="74.55" as="geometry" /> </mxCell> <mxCell id="3kIInuhs_YmBb0iZ2eFI-31" value="&lt;b&gt;iota-json-rpc&lt;/b&gt;" style="verticalAlign=top;align=center;shape=cube;size=10;direction=south;html=1;boundedLbl=1;spacingLeft=5;whiteSpace=wrap;movable=1;resizable=1;rotatable=1;deletable=1;editable=1;locked=0;connectable=1;rounded=1;" parent="3kIInuhs_YmBb0iZ2eFI-34" vertex="1"> <mxGeometry width="120" height="50" as="geometry" /> </mxCell> <mxCell id="3kIInuhs_YmBb0iZ2eFI-32" value="&lt;div&gt;iota-json-rpc crate&lt;br&gt;&lt;/div&gt;" style="rounded=1;whiteSpace=wrap;html=1;movable=1;resizable=1;rotatable=1;deletable=1;editable=1;locked=0;connectable=1;" parent="3kIInuhs_YmBb0iZ2eFI-34" vertex="1"> <mxGeometry x="20" y="50.00454545454545" width="80" height="24.545454545454547" as="geometry" /> </mxCell> <mxCell id="3kIInuhs_YmBb0iZ2eFI-36" value="" style="group;rounded=1;" parent="1" vertex="1" connectable="0"> <mxGeometry x="-150" y="670" width="100" height="70" as="geometry" /> </mxCell> <mxCell id="3kIInuhs_YmBb0iZ2eFI-28" value="&lt;b&gt;iota-cli&lt;/b&gt;" style="verticalAlign=top;align=center;shape=cube;size=10;direction=south;html=1;boundedLbl=1;spacingLeft=5;whiteSpace=wrap;rounded=1;" parent="3kIInuhs_YmBb0iZ2eFI-36" vertex="1"> <mxGeometry width="100" height="40" as="geometry" /> </mxCell> <mxCell id="3kIInuhs_YmBb0iZ2eFI-35" value="iota-cli crate" style="rounded=1;whiteSpace=wrap;html=1;" parent="3kIInuhs_YmBb0iZ2eFI-36" vertex="1"> <mxGeometry y="40" width="90" height="30" as="geometry" /> </mxCell> <mxCell id="3kIInuhs_YmBb0iZ2eFI-49" style="edgeStyle=orthogonalEdgeStyle;rounded=1;orthogonalLoop=1;jettySize=auto;html=1;exitX=0;exitY=0;exitDx=0;exitDy=45;exitPerimeter=0;entryX=0.5;entryY=1;entryDx=0;entryDy=0;curved=0;strokeWidth=1;shadow=1;" parent="1" source="3kIInuhs_YmBb0iZ2eFI-28" target="3kIInuhs_YmBb0iZ2eFI-32" edge="1"> <mxGeometry relative="1" as="geometry" /> </mxCell> <mxCell id="3kIInuhs_YmBb0iZ2eFI-50" style="edgeStyle=orthogonalEdgeStyle;rounded=1;orthogonalLoop=1;jettySize=auto;html=1;exitX=0;exitY=0;exitDx=0;exitDy=55;exitPerimeter=0;entryX=0.5;entryY=1;entryDx=0;entryDy=0;entryPerimeter=0;strokeWidth=1;shadow=1;" parent="1" source="3kIInuhs_YmBb0iZ2eFI-31" target="3kIInuhs_YmBb0iZ2eFI-65" edge="1"> <mxGeometry relative="1" as="geometry" /> </mxCell> <mxCell id="C7P2nbfdh_euxFz_vEXo-6" style="edgeStyle=orthogonalEdgeStyle;rounded=1;hachureGap=4;orthogonalLoop=1;jettySize=auto;html=1;entryX=1;entryY=0.5;entryDx=0;entryDy=0;entryPerimeter=0;fontFamily=Architects Daughter;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DArchitects%2BDaughter;strokeWidth=1;shadow=1;" parent="1" source="3kIInuhs_YmBb0iZ2eFI-7" target="3kIInuhs_YmBb0iZ2eFI-18" edge="1"> <mxGeometry relative="1" as="geometry" /> </mxCell> <mxCell id="C7P2nbfdh_euxFz_vEXo-11" style="edgeStyle=orthogonalEdgeStyle;rounded=1;hachureGap=4;orthogonalLoop=1;jettySize=auto;html=1;exitX=0;exitY=0;exitDx=32.385;exitDy=0;exitPerimeter=0;entryX=0.407;entryY=1;entryDx=0;entryDy=0;entryPerimeter=0;fontFamily=Architects Daughter;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DArchitects%2BDaughter;strokeWidth=1;shadow=1;" parent="1" source="C7P2nbfdh_euxFz_vEXo-1" target="3kIInuhs_YmBb0iZ2eFI-7" edge="1"> <mxGeometry relative="1" as="geometry" /> </mxCell> </root> </mxGraphModel> </diagram> </mxfile> "><defs/><g><g data-cell-id="0"><g data-cell-id="1"><g data-cell-id="3kIInuhs_YmBb0iZ2eFI-7"><g style="filter: drop-shadow(rgba(0, 0, 0, 0.25) 2px 3px 2px);"><path d="M 710 31 L 1140 31 L 1150 41 L 1150 481 L 720 481 L 710 471 L 710 31 Z" fill="rgb(24, 20, 29)" stroke="rgb(240, 240, 240)" stroke-miterlimit="10" transform="rotate(180,930,256)" pointer-events="all"/><path d="M 720 481 L 720 41 L 710 31 M 720 41 L 1150 41" fill="none" stroke="rgb(240, 240, 240)" stroke-miterlimit="10" transform="rotate(180,930,256)" pointer-events="all"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe flex-start; justify-content: unsafe flex-start; width: 423px; height: 1px; padding-top: 38px; margin-left: 717px;"><div data-drawio-colors="color: rgb(240, 240, 240); " style="box-sizing: border-box; font-size: 0px; text-align: left;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(240, 240, 240); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><b>Execution layer</b></div></div></div></foreignObject><text x="717" y="50" fill="rgb(240, 240, 240)" font-family=""Helvetica"" font-size="12px">Execution layer</text></switch></g></g><g data-cell-id="3kIInuhs_YmBb0iZ2eFI-63"><g><rect x="720" y="70.55" width="393.89" height="227.42" rx="34.11" ry="34.11" fill="rgb(24, 20, 29)" stroke="rgb(240, 240, 240)" pointer-events="all"/></g></g><g data-cell-id="3kIInuhs_YmBb0iZ2eFI-8"><g><path d="M 730 96 L 910 96 L 920 106 L 920 266 L 740 266 L 730 256 L 730 96 Z" fill="rgb(24, 20, 29)" stroke="rgb(240, 240, 240)" stroke-miterlimit="10" transform="rotate(90,825,181)" pointer-events="all"/><path d="M 740 266 L 740 106 L 730 96 M 740 106 L 920 106" fill="none" stroke="rgb(240, 240, 240)" stroke-miterlimit="10" transform="rotate(90,825,181)" pointer-events="all"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe flex-start; justify-content: unsafe center; width: 153px; height: 1px; padding-top: 103px; margin-left: 746px;"><div data-drawio-colors="color: rgb(240, 240, 240); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(240, 240, 240); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><b>Adapter</b></div></div></div></foreignObject><text x="823" y="115" fill="rgb(240, 240, 240)" font-family=""Helvetica"" font-size="12px" text-anchor="middle">Adapter</text></switch></g></g></g><g data-cell-id="3kIInuhs_YmBb0iZ2eFI-43"><g/><g data-cell-id="3kIInuhs_YmBb0iZ2eFI-9"><g><path d="M 760.45 323.46 L 829.55 323.46 L 839.55 333.46 L 839.55 425.73 L 770.45 425.73 L 760.45 415.73 L 760.45 323.46 Z" fill="rgb(24, 20, 29)" stroke="rgb(240, 240, 240)" stroke-miterlimit="10" transform="rotate(90,800,374.6)" pointer-events="all"/><path d="M 770.45 425.73 L 770.45 333.46 L 760.45 323.46 M 770.45 333.46 L 839.55 333.46" fill="none" stroke="rgb(240, 240, 240)" stroke-miterlimit="10" transform="rotate(90,800,374.6)" pointer-events="all"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe flex-start; justify-content: unsafe center; width: 85px; height: 1px; padding-top: 352px; margin-left: 755px;"><div data-drawio-colors="color: rgb(240, 240, 240); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(240, 240, 240); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><b>MoveVM</b></div></div></div></foreignObject><text x="798" y="364" fill="rgb(240, 240, 240)" font-family=""Helvetica"" font-size="12px" text-anchor="middle">MoveVM</text></switch></g></g></g><g data-cell-id="3kIInuhs_YmBb0iZ2eFI-41"><g><rect x="748.86" y="414.15" width="92.05" height="39.55" rx="5.93" ry="5.93" fill="rgb(24, 20, 29)" stroke="rgb(240, 240, 240)" pointer-events="all"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 90px; height: 1px; padding-top: 434px; margin-left: 750px;"><div data-drawio-colors="color: rgb(240, 240, 240); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(240, 240, 240); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">move-execution/move-vm-runtime</div></div></div></foreignObject><text x="795" y="438" fill="rgb(240, 240, 240)" font-family=""Helvetica"" font-size="12px" text-anchor="middle">move-execution/...</text></switch></g></g></g></g><g data-cell-id="3kIInuhs_YmBb0iZ2eFI-44"><g/><g data-cell-id="3kIInuhs_YmBb0iZ2eFI-13"><g><path d="M 1018.18 325.93 L 1087.28 325.93 L 1097.28 335.93 L 1097.28 428.2 L 1028.18 428.2 L 1018.18 418.2 L 1018.18 325.93 Z" fill="rgb(24, 20, 29)" stroke="rgb(240, 240, 240)" stroke-miterlimit="10" transform="rotate(90,1057.73,377.07)" pointer-events="all"/><path d="M 1028.18 428.2 L 1028.18 335.93 L 1018.18 325.93 M 1028.18 335.93 L 1097.28 335.93" fill="none" stroke="rgb(240, 240, 240)" stroke-miterlimit="10" transform="rotate(90,1057.73,377.07)" pointer-events="all"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe flex-start; justify-content: unsafe center; width: 85px; height: 1px; padding-top: 355px; margin-left: 1013px;"><div data-drawio-colors="color: rgb(240, 240, 240); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(240, 240, 240); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><b>Framework</b></div></div></div></foreignObject><text x="1055" y="367" fill="rgb(240, 240, 240)" font-family=""Helvetica"" font-size="12px" text-anchor="middle">Framework</text></switch></g></g></g><g data-cell-id="3kIInuhs_YmBb0iZ2eFI-42"><g><rect x="1006.59" y="416.62" width="92.05" height="39.55" rx="5.93" ry="5.93" fill="rgb(24, 20, 29)" stroke="rgb(240, 240, 240)" pointer-events="all"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 90px; height: 1px; padding-top: 436px; margin-left: 1008px;"><div data-drawio-colors="color: rgb(240, 240, 240); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(240, 240, 240); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">iota-framework crate</div></div></div></foreignObject><text x="1053" y="440" fill="rgb(240, 240, 240)" font-family=""Helvetica"" font-size="12px" text-anchor="middle">iota-framework...</text></switch></g></g></g></g><g data-cell-id="3kIInuhs_YmBb0iZ2eFI-56"><g><path d="M 816.81 258.42 L 816.8 286.7 Q 816.8 296.7 811.45 296.7 L 808.78 296.7 Q 806.1 296.7 806.11 306.7 L 806.13 328.68" fill="none" stroke="rgb(240, 240, 240)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 806.14 333.93 L 802.63 326.93 L 806.13 328.68 L 809.63 326.92 Z" fill="rgb(240, 240, 240)" stroke="rgb(240, 240, 240)" stroke-miterlimit="10" pointer-events="all"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 297px; margin-left: 811px;"><div data-drawio-colors="color: rgb(240, 240, 240); background-color: rgb(24, 20, 29); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 11px; font-family: Helvetica; color: rgb(240, 240, 240); line-height: 1.2; pointer-events: all; background-color: rgb(24, 20, 29); white-space: nowrap;">Init</div></div></div></foreignObject><text x="811" y="300" fill="rgb(240, 240, 240)" font-family=""Helvetica"" font-size="11px" text-anchor="middle">Init</text></switch></g></g></g><g data-cell-id="3kIInuhs_YmBb0iZ2eFI-58"><g/><g data-cell-id="3kIInuhs_YmBb0iZ2eFI-40"><g/><g data-cell-id="3kIInuhs_YmBb0iZ2eFI-10"><g><path d="M 774.14 102.02 L 856.77 102.02 L 866.77 112.02 L 866.77 230.59 L 784.14 230.59 L 774.14 220.59 L 774.14 102.02 Z" fill="rgb(24, 20, 29)" stroke="rgb(240, 240, 240)" stroke-miterlimit="10" transform="rotate(90,820.45,166.3)" pointer-events="all"/><path d="M 784.14 230.59 L 784.14 112.02 L 774.14 102.02 M 784.14 112.02 L 866.77 112.02" fill="none" stroke="rgb(240, 240, 240)" stroke-miterlimit="10" transform="rotate(90,820.45,166.3)" pointer-events="all"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe flex-start; justify-content: unsafe center; width: 112px; height: 1px; padding-top: 137px; margin-left: 762px;"><div data-drawio-colors="color: rgb(240, 240, 240); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(240, 240, 240); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><b>Execution-engine</b></div></div></div></foreignObject><text x="818" y="149" fill="rgb(240, 240, 240)" font-family=""Helvetica"" font-size="12px" text-anchor="middle">Execution-engine</text></switch></g></g></g></g><g data-cell-id="3kIInuhs_YmBb0iZ2eFI-39"><g><rect x="762.02" y="212.62" width="109.58" height="45.8" rx="6.87" ry="6.87" fill="rgb(24, 20, 29)" stroke="rgb(240, 240, 240)" pointer-events="all"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 108px; height: 1px; padding-top: 236px; margin-left: 763px;"><div data-drawio-colors="color: rgb(240, 240, 240); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(240, 240, 240); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">...execution/<span style="font-family: "Helvetica Neue"; font-size: 13px;">iota</span>-adapter/execution-engine</div></div></div></foreignObject><text x="817" y="239" fill="rgb(240, 240, 240)" font-family=""Helvetica"" font-size="12px" text-anchor="middle">...execution/iota-...</text></switch></g></g></g></g><g data-cell-id="3kIInuhs_YmBb0iZ2eFI-61"><g><path d="M 1008.86 382.52 L 885 382.5 Q 875 382.5 875 372.5 L 874.98 282.37" fill="none" stroke="rgb(240, 240, 240)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 874.98 277.12 L 878.48 284.12 L 874.98 282.37 L 871.48 284.12 Z" fill="rgb(240, 240, 240)" stroke="rgb(240, 240, 240)" stroke-miterlimit="10" pointer-events="all"/></g><g data-cell-id="3kIInuhs_YmBb0iZ2eFI-62"><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 382px; margin-left: 910px;"><div data-drawio-colors="color: rgb(240, 240, 240); background-color: rgb(24, 20, 29); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 11px; font-family: "Architects Daughter"; color: rgb(240, 240, 240); line-height: 1.2; pointer-events: all; background-color: rgb(24, 20, 29); white-space: nowrap;"><h4><font face="Helvetica">native fns etc</font></h4></div></div></div></foreignObject><text x="910" y="385" fill="rgb(240, 240, 240)" font-family=""Architects Daughter"" font-size="11px" text-anchor="middle">native fns etc</text></switch></g></g></g></g><g data-cell-id="3kIInuhs_YmBb0iZ2eFI-45"><g/><g data-cell-id="3kIInuhs_YmBb0iZ2eFI-48"><g/><g data-cell-id="3kIInuhs_YmBb0iZ2eFI-46"><g><path d="M 997.72 118.29 L 1066.82 118.29 L 1076.82 128.29 L 1076.82 220.56 L 1007.72 220.56 L 997.72 210.56 L 997.72 118.29 Z" fill="rgb(24, 20, 29)" stroke="rgb(240, 240, 240)" stroke-miterlimit="10" transform="rotate(90,1037.27,169.43)" pointer-events="all"/><path d="M 1007.72 220.56 L 1007.72 128.29 L 997.72 118.29 M 1007.72 128.29 L 1076.82 128.29" fill="none" stroke="rgb(240, 240, 240)" stroke-miterlimit="10" transform="rotate(90,1037.27,169.43)" pointer-events="all"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe flex-start; justify-content: unsafe center; width: 85px; height: 1px; padding-top: 147px; margin-left: 992px;"><div data-drawio-colors="color: rgb(240, 240, 240); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(240, 240, 240); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><b>Object runtime</b></div></div></div></foreignObject><text x="1035" y="159" fill="rgb(240, 240, 240)" font-family=""Helvetica"" font-size="12px" text-anchor="middle">Object runtime</text></switch></g></g></g><g data-cell-id="3kIInuhs_YmBb0iZ2eFI-47"><g><rect x="986.14" y="208.98" width="92.05" height="39.55" rx="5.93" ry="5.93" fill="rgb(24, 20, 29)" stroke="rgb(240, 240, 240)" pointer-events="all"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 90px; height: 1px; padding-top: 229px; margin-left: 987px;"><div data-drawio-colors="color: rgb(240, 240, 240); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(240, 240, 240); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">...execution/<span style="font-family: "Helvetica Neue"; font-size: 13px;">iota</span>-move-natives</div></div></div></foreignObject><text x="1032" y="232" fill="rgb(240, 240, 240)" font-family=""Helvetica"" font-size="12px" text-anchor="middle">...execution/io...</text></switch></g></g></g></g></g><g data-cell-id="3kIInuhs_YmBb0iZ2eFI-64"><g><rect x="978.54" y="80.44" width="117.47" height="29.66" rx="4.45" ry="4.45" fill="rgb(24, 20, 29)" stroke="none" pointer-events="all"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe flex-start; justify-content: unsafe flex-start; width: 115px; height: 1px; padding-top: 87px; margin-left: 981px;"><div data-drawio-colors="color: rgb(240, 240, 240); " style="box-sizing: border-box; font-size: 0px; text-align: left;"><div style="display: inline-block; font-size: 12px; font-family: "Architects Daughter"; color: rgb(240, 240, 240); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><span style="caret-color: rgb(0, 0, 0); font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; letter-spacing: normal; text-align: center; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration: none; float: none; display: inline !important;"><b style="">iota-execution crate</b></span></div></div></div></foreignObject><text x="981" y="99" fill="rgb(240, 240, 240)" font-family=""Architects Daughter"" font-size="12px">iota-execution crate</text></switch></g></g></g></g><g data-cell-id="3kIInuhs_YmBb0iZ2eFI-15"><g style="filter: drop-shadow(rgba(0, 0, 0, 0.25) 2px 3px 2px);"><path d="M -20 61 L 400 61 L 410 71 L 410 441 L -10 441 L -20 431 L -20 61 Z" fill="rgb(24, 20, 29)" stroke="rgb(240, 240, 240)" stroke-miterlimit="10" transform="rotate(90,195,251)" pointer-events="all"/><path d="M -10 441 L -10 71 L -20 61 M -10 71 L 410 71" fill="none" stroke="rgb(240, 240, 240)" stroke-miterlimit="10" transform="rotate(90,195,251)" pointer-events="all"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe flex-start; justify-content: unsafe flex-start; width: 363px; height: 1px; padding-top: 53px; margin-left: 12px;"><div data-drawio-colors="color: rgb(240, 240, 240); " style="box-sizing: border-box; font-size: 0px; text-align: left;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(240, 240, 240); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><b>Nodes network(Iota node)</b></div></div></div></foreignObject><text x="12" y="65" fill="rgb(240, 240, 240)" font-family=""Helvetica"" font-size="12px">Nodes network(Iota node)</text></switch></g></g><g data-cell-id="3kIInuhs_YmBb0iZ2eFI-16"><g><path d="M 5 96 L 365 96 L 375 106 L 375 426 L 15 426 L 5 416 L 5 96 Z" fill="rgb(24, 20, 29)" stroke="rgb(240, 240, 240)" stroke-miterlimit="10" transform="rotate(90,190,261)" pointer-events="all"/><path d="M 15 426 L 15 106 L 5 96 M 15 106 L 375 106" fill="none" stroke="rgb(240, 240, 240)" stroke-miterlimit="10" transform="rotate(90,190,261)" pointer-events="all"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe flex-start; justify-content: unsafe center; width: 313px; height: 1px; padding-top: 93px; margin-left: 31px;"><div data-drawio-colors="color: rgb(240, 240, 240); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(240, 240, 240); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><b>Node</b></div></div></div></foreignObject><text x="188" y="105" fill="rgb(240, 240, 240)" font-family=""Helvetica"" font-size="12px" text-anchor="middle">Node</text></switch></g></g></g><g data-cell-id="3kIInuhs_YmBb0iZ2eFI-17"><g><path d="M -43.52 219.72 L 213.78 219.72 L 223.78 229.72 L 223.78 305.52 L -33.52 305.52 L -43.52 295.52 L -43.52 219.72 Z" fill="rgb(24, 20, 29)" stroke="rgb(240, 240, 240)" stroke-miterlimit="10" transform="rotate(90,90.13,262.62)" pointer-events="all"/><path d="M -33.52 305.52 L -33.52 229.72 L -43.52 219.72 M -33.52 229.72 L 223.78 229.72" fill="none" stroke="rgb(240, 240, 240)" stroke-miterlimit="10" transform="rotate(90,90.13,262.62)" pointer-events="all"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe flex-start; justify-content: unsafe center; width: 69px; height: 1px; padding-top: 146px; margin-left: 53px;"><div data-drawio-colors="color: rgb(240, 240, 240); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(240, 240, 240); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><b>API</b></div></div></div></foreignObject><text x="88" y="158" fill="rgb(240, 240, 240)" font-family=""Helvetica"" font-size="12px" text-anchor="middle">API</text></switch></g></g></g><g data-cell-id="3kIInuhs_YmBb0iZ2eFI-18"><g><path d="M 258.33 347.9 C 258.33 339.62 274.8 332.9 295.11 332.9 C 304.86 332.9 314.21 334.48 321.11 337.3 C 328.01 340.11 331.88 343.93 331.88 347.9 L 331.88 410.88 C 331.88 419.16 315.42 425.88 295.11 425.88 C 274.8 425.88 258.33 419.16 258.33 410.88 Z" fill="rgb(24, 20, 29)" stroke="rgb(240, 240, 240)" stroke-miterlimit="10" pointer-events="all"/><path d="M 331.88 347.9 C 331.88 356.19 315.42 362.9 295.11 362.9 C 274.8 362.9 258.33 356.19 258.33 347.9" fill="none" stroke="rgb(240, 240, 240)" stroke-miterlimit="10" pointer-events="all"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 72px; height: 1px; padding-top: 392px; margin-left: 259px;"><div data-drawio-colors="color: rgb(240, 240, 240); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(240, 240, 240); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><b>Ledger storage</b></div></div></div></foreignObject><text x="295" y="395" fill="rgb(240, 240, 240)" font-family=""Helvetica"" font-size="12px" text-anchor="middle">Ledger stora...</text></switch></g></g></g><g data-cell-id="3kIInuhs_YmBb0iZ2eFI-65"><g><path d="M 158.23 347.9 C 158.23 339.62 174.69 332.9 195 332.9 C 204.75 332.9 214.11 334.48 221 337.3 C 227.9 340.11 231.77 343.93 231.77 347.9 L 231.77 410.88 C 231.77 419.16 215.31 425.88 195 425.88 C 174.69 425.88 158.23 419.16 158.23 410.88 Z" fill="rgb(24, 20, 29)" stroke="rgb(240, 240, 240)" stroke-miterlimit="10" pointer-events="all"/><path d="M 231.77 347.9 C 231.77 356.19 215.31 362.9 195 362.9 C 174.69 362.9 158.23 356.19 158.23 347.9" fill="none" stroke="rgb(240, 240, 240)" stroke-miterlimit="10" pointer-events="all"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 72px; height: 1px; padding-top: 392px; margin-left: 159px;"><div data-drawio-colors="color: rgb(240, 240, 240); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(240, 240, 240); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><b>Indexer</b><div><b>(read/sync db)</b></div></div></div></div></foreignObject><text x="195" y="395" fill="rgb(240, 240, 240)" font-family=""Helvetica"" font-size="12px" text-anchor="middle">Indexer...</text></switch></g></g></g><g data-cell-id="3kIInuhs_YmBb0iZ2eFI-19"><g><path d="M 157.2 108.2 L 225.29 108.2 L 235.29 118.2 L 235.29 205.7 L 167.2 205.7 L 157.2 195.7 L 157.2 108.2 Z" fill="rgb(24, 20, 29)" stroke="rgb(240, 240, 240)" stroke-miterlimit="10" transform="rotate(90,196.25,156.95)" pointer-events="all"/><path d="M 167.2 205.7 L 167.2 118.2 L 157.2 108.2 M 167.2 118.2 L 235.29 118.2" fill="none" stroke="rgb(240, 240, 240)" stroke-miterlimit="10" transform="rotate(90,196.25,156.95)" pointer-events="all"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe flex-start; justify-content: unsafe center; width: 81px; height: 1px; padding-top: 135px; margin-left: 154px;"><div data-drawio-colors="color: rgb(240, 240, 240); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(240, 240, 240); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><b>Consensus engine</b></div></div></div></foreignObject><text x="194" y="147" fill="rgb(240, 240, 240)" font-family=""Helvetica"" font-size="12px" text-anchor="middle">Consensus engi...</text></switch></g></g></g><g data-cell-id="3kIInuhs_YmBb0iZ2eFI-20"><g><path d="M 154.28 213.88 L 225.72 213.88 L 235.72 223.88 L 235.72 311.38 L 164.28 311.38 L 154.28 301.38 L 154.28 213.88 Z" fill="rgb(24, 20, 29)" stroke="rgb(240, 240, 240)" stroke-miterlimit="10" transform="rotate(90,195,262.63)" pointer-events="all"/><path d="M 164.28 311.38 L 164.28 223.88 L 154.28 213.88 M 164.28 223.88 L 235.72 223.88" fill="none" stroke="rgb(240, 240, 240)" stroke-miterlimit="10" transform="rotate(90,195,262.63)" pointer-events="all"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe flex-start; justify-content: unsafe center; width: 81px; height: 1px; padding-top: 239px; margin-left: 152px;"><div data-drawio-colors="color: rgb(240, 240, 240); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(240, 240, 240); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><b>Network</b></div></div></div></foreignObject><text x="193" y="251" fill="rgb(240, 240, 240)" font-family=""Helvetica"" font-size="12px" text-anchor="middle">Network</text></switch></g></g></g><g data-cell-id="C7P2nbfdh_euxFz_vEXo-1"><g><path d="M 264.32 178.44 L 314.32 178.44 L 324.32 188.44 L 324.32 253.56 L 274.32 253.56 L 264.32 243.56 L 264.32 178.44 Z" fill="rgb(24, 20, 29)" stroke="rgb(240, 240, 240)" stroke-miterlimit="10" transform="rotate(90,294.33,216)" pointer-events="all"/><path d="M 274.32 253.56 L 274.32 188.44 L 264.32 178.44 M 274.32 188.44 L 324.32 188.44" fill="none" stroke="rgb(240, 240, 240)" stroke-miterlimit="10" transform="rotate(90,294.33,216)" pointer-events="all"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe flex-start; justify-content: unsafe center; width: 58px; height: 1px; padding-top: 203px; margin-left: 263px;"><div data-drawio-colors="color: rgb(240, 240, 240); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(240, 240, 240); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><b>Core</b></div></div></div></foreignObject><text x="292" y="215" fill="rgb(240, 240, 240)" font-family=""Helvetica"" font-size="12px" text-anchor="middle">Core</text></switch></g></g></g></g><g data-cell-id="3kIInuhs_YmBb0iZ2eFI-34"><g/><g data-cell-id="3kIInuhs_YmBb0iZ2eFI-31"><g><path d="M 100 471 L 140 471 L 150 481 L 150 591 L 110 591 L 100 581 L 100 471 Z" fill="rgb(24, 20, 29)" stroke="rgb(240, 240, 240)" stroke-miterlimit="10" transform="rotate(90,125,531)" pointer-events="all"/><path d="M 110 591 L 110 481 L 100 471 M 110 481 L 150 481" fill="none" stroke="rgb(240, 240, 240)" stroke-miterlimit="10" transform="rotate(90,125,531)" pointer-events="all"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe flex-start; justify-content: unsafe center; width: 103px; height: 1px; padding-top: 523px; margin-left: 71px;"><div data-drawio-colors="color: rgb(240, 240, 240); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(240, 240, 240); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><b>iota-json-rpc</b></div></div></div></foreignObject><text x="123" y="535" fill="rgb(240, 240, 240)" font-family=""Helvetica"" font-size="12px" text-anchor="middle">iota-json-rpc</text></switch></g></g></g><g data-cell-id="3kIInuhs_YmBb0iZ2eFI-32"><g><rect x="85" y="556" width="80" height="24.55" rx="3.68" ry="3.68" fill="rgb(24, 20, 29)" stroke="rgb(240, 240, 240)" pointer-events="all"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 78px; height: 1px; padding-top: 568px; margin-left: 86px;"><div data-drawio-colors="color: rgb(240, 240, 240); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(240, 240, 240); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><div>iota-json-rpc crate<br /></div></div></div></div></foreignObject><text x="125" y="572" fill="rgb(240, 240, 240)" font-family=""Helvetica"" font-size="12px" text-anchor="middle">iota-json-rpc...</text></switch></g></g></g></g><g data-cell-id="3kIInuhs_YmBb0iZ2eFI-36"><g/><g data-cell-id="3kIInuhs_YmBb0iZ2eFI-28"><g><path d="M 95 646 L 125 646 L 135 656 L 135 746 L 105 746 L 95 736 L 95 646 Z" fill="rgb(24, 20, 29)" stroke="rgb(240, 240, 240)" stroke-miterlimit="10" transform="rotate(90,115,696)" pointer-events="all"/><path d="M 105 746 L 105 656 L 95 646 M 105 656 L 135 656" fill="none" stroke="rgb(240, 240, 240)" stroke-miterlimit="10" transform="rotate(90,115,696)" pointer-events="all"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe flex-start; justify-content: unsafe center; width: 83px; height: 1px; padding-top: 693px; margin-left: 71px;"><div data-drawio-colors="color: rgb(240, 240, 240); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(240, 240, 240); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><b>iota-cli</b></div></div></div></foreignObject><text x="113" y="705" fill="rgb(240, 240, 240)" font-family=""Helvetica"" font-size="12px" text-anchor="middle">iota-cli</text></switch></g></g></g><g data-cell-id="3kIInuhs_YmBb0iZ2eFI-35"><g><rect x="65" y="716" width="90" height="30" rx="4.5" ry="4.5" fill="rgb(24, 20, 29)" stroke="rgb(240, 240, 240)" pointer-events="all"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 88px; height: 1px; padding-top: 731px; margin-left: 66px;"><div data-drawio-colors="color: rgb(240, 240, 240); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(240, 240, 240); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">iota-cli crate</div></div></div></foreignObject><text x="110" y="735" fill="rgb(240, 240, 240)" font-family=""Helvetica"" font-size="12px" text-anchor="middle">iota-cli crate</text></switch></g></g></g></g><g data-cell-id="3kIInuhs_YmBb0iZ2eFI-49"><g style="filter: drop-shadow(rgba(0, 0, 0, 0.25) 2px 3px 2px);"><path d="M 120 676 L 120 638.3 Q 120 628.3 122.5 628.3 L 123.75 628.3 Q 125 628.3 125 618.3 L 125 586.92" fill="none" stroke="rgb(240, 240, 240)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 125 581.67 L 128.5 588.67 L 125 586.92 L 121.5 588.67 Z" fill="rgb(240, 240, 240)" stroke="rgb(240, 240, 240)" stroke-miterlimit="10" pointer-events="all"/></g></g><g data-cell-id="3kIInuhs_YmBb0iZ2eFI-50"><g style="filter: drop-shadow(rgba(0, 0, 0, 0.25) 2px 3px 2px);"><path d="M 130 506 L 130 476 Q 130 466 140 466 L 185 466 Q 195 466 195 456 L 195 432.25" fill="none" stroke="rgb(240, 240, 240)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 195 427 L 198.5 434 L 195 432.25 L 191.5 434 Z" fill="rgb(240, 240, 240)" stroke="rgb(240, 240, 240)" stroke-miterlimit="10" pointer-events="all"/></g></g><g data-cell-id="C7P2nbfdh_euxFz_vEXo-6"><g style="filter: drop-shadow(rgba(0, 0, 0, 0.25) 2px 3px 2px);"><path d="M 710 256 L 530.9 256 Q 520.9 256 520.9 266 L 520.9 369.4 Q 520.9 379.4 510.9 379.4 L 338.25 379.39" fill="none" stroke="rgb(240, 240, 240)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 333 379.39 L 340 375.89 L 338.25 379.39 L 340 382.89 Z" fill="rgb(240, 240, 240)" stroke="rgb(240, 240, 240)" stroke-miterlimit="10" pointer-events="all"/></g></g><g data-cell-id="C7P2nbfdh_euxFz_vEXo-11"><g style="filter: drop-shadow(rgba(0, 0, 0, 0.25) 2px 3px 2px);"><path d="M 331.88 218.38 L 511 218.4 Q 521 218.4 521 208.4 L 521 21 Q 521 11 531 11 L 960.9 11 Q 970.9 11 970.91 17.82 L 970.91 24.63" fill="none" stroke="rgb(240, 240, 240)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 970.92 29.88 L 967.41 22.89 L 970.91 24.63 L 974.41 22.88 Z" fill="rgb(240, 240, 240)" stroke="rgb(240, 240, 240)" stroke-miterlimit="10" pointer-events="all"/></g></g></g></g></g><switch><g requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"/><a transform="translate(0,-5)" xlink:href="https://www.drawio.com/doc/faq/svg-export-text-problems" target="_blank"><text text-anchor="middle" font-size="10px" x="50%" y="100%">Text is not SVG - cannot display</text></a></switch></svg> \ No newline at end of file +<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="1157px" height="747px" viewBox="-0.5 -0.5 1157 747" content="<mxfile host="Electron" agent="Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) draw.io/24.7.17 Chrome/128.0.6613.36 Electron/32.0.1 Safari/537.36" version="24.7.17"> <diagram name="Page-1" id="jhOoJUkd9Zucpb-pnEYY"> <mxGraphModel dx="1623" dy="1938" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="850" pageHeight="1100" background="none" math="0" shadow="0"> <root> <mxCell id="0" /> <mxCell id="1" parent="0" /> <mxCell id="3kIInuhs_YmBb0iZ2eFI-7" value="&lt;b&gt;Execution layer&lt;/b&gt;" style="verticalAlign=top;align=left;shape=cube;size=10;direction=west;fontStyle=0;html=1;boundedLbl=1;spacingLeft=5;whiteSpace=wrap;rounded=1;strokeWidth=1;shadow=1;" parent="1" vertex="1"> <mxGeometry x="495" y="25" width="440" height="450" as="geometry" /> </mxCell> <mxCell id="3kIInuhs_YmBb0iZ2eFI-63" value="" style="rounded=1;whiteSpace=wrap;html=1;hachureGap=4;fontFamily=Helvetica;strokeColor=default;fillColor=default;glass=0;" parent="3kIInuhs_YmBb0iZ2eFI-7" vertex="1"> <mxGeometry x="10.003376623376589" y="39.550041395623865" width="393.8931818181818" height="227.41573033707866" as="geometry" /> </mxCell> <mxCell id="3kIInuhs_YmBb0iZ2eFI-8" value="&lt;b&gt;Adapter&lt;/b&gt;" style="verticalAlign=top;align=center;shape=cube;size=10;direction=south;html=1;boundedLbl=1;spacingLeft=5;whiteSpace=wrap;rounded=1;" parent="3kIInuhs_YmBb0iZ2eFI-7" vertex="1"> <mxGeometry width="170" height="190" relative="1" as="geometry"> <mxPoint x="30" y="55" as="offset" /> </mxGeometry> </mxCell> <mxCell id="3kIInuhs_YmBb0iZ2eFI-43" value="" style="group;rounded=1;" parent="3kIInuhs_YmBb0iZ2eFI-7" vertex="1" connectable="0"> <mxGeometry x="38.86363636363636" y="304.0449438202247" width="102.27272727272727" height="118.65168539325842" as="geometry" /> </mxCell> <mxCell id="3kIInuhs_YmBb0iZ2eFI-9" value="&lt;b&gt;MoveVM&lt;/b&gt;" style="verticalAlign=top;align=center;shape=cube;size=10;direction=south;html=1;boundedLbl=1;spacingLeft=5;whiteSpace=wrap;rounded=1;" parent="3kIInuhs_YmBb0iZ2eFI-43" vertex="1"> <mxGeometry width="102.27272727272727" height="79.10112359550561" as="geometry" /> </mxCell> <mxCell id="3kIInuhs_YmBb0iZ2eFI-41" value="move-execution/move-vm-runtime" style="rounded=1;whiteSpace=wrap;html=1;" parent="3kIInuhs_YmBb0iZ2eFI-43" vertex="1"> <mxGeometry y="79.10112359550561" width="92.04545454545455" height="39.550561797752806" as="geometry" /> </mxCell> <mxCell id="3kIInuhs_YmBb0iZ2eFI-44" value="" style="group;rounded=1;" parent="3kIInuhs_YmBb0iZ2eFI-7" vertex="1" connectable="0"> <mxGeometry x="296.59090909090907" y="306.51685393258424" width="102.27272727272727" height="118.65168539325842" as="geometry" /> </mxCell> <mxCell id="3kIInuhs_YmBb0iZ2eFI-13" value="&lt;b&gt;Framework&lt;/b&gt;" style="verticalAlign=top;align=center;shape=cube;size=10;direction=south;html=1;boundedLbl=1;spacingLeft=5;whiteSpace=wrap;rounded=1;" parent="3kIInuhs_YmBb0iZ2eFI-44" vertex="1"> <mxGeometry width="102.27272727272727" height="79.10112359550561" as="geometry" /> </mxCell> <mxCell id="3kIInuhs_YmBb0iZ2eFI-42" value="iota-framework crate" style="rounded=1;whiteSpace=wrap;html=1;" parent="3kIInuhs_YmBb0iZ2eFI-44" vertex="1"> <mxGeometry y="79.10112359550561" width="92.04545454545455" height="39.550561797752806" as="geometry" /> </mxCell> <mxCell id="3kIInuhs_YmBb0iZ2eFI-56" value="Init" style="edgeStyle=orthogonalEdgeStyle;rounded=1;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0;entryY=0;entryDx=0;entryDy=45;entryPerimeter=0;curved=0;" parent="3kIInuhs_YmBb0iZ2eFI-7" source="3kIInuhs_YmBb0iZ2eFI-39" target="3kIInuhs_YmBb0iZ2eFI-9" edge="1"> <mxGeometry relative="1" as="geometry" /> </mxCell> <mxCell id="3kIInuhs_YmBb0iZ2eFI-58" value="" style="group;rounded=1;" parent="3kIInuhs_YmBb0iZ2eFI-7" vertex="1" connectable="0"> <mxGeometry x="46.16883116883113" y="88.98824364281488" width="378.4090909090909" height="168.0904080425784" as="geometry" /> </mxCell> <mxCell id="3kIInuhs_YmBb0iZ2eFI-40" value="" style="group;rounded=1;" parent="3kIInuhs_YmBb0iZ2eFI-58" vertex="1" connectable="0"> <mxGeometry width="128.57142857142858" height="138.42696629213484" as="geometry" /> </mxCell> <mxCell id="3kIInuhs_YmBb0iZ2eFI-10" value="&lt;b&gt;Execution-engine&lt;/b&gt;" style="verticalAlign=top;align=center;shape=cube;size=10;direction=south;html=1;boundedLbl=1;spacingLeft=5;whiteSpace=wrap;rounded=1;" parent="3kIInuhs_YmBb0iZ2eFI-40" vertex="1"> <mxGeometry width="128.57142857142856" height="92.63157894736842" as="geometry" /> </mxCell> <mxCell id="3kIInuhs_YmBb0iZ2eFI-39" value="...execution/&lt;span style=&quot;font-family: &amp;quot;Helvetica Neue&amp;quot;; font-size: 13px;&quot;&gt;iota&lt;/span&gt;-adapter/execution-engine" style="rounded=1;whiteSpace=wrap;html=1;" parent="3kIInuhs_YmBb0iZ2eFI-58" vertex="1"> <mxGeometry x="5.849999999999999" y="92.6274157303371" width="109.575" height="45.79955056179776" as="geometry" /> </mxCell> <mxCell id="3kIInuhs_YmBb0iZ2eFI-61" style="edgeStyle=orthogonalEdgeStyle;rounded=1;hachureGap=4;orthogonalLoop=1;jettySize=auto;html=1;exitX=0;exitY=0;exitDx=45;exitDy=100;exitPerimeter=0;entryX=1;entryY=0.206;entryDx=0;entryDy=0;entryPerimeter=0;fontFamily=Architects Daughter;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DArchitects%2BDaughter;curved=0;" parent="3kIInuhs_YmBb0iZ2eFI-7" source="3kIInuhs_YmBb0iZ2eFI-13" target="3kIInuhs_YmBb0iZ2eFI-8" edge="1"> <mxGeometry relative="1" as="geometry" /> </mxCell> <mxCell id="3kIInuhs_YmBb0iZ2eFI-62" value="&lt;h4&gt;&lt;font face=&quot;Helvetica&quot;&gt;native fns etc&lt;/font&gt;&lt;/h4&gt;" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];sketch=1;hachureGap=4;jiggle=2;curveFitting=1;fontFamily=Architects Daughter;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DArchitects%2BDaughter;rounded=1;" parent="3kIInuhs_YmBb0iZ2eFI-61" vertex="1" connectable="0"> <mxGeometry x="-0.1741" y="-1" relative="1" as="geometry"> <mxPoint as="offset" /> </mxGeometry> </mxCell> <mxCell id="3kIInuhs_YmBb0iZ2eFI-45" value="" style="group;rounded=1;" parent="3kIInuhs_YmBb0iZ2eFI-7" vertex="1" connectable="0"> <mxGeometry x="276.1363636363636" y="98.87640449438204" width="102.27272727272727" height="118.65168539325842" as="geometry" /> </mxCell> <mxCell id="3kIInuhs_YmBb0iZ2eFI-48" value="" style="group;rounded=1;" parent="3kIInuhs_YmBb0iZ2eFI-45" vertex="1" connectable="0"> <mxGeometry width="102.27272727272727" height="118.65168539325842" as="geometry" /> </mxCell> <mxCell id="3kIInuhs_YmBb0iZ2eFI-46" value="&lt;b&gt;Object runtime&lt;/b&gt;" style="verticalAlign=top;align=center;shape=cube;size=10;direction=south;html=1;boundedLbl=1;spacingLeft=5;whiteSpace=wrap;rounded=1;" parent="3kIInuhs_YmBb0iZ2eFI-48" vertex="1"> <mxGeometry width="102.27272727272727" height="79.10112359550561" as="geometry" /> </mxCell> <mxCell id="3kIInuhs_YmBb0iZ2eFI-47" value="...execution/&lt;span style=&quot;font-family: &amp;quot;Helvetica Neue&amp;quot;; font-size: 13px;&quot;&gt;iota&lt;/span&gt;-move-natives" style="rounded=1;whiteSpace=wrap;html=1;" parent="3kIInuhs_YmBb0iZ2eFI-48" vertex="1"> <mxGeometry y="79.10112359550561" width="92.04545454545455" height="39.550561797752806" as="geometry" /> </mxCell> <mxCell id="3kIInuhs_YmBb0iZ2eFI-64" value="&lt;span style=&quot;caret-color: rgb(0, 0, 0); font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; letter-spacing: normal; text-align: center; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration: none; float: none; display: inline !important;&quot;&gt;&lt;b style=&quot;&quot;&gt;iota-execution crate&lt;/b&gt;&lt;/span&gt;" style="text;whiteSpace=wrap;html=1;fontFamily=Architects Daughter;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DArchitects%2BDaughter;rounded=1;fillColor=default;fontColor=default;" parent="3kIInuhs_YmBb0iZ2eFI-7" vertex="1"> <mxGeometry x="268.5363636363636" y="49.43820224719101" width="117.47045454545454" height="29.662921348314605" as="geometry" /> </mxCell> <mxCell id="3kIInuhs_YmBb0iZ2eFI-15" value="&lt;b&gt;Nodes network(Iota node)&lt;/b&gt;" style="verticalAlign=top;align=left;shape=cube;size=10;direction=south;fontStyle=0;html=1;boundedLbl=1;spacingLeft=5;whiteSpace=wrap;rounded=1;shadow=1;strokeWidth=1;" parent="1" vertex="1"> <mxGeometry x="-210" y="30" width="380" height="430" as="geometry" /> </mxCell> <mxCell id="3kIInuhs_YmBb0iZ2eFI-16" value="&lt;b&gt;Node&lt;/b&gt;" style="verticalAlign=top;align=center;shape=cube;size=10;direction=south;html=1;boundedLbl=1;spacingLeft=5;whiteSpace=wrap;rounded=1;" parent="3kIInuhs_YmBb0iZ2eFI-15" vertex="1"> <mxGeometry width="330" height="370" relative="1" as="geometry"> <mxPoint x="20" y="40" as="offset" /> </mxGeometry> </mxCell> <mxCell id="3kIInuhs_YmBb0iZ2eFI-17" value="&lt;b&gt;API&lt;/b&gt;" style="verticalAlign=top;align=center;shape=cube;size=10;direction=south;html=1;boundedLbl=1;spacingLeft=5;whiteSpace=wrap;rounded=1;" parent="3kIInuhs_YmBb0iZ2eFI-15" vertex="1"> <mxGeometry x="42.2239247311828" y="92.97297297297297" width="85.80645161290323" height="267.2972972972973" as="geometry" /> </mxCell> <mxCell id="3kIInuhs_YmBb0iZ2eFI-18" value="&lt;b&gt;Ledger storage&lt;/b&gt;" style="shape=cylinder3;whiteSpace=wrap;html=1;boundedLbl=1;backgroundOutline=1;size=15;rounded=1;" parent="3kIInuhs_YmBb0iZ2eFI-15" vertex="1"> <mxGeometry x="253.33129032258068" y="296.9044851994852" width="73.5483870967742" height="92.97297297297297" as="geometry" /> </mxCell> <mxCell id="3kIInuhs_YmBb0iZ2eFI-65" value="&lt;b&gt;Indexer&lt;/b&gt;&lt;div&gt;&lt;b&gt;(read/sync db)&lt;/b&gt;&lt;/div&gt;" style="shape=cylinder3;whiteSpace=wrap;html=1;boundedLbl=1;backgroundOutline=1;size=15;rounded=1;" parent="3kIInuhs_YmBb0iZ2eFI-15" vertex="1"> <mxGeometry x="153.22580645161293" y="296.9044851994852" width="73.5483870967742" height="92.97297297297297" as="geometry" /> </mxCell> <mxCell id="3kIInuhs_YmBb0iZ2eFI-19" value="&lt;b&gt;Consensus engine&lt;/b&gt;" style="verticalAlign=top;align=center;shape=cube;size=10;direction=south;html=1;boundedLbl=1;spacingLeft=5;whiteSpace=wrap;rounded=1;" parent="3kIInuhs_YmBb0iZ2eFI-15" vertex="1"> <mxGeometry x="142.5" y="81.91" width="97.5" height="78.09" as="geometry" /> </mxCell> <mxCell id="3kIInuhs_YmBb0iZ2eFI-20" value="&lt;b&gt;Network&lt;/b&gt;" style="verticalAlign=top;align=center;shape=cube;size=10;direction=south;html=1;boundedLbl=1;spacingLeft=5;whiteSpace=wrap;rounded=1;" parent="3kIInuhs_YmBb0iZ2eFI-15" vertex="1"> <mxGeometry x="141.25" y="185.91" width="97.5" height="81.43" as="geometry" /> </mxCell> <mxCell id="C7P2nbfdh_euxFz_vEXo-1" value="&lt;b&gt;Core&lt;/b&gt;" style="verticalAlign=top;align=center;shape=cube;size=10;direction=south;html=1;boundedLbl=1;spacingLeft=5;whiteSpace=wrap;rounded=1;" parent="3kIInuhs_YmBb0iZ2eFI-15" vertex="1"> <mxGeometry x="251.77" y="150" width="75.11" height="60" as="geometry" /> </mxCell> <mxCell id="3kIInuhs_YmBb0iZ2eFI-34" value="" style="group;rounded=1;" parent="1" vertex="1" connectable="0"> <mxGeometry x="-150" y="500" width="120" height="74.55" as="geometry" /> </mxCell> <mxCell id="3kIInuhs_YmBb0iZ2eFI-31" value="&lt;b&gt;iota-json-rpc&lt;/b&gt;" style="verticalAlign=top;align=center;shape=cube;size=10;direction=south;html=1;boundedLbl=1;spacingLeft=5;whiteSpace=wrap;movable=1;resizable=1;rotatable=1;deletable=1;editable=1;locked=0;connectable=1;rounded=1;" parent="3kIInuhs_YmBb0iZ2eFI-34" vertex="1"> <mxGeometry width="120" height="50" as="geometry" /> </mxCell> <mxCell id="3kIInuhs_YmBb0iZ2eFI-32" value="&lt;div&gt;iota-json-rpc crate&lt;br&gt;&lt;/div&gt;" style="rounded=1;whiteSpace=wrap;html=1;movable=1;resizable=1;rotatable=1;deletable=1;editable=1;locked=0;connectable=1;" parent="3kIInuhs_YmBb0iZ2eFI-34" vertex="1"> <mxGeometry x="20" y="50.00454545454545" width="80" height="24.545454545454547" as="geometry" /> </mxCell> <mxCell id="3kIInuhs_YmBb0iZ2eFI-36" value="" style="group;rounded=1;" parent="1" vertex="1" connectable="0"> <mxGeometry x="-150" y="670" width="100" height="70" as="geometry" /> </mxCell> <mxCell id="3kIInuhs_YmBb0iZ2eFI-28" value="&lt;b&gt;iota-cli&lt;/b&gt;" style="verticalAlign=top;align=center;shape=cube;size=10;direction=south;html=1;boundedLbl=1;spacingLeft=5;whiteSpace=wrap;rounded=1;" parent="3kIInuhs_YmBb0iZ2eFI-36" vertex="1"> <mxGeometry width="100" height="40" as="geometry" /> </mxCell> <mxCell id="3kIInuhs_YmBb0iZ2eFI-35" value="iota crate" style="rounded=1;whiteSpace=wrap;html=1;" parent="3kIInuhs_YmBb0iZ2eFI-36" vertex="1"> <mxGeometry y="40" width="90" height="30" as="geometry" /> </mxCell> <mxCell id="3kIInuhs_YmBb0iZ2eFI-49" style="edgeStyle=orthogonalEdgeStyle;rounded=1;orthogonalLoop=1;jettySize=auto;html=1;exitX=0;exitY=0;exitDx=0;exitDy=45;exitPerimeter=0;entryX=0.5;entryY=1;entryDx=0;entryDy=0;curved=0;strokeWidth=1;shadow=1;" parent="1" source="3kIInuhs_YmBb0iZ2eFI-28" target="3kIInuhs_YmBb0iZ2eFI-32" edge="1"> <mxGeometry relative="1" as="geometry" /> </mxCell> <mxCell id="3kIInuhs_YmBb0iZ2eFI-50" style="edgeStyle=orthogonalEdgeStyle;rounded=1;orthogonalLoop=1;jettySize=auto;html=1;exitX=0;exitY=0;exitDx=0;exitDy=55;exitPerimeter=0;entryX=0.5;entryY=1;entryDx=0;entryDy=0;entryPerimeter=0;strokeWidth=1;shadow=1;" parent="1" source="3kIInuhs_YmBb0iZ2eFI-31" target="3kIInuhs_YmBb0iZ2eFI-65" edge="1"> <mxGeometry relative="1" as="geometry" /> </mxCell> <mxCell id="C7P2nbfdh_euxFz_vEXo-6" style="edgeStyle=orthogonalEdgeStyle;rounded=1;hachureGap=4;orthogonalLoop=1;jettySize=auto;html=1;entryX=1;entryY=0.5;entryDx=0;entryDy=0;entryPerimeter=0;fontFamily=Architects Daughter;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DArchitects%2BDaughter;strokeWidth=1;shadow=1;" parent="1" source="3kIInuhs_YmBb0iZ2eFI-7" target="3kIInuhs_YmBb0iZ2eFI-18" edge="1"> <mxGeometry relative="1" as="geometry" /> </mxCell> <mxCell id="C7P2nbfdh_euxFz_vEXo-11" style="edgeStyle=orthogonalEdgeStyle;rounded=1;hachureGap=4;orthogonalLoop=1;jettySize=auto;html=1;exitX=0;exitY=0;exitDx=32.385;exitDy=0;exitPerimeter=0;entryX=0.407;entryY=1;entryDx=0;entryDy=0;entryPerimeter=0;fontFamily=Architects Daughter;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DArchitects%2BDaughter;strokeWidth=1;shadow=1;" parent="1" source="C7P2nbfdh_euxFz_vEXo-1" target="3kIInuhs_YmBb0iZ2eFI-7" edge="1"> <mxGeometry relative="1" as="geometry" /> </mxCell> </root> </mxGraphModel> </diagram> </mxfile> "><defs/><g><g data-cell-id="0"><g data-cell-id="1"><g data-cell-id="3kIInuhs_YmBb0iZ2eFI-7"><g style="filter: drop-shadow(rgba(0, 0, 0, 0.25) 2px 3px 2px);"><path d="M 710 31 L 1140 31 L 1150 41 L 1150 481 L 720 481 L 710 471 L 710 31 Z" fill="rgb(24, 20, 29)" stroke="rgb(240, 240, 240)" stroke-miterlimit="10" transform="rotate(180,930,256)" pointer-events="all"/><path d="M 720 481 L 720 41 L 710 31 M 720 41 L 1150 41" fill="none" stroke="rgb(240, 240, 240)" stroke-miterlimit="10" transform="rotate(180,930,256)" pointer-events="all"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe flex-start; justify-content: unsafe flex-start; width: 423px; height: 1px; padding-top: 38px; margin-left: 717px;"><div data-drawio-colors="color: rgb(240, 240, 240); " style="box-sizing: border-box; font-size: 0px; text-align: left;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(240, 240, 240); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><b>Execution layer</b></div></div></div></foreignObject><text x="717" y="50" fill="rgb(240, 240, 240)" font-family=""Helvetica"" font-size="12px">Execution layer</text></switch></g></g><g data-cell-id="3kIInuhs_YmBb0iZ2eFI-63"><g><rect x="720" y="70.55" width="393.89" height="227.42" rx="34.11" ry="34.11" fill="rgb(24, 20, 29)" stroke="rgb(240, 240, 240)" pointer-events="all"/></g></g><g data-cell-id="3kIInuhs_YmBb0iZ2eFI-8"><g><path d="M 730 96 L 910 96 L 920 106 L 920 266 L 740 266 L 730 256 L 730 96 Z" fill="rgb(24, 20, 29)" stroke="rgb(240, 240, 240)" stroke-miterlimit="10" transform="rotate(90,825,181)" pointer-events="all"/><path d="M 740 266 L 740 106 L 730 96 M 740 106 L 920 106" fill="none" stroke="rgb(240, 240, 240)" stroke-miterlimit="10" transform="rotate(90,825,181)" pointer-events="all"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe flex-start; justify-content: unsafe center; width: 153px; height: 1px; padding-top: 103px; margin-left: 746px;"><div data-drawio-colors="color: rgb(240, 240, 240); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(240, 240, 240); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><b>Adapter</b></div></div></div></foreignObject><text x="823" y="115" fill="rgb(240, 240, 240)" font-family=""Helvetica"" font-size="12px" text-anchor="middle">Adapter</text></switch></g></g></g><g data-cell-id="3kIInuhs_YmBb0iZ2eFI-43"><g/><g data-cell-id="3kIInuhs_YmBb0iZ2eFI-9"><g><path d="M 760.45 323.46 L 829.55 323.46 L 839.55 333.46 L 839.55 425.73 L 770.45 425.73 L 760.45 415.73 L 760.45 323.46 Z" fill="rgb(24, 20, 29)" stroke="rgb(240, 240, 240)" stroke-miterlimit="10" transform="rotate(90,800,374.6)" pointer-events="all"/><path d="M 770.45 425.73 L 770.45 333.46 L 760.45 323.46 M 770.45 333.46 L 839.55 333.46" fill="none" stroke="rgb(240, 240, 240)" stroke-miterlimit="10" transform="rotate(90,800,374.6)" pointer-events="all"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe flex-start; justify-content: unsafe center; width: 85px; height: 1px; padding-top: 352px; margin-left: 755px;"><div data-drawio-colors="color: rgb(240, 240, 240); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(240, 240, 240); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><b>MoveVM</b></div></div></div></foreignObject><text x="798" y="364" fill="rgb(240, 240, 240)" font-family=""Helvetica"" font-size="12px" text-anchor="middle">MoveVM</text></switch></g></g></g><g data-cell-id="3kIInuhs_YmBb0iZ2eFI-41"><g><rect x="748.86" y="414.15" width="92.05" height="39.55" rx="5.93" ry="5.93" fill="rgb(24, 20, 29)" stroke="rgb(240, 240, 240)" pointer-events="all"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 90px; height: 1px; padding-top: 434px; margin-left: 750px;"><div data-drawio-colors="color: rgb(240, 240, 240); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(240, 240, 240); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">move-execution/move-vm-runtime</div></div></div></foreignObject><text x="795" y="438" fill="rgb(240, 240, 240)" font-family=""Helvetica"" font-size="12px" text-anchor="middle">move-execution/...</text></switch></g></g></g></g><g data-cell-id="3kIInuhs_YmBb0iZ2eFI-44"><g/><g data-cell-id="3kIInuhs_YmBb0iZ2eFI-13"><g><path d="M 1018.18 325.93 L 1087.28 325.93 L 1097.28 335.93 L 1097.28 428.2 L 1028.18 428.2 L 1018.18 418.2 L 1018.18 325.93 Z" fill="rgb(24, 20, 29)" stroke="rgb(240, 240, 240)" stroke-miterlimit="10" transform="rotate(90,1057.73,377.07)" pointer-events="all"/><path d="M 1028.18 428.2 L 1028.18 335.93 L 1018.18 325.93 M 1028.18 335.93 L 1097.28 335.93" fill="none" stroke="rgb(240, 240, 240)" stroke-miterlimit="10" transform="rotate(90,1057.73,377.07)" pointer-events="all"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe flex-start; justify-content: unsafe center; width: 85px; height: 1px; padding-top: 355px; margin-left: 1013px;"><div data-drawio-colors="color: rgb(240, 240, 240); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(240, 240, 240); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><b>Framework</b></div></div></div></foreignObject><text x="1055" y="367" fill="rgb(240, 240, 240)" font-family=""Helvetica"" font-size="12px" text-anchor="middle">Framework</text></switch></g></g></g><g data-cell-id="3kIInuhs_YmBb0iZ2eFI-42"><g><rect x="1006.59" y="416.62" width="92.05" height="39.55" rx="5.93" ry="5.93" fill="rgb(24, 20, 29)" stroke="rgb(240, 240, 240)" pointer-events="all"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 90px; height: 1px; padding-top: 436px; margin-left: 1008px;"><div data-drawio-colors="color: rgb(240, 240, 240); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(240, 240, 240); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">iota-framework crate</div></div></div></foreignObject><text x="1053" y="440" fill="rgb(240, 240, 240)" font-family=""Helvetica"" font-size="12px" text-anchor="middle">iota-framework...</text></switch></g></g></g></g><g data-cell-id="3kIInuhs_YmBb0iZ2eFI-56"><g><path d="M 816.81 258.42 L 816.8 286.7 Q 816.8 296.7 811.45 296.7 L 808.78 296.7 Q 806.1 296.7 806.11 306.7 L 806.13 328.68" fill="none" stroke="rgb(240, 240, 240)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 806.14 333.93 L 802.63 326.93 L 806.13 328.68 L 809.63 326.92 Z" fill="rgb(240, 240, 240)" stroke="rgb(240, 240, 240)" stroke-miterlimit="10" pointer-events="all"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 297px; margin-left: 811px;"><div data-drawio-colors="color: rgb(240, 240, 240); background-color: rgb(24, 20, 29); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 11px; font-family: Helvetica; color: rgb(240, 240, 240); line-height: 1.2; pointer-events: all; background-color: rgb(24, 20, 29); white-space: nowrap;">Init</div></div></div></foreignObject><text x="811" y="300" fill="rgb(240, 240, 240)" font-family=""Helvetica"" font-size="11px" text-anchor="middle">Init</text></switch></g></g></g><g data-cell-id="3kIInuhs_YmBb0iZ2eFI-58"><g/><g data-cell-id="3kIInuhs_YmBb0iZ2eFI-40"><g/><g data-cell-id="3kIInuhs_YmBb0iZ2eFI-10"><g><path d="M 774.14 102.02 L 856.77 102.02 L 866.77 112.02 L 866.77 230.59 L 784.14 230.59 L 774.14 220.59 L 774.14 102.02 Z" fill="rgb(24, 20, 29)" stroke="rgb(240, 240, 240)" stroke-miterlimit="10" transform="rotate(90,820.45,166.3)" pointer-events="all"/><path d="M 784.14 230.59 L 784.14 112.02 L 774.14 102.02 M 784.14 112.02 L 866.77 112.02" fill="none" stroke="rgb(240, 240, 240)" stroke-miterlimit="10" transform="rotate(90,820.45,166.3)" pointer-events="all"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe flex-start; justify-content: unsafe center; width: 112px; height: 1px; padding-top: 137px; margin-left: 762px;"><div data-drawio-colors="color: rgb(240, 240, 240); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(240, 240, 240); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><b>Execution-engine</b></div></div></div></foreignObject><text x="818" y="149" fill="rgb(240, 240, 240)" font-family=""Helvetica"" font-size="12px" text-anchor="middle">Execution-engine</text></switch></g></g></g></g><g data-cell-id="3kIInuhs_YmBb0iZ2eFI-39"><g><rect x="762.02" y="212.62" width="109.58" height="45.8" rx="6.87" ry="6.87" fill="rgb(24, 20, 29)" stroke="rgb(240, 240, 240)" pointer-events="all"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 108px; height: 1px; padding-top: 236px; margin-left: 763px;"><div data-drawio-colors="color: rgb(240, 240, 240); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(240, 240, 240); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">...execution/<span style="font-family: "Helvetica Neue"; font-size: 13px;">iota</span>-adapter/execution-engine</div></div></div></foreignObject><text x="817" y="239" fill="rgb(240, 240, 240)" font-family=""Helvetica"" font-size="12px" text-anchor="middle">...execution/iota-...</text></switch></g></g></g></g><g data-cell-id="3kIInuhs_YmBb0iZ2eFI-61"><g><path d="M 1008.86 382.52 L 885 382.5 Q 875 382.5 875 372.5 L 874.98 282.37" fill="none" stroke="rgb(240, 240, 240)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 874.98 277.12 L 878.48 284.12 L 874.98 282.37 L 871.48 284.12 Z" fill="rgb(240, 240, 240)" stroke="rgb(240, 240, 240)" stroke-miterlimit="10" pointer-events="all"/></g><g data-cell-id="3kIInuhs_YmBb0iZ2eFI-62"><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 382px; margin-left: 910px;"><div data-drawio-colors="color: rgb(240, 240, 240); background-color: rgb(24, 20, 29); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 11px; font-family: "Architects Daughter"; color: rgb(240, 240, 240); line-height: 1.2; pointer-events: all; background-color: rgb(24, 20, 29); white-space: nowrap;"><h4><font face="Helvetica">native fns etc</font></h4></div></div></div></foreignObject><text x="910" y="385" fill="rgb(240, 240, 240)" font-family=""Architects Daughter"" font-size="11px" text-anchor="middle">native fns etc</text></switch></g></g></g></g><g data-cell-id="3kIInuhs_YmBb0iZ2eFI-45"><g/><g data-cell-id="3kIInuhs_YmBb0iZ2eFI-48"><g/><g data-cell-id="3kIInuhs_YmBb0iZ2eFI-46"><g><path d="M 997.72 118.29 L 1066.82 118.29 L 1076.82 128.29 L 1076.82 220.56 L 1007.72 220.56 L 997.72 210.56 L 997.72 118.29 Z" fill="rgb(24, 20, 29)" stroke="rgb(240, 240, 240)" stroke-miterlimit="10" transform="rotate(90,1037.27,169.43)" pointer-events="all"/><path d="M 1007.72 220.56 L 1007.72 128.29 L 997.72 118.29 M 1007.72 128.29 L 1076.82 128.29" fill="none" stroke="rgb(240, 240, 240)" stroke-miterlimit="10" transform="rotate(90,1037.27,169.43)" pointer-events="all"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe flex-start; justify-content: unsafe center; width: 85px; height: 1px; padding-top: 147px; margin-left: 992px;"><div data-drawio-colors="color: rgb(240, 240, 240); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(240, 240, 240); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><b>Object runtime</b></div></div></div></foreignObject><text x="1035" y="159" fill="rgb(240, 240, 240)" font-family=""Helvetica"" font-size="12px" text-anchor="middle">Object runtime</text></switch></g></g></g><g data-cell-id="3kIInuhs_YmBb0iZ2eFI-47"><g><rect x="986.14" y="208.98" width="92.05" height="39.55" rx="5.93" ry="5.93" fill="rgb(24, 20, 29)" stroke="rgb(240, 240, 240)" pointer-events="all"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 90px; height: 1px; padding-top: 229px; margin-left: 987px;"><div data-drawio-colors="color: rgb(240, 240, 240); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(240, 240, 240); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">...execution/<span style="font-family: "Helvetica Neue"; font-size: 13px;">iota</span>-move-natives</div></div></div></foreignObject><text x="1032" y="232" fill="rgb(240, 240, 240)" font-family=""Helvetica"" font-size="12px" text-anchor="middle">...execution/io...</text></switch></g></g></g></g></g><g data-cell-id="3kIInuhs_YmBb0iZ2eFI-64"><g><rect x="978.54" y="80.44" width="117.47" height="29.66" rx="4.45" ry="4.45" fill="rgb(24, 20, 29)" stroke="none" pointer-events="all"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe flex-start; justify-content: unsafe flex-start; width: 115px; height: 1px; padding-top: 87px; margin-left: 981px;"><div data-drawio-colors="color: rgb(240, 240, 240); " style="box-sizing: border-box; font-size: 0px; text-align: left;"><div style="display: inline-block; font-size: 12px; font-family: "Architects Daughter"; color: rgb(240, 240, 240); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><span style="caret-color: rgb(0, 0, 0); font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; letter-spacing: normal; text-align: center; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration: none; float: none; display: inline !important;"><b style="">iota-execution crate</b></span></div></div></div></foreignObject><text x="981" y="99" fill="rgb(240, 240, 240)" font-family=""Architects Daughter"" font-size="12px">iota-execution crate</text></switch></g></g></g></g><g data-cell-id="3kIInuhs_YmBb0iZ2eFI-15"><g style="filter: drop-shadow(rgba(0, 0, 0, 0.25) 2px 3px 2px);"><path d="M -20 61 L 400 61 L 410 71 L 410 441 L -10 441 L -20 431 L -20 61 Z" fill="rgb(24, 20, 29)" stroke="rgb(240, 240, 240)" stroke-miterlimit="10" transform="rotate(90,195,251)" pointer-events="all"/><path d="M -10 441 L -10 71 L -20 61 M -10 71 L 410 71" fill="none" stroke="rgb(240, 240, 240)" stroke-miterlimit="10" transform="rotate(90,195,251)" pointer-events="all"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe flex-start; justify-content: unsafe flex-start; width: 363px; height: 1px; padding-top: 53px; margin-left: 12px;"><div data-drawio-colors="color: rgb(240, 240, 240); " style="box-sizing: border-box; font-size: 0px; text-align: left;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(240, 240, 240); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><b>Nodes network(Iota node)</b></div></div></div></foreignObject><text x="12" y="65" fill="rgb(240, 240, 240)" font-family=""Helvetica"" font-size="12px">Nodes network(Iota node)</text></switch></g></g><g data-cell-id="3kIInuhs_YmBb0iZ2eFI-16"><g><path d="M 5 96 L 365 96 L 375 106 L 375 426 L 15 426 L 5 416 L 5 96 Z" fill="rgb(24, 20, 29)" stroke="rgb(240, 240, 240)" stroke-miterlimit="10" transform="rotate(90,190,261)" pointer-events="all"/><path d="M 15 426 L 15 106 L 5 96 M 15 106 L 375 106" fill="none" stroke="rgb(240, 240, 240)" stroke-miterlimit="10" transform="rotate(90,190,261)" pointer-events="all"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe flex-start; justify-content: unsafe center; width: 313px; height: 1px; padding-top: 93px; margin-left: 31px;"><div data-drawio-colors="color: rgb(240, 240, 240); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(240, 240, 240); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><b>Node</b></div></div></div></foreignObject><text x="188" y="105" fill="rgb(240, 240, 240)" font-family=""Helvetica"" font-size="12px" text-anchor="middle">Node</text></switch></g></g></g><g data-cell-id="3kIInuhs_YmBb0iZ2eFI-17"><g><path d="M -43.52 219.72 L 213.78 219.72 L 223.78 229.72 L 223.78 305.52 L -33.52 305.52 L -43.52 295.52 L -43.52 219.72 Z" fill="rgb(24, 20, 29)" stroke="rgb(240, 240, 240)" stroke-miterlimit="10" transform="rotate(90,90.13,262.62)" pointer-events="all"/><path d="M -33.52 305.52 L -33.52 229.72 L -43.52 219.72 M -33.52 229.72 L 223.78 229.72" fill="none" stroke="rgb(240, 240, 240)" stroke-miterlimit="10" transform="rotate(90,90.13,262.62)" pointer-events="all"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe flex-start; justify-content: unsafe center; width: 69px; height: 1px; padding-top: 146px; margin-left: 53px;"><div data-drawio-colors="color: rgb(240, 240, 240); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(240, 240, 240); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><b>API</b></div></div></div></foreignObject><text x="88" y="158" fill="rgb(240, 240, 240)" font-family=""Helvetica"" font-size="12px" text-anchor="middle">API</text></switch></g></g></g><g data-cell-id="3kIInuhs_YmBb0iZ2eFI-18"><g><path d="M 258.33 347.9 C 258.33 339.62 274.8 332.9 295.11 332.9 C 304.86 332.9 314.21 334.48 321.11 337.3 C 328.01 340.11 331.88 343.93 331.88 347.9 L 331.88 410.88 C 331.88 419.16 315.42 425.88 295.11 425.88 C 274.8 425.88 258.33 419.16 258.33 410.88 Z" fill="rgb(24, 20, 29)" stroke="rgb(240, 240, 240)" stroke-miterlimit="10" pointer-events="all"/><path d="M 331.88 347.9 C 331.88 356.19 315.42 362.9 295.11 362.9 C 274.8 362.9 258.33 356.19 258.33 347.9" fill="none" stroke="rgb(240, 240, 240)" stroke-miterlimit="10" pointer-events="all"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 72px; height: 1px; padding-top: 392px; margin-left: 259px;"><div data-drawio-colors="color: rgb(240, 240, 240); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(240, 240, 240); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><b>Ledger storage</b></div></div></div></foreignObject><text x="295" y="395" fill="rgb(240, 240, 240)" font-family=""Helvetica"" font-size="12px" text-anchor="middle">Ledger stora...</text></switch></g></g></g><g data-cell-id="3kIInuhs_YmBb0iZ2eFI-65"><g><path d="M 158.23 347.9 C 158.23 339.62 174.69 332.9 195 332.9 C 204.75 332.9 214.11 334.48 221 337.3 C 227.9 340.11 231.77 343.93 231.77 347.9 L 231.77 410.88 C 231.77 419.16 215.31 425.88 195 425.88 C 174.69 425.88 158.23 419.16 158.23 410.88 Z" fill="rgb(24, 20, 29)" stroke="rgb(240, 240, 240)" stroke-miterlimit="10" pointer-events="all"/><path d="M 231.77 347.9 C 231.77 356.19 215.31 362.9 195 362.9 C 174.69 362.9 158.23 356.19 158.23 347.9" fill="none" stroke="rgb(240, 240, 240)" stroke-miterlimit="10" pointer-events="all"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 72px; height: 1px; padding-top: 392px; margin-left: 159px;"><div data-drawio-colors="color: rgb(240, 240, 240); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(240, 240, 240); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><b>Indexer</b><div><b>(read/sync db)</b></div></div></div></div></foreignObject><text x="195" y="395" fill="rgb(240, 240, 240)" font-family=""Helvetica"" font-size="12px" text-anchor="middle">Indexer...</text></switch></g></g></g><g data-cell-id="3kIInuhs_YmBb0iZ2eFI-19"><g><path d="M 157.2 108.2 L 225.29 108.2 L 235.29 118.2 L 235.29 205.7 L 167.2 205.7 L 157.2 195.7 L 157.2 108.2 Z" fill="rgb(24, 20, 29)" stroke="rgb(240, 240, 240)" stroke-miterlimit="10" transform="rotate(90,196.25,156.95)" pointer-events="all"/><path d="M 167.2 205.7 L 167.2 118.2 L 157.2 108.2 M 167.2 118.2 L 235.29 118.2" fill="none" stroke="rgb(240, 240, 240)" stroke-miterlimit="10" transform="rotate(90,196.25,156.95)" pointer-events="all"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe flex-start; justify-content: unsafe center; width: 81px; height: 1px; padding-top: 135px; margin-left: 154px;"><div data-drawio-colors="color: rgb(240, 240, 240); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(240, 240, 240); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><b>Consensus engine</b></div></div></div></foreignObject><text x="194" y="147" fill="rgb(240, 240, 240)" font-family=""Helvetica"" font-size="12px" text-anchor="middle">Consensus engi...</text></switch></g></g></g><g data-cell-id="3kIInuhs_YmBb0iZ2eFI-20"><g><path d="M 154.28 213.88 L 225.72 213.88 L 235.72 223.88 L 235.72 311.38 L 164.28 311.38 L 154.28 301.38 L 154.28 213.88 Z" fill="rgb(24, 20, 29)" stroke="rgb(240, 240, 240)" stroke-miterlimit="10" transform="rotate(90,195,262.63)" pointer-events="all"/><path d="M 164.28 311.38 L 164.28 223.88 L 154.28 213.88 M 164.28 223.88 L 235.72 223.88" fill="none" stroke="rgb(240, 240, 240)" stroke-miterlimit="10" transform="rotate(90,195,262.63)" pointer-events="all"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe flex-start; justify-content: unsafe center; width: 81px; height: 1px; padding-top: 239px; margin-left: 152px;"><div data-drawio-colors="color: rgb(240, 240, 240); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(240, 240, 240); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><b>Network</b></div></div></div></foreignObject><text x="193" y="251" fill="rgb(240, 240, 240)" font-family=""Helvetica"" font-size="12px" text-anchor="middle">Network</text></switch></g></g></g><g data-cell-id="C7P2nbfdh_euxFz_vEXo-1"><g><path d="M 264.32 178.44 L 314.32 178.44 L 324.32 188.44 L 324.32 253.56 L 274.32 253.56 L 264.32 243.56 L 264.32 178.44 Z" fill="rgb(24, 20, 29)" stroke="rgb(240, 240, 240)" stroke-miterlimit="10" transform="rotate(90,294.33,216)" pointer-events="all"/><path d="M 274.32 253.56 L 274.32 188.44 L 264.32 178.44 M 274.32 188.44 L 324.32 188.44" fill="none" stroke="rgb(240, 240, 240)" stroke-miterlimit="10" transform="rotate(90,294.33,216)" pointer-events="all"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe flex-start; justify-content: unsafe center; width: 58px; height: 1px; padding-top: 203px; margin-left: 263px;"><div data-drawio-colors="color: rgb(240, 240, 240); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(240, 240, 240); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><b>Core</b></div></div></div></foreignObject><text x="292" y="215" fill="rgb(240, 240, 240)" font-family=""Helvetica"" font-size="12px" text-anchor="middle">Core</text></switch></g></g></g></g><g data-cell-id="3kIInuhs_YmBb0iZ2eFI-34"><g/><g data-cell-id="3kIInuhs_YmBb0iZ2eFI-31"><g><path d="M 100 471 L 140 471 L 150 481 L 150 591 L 110 591 L 100 581 L 100 471 Z" fill="rgb(24, 20, 29)" stroke="rgb(240, 240, 240)" stroke-miterlimit="10" transform="rotate(90,125,531)" pointer-events="all"/><path d="M 110 591 L 110 481 L 100 471 M 110 481 L 150 481" fill="none" stroke="rgb(240, 240, 240)" stroke-miterlimit="10" transform="rotate(90,125,531)" pointer-events="all"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe flex-start; justify-content: unsafe center; width: 103px; height: 1px; padding-top: 523px; margin-left: 71px;"><div data-drawio-colors="color: rgb(240, 240, 240); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(240, 240, 240); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><b>iota-json-rpc</b></div></div></div></foreignObject><text x="123" y="535" fill="rgb(240, 240, 240)" font-family=""Helvetica"" font-size="12px" text-anchor="middle">iota-json-rpc</text></switch></g></g></g><g data-cell-id="3kIInuhs_YmBb0iZ2eFI-32"><g><rect x="85" y="556" width="80" height="24.55" rx="3.68" ry="3.68" fill="rgb(24, 20, 29)" stroke="rgb(240, 240, 240)" pointer-events="all"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 78px; height: 1px; padding-top: 568px; margin-left: 86px;"><div data-drawio-colors="color: rgb(240, 240, 240); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(240, 240, 240); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><div>iota-json-rpc crate<br /></div></div></div></div></foreignObject><text x="125" y="572" fill="rgb(240, 240, 240)" font-family=""Helvetica"" font-size="12px" text-anchor="middle">iota-json-rpc...</text></switch></g></g></g></g><g data-cell-id="3kIInuhs_YmBb0iZ2eFI-36"><g/><g data-cell-id="3kIInuhs_YmBb0iZ2eFI-28"><g><path d="M 95 646 L 125 646 L 135 656 L 135 746 L 105 746 L 95 736 L 95 646 Z" fill="rgb(24, 20, 29)" stroke="rgb(240, 240, 240)" stroke-miterlimit="10" transform="rotate(90,115,696)" pointer-events="all"/><path d="M 105 746 L 105 656 L 95 646 M 105 656 L 135 656" fill="none" stroke="rgb(240, 240, 240)" stroke-miterlimit="10" transform="rotate(90,115,696)" pointer-events="all"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe flex-start; justify-content: unsafe center; width: 83px; height: 1px; padding-top: 693px; margin-left: 71px;"><div data-drawio-colors="color: rgb(240, 240, 240); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(240, 240, 240); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><b>iota-cli</b></div></div></div></foreignObject><text x="113" y="705" fill="rgb(240, 240, 240)" font-family=""Helvetica"" font-size="12px" text-anchor="middle">iota-cli</text></switch></g></g></g><g data-cell-id="3kIInuhs_YmBb0iZ2eFI-35"><g><rect x="65" y="716" width="90" height="30" rx="4.5" ry="4.5" fill="rgb(24, 20, 29)" stroke="rgb(240, 240, 240)" pointer-events="all"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 88px; height: 1px; padding-top: 731px; margin-left: 66px;"><div data-drawio-colors="color: rgb(240, 240, 240); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(240, 240, 240); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">iota crate</div></div></div></foreignObject><text x="110" y="735" fill="rgb(240, 240, 240)" font-family=""Helvetica"" font-size="12px" text-anchor="middle">iota crate</text></switch></g></g></g></g><g data-cell-id="3kIInuhs_YmBb0iZ2eFI-49"><g style="filter: drop-shadow(rgba(0, 0, 0, 0.25) 2px 3px 2px);"><path d="M 120 676 L 120 638.3 Q 120 628.3 122.5 628.3 L 123.75 628.3 Q 125 628.3 125 618.3 L 125 586.92" fill="none" stroke="rgb(240, 240, 240)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 125 581.67 L 128.5 588.67 L 125 586.92 L 121.5 588.67 Z" fill="rgb(240, 240, 240)" stroke="rgb(240, 240, 240)" stroke-miterlimit="10" pointer-events="all"/></g></g><g data-cell-id="3kIInuhs_YmBb0iZ2eFI-50"><g style="filter: drop-shadow(rgba(0, 0, 0, 0.25) 2px 3px 2px);"><path d="M 130 506 L 130 476 Q 130 466 140 466 L 185 466 Q 195 466 195 456 L 195 432.25" fill="none" stroke="rgb(240, 240, 240)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 195 427 L 198.5 434 L 195 432.25 L 191.5 434 Z" fill="rgb(240, 240, 240)" stroke="rgb(240, 240, 240)" stroke-miterlimit="10" pointer-events="all"/></g></g><g data-cell-id="C7P2nbfdh_euxFz_vEXo-6"><g style="filter: drop-shadow(rgba(0, 0, 0, 0.25) 2px 3px 2px);"><path d="M 710 256 L 530.9 256 Q 520.9 256 520.9 266 L 520.9 369.4 Q 520.9 379.4 510.9 379.4 L 338.25 379.39" fill="none" stroke="rgb(240, 240, 240)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 333 379.39 L 340 375.89 L 338.25 379.39 L 340 382.89 Z" fill="rgb(240, 240, 240)" stroke="rgb(240, 240, 240)" stroke-miterlimit="10" pointer-events="all"/></g></g><g data-cell-id="C7P2nbfdh_euxFz_vEXo-11"><g style="filter: drop-shadow(rgba(0, 0, 0, 0.25) 2px 3px 2px);"><path d="M 331.88 218.38 L 511 218.4 Q 521 218.4 521 208.4 L 521 21 Q 521 11 531 11 L 960.9 11 Q 970.9 11 970.91 17.82 L 970.91 24.63" fill="none" stroke="rgb(240, 240, 240)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 970.92 29.88 L 967.41 22.89 L 970.91 24.63 L 974.41 22.88 Z" fill="rgb(240, 240, 240)" stroke="rgb(240, 240, 240)" stroke-miterlimit="10" pointer-events="all"/></g></g></g></g></g><switch><g requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"/><a transform="translate(0,-5)" xlink:href="https://www.drawio.com/doc/faq/svg-export-text-problems" target="_blank"><text text-anchor="middle" font-size="10px" x="50%" y="100%">Text is not SVG - cannot display</text></a></switch></svg> \ No newline at end of file diff --git a/docs/site/static/img/concepts/execution-architecture/iota-architecture.svg b/docs/site/static/img/concepts/execution-architecture/iota-architecture.svg index 90113451977..ba261ecd774 100644 --- a/docs/site/static/img/concepts/execution-architecture/iota-architecture.svg +++ b/docs/site/static/img/concepts/execution-architecture/iota-architecture.svg @@ -1,4 +1,4 @@ <?xml version="1.0" encoding="UTF-8"?> <!-- Do not edit this file with editors other than draw.io --> <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> -<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="1151px" height="711px" viewBox="-0.5 -0.5 1151 711" content="<mxfile host="app.diagrams.net" modified="2024-06-06T13:06:20.290Z" agent="Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.0 Safari/605.1.15" etag="_bzW2ujPehIvRME25DFx" version="24.4.13" type="device"> <diagram name="Page-1" id="jhOoJUkd9Zucpb-pnEYY"> <mxGraphModel dx="2074" dy="816" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="850" pageHeight="1100" background="#ffffff" math="0" shadow="0"> <root> <mxCell id="0" /> <mxCell id="1" parent="0" /> <mxCell id="3kIInuhs_YmBb0iZ2eFI-7" value="&lt;b&gt;Execution layer&lt;/b&gt;" style="verticalAlign=top;align=left;shape=cube;size=10;direction=south;fontStyle=0;html=1;boundedLbl=1;spacingLeft=5;whiteSpace=wrap;rounded=1;" parent="1" vertex="1"> <mxGeometry x="490" y="30" width="450" height="440" as="geometry" /> </mxCell> <mxCell id="3kIInuhs_YmBb0iZ2eFI-63" value="" style="rounded=1;whiteSpace=wrap;html=1;hachureGap=4;fontFamily=Helvetica;strokeColor=default;fillColor=default;glass=0;" parent="3kIInuhs_YmBb0iZ2eFI-7" vertex="1"> <mxGeometry x="10.003376623376589" y="39.550041395623865" width="393.8931818181818" height="227.41573033707866" as="geometry" /> </mxCell> <mxCell id="3kIInuhs_YmBb0iZ2eFI-8" value="&lt;b&gt;Adapter&lt;/b&gt;" style="verticalAlign=top;align=center;shape=cube;size=10;direction=south;html=1;boundedLbl=1;spacingLeft=5;whiteSpace=wrap;rounded=1;" parent="3kIInuhs_YmBb0iZ2eFI-7" vertex="1"> <mxGeometry width="170" height="190" relative="1" as="geometry"> <mxPoint x="30" y="55" as="offset" /> </mxGeometry> </mxCell> <mxCell id="3kIInuhs_YmBb0iZ2eFI-43" value="" style="group;rounded=1;" parent="3kIInuhs_YmBb0iZ2eFI-7" vertex="1" connectable="0"> <mxGeometry x="38.86363636363636" y="304.0449438202247" width="102.27272727272727" height="118.65168539325842" as="geometry" /> </mxCell> <mxCell id="3kIInuhs_YmBb0iZ2eFI-9" value="&lt;b&gt;MoveVM&lt;/b&gt;" style="verticalAlign=top;align=center;shape=cube;size=10;direction=south;html=1;boundedLbl=1;spacingLeft=5;whiteSpace=wrap;rounded=1;" parent="3kIInuhs_YmBb0iZ2eFI-43" vertex="1"> <mxGeometry width="102.27272727272727" height="79.10112359550561" as="geometry" /> </mxCell> <mxCell id="3kIInuhs_YmBb0iZ2eFI-41" value="move-execution/move-vm-runtime" style="rounded=1;whiteSpace=wrap;html=1;" parent="3kIInuhs_YmBb0iZ2eFI-43" vertex="1"> <mxGeometry y="79.10112359550561" width="92.04545454545455" height="39.550561797752806" as="geometry" /> </mxCell> <mxCell id="3kIInuhs_YmBb0iZ2eFI-44" value="" style="group;rounded=1;" parent="3kIInuhs_YmBb0iZ2eFI-7" vertex="1" connectable="0"> <mxGeometry x="296.59090909090907" y="306.51685393258424" width="102.27272727272727" height="118.65168539325842" as="geometry" /> </mxCell> <mxCell id="3kIInuhs_YmBb0iZ2eFI-13" value="&lt;b&gt;Framework&lt;/b&gt;" style="verticalAlign=top;align=center;shape=cube;size=10;direction=south;html=1;boundedLbl=1;spacingLeft=5;whiteSpace=wrap;rounded=1;" parent="3kIInuhs_YmBb0iZ2eFI-44" vertex="1"> <mxGeometry width="102.27272727272727" height="79.10112359550561" as="geometry" /> </mxCell> <mxCell id="3kIInuhs_YmBb0iZ2eFI-42" value="iota-framework crate" style="rounded=1;whiteSpace=wrap;html=1;" parent="3kIInuhs_YmBb0iZ2eFI-44" vertex="1"> <mxGeometry y="79.10112359550561" width="92.04545454545455" height="39.550561797752806" as="geometry" /> </mxCell> <mxCell id="3kIInuhs_YmBb0iZ2eFI-56" value="Init" style="edgeStyle=orthogonalEdgeStyle;rounded=1;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0;entryY=0;entryDx=0;entryDy=45;entryPerimeter=0;curved=0;" parent="3kIInuhs_YmBb0iZ2eFI-7" source="3kIInuhs_YmBb0iZ2eFI-39" target="3kIInuhs_YmBb0iZ2eFI-9" edge="1"> <mxGeometry relative="1" as="geometry" /> </mxCell> <mxCell id="3kIInuhs_YmBb0iZ2eFI-58" value="" style="group;rounded=1;" parent="3kIInuhs_YmBb0iZ2eFI-7" vertex="1" connectable="0"> <mxGeometry x="46.16883116883113" y="88.98824364281488" width="378.4090909090909" height="168.0904080425784" as="geometry" /> </mxCell> <mxCell id="3kIInuhs_YmBb0iZ2eFI-40" value="" style="group;rounded=1;" parent="3kIInuhs_YmBb0iZ2eFI-58" vertex="1" connectable="0"> <mxGeometry width="128.57142857142858" height="138.42696629213484" as="geometry" /> </mxCell> <mxCell id="3kIInuhs_YmBb0iZ2eFI-10" value="&lt;b&gt;Execution-engine&lt;/b&gt;" style="verticalAlign=top;align=center;shape=cube;size=10;direction=south;html=1;boundedLbl=1;spacingLeft=5;whiteSpace=wrap;rounded=1;" parent="3kIInuhs_YmBb0iZ2eFI-40" vertex="1"> <mxGeometry width="128.57142857142856" height="92.63157894736842" as="geometry" /> </mxCell> <mxCell id="3kIInuhs_YmBb0iZ2eFI-39" value="...execution/&lt;span style=&quot;font-family: &amp;quot;Helvetica Neue&amp;quot;; font-size: 13px;&quot;&gt;iota&lt;/span&gt;-adapter/execution-engine" style="rounded=1;whiteSpace=wrap;html=1;" parent="3kIInuhs_YmBb0iZ2eFI-58" vertex="1"> <mxGeometry x="5.849999999999999" y="92.6274157303371" width="109.575" height="45.79955056179776" as="geometry" /> </mxCell> <mxCell id="3kIInuhs_YmBb0iZ2eFI-61" style="edgeStyle=orthogonalEdgeStyle;rounded=1;hachureGap=4;orthogonalLoop=1;jettySize=auto;html=1;exitX=0;exitY=0;exitDx=45;exitDy=100;exitPerimeter=0;entryX=1;entryY=0.206;entryDx=0;entryDy=0;entryPerimeter=0;fontFamily=Architects Daughter;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DArchitects%2BDaughter;curved=0;" parent="3kIInuhs_YmBb0iZ2eFI-7" source="3kIInuhs_YmBb0iZ2eFI-13" target="3kIInuhs_YmBb0iZ2eFI-8" edge="1"> <mxGeometry relative="1" as="geometry" /> </mxCell> <mxCell id="3kIInuhs_YmBb0iZ2eFI-62" value="&lt;h4&gt;&lt;font face=&quot;Helvetica&quot;&gt;native fns etc&lt;/font&gt;&lt;/h4&gt;" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];sketch=1;hachureGap=4;jiggle=2;curveFitting=1;fontFamily=Architects Daughter;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DArchitects%2BDaughter;rounded=1;" parent="3kIInuhs_YmBb0iZ2eFI-61" vertex="1" connectable="0"> <mxGeometry x="-0.1741" y="-1" relative="1" as="geometry"> <mxPoint as="offset" /> </mxGeometry> </mxCell> <mxCell id="3kIInuhs_YmBb0iZ2eFI-45" value="" style="group;rounded=1;" parent="3kIInuhs_YmBb0iZ2eFI-7" vertex="1" connectable="0"> <mxGeometry x="276.1363636363636" y="98.87640449438204" width="102.27272727272727" height="118.65168539325842" as="geometry" /> </mxCell> <mxCell id="3kIInuhs_YmBb0iZ2eFI-48" value="" style="group;rounded=1;" parent="3kIInuhs_YmBb0iZ2eFI-45" vertex="1" connectable="0"> <mxGeometry width="102.27272727272727" height="118.65168539325842" as="geometry" /> </mxCell> <mxCell id="3kIInuhs_YmBb0iZ2eFI-46" value="&lt;b&gt;Object runtime&lt;/b&gt;" style="verticalAlign=top;align=center;shape=cube;size=10;direction=south;html=1;boundedLbl=1;spacingLeft=5;whiteSpace=wrap;rounded=1;" parent="3kIInuhs_YmBb0iZ2eFI-48" vertex="1"> <mxGeometry width="102.27272727272727" height="79.10112359550561" as="geometry" /> </mxCell> <mxCell id="3kIInuhs_YmBb0iZ2eFI-47" value="...execution/&lt;span style=&quot;font-family: &amp;quot;Helvetica Neue&amp;quot;; font-size: 13px;&quot;&gt;iota&lt;/span&gt;-move-natives" style="rounded=1;whiteSpace=wrap;html=1;" parent="3kIInuhs_YmBb0iZ2eFI-48" vertex="1"> <mxGeometry y="79.10112359550561" width="92.04545454545455" height="39.550561797752806" as="geometry" /> </mxCell> <mxCell id="3kIInuhs_YmBb0iZ2eFI-64" value="&lt;span style=&quot;caret-color: rgb(0, 0, 0); color: rgb(0, 0, 0); font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; letter-spacing: normal; text-align: center; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: rgb(251, 251, 251); text-decoration: none; float: none; display: inline !important;&quot;&gt;&lt;b&gt;iota-execution crate&lt;/b&gt;&lt;/span&gt;" style="text;whiteSpace=wrap;html=1;fontFamily=Architects Daughter;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DArchitects%2BDaughter;rounded=1;" parent="3kIInuhs_YmBb0iZ2eFI-7" vertex="1"> <mxGeometry x="268.5363636363636" y="49.43820224719101" width="117.47045454545454" height="29.662921348314605" as="geometry" /> </mxCell> <mxCell id="3kIInuhs_YmBb0iZ2eFI-15" value="&lt;b&gt;Nodes network(Iota node)&lt;/b&gt;" style="verticalAlign=top;align=left;shape=cube;size=10;direction=south;fontStyle=0;html=1;boundedLbl=1;spacingLeft=5;whiteSpace=wrap;rounded=1;" parent="1" vertex="1"> <mxGeometry x="-210" y="30" width="380" height="430" as="geometry" /> </mxCell> <mxCell id="3kIInuhs_YmBb0iZ2eFI-16" value="&lt;b&gt;Node&lt;/b&gt;" style="verticalAlign=top;align=center;shape=cube;size=10;direction=south;html=1;boundedLbl=1;spacingLeft=5;whiteSpace=wrap;rounded=1;" parent="3kIInuhs_YmBb0iZ2eFI-15" vertex="1"> <mxGeometry width="330" height="370" relative="1" as="geometry"> <mxPoint x="20" y="40" as="offset" /> </mxGeometry> </mxCell> <mxCell id="3kIInuhs_YmBb0iZ2eFI-17" value="&lt;b&gt;API&lt;/b&gt;" style="verticalAlign=top;align=center;shape=cube;size=10;direction=south;html=1;boundedLbl=1;spacingLeft=5;whiteSpace=wrap;rounded=1;" parent="3kIInuhs_YmBb0iZ2eFI-15" vertex="1"> <mxGeometry x="42.2239247311828" y="92.97297297297297" width="85.80645161290323" height="267.2972972972973" as="geometry" /> </mxCell> <mxCell id="3kIInuhs_YmBb0iZ2eFI-18" value="&lt;b&gt;Ledger storage&lt;/b&gt;" style="shape=cylinder3;whiteSpace=wrap;html=1;boundedLbl=1;backgroundOutline=1;size=15;rounded=1;" parent="3kIInuhs_YmBb0iZ2eFI-15" vertex="1"> <mxGeometry x="253.33129032258068" y="296.9044851994852" width="73.5483870967742" height="92.97297297297297" as="geometry" /> </mxCell> <mxCell id="3kIInuhs_YmBb0iZ2eFI-65" value="&lt;b&gt;Indexer&lt;/b&gt;&lt;div&gt;&lt;b&gt;(read/sync db)&lt;/b&gt;&lt;/div&gt;" style="shape=cylinder3;whiteSpace=wrap;html=1;boundedLbl=1;backgroundOutline=1;size=15;rounded=1;" parent="3kIInuhs_YmBb0iZ2eFI-15" vertex="1"> <mxGeometry x="153.22580645161293" y="296.9044851994852" width="73.5483870967742" height="92.97297297297297" as="geometry" /> </mxCell> <mxCell id="3kIInuhs_YmBb0iZ2eFI-19" value="&lt;b&gt;Consensus engine&lt;/b&gt;" style="verticalAlign=top;align=center;shape=cube;size=10;direction=south;html=1;boundedLbl=1;spacingLeft=5;whiteSpace=wrap;rounded=1;" parent="3kIInuhs_YmBb0iZ2eFI-15" vertex="1"> <mxGeometry x="142.5" y="81.91" width="97.5" height="78.09" as="geometry" /> </mxCell> <mxCell id="3kIInuhs_YmBb0iZ2eFI-20" value="&lt;b&gt;Network&lt;/b&gt;" style="verticalAlign=top;align=center;shape=cube;size=10;direction=south;html=1;boundedLbl=1;spacingLeft=5;whiteSpace=wrap;rounded=1;" parent="3kIInuhs_YmBb0iZ2eFI-15" vertex="1"> <mxGeometry x="141.25" y="185.91" width="97.5" height="81.43" as="geometry" /> </mxCell> <mxCell id="C7P2nbfdh_euxFz_vEXo-1" value="&lt;b&gt;Core&lt;/b&gt;" style="verticalAlign=top;align=center;shape=cube;size=10;direction=south;html=1;boundedLbl=1;spacingLeft=5;whiteSpace=wrap;rounded=1;" vertex="1" parent="3kIInuhs_YmBb0iZ2eFI-15"> <mxGeometry x="251.77" y="150" width="75.11" height="60" as="geometry" /> </mxCell> <mxCell id="3kIInuhs_YmBb0iZ2eFI-34" value="" style="group;rounded=1;" parent="1" vertex="1" connectable="0"> <mxGeometry x="-150" y="500" width="120" height="74.55" as="geometry" /> </mxCell> <mxCell id="3kIInuhs_YmBb0iZ2eFI-31" value="&lt;b&gt;iota-json-rpc&lt;/b&gt;" style="verticalAlign=top;align=center;shape=cube;size=10;direction=south;html=1;boundedLbl=1;spacingLeft=5;whiteSpace=wrap;movable=1;resizable=1;rotatable=1;deletable=1;editable=1;locked=0;connectable=1;rounded=1;" parent="3kIInuhs_YmBb0iZ2eFI-34" vertex="1"> <mxGeometry width="120" height="50" as="geometry" /> </mxCell> <mxCell id="3kIInuhs_YmBb0iZ2eFI-32" value="&lt;div&gt;iota-json-rpc crate&lt;br&gt;&lt;/div&gt;" style="rounded=1;whiteSpace=wrap;html=1;movable=1;resizable=1;rotatable=1;deletable=1;editable=1;locked=0;connectable=1;" parent="3kIInuhs_YmBb0iZ2eFI-34" vertex="1"> <mxGeometry x="20" y="50.00454545454545" width="80" height="24.545454545454547" as="geometry" /> </mxCell> <mxCell id="3kIInuhs_YmBb0iZ2eFI-36" value="" style="group;rounded=1;" parent="1" vertex="1" connectable="0"> <mxGeometry x="-150" y="670" width="100" height="70" as="geometry" /> </mxCell> <mxCell id="3kIInuhs_YmBb0iZ2eFI-28" value="&lt;b&gt;iota-cli&lt;/b&gt;" style="verticalAlign=top;align=center;shape=cube;size=10;direction=south;html=1;boundedLbl=1;spacingLeft=5;whiteSpace=wrap;rounded=1;" parent="3kIInuhs_YmBb0iZ2eFI-36" vertex="1"> <mxGeometry width="100" height="40" as="geometry" /> </mxCell> <mxCell id="3kIInuhs_YmBb0iZ2eFI-35" value="iota-cli crate" style="rounded=1;whiteSpace=wrap;html=1;" parent="3kIInuhs_YmBb0iZ2eFI-36" vertex="1"> <mxGeometry y="40" width="90" height="30" as="geometry" /> </mxCell> <mxCell id="3kIInuhs_YmBb0iZ2eFI-49" style="edgeStyle=orthogonalEdgeStyle;rounded=1;orthogonalLoop=1;jettySize=auto;html=1;exitX=0;exitY=0;exitDx=0;exitDy=45;exitPerimeter=0;entryX=0.5;entryY=1;entryDx=0;entryDy=0;curved=0;" parent="1" source="3kIInuhs_YmBb0iZ2eFI-28" target="3kIInuhs_YmBb0iZ2eFI-32" edge="1"> <mxGeometry relative="1" as="geometry" /> </mxCell> <mxCell id="3kIInuhs_YmBb0iZ2eFI-50" style="edgeStyle=orthogonalEdgeStyle;rounded=1;orthogonalLoop=1;jettySize=auto;html=1;exitX=0;exitY=0;exitDx=0;exitDy=55;exitPerimeter=0;entryX=0.5;entryY=1;entryDx=0;entryDy=0;entryPerimeter=0;" parent="1" source="3kIInuhs_YmBb0iZ2eFI-31" target="3kIInuhs_YmBb0iZ2eFI-65" edge="1"> <mxGeometry relative="1" as="geometry" /> </mxCell> <mxCell id="C7P2nbfdh_euxFz_vEXo-6" style="edgeStyle=orthogonalEdgeStyle;rounded=1;hachureGap=4;orthogonalLoop=1;jettySize=auto;html=1;entryX=1;entryY=0.5;entryDx=0;entryDy=0;entryPerimeter=0;fontFamily=Architects Daughter;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DArchitects%2BDaughter;" edge="1" parent="1" source="3kIInuhs_YmBb0iZ2eFI-7" target="3kIInuhs_YmBb0iZ2eFI-18"> <mxGeometry relative="1" as="geometry" /> </mxCell> <mxCell id="C7P2nbfdh_euxFz_vEXo-11" style="edgeStyle=orthogonalEdgeStyle;rounded=1;hachureGap=4;orthogonalLoop=1;jettySize=auto;html=1;exitX=0;exitY=0;exitDx=32.385;exitDy=0;exitPerimeter=0;entryX=0.407;entryY=1;entryDx=0;entryDy=0;entryPerimeter=0;fontFamily=Architects Daughter;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DArchitects%2BDaughter;" edge="1" parent="1" source="C7P2nbfdh_euxFz_vEXo-1" target="3kIInuhs_YmBb0iZ2eFI-7"> <mxGeometry relative="1" as="geometry" /> </mxCell> </root> </mxGraphModel> </diagram> </mxfile> " style="background-color: rgb(255, 255, 255);"><defs/><rect fill="#ffffff" width="100%" height="100%" x="0" y="0"/><g><g><path d="M 705 -5 L 1135 -5 L 1145 5 L 1145 445 L 715 445 L 705 435 L 705 -5 Z" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" transform="rotate(90,925,220)" pointer-events="all"/><path d="M 715 445 L 715 5 L 705 -5 M 715 5 L 1145 5" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" transform="rotate(90,925,220)" pointer-events="all"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe flex-start; justify-content: unsafe flex-start; width: 433px; height: 1px; padding-top: 17px; margin-left: 707px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: left;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><b>Execution layer</b></div></div></div></foreignObject><text x="707" y="29" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px">Execution layer</text></switch></g></g><g><rect x="710" y="39.55" width="393.89" height="227.42" rx="34.11" ry="34.11" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="all"/></g><g><path d="M 720 65 L 900 65 L 910 75 L 910 235 L 730 235 L 720 225 L 720 65 Z" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" transform="rotate(90,815,150)" pointer-events="all"/><path d="M 730 235 L 730 75 L 720 65 M 730 75 L 910 75" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" transform="rotate(90,815,150)" pointer-events="all"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe flex-start; justify-content: unsafe center; width: 153px; height: 1px; padding-top: 72px; margin-left: 736px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><b>Adapter</b></div></div></div></foreignObject><text x="813" y="84" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">Adapter</text></switch></g></g><g/><g><path d="M 750.45 292.46 L 819.55 292.46 L 829.55 302.46 L 829.55 394.73 L 760.45 394.73 L 750.45 384.73 L 750.45 292.46 Z" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" transform="rotate(90,790,343.6)" pointer-events="all"/><path d="M 760.45 394.73 L 760.45 302.46 L 750.45 292.46 M 760.45 302.46 L 829.55 302.46" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" transform="rotate(90,790,343.6)" pointer-events="all"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe flex-start; justify-content: unsafe center; width: 85px; height: 1px; padding-top: 321px; margin-left: 745px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><b>MoveVM</b></div></div></div></foreignObject><text x="788" y="333" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">MoveVM</text></switch></g></g><g><rect x="738.86" y="383.15" width="92.05" height="39.55" rx="5.93" ry="5.93" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="all"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 90px; height: 1px; padding-top: 403px; margin-left: 740px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">move-execution/move-vm-runtime</div></div></div></foreignObject><text x="785" y="407" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">move-execution/...</text></switch></g></g><g/><g><path d="M 1008.18 294.93 L 1077.28 294.93 L 1087.28 304.93 L 1087.28 397.2 L 1018.18 397.2 L 1008.18 387.2 L 1008.18 294.93 Z" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" transform="rotate(90,1047.73,346.07)" pointer-events="all"/><path d="M 1018.18 397.2 L 1018.18 304.93 L 1008.18 294.93 M 1018.18 304.93 L 1087.28 304.93" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" transform="rotate(90,1047.73,346.07)" pointer-events="all"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe flex-start; justify-content: unsafe center; width: 85px; height: 1px; padding-top: 324px; margin-left: 1003px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><b>Framework</b></div></div></div></foreignObject><text x="1045" y="336" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">Framework</text></switch></g></g><g><rect x="996.59" y="385.62" width="92.05" height="39.55" rx="5.93" ry="5.93" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="all"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 90px; height: 1px; padding-top: 405px; margin-left: 998px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">iota-framework crate</div></div></div></foreignObject><text x="1043" y="409" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">iota-framework...</text></switch></g></g><g><path d="M 806.81 227.42 L 806.8 255.7 Q 806.8 265.7 801.45 265.7 L 798.77 265.7 Q 796.1 265.7 796.11 275.7 L 796.13 297.68" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 796.14 302.93 L 792.63 295.93 L 796.13 297.68 L 799.63 295.92 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 266px; margin-left: 801px;"><div data-drawio-colors="color: rgb(0, 0, 0); background-color: rgb(255, 255, 255); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 11px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; background-color: rgb(255, 255, 255); white-space: nowrap;">Init</div></div></div></foreignObject><text x="801" y="269" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="11px" text-anchor="middle">Init</text></switch></g></g><g/><g/><g><path d="M 764.14 71.02 L 846.77 71.02 L 856.77 81.02 L 856.77 199.59 L 774.14 199.59 L 764.14 189.59 L 764.14 71.02 Z" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" transform="rotate(90,810.45,135.3)" pointer-events="all"/><path d="M 774.14 199.59 L 774.14 81.02 L 764.14 71.02 M 774.14 81.02 L 856.77 81.02" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" transform="rotate(90,810.45,135.3)" pointer-events="all"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe flex-start; justify-content: unsafe center; width: 112px; height: 1px; padding-top: 106px; margin-left: 752px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><b>Execution-engine</b></div></div></div></foreignObject><text x="808" y="118" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">Execution-engine</text></switch></g></g><g><rect x="752.02" y="181.62" width="109.58" height="45.8" rx="6.87" ry="6.87" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="all"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 108px; height: 1px; padding-top: 205px; margin-left: 753px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">...execution/<span style="font-family: "Helvetica Neue"; font-size: 13px;">iota</span>-adapter/execution-engine</div></div></div></foreignObject><text x="807" y="208" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">...execution/iota-...</text></switch></g></g><g><path d="M 998.86 351.52 L 875 351.5 Q 865 351.5 865 341.5 L 864.98 251.37" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 864.98 246.12 L 868.48 253.12 L 864.98 251.37 L 861.48 253.12 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 351px; margin-left: 900px;"><div data-drawio-colors="color: rgb(0, 0, 0); background-color: rgb(255, 255, 255); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 11px; font-family: "Architects Daughter"; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; background-color: rgb(255, 255, 255); white-space: nowrap;"><h4><font face="Helvetica">native fns etc</font></h4></div></div></div></foreignObject><text x="900" y="354" fill="rgb(0, 0, 0)" font-family="Architects Daughter" font-size="11px" text-anchor="middle">native fns etc</text></switch></g></g><g/><g/><g><path d="M 987.72 87.29 L 1056.82 87.29 L 1066.82 97.29 L 1066.82 189.56 L 997.72 189.56 L 987.72 179.56 L 987.72 87.29 Z" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" transform="rotate(90,1027.27,138.43)" pointer-events="all"/><path d="M 997.72 189.56 L 997.72 97.29 L 987.72 87.29 M 997.72 97.29 L 1066.82 97.29" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" transform="rotate(90,1027.27,138.43)" pointer-events="all"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe flex-start; justify-content: unsafe center; width: 85px; height: 1px; padding-top: 116px; margin-left: 982px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><b>Object runtime</b></div></div></div></foreignObject><text x="1025" y="128" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">Object runtime</text></switch></g></g><g><rect x="976.14" y="177.98" width="92.05" height="39.55" rx="5.93" ry="5.93" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="all"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 90px; height: 1px; padding-top: 198px; margin-left: 977px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">...execution/<span style="font-family: "Helvetica Neue"; font-size: 13px;">iota</span>-move-natives</div></div></div></foreignObject><text x="1022" y="201" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">...execution/io...</text></switch></g></g><g><rect x="968.54" y="49.44" width="117.47" height="29.66" rx="4.45" ry="4.45" fill="none" stroke="none" pointer-events="all"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe flex-start; justify-content: unsafe flex-start; width: 115px; height: 1px; padding-top: 56px; margin-left: 971px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: left;"><div style="display: inline-block; font-size: 12px; font-family: "Architects Daughter"; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><span style="caret-color: rgb(0, 0, 0); color: rgb(0, 0, 0); font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; letter-spacing: normal; text-align: center; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: rgb(251, 251, 251); text-decoration: none; float: none; display: inline !important;"><b>iota-execution crate</b></span></div></div></div></foreignObject><text x="971" y="68" fill="rgb(0, 0, 0)" font-family="Architects Daughter" font-size="12px">iota-execution crate</text></switch></g></g><g><path d="M -25 25 L 395 25 L 405 35 L 405 405 L -15 405 L -25 395 L -25 25 Z" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" transform="rotate(90,190,215)" pointer-events="all"/><path d="M -15 405 L -15 35 L -25 25 M -15 35 L 405 35" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" transform="rotate(90,190,215)" pointer-events="all"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe flex-start; justify-content: unsafe flex-start; width: 363px; height: 1px; padding-top: 17px; margin-left: 7px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: left;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><b>Nodes network(Iota node)</b></div></div></div></foreignObject><text x="7" y="29" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px">Nodes network(Iota node)</text></switch></g></g><g><path d="M 0 60 L 360 60 L 370 70 L 370 390 L 10 390 L 0 380 L 0 60 Z" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" transform="rotate(90,185,225)" pointer-events="all"/><path d="M 10 390 L 10 70 L 0 60 M 10 70 L 370 70" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" transform="rotate(90,185,225)" pointer-events="all"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe flex-start; justify-content: unsafe center; width: 313px; height: 1px; padding-top: 57px; margin-left: 26px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><b>Node</b></div></div></div></foreignObject><text x="183" y="69" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">Node</text></switch></g></g><g><path d="M -48.52 183.72 L 208.78 183.72 L 218.78 193.72 L 218.78 269.52 L -38.52 269.52 L -48.52 259.52 L -48.52 183.72 Z" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" transform="rotate(90,85.13,226.62)" pointer-events="all"/><path d="M -38.52 269.52 L -38.52 193.72 L -48.52 183.72 M -38.52 193.72 L 218.78 193.72" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" transform="rotate(90,85.13,226.62)" pointer-events="all"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe flex-start; justify-content: unsafe center; width: 69px; height: 1px; padding-top: 110px; margin-left: 48px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><b>API</b></div></div></div></foreignObject><text x="83" y="122" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">API</text></switch></g></g><g><path d="M 253.33 311.9 C 253.33 303.62 269.8 296.9 290.11 296.9 C 299.86 296.9 309.21 298.48 316.11 301.3 C 323.01 304.11 326.88 307.93 326.88 311.9 L 326.88 374.88 C 326.88 383.16 310.42 389.88 290.11 389.88 C 269.8 389.88 253.33 383.16 253.33 374.88 Z" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><path d="M 326.88 311.9 C 326.88 320.19 310.42 326.9 290.11 326.9 C 269.8 326.9 253.33 320.19 253.33 311.9" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 72px; height: 1px; padding-top: 356px; margin-left: 254px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><b>Ledger storage</b></div></div></div></foreignObject><text x="290" y="359" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">Ledger stora...</text></switch></g></g><g><path d="M 153.23 311.9 C 153.23 303.62 169.69 296.9 190 296.9 C 199.75 296.9 209.11 298.48 216 301.3 C 222.9 304.11 226.77 307.93 226.77 311.9 L 226.77 374.88 C 226.77 383.16 210.31 389.88 190 389.88 C 169.69 389.88 153.23 383.16 153.23 374.88 Z" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><path d="M 226.77 311.9 C 226.77 320.19 210.31 326.9 190 326.9 C 169.69 326.9 153.23 320.19 153.23 311.9" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 72px; height: 1px; padding-top: 356px; margin-left: 154px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><b>Indexer</b><div><b>(read/sync db)</b></div></div></div></div></foreignObject><text x="190" y="359" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">Indexer...</text></switch></g></g><g><path d="M 152.2 72.2 L 220.29 72.2 L 230.29 82.2 L 230.29 169.7 L 162.2 169.7 L 152.2 159.7 L 152.2 72.2 Z" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" transform="rotate(90,191.25,120.95)" pointer-events="all"/><path d="M 162.2 169.7 L 162.2 82.2 L 152.2 72.2 M 162.2 82.2 L 230.29 82.2" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" transform="rotate(90,191.25,120.95)" pointer-events="all"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe flex-start; justify-content: unsafe center; width: 81px; height: 1px; padding-top: 99px; margin-left: 149px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><b>Consensus engine</b></div></div></div></foreignObject><text x="189" y="111" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">Consensus engi...</text></switch></g></g><g><path d="M 149.29 177.88 L 220.72 177.88 L 230.72 187.88 L 230.72 275.38 L 159.29 275.38 L 149.29 265.38 L 149.29 177.88 Z" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" transform="rotate(90,190,226.63)" pointer-events="all"/><path d="M 159.29 275.38 L 159.29 187.88 L 149.29 177.88 M 159.29 187.88 L 230.72 187.88" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" transform="rotate(90,190,226.63)" pointer-events="all"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe flex-start; justify-content: unsafe center; width: 81px; height: 1px; padding-top: 203px; margin-left: 147px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><b>Network</b></div></div></div></foreignObject><text x="188" y="215" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">Network</text></switch></g></g><g><path d="M 259.32 142.45 L 309.32 142.45 L 319.32 152.45 L 319.32 217.56 L 269.32 217.56 L 259.32 207.56 L 259.32 142.45 Z" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" transform="rotate(90,289.32,180)" pointer-events="all"/><path d="M 269.32 217.56 L 269.32 152.45 L 259.32 142.45 M 269.32 152.45 L 319.32 152.45" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" transform="rotate(90,289.32,180)" pointer-events="all"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe flex-start; justify-content: unsafe center; width: 58px; height: 1px; padding-top: 167px; margin-left: 258px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><b>Core</b></div></div></div></foreignObject><text x="287" y="179" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">Core</text></switch></g></g><g/><g><path d="M 95 435 L 135 435 L 145 445 L 145 555 L 105 555 L 95 545 L 95 435 Z" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" transform="rotate(90,120,495)" pointer-events="all"/><path d="M 105 555 L 105 445 L 95 435 M 105 445 L 145 445" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" transform="rotate(90,120,495)" pointer-events="all"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe flex-start; justify-content: unsafe center; width: 103px; height: 1px; padding-top: 487px; margin-left: 66px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><b>iota-json-rpc</b></div></div></div></foreignObject><text x="118" y="499" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">iota-json-rpc</text></switch></g></g><g><rect x="80" y="520" width="80" height="24.55" rx="3.68" ry="3.68" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="all"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 78px; height: 1px; padding-top: 532px; margin-left: 81px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><div>iota-json-rpc crate<br /></div></div></div></div></foreignObject><text x="120" y="536" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">iota-json-rpc...</text></switch></g></g><g/><g><path d="M 90 610 L 120 610 L 130 620 L 130 710 L 100 710 L 90 700 L 90 610 Z" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" transform="rotate(90,110,660)" pointer-events="all"/><path d="M 100 710 L 100 620 L 90 610 M 100 620 L 130 620" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" transform="rotate(90,110,660)" pointer-events="all"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe flex-start; justify-content: unsafe center; width: 83px; height: 1px; padding-top: 657px; margin-left: 66px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><b>iota-cli</b></div></div></div></foreignObject><text x="108" y="669" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">iota-cli</text></switch></g></g><g><rect x="60" y="680" width="90" height="30" rx="4.5" ry="4.5" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="all"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 88px; height: 1px; padding-top: 695px; margin-left: 61px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">iota-cli crate</div></div></div></foreignObject><text x="105" y="699" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">iota-cli crate</text></switch></g></g><g><path d="M 115 640 L 115 602.3 Q 115 592.3 117.5 592.3 L 118.75 592.3 Q 120 592.3 120 582.3 L 120 550.92" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 120 545.67 L 123.5 552.67 L 120 550.92 L 116.5 552.67 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/></g><g><path d="M 125 470 L 125 440 Q 125 430 135 430 L 180 430 Q 190 430 190 420 L 190 396.25" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 190 391 L 193.5 398 L 190 396.25 L 186.5 398 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/></g><g><path d="M 700 220 L 523.4 220 Q 513.4 220 513.4 230 L 513.4 333.4 Q 513.4 343.4 503.4 343.4 L 333.25 343.39" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 328 343.39 L 335 339.89 L 333.25 343.39 L 335 346.89 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/></g><g><path d="M 326.88 182.39 L 503.5 182.4 Q 513.5 182.4 513.5 180.75 L 513.5 179.92 Q 513.5 179.1 523.5 179.1 L 693.63 179.08" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 698.88 179.08 L 691.88 182.58 L 693.63 179.08 L 691.88 175.58 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/></g></g><switch><g requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"/><a transform="translate(0,-5)" xlink:href="https://www.drawio.com/doc/faq/svg-export-text-problems" target="_blank"><text text-anchor="middle" font-size="10px" x="50%" y="100%">Text is not SVG - cannot display</text></a></switch></svg> \ No newline at end of file +<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="1151px" height="711px" viewBox="-0.5 -0.5 1151 711" content="<mxfile host="app.diagrams.net" modified="2024-06-06T13:06:20.290Z" agent="Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.0 Safari/605.1.15" etag="_bzW2ujPehIvRME25DFx" version="24.4.13" type="device"> <diagram name="Page-1" id="jhOoJUkd9Zucpb-pnEYY"> <mxGraphModel dx="2074" dy="816" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="850" pageHeight="1100" background="#ffffff" math="0" shadow="0"> <root> <mxCell id="0" /> <mxCell id="1" parent="0" /> <mxCell id="3kIInuhs_YmBb0iZ2eFI-7" value="&lt;b&gt;Execution layer&lt;/b&gt;" style="verticalAlign=top;align=left;shape=cube;size=10;direction=south;fontStyle=0;html=1;boundedLbl=1;spacingLeft=5;whiteSpace=wrap;rounded=1;" parent="1" vertex="1"> <mxGeometry x="490" y="30" width="450" height="440" as="geometry" /> </mxCell> <mxCell id="3kIInuhs_YmBb0iZ2eFI-63" value="" style="rounded=1;whiteSpace=wrap;html=1;hachureGap=4;fontFamily=Helvetica;strokeColor=default;fillColor=default;glass=0;" parent="3kIInuhs_YmBb0iZ2eFI-7" vertex="1"> <mxGeometry x="10.003376623376589" y="39.550041395623865" width="393.8931818181818" height="227.41573033707866" as="geometry" /> </mxCell> <mxCell id="3kIInuhs_YmBb0iZ2eFI-8" value="&lt;b&gt;Adapter&lt;/b&gt;" style="verticalAlign=top;align=center;shape=cube;size=10;direction=south;html=1;boundedLbl=1;spacingLeft=5;whiteSpace=wrap;rounded=1;" parent="3kIInuhs_YmBb0iZ2eFI-7" vertex="1"> <mxGeometry width="170" height="190" relative="1" as="geometry"> <mxPoint x="30" y="55" as="offset" /> </mxGeometry> </mxCell> <mxCell id="3kIInuhs_YmBb0iZ2eFI-43" value="" style="group;rounded=1;" parent="3kIInuhs_YmBb0iZ2eFI-7" vertex="1" connectable="0"> <mxGeometry x="38.86363636363636" y="304.0449438202247" width="102.27272727272727" height="118.65168539325842" as="geometry" /> </mxCell> <mxCell id="3kIInuhs_YmBb0iZ2eFI-9" value="&lt;b&gt;MoveVM&lt;/b&gt;" style="verticalAlign=top;align=center;shape=cube;size=10;direction=south;html=1;boundedLbl=1;spacingLeft=5;whiteSpace=wrap;rounded=1;" parent="3kIInuhs_YmBb0iZ2eFI-43" vertex="1"> <mxGeometry width="102.27272727272727" height="79.10112359550561" as="geometry" /> </mxCell> <mxCell id="3kIInuhs_YmBb0iZ2eFI-41" value="move-execution/move-vm-runtime" style="rounded=1;whiteSpace=wrap;html=1;" parent="3kIInuhs_YmBb0iZ2eFI-43" vertex="1"> <mxGeometry y="79.10112359550561" width="92.04545454545455" height="39.550561797752806" as="geometry" /> </mxCell> <mxCell id="3kIInuhs_YmBb0iZ2eFI-44" value="" style="group;rounded=1;" parent="3kIInuhs_YmBb0iZ2eFI-7" vertex="1" connectable="0"> <mxGeometry x="296.59090909090907" y="306.51685393258424" width="102.27272727272727" height="118.65168539325842" as="geometry" /> </mxCell> <mxCell id="3kIInuhs_YmBb0iZ2eFI-13" value="&lt;b&gt;Framework&lt;/b&gt;" style="verticalAlign=top;align=center;shape=cube;size=10;direction=south;html=1;boundedLbl=1;spacingLeft=5;whiteSpace=wrap;rounded=1;" parent="3kIInuhs_YmBb0iZ2eFI-44" vertex="1"> <mxGeometry width="102.27272727272727" height="79.10112359550561" as="geometry" /> </mxCell> <mxCell id="3kIInuhs_YmBb0iZ2eFI-42" value="iota-framework crate" style="rounded=1;whiteSpace=wrap;html=1;" parent="3kIInuhs_YmBb0iZ2eFI-44" vertex="1"> <mxGeometry y="79.10112359550561" width="92.04545454545455" height="39.550561797752806" as="geometry" /> </mxCell> <mxCell id="3kIInuhs_YmBb0iZ2eFI-56" value="Init" style="edgeStyle=orthogonalEdgeStyle;rounded=1;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0;entryY=0;entryDx=0;entryDy=45;entryPerimeter=0;curved=0;" parent="3kIInuhs_YmBb0iZ2eFI-7" source="3kIInuhs_YmBb0iZ2eFI-39" target="3kIInuhs_YmBb0iZ2eFI-9" edge="1"> <mxGeometry relative="1" as="geometry" /> </mxCell> <mxCell id="3kIInuhs_YmBb0iZ2eFI-58" value="" style="group;rounded=1;" parent="3kIInuhs_YmBb0iZ2eFI-7" vertex="1" connectable="0"> <mxGeometry x="46.16883116883113" y="88.98824364281488" width="378.4090909090909" height="168.0904080425784" as="geometry" /> </mxCell> <mxCell id="3kIInuhs_YmBb0iZ2eFI-40" value="" style="group;rounded=1;" parent="3kIInuhs_YmBb0iZ2eFI-58" vertex="1" connectable="0"> <mxGeometry width="128.57142857142858" height="138.42696629213484" as="geometry" /> </mxCell> <mxCell id="3kIInuhs_YmBb0iZ2eFI-10" value="&lt;b&gt;Execution-engine&lt;/b&gt;" style="verticalAlign=top;align=center;shape=cube;size=10;direction=south;html=1;boundedLbl=1;spacingLeft=5;whiteSpace=wrap;rounded=1;" parent="3kIInuhs_YmBb0iZ2eFI-40" vertex="1"> <mxGeometry width="128.57142857142856" height="92.63157894736842" as="geometry" /> </mxCell> <mxCell id="3kIInuhs_YmBb0iZ2eFI-39" value="...execution/&lt;span style=&quot;font-family: &amp;quot;Helvetica Neue&amp;quot;; font-size: 13px;&quot;&gt;iota&lt;/span&gt;-adapter/execution-engine" style="rounded=1;whiteSpace=wrap;html=1;" parent="3kIInuhs_YmBb0iZ2eFI-58" vertex="1"> <mxGeometry x="5.849999999999999" y="92.6274157303371" width="109.575" height="45.79955056179776" as="geometry" /> </mxCell> <mxCell id="3kIInuhs_YmBb0iZ2eFI-61" style="edgeStyle=orthogonalEdgeStyle;rounded=1;hachureGap=4;orthogonalLoop=1;jettySize=auto;html=1;exitX=0;exitY=0;exitDx=45;exitDy=100;exitPerimeter=0;entryX=1;entryY=0.206;entryDx=0;entryDy=0;entryPerimeter=0;fontFamily=Architects Daughter;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DArchitects%2BDaughter;curved=0;" parent="3kIInuhs_YmBb0iZ2eFI-7" source="3kIInuhs_YmBb0iZ2eFI-13" target="3kIInuhs_YmBb0iZ2eFI-8" edge="1"> <mxGeometry relative="1" as="geometry" /> </mxCell> <mxCell id="3kIInuhs_YmBb0iZ2eFI-62" value="&lt;h4&gt;&lt;font face=&quot;Helvetica&quot;&gt;native fns etc&lt;/font&gt;&lt;/h4&gt;" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];sketch=1;hachureGap=4;jiggle=2;curveFitting=1;fontFamily=Architects Daughter;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DArchitects%2BDaughter;rounded=1;" parent="3kIInuhs_YmBb0iZ2eFI-61" vertex="1" connectable="0"> <mxGeometry x="-0.1741" y="-1" relative="1" as="geometry"> <mxPoint as="offset" /> </mxGeometry> </mxCell> <mxCell id="3kIInuhs_YmBb0iZ2eFI-45" value="" style="group;rounded=1;" parent="3kIInuhs_YmBb0iZ2eFI-7" vertex="1" connectable="0"> <mxGeometry x="276.1363636363636" y="98.87640449438204" width="102.27272727272727" height="118.65168539325842" as="geometry" /> </mxCell> <mxCell id="3kIInuhs_YmBb0iZ2eFI-48" value="" style="group;rounded=1;" parent="3kIInuhs_YmBb0iZ2eFI-45" vertex="1" connectable="0"> <mxGeometry width="102.27272727272727" height="118.65168539325842" as="geometry" /> </mxCell> <mxCell id="3kIInuhs_YmBb0iZ2eFI-46" value="&lt;b&gt;Object runtime&lt;/b&gt;" style="verticalAlign=top;align=center;shape=cube;size=10;direction=south;html=1;boundedLbl=1;spacingLeft=5;whiteSpace=wrap;rounded=1;" parent="3kIInuhs_YmBb0iZ2eFI-48" vertex="1"> <mxGeometry width="102.27272727272727" height="79.10112359550561" as="geometry" /> </mxCell> <mxCell id="3kIInuhs_YmBb0iZ2eFI-47" value="...execution/&lt;span style=&quot;font-family: &amp;quot;Helvetica Neue&amp;quot;; font-size: 13px;&quot;&gt;iota&lt;/span&gt;-move-natives" style="rounded=1;whiteSpace=wrap;html=1;" parent="3kIInuhs_YmBb0iZ2eFI-48" vertex="1"> <mxGeometry y="79.10112359550561" width="92.04545454545455" height="39.550561797752806" as="geometry" /> </mxCell> <mxCell id="3kIInuhs_YmBb0iZ2eFI-64" value="&lt;span style=&quot;caret-color: rgb(0, 0, 0); color: rgb(0, 0, 0); font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; letter-spacing: normal; text-align: center; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: rgb(251, 251, 251); text-decoration: none; float: none; display: inline !important;&quot;&gt;&lt;b&gt;iota-execution crate&lt;/b&gt;&lt;/span&gt;" style="text;whiteSpace=wrap;html=1;fontFamily=Architects Daughter;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DArchitects%2BDaughter;rounded=1;" parent="3kIInuhs_YmBb0iZ2eFI-7" vertex="1"> <mxGeometry x="268.5363636363636" y="49.43820224719101" width="117.47045454545454" height="29.662921348314605" as="geometry" /> </mxCell> <mxCell id="3kIInuhs_YmBb0iZ2eFI-15" value="&lt;b&gt;Nodes network(Iota node)&lt;/b&gt;" style="verticalAlign=top;align=left;shape=cube;size=10;direction=south;fontStyle=0;html=1;boundedLbl=1;spacingLeft=5;whiteSpace=wrap;rounded=1;" parent="1" vertex="1"> <mxGeometry x="-210" y="30" width="380" height="430" as="geometry" /> </mxCell> <mxCell id="3kIInuhs_YmBb0iZ2eFI-16" value="&lt;b&gt;Node&lt;/b&gt;" style="verticalAlign=top;align=center;shape=cube;size=10;direction=south;html=1;boundedLbl=1;spacingLeft=5;whiteSpace=wrap;rounded=1;" parent="3kIInuhs_YmBb0iZ2eFI-15" vertex="1"> <mxGeometry width="330" height="370" relative="1" as="geometry"> <mxPoint x="20" y="40" as="offset" /> </mxGeometry> </mxCell> <mxCell id="3kIInuhs_YmBb0iZ2eFI-17" value="&lt;b&gt;API&lt;/b&gt;" style="verticalAlign=top;align=center;shape=cube;size=10;direction=south;html=1;boundedLbl=1;spacingLeft=5;whiteSpace=wrap;rounded=1;" parent="3kIInuhs_YmBb0iZ2eFI-15" vertex="1"> <mxGeometry x="42.2239247311828" y="92.97297297297297" width="85.80645161290323" height="267.2972972972973" as="geometry" /> </mxCell> <mxCell id="3kIInuhs_YmBb0iZ2eFI-18" value="&lt;b&gt;Ledger storage&lt;/b&gt;" style="shape=cylinder3;whiteSpace=wrap;html=1;boundedLbl=1;backgroundOutline=1;size=15;rounded=1;" parent="3kIInuhs_YmBb0iZ2eFI-15" vertex="1"> <mxGeometry x="253.33129032258068" y="296.9044851994852" width="73.5483870967742" height="92.97297297297297" as="geometry" /> </mxCell> <mxCell id="3kIInuhs_YmBb0iZ2eFI-65" value="&lt;b&gt;Indexer&lt;/b&gt;&lt;div&gt;&lt;b&gt;(read/sync db)&lt;/b&gt;&lt;/div&gt;" style="shape=cylinder3;whiteSpace=wrap;html=1;boundedLbl=1;backgroundOutline=1;size=15;rounded=1;" parent="3kIInuhs_YmBb0iZ2eFI-15" vertex="1"> <mxGeometry x="153.22580645161293" y="296.9044851994852" width="73.5483870967742" height="92.97297297297297" as="geometry" /> </mxCell> <mxCell id="3kIInuhs_YmBb0iZ2eFI-19" value="&lt;b&gt;Consensus engine&lt;/b&gt;" style="verticalAlign=top;align=center;shape=cube;size=10;direction=south;html=1;boundedLbl=1;spacingLeft=5;whiteSpace=wrap;rounded=1;" parent="3kIInuhs_YmBb0iZ2eFI-15" vertex="1"> <mxGeometry x="142.5" y="81.91" width="97.5" height="78.09" as="geometry" /> </mxCell> <mxCell id="3kIInuhs_YmBb0iZ2eFI-20" value="&lt;b&gt;Network&lt;/b&gt;" style="verticalAlign=top;align=center;shape=cube;size=10;direction=south;html=1;boundedLbl=1;spacingLeft=5;whiteSpace=wrap;rounded=1;" parent="3kIInuhs_YmBb0iZ2eFI-15" vertex="1"> <mxGeometry x="141.25" y="185.91" width="97.5" height="81.43" as="geometry" /> </mxCell> <mxCell id="C7P2nbfdh_euxFz_vEXo-1" value="&lt;b&gt;Core&lt;/b&gt;" style="verticalAlign=top;align=center;shape=cube;size=10;direction=south;html=1;boundedLbl=1;spacingLeft=5;whiteSpace=wrap;rounded=1;" vertex="1" parent="3kIInuhs_YmBb0iZ2eFI-15"> <mxGeometry x="251.77" y="150" width="75.11" height="60" as="geometry" /> </mxCell> <mxCell id="3kIInuhs_YmBb0iZ2eFI-34" value="" style="group;rounded=1;" parent="1" vertex="1" connectable="0"> <mxGeometry x="-150" y="500" width="120" height="74.55" as="geometry" /> </mxCell> <mxCell id="3kIInuhs_YmBb0iZ2eFI-31" value="&lt;b&gt;iota-json-rpc&lt;/b&gt;" style="verticalAlign=top;align=center;shape=cube;size=10;direction=south;html=1;boundedLbl=1;spacingLeft=5;whiteSpace=wrap;movable=1;resizable=1;rotatable=1;deletable=1;editable=1;locked=0;connectable=1;rounded=1;" parent="3kIInuhs_YmBb0iZ2eFI-34" vertex="1"> <mxGeometry width="120" height="50" as="geometry" /> </mxCell> <mxCell id="3kIInuhs_YmBb0iZ2eFI-32" value="&lt;div&gt;iota-json-rpc crate&lt;br&gt;&lt;/div&gt;" style="rounded=1;whiteSpace=wrap;html=1;movable=1;resizable=1;rotatable=1;deletable=1;editable=1;locked=0;connectable=1;" parent="3kIInuhs_YmBb0iZ2eFI-34" vertex="1"> <mxGeometry x="20" y="50.00454545454545" width="80" height="24.545454545454547" as="geometry" /> </mxCell> <mxCell id="3kIInuhs_YmBb0iZ2eFI-36" value="" style="group;rounded=1;" parent="1" vertex="1" connectable="0"> <mxGeometry x="-150" y="670" width="100" height="70" as="geometry" /> </mxCell> <mxCell id="3kIInuhs_YmBb0iZ2eFI-28" value="&lt;b&gt;iota-cli&lt;/b&gt;" style="verticalAlign=top;align=center;shape=cube;size=10;direction=south;html=1;boundedLbl=1;spacingLeft=5;whiteSpace=wrap;rounded=1;" parent="3kIInuhs_YmBb0iZ2eFI-36" vertex="1"> <mxGeometry width="100" height="40" as="geometry" /> </mxCell> <mxCell id="3kIInuhs_YmBb0iZ2eFI-35" value="iota crate" style="rounded=1;whiteSpace=wrap;html=1;" parent="3kIInuhs_YmBb0iZ2eFI-36" vertex="1"> <mxGeometry y="40" width="90" height="30" as="geometry" /> </mxCell> <mxCell id="3kIInuhs_YmBb0iZ2eFI-49" style="edgeStyle=orthogonalEdgeStyle;rounded=1;orthogonalLoop=1;jettySize=auto;html=1;exitX=0;exitY=0;exitDx=0;exitDy=45;exitPerimeter=0;entryX=0.5;entryY=1;entryDx=0;entryDy=0;curved=0;" parent="1" source="3kIInuhs_YmBb0iZ2eFI-28" target="3kIInuhs_YmBb0iZ2eFI-32" edge="1"> <mxGeometry relative="1" as="geometry" /> </mxCell> <mxCell id="3kIInuhs_YmBb0iZ2eFI-50" style="edgeStyle=orthogonalEdgeStyle;rounded=1;orthogonalLoop=1;jettySize=auto;html=1;exitX=0;exitY=0;exitDx=0;exitDy=55;exitPerimeter=0;entryX=0.5;entryY=1;entryDx=0;entryDy=0;entryPerimeter=0;" parent="1" source="3kIInuhs_YmBb0iZ2eFI-31" target="3kIInuhs_YmBb0iZ2eFI-65" edge="1"> <mxGeometry relative="1" as="geometry" /> </mxCell> <mxCell id="C7P2nbfdh_euxFz_vEXo-6" style="edgeStyle=orthogonalEdgeStyle;rounded=1;hachureGap=4;orthogonalLoop=1;jettySize=auto;html=1;entryX=1;entryY=0.5;entryDx=0;entryDy=0;entryPerimeter=0;fontFamily=Architects Daughter;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DArchitects%2BDaughter;" edge="1" parent="1" source="3kIInuhs_YmBb0iZ2eFI-7" target="3kIInuhs_YmBb0iZ2eFI-18"> <mxGeometry relative="1" as="geometry" /> </mxCell> <mxCell id="C7P2nbfdh_euxFz_vEXo-11" style="edgeStyle=orthogonalEdgeStyle;rounded=1;hachureGap=4;orthogonalLoop=1;jettySize=auto;html=1;exitX=0;exitY=0;exitDx=32.385;exitDy=0;exitPerimeter=0;entryX=0.407;entryY=1;entryDx=0;entryDy=0;entryPerimeter=0;fontFamily=Architects Daughter;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DArchitects%2BDaughter;" edge="1" parent="1" source="C7P2nbfdh_euxFz_vEXo-1" target="3kIInuhs_YmBb0iZ2eFI-7"> <mxGeometry relative="1" as="geometry" /> </mxCell> </root> </mxGraphModel> </diagram> </mxfile> " style="background-color: rgb(255, 255, 255);"><defs/><rect fill="#ffffff" width="100%" height="100%" x="0" y="0"/><g><g><path d="M 705 -5 L 1135 -5 L 1145 5 L 1145 445 L 715 445 L 705 435 L 705 -5 Z" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" transform="rotate(90,925,220)" pointer-events="all"/><path d="M 715 445 L 715 5 L 705 -5 M 715 5 L 1145 5" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" transform="rotate(90,925,220)" pointer-events="all"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe flex-start; justify-content: unsafe flex-start; width: 433px; height: 1px; padding-top: 17px; margin-left: 707px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: left;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><b>Execution layer</b></div></div></div></foreignObject><text x="707" y="29" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px">Execution layer</text></switch></g></g><g><rect x="710" y="39.55" width="393.89" height="227.42" rx="34.11" ry="34.11" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="all"/></g><g><path d="M 720 65 L 900 65 L 910 75 L 910 235 L 730 235 L 720 225 L 720 65 Z" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" transform="rotate(90,815,150)" pointer-events="all"/><path d="M 730 235 L 730 75 L 720 65 M 730 75 L 910 75" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" transform="rotate(90,815,150)" pointer-events="all"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe flex-start; justify-content: unsafe center; width: 153px; height: 1px; padding-top: 72px; margin-left: 736px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><b>Adapter</b></div></div></div></foreignObject><text x="813" y="84" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">Adapter</text></switch></g></g><g/><g><path d="M 750.45 292.46 L 819.55 292.46 L 829.55 302.46 L 829.55 394.73 L 760.45 394.73 L 750.45 384.73 L 750.45 292.46 Z" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" transform="rotate(90,790,343.6)" pointer-events="all"/><path d="M 760.45 394.73 L 760.45 302.46 L 750.45 292.46 M 760.45 302.46 L 829.55 302.46" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" transform="rotate(90,790,343.6)" pointer-events="all"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe flex-start; justify-content: unsafe center; width: 85px; height: 1px; padding-top: 321px; margin-left: 745px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><b>MoveVM</b></div></div></div></foreignObject><text x="788" y="333" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">MoveVM</text></switch></g></g><g><rect x="738.86" y="383.15" width="92.05" height="39.55" rx="5.93" ry="5.93" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="all"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 90px; height: 1px; padding-top: 403px; margin-left: 740px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">move-execution/move-vm-runtime</div></div></div></foreignObject><text x="785" y="407" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">move-execution/...</text></switch></g></g><g/><g><path d="M 1008.18 294.93 L 1077.28 294.93 L 1087.28 304.93 L 1087.28 397.2 L 1018.18 397.2 L 1008.18 387.2 L 1008.18 294.93 Z" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" transform="rotate(90,1047.73,346.07)" pointer-events="all"/><path d="M 1018.18 397.2 L 1018.18 304.93 L 1008.18 294.93 M 1018.18 304.93 L 1087.28 304.93" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" transform="rotate(90,1047.73,346.07)" pointer-events="all"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe flex-start; justify-content: unsafe center; width: 85px; height: 1px; padding-top: 324px; margin-left: 1003px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><b>Framework</b></div></div></div></foreignObject><text x="1045" y="336" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">Framework</text></switch></g></g><g><rect x="996.59" y="385.62" width="92.05" height="39.55" rx="5.93" ry="5.93" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="all"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 90px; height: 1px; padding-top: 405px; margin-left: 998px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">iota-framework crate</div></div></div></foreignObject><text x="1043" y="409" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">iota-framework...</text></switch></g></g><g><path d="M 806.81 227.42 L 806.8 255.7 Q 806.8 265.7 801.45 265.7 L 798.77 265.7 Q 796.1 265.7 796.11 275.7 L 796.13 297.68" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 796.14 302.93 L 792.63 295.93 L 796.13 297.68 L 799.63 295.92 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 266px; margin-left: 801px;"><div data-drawio-colors="color: rgb(0, 0, 0); background-color: rgb(255, 255, 255); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 11px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; background-color: rgb(255, 255, 255); white-space: nowrap;">Init</div></div></div></foreignObject><text x="801" y="269" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="11px" text-anchor="middle">Init</text></switch></g></g><g/><g/><g><path d="M 764.14 71.02 L 846.77 71.02 L 856.77 81.02 L 856.77 199.59 L 774.14 199.59 L 764.14 189.59 L 764.14 71.02 Z" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" transform="rotate(90,810.45,135.3)" pointer-events="all"/><path d="M 774.14 199.59 L 774.14 81.02 L 764.14 71.02 M 774.14 81.02 L 856.77 81.02" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" transform="rotate(90,810.45,135.3)" pointer-events="all"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe flex-start; justify-content: unsafe center; width: 112px; height: 1px; padding-top: 106px; margin-left: 752px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><b>Execution-engine</b></div></div></div></foreignObject><text x="808" y="118" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">Execution-engine</text></switch></g></g><g><rect x="752.02" y="181.62" width="109.58" height="45.8" rx="6.87" ry="6.87" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="all"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 108px; height: 1px; padding-top: 205px; margin-left: 753px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">...execution/<span style="font-family: "Helvetica Neue"; font-size: 13px;">iota</span>-adapter/execution-engine</div></div></div></foreignObject><text x="807" y="208" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">...execution/iota-...</text></switch></g></g><g><path d="M 998.86 351.52 L 875 351.5 Q 865 351.5 865 341.5 L 864.98 251.37" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 864.98 246.12 L 868.48 253.12 L 864.98 251.37 L 861.48 253.12 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 351px; margin-left: 900px;"><div data-drawio-colors="color: rgb(0, 0, 0); background-color: rgb(255, 255, 255); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 11px; font-family: "Architects Daughter"; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; background-color: rgb(255, 255, 255); white-space: nowrap;"><h4><font face="Helvetica">native fns etc</font></h4></div></div></div></foreignObject><text x="900" y="354" fill="rgb(0, 0, 0)" font-family="Architects Daughter" font-size="11px" text-anchor="middle">native fns etc</text></switch></g></g><g/><g/><g><path d="M 987.72 87.29 L 1056.82 87.29 L 1066.82 97.29 L 1066.82 189.56 L 997.72 189.56 L 987.72 179.56 L 987.72 87.29 Z" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" transform="rotate(90,1027.27,138.43)" pointer-events="all"/><path d="M 997.72 189.56 L 997.72 97.29 L 987.72 87.29 M 997.72 97.29 L 1066.82 97.29" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" transform="rotate(90,1027.27,138.43)" pointer-events="all"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe flex-start; justify-content: unsafe center; width: 85px; height: 1px; padding-top: 116px; margin-left: 982px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><b>Object runtime</b></div></div></div></foreignObject><text x="1025" y="128" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">Object runtime</text></switch></g></g><g><rect x="976.14" y="177.98" width="92.05" height="39.55" rx="5.93" ry="5.93" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="all"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 90px; height: 1px; padding-top: 198px; margin-left: 977px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">...execution/<span style="font-family: "Helvetica Neue"; font-size: 13px;">iota</span>-move-natives</div></div></div></foreignObject><text x="1022" y="201" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">...execution/io...</text></switch></g></g><g><rect x="968.54" y="49.44" width="117.47" height="29.66" rx="4.45" ry="4.45" fill="none" stroke="none" pointer-events="all"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe flex-start; justify-content: unsafe flex-start; width: 115px; height: 1px; padding-top: 56px; margin-left: 971px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: left;"><div style="display: inline-block; font-size: 12px; font-family: "Architects Daughter"; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><span style="caret-color: rgb(0, 0, 0); color: rgb(0, 0, 0); font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; letter-spacing: normal; text-align: center; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: rgb(251, 251, 251); text-decoration: none; float: none; display: inline !important;"><b>iota-execution crate</b></span></div></div></div></foreignObject><text x="971" y="68" fill="rgb(0, 0, 0)" font-family="Architects Daughter" font-size="12px">iota-execution crate</text></switch></g></g><g><path d="M -25 25 L 395 25 L 405 35 L 405 405 L -15 405 L -25 395 L -25 25 Z" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" transform="rotate(90,190,215)" pointer-events="all"/><path d="M -15 405 L -15 35 L -25 25 M -15 35 L 405 35" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" transform="rotate(90,190,215)" pointer-events="all"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe flex-start; justify-content: unsafe flex-start; width: 363px; height: 1px; padding-top: 17px; margin-left: 7px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: left;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><b>Nodes network(Iota node)</b></div></div></div></foreignObject><text x="7" y="29" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px">Nodes network(Iota node)</text></switch></g></g><g><path d="M 0 60 L 360 60 L 370 70 L 370 390 L 10 390 L 0 380 L 0 60 Z" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" transform="rotate(90,185,225)" pointer-events="all"/><path d="M 10 390 L 10 70 L 0 60 M 10 70 L 370 70" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" transform="rotate(90,185,225)" pointer-events="all"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe flex-start; justify-content: unsafe center; width: 313px; height: 1px; padding-top: 57px; margin-left: 26px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><b>Node</b></div></div></div></foreignObject><text x="183" y="69" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">Node</text></switch></g></g><g><path d="M -48.52 183.72 L 208.78 183.72 L 218.78 193.72 L 218.78 269.52 L -38.52 269.52 L -48.52 259.52 L -48.52 183.72 Z" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" transform="rotate(90,85.13,226.62)" pointer-events="all"/><path d="M -38.52 269.52 L -38.52 193.72 L -48.52 183.72 M -38.52 193.72 L 218.78 193.72" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" transform="rotate(90,85.13,226.62)" pointer-events="all"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe flex-start; justify-content: unsafe center; width: 69px; height: 1px; padding-top: 110px; margin-left: 48px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><b>API</b></div></div></div></foreignObject><text x="83" y="122" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">API</text></switch></g></g><g><path d="M 253.33 311.9 C 253.33 303.62 269.8 296.9 290.11 296.9 C 299.86 296.9 309.21 298.48 316.11 301.3 C 323.01 304.11 326.88 307.93 326.88 311.9 L 326.88 374.88 C 326.88 383.16 310.42 389.88 290.11 389.88 C 269.8 389.88 253.33 383.16 253.33 374.88 Z" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><path d="M 326.88 311.9 C 326.88 320.19 310.42 326.9 290.11 326.9 C 269.8 326.9 253.33 320.19 253.33 311.9" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 72px; height: 1px; padding-top: 356px; margin-left: 254px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><b>Ledger storage</b></div></div></div></foreignObject><text x="290" y="359" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">Ledger stora...</text></switch></g></g><g><path d="M 153.23 311.9 C 153.23 303.62 169.69 296.9 190 296.9 C 199.75 296.9 209.11 298.48 216 301.3 C 222.9 304.11 226.77 307.93 226.77 311.9 L 226.77 374.88 C 226.77 383.16 210.31 389.88 190 389.88 C 169.69 389.88 153.23 383.16 153.23 374.88 Z" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><path d="M 226.77 311.9 C 226.77 320.19 210.31 326.9 190 326.9 C 169.69 326.9 153.23 320.19 153.23 311.9" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 72px; height: 1px; padding-top: 356px; margin-left: 154px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><b>Indexer</b><div><b>(read/sync db)</b></div></div></div></div></foreignObject><text x="190" y="359" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">Indexer...</text></switch></g></g><g><path d="M 152.2 72.2 L 220.29 72.2 L 230.29 82.2 L 230.29 169.7 L 162.2 169.7 L 152.2 159.7 L 152.2 72.2 Z" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" transform="rotate(90,191.25,120.95)" pointer-events="all"/><path d="M 162.2 169.7 L 162.2 82.2 L 152.2 72.2 M 162.2 82.2 L 230.29 82.2" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" transform="rotate(90,191.25,120.95)" pointer-events="all"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe flex-start; justify-content: unsafe center; width: 81px; height: 1px; padding-top: 99px; margin-left: 149px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><b>Consensus engine</b></div></div></div></foreignObject><text x="189" y="111" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">Consensus engi...</text></switch></g></g><g><path d="M 149.29 177.88 L 220.72 177.88 L 230.72 187.88 L 230.72 275.38 L 159.29 275.38 L 149.29 265.38 L 149.29 177.88 Z" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" transform="rotate(90,190,226.63)" pointer-events="all"/><path d="M 159.29 275.38 L 159.29 187.88 L 149.29 177.88 M 159.29 187.88 L 230.72 187.88" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" transform="rotate(90,190,226.63)" pointer-events="all"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe flex-start; justify-content: unsafe center; width: 81px; height: 1px; padding-top: 203px; margin-left: 147px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><b>Network</b></div></div></div></foreignObject><text x="188" y="215" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">Network</text></switch></g></g><g><path d="M 259.32 142.45 L 309.32 142.45 L 319.32 152.45 L 319.32 217.56 L 269.32 217.56 L 259.32 207.56 L 259.32 142.45 Z" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" transform="rotate(90,289.32,180)" pointer-events="all"/><path d="M 269.32 217.56 L 269.32 152.45 L 259.32 142.45 M 269.32 152.45 L 319.32 152.45" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" transform="rotate(90,289.32,180)" pointer-events="all"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe flex-start; justify-content: unsafe center; width: 58px; height: 1px; padding-top: 167px; margin-left: 258px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><b>Core</b></div></div></div></foreignObject><text x="287" y="179" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">Core</text></switch></g></g><g/><g><path d="M 95 435 L 135 435 L 145 445 L 145 555 L 105 555 L 95 545 L 95 435 Z" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" transform="rotate(90,120,495)" pointer-events="all"/><path d="M 105 555 L 105 445 L 95 435 M 105 445 L 145 445" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" transform="rotate(90,120,495)" pointer-events="all"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe flex-start; justify-content: unsafe center; width: 103px; height: 1px; padding-top: 487px; margin-left: 66px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><b>iota-json-rpc</b></div></div></div></foreignObject><text x="118" y="499" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">iota-json-rpc</text></switch></g></g><g><rect x="80" y="520" width="80" height="24.55" rx="3.68" ry="3.68" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="all"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 78px; height: 1px; padding-top: 532px; margin-left: 81px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><div>iota-json-rpc crate<br /></div></div></div></div></foreignObject><text x="120" y="536" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">iota-json-rpc...</text></switch></g></g><g/><g><path d="M 90 610 L 120 610 L 130 620 L 130 710 L 100 710 L 90 700 L 90 610 Z" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" transform="rotate(90,110,660)" pointer-events="all"/><path d="M 100 710 L 100 620 L 90 610 M 100 620 L 130 620" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" transform="rotate(90,110,660)" pointer-events="all"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe flex-start; justify-content: unsafe center; width: 83px; height: 1px; padding-top: 657px; margin-left: 66px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><b>iota-cli</b></div></div></div></foreignObject><text x="108" y="669" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">iota-cli</text></switch></g></g><g><rect x="60" y="680" width="90" height="30" rx="4.5" ry="4.5" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="all"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 88px; height: 1px; padding-top: 695px; margin-left: 61px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">iota crate</div></div></div></foreignObject><text x="105" y="699" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">iota crate</text></switch></g></g><g><path d="M 115 640 L 115 602.3 Q 115 592.3 117.5 592.3 L 118.75 592.3 Q 120 592.3 120 582.3 L 120 550.92" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 120 545.67 L 123.5 552.67 L 120 550.92 L 116.5 552.67 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/></g><g><path d="M 125 470 L 125 440 Q 125 430 135 430 L 180 430 Q 190 430 190 420 L 190 396.25" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 190 391 L 193.5 398 L 190 396.25 L 186.5 398 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/></g><g><path d="M 700 220 L 523.4 220 Q 513.4 220 513.4 230 L 513.4 333.4 Q 513.4 343.4 503.4 343.4 L 333.25 343.39" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 328 343.39 L 335 339.89 L 333.25 343.39 L 335 346.89 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/></g><g><path d="M 326.88 182.39 L 503.5 182.4 Q 513.5 182.4 513.5 180.75 L 513.5 179.92 Q 513.5 179.1 523.5 179.1 L 693.63 179.08" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 698.88 179.08 L 691.88 182.58 L 693.63 179.08 L 691.88 175.58 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/></g></g><switch><g requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"/><a transform="translate(0,-5)" xlink:href="https://www.drawio.com/doc/faq/svg-export-text-problems" target="_blank"><text text-anchor="middle" font-size="10px" x="50%" y="100%">Text is not SVG - cannot display</text></a></switch></svg> \ No newline at end of file diff --git a/docs/site/static/json/developer/getting-started/connect.json b/docs/site/static/json/developer/getting-started/connect.json index 9f62706071a..7e155759c20 100644 --- a/docs/site/static/json/developer/getting-started/connect.json +++ b/docs/site/static/json/developer/getting-started/connect.json @@ -11,7 +11,7 @@ { "questionText": "When first running the 'iota client' command, what happens if you press Enter without specifying a node URL?", "answerOptions": [ - { "answerText": "It connects to the Devnet", "isCorrect": true }, + { "answerText": "It connects to the Testnet", "isCorrect": true }, { "answerText": "It exits the program", "isCorrect": false }, { "answerText": "It connects to the Mainnet", "isCorrect": false }, { "answerText": "It shows an error message", "isCorrect": false } diff --git a/docs/site/static/json/developer/getting-started/create-a-package.json b/docs/site/static/json/developer/getting-started/create-a-package.json index d2411c38815..23a5799d24d 100644 --- a/docs/site/static/json/developer/getting-started/create-a-package.json +++ b/docs/site/static/json/developer/getting-started/create-a-package.json @@ -1,29 +1,38 @@ [ { - "questionText": "What is the purpose of the `key` ability in a struct declaration in Move?", + "questionText": "What is the command to create a new IOTA Move package called 'my_first_package'?", "answerOptions": [ - { "answerText": "It allows a struct to be stored and transferred.", "isCorrect": true }, - { "answerText": "It allows a struct to be copied.", "isCorrect": false }, - { "answerText": "It allows a struct to be dropped or discarded.", "isCorrect": false }, - { "answerText": "It allows a struct to be stored within structs with the `key` ability.", "isCorrect": false } + { "answerText": "iota move new my_first_package", "isCorrect": true }, + { "answerText": "iota create package my_first_package", "isCorrect": false }, + { "answerText": "iota new package my_first_package", "isCorrect": false }, + { "answerText": "iota init my_first_package", "isCorrect": false } ] }, { - "questionText": "Which ability allows a struct to be discarded in Move?", + "questionText": "What is the purpose of the Move.toml file in an IOTA Move package?", "answerOptions": [ - { "answerText": "`copy`", "isCorrect": false }, - { "answerText": "`drop`", "isCorrect": true }, - { "answerText": "`key`", "isCorrect": false }, - { "answerText": "`store`", "isCorrect": false } + { "answerText": "It is the package's manifest that describes the package and its dependencies.", "isCorrect": true }, + { "answerText": "It contains the source code of the modules.", "isCorrect": false }, + { "answerText": "It stores compiled bytecode.", "isCorrect": false }, + { "answerText": "It is used to manage version control.", "isCorrect": false } ] }, { - "questionText": "How do you denote a comment in a `.move` file?", + "questionText": "In .toml files, which character is used to denote a comment?", "answerOptions": [ - { "answerText": "Using double slashes `//`", "isCorrect": true }, - { "answerText": "Using `/* ... */`", "isCorrect": false }, - { "answerText": "Using `#`", "isCorrect": false }, - { "answerText": "Using `--`", "isCorrect": false } + { "answerText": "Hash mark (#)", "isCorrect": true }, + { "answerText": "Double slash (//)", "isCorrect": false }, + { "answerText": "Semicolon (;)", "isCorrect": false }, + { "answerText": "Percent sign (%)", "isCorrect": false } + ] + }, + { + "questionText": "How can you resolve version conflicts in dependencies in the [dependencies] section?", + "answerOptions": [ + { "answerText": "By adding the 'override' field to the dependency", "isCorrect": true }, + { "answerText": "By removing the conflicting dependency", "isCorrect": false }, + { "answerText": "By renaming the dependency", "isCorrect": false }, + { "answerText": "By using a different package manager", "isCorrect": false } ] } ] diff --git a/docs/site/static/json/developer/getting-started/local-network.json b/docs/site/static/json/developer/getting-started/local-network.json index 23a5799d24d..4396fab85bb 100644 --- a/docs/site/static/json/developer/getting-started/local-network.json +++ b/docs/site/static/json/developer/getting-started/local-network.json @@ -1,38 +1,86 @@ [ - { - "questionText": "What is the command to create a new IOTA Move package called 'my_first_package'?", - "answerOptions": [ - { "answerText": "iota move new my_first_package", "isCorrect": true }, - { "answerText": "iota create package my_first_package", "isCorrect": false }, - { "answerText": "iota new package my_first_package", "isCorrect": false }, - { "answerText": "iota init my_first_package", "isCorrect": false } - ] - }, - { - "questionText": "What is the purpose of the Move.toml file in an IOTA Move package?", - "answerOptions": [ - { "answerText": "It is the package's manifest that describes the package and its dependencies.", "isCorrect": true }, - { "answerText": "It contains the source code of the modules.", "isCorrect": false }, - { "answerText": "It stores compiled bytecode.", "isCorrect": false }, - { "answerText": "It is used to manage version control.", "isCorrect": false } - ] - }, - { - "questionText": "In .toml files, which character is used to denote a comment?", - "answerOptions": [ - { "answerText": "Hash mark (#)", "isCorrect": true }, - { "answerText": "Double slash (//)", "isCorrect": false }, - { "answerText": "Semicolon (;)", "isCorrect": false }, - { "answerText": "Percent sign (%)", "isCorrect": false } - ] - }, - { - "questionText": "How can you resolve version conflicts in dependencies in the [dependencies] section?", - "answerOptions": [ - { "answerText": "By adding the 'override' field to the dependency", "isCorrect": true }, - { "answerText": "By removing the conflicting dependency", "isCorrect": false }, - { "answerText": "By renaming the dependency", "isCorrect": false }, - { "answerText": "By using a different package manager", "isCorrect": false } - ] - } -] + { + "questionText": "What command is used to start a local IOTA network with a test token faucet?", + "answerOptions": [ + { + "answerText": "RUST_LOG=\"off,iota_node=info\" cargo run --bin iota iota", + "isCorrect": false + }, + { + "answerText": "RUST_LOG=\"off,iota_node=info\" cargo run --bin iota start --force-regenesis --with-faucet", + "isCorrect": true + }, + { + "answerText": "RUST_LOG=\"off,iota_node=info\" cargo run --bin iota client", + "isCorrect": false + }, + { + "answerText": "cargo run --bin iota stop", + "isCorrect": false + } + ] + }, + { + "questionText": "Which flag should be used to persist data on the local network instead of using --force-regenesis?", + "answerOptions": [ + { + "answerText": "--config-dir", + "isCorrect": true + }, + { + "answerText": "--persist-data", + "isCorrect": false + }, + { + "answerText": "--save-state", + "isCorrect": false + }, + { + "answerText": "--data-dir", + "isCorrect": false + } + ] + }, + { + "questionText": "How can you retrieve the total transaction count from your local network using cURL?", + "answerOptions": [ + { + "answerText": "curl --location --request GET 'http://127.0.0.1:9000' --header 'Content-Type: application/json' --data-raw '{\"jsonrpc\": \"2.0\", \"id\": 1, \"method\": \"iota_getTotalTransactionBlocks\", \"params\": []}'", + "isCorrect": false + }, + { + "answerText": "curl --location --request POST 'http://127.0.0.1:9000' --header 'Content-Type: application/json' --data-raw '{\"jsonrpc\": \"2.0\", \"id\": 1, \"method\": \"iota_getTotalTransactionBlocks\", \"params\": []}'", + "isCorrect": true + }, + { + "answerText": "curl --location --request POST 'http://127.0.0.1:9000' --header 'Content-Type: application/json' --data-raw '{\"jsonrpc\": \"2.0\", \"id\": 1, \"method\": \"iota_getTransactionCount\", \"params\": []}'", + "isCorrect": false + }, + { + "answerText": "curl --location --request GET 'http://127.0.0.1:9000' --header 'Content-Type: application/json' --data-raw '{\"jsonrpc\": \"2.0\", \"id\": 1, \"method\": \"iota_getTransactionCount\", \"params\": []}'", + "isCorrect": false + } + ] + }, + { + "questionText": "What command is used to create a new environment for the IOTA Client CLI with an alias local and RPC URL http://127.0.0.1:9000?", + "answerOptions": [ + { + "answerText": "iota client new-env --alias local --rpc http://127.0.0.1:9000", + "isCorrect": true + }, + { + "answerText": "iota client create-env --alias local --rpc http://127.0.0.1:9000", + "isCorrect": false + }, + { + "answerText": "iota client setup-env --alias local --rpc http://127.0.0.1:9000", + "isCorrect": false + }, + { + "answerText": "iota client init-env --alias local --rpc http://127.0.0.1:9000", + "isCorrect": false + } + ] + } +] \ No newline at end of file From 857d515b5c8fc2a9c46a799632fb1094e03567ea Mon Sep 17 00:00:00 2001 From: Lucas Tortora <85233773+lucas-tortora@users.noreply.github.com> Date: Fri, 13 Dec 2024 12:44:03 -0300 Subject: [PATCH 52/97] fix(devx): add / before references urls (#4466) --- docs/content/references/references.mdx | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/docs/content/references/references.mdx b/docs/content/references/references.mdx index 27a91e3f343..9af3db0656b 100644 --- a/docs/content/references/references.mdx +++ b/docs/content/references/references.mdx @@ -11,7 +11,7 @@ Reference the IOTA framework and IOTA RPC documentation for details of the code <Cards> -<Card title="JSON-RPC" href="references/iota-api"> +<Card title="JSON-RPC" href="/references/iota-api"> A public service that enables interacting with the IOTA network. </Card> </Cards> @@ -21,7 +21,7 @@ A public service that enables interacting with the IOTA network. Move powers smart contract logic for the IOTA blockchain. Use these resources to learn Move or refresh your memory. <Cards> -<Card title="IOTA framework" href="references/framework"/> +<Card title="IOTA framework" href="/references/framework"/> <Card title="Move language" href="https://github.com/move-language/move/blob/main/language/documentation/book/src/introduction.md"> Documentation for the Move programming language on GitHub. </Card> @@ -32,13 +32,13 @@ Documentation for the Move programming language on GitHub. Interact directly with IOTA networks and its features using the IOTA command line interface (CLI). The CLI is divided into separate base commands that target a specific set of features. <Cards> -<Card title="IOTA Client CLI" href="references/cli/client"> +<Card title="IOTA Client CLI" href="/references/cli/client"> Create a client on a IOTA network to generate addresses, access networks, and more with the IOTA Client CLI. </Card> -<Card title="IOTA Client PTB CLI" href="references/cli/ptb"> +<Card title="IOTA Client PTB CLI" href="/references/cli/ptb"> Build, preview, and execute programmable transaction blocks directly from your terminal with the IOTA Client PTB CLI. </Card> -<Card title="IOTA Move CLI" href="references/cli/move"> +<Card title="IOTA Move CLI" href="/references/cli/move"> Access IOTA Move functions on chain using the IOTA Move CLI. </Card> </Cards> @@ -48,8 +48,8 @@ Access IOTA Move functions on chain using the IOTA Move CLI. Official software development kits (SDKs) available for IOTA include the TypeScript SDK and Rust SDK. <Cards> -<Card title="IOTA TypeScript SDK" href="references/ts-sdk/typescript"> +<Card title="IOTA TypeScript SDK" href="/references/ts-sdk/typescript"> The IOTA TypeScript SDK has its own microsite. Click this box to go there. </Card> -<Card title="IOTA Rust SDK" href="references/rust-sdk"/> +<Card title="IOTA Rust SDK" href="/references/rust-sdk"/> </Cards> From 599ad39fd55c5dd3d273e7189a19ca1e042b560b Mon Sep 17 00:00:00 2001 From: Konstantinos Demartinos <konstantinos.demartinos@iota.org> Date: Fri, 13 Dec 2024 18:00:49 +0200 Subject: [PATCH 53/97] fix(ci): iota-rosetta validation (#4496) * refactor(ci): skip on condition genesis creation for rosetta setup Since there is no cleanup in the setup and we use a self-hosted runner, the genesis persists between runs. * fix(iota-rosetta): disable historical balance checks We don't support account-balances lookups at specific heights (at least in a trivial matter). So the following applies ``` $ ./bin/rosetta-cli check:data --help By default, account balances are looked up at specific heights (instead of only at the current block). If your node does not support this functionality set historical balance disabled to true. This will make reconciliation much less efficient but it will still work. ``` * fixup! refactor(ci): skip on condition genesis creation for rosetta setup * fixup! fixup! refactor(ci): skip on condition genesis creation for rosetta setup --- .github/scripts/rosetta/setup.sh | 9 ++++----- crates/iota-rosetta/resources/rosetta_cli.json | 4 ++-- 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/.github/scripts/rosetta/setup.sh b/.github/scripts/rosetta/setup.sh index 308006ca289..b85acf125eb 100755 --- a/.github/scripts/rosetta/setup.sh +++ b/.github/scripts/rosetta/setup.sh @@ -7,12 +7,11 @@ echo "Install binaries" cargo install --locked --bin iota --path crates/iota cargo install --locked --bin iota-rosetta --path crates/iota-rosetta -echo "create dedicated config dir for IOTA genesis" -CONFIG_DIR="~/.iota/rosetta_config" -mkdir -p $CONFIG_DIR - echo "run IOTA genesis" -iota genesis -f --working-dir $CONFIG_DIR +CONFIG_DIR=~/.iota/iota_config +if ! [ -d "$CONFIG_DIR" ]; then + iota genesis +fi echo "generate rosetta configuration" iota-rosetta generate-rosetta-cli-config --online-url http://127.0.0.1:9002 --offline-url http://127.0.0.1:9003 diff --git a/crates/iota-rosetta/resources/rosetta_cli.json b/crates/iota-rosetta/resources/rosetta_cli.json index 142f39a68e9..9c65a1d32d3 100644 --- a/crates/iota-rosetta/resources/rosetta_cli.json +++ b/crates/iota-rosetta/resources/rosetta_cli.json @@ -34,7 +34,7 @@ "log_balance_changes": false, "log_reconciliations": false, "ignore_reconciliation_error": false, - "historical_balance_disabled": false, + "historical_balance_disabled": true, "exempt_accounts": "", "bootstrap_balances": "", "interesting_accounts": "", @@ -55,4 +55,4 @@ } }, "perf": null -} \ No newline at end of file +} From ce3b7f0d4201416135c318bfe3b8764510504466 Mon Sep 17 00:00:00 2001 From: DaughterOfMars <chloedaughterofmars@gmail.com> Date: Mon, 16 Dec 2024 03:47:58 -0500 Subject: [PATCH 54/97] chore(lints): Use expect over allow (#4402) * chore(clippy): Use expect over allow * add comment * fix release warning * revert type complexity allow * review * revert trait config * another revert --------- Co-authored-by: Thibault Martinez <thibault@iota.org> --- consensus/core/src/authority_node.rs | 6 +- consensus/core/src/base_committer.rs | 12 +-- consensus/core/src/block_verifier.rs | 3 +- consensus/core/src/commit.rs | 1 - consensus/core/src/core.rs | 2 +- consensus/core/src/leader_schedule.rs | 2 +- consensus/core/src/leader_scoring_strategy.rs | 2 +- consensus/core/src/network/metrics_layer.rs | 2 +- consensus/core/src/stake_aggregator.rs | 3 +- consensus/core/src/storage/mem_store.rs | 3 - consensus/core/src/storage/mod.rs | 6 +- consensus/core/src/storage/rocksdb_store.rs | 8 +- consensus/core/src/synchronizer.rs | 13 +-- consensus/core/src/test_dag_builder.rs | 21 ++-- consensus/core/src/transaction.rs | 3 +- consensus/core/src/universal_committer.rs | 2 +- .../src/analytics_processor.rs | 4 +- crates/iota-archival/src/lib.rs | 2 +- crates/iota-aws-orchestrator/src/benchmark.rs | 1 - crates/iota-aws-orchestrator/src/monitor.rs | 3 +- crates/iota-benchmark/src/drivers/mod.rs | 1 - crates/iota-benchmark/src/lib.rs | 2 +- crates/iota-bridge/src/action_executor.rs | 97 ++++++++----------- .../iota-bridge/src/e2e_tests/test_utils.rs | 1 - crates/iota-bridge/src/eth_syncer.rs | 1 - crates/iota-bridge/src/iota_mock_client.rs | 2 +- crates/iota-bridge/src/monitor.rs | 2 +- crates/iota-bridge/src/orchestrator.rs | 2 +- crates/iota-bridge/src/server/mock_handler.rs | 2 +- crates/iota-cluster-test/src/lib.rs | 1 - .../iota-common/src/sync/async_once_cell.rs | 2 +- crates/iota-common/src/sync/notify_once.rs | 2 +- crates/iota-config/src/genesis.rs | 2 +- crates/iota-core/src/authority.rs | 7 +- .../authority/authority_per_epoch_store.rs | 15 ++- .../src/authority/authority_store.rs | 2 +- .../src/authority/authority_store_types.rs | 16 +-- .../authority/epoch_start_configuration.rs | 2 +- crates/iota-core/src/authority_aggregator.rs | 4 +- .../checkpoints/checkpoint_executor/mod.rs | 2 +- crates/iota-core/src/checkpoints/mod.rs | 4 +- crates/iota-core/src/connection_monitor.rs | 4 +- crates/iota-core/src/consensus_adapter.rs | 3 +- crates/iota-core/src/epoch/randomness.rs | 5 +- crates/iota-core/src/overload_monitor.rs | 2 +- crates/iota-core/src/stake_aggregator.rs | 2 +- crates/iota-core/src/test_utils.rs | 7 +- crates/iota-core/src/transaction_manager.rs | 3 +- .../iota-core/src/transaction_orchestrator.rs | 2 +- .../unit_tests/authority_aggregator_tests.rs | 4 +- .../src/unit_tests/execution_driver_tests.rs | 2 +- .../unit_tests/transaction_manager_tests.rs | 2 +- .../unit_tests/transfer_to_object_tests.rs | 2 +- .../tests/dynamic_committee_tests.rs | 6 +- .../tests/shared_objects_tests.rs | 1 - .../iota-faucet/src/faucet/simple_faucet.rs | 2 +- crates/iota-genesis-builder/src/lib.rs | 2 +- .../src/stardust/migration/mod.rs | 2 +- crates/iota-graphql-config/src/lib.rs | 2 +- .../iota-graphql-rpc-client/src/response.rs | 4 +- .../src/simple_client.rs | 2 +- crates/iota-graphql-rpc/src/raw_query.rs | 1 - crates/iota-graphql-rpc/src/server/version.rs | 2 +- crates/iota-graphql-rpc/src/types/epoch.rs | 1 - .../iota-graphql-rpc/src/types/move_object.rs | 2 +- crates/iota-graphql-rpc/src/types/object.rs | 4 +- crates/iota-graphql-rpc/src/types/owner.rs | 2 +- .../src/apis/transaction_builder_api.rs | 2 +- crates/iota-indexer/src/models/tx_indices.rs | 2 +- .../iota-indexer/src/store/indexer_store.rs | 2 +- .../src/store/pg_indexer_store.rs | 2 +- crates/iota-indexer/tests/ingestion_tests.rs | 2 +- crates/iota-indexer/tests/rpc-tests/main.rs | 2 +- crates/iota-json-rpc/src/authority_state.rs | 1 - crates/iota-json-rpc/src/axum_router.rs | 1 - .../src/transaction_execution_api.rs | 2 +- .../iota-light-client/src/bin/light_client.rs | 2 +- crates/iota-macros/src/lib.rs | 2 - crates/iota-metrics/src/metrics_network.rs | 2 +- crates/iota-metrics/src/monitored_mpsc.rs | 2 +- crates/iota-network/src/discovery/builder.rs | 1 - crates/iota-network/src/randomness/mod.rs | 4 +- crates/iota-network/src/state_sync/builder.rs | 2 +- crates/iota-network/src/state_sync/server.rs | 2 +- crates/iota-node/src/lib.rs | 2 +- crates/iota-proc-macros/src/lib.rs | 2 +- crates/iota-protocol-config-macros/src/lib.rs | 4 +- crates/iota-protocol-config/src/lib.rs | 2 +- crates/iota-replay/src/fuzz.rs | 2 +- crates/iota-replay/src/replay.rs | 6 +- crates/iota-replay/src/types.rs | 1 - crates/iota-rest-api/src/reader.rs | 2 +- crates/iota-rosetta/src/errors.rs | 1 - crates/iota-rosetta/src/types.rs | 3 - crates/iota-rosetta/tests/gas_budget_tests.rs | 4 +- crates/iota-rpc-loadgen/src/payload/mod.rs | 1 - crates/iota-sdk/examples/utils.rs | 2 +- .../tests/tests.rs | 2 +- crates/iota-swarm/src/memory/swarm.rs | 2 +- crates/iota-tool/src/commands.rs | 1 - crates/iota-tool/src/lib.rs | 3 +- .../iota-transactional-test-runner/src/lib.rs | 1 - crates/iota-types/src/authenticator_state.rs | 3 +- crates/iota-types/src/crypto.rs | 2 +- crates/iota-types/src/effects/effects_v1.rs | 1 - crates/iota-types/src/effects/mod.rs | 1 - crates/iota-types/src/error.rs | 4 +- crates/iota-types/src/gas.rs | 2 +- crates/iota-types/src/gas_model/gas_v1.rs | 3 +- crates/iota-types/src/gas_model/tables.rs | 3 +- crates/iota-types/src/messages_checkpoint.rs | 3 +- crates/iota-types/src/messages_consensus.rs | 1 - crates/iota-types/src/object.rs | 3 - crates/iota-types/src/timelock/mod.rs | 2 +- crates/iota-util-mem-derive/lib.rs | 2 +- crates/iota/src/client_ptb/builder.rs | 2 +- crates/iota/src/genesis_inspector.rs | 5 +- crates/iota/src/iota_commands.rs | 1 - crates/iota/src/keytool.rs | 1 - crates/simulacrum/src/lib.rs | 4 +- crates/simulacrum/src/store/in_mem_store.rs | 1 - crates/telemetry-subscribers/src/lib.rs | 3 +- crates/typed-store-derive/src/lib.rs | 8 +- crates/typed-store/src/rocks/mod.rs | 8 +- examples/tic-tac-toe/cli/src/turn_cap.rs | 7 +- .../latest/iota-adapter/src/gas_charger.rs | 6 +- .../programmable_transactions/execution.rs | 2 +- .../src/object_runtime/object_store.rs | 1 - 128 files changed, 213 insertions(+), 279 deletions(-) diff --git a/consensus/core/src/authority_node.rs b/consensus/core/src/authority_node.rs index b07c487bfac..70f81c271fb 100644 --- a/consensus/core/src/authority_node.rs +++ b/consensus/core/src/authority_node.rs @@ -36,8 +36,8 @@ use crate::{ /// ConsensusAuthority is used by Iota to manage the lifetime of AuthorityNode. /// It hides the details of the implementation from the caller, /// MysticetiManager. -#[allow(private_interfaces)] pub enum ConsensusAuthority { + #[expect(private_interfaces)] WithTonic(AuthorityNode<TonicManager>), } @@ -100,7 +100,7 @@ impl ConsensusAuthority { } } - #[allow(unused)] + #[cfg(test)] fn sync_last_known_own_block_enabled(&self) -> bool { match self { Self::WithTonic(authority) => authority.sync_last_known_own_block, @@ -124,6 +124,7 @@ where broadcaster: Option<Broadcaster>, subscriber: Option<Subscriber<N::Client, AuthorityService<ChannelCoreThreadDispatcher>>>, network_manager: N, + #[cfg(test)] sync_last_known_own_block: bool, } @@ -306,6 +307,7 @@ where broadcaster, subscriber, network_manager, + #[cfg(test)] sync_last_known_own_block, } } diff --git a/consensus/core/src/base_committer.rs b/consensus/core/src/base_committer.rs index 2440f2c513a..bdc9188d1b1 100644 --- a/consensus/core/src/base_committer.rs +++ b/consensus/core/src/base_committer.rs @@ -427,19 +427,19 @@ mod base_committer_builder { } } - #[allow(unused)] + #[expect(unused)] pub(crate) fn with_wave_length(mut self, wave_length: u32) -> Self { self.wave_length = wave_length; self } - #[allow(unused)] + #[expect(unused)] pub(crate) fn with_leader_offset(mut self, leader_offset: u32) -> Self { self.leader_offset = leader_offset; self } - #[allow(unused)] + #[expect(unused)] pub(crate) fn with_round_offset(mut self, round_offset: u32) -> Self { self.round_offset = round_offset; self @@ -447,9 +447,9 @@ mod base_committer_builder { pub(crate) fn build(self) -> BaseCommitter { let options = BaseCommitterOptions { - wave_length: DEFAULT_WAVE_LENGTH, - leader_offset: 0, - round_offset: 0, + wave_length: self.wave_length, + leader_offset: self.leader_offset, + round_offset: self.round_offset, }; BaseCommitter::new( self.context.clone(), diff --git a/consensus/core/src/block_verifier.rs b/consensus/core/src/block_verifier.rs index 74b7a8e4583..843a495fe4d 100644 --- a/consensus/core/src/block_verifier.rs +++ b/consensus/core/src/block_verifier.rs @@ -206,9 +206,10 @@ impl BlockVerifier for SignedBlockVerifier { } } -#[allow(unused)] +#[cfg(test)] pub(crate) struct NoopBlockVerifier; +#[cfg(test)] impl BlockVerifier for NoopBlockVerifier { fn verify(&self, _block: &SignedBlock) -> ConsensusResult<()> { Ok(()) diff --git a/consensus/core/src/commit.rs b/consensus/core/src/commit.rs index 9135fd342e1..fc2221a84b0 100644 --- a/consensus/core/src/commit.rs +++ b/consensus/core/src/commit.rs @@ -91,7 +91,6 @@ impl Commit { pub(crate) trait CommitAPI { fn round(&self) -> Round; fn index(&self) -> CommitIndex; - #[allow(dead_code)] fn previous_digest(&self) -> CommitDigest; fn timestamp_ms(&self) -> BlockTimestampMs; fn leader(&self) -> BlockRef; diff --git a/consensus/core/src/core.rs b/consensus/core/src/core.rs index 8031ddd064a..1446fb656e4 100644 --- a/consensus/core/src/core.rs +++ b/consensus/core/src/core.rs @@ -849,7 +849,7 @@ pub(crate) struct CoreTextFixture { pub core: Core, pub signal_receivers: CoreSignalsReceivers, pub block_receiver: broadcast::Receiver<VerifiedBlock>, - #[allow(unused)] + #[expect(unused)] pub commit_receiver: UnboundedReceiver<CommittedSubDag>, pub store: Arc<MemStore>, } diff --git a/consensus/core/src/leader_schedule.rs b/consensus/core/src/leader_schedule.rs index 62b9e522b98..871f9f5c1ea 100644 --- a/consensus/core/src/leader_schedule.rs +++ b/consensus/core/src/leader_schedule.rs @@ -298,7 +298,7 @@ impl LeaderSwapTable { context: Arc<Context>, // Ignore linter warning in simtests. // TODO: maybe override protocol configs in tests for swap_stake_threshold, and call new(). - #[allow(unused_variables)] swap_stake_threshold: u64, + #[cfg_attr(msim, expect(unused_variables))] swap_stake_threshold: u64, commit_index: CommitIndex, reputation_scores: ReputationScores, ) -> Self { diff --git a/consensus/core/src/leader_scoring_strategy.rs b/consensus/core/src/leader_scoring_strategy.rs index 72b54eb4e9a..366ad857bdf 100644 --- a/consensus/core/src/leader_scoring_strategy.rs +++ b/consensus/core/src/leader_scoring_strategy.rs @@ -11,13 +11,13 @@ use crate::{ stake_aggregator::{QuorumThreshold, StakeAggregator}, }; -#[allow(unused)] pub(crate) trait ScoringStrategy: Send + Sync { fn calculate_scores_for_leader(&self, subdag: &UnscoredSubdag, leader_slot: Slot) -> Vec<u64>; // Based on the scoring strategy there is a minimum number of rounds required // for the scores to be calculated. This method allows that to be set by the // scoring strategy. + #[expect(unused)] fn leader_scoring_round_range(&self, min_round: u32, max_round: u32) -> Range<u32>; } diff --git a/consensus/core/src/network/metrics_layer.rs b/consensus/core/src/network/metrics_layer.rs index c9949830dcf..01c35cc31c5 100644 --- a/consensus/core/src/network/metrics_layer.rs +++ b/consensus/core/src/network/metrics_layer.rs @@ -79,7 +79,7 @@ impl MetricsCallbackMaker { pub(crate) struct MetricsResponseCallback { metrics: Arc<NetworkRouteMetrics>, // The timer is held on to and "observed" once dropped - #[allow(unused)] + #[expect(unused)] timer: HistogramTimer, route: String, excessive_message_size: usize, diff --git a/consensus/core/src/stake_aggregator.rs b/consensus/core/src/stake_aggregator.rs index 4c2a1c8c06a..330939c2873 100644 --- a/consensus/core/src/stake_aggregator.rs +++ b/consensus/core/src/stake_aggregator.rs @@ -12,7 +12,7 @@ pub(crate) trait CommitteeThreshold { pub(crate) struct QuorumThreshold; -#[allow(unused)] +#[cfg(test)] pub(crate) struct ValidityThreshold; impl CommitteeThreshold for QuorumThreshold { @@ -21,6 +21,7 @@ impl CommitteeThreshold for QuorumThreshold { } } +#[cfg(test)] impl CommitteeThreshold for ValidityThreshold { fn is_threshold(committee: &Committee, amount: Stake) -> bool { committee.reached_validity(amount) diff --git a/consensus/core/src/storage/mem_store.rs b/consensus/core/src/storage/mem_store.rs index 656837433f7..602fd2ba4f9 100644 --- a/consensus/core/src/storage/mem_store.rs +++ b/consensus/core/src/storage/mem_store.rs @@ -21,12 +21,10 @@ use crate::{ }; /// In-memory storage for testing. -#[allow(unused)] pub(crate) struct MemStore { inner: RwLock<Inner>, } -#[allow(unused)] struct Inner { blocks: BTreeMap<(Round, AuthorityIndex, BlockDigest), VerifiedBlock>, digests_by_authorities: BTreeSet<(AuthorityIndex, Round, BlockDigest)>, @@ -36,7 +34,6 @@ struct Inner { } impl MemStore { - #[cfg(test)] pub(crate) fn new() -> Self { MemStore { inner: RwLock::new(Inner { diff --git a/consensus/core/src/storage/mod.rs b/consensus/core/src/storage/mod.rs index d83d49cb89e..925ed467fbb 100644 --- a/consensus/core/src/storage/mod.rs +++ b/consensus/core/src/storage/mod.rs @@ -2,6 +2,7 @@ // Modifications Copyright (c) 2024 IOTA Stiftung // SPDX-License-Identifier: Apache-2.0 +#[cfg(test)] pub(crate) mod mem_store; pub(crate) mod rocksdb_store; @@ -12,13 +13,12 @@ use consensus_config::AuthorityIndex; use crate::{ CommitIndex, - block::{BlockRef, Round, Slot, VerifiedBlock}, + block::{BlockRef, Round, VerifiedBlock}, commit::{CommitInfo, CommitRange, CommitRef, TrustedCommit}, error::ConsensusResult, }; /// A common interface for consensus storage. -#[allow(unused)] pub(crate) trait Store: Send + Sync { /// Writes blocks, consensus commits and other data to store atomically. fn write(&self, write_batch: WriteBatch) -> ConsensusResult<()>; @@ -31,7 +31,7 @@ pub(crate) trait Store: Send + Sync { /// Checks whether there is any block at the given slot #[allow(dead_code)] - fn contains_block_at_slot(&self, slot: Slot) -> ConsensusResult<bool>; + fn contains_block_at_slot(&self, slot: crate::block::Slot) -> ConsensusResult<bool>; /// Reads blocks for an authority, from start_round. fn scan_blocks_by_author( diff --git a/consensus/core/src/storage/rocksdb_store.rs b/consensus/core/src/storage/rocksdb_store.rs index 39f18a906b7..aa06216318a 100644 --- a/consensus/core/src/storage/rocksdb_store.rs +++ b/consensus/core/src/storage/rocksdb_store.rs @@ -2,7 +2,7 @@ // Modifications Copyright (c) 2024 IOTA Stiftung // SPDX-License-Identifier: Apache-2.0 -use std::{collections::VecDeque, ops::Bound::Included, time::Duration}; +use std::{ops::Bound::Included, time::Duration}; use bytes::Bytes; use consensus_config::AuthorityIndex; @@ -16,7 +16,7 @@ use typed_store::{ use super::{CommitInfo, Store, WriteBatch}; use crate::{ - block::{BlockAPI as _, BlockDigest, BlockRef, Round, SignedBlock, Slot, VerifiedBlock}, + block::{BlockAPI as _, BlockDigest, BlockRef, Round, SignedBlock, VerifiedBlock}, commit::{CommitAPI as _, CommitDigest, CommitIndex, CommitRange, CommitRef, TrustedCommit}, error::{ConsensusError, ConsensusResult}, }; @@ -176,7 +176,7 @@ impl Store for RocksDBStore { Ok(exist) } - fn contains_block_at_slot(&self, slot: Slot) -> ConsensusResult<bool> { + fn contains_block_at_slot(&self, slot: crate::block::Slot) -> ConsensusResult<bool> { let found = self .digests_by_authorities .safe_range_iter(( @@ -222,7 +222,7 @@ impl Store for RocksDBStore { before_round: Option<Round>, ) -> ConsensusResult<Vec<VerifiedBlock>> { let before_round = before_round.unwrap_or(Round::MAX); - let mut refs = VecDeque::new(); + let mut refs = std::collections::VecDeque::new(); for kv in self .digests_by_authorities .safe_range_iter(( diff --git a/consensus/core/src/synchronizer.rs b/consensus/core/src/synchronizer.rs index e928dd246c7..de1c0568960 100644 --- a/consensus/core/src/synchronizer.rs +++ b/consensus/core/src/synchronizer.rs @@ -975,21 +975,16 @@ impl<C: NetworkClient, V: BlockVerifier, D: CoreThreadDispatcher> Synchronizer<C .take(MAX_PEERS * context.parameters.max_blocks_per_fetch) .collect::<Vec<_>>(); - #[allow(unused_mut)] + #[cfg_attr(test, expect(unused_mut))] let mut peers = context .committee .authorities() .filter_map(|(peer_index, _)| (peer_index != context.own_index).then_some(peer_index)) .collect::<Vec<_>>(); - // TODO: probably inject the RNG to allow unit testing - this is a work around - // for now. - cfg_if::cfg_if! { - if #[cfg(not(test))] { - // Shuffle the peers - peers.shuffle(&mut ThreadRng::default()); - } - } + // In test, the order is not randomized + #[cfg(not(test))] + peers.shuffle(&mut ThreadRng::default()); let mut peers = peers.into_iter(); let mut request_futures = FuturesUnordered::new(); diff --git a/consensus/core/src/test_dag_builder.rs b/consensus/core/src/test_dag_builder.rs index 20e4ebe8d79..607c5d65dc8 100644 --- a/consensus/core/src/test_dag_builder.rs +++ b/consensus/core/src/test_dag_builder.rs @@ -76,7 +76,6 @@ use crate::{ /// dag_builder.layer(1).build(); /// dag_builder.print(); // pretty print the entire DAG /// ``` -#[allow(unused)] pub(crate) struct DagBuilder { pub(crate) context: Arc<Context>, pub(crate) leader_schedule: LeaderSchedule, @@ -93,7 +92,6 @@ pub(crate) struct DagBuilder { pipeline: bool, } -#[allow(unused)] impl DagBuilder { pub(crate) fn new(context: Arc<Context>) -> Self { let leader_schedule = LeaderSchedule::new(context.clone(), LeaderSwapTable::default()); @@ -206,25 +204,26 @@ impl DagBuilder { !self.blocks.is_empty(), "No blocks have been created, please make sure that you have called build method" ); - self.blocks - .iter() - .find(|(block_ref, block)| { - block_ref.round == round - && block_ref.author == self.leader_schedule.elect_leader(round, 0) - }) - .map(|(_block_ref, block)| block.clone()) + self.blocks.iter().find_map(|(block_ref, block)| { + (block_ref.round == round + && block_ref.author == self.leader_schedule.elect_leader(round, 0)) + .then_some(block.clone()) + }) } + #[expect(unused)] pub(crate) fn with_wave_length(mut self, wave_length: Round) -> Self { self.wave_length = wave_length; self } + #[expect(unused)] pub(crate) fn with_number_of_leaders(mut self, number_of_leaders: u32) -> Self { self.number_of_leaders = number_of_leaders; self } + #[expect(unused)] pub(crate) fn with_pipeline(mut self, pipeline: bool) -> Self { self.pipeline = pipeline; self @@ -290,7 +289,7 @@ impl DagBuilder { /// Gets all uncommitted blocks in a slot. pub(crate) fn get_uncommitted_blocks_at_slot(&self, slot: Slot) -> Vec<VerifiedBlock> { let mut blocks = vec![]; - for (block_ref, block) in self.blocks.range(( + for (_block_ref, block) in self.blocks.range(( Included(BlockRef::new(slot.round, slot.authority, BlockDigest::MIN)), Included(BlockRef::new(slot.round, slot.authority, BlockDigest::MAX)), )) { @@ -366,7 +365,7 @@ pub struct LayerBuilder<'a> { blocks: Vec<VerifiedBlock>, } -#[allow(unused)] +#[expect(unused)] impl<'a> LayerBuilder<'a> { fn new(dag_builder: &'a mut DagBuilder, start_round: Round) -> Self { assert!(start_round > 0, "genesis round is created by default"); diff --git a/consensus/core/src/transaction.rs b/consensus/core/src/transaction.rs index d2df8a87fe9..f22eeeba635 100644 --- a/consensus/core/src/transaction.rs +++ b/consensus/core/src/transaction.rs @@ -240,9 +240,10 @@ pub enum ValidationError { } /// `NoopTransactionVerifier` accepts all transactions. -#[allow(unused)] +#[cfg(test)] pub(crate) struct NoopTransactionVerifier; +#[cfg(test)] impl TransactionVerifier for NoopTransactionVerifier { fn verify_batch(&self, _batch: &[&[u8]]) -> Result<(), ValidationError> { Ok(()) diff --git a/consensus/core/src/universal_committer.rs b/consensus/core/src/universal_committer.rs index bee37eef92e..970638e868d 100644 --- a/consensus/core/src/universal_committer.rs +++ b/consensus/core/src/universal_committer.rs @@ -182,7 +182,7 @@ pub(crate) mod universal_committer_builder { } } - #[allow(unused)] + #[expect(unused)] pub(crate) fn with_wave_length(mut self, wave_length: Round) -> Self { self.wave_length = wave_length; self diff --git a/crates/iota-analytics-indexer/src/analytics_processor.rs b/crates/iota-analytics-indexer/src/analytics_processor.rs index 7203f5dfe5c..036b25ad188 100644 --- a/crates/iota-analytics-indexer/src/analytics_processor.rs +++ b/crates/iota-analytics-indexer/src/analytics_processor.rs @@ -41,9 +41,9 @@ pub struct AnalyticsProcessor<S: Serialize + ParquetSchema> { metrics: AnalyticsMetrics, config: AnalyticsIndexerConfig, sender: mpsc::Sender<FileMetadata>, - #[allow(dead_code)] + #[expect(dead_code)] kill_sender: oneshot::Sender<()>, - #[allow(dead_code)] + #[expect(dead_code)] max_checkpoint_sender: oneshot::Sender<()>, } diff --git a/crates/iota-archival/src/lib.rs b/crates/iota-archival/src/lib.rs index e4a783b5b25..21938964cc6 100644 --- a/crates/iota-archival/src/lib.rs +++ b/crates/iota-archival/src/lib.rs @@ -52,7 +52,7 @@ use tracing::{error, info}; use crate::reader::{ArchiveReader, ArchiveReaderMetrics}; -#[allow(rustdoc::invalid_html_tags)] +#[expect(rustdoc::invalid_html_tags)] /// Checkpoints and summaries are persisted as blob files. Files are committed /// to local store by duration or file size. Committed files are synced with the /// remote store continuously. Files are optionally compressed with the zstd diff --git a/crates/iota-aws-orchestrator/src/benchmark.rs b/crates/iota-aws-orchestrator/src/benchmark.rs index d53d42e225d..733537adfe7 100644 --- a/crates/iota-aws-orchestrator/src/benchmark.rs +++ b/crates/iota-aws-orchestrator/src/benchmark.rs @@ -103,7 +103,6 @@ pub enum LoadType { /// Search for the breaking point of the L-graph. // TODO: Doesn't work very well, use tps regression as additional signal. - #[allow(dead_code)] Search { /// The initial load to test (and use a baseline). starting_load: usize, diff --git a/crates/iota-aws-orchestrator/src/monitor.rs b/crates/iota-aws-orchestrator/src/monitor.rs index 3a3da4f7a43..335960f8b96 100644 --- a/crates/iota-aws-orchestrator/src/monitor.rs +++ b/crates/iota-aws-orchestrator/src/monitor.rs @@ -220,7 +220,6 @@ impl Grafana { } } -#[allow(dead_code)] /// Bootstrap the grafana with datasource to connect to the given instances. /// NOTE: Only for macOS. Grafana must be installed through homebrew (and not /// from source). Deeper grafana configuration can be done through the @@ -228,7 +227,7 @@ impl Grafana { /// (~/Library/LaunchAgents/homebrew.mxcl.grafana.plist). pub struct LocalGrafana; -#[allow(dead_code)] +#[expect(dead_code)] impl LocalGrafana { /// The default grafana home directory (macOS, homebrew install). const DEFAULT_GRAFANA_HOME: &'static str = "/opt/homebrew/opt/grafana/share/grafana/"; diff --git a/crates/iota-benchmark/src/drivers/mod.rs b/crates/iota-benchmark/src/drivers/mod.rs index d242d6723a3..f442d30a3b8 100644 --- a/crates/iota-benchmark/src/drivers/mod.rs +++ b/crates/iota-benchmark/src/drivers/mod.rs @@ -55,7 +55,6 @@ impl std::fmt::Display for Interval { } // wrapper which implements serde -#[allow(dead_code)] #[derive(Debug)] pub struct HistogramWrapper { histogram: Histogram<u64>, diff --git a/crates/iota-benchmark/src/lib.rs b/crates/iota-benchmark/src/lib.rs index 2b807952799..f715a56f18f 100644 --- a/crates/iota-benchmark/src/lib.rs +++ b/crates/iota-benchmark/src/lib.rs @@ -72,7 +72,7 @@ use tracing::{error, info}; #[derive(Debug)] /// A wrapper on execution results to accommodate different types of /// responses from LocalValidatorAggregatorProxy and FullNodeProxy -#[allow(clippy::large_enum_variant)] +#[expect(clippy::large_enum_variant)] pub enum ExecutionEffects { CertifiedTransactionEffects(CertifiedTransactionEffects, TransactionEvents), IotaTransactionBlockEffects(IotaTransactionBlockEffects), diff --git a/crates/iota-bridge/src/action_executor.rs b/crates/iota-bridge/src/action_executor.rs index be81c44ed10..a1070ae3aab 100644 --- a/crates/iota-bridge/src/action_executor.rs +++ b/crates/iota-bridge/src/action_executor.rs @@ -695,9 +695,8 @@ mod tests { #[tokio::test] #[ignore = "https://github.com/iotaledger/iota/issues/3224"] async fn test_onchain_execution_loop() { - let ( + let SetupData { signing_tx, - _execution_tx, iota_client_mock, mut tx_subscription, store, @@ -707,12 +706,11 @@ mod tests { mock1, mock2, mock3, - _handles, gas_object_ref, iota_address, iota_token_type_tags, - _bridge_pause_tx, - ) = setup().await; + .. + } = setup().await; let (action_certificate, _, _) = get_bridge_authority_approved_action( vec![&mock0, &mock1, &mock2, &mock3], vec![&secrets[0], &secrets[1], &secrets[2], &secrets[3]], @@ -903,9 +901,8 @@ mod tests { #[tokio::test] #[ignore = "https://github.com/iotaledger/iota/issues/3224"] async fn test_signature_aggregation_loop() { - let ( + let SetupData { signing_tx, - _execution_tx, iota_client_mock, mut tx_subscription, store, @@ -915,12 +912,11 @@ mod tests { mock1, mock2, mock3, - _handles, gas_object_ref, iota_address, iota_token_type_tags, - _bridge_pause_tx, - ) = setup().await; + .. + } = setup().await; let id_token_map = (*iota_token_type_tags.load().clone()).clone(); let (action_certificate, iota_tx_digest, iota_tx_event_index) = get_bridge_authority_approved_action( @@ -1030,24 +1026,17 @@ mod tests { #[tokio::test] #[ignore = "https://github.com/iotaledger/iota/issues/3224"] async fn test_skip_request_signature_if_already_processed_on_chain() { - let ( + let SetupData { signing_tx, - _execution_tx, iota_client_mock, mut tx_subscription, store, - _secrets, - _dummy_iota_key, mock0, mock1, mock2, mock3, - _handles, - _gas_object_ref, - _iota_address, - _iota_token_type_tags, - _bridge_pause_tx, - ) = setup().await; + .. + } = setup().await; let iota_tx_digest = TransactionDigest::random(); let iota_tx_event_index = 0; @@ -1101,8 +1090,7 @@ mod tests { #[tokio::test] #[ignore = "https://github.com/iotaledger/iota/issues/3224"] async fn test_skip_tx_submission_if_already_processed_on_chain() { - let ( - _signing_tx, + let SetupData { execution_tx, iota_client_mock, mut tx_subscription, @@ -1113,12 +1101,11 @@ mod tests { mock1, mock2, mock3, - _handles, gas_object_ref, iota_address, iota_token_type_tags, - _bridge_pause_tx, - ) = setup().await; + .. + } = setup().await; let id_token_map = (*iota_token_type_tags.load().clone()).clone(); let (action_certificate, _, _) = get_bridge_authority_approved_action( vec![&mock0, &mock1, &mock2, &mock3], @@ -1188,8 +1175,7 @@ mod tests { #[tokio::test] #[ignore = "https://github.com/iotaledger/iota/issues/3224"] async fn test_skip_tx_submission_if_bridge_is_paused() { - let ( - _signing_tx, + let SetupData { execution_tx, iota_client_mock, mut tx_subscription, @@ -1200,12 +1186,12 @@ mod tests { mock1, mock2, mock3, - _handles, gas_object_ref, iota_address, iota_token_type_tags, bridge_pause_tx, - ) = setup().await; + .. + } = setup().await; let id_token_map: HashMap<u8, TypeTag> = (*iota_token_type_tags.load().clone()).clone(); let (action_certificate, _, _) = get_bridge_authority_approved_action( vec![&mock0, &mock1, &mock2, &mock3], @@ -1290,24 +1276,21 @@ mod tests { async fn test_action_executor_handle_new_token() { let new_token_id = 255u8; // token id that does not exist let new_type_tag = TypeTag::from_str("0xbeef::beef::BEEF").unwrap(); - let ( - _signing_tx, + let SetupData { execution_tx, iota_client_mock, mut tx_subscription, - _store, secrets, dummy_iota_key, mock0, mock1, mock2, mock3, - _handles, gas_object_ref, iota_address, iota_token_type_tags, - _bridge_pause_tx, - ) = setup().await; + .. + } = setup().await; let mut id_token_map: HashMap<u8, TypeTag> = (*iota_token_type_tags.load().clone()).clone(); let (action_certificate, _, _) = get_bridge_authority_approved_action( vec![&mock0, &mock1, &mock2, &mock3], @@ -1501,25 +1484,27 @@ mod tests { } } - #[allow(clippy::type_complexity)] - async fn setup() -> ( - iota_metrics::metered_channel::Sender<BridgeActionExecutionWrapper>, - iota_metrics::metered_channel::Sender<CertifiedBridgeActionExecutionWrapper>, - IotaMockClient, - tokio::sync::broadcast::Receiver<TransactionDigest>, - Arc<BridgeOrchestratorTables>, - Vec<BridgeAuthorityKeyPair>, - IotaKeyPair, - BridgeRequestMockHandler, - BridgeRequestMockHandler, - BridgeRequestMockHandler, - BridgeRequestMockHandler, - Vec<tokio::task::JoinHandle<()>>, - ObjectRef, - IotaAddress, - Arc<ArcSwap<HashMap<u8, TypeTag>>>, - tokio::sync::watch::Sender<IsBridgePaused>, - ) { + struct SetupData { + signing_tx: iota_metrics::metered_channel::Sender<BridgeActionExecutionWrapper>, + execution_tx: iota_metrics::metered_channel::Sender<CertifiedBridgeActionExecutionWrapper>, + iota_client_mock: IotaMockClient, + tx_subscription: tokio::sync::broadcast::Receiver<TransactionDigest>, + store: Arc<BridgeOrchestratorTables>, + secrets: Vec<BridgeAuthorityKeyPair>, + dummy_iota_key: IotaKeyPair, + mock0: BridgeRequestMockHandler, + mock1: BridgeRequestMockHandler, + mock2: BridgeRequestMockHandler, + mock3: BridgeRequestMockHandler, + #[expect(unused)] + handles: Vec<tokio::task::JoinHandle<()>>, + gas_object_ref: ObjectRef, + iota_address: IotaAddress, + iota_token_type_tags: Arc<ArcSwap<HashMap<u8, TypeTag>>>, + bridge_pause_tx: tokio::sync::watch::Sender<IsBridgePaused>, + } + + async fn setup() -> SetupData { telemetry_subscribers::init_for_testing(); let registry = Registry::new(); iota_metrics::init_metrics(®istry); @@ -1578,7 +1563,7 @@ mod tests { let (executor_handle, signing_tx, execution_tx) = executor.run_inner(); handles.extend(executor_handle); - ( + SetupData { signing_tx, execution_tx, iota_client_mock, @@ -1595,6 +1580,6 @@ mod tests { iota_address, iota_token_type_tags, bridge_pause_tx, - ) + } } } diff --git a/crates/iota-bridge/src/e2e_tests/test_utils.rs b/crates/iota-bridge/src/e2e_tests/test_utils.rs index 35195b89d22..a836ae9888f 100644 --- a/crates/iota-bridge/src/e2e_tests/test_utils.rs +++ b/crates/iota-bridge/src/e2e_tests/test_utils.rs @@ -434,7 +434,6 @@ pub async fn get_eth_signer_client_e2e_test_only( Ok((signer_0, private_key_0.to_string())) } -#[allow(dead_code)] #[derive(Debug, Clone)] pub struct DeployedSolContracts { pub iota_bridge: EthAddress, diff --git a/crates/iota-bridge/src/eth_syncer.rs b/crates/iota-bridge/src/eth_syncer.rs index cdbd7bf59a6..2fb109dd0da 100644 --- a/crates/iota-bridge/src/eth_syncer.rs +++ b/crates/iota-bridge/src/eth_syncer.rs @@ -36,7 +36,6 @@ pub struct EthSyncer<P> { /// Map from contract address to their start block. pub type EthTargetAddresses = HashMap<EthAddress, u64>; -#[allow(clippy::new_without_default)] impl<P> EthSyncer<P> where P: ethers::providers::JsonRpcClient + 'static, diff --git a/crates/iota-bridge/src/iota_mock_client.rs b/crates/iota-bridge/src/iota_mock_client.rs index 178e631de03..acf4fa4fd27 100644 --- a/crates/iota-bridge/src/iota_mock_client.rs +++ b/crates/iota-bridge/src/iota_mock_client.rs @@ -30,7 +30,7 @@ use crate::{ }; /// Mock client used in test environments. -#[allow(clippy::type_complexity)] +#[expect(clippy::type_complexity)] #[derive(Clone, Debug)] pub struct IotaMockClient { // the top two fields do not change during tests so we don't need them to be Arc<Mutex>> diff --git a/crates/iota-bridge/src/monitor.rs b/crates/iota-bridge/src/monitor.rs index f2b0a551e51..3d483d216be 100644 --- a/crates/iota-bridge/src/monitor.rs +++ b/crates/iota-bridge/src/monitor.rs @@ -906,7 +906,7 @@ mod tests { .unwrap(); } - #[allow(clippy::type_complexity)] + #[expect(clippy::type_complexity)] fn setup() -> ( iota_metrics::metered_channel::Sender<IotaBridgeEvent>, iota_metrics::metered_channel::Receiver<IotaBridgeEvent>, diff --git a/crates/iota-bridge/src/orchestrator.rs b/crates/iota-bridge/src/orchestrator.rs index e0193d15230..8604d0fe28d 100644 --- a/crates/iota-bridge/src/orchestrator.rs +++ b/crates/iota-bridge/src/orchestrator.rs @@ -485,7 +485,7 @@ mod tests { assert_eq!(digests.len(), 2); } - #[allow(clippy::type_complexity)] + #[expect(clippy::type_complexity)] fn setup() -> ( iota_metrics::metered_channel::Sender<(Identifier, Vec<IotaEvent>)>, iota_metrics::metered_channel::Receiver<(Identifier, Vec<IotaEvent>)>, diff --git a/crates/iota-bridge/src/server/mock_handler.rs b/crates/iota-bridge/src/server/mock_handler.rs index c986cf4e143..39505eba88f 100644 --- a/crates/iota-bridge/src/server/mock_handler.rs +++ b/crates/iota-bridge/src/server/mock_handler.rs @@ -26,7 +26,7 @@ use crate::{ types::SignedBridgeAction, }; -#[allow(clippy::type_complexity)] +#[expect(clippy::type_complexity)] #[derive(Clone)] pub struct BridgeRequestMockHandler { signer: Arc<ArcSwap<Option<BridgeAuthorityKeyPair>>>, diff --git a/crates/iota-cluster-test/src/lib.rs b/crates/iota-cluster-test/src/lib.rs index b107bc08f3f..855ab846157 100644 --- a/crates/iota-cluster-test/src/lib.rs +++ b/crates/iota-cluster-test/src/lib.rs @@ -50,7 +50,6 @@ pub mod wallet_client; pub use iota_genesis_builder::SnapshotUrl as MigrationSnapshotUrl; -#[allow(unused)] pub struct TestContext { /// Cluster handle that allows access to various components in a cluster cluster: Box<dyn Cluster + Sync + Send>, diff --git a/crates/iota-common/src/sync/async_once_cell.rs b/crates/iota-common/src/sync/async_once_cell.rs index b2759e4ba62..68cf5583271 100644 --- a/crates/iota-common/src/sync/async_once_cell.rs +++ b/crates/iota-common/src/sync/async_once_cell.rs @@ -42,7 +42,7 @@ impl<T: Send + Clone> AsyncOnceCell<T> { } /// Sets the value and notifies waiters. Return error if called twice - #[allow(clippy::result_unit_err)] + #[expect(clippy::result_unit_err)] pub fn set(&self, value: T) -> Result<(), ()> { let mut writer = self.writer.lock(); match writer.take() { diff --git a/crates/iota-common/src/sync/notify_once.rs b/crates/iota-common/src/sync/notify_once.rs index dfeb264ab4b..2c6b2b5eac8 100644 --- a/crates/iota-common/src/sync/notify_once.rs +++ b/crates/iota-common/src/sync/notify_once.rs @@ -35,7 +35,7 @@ impl NotifyOnce { /// After this method all pending and future calls to .wait() will return /// /// This method returns errors if called more then once - #[allow(clippy::result_unit_err)] + #[expect(clippy::result_unit_err)] pub fn notify(&self) -> Result<(), ()> { let Some(notify) = self.notify.lock().take() else { return Err(()); diff --git a/crates/iota-config/src/genesis.rs b/crates/iota-config/src/genesis.rs index 3cb724e34b6..d7c850ca148 100644 --- a/crates/iota-config/src/genesis.rs +++ b/crates/iota-config/src/genesis.rs @@ -586,7 +586,7 @@ pub struct TokenDistributionScheduleBuilder { } impl TokenDistributionScheduleBuilder { - #[allow(clippy::new_without_default)] + #[expect(clippy::new_without_default)] pub fn new() -> Self { Self { pre_minted_supply: 0, diff --git a/crates/iota-core/src/authority.rs b/crates/iota-core/src/authority.rs index bd968065e99..d85c217974f 100644 --- a/crates/iota-core/src/authority.rs +++ b/crates/iota-core/src/authority.rs @@ -784,7 +784,7 @@ pub struct AuthorityState { transaction_manager: Arc<TransactionManager>, /// Shuts down the execution task. Used only in testing. - #[allow(unused)] + #[cfg_attr(not(test), expect(unused))] tx_execution_shutdown: Mutex<Option<oneshot::Sender<()>>>, pub metrics: Arc<AuthorityMetrics>, @@ -1593,7 +1593,7 @@ impl AuthorityState { let transaction_data = &certificate.data().intent_message().value; let (kind, signer, gas) = transaction_data.execution_parts(); - #[allow(unused_mut)] + #[expect(unused_mut)] let (inner_temp_store, _, mut effects, execution_error_opt) = epoch_store.executor().execute_transaction_to_effects( self.get_backing_store().as_ref(), @@ -1860,7 +1860,6 @@ impl AuthorityState { } /// The object ID for gas can be any object ID, even for an uncreated object - #[allow(clippy::collapsible_else_if)] pub async fn dev_inspect_transaction_block( &self, sender: IotaAddress, @@ -2610,7 +2609,7 @@ impl AuthorityState { } } - #[allow(clippy::disallowed_methods)] // allow unbounded_channel() + #[expect(clippy::disallowed_methods)] // allow unbounded_channel() pub async fn new( name: AuthorityName, secret: StableSyncAuthoritySigner, diff --git a/crates/iota-core/src/authority/authority_per_epoch_store.rs b/crates/iota-core/src/authority/authority_per_epoch_store.rs index cc6340a840e..cf080a649d9 100644 --- a/crates/iota-core/src/authority/authority_per_epoch_store.rs +++ b/crates/iota-core/src/authority/authority_per_epoch_store.rs @@ -131,8 +131,8 @@ pub(crate) type EncG = bls12381::G2Element; // retain a distinction anyway. If we need to support distributed object // storage, having this distinction will be useful, as we will most likely have // to re-implement a retry / write-ahead-log at that point. -pub struct CertLockGuard(#[allow(unused)] MutexGuard); -pub struct CertTxGuard(#[allow(unused)] CertLockGuard); +pub struct CertLockGuard(#[expect(unused)] MutexGuard); +pub struct CertTxGuard(#[expect(unused)] CertLockGuard); impl CertTxGuard { pub fn release(self) {} @@ -2273,7 +2273,6 @@ impl AuthorityPerEpochStore { /// /// In addition to the early termination guarantee, this function also /// prevents epoch_terminated() if future is being executed. - #[allow(clippy::result_unit_err)] pub async fn within_alive_epoch<F: Future + Send>(&self, f: F) -> Result<F::Output, ()> { // This guard is kept in the future until it resolves, preventing // `epoch_terminated` to acquire a write lock @@ -2911,7 +2910,7 @@ impl AuthorityPerEpochStore { /// VerifiedCertificates for each executable certificate /// - Or update the state for checkpoint or epoch change protocol. #[instrument(level = "debug", skip_all)] - #[allow(clippy::type_complexity)] + #[expect(clippy::type_complexity)] pub(crate) async fn process_consensus_transactions<C: CheckpointServiceNotify>( &self, output: &mut ConsensusCommitOutput, @@ -4103,8 +4102,8 @@ impl LockDetailsWrapper { match self { Self::V1(v1) => v1, - // can remove #[allow] when there are multiple versions - #[allow(unreachable_patterns)] + // can remove #[expect] when there are multiple versions + #[expect(unreachable_patterns)] _ => panic!("lock details should have been migrated to latest version at read time"), } } @@ -4112,8 +4111,8 @@ impl LockDetailsWrapper { match self { Self::V1(v1) => v1, - // can remove #[allow] when there are multiple versions - #[allow(unreachable_patterns)] + // can remove #[expect] when there are multiple versions + #[expect(unreachable_patterns)] _ => panic!("lock details should have been migrated to latest version at read time"), } } diff --git a/crates/iota-core/src/authority/authority_store.rs b/crates/iota-core/src/authority/authority_store.rs index 98d68d84ae1..2ae0de3fb71 100644 --- a/crates/iota-core/src/authority/authority_store.rs +++ b/crates/iota-core/src/authority/authority_store.rs @@ -163,7 +163,7 @@ impl AuthorityStore { let epoch_start_configuration = if perpetual_tables.database_is_empty()? { info!("Creating new epoch start config from genesis"); - #[allow(unused_mut)] + #[expect(unused_mut)] let mut initial_epoch_flags = EpochFlag::default_flags_for_new_epoch(config); fail_point_arg!("initial_epoch_flags", |flags: Vec<EpochFlag>| { info!("Setting initial epoch flags to {:?}", flags); diff --git a/crates/iota-core/src/authority/authority_store_types.rs b/crates/iota-core/src/authority/authority_store_types.rs index b50904ea5c6..d46bd084eca 100644 --- a/crates/iota-core/src/authority/authority_store_types.rs +++ b/crates/iota-core/src/authority/authority_store_types.rs @@ -65,8 +65,8 @@ impl StoreObjectWrapper { match self { Self::V1(v1) => v1, - // can remove #[allow] when there are multiple versions - #[allow(unreachable_patterns)] + // can remove #[expect] when there are multiple versions + #[expect(unreachable_patterns)] _ => panic!("object should have been migrated to latest version at read time"), } } @@ -74,8 +74,8 @@ impl StoreObjectWrapper { match self { Self::V1(v1) => v1, - // can remove #[allow] when there are multiple versions - #[allow(unreachable_patterns)] + // can remove #[expect] when there are multiple versions + #[expect(unreachable_patterns)] _ => panic!("object should have been migrated to latest version at read time"), } } @@ -145,8 +145,8 @@ impl StoreMoveObjectWrapper { match self { Self::V1(v1) => v1, - // can remove #[allow] when there are multiple versions - #[allow(unreachable_patterns)] + // can remove #[expect] when there are multiple versions + #[expect(unreachable_patterns)] _ => panic!("object should have been migrated to latest version at read time"), } } @@ -154,8 +154,8 @@ impl StoreMoveObjectWrapper { match self { Self::V1(v1) => v1, - // can remove #[allow] when there are multiple versions - #[allow(unreachable_patterns)] + // can remove #[expect] when there are multiple versions + #[expect(unreachable_patterns)] _ => panic!("object should have been migrated to latest version at read time"), } } diff --git a/crates/iota-core/src/authority/epoch_start_configuration.rs b/crates/iota-core/src/authority/epoch_start_configuration.rs index 7ae6446577a..26df7d243ae 100644 --- a/crates/iota-core/src/authority/epoch_start_configuration.rs +++ b/crates/iota-core/src/authority/epoch_start_configuration.rs @@ -127,7 +127,7 @@ impl EpochStartConfiguration { })) } - #[allow(unreachable_patterns)] + #[expect(unreachable_patterns)] pub fn new_at_next_epoch_for_testing(&self) -> Self { // We only need to implement this function for the latest version. // When a new version is introduced, this function should be updated. diff --git a/crates/iota-core/src/authority_aggregator.rs b/crates/iota-core/src/authority_aggregator.rs index d7a3f8b6251..f42945e4990 100644 --- a/crates/iota-core/src/authority_aggregator.rs +++ b/crates/iota-core/src/authority_aggregator.rs @@ -287,7 +287,7 @@ pub enum AggregatorProcessCertificateError { /// Groups the errors by error type and stake. pub fn group_errors(errors: Vec<(IotaError, Vec<AuthorityName>, StakeUnit)>) -> GroupedErrors { - #[allow(clippy::mutable_key_type)] + #[expect(clippy::mutable_key_type)] let mut grouped_errors = HashMap::new(); for (error, names, stake) in errors { let entry = grouped_errors.entry(error).or_insert((0, vec![])); @@ -382,7 +382,7 @@ struct ProcessTransactionState { impl ProcessTransactionState { /// Returns the conflicting transaction digest and its validators with the /// most stake. - #[allow(clippy::type_complexity)] + #[expect(clippy::type_complexity)] pub fn conflicting_tx_digest_with_most_stake( &self, ) -> Option<( diff --git a/crates/iota-core/src/checkpoints/checkpoint_executor/mod.rs b/crates/iota-core/src/checkpoints/checkpoint_executor/mod.rs index bac30e2396c..d1266c66400 100644 --- a/crates/iota-core/src/checkpoints/checkpoint_executor/mod.rs +++ b/crates/iota-core/src/checkpoints/checkpoint_executor/mod.rs @@ -1002,7 +1002,7 @@ fn extract_end_of_epoch_tx( // Given a checkpoint, filter out any already executed transactions, then return // the remaining execution digests, transaction digests, transactions to be // executed, and randomness rounds (if any) included in the checkpoint. -#[allow(clippy::type_complexity)] +#[expect(clippy::type_complexity)] fn get_unexecuted_transactions( checkpoint: VerifiedCheckpoint, cache_reader: &dyn TransactionCacheRead, diff --git a/crates/iota-core/src/checkpoints/mod.rs b/crates/iota-core/src/checkpoints/mod.rs index 3c819e3c8c6..9ab63227779 100644 --- a/crates/iota-core/src/checkpoints/mod.rs +++ b/crates/iota-core/src/checkpoints/mod.rs @@ -1238,7 +1238,7 @@ impl CheckpointBuilder { Ok(()) } - #[allow(clippy::type_complexity)] + #[expect(clippy::type_complexity)] fn split_checkpoint_chunks( &self, effects_and_transaction_sizes: Vec<(TransactionEffects, usize)>, @@ -1924,7 +1924,7 @@ impl CheckpointAggregator { } impl CheckpointSignatureAggregator { - #[allow(clippy::result_unit_err)] + #[expect(clippy::result_unit_err)] pub fn try_aggregate( &mut self, data: CheckpointSignatureMessage, diff --git a/crates/iota-core/src/connection_monitor.rs b/crates/iota-core/src/connection_monitor.rs index a15afd715c4..33224315332 100644 --- a/crates/iota-core/src/connection_monitor.rs +++ b/crates/iota-core/src/connection_monitor.rs @@ -109,9 +109,7 @@ impl ConnectionMonitor { rx.receiver.recv().await } else { // If no shutdown receiver is provided, wait forever. - let future = future::pending(); - #[allow(clippy::let_unit_value)] - let () = future.await; + future::pending::<()>().await; Ok(()) } } diff --git a/crates/iota-core/src/consensus_adapter.rs b/crates/iota-core/src/consensus_adapter.rs index 46e8e9b6875..eb25d7b5137 100644 --- a/crates/iota-core/src/consensus_adapter.rs +++ b/crates/iota-core/src/consensus_adapter.rs @@ -280,7 +280,7 @@ impl ConsensusAdapter { // be a big deal but can be optimized let mut recovered = epoch_store.get_all_pending_consensus_transactions(); - #[allow(clippy::collapsible_if)] // This if can be collapsed but it will be ugly + #[expect(clippy::collapsible_if)] // This if can be collapsed but it will be ugly if epoch_store .get_reconfig_state_read_lock_guard() .is_reject_user_certs() @@ -592,7 +592,6 @@ impl ConsensusAdapter { // care about it } - #[allow(clippy::option_map_unit_fn)] async fn submit_and_wait_inner( self: Arc<Self>, transactions: Vec<ConsensusTransaction>, diff --git a/crates/iota-core/src/epoch/randomness.rs b/crates/iota-core/src/epoch/randomness.rs index e63f4f2a4e8..be323fa4747 100644 --- a/crates/iota-core/src/epoch/randomness.rs +++ b/crates/iota-core/src/epoch/randomness.rs @@ -57,7 +57,6 @@ pub const SINGLETON_KEY: u64 = 0; // Wrappers for DKG messages (to simplify upgrades). #[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)] -#[allow(clippy::large_enum_variant)] pub enum VersionedProcessedMessage { V1(dkg_v1::ProcessedMessage<PkG, EncG>), } @@ -427,7 +426,7 @@ impl RandomnessManager { info!("random beacon: created {msg:?} with dkg version {dkg_version}"); let transaction = ConsensusTransaction::new_randomness_dkg_message(epoch_store.name, &msg); - #[allow(unused_mut)] + #[expect(unused_mut)] let mut fail_point_skip_sending = false; fail_point_if!("rb-dkg", || { // maybe skip sending in simtests @@ -499,7 +498,7 @@ impl RandomnessManager { &conf, ); - #[allow(unused_mut)] + #[expect(unused_mut)] let mut fail_point_skip_sending = false; fail_point_if!("rb-dkg", || { // maybe skip sending in simtests diff --git a/crates/iota-core/src/overload_monitor.rs b/crates/iota-core/src/overload_monitor.rs index 3f155117282..c4e921d15cf 100644 --- a/crates/iota-core/src/overload_monitor.rs +++ b/crates/iota-core/src/overload_monitor.rs @@ -271,7 +271,7 @@ pub fn overload_monitor_accept_tx( } #[cfg(test)] -#[allow(clippy::disallowed_methods)] // allow unbounded_channel() since tests are simulating txn manager execution +#[expect(clippy::disallowed_methods)] // allow unbounded_channel() since tests are simulating txn manager execution // driver interaction. mod tests { use std::sync::Arc; diff --git a/crates/iota-core/src/stake_aggregator.rs b/crates/iota-core/src/stake_aggregator.rs index b8d8907fca0..3269ba384ac 100644 --- a/crates/iota-core/src/stake_aggregator.rs +++ b/crates/iota-core/src/stake_aggregator.rs @@ -301,7 +301,7 @@ impl<K, V, const STRENGTH: bool> MultiStakeAggregator<K, V, STRENGTH> where K: Hash + Eq, { - #[allow(dead_code)] + #[expect(dead_code)] pub fn authorities_for_key(&self, k: &K) -> Option<impl Iterator<Item = &AuthorityName>> { self.stake_maps.get(k).map(|(_, agg)| agg.keys()) } diff --git a/crates/iota-core/src/test_utils.rs b/crates/iota-core/src/test_utils.rs index 809ca04d8c5..4a215adf02a 100644 --- a/crates/iota-core/src/test_utils.rs +++ b/crates/iota-core/src/test_utils.rs @@ -11,7 +11,6 @@ use iota_framework::BuiltInFramework; use iota_genesis_builder::{ genesis_build_effects::GenesisBuildEffects, validator_info::ValidatorInfo, }; -use iota_macros::nondeterministic; use iota_move_build::{BuildConfig, CompiledPackage, IotaPackageHooks}; use iota_protocol_config::ProtocolConfig; use iota_types::{ @@ -94,14 +93,12 @@ pub async fn send_and_confirm_transaction( Ok((certificate.into_inner(), result.into_inner())) } -// note: clippy is confused about this being dead - it appears to only be used -// in cfg(test), but adding #[cfg(test)] causes other targets to fail -#[allow(dead_code)] +#[cfg(test)] pub(crate) fn init_state_parameters_from_rng<R>(rng: &mut R) -> (Genesis, AuthorityKeyPair) where R: rand::CryptoRng + rand::RngCore, { - let dir = nondeterministic!(tempfile::TempDir::new().unwrap()); + let dir = iota_macros::nondeterministic!(tempfile::TempDir::new().unwrap()); let network_config = iota_swarm_config::network_config_builder::ConfigBuilder::new(&dir) .rng(rng) .build(); diff --git a/crates/iota-core/src/transaction_manager.rs b/crates/iota-core/src/transaction_manager.rs index 527897c08e1..0192e28bc37 100644 --- a/crates/iota-core/src/transaction_manager.rs +++ b/crates/iota-core/src/transaction_manager.rs @@ -64,7 +64,7 @@ pub struct TransactionManager { #[derive(Clone, Debug)] pub struct PendingCertificateStats { // The time this certificate enters transaction manager. - #[allow(unused)] + #[cfg(test)] pub enqueue_time: Instant, // The time this certificate becomes ready for execution. pub ready_time: Option<Instant>, @@ -556,6 +556,7 @@ impl TransactionManager { expected_effects_digest, waiting_input_objects: input_object_keys, stats: PendingCertificateStats { + #[cfg(test)] enqueue_time: pending_cert_enqueue_time, ready_time: None, }, diff --git a/crates/iota-core/src/transaction_orchestrator.rs b/crates/iota-core/src/transaction_orchestrator.rs index 5dc3ae32188..9aee380abea 100644 --- a/crates/iota-core/src/transaction_orchestrator.rs +++ b/crates/iota-core/src/transaction_orchestrator.rs @@ -347,7 +347,6 @@ where let digests = [tx_digest]; let effects_await = cache_reader.notify_read_executed_effects(&digests); // let-and-return necessary to satisfy borrow checker. - #[allow(clippy::let_and_return)] let res = match select(ticket, effects_await.boxed()).await { Either::Left((quorum_driver_response, _)) => Ok(quorum_driver_response), Either::Right((_, unfinished_quorum_driver_task)) => { @@ -360,6 +359,7 @@ where Ok(unfinished_quorum_driver_task.await) } }; + #[expect(clippy::let_and_return)] res }) } diff --git a/crates/iota-core/src/unit_tests/authority_aggregator_tests.rs b/crates/iota-core/src/unit_tests/authority_aggregator_tests.rs index bfb2e944747..f0ec7181006 100644 --- a/crates/iota-core/src/unit_tests/authority_aggregator_tests.rs +++ b/crates/iota-core/src/unit_tests/authority_aggregator_tests.rs @@ -661,7 +661,7 @@ async fn test_quorum_once_with_timeout() { ); } -#[allow(clippy::type_complexity)] +#[expect(clippy::type_complexity)] fn get_authorities( count: Arc<Mutex<u32>>, committee_size: u64, @@ -2243,7 +2243,7 @@ async fn test_process_transaction_again() { } } -#[allow(clippy::type_complexity)] +#[expect(clippy::type_complexity)] fn make_fake_authorities() -> ( BTreeMap<AuthorityName, StakeUnit>, BTreeMap<AuthorityName, HandleTransactionTestAuthorityClient>, diff --git a/crates/iota-core/src/unit_tests/execution_driver_tests.rs b/crates/iota-core/src/unit_tests/execution_driver_tests.rs index a2a51628601..50363e411c1 100644 --- a/crates/iota-core/src/unit_tests/execution_driver_tests.rs +++ b/crates/iota-core/src/unit_tests/execution_driver_tests.rs @@ -51,7 +51,7 @@ use crate::{ }, }; -#[allow(dead_code)] +#[expect(dead_code)] async fn wait_for_certs( stream: &mut UnboundedReceiver<VerifiedCertificate>, certs: &[VerifiedCertificate], diff --git a/crates/iota-core/src/unit_tests/transaction_manager_tests.rs b/crates/iota-core/src/unit_tests/transaction_manager_tests.rs index 7868b8d4335..2f6abcaac31 100644 --- a/crates/iota-core/src/unit_tests/transaction_manager_tests.rs +++ b/crates/iota-core/src/unit_tests/transaction_manager_tests.rs @@ -24,7 +24,7 @@ use crate::{ transaction_manager::{PendingCertificate, TransactionManager}, }; -#[allow(clippy::disallowed_methods)] // allow unbounded_channel() +#[expect(clippy::disallowed_methods)] // allow unbounded_channel() fn make_transaction_manager( state: &AuthorityState, ) -> (TransactionManager, UnboundedReceiver<PendingCertificate>) { diff --git a/crates/iota-core/src/unit_tests/transfer_to_object_tests.rs b/crates/iota-core/src/unit_tests/transfer_to_object_tests.rs index 9fab1b9a0ee..61795f7bbf5 100644 --- a/crates/iota-core/src/unit_tests/transfer_to_object_tests.rs +++ b/crates/iota-core/src/unit_tests/transfer_to_object_tests.rs @@ -425,7 +425,7 @@ async fn test_tto_invalid_receiving_arguments() { .find(|(_, owner)| matches!(owner, Owner::ObjectOwner(_))) .unwrap(); - #[allow(clippy::type_complexity)] + #[expect(clippy::type_complexity)] let mutations: Vec<( Box<dyn FnOnce(ObjectRef) -> ObjectRef>, Box<dyn FnOnce(UserInputError) -> bool>, diff --git a/crates/iota-e2e-tests/tests/dynamic_committee_tests.rs b/crates/iota-e2e-tests/tests/dynamic_committee_tests.rs index 0558a0e0e7e..c76e4922dbe 100644 --- a/crates/iota-e2e-tests/tests/dynamic_committee_tests.rs +++ b/crates/iota-e2e-tests/tests/dynamic_committee_tests.rs @@ -59,7 +59,7 @@ trait StatePredicate { runner: &StressTestRunner, effects: &TransactionEffects, ); - #[allow(unused)] + #[expect(unused)] async fn post_epoch_post_condition( &mut self, runner: &StressTestRunner, @@ -67,7 +67,7 @@ trait StatePredicate { ); } -#[allow(dead_code)] +#[expect(dead_code)] struct StressTestRunner { pub post_epoch_predicates: Vec<Box<dyn StatePredicate + Send + Sync>>, pub test_cluster: TestCluster, @@ -234,7 +234,7 @@ impl StressTestRunner { self.get_from_effects(&effects.created(), name).await } - #[allow(dead_code)] + #[expect(dead_code)] pub async fn get_mutated_object_of_type_name( &self, effects: &TransactionEffects, diff --git a/crates/iota-e2e-tests/tests/shared_objects_tests.rs b/crates/iota-e2e-tests/tests/shared_objects_tests.rs index 8525b378580..cbabd65cf64 100644 --- a/crates/iota-e2e-tests/tests/shared_objects_tests.rs +++ b/crates/iota-e2e-tests/tests/shared_objects_tests.rs @@ -512,7 +512,6 @@ async fn access_clock_object_test() { assert!(event.timestamp_ms <= finish.as_millis() as u64); let mut attempt = 0; - #[allow(clippy::never_loop)] // seem to be a bug in clippy with let else statement loop { let checkpoint = test_cluster .fullnode_handle diff --git a/crates/iota-faucet/src/faucet/simple_faucet.rs b/crates/iota-faucet/src/faucet/simple_faucet.rs index eafb50d4a4a..b130b529e9d 100644 --- a/crates/iota-faucet/src/faucet/simple_faucet.rs +++ b/crates/iota-faucet/src/faucet/simple_faucet.rs @@ -65,7 +65,7 @@ pub struct SimpleFaucet { ttl_expiration: u64, coin_amount: u64, /// Shuts down the batch transfer task. Used only in testing. - #[allow(unused)] + #[cfg_attr(not(test), expect(unused))] batch_transfer_shutdown: parking_lot::Mutex<Option<oneshot::Sender<()>>>, } diff --git a/crates/iota-genesis-builder/src/lib.rs b/crates/iota-genesis-builder/src/lib.rs index b3725eded9b..ac464c309ce 100644 --- a/crates/iota-genesis-builder/src/lib.rs +++ b/crates/iota-genesis-builder/src/lib.rs @@ -470,7 +470,7 @@ impl Builder { } = self.parameters.to_genesis_chain_parameters(); // In non-testing code, genesis type must always be V1. - #[allow(clippy::infallible_destructuring_match)] + #[expect(clippy::infallible_destructuring_match)] let system_state = match unsigned_genesis.iota_system_object() { IotaSystemState::V1(inner) => inner, #[cfg(msim)] diff --git a/crates/iota-genesis-builder/src/stardust/migration/mod.rs b/crates/iota-genesis-builder/src/stardust/migration/mod.rs index d9a04628723..198da0e1561 100644 --- a/crates/iota-genesis-builder/src/stardust/migration/mod.rs +++ b/crates/iota-genesis-builder/src/stardust/migration/mod.rs @@ -2,7 +2,7 @@ // SPDX-License-Identifier: Apache-2.0 mod executor; -#[allow(clippy::module_inception)] +#[expect(clippy::module_inception)] mod migration; mod migration_target_network; #[cfg(test)] diff --git a/crates/iota-graphql-config/src/lib.rs b/crates/iota-graphql-config/src/lib.rs index dac6e6ac1b2..236ef925b8f 100644 --- a/crates/iota-graphql-config/src/lib.rs +++ b/crates/iota-graphql-config/src/lib.rs @@ -17,7 +17,7 @@ use syn::{ /// field that ensures that if the field is not present during deserialization, /// it is replaced with its default value, from the `Default` implementation for /// the config struct. -#[allow(non_snake_case)] +#[expect(non_snake_case)] #[proc_macro_attribute] pub fn GraphQLConfig(_attr: TokenStream, input: TokenStream) -> TokenStream { let DeriveInput { diff --git a/crates/iota-graphql-rpc-client/src/response.rs b/crates/iota-graphql-rpc-client/src/response.rs index 40c24e93cf8..d26cab75d80 100644 --- a/crates/iota-graphql-rpc-client/src/response.rs +++ b/crates/iota-graphql-rpc-client/src/response.rs @@ -40,7 +40,7 @@ impl GraphqlResponse { }) } - #[allow(clippy::result_large_err)] + #[expect(clippy::result_large_err)] pub fn graphql_version(&self) -> Result<String, ClientError> { Ok(self .headers @@ -91,7 +91,7 @@ impl GraphqlResponse { self.full_response.errors.clone() } - #[allow(clippy::result_large_err)] + #[expect(clippy::result_large_err)] pub fn usage(&self) -> Result<Option<BTreeMap<String, u64>>, ClientError> { Ok(match self.full_response.extensions.get("usage").cloned() { Some(Value::Object(obj)) => Some( diff --git a/crates/iota-graphql-rpc-client/src/simple_client.rs b/crates/iota-graphql-rpc-client/src/simple_client.rs index f78f8ca3753..2b5dfac4649 100644 --- a/crates/iota-graphql-rpc-client/src/simple_client.rs +++ b/crates/iota-graphql-rpc-client/src/simple_client.rs @@ -117,7 +117,7 @@ impl SimpleClient { } } -#[allow(clippy::type_complexity, clippy::result_large_err)] +#[expect(clippy::type_complexity, clippy::result_large_err)] pub fn resolve_variables( vars: &[GraphqlQueryVariable], ) -> Result<(BTreeMap<String, String>, BTreeMap<String, Value>), ClientError> { diff --git a/crates/iota-graphql-rpc/src/raw_query.rs b/crates/iota-graphql-rpc/src/raw_query.rs index e6ed4a89b14..ce7bd23b2f6 100644 --- a/crates/iota-graphql-rpc/src/raw_query.rs +++ b/crates/iota-graphql-rpc/src/raw_query.rs @@ -66,7 +66,6 @@ impl RawQuery { /// Adds a `WHERE` condition to the query, combining it with existing /// conditions using `OR`. - #[allow(dead_code)] pub(crate) fn or_filter<T: std::fmt::Display>(mut self, condition: T) -> Self { self.where_ = match self.where_ { Some(where_) => Some(format!("({}) OR {}", where_, condition)), diff --git a/crates/iota-graphql-rpc/src/server/version.rs b/crates/iota-graphql-rpc/src/server/version.rs index ff65114fb7b..b1c58ddcb1d 100644 --- a/crates/iota-graphql-rpc/src/server/version.rs +++ b/crates/iota-graphql-rpc/src/server/version.rs @@ -17,7 +17,7 @@ use crate::{ pub(crate) static VERSION_HEADER: HeaderName = HeaderName::from_static("x-iota-rpc-version"); -#[allow(unused)] +#[expect(unused)] pub(crate) struct IotaRpcVersion(Vec<u8>, Vec<Vec<u8>>); const NAMED_VERSIONS: [&str; 3] = ["beta", "legacy", "stable"]; diff --git a/crates/iota-graphql-rpc/src/types/epoch.rs b/crates/iota-graphql-rpc/src/types/epoch.rs index 20a16d582c8..bbb9607c294 100644 --- a/crates/iota-graphql-rpc/src/types/epoch.rs +++ b/crates/iota-graphql-rpc/src/types/epoch.rs @@ -264,7 +264,6 @@ impl Epoch { ) -> Result<ScanConnection<String, TransactionBlock>> { let page = Page::from_params(ctx.data_unchecked(), first, after, last, before)?; - #[allow(clippy::unnecessary_lazy_evaluations)] // rust-lang/rust-clippy#9422 let Some(filter) = filter .unwrap_or_default() .intersect(TransactionBlockFilter { diff --git a/crates/iota-graphql-rpc/src/types/move_object.rs b/crates/iota-graphql-rpc/src/types/move_object.rs index 8f74494b841..405d9804be7 100644 --- a/crates/iota-graphql-rpc/src/types/move_object.rs +++ b/crates/iota-graphql-rpc/src/types/move_object.rs @@ -52,7 +52,7 @@ pub(crate) enum MoveObjectDowncastError { /// This interface is implemented by types that represent a Move object on-chain /// (A Move value whose type has `key`). -#[allow(clippy::duplicated_attributes)] +#[expect(clippy::duplicated_attributes)] #[derive(Interface)] #[graphql( name = "IMoveObject", diff --git a/crates/iota-graphql-rpc/src/types/object.rs b/crates/iota-graphql-rpc/src/types/object.rs index 4a57b49c764..ae2d53767f3 100644 --- a/crates/iota-graphql-rpc/src/types/object.rs +++ b/crates/iota-graphql-rpc/src/types/object.rs @@ -88,7 +88,7 @@ pub(crate) struct Object { pub(crate) struct ObjectImpl<'o>(pub &'o Object); #[derive(Clone, Debug)] -#[allow(clippy::large_enum_variant)] +#[expect(clippy::large_enum_variant)] pub(crate) enum ObjectKind { /// An object loaded from serialized data, such as the contents of a /// transaction that hasn't been indexed yet. @@ -243,7 +243,7 @@ pub(crate) struct HistoricalObjectCursor { /// Interface implemented by on-chain values that are addressable by an ID (also /// referred to as its address). This includes Move objects and packages. -#[allow(clippy::duplicated_attributes)] +#[expect(clippy::duplicated_attributes)] #[derive(Interface)] #[graphql( name = "IObject", diff --git a/crates/iota-graphql-rpc/src/types/owner.rs b/crates/iota-graphql-rpc/src/types/owner.rs index 8f06599e691..d40b51e39bc 100644 --- a/crates/iota-graphql-rpc/src/types/owner.rs +++ b/crates/iota-graphql-rpc/src/types/owner.rs @@ -56,7 +56,7 @@ pub(crate) struct OwnerImpl { /// either the public key of an account or another object. The same address can /// only refer to an account or an object, never both, but it is not possible to /// know which up-front. -#[allow(clippy::duplicated_attributes)] +#[expect(clippy::duplicated_attributes)] #[derive(Interface)] #[graphql( name = "IOwner", diff --git a/crates/iota-indexer/src/apis/transaction_builder_api.rs b/crates/iota-indexer/src/apis/transaction_builder_api.rs index 274a57a64dc..c72ce245d12 100644 --- a/crates/iota-indexer/src/apis/transaction_builder_api.rs +++ b/crates/iota-indexer/src/apis/transaction_builder_api.rs @@ -21,7 +21,7 @@ pub(crate) struct TransactionBuilderApi<T: R2D2Connection + 'static> { } impl<T: R2D2Connection> TransactionBuilderApi<T> { - #[allow(clippy::new_ret_no_self)] + #[expect(clippy::new_ret_no_self)] pub fn new(inner: IndexerReader<T>) -> IotaTransactionBuilderApi { IotaTransactionBuilderApi::new_with_data_reader(std::sync::Arc::new(Self { inner })) } diff --git a/crates/iota-indexer/src/models/tx_indices.rs b/crates/iota-indexer/src/models/tx_indices.rs index 7ca593b6218..3bc562d01f8 100644 --- a/crates/iota-indexer/src/models/tx_indices.rs +++ b/crates/iota-indexer/src/models/tx_indices.rs @@ -96,7 +96,7 @@ pub struct StoredTxKind { pub tx_sequence_number: i64, } -#[allow(clippy::type_complexity)] +#[expect(clippy::type_complexity)] impl TxIndex { pub fn split( self: TxIndex, diff --git a/crates/iota-indexer/src/store/indexer_store.rs b/crates/iota-indexer/src/store/indexer_store.rs index 00281bc11cf..b41b250f28e 100644 --- a/crates/iota-indexer/src/store/indexer_store.rs +++ b/crates/iota-indexer/src/store/indexer_store.rs @@ -18,7 +18,7 @@ use crate::{ }, }; -#[allow(clippy::large_enum_variant)] +#[expect(clippy::large_enum_variant)] pub enum ObjectChangeToCommit { MutatedObject(StoredObject), DeletedObject(StoredDeletedObject), diff --git a/crates/iota-indexer/src/store/pg_indexer_store.rs b/crates/iota-indexer/src/store/pg_indexer_store.rs index d721a5e95e4..007fa538120 100644 --- a/crates/iota-indexer/src/store/pg_indexer_store.rs +++ b/crates/iota-indexer/src/store/pg_indexer_store.rs @@ -135,7 +135,7 @@ SET object_version = EXCLUDED.object_version, pub struct PgIndexerStoreConfig { pub parallel_chunk_size: usize, pub parallel_objects_chunk_size: usize, - #[allow(unused)] + #[expect(unused)] pub epochs_to_keep: Option<u64>, } diff --git a/crates/iota-indexer/tests/ingestion_tests.rs b/crates/iota-indexer/tests/ingestion_tests.rs index 4ed48a2c0f2..9082703db4c 100644 --- a/crates/iota-indexer/tests/ingestion_tests.rs +++ b/crates/iota-indexer/tests/ingestion_tests.rs @@ -2,7 +2,7 @@ // Modifications Copyright (c) 2024 IOTA Stiftung // SPDX-License-Identifier: Apache-2.0 -#[allow(dead_code)] +#[expect(dead_code)] #[cfg(feature = "pg_integration")] mod common; #[cfg(feature = "pg_integration")] diff --git a/crates/iota-indexer/tests/rpc-tests/main.rs b/crates/iota-indexer/tests/rpc-tests/main.rs index 0479b12703e..2b6e61a280d 100644 --- a/crates/iota-indexer/tests/rpc-tests/main.rs +++ b/crates/iota-indexer/tests/rpc-tests/main.rs @@ -4,7 +4,7 @@ #[cfg(feature = "shared_test_runtime")] mod coin_api; -#[allow(dead_code)] +#[expect(dead_code)] #[path = "../common/mod.rs"] mod common; #[cfg(feature = "shared_test_runtime")] diff --git a/crates/iota-json-rpc/src/authority_state.rs b/crates/iota-json-rpc/src/authority_state.rs index ef03f6576dd..e2b7df71d96 100644 --- a/crates/iota-json-rpc/src/authority_state.rs +++ b/crates/iota-json-rpc/src/authority_state.rs @@ -354,7 +354,6 @@ impl StateRead for AuthorityState { .await?) } - #[allow(clippy::type_complexity)] async fn dry_exec_transaction( &self, transaction: TransactionData, diff --git a/crates/iota-json-rpc/src/axum_router.rs b/crates/iota-json-rpc/src/axum_router.rs index 5957efdcb0d..8037cda0c3f 100644 --- a/crates/iota-json-rpc/src/axum_router.rs +++ b/crates/iota-json-rpc/src/axum_router.rs @@ -446,7 +446,6 @@ pub mod ws { } async fn ws_json_rpc_handler<L: Logger>(mut socket: WebSocket, service: JsonRpcService<L>) { - #[allow(clippy::disallowed_methods)] let (tx, mut rx) = mpsc::channel::<String>(MAX_WS_MESSAGE_BUFFER); let sink = MethodSink::new_with_limit(tx, MAX_RESPONSE_SIZE); let bounded_subscriptions = BoundedSubscriptions::new(100); diff --git a/crates/iota-json-rpc/src/transaction_execution_api.rs b/crates/iota-json-rpc/src/transaction_execution_api.rs index 0d128dd1914..32c865b5281 100644 --- a/crates/iota-json-rpc/src/transaction_execution_api.rs +++ b/crates/iota-json-rpc/src/transaction_execution_api.rs @@ -71,7 +71,7 @@ impl TransactionExecutionApi { Ok(data) } - #[allow(clippy::type_complexity)] + #[expect(clippy::type_complexity)] fn prepare_execute_transaction_block( &self, tx_bytes: Base64, diff --git a/crates/iota-light-client/src/bin/light_client.rs b/crates/iota-light-client/src/bin/light_client.rs index 64f6f97df0b..1db8daab15f 100644 --- a/crates/iota-light-client/src/bin/light_client.rs +++ b/crates/iota-light-client/src/bin/light_client.rs @@ -142,7 +142,7 @@ mod tests { } // clippy ignore dead-code - #[allow(dead_code)] + #[expect(dead_code)] async fn write_full_checkpoint( checkpoint_path: &Path, checkpoint: &CheckpointData, diff --git a/crates/iota-macros/src/lib.rs b/crates/iota-macros/src/lib.rs index 672b381ceb0..366067ff0a4 100644 --- a/crates/iota-macros/src/lib.rs +++ b/crates/iota-macros/src/lib.rs @@ -413,7 +413,6 @@ mod test { #[test] #[should_panic] fn test_macro_overflow() { - #[allow(arithmetic_overflow)] fn f() { println!("{}", i32::MAX + 1); } @@ -603,7 +602,6 @@ mod test { #[test] #[should_panic] fn test_macro_overflow() { - #[allow(arithmetic_overflow)] fn f() { println!("{}", i32::MAX + 1); } diff --git a/crates/iota-metrics/src/metrics_network.rs b/crates/iota-metrics/src/metrics_network.rs index f5cb37402a4..e8131f2434e 100644 --- a/crates/iota-metrics/src/metrics_network.rs +++ b/crates/iota-metrics/src/metrics_network.rs @@ -364,7 +364,7 @@ impl MakeCallbackHandler for MetricsMakeCallbackHandler { pub struct MetricsResponseHandler { metrics: Arc<NetworkMetrics>, // The timer is held on to and "observed" once dropped - #[allow(unused)] + #[expect(unused)] timer: HistogramTimer, route: String, excessive_message_size: usize, diff --git a/crates/iota-metrics/src/monitored_mpsc.rs b/crates/iota-metrics/src/monitored_mpsc.rs index ce15ff7fed3..0806d06590b 100644 --- a/crates/iota-metrics/src/monitored_mpsc.rs +++ b/crates/iota-metrics/src/monitored_mpsc.rs @@ -563,7 +563,7 @@ impl<T> Unpin for UnboundedReceiver<T> {} /// and `UnboundedReceiver` pub fn unbounded_channel<T>(name: &str) -> (UnboundedSender<T>, UnboundedReceiver<T>) { let metrics = get_metrics(); - #[allow(clippy::disallowed_methods)] + #[expect(clippy::disallowed_methods)] let (sender, receiver) = mpsc::unbounded_channel(); ( UnboundedSender { diff --git a/crates/iota-network/src/discovery/builder.rs b/crates/iota-network/src/discovery/builder.rs index 0c7a22ecf86..801d322e1fd 100644 --- a/crates/iota-network/src/discovery/builder.rs +++ b/crates/iota-network/src/discovery/builder.rs @@ -29,7 +29,6 @@ pub struct Builder { } impl Builder { - #[allow(clippy::new_without_default)] pub fn new(trusted_peer_change_rx: watch::Receiver<TrustedPeerChangeEvent>) -> Self { Self { config: None, diff --git a/crates/iota-network/src/randomness/mod.rs b/crates/iota-network/src/randomness/mod.rs index 50ed7c09ee1..3bed5180149 100644 --- a/crates/iota-network/src/randomness/mod.rs +++ b/crates/iota-network/src/randomness/mod.rs @@ -920,7 +920,7 @@ impl RandomnessEventLoop { } } - #[allow(clippy::type_complexity)] + #[expect(clippy::type_complexity)] fn remove_partial_sigs_in_range( &mut self, range: ( @@ -952,7 +952,7 @@ impl RandomnessEventLoop { full_sig: Arc<OnceCell<RandomnessSignature>>, ) { // For simtests, we may test not sending partial signatures. - #[allow(unused_mut)] + #[expect(unused_mut)] let mut fail_point_skip_sending = false; fail_point_if!("rb-send-partial-signatures", || { fail_point_skip_sending = true; diff --git a/crates/iota-network/src/state_sync/builder.rs b/crates/iota-network/src/state_sync/builder.rs index 6734aceae26..496e65e08e0 100644 --- a/crates/iota-network/src/state_sync/builder.rs +++ b/crates/iota-network/src/state_sync/builder.rs @@ -32,7 +32,7 @@ pub struct Builder<S> { } impl Builder<()> { - #[allow(clippy::new_without_default)] + #[expect(clippy::new_without_default)] pub fn new() -> Self { Self { store: None, diff --git a/crates/iota-network/src/state_sync/server.rs b/crates/iota-network/src/state_sync/server.rs index 507b34310db..a213c44eec3 100644 --- a/crates/iota-network/src/state_sync/server.rs +++ b/crates/iota-network/src/state_sync/server.rs @@ -234,7 +234,7 @@ where } })?; - struct SemaphoreExtension(#[allow(unused)] OwnedSemaphorePermit); + struct SemaphoreExtension(#[expect(unused)] OwnedSemaphorePermit); inner.call(req).await.map(move |mut response| { // Insert permit as extension so it's not dropped until the response is sent. response diff --git a/crates/iota-node/src/lib.rs b/crates/iota-node/src/lib.rs index 1e2282ea92a..58443bb59e6 100644 --- a/crates/iota-node/src/lib.rs +++ b/crates/iota-node/src/lib.rs @@ -1896,7 +1896,7 @@ impl IotaNode { .store(new_value, Ordering::Relaxed); } - #[allow(unused_variables)] + #[expect(unused_variables)] async fn fetch_jwks( authority: AuthorityName, provider: &OIDCProvider, diff --git a/crates/iota-proc-macros/src/lib.rs b/crates/iota-proc-macros/src/lib.rs index 68e16646ae2..e6542663586 100644 --- a/crates/iota-proc-macros/src/lib.rs +++ b/crates/iota-proc-macros/src/lib.rs @@ -234,7 +234,7 @@ pub fn sim_test(args: TokenStream, item: TokenStream) -> TokenStream { let sig = &input.sig; let body = &input.block; quote! { - #[allow(clippy::needless_return)] + #[expect(clippy::needless_return)] #[tokio::test] #ignore #sig { diff --git a/crates/iota-protocol-config-macros/src/lib.rs b/crates/iota-protocol-config-macros/src/lib.rs index 9d2497e6710..a479c8df658 100644 --- a/crates/iota-protocol-config-macros/src/lib.rs +++ b/crates/iota-protocol-config-macros/src/lib.rs @@ -153,7 +153,7 @@ pub fn accessors_macro(input: TokenStream) -> TokenStream { _ => panic!("Only structs supported."), }; - #[allow(clippy::type_complexity)] + #[expect(clippy::type_complexity)] let ((getters, (test_setters, value_setters)), (value_lookup, field_names_str)): ( (Vec<_>, (Vec<_>, Vec<_>)), (Vec<_>, Vec<_>), @@ -201,7 +201,7 @@ pub fn accessors_macro(input: TokenStream) -> TokenStream { } } - #[allow(non_camel_case_types)] + #[expect(non_camel_case_types)] #[derive(Clone, Serialize, Debug, PartialEq, Deserialize, schemars::JsonSchema)] pub enum ProtocolConfigValue { #(#inner_types(#inner_types),)* diff --git a/crates/iota-protocol-config/src/lib.rs b/crates/iota-protocol-config/src/lib.rs index a216a4efefb..77c62e282f3 100644 --- a/crates/iota-protocol-config/src/lib.rs +++ b/crates/iota-protocol-config/src/lib.rs @@ -1150,7 +1150,7 @@ impl ProtocolConfig { /// potentially returning a protocol config that is incorrect for some /// feature flags. Definitely safe for testing and for protocol version /// 11 and prior. - #[allow(non_snake_case)] + #[expect(non_snake_case)] pub fn get_for_max_version_UNSAFE() -> Self { if Self::load_poison_get_for_min_version() { panic!("get_for_max_version_UNSAFE called on validator"); diff --git a/crates/iota-replay/src/fuzz.rs b/crates/iota-replay/src/fuzz.rs index cc2d5a09c58..d041e740ce8 100644 --- a/crates/iota-replay/src/fuzz.rs +++ b/crates/iota-replay/src/fuzz.rs @@ -183,7 +183,7 @@ impl ReplayFuzzer { } } -#[allow(clippy::large_enum_variant)] +#[expect(clippy::large_enum_variant)] #[derive(Debug, Error, Clone)] pub enum ReplayFuzzError { #[error( diff --git a/crates/iota-replay/src/replay.rs b/crates/iota-replay/src/replay.rs index 0c40b5c52ff..b012b4c2cfc 100644 --- a/crates/iota-replay/src/replay.rs +++ b/crates/iota-replay/src/replay.rs @@ -512,7 +512,7 @@ impl LocalExec { } // TODO: remove this after `futures::executor::block_on` is removed. - #[allow(clippy::disallowed_methods)] + #[expect(clippy::disallowed_methods)] pub fn download_object( &self, object_id: &ObjectID, @@ -557,7 +557,7 @@ impl LocalExec { } // TODO: remove this after `futures::executor::block_on` is removed. - #[allow(clippy::disallowed_methods)] + #[expect(clippy::disallowed_methods)] pub fn download_latest_object( &self, object_id: &ObjectID, @@ -593,7 +593,7 @@ impl LocalExec { } } - #[allow(clippy::disallowed_methods)] + #[expect(clippy::disallowed_methods)] pub fn download_object_by_upper_bound( &self, object_id: &ObjectID, diff --git a/crates/iota-replay/src/types.rs b/crates/iota-replay/src/types.rs index 05c90fffe71..43efba9777d 100644 --- a/crates/iota-replay/src/types.rs +++ b/crates/iota-replay/src/types.rs @@ -75,7 +75,6 @@ fn unspecified_chain() -> Chain { Chain::Unknown } -#[allow(clippy::large_enum_variant)] #[derive(Debug, Error, Clone)] pub enum ReplayEngineError { #[error("IotaError: {:#?}", err)] diff --git a/crates/iota-rest-api/src/reader.rs b/crates/iota-rest-api/src/reader.rs index b387f30f832..0446a499a3f 100644 --- a/crates/iota-rest-api/src/reader.rs +++ b/crates/iota-rest-api/src/reader.rs @@ -265,7 +265,7 @@ impl Iterator for CheckpointTransactionsIter { pub struct CursorInfo { pub checkpoint: CheckpointSequenceNumber, pub timestamp_ms: u64, - #[allow(unused)] + #[expect(unused)] pub index: u64, // None if there are no more transactions in the store diff --git a/crates/iota-rosetta/src/errors.rs b/crates/iota-rosetta/src/errors.rs index 8cda43d91b5..854be4f1967 100644 --- a/crates/iota-rosetta/src/errors.rs +++ b/crates/iota-rosetta/src/errors.rs @@ -29,7 +29,6 @@ use crate::types::{BlockHash, IotaEnv, OperationType, PublicKey}; derive(Display, EnumIter), strum(serialize_all = "kebab-case") )] -#[allow(clippy::enum_variant_names)] pub enum Error { #[error("Unsupported blockchain: {0}")] UnsupportedBlockchain(String), diff --git a/crates/iota-rosetta/src/types.rs b/crates/iota-rosetta/src/types.rs index 8f84205fa94..eadf326efdd 100644 --- a/crates/iota-rosetta/src/types.rs +++ b/crates/iota-rosetta/src/types.rs @@ -753,7 +753,6 @@ pub struct BalanceExemption { #[derive(Serialize)] #[serde(rename_all = "snake_case")] -#[allow(dead_code)] pub enum ExemptionType { GreaterOrEqual, LessOrEqual, @@ -762,7 +761,6 @@ pub enum ExemptionType { #[derive(Serialize)] #[serde(rename_all = "snake_case")] -#[allow(clippy::enum_variant_names, dead_code)] pub enum Case { UpperCase, LowerCase, @@ -799,7 +797,6 @@ pub struct RelatedTransaction { #[derive(Serialize, Deserialize, Clone, Debug)] #[serde(rename_all = "lowercase")] -#[allow(dead_code)] pub enum Direction { Forward, Backward, diff --git a/crates/iota-rosetta/tests/gas_budget_tests.rs b/crates/iota-rosetta/tests/gas_budget_tests.rs index 2029cfaa9ef..6c4ee97465f 100644 --- a/crates/iota-rosetta/tests/gas_budget_tests.rs +++ b/crates/iota-rosetta/tests/gas_budget_tests.rs @@ -24,13 +24,13 @@ use test_cluster::TestClusterBuilder; use crate::rosetta_client::RosettaEndpoint; -#[allow(dead_code)] +#[expect(dead_code)] mod rosetta_client; #[derive(Deserialize, Debug)] #[serde(untagged)] enum TransactionIdentifierResponseResult { - #[allow(unused)] + #[expect(unused)] Success(TransactionIdentifierResponse), Error(RosettaSubmitGasError), } diff --git a/crates/iota-rpc-loadgen/src/payload/mod.rs b/crates/iota-rpc-loadgen/src/payload/mod.rs index 64dfa96d5df..57ec8890d06 100644 --- a/crates/iota-rpc-loadgen/src/payload/mod.rs +++ b/crates/iota-rpc-loadgen/src/payload/mod.rs @@ -173,7 +173,6 @@ impl Command { } #[derive(Clone)] -#[allow(dead_code)] pub enum CommandData { DryRun(DryRun), GetCheckpoints(GetCheckpoints), diff --git a/crates/iota-sdk/examples/utils.rs b/crates/iota-sdk/examples/utils.rs index 8c6b914143b..d9de6f91187 100644 --- a/crates/iota-sdk/examples/utils.rs +++ b/crates/iota-sdk/examples/utils.rs @@ -320,7 +320,7 @@ pub async fn sign_and_execute_transaction( // this function should not be used. It is only used to make clippy happy, // and to reduce the number of allow(dead_code) annotations to just this one -#[allow(dead_code)] +#[expect(dead_code)] async fn just_for_clippy() -> Result<(), anyhow::Error> { let (client, sender, _recipient) = setup_for_write().await?; let _digest = split_coin_digest(&client, &sender).await?; diff --git a/crates/iota-source-validation-service/tests/tests.rs b/crates/iota-source-validation-service/tests/tests.rs index 75c934b2e41..c0104ccaacc 100644 --- a/crates/iota-source-validation-service/tests/tests.rs +++ b/crates/iota-source-validation-service/tests/tests.rs @@ -38,7 +38,7 @@ use tokio::sync::oneshot; const LOCALNET_PORT: u16 = 9000; const TEST_FIXTURES_DIR: &str = "tests/fixture"; -#[allow(clippy::await_holding_lock)] +#[expect(clippy::await_holding_lock)] #[tokio::test] #[ignore] async fn test_end_to_end() -> anyhow::Result<()> { diff --git a/crates/iota-swarm/src/memory/swarm.rs b/crates/iota-swarm/src/memory/swarm.rs index 0824335e0e2..11d20ab51c2 100644 --- a/crates/iota-swarm/src/memory/swarm.rs +++ b/crates/iota-swarm/src/memory/swarm.rs @@ -69,7 +69,7 @@ pub struct SwarmBuilder<R = OsRng> { } impl SwarmBuilder { - #[allow(clippy::new_without_default)] + #[expect(clippy::new_without_default)] pub fn new() -> Self { Self { rng: OsRng, diff --git a/crates/iota-tool/src/commands.rs b/crates/iota-tool/src/commands.rs index 18416b2401f..f0c8625a389 100644 --- a/crates/iota-tool/src/commands.rs +++ b/crates/iota-tool/src/commands.rs @@ -488,7 +488,6 @@ async fn check_locked_object( } impl ToolCommand { - #[allow(clippy::format_in_format_args)] pub async fn execute(self, tracing_handle: TracingHandle) -> Result<(), anyhow::Error> { match self { ToolCommand::LockedObject { diff --git a/crates/iota-tool/src/lib.rs b/crates/iota-tool/src/lib.rs index 27fbe1d2839..da8e0de6d03 100644 --- a/crates/iota-tool/src/lib.rs +++ b/crates/iota-tool/src/lib.rs @@ -148,7 +148,7 @@ where } } -#[allow(clippy::type_complexity)] +#[expect(clippy::type_complexity)] pub struct GroupedObjectOutput { pub grouped_results: BTreeMap< Option<( @@ -221,7 +221,6 @@ impl GroupedObjectOutput { } } -#[allow(clippy::format_in_format_args)] impl std::fmt::Display for GroupedObjectOutput { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { writeln!(f, "available stake: {}", self.available_voting_power)?; diff --git a/crates/iota-transactional-test-runner/src/lib.rs b/crates/iota-transactional-test-runner/src/lib.rs index 7e0667e4889..b0527d3b9bf 100644 --- a/crates/iota-transactional-test-runner/src/lib.rs +++ b/crates/iota-transactional-test-runner/src/lib.rs @@ -56,7 +56,6 @@ pub struct ValidatorWithFullnode { pub kv_store: Arc<TransactionKeyValueStore>, } -#[allow(unused_variables)] /// TODO: better name? #[async_trait::async_trait] pub trait TransactionalAdapter: Send + Sync + ReadStore { diff --git a/crates/iota-types/src/authenticator_state.rs b/crates/iota-types/src/authenticator_state.rs index c350b756723..054af6d6d9e 100644 --- a/crates/iota-types/src/authenticator_state.rs +++ b/crates/iota-types/src/authenticator_state.rs @@ -94,11 +94,10 @@ fn jwk_ord(a: &ActiveJwk, b: &ActiveJwk) -> std::cmp::Ordering { } } -#[allow(clippy::non_canonical_partial_ord_impl)] impl std::cmp::PartialOrd for ActiveJwk { // This must match the sort order defined by jwk_lt in authenticator_state.move fn partial_cmp(&self, other: &Self) -> Option<std::cmp::Ordering> { - Some(jwk_ord(self, other)) + Some(self.cmp(other)) } } diff --git a/crates/iota-types/src/crypto.rs b/crates/iota-types/src/crypto.rs index a78c50b3ca7..7ea6d2cdece 100644 --- a/crates/iota-types/src/crypto.rs +++ b/crates/iota-types/src/crypto.rs @@ -152,7 +152,7 @@ pub fn verify_proof_of_possession( /// * accounts to interact with Iota. /// * Currently we support eddsa and ecdsa on Iota. -#[allow(clippy::large_enum_variant)] +#[expect(clippy::large_enum_variant)] #[derive(Debug, From, PartialEq, Eq)] pub enum IotaKeyPair { Ed25519(Ed25519KeyPair), diff --git a/crates/iota-types/src/effects/effects_v1.rs b/crates/iota-types/src/effects/effects_v1.rs index 3f3458d42b0..5b7c5848c22 100644 --- a/crates/iota-types/src/effects/effects_v1.rs +++ b/crates/iota-types/src/effects/effects_v1.rs @@ -453,7 +453,6 @@ impl TransactionEffectsV1 { .unwrap() as u32 }); - #[allow(clippy::let_and_return)] let result = Self { status, executed_epoch, diff --git a/crates/iota-types/src/effects/mod.rs b/crates/iota-types/src/effects/mod.rs index 0843ffe0d55..2cab0289a9d 100644 --- a/crates/iota-types/src/effects/mod.rs +++ b/crates/iota-types/src/effects/mod.rs @@ -54,7 +54,6 @@ pub const APPROX_SIZE_OF_OWNER: usize = 48; /// The response from processing a transaction or a certified transaction #[enum_dispatch(TransactionEffectsAPI)] #[derive(Eq, PartialEq, Clone, Debug, Serialize, Deserialize)] -#[allow(clippy::large_enum_variant)] pub enum TransactionEffects { V1(TransactionEffectsV1), } diff --git a/crates/iota-types/src/error.rs b/crates/iota-types/src/error.rs index bb89bc3444d..1b5eab9e489 100644 --- a/crates/iota-types/src/error.rs +++ b/crates/iota-types/src/error.rs @@ -675,7 +675,7 @@ pub enum IotaError { } #[repr(u64)] -#[allow(non_camel_case_types)] +#[expect(non_camel_case_types)] #[derive(Clone, Copy, Debug, Eq, Hash, PartialEq, PartialOrd, Ord)] /// Sub-status codes for the `UNKNOWN_VERIFICATION_ERROR` VM Status Code which /// provides more context TODO: add more Vm Status errors. We use @@ -686,7 +686,7 @@ pub enum VMMVerifierErrorSubStatusCode { } #[repr(u64)] -#[allow(non_camel_case_types)] +#[expect(non_camel_case_types)] #[derive(Clone, Copy, Debug, Eq, Hash, PartialEq, PartialOrd, Ord)] /// Sub-status codes for the `MEMORY_LIMIT_EXCEEDED` VM Status Code which /// provides more context diff --git a/crates/iota-types/src/gas.rs b/crates/iota-types/src/gas.rs index 5763c16de35..b8996eae528 100644 --- a/crates/iota-types/src/gas.rs +++ b/crates/iota-types/src/gas.rs @@ -201,7 +201,7 @@ pub mod checked { self.gas_used() as i64 - self.storage_rebate as i64 } - #[allow(clippy::type_complexity)] + #[expect(clippy::type_complexity)] pub fn new_from_txn_effects<'a>( transactions: impl Iterator<Item = &'a TransactionEffects>, ) -> GasCostSummary { diff --git a/crates/iota-types/src/gas_model/gas_v1.rs b/crates/iota-types/src/gas_model/gas_v1.rs index da872086f33..f173d7f7425 100644 --- a/crates/iota-types/src/gas_model/gas_v1.rs +++ b/crates/iota-types/src/gas_model/gas_v1.rs @@ -26,7 +26,7 @@ mod checked { /// After execution a call to `GasStatus::bucketize` will round the /// computation cost to `cost` for the bucket ([`min`, `max`]) the gas /// used falls into. - #[allow(dead_code)] + #[expect(dead_code)] pub(crate) struct ComputationBucket { min: u64, max: u64, @@ -165,7 +165,6 @@ mod checked { pub new_size: u64, } - #[allow(dead_code)] #[derive(Debug)] pub struct IotaGasStatus { // GasStatus as used by the VM, that is all the VM sees diff --git a/crates/iota-types/src/gas_model/tables.rs b/crates/iota-types/src/gas_model/tables.rs index 5959704e61b..77ad4819e9b 100644 --- a/crates/iota-types/src/gas_model/tables.rs +++ b/crates/iota-types/src/gas_model/tables.rs @@ -49,7 +49,6 @@ pub static INITIAL_COST_SCHEDULE: Lazy<CostTable> = Lazy::new(initial_cost_sched /// Provide all the proper guarantees about gas metering in the Move VM. /// /// Every client must use an instance of this type to interact with the Move VM. -#[allow(dead_code)] #[derive(Debug)] pub struct GasStatus { pub gas_model_version: u64, @@ -151,7 +150,7 @@ impl GasStatus { InternalGas::new(val * Self::INTERNAL_UNIT_MULTIPLIER) } - #[allow(dead_code)] + #[expect(dead_code)] fn to_nanos(&self, val: InternalGas) -> u64 { let gas: Gas = InternalGas::to_unit_round_down(val); u64::from(gas) * self.gas_price diff --git a/crates/iota-types/src/messages_checkpoint.rs b/crates/iota-types/src/messages_checkpoint.rs index 50a9f25d252..78cdffaeba2 100644 --- a/crates/iota-types/src/messages_checkpoint.rs +++ b/crates/iota-types/src/messages_checkpoint.rs @@ -60,7 +60,7 @@ pub struct CheckpointRequest { pub certified: bool, } -#[allow(clippy::large_enum_variant)] +#[expect(clippy::large_enum_variant)] #[derive(Clone, Debug, Serialize, Deserialize)] pub enum CheckpointSummaryResponse { Certified(CertifiedCheckpointSummary), @@ -76,7 +76,6 @@ impl CheckpointSummaryResponse { } } -#[allow(clippy::large_enum_variant)] #[derive(Clone, Debug, Serialize, Deserialize)] pub struct CheckpointResponse { pub checkpoint: Option<CheckpointSummaryResponse>, diff --git a/crates/iota-types/src/messages_consensus.rs b/crates/iota-types/src/messages_consensus.rs index 77323a54518..a87ede12052 100644 --- a/crates/iota-types/src/messages_consensus.rs +++ b/crates/iota-types/src/messages_consensus.rs @@ -217,7 +217,6 @@ impl ConsensusTransactionKind { } #[derive(Clone, PartialEq, Eq, Serialize, Deserialize)] -#[allow(clippy::large_enum_variant)] pub enum VersionedDkgMessage { V1(dkg_v1::Message<bls12381::G2Element, bls12381::G2Element>), } diff --git a/crates/iota-types/src/object.rs b/crates/iota-types/src/object.rs index 4cfe292d222..63ef7c06824 100644 --- a/crates/iota-types/src/object.rs +++ b/crates/iota-types/src/object.rs @@ -375,7 +375,6 @@ impl MoveObject { } #[derive(Eq, PartialEq, Debug, Clone, Deserialize, Serialize, Hash)] -#[allow(clippy::large_enum_variant)] pub enum Data { /// An object whose governing logic lives in a published Move module Move(MoveObject), @@ -1058,7 +1057,6 @@ pub fn generate_test_gas_objects() -> Vec<Object> { GAS_OBJECTS.with(|v| v.clone()) } -#[allow(clippy::large_enum_variant)] #[derive(Serialize, Deserialize, Debug)] #[serde(tag = "status", content = "details")] pub enum ObjectRead { @@ -1117,7 +1115,6 @@ impl Display for ObjectRead { } } -#[allow(clippy::large_enum_variant)] #[derive(Serialize, Deserialize, Debug)] #[serde(tag = "status", content = "details")] pub enum PastObjectRead { diff --git a/crates/iota-types/src/timelock/mod.rs b/crates/iota-types/src/timelock/mod.rs index ad30def1808..9fa70613509 100644 --- a/crates/iota-types/src/timelock/mod.rs +++ b/crates/iota-types/src/timelock/mod.rs @@ -3,7 +3,7 @@ pub mod label; pub mod stardust_upgrade_label; -#[allow(clippy::module_inception)] +#[expect(clippy::module_inception)] pub mod timelock; pub mod timelocked_staked_iota; pub mod timelocked_staking; diff --git a/crates/iota-util-mem-derive/lib.rs b/crates/iota-util-mem-derive/lib.rs index d2f308c2e52..83939225beb 100644 --- a/crates/iota-util-mem-derive/lib.rs +++ b/crates/iota-util-mem-derive/lib.rs @@ -76,7 +76,7 @@ fn malloc_size_of_derive(s: synstructure::Structure) -> proc_macro2::TokenStream let tokens = quote! { impl #impl_generics iota_util_mem::MallocSizeOf for #name #ty_generics #where_clause { #[inline] - #[allow(unused_variables, unused_mut, unreachable_code)] + #[expect(unused_variables, unused_mut, unreachable_code)] fn size_of(&self, ops: &mut iota_util_mem::MallocSizeOfOps) -> usize { let mut sum = 0; match *self { diff --git a/crates/iota/src/client_ptb/builder.rs b/crates/iota/src/client_ptb/builder.rs index b8678f11e26..c64514e2f48 100644 --- a/crates/iota/src/client_ptb/builder.rs +++ b/crates/iota/src/client_ptb/builder.rs @@ -1163,7 +1163,7 @@ pub(crate) fn display_did_you_mean<S: AsRef<str> + std::fmt::Display>( // This lint is disabled because it's not good and doesn't look at what you're // actually iterating over. This seems to be a common problem with this lint. // See e.g., https://github.com/rust-lang/rust-clippy/issues/6075 -#[allow(clippy::needless_range_loop)] +#[expect(clippy::needless_range_loop)] fn edit_distance(a: &str, b: &str) -> usize { let mut cache = vec![vec![0; b.len() + 1]; a.len() + 1]; diff --git a/crates/iota/src/genesis_inspector.rs b/crates/iota/src/genesis_inspector.rs index 6cba3824f43..5ebfacb50f1 100644 --- a/crates/iota/src/genesis_inspector.rs +++ b/crates/iota/src/genesis_inspector.rs @@ -27,7 +27,6 @@ const STR_IOTA_DISTRIBUTION: &str = "Iota Distribution"; const STR_OBJECTS: &str = "Objects"; const STR_VALIDATORS: &str = "Validators"; -#[allow(clippy::or_fun_call)] pub(crate) fn examine_genesis_checkpoint(genesis: UnsignedGenesis) { let system_object = genesis .iota_system_object() @@ -52,7 +51,7 @@ pub(crate) fn examine_genesis_checkpoint(genesis: UnsignedGenesis) { let mut iota_distribution = BTreeMap::new(); let entry = iota_distribution .entry("Iota System".to_string()) - .or_insert(BTreeMap::new()); + .or_insert_with(BTreeMap::new); entry.insert( "Storage Fund".to_string(), ( @@ -150,7 +149,7 @@ pub(crate) fn examine_genesis_checkpoint(genesis: UnsignedGenesis) { } } -#[allow(clippy::ptr_arg)] +#[expect(clippy::ptr_arg)] fn examine_validators( validator_options: &Vec<&str>, validator_map: &BTreeMap<&str, &IotaValidatorGenesis>, diff --git a/crates/iota/src/iota_commands.rs b/crates/iota/src/iota_commands.rs index 54cad050dae..e607b8dc183 100644 --- a/crates/iota/src/iota_commands.rs +++ b/crates/iota/src/iota_commands.rs @@ -146,7 +146,6 @@ impl IndexerFeatureArgs { } } -#[allow(clippy::large_enum_variant)] #[derive(Parser)] #[clap(rename_all = "kebab-case")] pub enum IotaCommand { diff --git a/crates/iota/src/keytool.rs b/crates/iota/src/keytool.rs index 246848e4c10..95b5c427139 100644 --- a/crates/iota/src/keytool.rs +++ b/crates/iota/src/keytool.rs @@ -59,7 +59,6 @@ use crate::key_identity::{KeyIdentity, get_identity_address_from_keystore}; #[path = "unit_tests/keytool_tests.rs"] mod keytool_tests; -#[allow(clippy::large_enum_variant)] #[derive(Subcommand)] #[clap(rename_all = "kebab-case")] pub enum KeyToolCommand { diff --git a/crates/simulacrum/src/lib.rs b/crates/simulacrum/src/lib.rs index 6a09576cc08..2165600de93 100644 --- a/crates/simulacrum/src/lib.rs +++ b/crates/simulacrum/src/lib.rs @@ -67,7 +67,7 @@ use self::{epoch_state::EpochState, store::in_mem_store::KeyStore}; pub struct Simulacrum<R = OsRng, Store: SimulatorStore = InMemoryStore> { rng: R, keystore: KeyStore, - #[allow(unused)] + #[expect(unused)] genesis: genesis::Genesis, store: Store, checkpoint_builder: MockCheckpointBuilder, @@ -83,7 +83,7 @@ pub struct Simulacrum<R = OsRng, Store: SimulatorStore = InMemoryStore> { impl Simulacrum { /// Create a new, random Simulacrum instance using an `OsRng` as the source /// of randomness. - #[allow(clippy::new_without_default)] + #[expect(clippy::new_without_default)] pub fn new() -> Self { Self::new_with_rng(OsRng) } diff --git a/crates/simulacrum/src/store/in_mem_store.rs b/crates/simulacrum/src/store/in_mem_store.rs index cd05dc3e8a4..9433000e28d 100644 --- a/crates/simulacrum/src/store/in_mem_store.rs +++ b/crates/simulacrum/src/store/in_mem_store.rs @@ -329,7 +329,6 @@ impl ObjectStore for InMemoryStore { #[derive(Debug)] pub struct KeyStore { validator_keys: BTreeMap<AuthorityName, AuthorityKeyPair>, - #[allow(unused)] account_keys: BTreeMap<IotaAddress, AccountKeyPair>, } diff --git a/crates/telemetry-subscribers/src/lib.rs b/crates/telemetry-subscribers/src/lib.rs index acebb2fb213..03ce9b0ba6c 100644 --- a/crates/telemetry-subscribers/src/lib.rs +++ b/crates/telemetry-subscribers/src/lib.rs @@ -69,9 +69,10 @@ pub struct TelemetryConfig { } #[must_use] -#[allow(dead_code)] pub struct TelemetryGuards { + #[expect(unused)] worker_guard: WorkerGuard, + #[expect(unused)] provider: Option<TracerProvider>, } diff --git a/crates/typed-store-derive/src/lib.rs b/crates/typed-store-derive/src/lib.rs index 9c61652616a..e1997e40824 100644 --- a/crates/typed-store-derive/src/lib.rs +++ b/crates/typed-store-derive/src/lib.rs @@ -380,7 +380,7 @@ pub fn derive_dbmap_utils_general(input: TokenStream) -> TokenStream { /// Only one process is allowed to do this at a time /// `global_db_options_override` apply to the whole DB /// `tables_db_options_override` apply to each table. If `None`, the attributes from `default_options_override_fn` are used if any - #[allow(unused_parens)] + #[expect(unused_parens)] pub fn open_tables_read_write( path: std::path::PathBuf, metric_conf: typed_store::rocks::MetricConf, @@ -395,7 +395,7 @@ pub fn derive_dbmap_utils_general(input: TokenStream) -> TokenStream { } } - #[allow(unused_parens)] + #[expect(unused_parens)] pub fn open_tables_read_write_with_deprecation_option( path: std::path::PathBuf, metric_conf: typed_store::rocks::MetricConf, @@ -415,7 +415,7 @@ pub fn derive_dbmap_utils_general(input: TokenStream) -> TokenStream { /// Only one process is allowed to do this at a time /// `global_db_options_override` apply to the whole DB /// `tables_db_options_override` apply to each table. If `None`, the attributes from `default_options_override_fn` are used if any - #[allow(unused_parens)] + #[expect(unused_parens)] pub fn open_tables_transactional( path: std::path::PathBuf, metric_conf: typed_store::rocks::MetricConf, @@ -794,7 +794,7 @@ pub fn derive_sallydb_general(input: TokenStream) -> TokenStream { /// Only one process is allowed to do this at a time /// `global_db_options_override` apply to the whole DB /// `tables_db_options_override` apply to each table. If `None`, the attributes from `default_options_override_fn` are used if any - #[allow(unused_parens)] + #[expect(unused_parens)] pub fn init( db_options: typed_store::sally::SallyDBOptions ) -> Self { diff --git a/crates/typed-store/src/rocks/mod.rs b/crates/typed-store/src/rocks/mod.rs index d142afddf15..3787e540cfd 100644 --- a/crates/typed-store/src/rocks/mod.rs +++ b/crates/typed-store/src/rocks/mod.rs @@ -351,7 +351,7 @@ impl RocksDB { fail_point!("delete-cf-before"); let ret = delegate_call!(self.delete_cf_opt(cf, key, writeopts)); fail_point!("delete-cf-after"); - #[allow(clippy::let_and_return)] + #[expect(clippy::let_and_return)] ret } @@ -373,7 +373,7 @@ impl RocksDB { fail_point!("put-cf-before"); let ret = delegate_call!(self.put_cf_opt(cf, key, value, writeopts)); fail_point!("put-cf-after"); - #[allow(clippy::let_and_return)] + #[expect(clippy::let_and_return)] ret } @@ -414,7 +414,7 @@ impl RocksDB { )), }; fail_point!("batch-write-after"); - #[allow(clippy::let_and_return)] + #[expect(clippy::let_and_return)] ret } @@ -2837,7 +2837,7 @@ fn is_max(v: &[u8]) -> bool { v.iter().all(|&x| x == u8::MAX) } -#[allow(clippy::assign_op_pattern)] +#[expect(clippy::assign_op_pattern)] #[test] fn test_helpers() { let v = vec![]; diff --git a/examples/tic-tac-toe/cli/src/turn_cap.rs b/examples/tic-tac-toe/cli/src/turn_cap.rs index 73af874cc6e..9ee96ed8435 100644 --- a/examples/tic-tac-toe/cli/src/turn_cap.rs +++ b/examples/tic-tac-toe/cli/src/turn_cap.rs @@ -2,12 +2,11 @@ // Modifications Copyright (c) 2024 IOTA Stiftung // SPDX-License-Identifier: Apache-2.0 -use serde::Deserialize; use iota_types::base_types::ObjectID; +use serde::Deserialize; -/// Rust representation of a Move `owned::TurnCap`, suitable for deserializing from their BCS -/// representation. -#[allow(dead_code)] +/// Rust representation of a Move `owned::TurnCap`, suitable for deserializing +/// from their BCS representation. #[derive(Deserialize)] pub(crate) struct TurnCap { pub id: ObjectID, diff --git a/iota-execution/latest/iota-adapter/src/gas_charger.rs b/iota-execution/latest/iota-adapter/src/gas_charger.rs index d83e38ba39b..be082050188 100644 --- a/iota-execution/latest/iota-adapter/src/gas_charger.rs +++ b/iota-execution/latest/iota-adapter/src/gas_charger.rs @@ -28,14 +28,14 @@ pub mod checked { /// All the information about gas is stored in this object. /// The objective here is two-fold: /// 1- Isolate al version info into a single entry point. This file and the - /// other gas related files are the only one that check for gas + /// other gas related files are the only one that check for gas /// version. 2- Isolate all gas accounting into a single implementation. - /// Gas objects are not passed around, and they are retrieved from + /// Gas objects are not passed around, and they are retrieved from /// this instance. - #[allow(dead_code)] #[derive(Debug)] pub struct GasCharger { tx_digest: TransactionDigest, + #[expect(unused)] gas_model_version: u64, gas_coins: Vec<ObjectRef>, // this is the first gas coin in `gas_coins` and the one that all others will diff --git a/iota-execution/latest/iota-adapter/src/programmable_transactions/execution.rs b/iota-execution/latest/iota-adapter/src/programmable_transactions/execution.rs index b382a447ffc..60dff0ae180 100644 --- a/iota-execution/latest/iota-adapter/src/programmable_transactions/execution.rs +++ b/iota-execution/latest/iota-adapter/src/programmable_transactions/execution.rs @@ -844,7 +844,7 @@ mod checked { /// instances using the protocol's binary configuration. The function /// ensures that the module list is not empty and converts any /// deserialization errors into an `ExecutionError`. - #[allow(clippy::extra_unused_type_parameters)] + #[expect(clippy::extra_unused_type_parameters)] fn deserialize_modules<Mode: ExecutionMode>( context: &mut ExecutionContext<'_, '_, '_>, module_bytes: &[Vec<u8>], diff --git a/iota-execution/latest/iota-move-natives/src/object_runtime/object_store.rs b/iota-execution/latest/iota-move-natives/src/object_runtime/object_store.rs index 50ef7d78cc3..fcada9506e3 100644 --- a/iota-execution/latest/iota-move-natives/src/object_runtime/object_store.rs +++ b/iota-execution/latest/iota-move-natives/src/object_runtime/object_store.rs @@ -229,7 +229,6 @@ impl Inner<'_> { Ok(obj_opt) } - #[allow(clippy::map_entry)] fn get_or_fetch_object_from_store( &mut self, parent: ObjectID, From 5ede92911bac533489ae3f8387a8755a6b7d6a29 Mon Sep 17 00:00:00 2001 From: Marc Espin <mespinsanz@gmail.com> Date: Mon, 16 Dec 2024 15:03:33 +0100 Subject: [PATCH 55/97] fix(pnpm): Lock ws to 8.18.0 (#4469) --- package.json | 3 ++- pnpm-lock.yaml | 59 +++++--------------------------------------------- 2 files changed, 8 insertions(+), 54 deletions(-) diff --git a/package.json b/package.json index 653580fe2fc..76d65042397 100644 --- a/package.json +++ b/package.json @@ -45,7 +45,8 @@ "eslint": "8.57.1", "mermaid@10.9.1": "10.9.3", "http-proxy-middleware": "2.0.7", - "cross-spawn": "7.0.5" + "cross-spawn": "7.0.5", + "ws": "8.18.0" } }, "engines": { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index e765a5f6859..6aba893215d 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -21,6 +21,7 @@ overrides: mermaid@10.9.1: 10.9.3 http-proxy-middleware: 2.0.7 cross-spawn: 7.0.5 + ws: 8.18.0 importers: @@ -2019,7 +2020,7 @@ importers: specifier: ^7.2.0 version: 7.2.0 ws: - specifier: ^8.18.0 + specifier: 8.18.0 version: 8.18.0 sdk/wallet-standard: @@ -8201,9 +8202,6 @@ packages: resolution: {integrity: sha512-LElXdjswlqjWrPpJFg1Fx4wpkOCxj1TDHlSV4PlaRxHGWko024xICaa97ZkMfs6DRKlCguiAI+rbXv5GWwXIkg==} hasBin: true - async-limiter@1.0.1: - resolution: {integrity: sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==} - async@3.2.2: resolution: {integrity: sha512-H0E+qZaDEfx/FY4t7iLRv1W2fFI6+pyCeTw1uN20AQPiwqwM6ojPxHxdLv4z8hi2DtnW9BOckSspLucW7pIE5g==} @@ -11593,7 +11591,7 @@ packages: isomorphic-ws@5.0.0: resolution: {integrity: sha512-muId7Zzn9ywDsyXgTIafTry2sV3nySZeUDe6YedVd1Hvuuep5AsIlqK+XefWpYTyJG5e503F2xIuT2lcU6rCSw==} peerDependencies: - ws: '*' + ws: 8.18.0 isstream@0.1.2: resolution: {integrity: sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==} @@ -16666,41 +16664,6 @@ packages: resolution: {integrity: sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==} engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} - ws@6.2.3: - resolution: {integrity: sha512-jmTjYU0j60B+vHey6TfR3Z7RD61z/hmxBS3VMSGIrroOWXQEneK1zNuotOUrGyBHQj0yrpsLHPWtigEFd13ndA==} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: ^5.0.2 - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - - ws@7.5.10: - resolution: {integrity: sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==} - engines: {node: '>=8.3.0'} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: ^5.0.2 - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - - ws@8.13.0: - resolution: {integrity: sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==} - engines: {node: '>=10.0.0'} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: '>=5.0.2' - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - ws@8.18.0: resolution: {integrity: sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==} engines: {node: '>=10.0.0'} @@ -25625,8 +25588,6 @@ snapshots: astring@1.9.0: {} - async-limiter@1.0.1: {} - async@3.2.2: {} asynckit@0.4.0: {} @@ -32813,7 +32774,7 @@ snapshots: progress: 2.0.3 proxy-from-env: 1.1.0 rimraf: 2.7.1 - ws: 6.2.3 + ws: 8.18.0 transitivePeerDependencies: - bufferutil - supports-color @@ -35734,7 +35695,7 @@ snapshots: tmp: 0.2.1 update-notifier: 6.0.2 watchpack: 2.4.0 - ws: 8.13.0 + ws: 8.18.0 yargs: 17.7.1 zip-dir: 2.0.0 transitivePeerDependencies: @@ -36009,7 +35970,7 @@ snapshots: opener: 1.5.2 picocolors: 1.1.0 sirv: 2.0.4 - ws: 7.5.10 + ws: 8.18.0 transitivePeerDependencies: - bufferutil - utf-8-validate @@ -36368,14 +36329,6 @@ snapshots: imurmurhash: 0.1.4 signal-exit: 3.0.7 - ws@6.2.3: - dependencies: - async-limiter: 1.0.1 - - ws@7.5.10: {} - - ws@8.13.0: {} - ws@8.18.0: {} xdg-basedir@5.1.0: {} From 62f51bd23acdbc258d1d8e3729eef21caef41c28 Mon Sep 17 00:00:00 2001 From: JCNoguera <88061365+VmMad@users.noreply.github.com> Date: Mon, 16 Dec 2024 18:52:02 +0100 Subject: [PATCH 56/97] feat(dashboard): add migratable object details (#4424) * feat(dashboard): add migration overview * feat: refine values * fix: update summarizeMigratableObjectValues function * feat(dashboard): add migratable object details * feat: add object details * fix: add missing type * feat: use react query to cache data * refactor: show expiration label correctly * feat: add missing asset fallback * feat: simplify code, add correct timestamps * fix: remove package id * fix: bring back missing logic * fix: remove unnecesary memos and improve skeleton * perf: fetch objects in chunks * fix: remove duplicated export * fix: show correct time in expiration * feat: disable buttons * fix: remove file and improve sorting --- .../migration/createMigrationTransaction.ts | 21 +- apps/core/src/utils/parseObjectDetails.ts | 14 +- apps/ui-kit/src/lib/components/atoms/index.ts | 1 + .../components/atoms/skeleton/Skeleton.tsx | 47 ++++ .../lib/components/atoms/skeleton/index.ts | 4 + .../stories/atoms/Skeleton.stories.tsx | 33 +++ .../app/(protected)/migrations/page.tsx | 231 +++++++++++------ .../components/MigrationOverview.tsx | 2 +- .../components/Popup/Popups/MigratePopup.tsx | 4 +- .../components/VirtualList.tsx | 55 +++-- apps/wallet-dashboard/components/index.ts | 1 + .../migration/MigrationObjectsPanel.tsx | 141 +++++++++++ .../components/migration/index.ts | 4 + .../MigrationObjectDetailsCard.tsx | 155 ++++++++++++ .../migration-object-details-card/index.ts | 4 + apps/wallet-dashboard/hooks/index.ts | 1 + .../hooks/useGetCurrentEpochEndTimestamp.ts | 21 ++ .../hooks/useGetStardustMigratableObjects.ts | 61 +++-- ...GroupedMigrationObjectsByExpirationDate.ts | 59 +++++ apps/wallet-dashboard/lib/constants/index.ts | 1 + .../lib/constants/migration.constants.ts | 15 ++ .../enums/commonMigrationObjectType.enums.ts | 8 + apps/wallet-dashboard/lib/enums/index.ts | 3 + .../enums/stardustOutputDetailsFilter.enum.ts | 10 + .../stardustOutputMigrationStatus.enum.ts | 7 + apps/wallet-dashboard/lib/types/index.ts | 4 + .../lib/types/stardustMigrationObjects.ts | 33 +++ .../migration/filterMigrationObjectDetails.ts | 37 +++ .../utils/migration/groupMigrationObjects.ts | 232 ++++++++++++++++++ .../groupStardustObjectsByMigrationStatus.ts} | 74 ++++-- .../lib/utils/migration/index.ts | 6 + 31 files changed, 1133 insertions(+), 156 deletions(-) create mode 100644 apps/ui-kit/src/lib/components/atoms/skeleton/Skeleton.tsx create mode 100644 apps/ui-kit/src/lib/components/atoms/skeleton/index.ts create mode 100644 apps/ui-kit/src/storybook/stories/atoms/Skeleton.stories.tsx create mode 100644 apps/wallet-dashboard/components/migration/MigrationObjectsPanel.tsx create mode 100644 apps/wallet-dashboard/components/migration/index.ts create mode 100644 apps/wallet-dashboard/components/migration/migration-object-details-card/MigrationObjectDetailsCard.tsx create mode 100644 apps/wallet-dashboard/components/migration/migration-object-details-card/index.ts create mode 100644 apps/wallet-dashboard/hooks/useGetCurrentEpochEndTimestamp.ts create mode 100644 apps/wallet-dashboard/hooks/useGroupedMigrationObjectsByExpirationDate.ts create mode 100644 apps/wallet-dashboard/lib/constants/migration.constants.ts create mode 100644 apps/wallet-dashboard/lib/enums/commonMigrationObjectType.enums.ts create mode 100644 apps/wallet-dashboard/lib/enums/stardustOutputDetailsFilter.enum.ts create mode 100644 apps/wallet-dashboard/lib/enums/stardustOutputMigrationStatus.enum.ts create mode 100644 apps/wallet-dashboard/lib/types/index.ts create mode 100644 apps/wallet-dashboard/lib/types/stardustMigrationObjects.ts create mode 100644 apps/wallet-dashboard/lib/utils/migration/filterMigrationObjectDetails.ts create mode 100644 apps/wallet-dashboard/lib/utils/migration/groupMigrationObjects.ts rename apps/wallet-dashboard/lib/utils/{migration.ts => migration/groupStardustObjectsByMigrationStatus.ts} (53%) create mode 100644 apps/wallet-dashboard/lib/utils/migration/index.ts diff --git a/apps/core/src/utils/migration/createMigrationTransaction.ts b/apps/core/src/utils/migration/createMigrationTransaction.ts index 8519a950831..c5ac17fa556 100644 --- a/apps/core/src/utils/migration/createMigrationTransaction.ts +++ b/apps/core/src/utils/migration/createMigrationTransaction.ts @@ -1,7 +1,7 @@ // Copyright (c) 2024 IOTA Stiftung // SPDX-License-Identifier: Apache-2.0 -import { IotaClient, IotaObjectData } from '@iota/iota-sdk/client'; +import { DynamicFieldInfo, IotaClient, IotaObjectData } from '@iota/iota-sdk/client'; import { Transaction } from '@iota/iota-sdk/transactions'; import { STARDUST_PACKAGE_ID } from '../../constants/migration.constants'; import { IOTA_TYPE_ARG } from '@iota/iota-sdk/utils'; @@ -17,21 +17,28 @@ type NestedResultType = { NestedResult: [number, number]; }; -export async function getNativeTokenTypesFromBag( - bagId: string, - client: IotaClient, -): Promise<string[]> { +export async function getNativeTokensFromBag(bagId: string, client: IotaClient) { const nativeTokenDynamicFields = await client.getDynamicFields({ parentId: bagId, }); - const nativeTokenTypes: string[] = []; + const nativeTokenTypes: DynamicFieldInfo[] = []; for (const nativeToken of nativeTokenDynamicFields.data) { - nativeTokenTypes.push(nativeToken?.name?.value as string); + nativeTokenTypes.push(nativeToken); } return nativeTokenTypes; } +export async function getNativeTokenTypesFromBag( + bagId: string, + client: IotaClient, +): Promise<string[]> { + const nativeTokenDynamicFields = await client.getDynamicFields({ + parentId: bagId, + }); + return nativeTokenDynamicFields.data.map(({ name }) => name.value as string); +} + export function validateBasicOutputObject(outputObject: IotaObjectData): BasicOutputObject { if (outputObject.content?.dataType !== 'moveObject') { throw new Error('Invalid basic output object'); diff --git a/apps/core/src/utils/parseObjectDetails.ts b/apps/core/src/utils/parseObjectDetails.ts index 76a9884c5d8..fefa3c717e1 100644 --- a/apps/core/src/utils/parseObjectDetails.ts +++ b/apps/core/src/utils/parseObjectDetails.ts @@ -9,10 +9,16 @@ type ObjectChangeWithObjectType = Extract< { objectType: string } >; +type PackageId = string; +type ModuleName = string; +type TypeName = string; export function parseObjectChangeDetails( objectChange: ObjectChangeWithObjectType, -): [string, string, string] { - const [packageId, moduleName, typeName] = - objectChange.objectType?.split('<')[0]?.split('::') || []; - return [packageId, moduleName, typeName]; +): [PackageId, ModuleName, TypeName] { + return extractObjectTypeStruct(objectChange.objectType); +} + +export function extractObjectTypeStruct(objectType: string): [PackageId, ModuleName, TypeName] { + const [packageId, moduleName, functionName] = objectType?.split('<')[0]?.split('::') || []; + return [packageId, moduleName, functionName]; } diff --git a/apps/ui-kit/src/lib/components/atoms/index.ts b/apps/ui-kit/src/lib/components/atoms/index.ts index 373f611cd1e..12a58426391 100644 --- a/apps/ui-kit/src/lib/components/atoms/index.ts +++ b/apps/ui-kit/src/lib/components/atoms/index.ts @@ -19,3 +19,4 @@ export * from './snackbar'; export * from './visual-asset-card'; export * from './loading-indicator'; export * from './placeholder'; +export * from './skeleton'; diff --git a/apps/ui-kit/src/lib/components/atoms/skeleton/Skeleton.tsx b/apps/ui-kit/src/lib/components/atoms/skeleton/Skeleton.tsx new file mode 100644 index 00000000000..9504693f036 --- /dev/null +++ b/apps/ui-kit/src/lib/components/atoms/skeleton/Skeleton.tsx @@ -0,0 +1,47 @@ +// Copyright (c) 2024 IOTA Stiftung +// SPDX-License-Identifier: Apache-2.0 + +import cx from 'classnames'; + +interface SkeletonLoaderProps { + /** + * Width class for the skeleton div. + */ + widthClass?: string; + /** + * Height class for the skeleton div. + */ + heightClass?: string; + /** + * If true, the skeleton will use darker neutral colors. + */ + hasSecondaryColors?: boolean; + /** + * Whether the class `rounded-full` should be applied. Defaults to true. + */ + isRounded?: boolean; +} + +export function Skeleton({ + children, + widthClass = 'w-full', + heightClass = 'h-3', + hasSecondaryColors, + isRounded = true, +}: React.PropsWithChildren<SkeletonLoaderProps>): React.JSX.Element { + return ( + <div + className={cx( + 'animate-pulse rounded-full', + widthClass, + heightClass, + isRounded && 'rounded-full', + hasSecondaryColors + ? 'bg-neutral-80 dark:bg-neutral-10' + : 'bg-neutral-90 dark:bg-neutral-12', + )} + > + {children} + </div> + ); +} diff --git a/apps/ui-kit/src/lib/components/atoms/skeleton/index.ts b/apps/ui-kit/src/lib/components/atoms/skeleton/index.ts new file mode 100644 index 00000000000..4540f454c5f --- /dev/null +++ b/apps/ui-kit/src/lib/components/atoms/skeleton/index.ts @@ -0,0 +1,4 @@ +// Copyright (c) 2024 IOTA Stiftung +// SPDX-License-Identifier: Apache-2.0 + +export * from './Skeleton'; diff --git a/apps/ui-kit/src/storybook/stories/atoms/Skeleton.stories.tsx b/apps/ui-kit/src/storybook/stories/atoms/Skeleton.stories.tsx new file mode 100644 index 00000000000..cb611c8cf08 --- /dev/null +++ b/apps/ui-kit/src/storybook/stories/atoms/Skeleton.stories.tsx @@ -0,0 +1,33 @@ +// Copyright (c) 2024 IOTA Stiftung +// SPDX-License-Identifier: Apache-2.0 + +import type { Meta, StoryObj } from '@storybook/react'; +import { Card, CardImage, ImageShape, Skeleton } from '@/components'; + +const meta: Meta<typeof Skeleton> = { + component: Skeleton, + tags: ['autodocs'], +} satisfies Meta<typeof Skeleton>; + +export default meta; + +type Story = StoryObj<typeof meta>; + +export const SkeletonCard: Story = { + render: () => ( + <Card> + <CardImage shape={ImageShape.SquareRounded}> + <div className="h-10 w-10 animate-pulse bg-neutral-90 dark:bg-neutral-12" /> + <Skeleton widthClass="w-10" heightClass="h-10" isRounded={false} /> + </CardImage> + <div className="flex flex-col gap-y-xs"> + <Skeleton widthClass="w-40" heightClass="h-3.5" /> + <Skeleton widthClass="w-32" heightClass="h-3" hasSecondaryColors /> + </div> + <div className="ml-auto flex flex-col gap-y-xs"> + <Skeleton widthClass="w-20" heightClass="h-3.5" /> + <Skeleton widthClass="w-16" heightClass="h-3" hasSecondaryColors /> + </div> + </Card> + ), +}; diff --git a/apps/wallet-dashboard/app/(protected)/migrations/page.tsx b/apps/wallet-dashboard/app/(protected)/migrations/page.tsx index 544f352e963..acc5dd6f40c 100644 --- a/apps/wallet-dashboard/app/(protected)/migrations/page.tsx +++ b/apps/wallet-dashboard/app/(protected)/migrations/page.tsx @@ -1,10 +1,14 @@ // Copyright (c) 2024 IOTA Stiftung // SPDX-License-Identifier: Apache-2.0 + 'use client'; +import { useState, useMemo, useCallback } from 'react'; +import { useQueryClient } from '@tanstack/react-query'; +import clsx from 'clsx'; import MigratePopup from '@/components/Popup/Popups/MigratePopup'; -import { usePopups } from '@/hooks'; -import { summarizeMigratableObjectValues } from '@/lib/utils'; +import { useGetStardustMigratableObjects, usePopups } from '@/hooks'; +import { summarizeMigratableObjectValues, summarizeUnmigratableObjectValues } from '@/lib/utils'; import { Button, ButtonSize, @@ -16,18 +20,12 @@ import { Panel, Title, } from '@iota/apps-ui-kit'; +import { Assets, Clock, IotaLogoMark, Tokens } from '@iota/ui-icons'; import { useCurrentAccount, useIotaClient } from '@iota/dapp-kit'; import { STARDUST_BASIC_OUTPUT_TYPE, STARDUST_NFT_OUTPUT_TYPE, useFormatCoin } from '@iota/core'; -import { useGetStardustMigratableObjects } from '@/hooks'; -import { useQueryClient } from '@tanstack/react-query'; -import { Assets, Clock, IotaLogoMark, Tokens } from '@iota/ui-icons'; import { IOTA_TYPE_ARG } from '@iota/iota-sdk/utils'; - -interface MigrationDisplayCard { - title: string; - subtitle: string; - icon: React.FC; -} +import { StardustOutputMigrationStatus } from '@/lib/enums'; +import { MigrationObjectsPanel } from '@/components'; function MigrationDashboardPage(): JSX.Element { const account = useCurrentAccount(); @@ -36,98 +34,128 @@ function MigrationDashboardPage(): JSX.Element { const queryClient = useQueryClient(); const iotaClient = useIotaClient(); + const [selectedStardustObjectsCategory, setSelectedStardustObjectsCategory] = useState< + StardustOutputMigrationStatus | undefined + >(undefined); + + const { data: stardustMigrationObjects, isPlaceholderData } = + useGetStardustMigratableObjects(address); const { migratableBasicOutputs, - unmigratableBasicOutputs, migratableNftOutputs, + unmigratableBasicOutputs, unmigratableNftOutputs, - } = useGetStardustMigratableObjects(address); + } = stardustMigrationObjects || {}; + + const { + totalIotaAmount, + totalNativeTokens: migratableNativeTokens, + totalVisualAssets: migratableVisualAssets, + } = summarizeMigratableObjectValues({ + basicOutputs: migratableBasicOutputs, + nftOutputs: migratableNftOutputs, + address, + }); + const { totalUnmigratableObjects } = summarizeUnmigratableObjectValues({ + basicOutputs: unmigratableBasicOutputs, + nftOutputs: unmigratableNftOutputs, + }); const hasMigratableObjects = - migratableBasicOutputs.length > 0 || migratableNftOutputs.length > 0; - - function handleOnSuccess(digest: string): void { - iotaClient - .waitForTransaction({ - digest, - }) - .then(() => { + (migratableBasicOutputs?.length || 0) > 0 && (migratableNftOutputs?.length || 0) > 0; + + const [timelockedIotaTokens, symbol] = useFormatCoin(totalIotaAmount, IOTA_TYPE_ARG); + + const handleOnSuccess = useCallback( + (digest: string) => { + iotaClient.waitForTransaction({ digest }).then(() => { queryClient.invalidateQueries({ queryKey: [ 'get-all-owned-objects', address, - { - StructType: STARDUST_BASIC_OUTPUT_TYPE, - }, + { StructType: STARDUST_BASIC_OUTPUT_TYPE }, ], }); queryClient.invalidateQueries({ queryKey: [ 'get-all-owned-objects', address, - { - StructType: STARDUST_NFT_OUTPUT_TYPE, - }, + { StructType: STARDUST_NFT_OUTPUT_TYPE }, ], }); }); - } - function openMigratePopup(): void { - openPopup( - <MigratePopup - basicOutputObjects={migratableBasicOutputs} - nftOutputObjects={migratableNftOutputs} - closePopup={closePopup} - onSuccess={handleOnSuccess} - />, - ); - } - - const { - accumulatedIotaAmount: accumulatedTimelockedIotaAmount, - totalNativeTokens, - totalVisualAssets, - } = summarizeMigratableObjectValues({ - migratableBasicOutputs, - migratableNftOutputs, - address, - }); - - const [timelockedIotaTokens, symbol] = useFormatCoin( - accumulatedTimelockedIotaAmount, - IOTA_TYPE_ARG, + }, + [iotaClient, queryClient, address], ); - const MIGRATION_CARDS: MigrationDisplayCard[] = [ + const MIGRATION_CARDS: MigrationDisplayCardProps[] = [ { title: `${timelockedIotaTokens} ${symbol}`, subtitle: 'IOTA Tokens', icon: IotaLogoMark, }, { - title: `${totalNativeTokens}`, + title: `${migratableNativeTokens}`, subtitle: 'Native Tokens', icon: Tokens, }, { - title: `${totalVisualAssets}`, + title: `${migratableVisualAssets}`, subtitle: 'Visual Assets', icon: Assets, }, ]; - const timelockedAssetsAmount = unmigratableBasicOutputs.length + unmigratableNftOutputs.length; - const TIMELOCKED_ASSETS_CARDS: MigrationDisplayCard[] = [ + const TIMELOCKED_ASSETS_CARDS: MigrationDisplayCardProps[] = [ { - title: `${timelockedAssetsAmount}`, + title: `${totalUnmigratableObjects}`, subtitle: 'Time-locked', icon: Clock, }, ]; + const selectedObjects = useMemo(() => { + if (stardustMigrationObjects) { + if (selectedStardustObjectsCategory === StardustOutputMigrationStatus.Migratable) { + return [ + ...stardustMigrationObjects.migratableBasicOutputs, + ...stardustMigrationObjects.migratableNftOutputs, + ]; + } else if ( + selectedStardustObjectsCategory === StardustOutputMigrationStatus.TimeLocked + ) { + return [ + ...stardustMigrationObjects.unmigratableBasicOutputs, + ...stardustMigrationObjects.unmigratableNftOutputs, + ]; + } + } + return []; + }, [selectedStardustObjectsCategory, stardustMigrationObjects]); + + function openMigratePopup(): void { + openPopup( + <MigratePopup + basicOutputObjects={migratableBasicOutputs} + nftOutputObjects={migratableNftOutputs} + closePopup={closePopup} + onSuccess={handleOnSuccess} + />, + ); + } + + function handleCloseDetailsPanel() { + setSelectedStardustObjectsCategory(undefined); + } + return ( <div className="flex h-full w-full flex-wrap items-center justify-center space-y-4"> - <div className="flex w-full flex-row justify-center"> + <div + className={clsx( + 'flex h-[700px] w-full flex-row items-stretch', + !selectedStardustObjectsCategory ? 'justify-center' : 'gap-md--rs', + )} + > <div className="flex w-1/3 flex-col gap-md--rs"> <Panel> <Title @@ -143,14 +171,27 @@ function MigrationDashboardPage(): JSX.Element { /> <div className="flex flex-col gap-xs p-md--rs"> {MIGRATION_CARDS.map((card) => ( - <Card key={card.subtitle}> - <CardImage shape={ImageShape.SquareRounded}> - <card.icon /> - </CardImage> - <CardBody title={card.title} subtitle={card.subtitle} /> - </Card> + <MigrationDisplayCard + key={card.subtitle} + isPlaceholder={isPlaceholderData} + {...card} + /> ))} - <Button text="See All" type={ButtonType.Ghost} fullWidth /> + <Button + text="See All" + type={ButtonType.Ghost} + fullWidth + disabled={ + selectedStardustObjectsCategory === + StardustOutputMigrationStatus.Migratable || + !hasMigratableObjects + } + onClick={() => + setSelectedStardustObjectsCategory( + StardustOutputMigrationStatus.Migratable, + ) + } + /> </div> </Panel> @@ -158,20 +199,64 @@ function MigrationDashboardPage(): JSX.Element { <Title title="Time-locked Assets" /> <div className="flex flex-col gap-xs p-md--rs"> {TIMELOCKED_ASSETS_CARDS.map((card) => ( - <Card key={card.subtitle}> - <CardImage shape={ImageShape.SquareRounded}> - <card.icon /> - </CardImage> - <CardBody title={card.title} subtitle={card.subtitle} /> - </Card> + <MigrationDisplayCard + key={card.subtitle} + isPlaceholder={isPlaceholderData} + {...card} + /> ))} - <Button text="See All" type={ButtonType.Ghost} fullWidth /> + <Button + text="See All" + type={ButtonType.Ghost} + fullWidth + disabled={ + selectedStardustObjectsCategory === + StardustOutputMigrationStatus.TimeLocked || + !totalUnmigratableObjects + } + onClick={() => + setSelectedStardustObjectsCategory( + StardustOutputMigrationStatus.TimeLocked, + ) + } + /> </div> </Panel> </div> + + <MigrationObjectsPanel + selectedObjects={selectedObjects} + onClose={handleCloseDetailsPanel} + isTimelocked={ + selectedStardustObjectsCategory === StardustOutputMigrationStatus.TimeLocked + } + /> </div> </div> ); } +interface MigrationDisplayCardProps { + title: string; + subtitle: string; + icon: React.ComponentType; + isPlaceholder?: boolean; +} + +function MigrationDisplayCard({ + title, + subtitle, + icon: Icon, + isPlaceholder, +}: MigrationDisplayCardProps): React.JSX.Element { + return ( + <Card> + <CardImage shape={ImageShape.SquareRounded}> + <Icon /> + </CardImage> + <CardBody title={isPlaceholder ? '--' : title} subtitle={subtitle} /> + </Card> + ); +} + export default MigrationDashboardPage; diff --git a/apps/wallet-dashboard/components/MigrationOverview.tsx b/apps/wallet-dashboard/components/MigrationOverview.tsx index 9b17852f3d5..09faf91737b 100644 --- a/apps/wallet-dashboard/components/MigrationOverview.tsx +++ b/apps/wallet-dashboard/components/MigrationOverview.tsx @@ -12,7 +12,7 @@ export function MigrationOverview() { const router = useRouter(); const account = useCurrentAccount(); const address = account?.address || ''; - const { migratableBasicOutputs, migratableNftOutputs } = + const { data: { migratableBasicOutputs = [], migratableNftOutputs = [] } = {} } = useGetStardustMigratableObjects(address); const needsMigration = migratableBasicOutputs.length > 0 || migratableNftOutputs.length > 0; diff --git a/apps/wallet-dashboard/components/Popup/Popups/MigratePopup.tsx b/apps/wallet-dashboard/components/Popup/Popups/MigratePopup.tsx index 627fb860f3f..e824e41a24d 100644 --- a/apps/wallet-dashboard/components/Popup/Popups/MigratePopup.tsx +++ b/apps/wallet-dashboard/components/Popup/Popups/MigratePopup.tsx @@ -16,8 +16,8 @@ import { NotificationType } from '@/stores/notificationStore'; import { Loader, Warning } from '@iota/ui-icons'; interface MigratePopupProps { - basicOutputObjects: IotaObjectData[]; - nftOutputObjects: IotaObjectData[]; + basicOutputObjects: IotaObjectData[] | undefined; + nftOutputObjects: IotaObjectData[] | undefined; closePopup: () => void; onSuccess?: (digest: string) => void; } diff --git a/apps/wallet-dashboard/components/VirtualList.tsx b/apps/wallet-dashboard/components/VirtualList.tsx index 49178382bfc..54920f7d64c 100644 --- a/apps/wallet-dashboard/components/VirtualList.tsx +++ b/apps/wallet-dashboard/components/VirtualList.tsx @@ -5,6 +5,7 @@ import React, { ReactNode, useEffect } from 'react'; import { useVirtualizer } from '@tanstack/react-virtual'; +import clsx from 'clsx'; interface VirtualListProps<T> { items: T[]; @@ -14,6 +15,8 @@ interface VirtualListProps<T> { estimateSize: (index: number) => number; render: (item: T, index: number) => ReactNode; onClick?: (item: T) => void; + heightClassName?: string; + overflowClassName?: string; } function VirtualList<T>({ @@ -24,6 +27,8 @@ function VirtualList<T>({ estimateSize, render, onClick, + heightClassName = 'h-full', + overflowClassName, }: VirtualListProps<T>): JSX.Element { const containerRef = React.useRef<HTMLDivElement | null>(null); const virtualizer = useVirtualizer({ @@ -61,7 +66,10 @@ function VirtualList<T>({ ]); return ( - <div className="relative h-full w-full" ref={containerRef}> + <div + className={clsx('relative w-full', heightClassName, overflowClassName)} + ref={containerRef} + > <div style={{ height: `${virtualizer.getTotalSize()}px`, @@ -69,27 +77,30 @@ function VirtualList<T>({ position: 'relative', }} > - {virtualItems.map((virtualItem) => ( - <div - key={virtualItem.key} - className={`absolute w-full ${onClick ? 'cursor-pointer' : ''}`} - style={{ - position: 'absolute', - top: 0, - left: 0, - width: '100%', - height: `${virtualItem.size}px`, - transform: `translateY(${virtualItem.start}px)`, - }} - onClick={() => onClick && onClick(items[virtualItem.index])} - > - {virtualItem.index > items.length - 1 - ? hasNextPage - ? 'Loading more...' - : 'Nothing more to load' - : render(items[virtualItem.index], virtualItem.index)} - </div> - ))} + {virtualItems.map((virtualItem) => { + const item = items[virtualItem.index]; + return ( + <div + key={virtualItem.key} + className={`absolute w-full ${onClick ? 'cursor-pointer' : ''}`} + style={{ + position: 'absolute', + top: 0, + left: 0, + width: '100%', + height: `${virtualItem.size}px`, + transform: `translateY(${virtualItem.start}px)`, + }} + onClick={() => onClick && onClick(item)} + > + {virtualItem.index > items.length - 1 + ? hasNextPage + ? 'Loading more...' + : 'Nothing more to load' + : render(item, virtualItem.index)} + </div> + ); + })} </div> </div> ); diff --git a/apps/wallet-dashboard/components/index.ts b/apps/wallet-dashboard/components/index.ts index 37ff834be4f..1e655a49bdc 100644 --- a/apps/wallet-dashboard/components/index.ts +++ b/apps/wallet-dashboard/components/index.ts @@ -23,6 +23,7 @@ export * from './ExplorerLink'; export * from './Dialogs'; export * from './ValidatorStakingData'; export * from './tiles'; +export * from './migration'; export * from './Toaster'; export * from './Banner'; export * from './MigrationOverview'; diff --git a/apps/wallet-dashboard/components/migration/MigrationObjectsPanel.tsx b/apps/wallet-dashboard/components/migration/MigrationObjectsPanel.tsx new file mode 100644 index 00000000000..4d5d80d0af3 --- /dev/null +++ b/apps/wallet-dashboard/components/migration/MigrationObjectsPanel.tsx @@ -0,0 +1,141 @@ +// Copyright (c) 2024 IOTA Stiftung +// SPDX-License-Identifier: Apache-2.0 + +'use client'; + +import { useGroupedMigrationObjectsByExpirationDate } from '@/hooks'; +import { + STARDUST_MIGRATABLE_OBJECTS_FILTER_LIST, + STARDUST_UNMIGRATABLE_OBJECTS_FILTER_LIST, +} from '@/lib/constants'; +import { StardustOutputDetailsFilter } from '@/lib/enums'; +import { + Button, + ButtonType, + Card, + CardImage, + Chip, + ImageShape, + InfoBox, + InfoBoxStyle, + InfoBoxType, + Panel, + Skeleton, + Title, +} from '@iota/apps-ui-kit'; +import type { IotaObjectData } from '@iota/iota-sdk/client'; +import { Close, Warning } from '@iota/ui-icons'; +import clsx from 'clsx'; +import { useState } from 'react'; +import { MigrationObjectDetailsCard } from './migration-object-details-card'; +import VirtualList from '../VirtualList'; +import { filterMigrationObjects } from '@/lib/utils'; + +const FILTERS = { + migratable: STARDUST_MIGRATABLE_OBJECTS_FILTER_LIST, + unmigratable: STARDUST_UNMIGRATABLE_OBJECTS_FILTER_LIST, +}; + +interface MigrationObjectsPanelProps { + selectedObjects: IotaObjectData[]; + onClose: () => void; + isTimelocked: boolean; +} + +export function MigrationObjectsPanel({ + selectedObjects, + onClose, + isTimelocked, +}: MigrationObjectsPanelProps): React.JSX.Element { + const [stardustOutputDetailsFilter, setStardustOutputDetailsFilter] = + useState<StardustOutputDetailsFilter>(StardustOutputDetailsFilter.All); + + const { + data: resolvedObjects = [], + isLoading, + error: isErrored, + } = useGroupedMigrationObjectsByExpirationDate(selectedObjects, isTimelocked); + + const filteredObjects = filterMigrationObjects(resolvedObjects, stardustOutputDetailsFilter); + + const filters = isTimelocked ? FILTERS.unmigratable : FILTERS.migratable; + const isHidden = selectedObjects.length === 0; + + return ( + <div className={clsx('flex h-full min-h-0 w-2/3 flex-col', isHidden && 'hidden')}> + <Panel> + <Title + title="Details" + trailingElement={ + <Button icon={<Close />} type={ButtonType.Ghost} onClick={onClose} /> + } + /> + <div className="flex min-h-0 flex-1 flex-col px-md--rs"> + <div className="flex flex-row gap-xs py-xs"> + {filters.map((filter) => ( + <Chip + key={filter} + label={filter} + onClick={() => setStardustOutputDetailsFilter(filter)} + selected={stardustOutputDetailsFilter === filter} + /> + ))} + </div> + <div className="flex min-h-0 flex-col py-sm"> + <div className="h-full flex-1 overflow-auto"> + {isLoading && <LoadingPanel />} + {isErrored && !isLoading && ( + <div className="flex h-full max-h-full w-full flex-col items-center"> + <InfoBox + title="Error" + supportingText="Failed to load stardust objects" + style={InfoBoxStyle.Elevated} + type={InfoBoxType.Error} + icon={<Warning />} + /> + </div> + )} + {!isLoading && !isErrored && ( + <VirtualList + heightClassName="h-[600px]" + overflowClassName="overflow-y-auto" + items={filteredObjects} + estimateSize={() => 58} + render={(migrationObject) => ( + <MigrationObjectDetailsCard + migrationObject={migrationObject} + isTimelocked={isTimelocked} + /> + )} + /> + )} + </div> + </div> + </div> + </Panel> + </div> + ); +} + +function LoadingPanel() { + return ( + <div className="flex h-full max-h-full w-full flex-col overflow-hidden"> + {new Array(10).fill(0).map((_, index) => ( + <Card key={index}> + <CardImage shape={ImageShape.SquareRounded}> + <div className="h-10 w-10 animate-pulse bg-neutral-90 dark:bg-neutral-12" /> + <Skeleton widthClass="w-10" heightClass="h-10" isRounded={false} /> + </CardImage> + <div className="flex flex-col gap-y-xs"> + <Skeleton widthClass="w-40" heightClass="h-3.5" /> + <Skeleton widthClass="w-32" heightClass="h-3" hasSecondaryColors /> + </div> + <div className="ml-auto flex flex-col gap-y-xs"> + <Skeleton widthClass="w-20" heightClass="h-3.5" /> + <Skeleton widthClass="w-16" heightClass="h-3" hasSecondaryColors /> + </div> + </Card> + ))} + </div> + ); +} diff --git a/apps/wallet-dashboard/components/migration/index.ts b/apps/wallet-dashboard/components/migration/index.ts new file mode 100644 index 00000000000..cf43709989c --- /dev/null +++ b/apps/wallet-dashboard/components/migration/index.ts @@ -0,0 +1,4 @@ +// Copyright (c) 2024 IOTA Stiftung +// SPDX-License-Identifier: Apache-2.0 + +export * from './MigrationObjectsPanel'; diff --git a/apps/wallet-dashboard/components/migration/migration-object-details-card/MigrationObjectDetailsCard.tsx b/apps/wallet-dashboard/components/migration/migration-object-details-card/MigrationObjectDetailsCard.tsx new file mode 100644 index 00000000000..599e58dbd21 --- /dev/null +++ b/apps/wallet-dashboard/components/migration/migration-object-details-card/MigrationObjectDetailsCard.tsx @@ -0,0 +1,155 @@ +// Copyright (c) 2024 IOTA Stiftung +// SPDX-License-Identifier: Apache-2.0 + +import { ExternalImage } from '@/components'; +import { useGetCurrentEpochStartTimestamp } from '@/hooks'; +import { useGetCurrentEpochEndTimestamp } from '@/hooks/useGetCurrentEpochEndTimestamp'; +import { MIGRATION_OBJECT_WITHOUT_UC_KEY } from '@/lib/constants'; +import { CommonMigrationObjectType } from '@/lib/enums'; +import { ResolvedObjectTypes } from '@/lib/types'; +import { Card, CardBody, CardImage, ImageShape, LabelText, LabelTextSize } from '@iota/apps-ui-kit'; +import { MILLISECONDS_PER_SECOND, TimeUnit, useFormatCoin, useTimeAgo } from '@iota/core'; +import { IOTA_TYPE_ARG } from '@iota/iota-sdk/utils'; +import { Assets, DataStack, IotaLogoMark } from '@iota/ui-icons'; +import { useState } from 'react'; + +interface MigrationObjectDetailsCardProps { + migrationObject: ResolvedObjectTypes; + isTimelocked: boolean; +} +export function MigrationObjectDetailsCard({ + migrationObject: { unlockConditionTimestamp, ...migrationObject }, + isTimelocked: isTimelocked, +}: MigrationObjectDetailsCardProps) { + const coinType = 'coinType' in migrationObject ? migrationObject.coinType : IOTA_TYPE_ARG; + const [balance, token] = useFormatCoin(migrationObject.balance, coinType); + + switch (migrationObject.commonObjectType) { + case CommonMigrationObjectType.Basic: + return ( + <MigrationObjectCard + title={`${balance} ${token}`} + subtitle="IOTA Tokens" + unlockConditionTimestamp={unlockConditionTimestamp} + image={<IotaLogoMark />} + isTimelocked={isTimelocked} + /> + ); + case CommonMigrationObjectType.Nft: + return ( + <MigrationObjectCard + title={migrationObject.name} + subtitle="Visual Assets" + unlockConditionTimestamp={unlockConditionTimestamp} + image={ + <ExternalImageWithFallback + src={migrationObject.image_url} + alt={migrationObject.name} + fallback={<Assets />} + /> + } + isTimelocked={isTimelocked} + /> + ); + case CommonMigrationObjectType.NativeToken: + return ( + <MigrationObjectCard + isTimelocked={isTimelocked} + title={`${balance} ${token}`} + subtitle="Native Tokens" + unlockConditionTimestamp={unlockConditionTimestamp} + image={<DataStack />} + /> + ); + default: + return null; + } +} + +interface ExternalImageWithFallbackProps { + src: string; + alt: string; + fallback: React.ReactNode; +} +function ExternalImageWithFallback({ src, alt, fallback }: ExternalImageWithFallbackProps) { + const [errored, setErrored] = useState(false); + function handleError() { + setErrored(true); + } + return !errored ? <ExternalImage src={src} alt={alt} onError={handleError} /> : fallback; +} + +interface MigrationObjectCardProps { + title: string; + subtitle: string; + unlockConditionTimestamp: string; + isTimelocked: boolean; + image?: React.ReactNode; +} + +function MigrationObjectCard({ + title, + subtitle, + unlockConditionTimestamp, + isTimelocked, + image, +}: MigrationObjectCardProps) { + const hasUnlockConditionTimestamp = + unlockConditionTimestamp !== MIGRATION_OBJECT_WITHOUT_UC_KEY; + return ( + <Card> + <CardImage shape={ImageShape.SquareRounded}>{image}</CardImage> + <CardBody title={title} subtitle={subtitle} /> + {hasUnlockConditionTimestamp && ( + <UnlockConditionLabel + groupKey={unlockConditionTimestamp} + isTimelocked={isTimelocked} + /> + )} + </Card> + ); +} + +interface UnlockConditionLabelProps { + groupKey: string; + isTimelocked: boolean; +} +function UnlockConditionLabel({ groupKey, isTimelocked: isTimelocked }: UnlockConditionLabelProps) { + const { data: currentEpochStartTimestampMs, isLoading: isLoadingEpochStart } = + useGetCurrentEpochStartTimestamp(); + const { data: currentEpochEndTimestampMs, isLoading: isLoadingEpochEnd } = + useGetCurrentEpochEndTimestamp(); + + const epochEndMs = currentEpochEndTimestampMs ?? 0; + const epochStartMs = currentEpochStartTimestampMs ?? '0'; + const currentDateMs = Date.now(); + + const unlockConditionTimestampMs = parseInt(groupKey) * MILLISECONDS_PER_SECOND; + const isFromPreviousEpoch = + !isLoadingEpochStart && unlockConditionTimestampMs < parseInt(epochStartMs); + // TODO: https://github.com/iotaledger/iota/issues/4369 + const isInAFutureEpoch = !isLoadingEpochEnd && unlockConditionTimestampMs > epochEndMs; + + const outputTimestampMs = isInAFutureEpoch ? unlockConditionTimestampMs : epochEndMs; + + const timeLabel = useTimeAgo({ + timeFrom: outputTimestampMs, + shortedTimeLabel: true, + shouldEnd: true, + maxTimeUnit: TimeUnit.ONE_DAY, + }); + + const showLabel = !isFromPreviousEpoch && outputTimestampMs > currentDateMs; + + return ( + <div className="ml-auto h-full whitespace-nowrap"> + {showLabel && ( + <LabelText + size={LabelTextSize.Small} + text={timeLabel} + label={isTimelocked ? 'Unlocks in' : 'Expires in'} + /> + )} + </div> + ); +} diff --git a/apps/wallet-dashboard/components/migration/migration-object-details-card/index.ts b/apps/wallet-dashboard/components/migration/migration-object-details-card/index.ts new file mode 100644 index 00000000000..d7097a997c2 --- /dev/null +++ b/apps/wallet-dashboard/components/migration/migration-object-details-card/index.ts @@ -0,0 +1,4 @@ +// Copyright (c) 2024 IOTA Stiftung +// SPDX-License-Identifier: Apache-2.0 + +export * from './MigrationObjectDetailsCard'; diff --git a/apps/wallet-dashboard/hooks/index.ts b/apps/wallet-dashboard/hooks/index.ts index 77ea2304aa4..932b903fdba 100644 --- a/apps/wallet-dashboard/hooks/index.ts +++ b/apps/wallet-dashboard/hooks/index.ts @@ -11,3 +11,4 @@ export * from './useGetCurrentEpochStartTimestamp'; export * from './useTimelockedUnstakeTransaction'; export * from './useExplorerLinkGetter'; export * from './useGetStardustMigratableObjects'; +export * from './useGroupedMigrationObjectsByExpirationDate'; diff --git a/apps/wallet-dashboard/hooks/useGetCurrentEpochEndTimestamp.ts b/apps/wallet-dashboard/hooks/useGetCurrentEpochEndTimestamp.ts new file mode 100644 index 00000000000..69217c4becf --- /dev/null +++ b/apps/wallet-dashboard/hooks/useGetCurrentEpochEndTimestamp.ts @@ -0,0 +1,21 @@ +// Copyright (c) 2024 IOTA Stiftung +// SPDX-License-Identifier: Apache-2.0 + +import { useIotaClient } from '@iota/dapp-kit'; +import { useQuery } from '@tanstack/react-query'; + +export function useGetCurrentEpochEndTimestamp() { + const client = useIotaClient(); + return useQuery({ + // eslint-disable-next-line @tanstack/query/exhaustive-deps + queryKey: ['current-epoch-end-timestamp'], + queryFn: async () => { + const iotaSystemState = await client.getLatestIotaSystemState(); + const epochStart = parseInt(iotaSystemState.epochStartTimestampMs); + const epochDuration = parseInt(iotaSystemState.epochDurationMs); + const epochEnd = epochStart + epochDuration; + return epochEnd; + }, + staleTime: 10 * 60 * 1000, // 10 minutes + }); +} diff --git a/apps/wallet-dashboard/hooks/useGetStardustMigratableObjects.ts b/apps/wallet-dashboard/hooks/useGetStardustMigratableObjects.ts index 7a5b40ce140..8480e9d9e2a 100644 --- a/apps/wallet-dashboard/hooks/useGetStardustMigratableObjects.ts +++ b/apps/wallet-dashboard/hooks/useGetStardustMigratableObjects.ts @@ -1,21 +1,17 @@ // Copyright (c) 2024 IOTA Stiftung // SPDX-License-Identifier: Apache-2.0 +import { useQuery } from '@tanstack/react-query'; import { useGetCurrentEpochStartTimestamp } from '@/hooks'; import { groupStardustObjectsByMigrationStatus } from '@/lib/utils'; import { STARDUST_BASIC_OUTPUT_TYPE, STARDUST_NFT_OUTPUT_TYPE, + TimeUnit, useGetAllOwnedObjects, } from '@iota/core'; -import { IotaObjectData } from '@iota/iota-sdk/client'; -export function useGetStardustMigratableObjects(address: string): { - migratableBasicOutputs: IotaObjectData[]; - unmigratableBasicOutputs: IotaObjectData[]; - migratableNftOutputs: IotaObjectData[]; - unmigratableNftOutputs: IotaObjectData[]; -} { +export function useGetStardustMigratableObjects(address: string) { const { data: currentEpochMs } = useGetCurrentEpochStartTimestamp(); const { data: basicOutputObjects } = useGetAllOwnedObjects(address, { StructType: STARDUST_BASIC_OUTPUT_TYPE, @@ -24,24 +20,41 @@ export function useGetStardustMigratableObjects(address: string): { StructType: STARDUST_NFT_OUTPUT_TYPE, }); - const { migratable: migratableBasicOutputs, unmigratable: unmigratableBasicOutputs } = - groupStardustObjectsByMigrationStatus( - basicOutputObjects ?? [], - Number(currentEpochMs), + return useQuery({ + queryKey: [ + 'stardust-migratable-objects', address, - ); + currentEpochMs, + basicOutputObjects, + nftOutputObjects, + ], + queryFn: () => { + const epochMs = Number(currentEpochMs) || 0; - const { migratable: migratableNftOutputs, unmigratable: unmigratableNftOutputs } = - groupStardustObjectsByMigrationStatus( - nftOutputObjects ?? [], - Number(currentEpochMs), - address, - ); + const { migratable: migratableBasicOutputs, unmigratable: unmigratableBasicOutputs } = + groupStardustObjectsByMigrationStatus(basicOutputObjects ?? [], epochMs, address); + + const { migratable: migratableNftOutputs, unmigratable: unmigratableNftOutputs } = + groupStardustObjectsByMigrationStatus(nftOutputObjects ?? [], epochMs, address); - return { - migratableBasicOutputs, - unmigratableBasicOutputs, - migratableNftOutputs, - unmigratableNftOutputs, - }; + return { + migratableBasicOutputs, + unmigratableBasicOutputs, + migratableNftOutputs, + unmigratableNftOutputs, + }; + }, + enabled: + !!address && + currentEpochMs !== undefined && + basicOutputObjects !== undefined && + nftOutputObjects !== undefined, + staleTime: TimeUnit.ONE_SECOND * TimeUnit.ONE_MINUTE * 5, + placeholderData: { + migratableBasicOutputs: [], + unmigratableBasicOutputs: [], + migratableNftOutputs: [], + unmigratableNftOutputs: [], + }, + }); } diff --git a/apps/wallet-dashboard/hooks/useGroupedMigrationObjectsByExpirationDate.ts b/apps/wallet-dashboard/hooks/useGroupedMigrationObjectsByExpirationDate.ts new file mode 100644 index 00000000000..d9d96816fd2 --- /dev/null +++ b/apps/wallet-dashboard/hooks/useGroupedMigrationObjectsByExpirationDate.ts @@ -0,0 +1,59 @@ +// Copyright (c) 2024 IOTA Stiftung +// SPDX-License-Identifier: Apache-2.0 + +import { ResolvedObjectTypes } from '@/lib/types'; +import { + groupMigrationObjectsByUnlockCondition, + sortStardustResolvedObjectsByExpiration, +} from '@/lib/utils'; +import { TimeUnit } from '@iota/core'; +import { useCurrentAccount, useIotaClient } from '@iota/dapp-kit'; +import { IotaObjectData } from '@iota/iota-sdk/client'; +import { useQuery } from '@tanstack/react-query'; +import { useGetCurrentEpochStartTimestamp } from './useGetCurrentEpochStartTimestamp'; +import { useGetCurrentEpochEndTimestamp } from './useGetCurrentEpochEndTimestamp'; + +export function useGroupedMigrationObjectsByExpirationDate( + objects: IotaObjectData[], + isTimelockUnlockCondition: boolean = false, +) { + const client = useIotaClient(); + const address = useCurrentAccount()?.address; + + const { data: currentEpochStartTimestampMs } = useGetCurrentEpochStartTimestamp(); + const { data: currentEpochEndTimestampMs } = useGetCurrentEpochEndTimestamp(); + + const epochStartMs = currentEpochStartTimestampMs ? parseInt(currentEpochStartTimestampMs) : 0; + const epochEndMs = currentEpochEndTimestampMs ? currentEpochEndTimestampMs : 0; + + return useQuery({ + // eslint-disable-next-line @tanstack/query/exhaustive-deps + queryKey: [ + 'grouped-migration-objects', + objects, + address, + isTimelockUnlockCondition, + epochStartMs, + epochEndMs, + ], + queryFn: async (): Promise<ResolvedObjectTypes[]> => { + if (!client || objects.length === 0) { + return []; + } + const resolvedObjects = await groupMigrationObjectsByUnlockCondition( + objects, + client, + address, + isTimelockUnlockCondition, + ); + + return sortStardustResolvedObjectsByExpiration( + resolvedObjects, + epochStartMs, + epochEndMs, + ); + }, + enabled: !!client && objects.length > 0, + staleTime: TimeUnit.ONE_SECOND * TimeUnit.ONE_MINUTE * 5, + }); +} diff --git a/apps/wallet-dashboard/lib/constants/index.ts b/apps/wallet-dashboard/lib/constants/index.ts index b2c6ab5f6cd..30680459cef 100644 --- a/apps/wallet-dashboard/lib/constants/index.ts +++ b/apps/wallet-dashboard/lib/constants/index.ts @@ -2,3 +2,4 @@ // SPDX-License-Identifier: Apache-2.0 export * from './vesting.constants'; +export * from './migration.constants'; diff --git a/apps/wallet-dashboard/lib/constants/migration.constants.ts b/apps/wallet-dashboard/lib/constants/migration.constants.ts new file mode 100644 index 00000000000..5aa2c5a5c0f --- /dev/null +++ b/apps/wallet-dashboard/lib/constants/migration.constants.ts @@ -0,0 +1,15 @@ +// Copyright (c) 2024 IOTA Stiftung +// SPDX-License-Identifier: Apache-2.0 + +import { StardustOutputDetailsFilter } from '../enums'; + +export const STARDUST_MIGRATABLE_OBJECTS_FILTER_LIST: StardustOutputDetailsFilter[] = Object.values( + StardustOutputDetailsFilter, +); + +export const STARDUST_UNMIGRATABLE_OBJECTS_FILTER_LIST: StardustOutputDetailsFilter[] = + Object.values(StardustOutputDetailsFilter).filter( + (element) => element !== StardustOutputDetailsFilter.WithExpiration, + ); + +export const MIGRATION_OBJECT_WITHOUT_UC_KEY = 'no-unlock-condition-timestamp'; diff --git a/apps/wallet-dashboard/lib/enums/commonMigrationObjectType.enums.ts b/apps/wallet-dashboard/lib/enums/commonMigrationObjectType.enums.ts new file mode 100644 index 00000000000..9395fca36b8 --- /dev/null +++ b/apps/wallet-dashboard/lib/enums/commonMigrationObjectType.enums.ts @@ -0,0 +1,8 @@ +// Copyright (c) 2024 IOTA Stiftung +// SPDX-License-Identifier: Apache-2.0 + +export enum CommonMigrationObjectType { + NativeToken = 'nativeToken', + Nft = 'nft', + Basic = 'basic', +} diff --git a/apps/wallet-dashboard/lib/enums/index.ts b/apps/wallet-dashboard/lib/enums/index.ts index 87f3b0e2f22..6d936d1ec45 100644 --- a/apps/wallet-dashboard/lib/enums/index.ts +++ b/apps/wallet-dashboard/lib/enums/index.ts @@ -3,3 +3,6 @@ export * from './protectedRouteTitle.enum'; export * from './assetCategory.enum'; +export * from './commonMigrationObjectType.enums'; +export * from './stardustOutputDetailsFilter.enum'; +export * from './stardustOutputMigrationStatus.enum'; diff --git a/apps/wallet-dashboard/lib/enums/stardustOutputDetailsFilter.enum.ts b/apps/wallet-dashboard/lib/enums/stardustOutputDetailsFilter.enum.ts new file mode 100644 index 00000000000..f1ff813072c --- /dev/null +++ b/apps/wallet-dashboard/lib/enums/stardustOutputDetailsFilter.enum.ts @@ -0,0 +1,10 @@ +// Copyright (c) 2024 IOTA Stiftung +// SPDX-License-Identifier: Apache-2.0 + +export enum StardustOutputDetailsFilter { + All = 'All', + IOTA = 'IOTA', + NativeTokens = 'Native Tokens', + VisualAssets = 'Visual Assets', + WithExpiration = 'With Expiration', +} diff --git a/apps/wallet-dashboard/lib/enums/stardustOutputMigrationStatus.enum.ts b/apps/wallet-dashboard/lib/enums/stardustOutputMigrationStatus.enum.ts new file mode 100644 index 00000000000..29df88def12 --- /dev/null +++ b/apps/wallet-dashboard/lib/enums/stardustOutputMigrationStatus.enum.ts @@ -0,0 +1,7 @@ +// Copyright (c) 2024 IOTA Stiftung +// SPDX-License-Identifier: Apache-2.0 + +export enum StardustOutputMigrationStatus { + Migratable = 'Migratable', + TimeLocked = 'TimeLocked', +} diff --git a/apps/wallet-dashboard/lib/types/index.ts b/apps/wallet-dashboard/lib/types/index.ts new file mode 100644 index 00000000000..cdec0f4219f --- /dev/null +++ b/apps/wallet-dashboard/lib/types/index.ts @@ -0,0 +1,4 @@ +// Copyright (c) 2024 IOTA Stiftung +// SPDX-License-Identifier: Apache-2.0 + +export * from './stardustMigrationObjects'; diff --git a/apps/wallet-dashboard/lib/types/stardustMigrationObjects.ts b/apps/wallet-dashboard/lib/types/stardustMigrationObjects.ts new file mode 100644 index 00000000000..516cc7e2908 --- /dev/null +++ b/apps/wallet-dashboard/lib/types/stardustMigrationObjects.ts @@ -0,0 +1,33 @@ +// Copyright (c) 2024 IOTA Stiftung +// SPDX-License-Identifier: Apache-2.0 + +import { IotaObjectData } from '@iota/iota-sdk/client'; +import { CommonMigrationObjectType } from '../enums'; + +export type UnlockConditionTimestamp = string; + +interface CommonExpirationTypeObject { + unlockConditionTimestamp: UnlockConditionTimestamp; + output: IotaObjectData; + uniqueId: string; + balance: bigint; +} + +export interface ResolvedNativeToken extends CommonExpirationTypeObject { + name: string; + commonObjectType: CommonMigrationObjectType.NativeToken; + coinType: string; +} + +export interface ResolvedBasicObject extends CommonExpirationTypeObject { + type: string; + commonObjectType: CommonMigrationObjectType.Basic; +} + +export interface ResolvedNftObject extends CommonExpirationTypeObject { + name: string; + image_url: string; + commonObjectType: CommonMigrationObjectType.Nft; +} + +export type ResolvedObjectTypes = ResolvedBasicObject | ResolvedNftObject | ResolvedNativeToken; diff --git a/apps/wallet-dashboard/lib/utils/migration/filterMigrationObjectDetails.ts b/apps/wallet-dashboard/lib/utils/migration/filterMigrationObjectDetails.ts new file mode 100644 index 00000000000..3f9d54de6c8 --- /dev/null +++ b/apps/wallet-dashboard/lib/utils/migration/filterMigrationObjectDetails.ts @@ -0,0 +1,37 @@ +// Copyright (c) 2024 IOTA Stiftung +// SPDX-License-Identifier: Apache-2.0 + +import { MIGRATION_OBJECT_WITHOUT_UC_KEY } from '@/lib/constants'; +import { CommonMigrationObjectType, StardustOutputDetailsFilter } from '@/lib/enums'; +import { ResolvedObjectTypes } from '@/lib/types'; + +export function filterMigrationObjects( + objects: ResolvedObjectTypes[], + filter: StardustOutputDetailsFilter, +) { + switch (filter) { + case StardustOutputDetailsFilter.All: + return objects; + case StardustOutputDetailsFilter.IOTA: + return filterObjectByCommonOutputType(objects, CommonMigrationObjectType.Basic); + case StardustOutputDetailsFilter.VisualAssets: + return filterObjectByCommonOutputType(objects, CommonMigrationObjectType.Nft); + case StardustOutputDetailsFilter.NativeTokens: + return filterObjectByCommonOutputType(objects, CommonMigrationObjectType.NativeToken); + case StardustOutputDetailsFilter.WithExpiration: + return filterObjectsByExpiration(objects); + } +} + +function filterObjectByCommonOutputType( + objects: ResolvedObjectTypes[], + type: CommonMigrationObjectType, +) { + return objects.filter((object) => object.commonObjectType === type); +} + +function filterObjectsByExpiration(objects: ResolvedObjectTypes[]): ResolvedObjectTypes[] { + return objects.filter( + (object) => object.unlockConditionTimestamp !== MIGRATION_OBJECT_WITHOUT_UC_KEY, + ); +} diff --git a/apps/wallet-dashboard/lib/utils/migration/groupMigrationObjects.ts b/apps/wallet-dashboard/lib/utils/migration/groupMigrationObjects.ts new file mode 100644 index 00000000000..98badabacdd --- /dev/null +++ b/apps/wallet-dashboard/lib/utils/migration/groupMigrationObjects.ts @@ -0,0 +1,232 @@ +// Copyright (c) 2024 IOTA Stiftung +// SPDX-License-Identifier: Apache-2.0 + +import { CommonMigrationObjectType } from '@/lib/enums'; +import { + ResolvedBasicObject, + ResolvedNativeToken, + ResolvedNftObject, + ResolvedObjectTypes, + UnlockConditionTimestamp, +} from '@/lib/types'; +import { + extractObjectTypeStruct, + getNativeTokensFromBag, + MILLISECONDS_PER_SECOND, + STARDUST_BASIC_OUTPUT_TYPE, + STARDUST_NFT_OUTPUT_TYPE, +} from '@iota/core'; +import { extractMigrationOutputFields, extractStorageDepositReturnAmount } from '.'; +import { IotaClient, IotaObjectData } from '@iota/iota-sdk/client'; +import { MIGRATION_OBJECT_WITHOUT_UC_KEY } from '@/lib/constants'; + +export async function groupMigrationObjectsByUnlockCondition( + objectsData: IotaObjectData[], + client: IotaClient, + currentAddress: string = '', + isTimelockUnlockCondition: boolean = false, +): Promise<ResolvedObjectTypes[]> { + const flatObjects: ResolvedObjectTypes[] = []; + const basicObjectMap: Map<string, ResolvedBasicObject> = new Map(); + const nativeTokenMap: Map<string, Map<string, ResolvedNativeToken>> = new Map(); + + const PROMISE_CHUNK_SIZE = 100; + + // Get output data in chunks of 100 + for (let i = 0; i < objectsData.length; i += PROMISE_CHUNK_SIZE) { + const chunk = objectsData.slice(i, i + PROMISE_CHUNK_SIZE); + + const promises = chunk.map(async (object) => { + const objectFields = extractMigrationOutputFields(object); + + let groupKey: string | undefined; + if (isTimelockUnlockCondition) { + const timestamp = objectFields.timelock_uc?.fields.unix_time.toString(); + groupKey = timestamp; + } else { + const timestamp = objectFields.expiration_uc?.fields.unix_time.toString(); + // Timestamp can be undefined if the object was timelocked and is now unlocked + // and it doesn't have an expiration unlock condition + groupKey = timestamp ?? MIGRATION_OBJECT_WITHOUT_UC_KEY; + } + + if (!groupKey) { + return; + } + + if (object.type === STARDUST_BASIC_OUTPUT_TYPE) { + const existing = basicObjectMap.get(groupKey); + const gasReturn = extractStorageDepositReturnAmount(objectFields, currentAddress); + const newBalance = + (existing ? existing.balance : 0n) + + BigInt(objectFields.balance) + + (gasReturn ?? 0n); + + if (existing) { + existing.balance = newBalance; + } else { + const newBasicObject: ResolvedBasicObject = { + balance: newBalance, + unlockConditionTimestamp: groupKey, + type: object.type, + commonObjectType: CommonMigrationObjectType.Basic, + output: object, + uniqueId: objectFields.id.id, + }; + basicObjectMap.set(groupKey, newBasicObject); + flatObjects.push(newBasicObject); + } + } else if (object.type === STARDUST_NFT_OUTPUT_TYPE) { + const nftDetails = await getNftDetails(object, groupKey, client); + flatObjects.push(...nftDetails); + } + + if (!nativeTokenMap.has(groupKey)) { + nativeTokenMap.set(groupKey, new Map()); + } + + const tokenGroup = nativeTokenMap.get(groupKey)!; + const objectNativeTokens = await extractNativeTokensFromObject( + object, + client, + groupKey, + ); + + for (const token of objectNativeTokens) { + const existing = tokenGroup.get(token.name); + + if (existing) { + existing.balance += token.balance; + } else { + tokenGroup.set(token.name, token); + flatObjects.push(token); + } + } + }); + + // Wait for all promises in the chunk to resolve + await Promise.all(promises); + } + + return flatObjects; +} + +export function sortStardustResolvedObjectsByExpiration( + objects: ResolvedObjectTypes[], + currentEpochStartMs: number, + currentEpochEndMs: number, +): ResolvedObjectTypes[] { + const currentTimestampMs = Date.now(); + + return objects.sort((a, b) => { + const aIsNoExpiration = a.unlockConditionTimestamp === MIGRATION_OBJECT_WITHOUT_UC_KEY; + const bIsNoExpiration = b.unlockConditionTimestamp === MIGRATION_OBJECT_WITHOUT_UC_KEY; + + // No-expiration objects should be last + if (aIsNoExpiration && bIsNoExpiration) return 0; + if (aIsNoExpiration) return 1; + if (bIsNoExpiration) return -1; + + const aTimestampMs = parseInt(a.unlockConditionTimestamp) * MILLISECONDS_PER_SECOND; + const bTimestampMs = parseInt(b.unlockConditionTimestamp) * MILLISECONDS_PER_SECOND; + + const aIsFromPreviousEpoch = aTimestampMs < currentEpochStartMs; + const bIsFromPreviousEpoch = bTimestampMs < currentEpochStartMs; + + // Objects from a past epoch should be last (but before no-expiration objects) + if (aIsFromPreviousEpoch && bIsFromPreviousEpoch) return 0; + if (aIsFromPreviousEpoch) return 1; + if (bIsFromPreviousEpoch) return -1; + + const aIsInFutureEpoch = aTimestampMs > currentEpochEndMs; + const bIsInFutureEpoch = bTimestampMs > currentEpochEndMs; + + const aOutputTimestampMs = aIsInFutureEpoch ? aTimestampMs : currentEpochEndMs; + const bOutputTimestampMs = bIsInFutureEpoch ? bTimestampMs : currentEpochEndMs; + + // Objects closer to the calculated `outputTimestampMs` should be first + const aProximity = Math.abs(aOutputTimestampMs - currentTimestampMs); + const bProximity = Math.abs(bOutputTimestampMs - currentTimestampMs); + + return aProximity - bProximity; + }); +} + +async function getNftDetails( + object: IotaObjectData, + expirationKey: UnlockConditionTimestamp, + client: IotaClient, +): Promise<ResolvedNftObject[]> { + const objectFields = extractMigrationOutputFields(object); + const nftOutputDynamicFields = await client.getDynamicFields({ + parentId: objectFields.id.id, + }); + + const nftDetails: ResolvedNftObject[] = []; + for (const nft of nftOutputDynamicFields.data) { + const nftObject = await client.getObject({ + id: nft.objectId, + options: { showDisplay: true }, + }); + + if (!nftObject?.data?.display?.data) { + continue; + } + + nftDetails.push({ + balance: BigInt(objectFields.balance), + name: nftObject.data.display.data.name ?? '', + image_url: nftObject.data.display.data.image_url ?? '', + commonObjectType: CommonMigrationObjectType.Nft, + unlockConditionTimestamp: expirationKey, + output: object, + uniqueId: nftObject.data.objectId, + }); + } + + return nftDetails; +} + +async function extractNativeTokensFromObject( + object: IotaObjectData, + client: IotaClient, + expirationKey: UnlockConditionTimestamp, +): Promise<ResolvedNativeToken[]> { + const fields = extractMigrationOutputFields(object); + const bagId = fields.native_tokens.fields.id.id; + const bagSize = Number(fields.native_tokens.fields.size); + + const nativeTokens = bagSize > 0 ? await getNativeTokensFromBag(bagId, client) : []; + const result: ResolvedNativeToken[] = []; + + for (const nativeToken of nativeTokens) { + const nativeTokenParentId = fields.native_tokens.fields.id.id; + const objectDynamic = await client.getDynamicFieldObject({ + parentId: nativeTokenParentId, + name: nativeToken.name, + }); + + if (objectDynamic?.data?.content && 'fields' in objectDynamic.data.content) { + const nativeTokenFields = objectDynamic.data.content.fields as { + name: string; + value: string; + id: { id: string }; + }; + const tokenStruct = extractObjectTypeStruct(nativeTokenFields.name); + const tokenName = tokenStruct[2]; + const balance = BigInt(nativeTokenFields.value); + + result.push({ + name: tokenName, + balance, + coinType: nativeTokenFields.name, + unlockConditionTimestamp: expirationKey, + commonObjectType: CommonMigrationObjectType.NativeToken, + output: object, + uniqueId: nativeTokenFields.id.id, + }); + } + } + + return result; +} diff --git a/apps/wallet-dashboard/lib/utils/migration.ts b/apps/wallet-dashboard/lib/utils/migration/groupStardustObjectsByMigrationStatus.ts similarity index 53% rename from apps/wallet-dashboard/lib/utils/migration.ts rename to apps/wallet-dashboard/lib/utils/migration/groupStardustObjectsByMigrationStatus.ts index ee129d4d211..c7aa8f0e784 100644 --- a/apps/wallet-dashboard/lib/utils/migration.ts +++ b/apps/wallet-dashboard/lib/utils/migration/groupStardustObjectsByMigrationStatus.ts @@ -1,7 +1,7 @@ // Copyright (c) 2024 IOTA Stiftung // SPDX-License-Identifier: Apache-2.0 -import { CommonOutputObjectWithUc } from '@iota/core'; +import { CommonOutputObjectWithUc, MILLISECONDS_PER_SECOND } from '@iota/core'; import { IotaObjectData } from '@iota/iota-sdk/client'; export type StardustMigrationGroupedObjects = { @@ -11,16 +11,16 @@ export type StardustMigrationGroupedObjects = { export function groupStardustObjectsByMigrationStatus( stardustOutputObjects: IotaObjectData[], - epochTimestamp: number, + epochTimestampMs: number, address: string, ): StardustMigrationGroupedObjects { const migratable: IotaObjectData[] = []; const unmigratable: IotaObjectData[] = []; - const epochUnix = epochTimestamp / 1000; + const epochUnix = epochTimestampMs / MILLISECONDS_PER_SECOND; for (const outputObject of stardustOutputObjects) { - const outputObjectFields = extractOutputFields(outputObject); + const outputObjectFields = extractMigrationOutputFields(outputObject); if (outputObjectFields.expiration_uc) { const unlockableAddress = @@ -33,6 +33,7 @@ export function groupStardustObjectsByMigrationStatus( continue; } } + if ( outputObjectFields.timelock_uc && outputObjectFields.timelock_uc.fields.unix_time > epochUnix @@ -50,49 +51,76 @@ export function groupStardustObjectsByMigrationStatus( interface MigratableObjectsData { totalNativeTokens: number; totalVisualAssets: number; - accumulatedIotaAmount: number; + totalIotaAmount: bigint; +} + +interface SummarizeMigrationObjectParams { + basicOutputs: IotaObjectData[] | undefined; + nftOutputs: IotaObjectData[] | undefined; + address: string; } export function summarizeMigratableObjectValues({ - migratableBasicOutputs, - migratableNftOutputs, + basicOutputs = [], + nftOutputs = [], address, -}: { - migratableBasicOutputs: IotaObjectData[]; - migratableNftOutputs: IotaObjectData[]; - address: string; -}): MigratableObjectsData { +}: SummarizeMigrationObjectParams): MigratableObjectsData { let totalNativeTokens = 0; - let totalIotaAmount = 0; + let totalIotaAmount: bigint = 0n; - const totalVisualAssets = migratableNftOutputs.length; - const outputObjects = [...migratableBasicOutputs, ...migratableNftOutputs]; + const totalVisualAssets = nftOutputs.length; + const outputObjects = [...basicOutputs, ...nftOutputs]; for (const output of outputObjects) { - const outputObjectFields = extractOutputFields(output); + const outputObjectFields = extractMigrationOutputFields(output); - totalIotaAmount += parseInt(outputObjectFields.balance); + totalIotaAmount += BigInt(outputObjectFields.balance); totalNativeTokens += parseInt(outputObjectFields.native_tokens.fields.size); - totalIotaAmount += extractStorageDepositReturnAmount(outputObjectFields, address) || 0; + totalIotaAmount += extractStorageDepositReturnAmount(outputObjectFields, address) || 0n; + } + + return { totalNativeTokens, totalVisualAssets, totalIotaAmount }; +} + +interface UnmmigratableObjectsData { + totalUnmigratableObjects: number; +} + +export function summarizeUnmigratableObjectValues({ + basicOutputs = [], + nftOutputs = [], +}: Omit<SummarizeMigrationObjectParams, 'address'>): UnmmigratableObjectsData { + const basicObjects = basicOutputs.length; + const nftObjects = nftOutputs.length; + let nativeTokens = 0; + + for (const output of [...basicOutputs, ...nftOutputs]) { + const outputObjectFields = extractMigrationOutputFields(output); + + nativeTokens += parseInt(outputObjectFields.native_tokens.fields.size); } - return { totalNativeTokens, totalVisualAssets, accumulatedIotaAmount: totalIotaAmount }; + const totalUnmigratableObjects = basicObjects + nativeTokens + nftObjects; + + return { totalUnmigratableObjects }; } -function extractStorageDepositReturnAmount( +export function extractStorageDepositReturnAmount( { storage_deposit_return_uc }: CommonOutputObjectWithUc, address: string, -): number | null { +): bigint | null { if ( storage_deposit_return_uc?.fields && storage_deposit_return_uc?.fields.return_address === address ) { - return parseInt(storage_deposit_return_uc?.fields.return_amount); + return BigInt(storage_deposit_return_uc?.fields.return_amount); } return null; } -function extractOutputFields(outputObject: IotaObjectData): CommonOutputObjectWithUc { +export function extractMigrationOutputFields( + outputObject: IotaObjectData, +): CommonOutputObjectWithUc { return ( outputObject.content as unknown as { fields: CommonOutputObjectWithUc; diff --git a/apps/wallet-dashboard/lib/utils/migration/index.ts b/apps/wallet-dashboard/lib/utils/migration/index.ts new file mode 100644 index 00000000000..8dbde02f32c --- /dev/null +++ b/apps/wallet-dashboard/lib/utils/migration/index.ts @@ -0,0 +1,6 @@ +// Copyright (c) 2024 IOTA Stiftung +// SPDX-License-Identifier: Apache-2.0 + +export * from './filterMigrationObjectDetails'; +export * from './groupMigrationObjects'; +export * from './groupStardustObjectsByMigrationStatus'; From 73868d85c63a985daf2c51580a9841f2b419e4c7 Mon Sep 17 00:00:00 2001 From: vivekjain23 <165671934+vivekjain23@users.noreply.github.com> Date: Tue, 17 Dec 2024 12:13:49 +0530 Subject: [PATCH 57/97] fix sidebar highlights (#4467) * fix sidebar highlights --- docs/site/src/components/API/api-ref/refnav.js | 1 - docs/site/src/css/custom.css | 6 +++--- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/docs/site/src/components/API/api-ref/refnav.js b/docs/site/src/components/API/api-ref/refnav.js index e88b41d0233..f594067ece1 100644 --- a/docs/site/src/components/API/api-ref/refnav.js +++ b/docs/site/src/components/API/api-ref/refnav.js @@ -44,7 +44,6 @@ const RefNav = (props) => { className={`menu__link font-medium block hover:no-underline text-base ${page === method.name && 'menu__link--active'}`} key={`link-${method.name.toLowerCase()}`} href={`#${method.name.toLowerCase()}`} - data-theme="dark" onClick={() => setPage(method.name)} > {method.name} diff --git a/docs/site/src/css/custom.css b/docs/site/src/css/custom.css index 85816995775..eac62e74432 100644 --- a/docs/site/src/css/custom.css +++ b/docs/site/src/css/custom.css @@ -135,14 +135,14 @@ html[data-theme="dark"] { [data-theme="dark"] .menu__link--active { font-weight: bold; - color: white; + color: #3b82f6; } @media (min-width: 997px) { [data-theme="light"] .menu__link:hover, [data-theme="light"] .menu__link--active{ font-weight: bold; - color: var(--ifm-menu-color) + color: #3b82f6 } } @media (max-width: 996px) { @@ -154,7 +154,7 @@ html[data-theme="dark"] { [data-theme="light"] .menu__list-item-collapsible--active, [data-theme="light"] .menu__link--active { font-weight: bold; - color: white; + color: #3b82f6; } [data-theme="light"] .menu__list-item-collapsible:hover, From 2d61a5545a209a6623503ac21640bee068a4064a Mon Sep 17 00:00:00 2001 From: DaughterOfMars <chloedaughterofmars@gmail.com> Date: Tue, 17 Dec 2024 03:51:58 -0500 Subject: [PATCH 58/97] chore(CI): Refactor and re-enable simulator nightly (#4430) * chore(CI): Refactor and re-enable simulator nightly * change default ref * Combine nightly workflows --------- Co-authored-by: Thibault Martinez <thibault@iota.org> --- .github/workflows/_rust_tests.yml | 4 + .github/workflows/nightly.yml | 30 ++++ .github/workflows/simulator_nightly.yml | 178 ------------------------ 3 files changed, 34 insertions(+), 178 deletions(-) delete mode 100644 .github/workflows/simulator_nightly.yml diff --git a/.github/workflows/_rust_tests.yml b/.github/workflows/_rust_tests.yml index 75a96614c06..9aeccdffe2d 100644 --- a/.github/workflows/_rust_tests.yml +++ b/.github/workflows/_rust_tests.yml @@ -6,6 +6,9 @@ on: changedCrates: type: string required: false + runSimtest: + type: boolean + default: true concurrency: group: rust-tests-${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }} @@ -118,6 +121,7 @@ jobs: simtest: name: Simtest rust + if: inputs.runSimtest timeout-minutes: 45 runs-on: [self-hosted] env: diff --git a/.github/workflows/nightly.yml b/.github/workflows/nightly.yml index 27268340ad9..3e02cfc233f 100644 --- a/.github/workflows/nightly.yml +++ b/.github/workflows/nightly.yml @@ -4,6 +4,17 @@ on: schedule: - cron: "0 0 * * *" # every day at midnight workflow_dispatch: + inputs: + iota_ref: + description: "Branch / commit to simtest" + type: string + required: true + default: develop + test_num: + description: "MSIM_TEST_NUM (test iterations)" + type: string + required: false + default: "30" env: BINARY_LIST_FILE: "./binary-build-list.json" @@ -27,6 +38,8 @@ env: RUSTUP_MAX_RETRIES: 10 # Don't emit giant backtraces in the CI logs. RUST_BACKTRACE: short + IOTA_REF: "${{ github.event.inputs.iota_ref || 'develop' }}" + TEST_NUM: "${{ github.event.inputs.test_num || '30' }}" jobs: release: @@ -61,6 +74,9 @@ jobs: tests: uses: ./.github/workflows/_rust_tests.yml + with: + # simtest job below runs a superset of these tests + runSimtest: false external-tests: uses: ./.github/workflows/_external_rust_tests.yml @@ -84,3 +100,17 @@ jobs: split-cluster: uses: ./.github/workflows/split_cluster.yml + + simtest: + timeout-minutes: 240 + runs-on: [self-hosted] + + steps: + - uses: actions/checkout@eef61447b9ff4aafe5dcd4e0bbf5d482be7e7871 # v4.2.1 + with: + ref: ${{ env.IOTA_REF }} + - uses: taiki-e/install-action@375e0c7f08a66b8c2ba7e7eef31a6f91043a81b0 # v2.44.38 + with: + tool: nextest + - name: Run simtest + run: scripts/simtest/simtest-run.sh diff --git a/.github/workflows/simulator_nightly.yml b/.github/workflows/simulator_nightly.yml deleted file mode 100644 index 234a9013788..00000000000 --- a/.github/workflows/simulator_nightly.yml +++ /dev/null @@ -1,178 +0,0 @@ -name: Simulator Tests - -on: - schedule: - - cron: "0 9 * * *" # UTC timing is every day at 1am PST - workflow_dispatch: - inputs: - iota_ref: - description: "Branch / commit to test" - type: string - required: true - default: main - test_num: - description: "MSIM_TEST_NUM (test iterations)" - type: string - required: false - default: "30" - -concurrency: - group: ${{ github.workflow }} - -env: - IOTA_REF: "${{ github.event.inputs.iota_ref || 'main' }}" - TEST_NUM: "${{ github.event.inputs.test_num || '30' }}" - -jobs: - simtest: - timeout-minutes: 240 - permissions: - # The "id-token: write" permission is required or Machine ID will not be - # able to authenticate with the cluster. - id-token: write - contents: read - runs-on: self-hosted - - steps: - - name: Install Teleport - uses: teleport-actions/setup@176c25dfcd19cd31a252f275d579822b243e7b9c # v1.0.6 - with: - version: 11.3.1 - - name: Authorize against Teleport - id: auth - uses: teleport-actions/auth@685adaf480dc79262a99220eb158a92136d5abd9 # v2.0.3 - with: - # Specify the publically accessible address of your Teleport proxy. - proxy: proxy.iota-int.com:443 - # Specify the name of the join token for your bot. - token: iota-simtest-token - # Specify the length of time that the generated credentials should be - # valid for. This is optional and defaults to "1h" - certificate-ttl: 2h - - # Cargo clean and git restore on any left over files from git checkout, and deletes all remote tracking branches - - name: Environment clean - run: | - tsh -i ${{ steps.auth.outputs.identity-file }} --ttl 5 ssh ubuntu@simtest-01 "source ~/.bashrc && source ~/.cargo/env && rm -rf ~/iota" - tsh -i ${{ steps.auth.outputs.identity-file }} --ttl 5 ssh ubuntu@simtest-01 "source ~/.bashrc && source ~/.cargo/env && cd ~/ && git clone git@github.com:iotaledger/iota.git" - - # Deleting files in tmpfs that usually fill up pretty quickly after each run. Cargo clean to free up space as well. - - name: Tmpfs and cargo clean - run: | - tsh -i ${{ steps.auth.outputs.identity-file }} --ttl 5 ssh ubuntu@simtest-01 "sudo rm -rf /tmp/*" - tsh -i ${{ steps.auth.outputs.identity-file }} --ttl 5 ssh ubuntu@simtest-01 "source ~/.bashrc && source ~/.cargo/env && cd ~/iota && cargo clean" - - # Checkout out the latest iota repo - - name: Checkout iota repo - run: | - tsh -i ${{ steps.auth.outputs.identity-file }} --ttl 10 ssh ubuntu@simtest-01 "source ~/.bashrc && source ~/.cargo/env && cd ~/iota && git fetch origin && git checkout ${{ env.IOTA_REF }}" - - # Setting up cargo and simtest - - name: Install simtest - run: | - tsh -i ${{ steps.auth.outputs.identity-file }} --ttl 10 ssh ubuntu@simtest-01 "source ~/.bashrc && source ~/.cargo/env && cd ~/iota && ./scripts/simtest/install.sh" - - # Run simulator tests - - name: Run simtest - run: | - tsh -i ${{ steps.auth.outputs.identity-file }} --ttl 120 ssh ubuntu@simtest-01 "source ~/.bashrc && source ~/.cargo/env && cd ~/iota && RUSTUP_MAX_RETRIES=10 CARGO_TERM_COLOR=always CARGO_INCREMENTAL=0 CARGO_NET_RETRY=10 RUST_BACKTRACE=short RUST_LOG=off NUM_CPUS=24 TEST_NUM=${{ env.TEST_NUM }} ./scripts/simtest/simtest-run.sh" - - notify: - name: Notify - needs: [simtest] - runs-on: self-hosted - if: github.event_name == 'schedule' && failure() - - steps: - - uses: technote-space/workflow-conclusion-action@45ce8e0eb155657ab8ccf346ade734257fd196a5 # v3.0.3 - - - name: Checkout iota repo develop branch - uses: actions/checkout@eef61447b9ff4aafe5dcd4e0bbf5d482be7e7871 # v4.2.1 - - - name: Get iota commit - env: - GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} - run: | - export iota_sha=$(git rev-parse HEAD) - echo "iota_sha=${iota_sha}" >> $GITHUB_ENV - - - name: Get link to logs - env: - GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} - run: | - gh_job_link=$(gh api -X GET 'repos/iotaledger/iota/actions/runs/${{ github.run_id }}/jobs' --jq '.jobs.[0].html_url') - echo "gh_job_link=${gh_job_link}" >> $GITHUB_ENV - - - name: Get current oncall - run: | - export current_oncall=$(curl -s --request GET \ - --url 'https://api.pagerduty.com/oncalls?schedule_ids[]=PGCQ3YS' \ - --header 'Accept: application/json' \ - --header 'Authorization: Token token=${{ secrets.PAGERDUTY_ACCESS_KEY }}' \ - --header 'Content-Type: application/json' \ - | jq '.oncalls[].user.summary' | tr -d '"') - echo "current_oncall=$(echo ${current_oncall})" >> $GITHUB_ENV - - export oncall_name=$(curl -s --request GET \ - --url 'https://api.pagerduty.com/oncalls?schedule_ids[]=PGCQ3YS' \ - --header 'Accept: application/json' \ - --header 'Authorization: Token token=${{ secrets.PAGERDUTY_ACCESS_KEY }}' \ - --header 'Content-Type: application/json' \ - | jq '.oncalls[].escalation_policy.summary' | tr -d '"') - echo "oncall_name=$(echo ${oncall_name})" >> $GITHUB_ENV - - - name: Configure AWS credentials - uses: aws-actions/configure-aws-credentials@e3dd6a429d7300a6a4c196c26e071d42e0343502 # v4.0.2 - with: - aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }} - aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }} - aws-region: us-west-2 - - - name: Get slack id for the oncall - run: | - export slack_id=$(aws s3 cp s3://iota-employees-dir/employees.json - | jq --arg ONCALL "${{ env.current_oncall }}" '.[] | if .name == $ONCALL then .slack_id else empty end') - echo "slack_id=$(echo ${slack_id} | tr -d '"')" >> $GITHUB_ENV - - - name: Post to slack - uses: slackapi/slack-github-action@37ebaef184d7626c5f204ab8d3baff4262dd30f0 # v1.27.0 - env: - SLACK_BOT_TOKEN: ${{ secrets.SLACK_BOT_TOKEN }} - IOTA_SHA: ${{ env.iota_sha }} - GH_JOB_LINK: ${{ env.gh_job_link }} - SLACK_ID: ${{ env.slack_id }} - ONCALL_NAME: ${{ env.oncall_name }} - with: - channel-id: "simtest-nightly" - payload: | - { - "text": "*${{ github.workflow }}* workflow status: `${{ env.WORKFLOW_CONCLUSION }}`", - "blocks": [ - { - "type": "section", - "text": { - "type": "mrkdwn", - "text": "*${{ github.workflow }}* workflow status: `${{ env.WORKFLOW_CONCLUSION }}`" - } - }, - { - "type": "divider" - }, - { - "type": "section", - "text": { - "type": "mrkdwn", - "text": "IOTA commit: <https://github.com/iotaledger/iota/commit/${{ env.IOTA_SHA }}|${{ env.IOTA_SHA }}> \nRun: <${{ env.GH_JOB_LINK }}|${{ github.run_id }}>" - } - }, - { - "type": "divider" - }, - { - "type": "section", - "text": { - "type": "mrkdwn", - "text": "<@${{ env.SLACK_ID }}>, current `${{ env.ONCALL_NAME }}` oncall, please debug failures: `tsh ssh ubuntu@simtest-01` and look in the `/home/ubuntu/simtest_logs/{date}` folder for test results" - } - } - ] - } From 3ab420c0afe2bc6ef96a0bad3a2b22a86a10cffd Mon Sep 17 00:00:00 2001 From: Panteleymonchuk <panteleymonchuk@gmail.com> Date: Tue, 17 Dec 2024 11:29:52 +0200 Subject: [PATCH 59/97] feat(wallet-dashboard): Add tx details state to the end of send coin flow (#4422) * feat(wallet-dashboard): implement SentSuccess view and update SendTokenDialog flow * feat(dashboard): enhance SendTokenDialog flow and improve transaction handling * feat(dashboard): rename SentSuccessView to TransactionDetailsView and update flow * fix(dashboard): improve error message for transaction info retrieval * feat(dashboard): add loading state with spinner during transaction fetching * feat(dashboard): implement transfer transaction mutation and refactor handling logic * refactor(explorer, core): move useRecognizedPackages from explorer to core. * feat(dashboard): integrate useRecognizedPackages for transaction details * fix(dashboard): correct import path for useTransferTransaction * remove with dialog content * refactor: format --------- Co-authored-by: marc2332 <mespinsanz@gmail.com> --- apps/core/src/hooks/index.ts | 1 + .../src/hooks/useRecognizedPackages.ts | 11 +- .../src/components/owned-coins/OwnedCoins.tsx | 9 +- apps/explorer/src/hooks/index.ts | 1 - apps/explorer/src/hooks/useResolveVideo.ts | 8 +- .../transaction-result/TransactionData.tsx | 8 +- .../transaction-result/TransactionView.tsx | 9 +- .../transaction-summary/index.tsx | 10 +- .../Dialogs/SendToken/SendTokenDialog.tsx | 105 ++++----- .../SendToken/views/EnterValuesFormView.tsx | 203 ++++++++++-------- .../SendToken/views/ReviewValuesFormView.tsx | 129 +++++------ .../views/TransactionDetailsView.tsx | 47 ++++ .../Dialogs/SendToken/views/index.ts | 1 + .../transaction/TransactionDetailsLayout.tsx | 58 +++++ .../components/Dialogs/transaction/index.ts | 4 + .../transactions/TransactionTile.tsx | 71 +----- apps/wallet-dashboard/hooks/index.ts | 1 + .../hooks/useTransferTransaction.ts | 24 +++ 18 files changed, 402 insertions(+), 298 deletions(-) rename apps/{explorer => core}/src/hooks/useRecognizedPackages.ts (61%) create mode 100644 apps/wallet-dashboard/components/Dialogs/SendToken/views/TransactionDetailsView.tsx create mode 100644 apps/wallet-dashboard/components/Dialogs/transaction/TransactionDetailsLayout.tsx create mode 100644 apps/wallet-dashboard/components/Dialogs/transaction/index.ts create mode 100644 apps/wallet-dashboard/hooks/useTransferTransaction.ts diff --git a/apps/core/src/hooks/index.ts b/apps/core/src/hooks/index.ts index 89aced3f57f..1602541e57b 100644 --- a/apps/core/src/hooks/index.ts +++ b/apps/core/src/hooks/index.ts @@ -47,5 +47,6 @@ export * from './useOwnedNFT'; export * from './useNftDetails'; export * from './useCountdownByTimestamp'; export * from './useStakeRewardStatus'; +export * from './useRecognizedPackages'; export * from './stake'; diff --git a/apps/explorer/src/hooks/useRecognizedPackages.ts b/apps/core/src/hooks/useRecognizedPackages.ts similarity index 61% rename from apps/explorer/src/hooks/useRecognizedPackages.ts rename to apps/core/src/hooks/useRecognizedPackages.ts index 811c2abfdf4..15a62c80447 100644 --- a/apps/explorer/src/hooks/useRecognizedPackages.ts +++ b/apps/core/src/hooks/useRecognizedPackages.ts @@ -2,18 +2,11 @@ // Modifications Copyright (c) 2024 IOTA Stiftung // SPDX-License-Identifier: Apache-2.0 -import { Feature } from '@iota/core'; import { useFeatureValue } from '@growthbook/growthbook-react'; -import { IOTA_FRAMEWORK_ADDRESS, IOTA_SYSTEM_ADDRESS } from '@iota/iota-sdk/utils'; import { Network } from '@iota/iota-sdk/client'; +import { Feature, DEFAULT_RECOGNIZED_PACKAGES } from '../../'; -import { useNetwork } from './'; - -const DEFAULT_RECOGNIZED_PACKAGES = [IOTA_FRAMEWORK_ADDRESS, IOTA_SYSTEM_ADDRESS]; - -export function useRecognizedPackages(): string[] { - const [network] = useNetwork(); - +export function useRecognizedPackages(network: Network): string[] { const recognizedPackages = useFeatureValue( Feature.RecognizedPackages, DEFAULT_RECOGNIZED_PACKAGES, diff --git a/apps/explorer/src/components/owned-coins/OwnedCoins.tsx b/apps/explorer/src/components/owned-coins/OwnedCoins.tsx index 8df810f8f0c..619fd8e9864 100644 --- a/apps/explorer/src/components/owned-coins/OwnedCoins.tsx +++ b/apps/explorer/src/components/owned-coins/OwnedCoins.tsx @@ -2,14 +2,14 @@ // Modifications Copyright (c) 2024 IOTA Stiftung // SPDX-License-Identifier: Apache-2.0 -import { getCoinSymbol } from '@iota/core'; +import { getCoinSymbol, useRecognizedPackages } from '@iota/core'; import { useIotaClientQuery } from '@iota/dapp-kit'; -import { type CoinBalance } from '@iota/iota-sdk/client'; +import { type CoinBalance, type Network } from '@iota/iota-sdk/client'; +import { useNetwork } from '~/hooks'; import { normalizeIotaAddress } from '@iota/iota-sdk/utils'; import { FilterList, Warning } from '@iota/ui-icons'; import { useMemo, useState } from 'react'; import OwnedCoinView from './OwnedCoinView'; -import { useRecognizedPackages } from '~/hooks/useRecognizedPackages'; import { Button, ButtonType, @@ -47,7 +47,8 @@ export function OwnedCoins({ id }: OwnerCoinsProps): JSX.Element { const { isPending, data, isError } = useIotaClientQuery('getAllBalances', { owner: normalizeIotaAddress(id), }); - const recognizedPackages = useRecognizedPackages(); + const [network] = useNetwork(); + const recognizedPackages = useRecognizedPackages(network as Network); const balances: Record<CoinFilter, CoinBalanceVerified[]> = useMemo(() => { const balanceData = data?.reduce( diff --git a/apps/explorer/src/hooks/index.ts b/apps/explorer/src/hooks/index.ts index 9fbe82e3302..a52c31b12d6 100644 --- a/apps/explorer/src/hooks/index.ts +++ b/apps/explorer/src/hooks/index.ts @@ -17,7 +17,6 @@ export * from './useInitialPageView'; export * from './useMediaQuery'; export * from './useNetwork'; export * from './useNormalizedMoveModule'; -export * from './useRecognizedPackages'; export * from './useResolveVideo'; export * from './useSearch'; export * from './useVerifiedSourceCode'; diff --git a/apps/explorer/src/hooks/useResolveVideo.ts b/apps/explorer/src/hooks/useResolveVideo.ts index 19d7c871d23..a40622340a3 100644 --- a/apps/explorer/src/hooks/useResolveVideo.ts +++ b/apps/explorer/src/hooks/useResolveVideo.ts @@ -2,12 +2,14 @@ // Modifications Copyright (c) 2024 IOTA Stiftung // SPDX-License-Identifier: Apache-2.0 -import { type IotaObjectResponse } from '@iota/iota-sdk/client'; +import { type IotaObjectResponse, type Network } from '@iota/iota-sdk/client'; -import { useRecognizedPackages } from './useRecognizedPackages'; +import { useRecognizedPackages } from '@iota/core'; +import { useNetwork } from '~/hooks'; export function useResolveVideo(object: IotaObjectResponse): string | undefined | null { - const recognizedPackages = useRecognizedPackages(); + const [network] = useNetwork(); + const recognizedPackages = useRecognizedPackages(network as Network); const objectType = (object.data?.type ?? object?.data?.content?.dataType === 'package') ? 'package' diff --git a/apps/explorer/src/pages/transaction-result/TransactionData.tsx b/apps/explorer/src/pages/transaction-result/TransactionData.tsx index de3d78e5890..17617d7363a 100644 --- a/apps/explorer/src/pages/transaction-result/TransactionData.tsx +++ b/apps/explorer/src/pages/transaction-result/TransactionData.tsx @@ -2,13 +2,14 @@ // Modifications Copyright (c) 2024 IOTA Stiftung // SPDX-License-Identifier: Apache-2.0 -import { useTransactionSummary } from '@iota/core'; +import { useTransactionSummary, useRecognizedPackages } from '@iota/core'; import { type ProgrammableTransaction, type IotaTransactionBlockResponse, + type Network, } from '@iota/iota-sdk/client'; import { GasBreakdown } from '~/components'; -import { useRecognizedPackages } from '~/hooks/useRecognizedPackages'; +import { useNetwork } from '~/hooks/useNetwork'; import { InputsCard } from '~/pages/transaction-result/programmable-transaction-view/InputsCard'; import { TransactionsCard } from '~/pages/transaction-result/programmable-transaction-view/TransactionsCard'; @@ -17,7 +18,8 @@ interface TransactionDataProps { } export function TransactionData({ transaction }: TransactionDataProps): JSX.Element { - const recognizedPackagesList = useRecognizedPackages(); + const [network] = useNetwork(); + const recognizedPackagesList = useRecognizedPackages(network as Network); const summary = useTransactionSummary({ transaction, recognizedPackagesList, diff --git a/apps/explorer/src/pages/transaction-result/TransactionView.tsx b/apps/explorer/src/pages/transaction-result/TransactionView.tsx index 06b5f3d6c15..73af5407edf 100644 --- a/apps/explorer/src/pages/transaction-result/TransactionView.tsx +++ b/apps/explorer/src/pages/transaction-result/TransactionView.tsx @@ -2,7 +2,7 @@ // Modifications Copyright (c) 2024 IOTA Stiftung // SPDX-License-Identifier: Apache-2.0 -import { type IotaTransactionBlockResponse } from '@iota/iota-sdk/client'; +import { type Network, type IotaTransactionBlockResponse } from '@iota/iota-sdk/client'; import clsx from 'clsx'; import { useState } from 'react'; import { ErrorBoundary, SplitPanes } from '~/components'; @@ -11,8 +11,8 @@ import { TransactionData } from '~/pages/transaction-result/TransactionData'; import { TransactionSummary } from '~/pages/transaction-result/transaction-summary'; import { Signatures } from './Signatures'; import { TransactionDetails } from './transaction-summary/TransactionDetails'; -import { useTransactionSummary } from '@iota/core'; -import { useBreakpoint, useRecognizedPackages } from '~/hooks'; +import { useTransactionSummary, useRecognizedPackages } from '@iota/core'; +import { useBreakpoint, useNetwork } from '~/hooks'; import { ButtonSegment, ButtonSegmentType, @@ -42,7 +42,8 @@ export function TransactionView({ transaction }: TransactionViewProps): JSX.Elem const transactionKindName = transaction.transaction?.data.transaction?.kind; const isProgrammableTransaction = transactionKindName === 'ProgrammableTransaction'; - const recognizedPackagesList = useRecognizedPackages(); + const [network] = useNetwork(); + const recognizedPackagesList = useRecognizedPackages(network as Network); const summary = useTransactionSummary({ transaction, recognizedPackagesList, diff --git a/apps/explorer/src/pages/transaction-result/transaction-summary/index.tsx b/apps/explorer/src/pages/transaction-result/transaction-summary/index.tsx index 7ea356fbcb2..ea5d48cbab6 100644 --- a/apps/explorer/src/pages/transaction-result/transaction-summary/index.tsx +++ b/apps/explorer/src/pages/transaction-result/transaction-summary/index.tsx @@ -2,20 +2,20 @@ // Modifications Copyright (c) 2024 IOTA Stiftung // SPDX-License-Identifier: Apache-2.0 -import { useTransactionSummary } from '@iota/core'; -import { type IotaTransactionBlockResponse } from '@iota/iota-sdk/client'; - +import { useTransactionSummary, useRecognizedPackages } from '@iota/core'; +import { type IotaTransactionBlockResponse, type Network } from '@iota/iota-sdk/client'; import { BalanceChanges } from './BalanceChanges'; import { ObjectChanges } from './ObjectChanges'; import { UpgradedSystemPackages } from './UpgradedSystemPackages'; -import { useRecognizedPackages } from '~/hooks/useRecognizedPackages'; +import { useNetwork } from '~/hooks'; interface TransactionSummaryProps { transaction: IotaTransactionBlockResponse; } export function TransactionSummary({ transaction }: TransactionSummaryProps): JSX.Element { - const recognizedPackagesList = useRecognizedPackages(); + const [network] = useNetwork(); + const recognizedPackagesList = useRecognizedPackages(network as Network); const summary = useTransactionSummary({ transaction, recognizedPackagesList, diff --git a/apps/wallet-dashboard/components/Dialogs/SendToken/SendTokenDialog.tsx b/apps/wallet-dashboard/components/Dialogs/SendToken/SendTokenDialog.tsx index da417f66147..913e362e27d 100644 --- a/apps/wallet-dashboard/components/Dialogs/SendToken/SendTokenDialog.tsx +++ b/apps/wallet-dashboard/components/Dialogs/SendToken/SendTokenDialog.tsx @@ -2,16 +2,16 @@ // SPDX-License-Identifier: Apache-2.0 import React, { useState } from 'react'; -import { EnterValuesFormView, ReviewValuesFormView } from './views'; +import { EnterValuesFormView, ReviewValuesFormView, TransactionDetailsView } from './views'; import { CoinBalance } from '@iota/iota-sdk/client'; import { useSendCoinTransaction, useNotifications } from '@/hooks'; -import { useSignAndExecuteTransaction } from '@iota/dapp-kit'; import { NotificationType } from '@/stores/notificationStore'; import { CoinFormat, useFormatCoin, useGetAllCoins } from '@iota/core'; -import { Dialog, DialogBody, DialogContent, DialogPosition, Header } from '@iota/apps-ui-kit'; +import { Dialog, DialogContent, DialogPosition } from '@iota/apps-ui-kit'; import { FormDataValues } from './interfaces'; import { INITIAL_VALUES } from './constants'; import { IOTA_TYPE_ARG } from '@iota/iota-sdk/utils'; +import { useTransferTransactionMutation } from '@/hooks'; interface SendCoinPopupProps { coin: CoinBalance; @@ -23,6 +23,7 @@ interface SendCoinPopupProps { enum FormStep { EnterValues, ReviewValues, + TransactionDetails, } function SendTokenDialogBody({ @@ -34,11 +35,9 @@ function SendTokenDialogBody({ const [selectedCoin, setSelectedCoin] = useState<CoinBalance>(coin); const [formData, setFormData] = useState<FormDataValues>(INITIAL_VALUES); const [fullAmount] = useFormatCoin(formData.amount, selectedCoin.coinType, CoinFormat.FULL); - const { addNotification } = useNotifications(); - const { data: coinsData } = useGetAllCoins(selectedCoin.coinType, activeAddress); - const { mutateAsync: signAndExecuteTransaction, isPending } = useSignAndExecuteTransaction(); + const { addNotification } = useNotifications(); const isPayAllIota = selectedCoin.totalBalance === formData.amount && selectedCoin.coinType === IOTA_TYPE_ARG; @@ -51,25 +50,28 @@ function SendTokenDialogBody({ isPayAllIota, ); - function handleTransfer() { + const { + mutate: transfer, + data, + isPending: isLoadingTransfer, + } = useTransferTransactionMutation(); + + async function handleTransfer() { if (!transaction) { addNotification('There was an error with the transaction', NotificationType.Error); return; - } else { - signAndExecuteTransaction({ - transaction, - }) - .then(() => { - setOpen(false); - addNotification('Transfer transaction has been sent'); - }) - .catch(handleTransactionError); } - } - function handleTransactionError() { - setOpen(false); - addNotification('There was an error with the transaction', NotificationType.Error); + transfer(transaction, { + onSuccess: () => { + setStep(FormStep.TransactionDetails); + addNotification('Transfer transaction has been sent', NotificationType.Success); + }, + onError: () => { + setOpen(false); + addNotification('Transfer transaction failed', NotificationType.Error); + }, + }); } function onNext(): void { @@ -87,40 +89,43 @@ function SendTokenDialogBody({ return ( <> - <Header - title={step === FormStep.EnterValues ? 'Send' : 'Review & Send'} - onClose={() => setOpen(false)} - onBack={step === FormStep.ReviewValues ? onBack : undefined} - /> - <div className="h-full [&>div]:h-full"> - <DialogBody> - {step === FormStep.EnterValues && ( - <EnterValuesFormView - coin={selectedCoin} - activeAddress={activeAddress} - setSelectedCoin={setSelectedCoin} - onNext={onNext} - setFormData={setFormData} - initialFormValues={formData} - /> - )} - {step === FormStep.ReviewValues && ( - <ReviewValuesFormView - formData={formData} - executeTransfer={handleTransfer} - senderAddress={activeAddress} - isPending={isPending} - coinType={selectedCoin.coinType} - isPayAllIota={isPayAllIota} - /> - )} - </DialogBody> - </div> + {step === FormStep.EnterValues && ( + <EnterValuesFormView + coin={selectedCoin} + activeAddress={activeAddress} + setSelectedCoin={setSelectedCoin} + onNext={onNext} + onClose={() => setOpen(false)} + setFormData={setFormData} + initialFormValues={formData} + /> + )} + {step === FormStep.ReviewValues && ( + <ReviewValuesFormView + formData={formData} + executeTransfer={handleTransfer} + senderAddress={activeAddress} + isPending={isLoadingTransfer} + coinType={selectedCoin.coinType} + isPayAllIota={isPayAllIota} + onClose={() => setOpen(false)} + onBack={onBack} + /> + )} + {step === FormStep.TransactionDetails && data?.digest && ( + <TransactionDetailsView + digest={data.digest} + onClose={() => { + setOpen(false); + setStep(FormStep.EnterValues); + }} + /> + )} </> ); } -export function SendTokenDialog(props: SendCoinPopupProps): React.JSX.Element { +export function SendTokenDialog(props: SendCoinPopupProps) { return ( <Dialog open={props.open} onOpenChange={props.setOpen}> <DialogContent containerId="overlay-portal-container" position={DialogPosition.Right}> diff --git a/apps/wallet-dashboard/components/Dialogs/SendToken/views/EnterValuesFormView.tsx b/apps/wallet-dashboard/components/Dialogs/SendToken/views/EnterValuesFormView.tsx index f38c0d95cfa..f33ddbc8fef 100644 --- a/apps/wallet-dashboard/components/Dialogs/SendToken/views/EnterValuesFormView.tsx +++ b/apps/wallet-dashboard/components/Dialogs/SendToken/views/EnterValuesFormView.tsx @@ -24,14 +24,16 @@ import { Button, InfoBoxStyle, LoadingIndicator, + Header, } from '@iota/apps-ui-kit'; import { useIotaClientQuery } from '@iota/dapp-kit'; import { IOTA_TYPE_ARG } from '@iota/iota-sdk/utils'; -import { Form, Formik, FormikProps } from 'formik'; +import { Form, FormikProvider, useFormik, useFormikContext } from 'formik'; import { Exclamation } from '@iota/ui-icons'; import { UseQueryResult } from '@tanstack/react-query'; import { FormDataValues } from '../interfaces'; import { INITIAL_VALUES } from '../constants'; +import { DialogLayoutBody, DialogLayoutFooter } from '../../layout'; interface EnterValuesFormProps { coin: CoinBalance; @@ -40,9 +42,10 @@ interface EnterValuesFormProps { setFormData: React.Dispatch<React.SetStateAction<FormDataValues>>; setSelectedCoin: React.Dispatch<React.SetStateAction<CoinBalance>>; onNext: () => void; + onClose: () => void; } -interface FormInputsProps extends FormikProps<FormDataValues> { +interface FormInputsProps { coinType: string; coinDecimals: number; coinBalance: bigint; @@ -52,6 +55,9 @@ interface FormInputsProps extends FormikProps<FormDataValues> { activeAddress: string; coins: CoinStruct[]; queryResult: UseQueryResult<CoinMetadata | null>; + formattedAmount: bigint; + hasEnoughBalance: boolean; + isPayAllIota: boolean; } function totalBalance(coins: CoinStruct[]): bigint { @@ -62,29 +68,18 @@ function getBalanceFromCoinStruct(coin: CoinStruct): bigint { } function FormInputs({ - isValid, - isSubmitting, - setFieldValue, - values, - submitForm, - coinType, coinDecimals, coinBalance, - iotaBalance, formattedTokenBalance, symbol, activeAddress, coins, queryResult, + formattedAmount, + hasEnoughBalance, + isPayAllIota, }: FormInputsProps): React.JSX.Element { - const formattedAmount = parseAmount(values.amount, coinDecimals); - const isPayAllIota = formattedAmount === coinBalance && coinType === IOTA_TYPE_ARG; - - const hasEnoughBalance = - isPayAllIota || - iotaBalance > - BigInt(values.gasBudgetEst ?? '0') + - (coinType === IOTA_TYPE_ARG ? formattedAmount : 0n); + const { setFieldValue, values } = useFormikContext<FormDataValues>(); async function onMaxTokenButtonClick() { await setFieldValue('amount', formattedTokenBalance); @@ -94,46 +89,31 @@ function FormInputs({ formattedAmount === coinBalance || queryResult.isPending || !coinBalance; return ( - <div className="flex h-full w-full flex-col"> - <Form autoComplete="off" noValidate className="flex-1"> - <div className="flex h-full w-full flex-col gap-md"> - {!hasEnoughBalance && ( - <InfoBox - type={InfoBoxType.Error} - supportingText="Insufficient IOTA to cover transaction" - style={InfoBoxStyle.Elevated} - icon={<Exclamation />} - /> - )} - - <SendTokenFormInput - name="amount" - to={values.to} - symbol={symbol} - coins={coins} - coinDecimals={coinDecimals} - activeAddress={activeAddress} - onActionClick={onMaxTokenButtonClick} - isMaxActionDisabled={isMaxActionDisabled} - isPayAllIota={isPayAllIota} + <Form autoComplete="off" noValidate className="flex-1"> + <div className="flex h-full w-full flex-col gap-md"> + {!hasEnoughBalance && ( + <InfoBox + type={InfoBoxType.Error} + supportingText="Insufficient IOTA to cover transaction" + style={InfoBoxStyle.Elevated} + icon={<Exclamation />} /> - <AddressInput name="to" placeholder="Enter Address" /> - </div> - </Form> + )} - <div className="pt-xs"> - <Button - onClick={submitForm} - htmlType={ButtonHtmlType.Submit} - type={ButtonType.Primary} - disabled={ - !isValid || isSubmitting || !hasEnoughBalance || values.gasBudgetEst === '' - } - text="Review" - fullWidth + <SendTokenFormInput + name="amount" + to={values.to} + symbol={symbol} + coins={coins} + coinDecimals={coinDecimals} + activeAddress={activeAddress} + onActionClick={onMaxTokenButtonClick} + isMaxActionDisabled={isMaxActionDisabled} + isPayAllIota={isPayAllIota} /> + <AddressInput name="to" placeholder="Enter Address" /> </div> - </div> + </Form> ); } @@ -144,6 +124,7 @@ export function EnterValuesFormView({ setSelectedCoin, onNext, initialFormValues, + onClose, }: EnterValuesFormProps): JSX.Element { // Get all coins of the type const { data: coinsData, isPending: coinsIsPending } = useGetAllCoins( @@ -188,13 +169,14 @@ export function EnterValuesFormView({ const formattedTokenBalance = tokenBalance.replace(/,/g, ''); - if (coinsBalanceIsPending || coinsIsPending || iotaCoinsIsPending) { - return ( - <div className="flex h-full w-full items-center justify-center"> - <LoadingIndicator /> - </div> - ); - } + const formik = useFormik({ + initialValues: initialFormValues, + validationSchema: validationSchemaStepOne, + enableReinitialize: true, + validateOnChange: false, + validateOnBlur: false, + onSubmit: handleFormSubmit, + }); async function handleFormSubmit({ to, amount, gasBudgetEst }: FormDataValues) { const formattedAmount = parseAmount(amount, coinDecimals).toString(); @@ -207,41 +189,72 @@ export function EnterValuesFormView({ onNext(); } + const coinType = coin.coinType; + const formattedAmount = parseAmount(formik.values.amount, coinDecimals); + const isPayAllIota = formattedAmount === coinBalance && coinType === IOTA_TYPE_ARG; + + const hasEnoughBalance = + isPayAllIota || + iotaBalance > + BigInt(formik.values.gasBudgetEst ?? '0') + + (coinType === IOTA_TYPE_ARG ? formattedAmount : 0n); + + if (coinsBalanceIsPending || coinsIsPending || iotaCoinsIsPending) { + return ( + <div className="flex h-full w-full items-center justify-center"> + <LoadingIndicator /> + </div> + ); + } + return ( - <div className="flex h-full w-full flex-col gap-md"> - <CoinSelector - activeCoinType={coin.coinType} - coins={coinsBalance ?? []} - onClick={(coinType) => { - setFormData(INITIAL_VALUES); - const coin = coinsBalance?.find((coin) => coin.coinType === coinType); - setSelectedCoin(coin!); - }} - /> - - <Formik - initialValues={initialFormValues} - validationSchema={validationSchemaStepOne} - enableReinitialize - validateOnChange={false} - validateOnBlur={false} - onSubmit={handleFormSubmit} - > - {(props: FormikProps<FormDataValues>) => ( - <FormInputs - {...props} - coinType={coin.coinType} - coinDecimals={coinDecimals} - coinBalance={coinBalance} - iotaBalance={iotaBalance} - formattedTokenBalance={formattedTokenBalance} - symbol={symbol} - activeAddress={activeAddress} - coins={coins ?? []} - queryResult={queryResult} - /> - )} - </Formik> - </div> + <FormikProvider value={formik}> + <Header title={'Send'} onClose={onClose} /> + <DialogLayoutBody> + <CoinSelector + activeCoinType={coin.coinType} + coins={coinsBalance ?? []} + onClick={(coinType) => { + setFormData(INITIAL_VALUES); + const selectedCoin = coinsBalance?.find( + (coinBalance) => coinBalance.coinType === coinType, + ); + if (selectedCoin) { + setSelectedCoin(selectedCoin); + } + }} + /> + + <FormInputs + hasEnoughBalance={hasEnoughBalance} + formattedAmount={formattedAmount} + isPayAllIota={isPayAllIota} + coinType={coin.coinType} + coinDecimals={coinDecimals} + coinBalance={coinBalance} + iotaBalance={iotaBalance} + formattedTokenBalance={formattedTokenBalance} + symbol={symbol} + activeAddress={activeAddress} + coins={coins ?? []} + queryResult={queryResult} + /> + </DialogLayoutBody> + <DialogLayoutFooter> + <Button + onClick={formik.submitForm} + htmlType={ButtonHtmlType.Submit} + type={ButtonType.Primary} + disabled={ + !formik.isValid || + formik.isSubmitting || + !hasEnoughBalance || + formik.values.gasBudgetEst === '' + } + text="Review" + fullWidth + /> + </DialogLayoutFooter> + </FormikProvider> ); } diff --git a/apps/wallet-dashboard/components/Dialogs/SendToken/views/ReviewValuesFormView.tsx b/apps/wallet-dashboard/components/Dialogs/SendToken/views/ReviewValuesFormView.tsx index 58d6e21e10b..d4d82d1ccad 100644 --- a/apps/wallet-dashboard/components/Dialogs/SendToken/views/ReviewValuesFormView.tsx +++ b/apps/wallet-dashboard/components/Dialogs/SendToken/views/ReviewValuesFormView.tsx @@ -16,11 +16,13 @@ import { KeyValueInfo, Divider, ButtonType, + Header, } from '@iota/apps-ui-kit'; import { formatAddress, IOTA_TYPE_ARG } from '@iota/iota-sdk/utils'; import { CoinIcon, ImageIconSize, useFormatCoin, ExplorerLinkType, CoinFormat } from '@iota/core'; import { Loader } from '@iota/ui-icons'; import { ExplorerLink } from '@/components'; +import { DialogLayoutBody, DialogLayoutFooter } from '../../layout'; interface ReviewValuesFormProps { formData: FormDataValues; @@ -29,6 +31,8 @@ interface ReviewValuesFormProps { executeTransfer: () => void; coinType: string; isPayAllIota?: boolean; + onClose: () => void; + onBack: () => void; } export function ReviewValuesFormView({ @@ -38,78 +42,75 @@ export function ReviewValuesFormView({ executeTransfer, coinType, isPayAllIota, + onClose, + onBack, }: ReviewValuesFormProps): JSX.Element { const [roundedAmount, symbol] = useFormatCoin(amount, coinType, CoinFormat.ROUNDED); const [gasEstimated, gasSymbol] = useFormatCoin(gasBudgetEst, IOTA_TYPE_ARG); return ( - <div className="flex h-full flex-col"> - <div className="flex h-full w-full flex-col gap-md"> - <div className="flex h-full flex-col justify-between"> - <div className="h-full flex-1"> - <div className="flex w-full flex-col gap-md"> - {Number(amount) !== 0 ? ( - <Card type={CardType.Filled}> - <CardImage type={ImageType.BgSolid}> - <CoinIcon - coinType={coinType} - rounded - size={ImageIconSize.Small} - /> - </CardImage> - <CardBody - title={`${isPayAllIota ? '~' : ''}${roundedAmount} ${symbol}`} - subtitle="Amount" - /> - <CardAction type={CardActionType.SupportingText} /> - </Card> - ) : null} - <div className="flex flex-col gap-md--rs p-sm--rs"> - <KeyValueInfo - keyText={'From'} - value={ - <ExplorerLink - type={ExplorerLinkType.Address} - address={senderAddress} - > - {formatAddress(senderAddress)} - </ExplorerLink> - } - fullwidth - /> + <> + <Header title="Review & Send" onClose={onClose} onBack={onBack} /> + <DialogLayoutBody> + <div className="flex w-full flex-col gap-md"> + {Number(amount) !== 0 ? ( + <Card type={CardType.Filled}> + <CardImage type={ImageType.BgSolid}> + <CoinIcon coinType={coinType} rounded size={ImageIconSize.Small} /> + </CardImage> + <CardBody + title={`${isPayAllIota ? '~' : ''}${roundedAmount} ${symbol}`} + subtitle="Amount" + /> + <CardAction type={CardActionType.SupportingText} /> + </Card> + ) : null} + <div className="flex flex-col gap-md--rs p-sm--rs"> + <KeyValueInfo + keyText={'From'} + value={ + <ExplorerLink + type={ExplorerLinkType.Address} + address={senderAddress} + > + {formatAddress(senderAddress)} + </ExplorerLink> + } + fullwidth + /> - <Divider /> - <KeyValueInfo - keyText={'To'} - value={ - <ExplorerLink type={ExplorerLinkType.Address} address={to}> - {formatAddress(to || '')} - </ExplorerLink> - } - fullwidth - /> + <Divider /> + <KeyValueInfo + keyText={'To'} + value={ + <ExplorerLink type={ExplorerLinkType.Address} address={to}> + {formatAddress(to || '')} + </ExplorerLink> + } + fullwidth + /> - <Divider /> - <KeyValueInfo - keyText={'Est. Gas Fees'} - value={gasEstimated} - supportingLabel={gasSymbol} - fullwidth - /> - </div> - </div> + <Divider /> + <KeyValueInfo + keyText={'Est. Gas Fees'} + value={gasEstimated} + supportingLabel={gasSymbol} + fullwidth + /> </div> - <Button - type={ButtonType.Primary} - onClick={executeTransfer} - text="Send Now" - disabled={coinType === null || isPending} - fullWidth - icon={isPending ? <Loader className="animate-spin" /> : undefined} - iconAfterText - /> </div> - </div> - </div> + </DialogLayoutBody> + <DialogLayoutFooter> + <Button + type={ButtonType.Primary} + onClick={executeTransfer} + text="Send Now" + disabled={coinType === null || isPending} + fullWidth + icon={isPending ? <Loader className="animate-spin" /> : undefined} + iconAfterText + /> + </DialogLayoutFooter> + </> ); } diff --git a/apps/wallet-dashboard/components/Dialogs/SendToken/views/TransactionDetailsView.tsx b/apps/wallet-dashboard/components/Dialogs/SendToken/views/TransactionDetailsView.tsx new file mode 100644 index 00000000000..f534f72e387 --- /dev/null +++ b/apps/wallet-dashboard/components/Dialogs/SendToken/views/TransactionDetailsView.tsx @@ -0,0 +1,47 @@ +// Copyright (c) 2024 IOTA Stiftung +// SPDX-License-Identifier: Apache-2.0 + +import { useGetTransaction } from '@iota/core'; +import { InfoBoxType, InfoBox, InfoBoxStyle } from '@iota/apps-ui-kit'; +import { Warning, Loader } from '@iota/ui-icons'; +import { getExtendedTransaction } from '@/lib/utils'; +import { useCurrentAccount } from '@iota/dapp-kit'; +import { TransactionDetailsLayout } from '../../transaction'; + +interface TransactionDetailsViewProps { + digest?: string; + onClose: () => void; +} + +export function TransactionDetailsView({ digest, onClose }: TransactionDetailsViewProps) { + const currentAccount = useCurrentAccount(); + const { data, isError, error, isFetching } = useGetTransaction(digest || ''); + + if (isError) { + return ( + <InfoBox + type={InfoBoxType.Error} + title="Error getting transaction info" + supportingText={ + error?.message ?? 'An error occurred when getting the transaction info' + } + icon={<Warning />} + style={InfoBoxStyle.Default} + /> + ); + } + + if (isFetching) { + return ( + <div className="flex h-full w-full items-center justify-center"> + <Loader className="h-6 w-6 animate-spin" /> + </div> + ); + } + + const transaction = data && getExtendedTransaction(data, currentAccount?.address || ''); + + return transaction ? ( + <TransactionDetailsLayout transaction={transaction} onClose={onClose} /> + ) : null; +} diff --git a/apps/wallet-dashboard/components/Dialogs/SendToken/views/index.ts b/apps/wallet-dashboard/components/Dialogs/SendToken/views/index.ts index bc7f7fd90e7..4938ff14337 100644 --- a/apps/wallet-dashboard/components/Dialogs/SendToken/views/index.ts +++ b/apps/wallet-dashboard/components/Dialogs/SendToken/views/index.ts @@ -3,3 +3,4 @@ export * from './EnterValuesFormView'; export * from './ReviewValuesFormView'; +export * from './TransactionDetailsView'; diff --git a/apps/wallet-dashboard/components/Dialogs/transaction/TransactionDetailsLayout.tsx b/apps/wallet-dashboard/components/Dialogs/transaction/TransactionDetailsLayout.tsx new file mode 100644 index 00000000000..44bc9474a6a --- /dev/null +++ b/apps/wallet-dashboard/components/Dialogs/transaction/TransactionDetailsLayout.tsx @@ -0,0 +1,58 @@ +// Copyright (c) 2024 IOTA Stiftung +// SPDX-License-Identifier: Apache-2.0 +import React from 'react'; +import { ExplorerLink } from '@/components'; +import { ExtendedTransaction } from '@/lib/interfaces'; +import { Header, LoadingIndicator } from '@iota/apps-ui-kit'; +import { + useTransactionSummary, + ViewTxnOnExplorerButton, + ExplorerLinkType, + TransactionReceipt, + useRecognizedPackages, +} from '@iota/core'; +import { useCurrentAccount, useIotaClientContext } from '@iota/dapp-kit'; +import { DialogLayoutBody, DialogLayoutFooter } from '../layout'; +import { Validator } from '../Staking/views/Validator'; +import { Network } from '@iota/iota-sdk/client'; + +interface TransactionDialogDetailsProps { + transaction: ExtendedTransaction; + onClose: () => void; +} +export function TransactionDetailsLayout({ transaction, onClose }: TransactionDialogDetailsProps) { + const address = useCurrentAccount()?.address ?? ''; + + const { network } = useIotaClientContext(); + const recognizedPackagesList = useRecognizedPackages(network as Network); + const summary = useTransactionSummary({ + transaction: transaction.raw, + currentAddress: address, + recognizedPackagesList, + }); + + if (!summary) return <LoadingIndicator />; + + return ( + <> + <Header title="Transaction" onClose={onClose} /> + <DialogLayoutBody> + <TransactionReceipt + txn={transaction.raw} + activeAddress={address} + summary={summary} + renderExplorerLink={ExplorerLink} + renderValidatorLogo={Validator} + /> + </DialogLayoutBody> + <DialogLayoutFooter> + <ExplorerLink + type={ExplorerLinkType.Transaction} + transactionID={transaction.raw.digest} + > + <ViewTxnOnExplorerButton digest={transaction.raw.digest} /> + </ExplorerLink> + </DialogLayoutFooter> + </> + ); +} diff --git a/apps/wallet-dashboard/components/Dialogs/transaction/index.ts b/apps/wallet-dashboard/components/Dialogs/transaction/index.ts new file mode 100644 index 00000000000..55a1e09a752 --- /dev/null +++ b/apps/wallet-dashboard/components/Dialogs/transaction/index.ts @@ -0,0 +1,4 @@ +// Copyright (c) 2024 IOTA Stiftung +// SPDX-License-Identifier: Apache-2.0 + +export * from './TransactionDetailsLayout'; diff --git a/apps/wallet-dashboard/components/transactions/TransactionTile.tsx b/apps/wallet-dashboard/components/transactions/TransactionTile.tsx index 405a02e76c6..0c76c27ceb1 100644 --- a/apps/wallet-dashboard/components/transactions/TransactionTile.tsx +++ b/apps/wallet-dashboard/components/transactions/TransactionTile.tsx @@ -6,7 +6,6 @@ import React, { useState } from 'react'; import TransactionIcon from './TransactionIcon'; import formatTimestamp from '@/lib/utils/time'; -import { ExplorerLink } from '@/components'; import { ExtendedTransaction, TransactionState } from '@/lib/interfaces'; import { Card, @@ -18,21 +17,12 @@ import { CardAction, CardActionType, Dialog, - Header, - LoadingIndicator, } from '@iota/apps-ui-kit'; -import { - useFormatCoin, - getLabel, - useTransactionSummary, - ViewTxnOnExplorerButton, - ExplorerLinkType, - TransactionReceipt, -} from '@iota/core'; +import { useFormatCoin, getLabel, useTransactionSummary } from '@iota/core'; import { IOTA_TYPE_ARG } from '@iota/iota-sdk/utils'; import { useCurrentAccount } from '@iota/dapp-kit'; -import { DialogLayout, DialogLayoutBody, DialogLayoutFooter } from '../Dialogs/layout'; -import { Validator } from '../Dialogs/Staking/views/Validator'; +import { TransactionDetailsLayout } from '../Dialogs/transaction/TransactionDetailsLayout'; +import { DialogLayout } from '../Dialogs/layout'; interface TransactionTileProps { transaction: ExtendedTransaction; @@ -85,53 +75,14 @@ export function TransactionTile({ transaction }: TransactionTileProps): JSX.Elem } /> </Card> - <ActivityDetailsDialog transaction={transaction} open={open} setOpen={setOpen} /> - </> - ); -} - -interface ActivityDetailsDialogProps { - transaction: ExtendedTransaction; - open: boolean; - setOpen: (open: boolean) => void; -} -function ActivityDetailsDialog({ - transaction, - open, - setOpen, -}: ActivityDetailsDialogProps): React.JSX.Element { - const address = useCurrentAccount()?.address ?? ''; - - const summary = useTransactionSummary({ - transaction: transaction.raw, - currentAddress: address, - recognizedPackagesList: [], - }); - - if (!summary) return <LoadingIndicator />; - - return ( - <Dialog open={open} onOpenChange={setOpen}> - <DialogLayout> - <Header title="Transaction" onClose={() => setOpen(false)} /> - <DialogLayoutBody> - <TransactionReceipt - txn={transaction.raw} - activeAddress={address} - summary={summary} - renderExplorerLink={ExplorerLink} - renderValidatorLogo={Validator} + <Dialog open={open} onOpenChange={setOpen}> + <DialogLayout> + <TransactionDetailsLayout + transaction={transaction} + onClose={() => setOpen(false)} /> - </DialogLayoutBody> - <DialogLayoutFooter> - <ExplorerLink - type={ExplorerLinkType.Transaction} - transactionID={transaction.raw.digest} - > - <ViewTxnOnExplorerButton digest={transaction.raw.digest} /> - </ExplorerLink> - </DialogLayoutFooter> - </DialogLayout> - </Dialog> + </DialogLayout> + </Dialog> + </> ); } diff --git a/apps/wallet-dashboard/hooks/index.ts b/apps/wallet-dashboard/hooks/index.ts index 932b903fdba..f33eda9c3fc 100644 --- a/apps/wallet-dashboard/hooks/index.ts +++ b/apps/wallet-dashboard/hooks/index.ts @@ -12,3 +12,4 @@ export * from './useTimelockedUnstakeTransaction'; export * from './useExplorerLinkGetter'; export * from './useGetStardustMigratableObjects'; export * from './useGroupedMigrationObjectsByExpirationDate'; +export * from './useTransferTransaction'; diff --git a/apps/wallet-dashboard/hooks/useTransferTransaction.ts b/apps/wallet-dashboard/hooks/useTransferTransaction.ts new file mode 100644 index 00000000000..ee673368ac0 --- /dev/null +++ b/apps/wallet-dashboard/hooks/useTransferTransaction.ts @@ -0,0 +1,24 @@ +// Copyright (c) 2024 IOTA Stiftung +// SPDX-License-Identifier: Apache-2.0 +import { useMutation } from '@tanstack/react-query'; +import { useIotaClient, useSignAndExecuteTransaction } from '@iota/dapp-kit'; +import { Transaction } from '@iota/iota-sdk/transactions'; + +export function useTransferTransactionMutation() { + const iotaClient = useIotaClient(); + const { mutateAsync: signAndExecuteTransaction } = useSignAndExecuteTransaction(); + + return useMutation({ + mutationFn: async (transaction: Transaction) => { + const executed = await signAndExecuteTransaction({ + transaction, + }); + + const tx = await iotaClient.waitForTransaction({ + digest: executed.digest, + }); + + return tx; + }, + }); +} From c0f46683365e52dfc106e429092afd37e86ea74b Mon Sep 17 00:00:00 2001 From: Marc Espin <mespinsanz@gmail.com> Date: Tue, 17 Dec 2024 11:27:12 +0100 Subject: [PATCH 60/97] refactor(apps-backend): Enable vesting and migration in production (#4514) --- apps/apps-backend/src/features/features.controller.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/apps-backend/src/features/features.controller.ts b/apps/apps-backend/src/features/features.controller.ts index c3947236ec5..a3f3dbbdd3f 100644 --- a/apps/apps-backend/src/features/features.controller.ts +++ b/apps/apps-backend/src/features/features.controller.ts @@ -134,10 +134,10 @@ export class FeaturesController { defaultValue: false, }, [Feature.StardustMigration]: { - defaultValue: false, + defaultValue: true, }, [Feature.SupplyIncreaseVesting]: { - defaultValue: false, + defaultValue: true, }, }, dateUpdated: new Date().toISOString(), From a3c1e5faf27ca7ff65ad1a594487c07df92e817d Mon Sep 17 00:00:00 2001 From: evavirseda <evirseda@boxfish.studio> Date: Tue, 17 Dec 2024 11:36:24 +0100 Subject: [PATCH 61/97] feat(wallet-dashboard): improve dark/light mode switcher (#4503) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * feat: improve dark/light mode * feat: cleanup * enhancement: swap theme setting buttons positions --------- Co-authored-by: Begoña Alvarez <balvarez@boxfish.studio> --- .../src/components/buttons}/ThemeSwitcher.tsx | 3 ++- apps/core/src/components/buttons/index.ts | 1 + .../explorer/src/components/header/Header.tsx | 3 ++- apps/explorer/src/components/header/index.ts | 1 - .../(protected)/components/top-nav/TopNav.tsx | 2 ++ .../app/(protected)/layout.tsx | 20 ------------------- apps/wallet-dashboard/app/page.tsx | 7 +++++-- 7 files changed, 12 insertions(+), 25 deletions(-) rename apps/{explorer/src/components/header => core/src/components/buttons}/ThemeSwitcher.tsx (89%) diff --git a/apps/explorer/src/components/header/ThemeSwitcher.tsx b/apps/core/src/components/buttons/ThemeSwitcher.tsx similarity index 89% rename from apps/explorer/src/components/header/ThemeSwitcher.tsx rename to apps/core/src/components/buttons/ThemeSwitcher.tsx index b947cafe76c..922deb78957 100644 --- a/apps/explorer/src/components/header/ThemeSwitcher.tsx +++ b/apps/core/src/components/buttons/ThemeSwitcher.tsx @@ -3,7 +3,8 @@ import { Button, ButtonType } from '@iota/apps-ui-kit'; import { DarkMode, LightMode } from '@iota/ui-icons'; -import { useTheme, Theme, ThemePreference } from '@iota/core'; +import { Theme, ThemePreference } from '../../enums'; +import { useTheme } from '../../hooks'; export function ThemeSwitcher(): React.JSX.Element { const { theme, themePreference, setThemePreference } = useTheme(); diff --git a/apps/core/src/components/buttons/index.ts b/apps/core/src/components/buttons/index.ts index b7638e371ce..95938f61610 100644 --- a/apps/core/src/components/buttons/index.ts +++ b/apps/core/src/components/buttons/index.ts @@ -2,3 +2,4 @@ // SPDX-License-Identifier: Apache-2.0 export * from './ViewTxnOnExplorerButton'; +export * from './ThemeSwitcher'; diff --git a/apps/explorer/src/components/header/Header.tsx b/apps/explorer/src/components/header/Header.tsx index a3b0cbcb00b..a2f95b165d5 100644 --- a/apps/explorer/src/components/header/Header.tsx +++ b/apps/explorer/src/components/header/Header.tsx @@ -5,7 +5,8 @@ import { NetworkSelector } from '../network'; import Search from '../search/Search'; import { LinkWithQuery } from '~/components/ui'; -import { ThemeSwitcher, ThemedIotaLogo } from '~/components'; +import { ThemedIotaLogo } from '~/components'; +import { ThemeSwitcher } from '@iota/core'; function Header(): JSX.Element { return ( diff --git a/apps/explorer/src/components/header/index.ts b/apps/explorer/src/components/header/index.ts index b23c1fae65a..8a717a10a0b 100644 --- a/apps/explorer/src/components/header/index.ts +++ b/apps/explorer/src/components/header/index.ts @@ -2,4 +2,3 @@ // SPDX-License-Identifier: Apache-2.0 export * from './Header'; -export * from './ThemeSwitcher'; diff --git a/apps/wallet-dashboard/app/(protected)/components/top-nav/TopNav.tsx b/apps/wallet-dashboard/app/(protected)/components/top-nav/TopNav.tsx index 8dd5f01ca2b..2fe8eba32f3 100644 --- a/apps/wallet-dashboard/app/(protected)/components/top-nav/TopNav.tsx +++ b/apps/wallet-dashboard/app/(protected)/components/top-nav/TopNav.tsx @@ -2,6 +2,7 @@ // SPDX-License-Identifier: Apache-2.0 import { Badge, BadgeType, Button, ButtonType } from '@iota/apps-ui-kit'; +import { ThemeSwitcher } from '@iota/core'; import { ConnectButton } from '@iota/dapp-kit'; import { Settings } from '@iota/ui-icons'; @@ -10,6 +11,7 @@ export function TopNav() { <div className="flex w-full flex-row items-center justify-end gap-md py-xs--rs"> <Badge label="Mainnet" type={BadgeType.PrimarySoft} /> <ConnectButton size="md" /> + <ThemeSwitcher /> <Button icon={<Settings />} type={ButtonType.Ghost} /> </div> ); diff --git a/apps/wallet-dashboard/app/(protected)/layout.tsx b/apps/wallet-dashboard/app/(protected)/layout.tsx index a77c8922ab9..72fa80c67cc 100644 --- a/apps/wallet-dashboard/app/(protected)/layout.tsx +++ b/apps/wallet-dashboard/app/(protected)/layout.tsx @@ -4,21 +4,9 @@ import { Notifications } from '@/components/index'; import React, { type PropsWithChildren } from 'react'; -import { Button } from '@iota/apps-ui-kit'; import { Sidebar, TopNav } from './components'; -import { ThemePreference, useTheme } from '@iota/core'; function DashboardLayout({ children }: PropsWithChildren): JSX.Element { - const { theme, themePreference, setThemePreference } = useTheme(); - - const toggleTheme = () => { - const newTheme = - themePreference === ThemePreference.Light - ? ThemePreference.Dark - : ThemePreference.Light; - setThemePreference(newTheme); - }; - return ( <div className="min-h-full"> <div className="fixed left-0 top-0 z-50 h-full"> @@ -34,14 +22,6 @@ function DashboardLayout({ children }: PropsWithChildren): JSX.Element { <div className="flex-1 py-md--rs">{children}</div> </div> </div> - - <div className="fixed bottom-5 right-5"> - <Button - onClick={toggleTheme} - text={`${theme === 'dark' ? 'Light' : 'Dark'} mode`} - /> - </div> - <Notifications /> </div> ); diff --git a/apps/wallet-dashboard/app/page.tsx b/apps/wallet-dashboard/app/page.tsx index 8901eec400a..e3036bf38c2 100644 --- a/apps/wallet-dashboard/app/page.tsx +++ b/apps/wallet-dashboard/app/page.tsx @@ -7,7 +7,7 @@ import { ConnectButton, useCurrentWallet, useAutoConnectWallet } from '@iota/dap import { redirect } from 'next/navigation'; import { IotaLogoWeb } from '@iota/ui-icons'; import { HOMEPAGE_ROUTE } from '@/lib/constants/routes.constants'; -import { Theme, useTheme } from '@iota/core'; +import { Theme, ThemeSwitcher, useTheme } from '@iota/core'; import { LoadingIndicator } from '@iota/apps-ui-kit'; function HomeDashboardPage(): JSX.Element { @@ -44,7 +44,10 @@ function HomeDashboardPage(): JSX.Element { disableRemotePlayback ></video> </div> - <div className="flex h-full w-full flex-col items-center justify-between p-md sm:p-2xl"> + <div className="relative flex h-full w-full flex-col items-center justify-between p-md sm:p-2xl"> + <div className="absolute right-2 top-2 sm:right-8 sm:top-8"> + <ThemeSwitcher /> + </div> <IotaLogoWeb width={130} height={32} /> <div className="flex max-w-sm flex-col items-center gap-8 text-center"> <div className="flex flex-col items-center gap-4"> From d5a8e4de853fbf2dee4ff83279b974bcde5b59ea Mon Sep 17 00:00:00 2001 From: cpl121 <100352899+cpl121@users.noreply.github.com> Date: Tue, 17 Dec 2024 11:52:55 +0100 Subject: [PATCH 62/97] feat(wallet-dashboard): show tx details to unstaking flow (#4433) * feat(wallet-dashboard): implement SentSuccess view and update SendTokenDialog flow * feat: add tx details state to the end of unstaking flow * feat(dashboard): enhance SendTokenDialog flow and improve transaction handling * feat(dashboard): rename SentSuccessView to TransactionDetailsView and update flow * fix(dashboard): improve error message for transaction info retrieval * fix(dashboard): rename props interface * fix(dashboard): clean merge debris --------- Co-authored-by: Panteleymonchuk <panteleymonchuk@gmail.com> --- .../Dialogs/Staking/StakeDialog.tsx | 29 +++++++++++++++++-- .../Dialogs/Staking/views/UnstakeView.tsx | 23 +++++++-------- 2 files changed, 38 insertions(+), 14 deletions(-) diff --git a/apps/wallet-dashboard/components/Dialogs/Staking/StakeDialog.tsx b/apps/wallet-dashboard/components/Dialogs/Staking/StakeDialog.tsx index 2c9f72a2911..29f832afdf6 100644 --- a/apps/wallet-dashboard/components/Dialogs/Staking/StakeDialog.tsx +++ b/apps/wallet-dashboard/components/Dialogs/Staking/StakeDialog.tsx @@ -31,6 +31,7 @@ import { DetailsView, UnstakeView } from './views'; import { FormValues } from './views/EnterAmountView'; import { TransactionDialogView } from '../TransactionDialog'; import { StakeDialogView } from './enums/view.enums'; +import { Transaction } from '@iota/iota-sdk/transactions'; const INITIAL_VALUES = { amount: '', @@ -114,7 +115,7 @@ export function StakeDialog({ groupedTimelockObjects, ); - const { mutateAsync: signAndExecuteTransaction } = useSignAndExecuteTransaction(); + const { mutateAsync: signAndExecuteTransaction, isPending } = useSignAndExecuteTransaction(); const { addNotification } = useNotifications(); const { data: rollingAverageApys } = useGetValidatorsApy(); @@ -173,6 +174,29 @@ export function StakeDialog({ ); } + function handleUnstake(transaction: Transaction): void { + if (!transaction) { + addNotification('Unstake transaction was not created', NotificationType.Error); + return; + } + signAndExecuteTransaction( + { + transaction: transaction, + }, + { + onSuccess: (tx) => { + onSuccess?.(tx.digest); + addNotification('Unstake transaction has been sent'); + setTxDigest(tx.digest); + setView?.(StakeDialogView.TransactionDetails); + }, + onError: () => { + addNotification('Unstake transaction was not sent', NotificationType.Error); + }, + }, + ); + } + function onSubmit(_: FormValues, { resetForm }: FormikHelpers<FormValues>) { handleStake(); resetForm(); @@ -225,7 +249,8 @@ export function StakeDialog({ <UnstakeView extendedStake={stakedDetails} handleClose={handleClose} - showActiveStatus + onUnstake={handleUnstake} + isPending={isPending} /> )} {view === StakeDialogView.TransactionDetails && ( diff --git a/apps/wallet-dashboard/components/Dialogs/Staking/views/UnstakeView.tsx b/apps/wallet-dashboard/components/Dialogs/Staking/views/UnstakeView.tsx index 671184c9cea..302d1de5514 100644 --- a/apps/wallet-dashboard/components/Dialogs/Staking/views/UnstakeView.tsx +++ b/apps/wallet-dashboard/components/Dialogs/Staking/views/UnstakeView.tsx @@ -26,23 +26,26 @@ import { } from '@iota/core'; import { IOTA_TYPE_ARG } from '@iota/iota-sdk/utils'; import { useMemo } from 'react'; -import { useCurrentAccount, useSignAndExecuteTransaction } from '@iota/dapp-kit'; +import { useCurrentAccount } from '@iota/dapp-kit'; import { Loader, Warning } from '@iota/ui-icons'; import { useUnstakeTransaction } from '@/hooks'; import { ValidatorStakingData } from '@/components'; import { DialogLayout, DialogLayoutFooter, DialogLayoutBody } from '../../layout'; +import { Transaction } from '@iota/iota-sdk/transactions'; -interface UnstakeDialogProps { +interface UnstakeViewProps { extendedStake: ExtendedDelegatedStake; handleClose: () => void; - showActiveStatus?: boolean; + onUnstake: (unstakeTransaction: Transaction) => void; + isPending: boolean; } export function UnstakeView({ extendedStake, handleClose, - showActiveStatus, -}: UnstakeDialogProps): JSX.Element { + onUnstake, + isPending, +}: UnstakeViewProps): JSX.Element { const stakingReward = BigInt(extendedStake.estimatedReward ?? '').toString(); const [rewards, rewardSymbol] = useFormatCoin(stakingReward, IOTA_TYPE_ARG); const activeAddress = useCurrentAccount()?.address ?? null; @@ -67,7 +70,7 @@ export function UnstakeView({ error: delegatedStakeDataError, } = delegatedStakeDataResult; - const delegationId = extendedStake?.status === 'Active' && extendedStake?.stakedIotaId; + const delegationId = extendedStake?.stakedIotaId; const [totalIota] = useFormatCoin( BigInt(stakingReward || 0) + totalStakeOriginal, @@ -93,14 +96,10 @@ export function UnstakeView({ extendedStake.stakedIotaId, activeAddress || '', ); - const { mutateAsync: signAndExecuteTransaction, isPending } = useSignAndExecuteTransaction(); - async function handleUnstake(): Promise<void> { + function handleUnstake(): void { if (!unstakeData) return; - await signAndExecuteTransaction({ - transaction: unstakeData.transaction, - }); - handleClose(); + onUnstake(unstakeData.transaction); } const currentEpochEndTimeFormatted = From 3b6bcdcecef82f88029ca969015683726d9419a1 Mon Sep 17 00:00:00 2001 From: Lucas Tortora <85233773+lucas-tortora@users.noreply.github.com> Date: Tue, 17 Dec 2024 09:06:00 -0300 Subject: [PATCH 63/97] fix(devx): Fix links and feedback (#4453) * fix(devx): Added 2f+1 clarification * fix(devx): added link to docker-compose.yml * fix(devx) removed gas price updates * fix(devx) improve snippet * Update docs/content/_snippets/info-BST-2f1.mdx Co-authored-by: vivekjain23 <165671934+vivekjain23@users.noreply.github.com> --------- Co-authored-by: vivekjain23 <165671934+vivekjain23@users.noreply.github.com> --- docs/content/_snippets/info-BST-2f1.mdx | 10 ++++++++++ .../about-iota/iota-architecture/epochs.mdx | 3 +++ .../content/operator/iota-full-node/overview.mdx | 3 +++ nre/docker/README.md | 4 ++-- nre/validator_tasks.md | 11 ----------- nre/validator_tool.md | 16 ---------------- 6 files changed, 18 insertions(+), 29 deletions(-) create mode 100644 docs/content/_snippets/info-BST-2f1.mdx diff --git a/docs/content/_snippets/info-BST-2f1.mdx b/docs/content/_snippets/info-BST-2f1.mdx new file mode 100644 index 00000000000..7c6161c2ad8 --- /dev/null +++ b/docs/content/_snippets/info-BST-2f1.mdx @@ -0,0 +1,10 @@ +:::info + +In Byzantine Fault Tolerant (BFT) `f` represents the number of faulty validators. `2f+1` represents the minimum number of validators +needed to agree on a transaction to ensure integrity and finality, even if up to `f` validators are faulty. + +For example, if `f = 1`, this means 3 validators must confirm a transaction (a supermajority) to guarantee its +integrity, +ensuring that even if one validator is faulty, the correct decision still stands. + +::: \ No newline at end of file diff --git a/docs/content/about-iota/iota-architecture/epochs.mdx b/docs/content/about-iota/iota-architecture/epochs.mdx index e543edcc4d6..bfbbb3ade6d 100644 --- a/docs/content/about-iota/iota-architecture/epochs.mdx +++ b/docs/content/about-iota/iota-architecture/epochs.mdx @@ -1,3 +1,4 @@ +import BSTInfo from '../../_snippets/info-BST-2f1.mdx'; import Quiz from '@site/src/components/Quiz'; import {questions} from '../../../site/static/json/about-iota/iota-architecture/epochs.json'; @@ -37,6 +38,8 @@ validator set and stake distribution can be altered. ### 4. Protocol Upgrade +<BSTInfo/> + If 2f+1 validators agree, the network may upgrade to a new protocol version, which includes new features, bug fixes, and updates to the Move framework libraries. diff --git a/docs/content/operator/iota-full-node/overview.mdx b/docs/content/operator/iota-full-node/overview.mdx index cfb80e6b4f8..cdd63215d70 100644 --- a/docs/content/operator/iota-full-node/overview.mdx +++ b/docs/content/operator/iota-full-node/overview.mdx @@ -3,6 +3,7 @@ title: Overview description: Operate an IOTA Full Node to validate blockchain activities, like transactions, checkpoints, and epoch changes. --- import Quiz from '@site/src/components/Quiz'; +import BSTInfo from '../../_snippets/info-BST-2f1.mdx'; import questions from '/json/node-operators/iota-full-node/overview.json'; import WarningAdvanced from './../../_snippets/warning-advanced-instructions-node-setup.mdx' @@ -28,6 +29,8 @@ A transaction requires a few round trips to 2f+1 validators to form a transactio This synchronization process includes: +<BSTInfo/> + 1. Following 2f+1 validators and listening for newly committed transactions. 1. Making sure that 2f+1 validators recognize the transaction and that it reaches finality. 1. Executing the transaction locally and updating the local DB. diff --git a/nre/docker/README.md b/nre/docker/README.md index 640e94dabd3..bc80d87cca3 100644 --- a/nre/docker/README.md +++ b/nre/docker/README.md @@ -9,7 +9,7 @@ Tested using: 1. Confirm you have either [Docker Engine](https://docs.docker.com/engine/install/) or [Docker Desktop](https://docs.docker.com/desktop/install/linux-install/) installed, as well as [Docker Compose](https://github.com/docker/compose#linux). -2. Update [validator.yaml](../config/validator.yaml) and place it in the same directory as `docker-compose.yaml`. +2. Update [validator.yaml](../config/validator.yaml) and place it in the same directory as [`docker-compose.yaml`](https://github.com/iotaledger/iota/blob/testnet/nre/docker/docker-compose.yaml). Add the paths to your private keys to validator.yaml. If you chose to put them in `/opt/iota/key-pairs`, you can use the following example: @@ -22,7 +22,7 @@ network-key-pair: path: /opt/iota/key-pairs/network.key ``` -3. Place `genesis.blob` in the same directory as `docker-compose.yaml`. (available post genesis ceremony) +3. Place `genesis.blob` in the same directory as [`docker-compose.yaml`](https://github.com/iotaledger/iota/blob/testnet/nre/docker/docker-compose.yaml). (available post genesis ceremony) ## Connectivity diff --git a/nre/validator_tasks.md b/nre/validator_tasks.md index 06d741d4131..ce7c4c1ee43 100644 --- a/nre/validator_tasks.md +++ b/nre/validator_tasks.md @@ -27,7 +27,6 @@ This document focuses on running the Iota Node software as a Validator. - [Chain Operations](#chain-operations) - [Updating On-chain Metadata](#updating-on-chain-metadata) - [Operation Cap](#operation-cap) - - [Updating the Gas Price Survey Quote](#updating-the-gas-price-survey-quote) - [Reporting/Un-reporting Validators](#reportingun-reporting-validators) - [Joining the Validator Set](#joining-the-validator-set) - [Leaving the Validator Set](#leaving-the-validator-set) @@ -364,16 +363,6 @@ setting the holder as the active address. <!-- Will be fixed by issue 1867. --> <!-- Or go to the [explorer](https://explorer.rebased.iota.org/object/0x0000000000000000000000000000000000000005) and look for `operation_cap_id` of that validator in the `validators` module. --> -### Updating the Gas Price Survey Quote - -To update the Gas Price Survey Quote of a validator, which is used to calculate the Reference Gas Price at the end of -the epoch, the sender needs to hold a valid [`UnverifiedValidatorOperationCap`](#operation-cap). The sender could be the -validator itself, or a trusted delegatee. To do so, call `iota_system::request_set_gas_price`: - -```shell -iota client call --package 0x3 --module iota_system --function request_set_gas_price --args 0x5 {cap_object_id} {new_gas_price} --gas-budget 10000 -``` - ### Reporting/Un-reporting Validators To report a validator or undo an existing report, the sender needs to hold a valid [`UnverifiedValidatorOperationCap`](#operation-cap). The sender could be the validator itself, or a trusted delegatee. To diff --git a/nre/validator_tool.md b/nre/validator_tool.md index 3c6c3291463..2dd32ef695c 100644 --- a/nre/validator_tool.md +++ b/nre/validator_tool.md @@ -106,22 +106,6 @@ Operation Cap allows a validator to authorizer another account to perform certai The Operation Cap holder (either the validator itself or the delegatee) updates its Gas Price and reports validator peers with the Operation Cap. -#### Update Gas Price - -To update Gas Price, run - -```bash -$IOTA_BINARY validator update-gas-price <gas-price> -``` - -if the account itself is a validator and holds the Operation Cap. Or - -```bash -$IOTA_BINARY validator update-gas-price --operation-cap-id <operation-cap-id> <gas-price> -``` - -if the account is a delegatee. - #### Report Validators To report validators peers, run From f975dc719805cbd3bbb9a35400fe37badd5f18cd Mon Sep 17 00:00:00 2001 From: Lucas Tortora <85233773+lucas-tortora@users.noreply.github.com> Date: Tue, 17 Dec 2024 11:06:59 -0300 Subject: [PATCH 64/97] feat(devx): Update event docs (#4465) * fix(devx): Move access time and using events to move overview section * feat(devx) update using events guide * fix(devx) Add tabs, remove headers * fix(devx) make link absolute * fix links * Update docs/content/developer/iota-101/using-events.mdx Co-authored-by: vivekjain23 <165671934+vivekjain23@users.noreply.github.com> --------- Co-authored-by: vivekjain23 <165671934+vivekjain23@users.noreply.github.com> --- .../developer/iota-101/using-events.mdx | 156 ++++++++++++------ docs/content/sidebars/developer.js | 4 +- 2 files changed, 110 insertions(+), 50 deletions(-) diff --git a/docs/content/developer/iota-101/using-events.mdx b/docs/content/developer/iota-101/using-events.mdx index f808f9e1e07..5e6182ddc78 100644 --- a/docs/content/developer/iota-101/using-events.mdx +++ b/docs/content/developer/iota-101/using-events.mdx @@ -28,13 +28,13 @@ An event object in IOTA consists of the following attributes: - `bcs`: Binary canonical serialization value. - `timestampMs`: Unix epoch timestamp in milliseconds. -## Exploring Available Events +### Exploring Available Events -To subscribe to on-chain events, you first need to identify which events are available. While you can easily track events emitted by your own code, discovering events from external packages can be more challenging. The IOTA RPC provides the [`queryEvents`](/iota-api-ref#iotax_queryevents) method, which allows you to query on-chain packages and obtain a list of events you can subscribe to. +To [subscribe to on-chain events](#subscribing-to-events), you first need to identify which events are available. While you can easily track events emitted by your own code, discovering events from external packages can be more challenging. The IOTA RPC provides the [`queryEvents`](/iota-api-ref#iotax_queryevents) method, which allows you to query on-chain packages and obtain a list of events you can subscribe to. -## Applying Event Filters +### Applying Event Filters -When targeting specific events for querying or subscribing, you can use filters to refine your results. Although the filtering options for querying and subscribing are similar, there are notable differences to be aware of. +When targeting specific events for [querying](#querying-events) or [subscribing](#subscribing-to-events), you can use [filters](#filtering-events) to refine your results. Although the filtering options for querying and subscribing are similar, there are notable differences to be aware of. ## Emitting Events in Move @@ -49,65 +49,117 @@ use iota::event; Then, within your function, you can emit an event using the [`emit`](../../references/framework/iota-framework/event.mdx#function-emit) function. For example: -```move -/// Take coin from `DonutShop` and transfer it to tx sender. -/// Requires authorization with `ShopOwnerCap`. -public fun collect_profits( _: &ShopOwnerCap, shop: &mut DonutShop, ctx: &mut TxContext ) { - let amount = balance::value(&shop.balance); - let profits = coin::take(&mut shop.balance, amount, ctx); - // simply create new type instance and emit it. - event::emit(ProfitsCollected { amount }); - transfer::public_transfer(profits, tx_context::sender(ctx)); -} +```move file=<rootDir>/examples/trading/contracts/escrow/sources/lock.move#L42-L63 ``` -## Subscribing to Events +## Querying Events + +<Tabs> + +<TabItem value="RPC" label="IOTA RPC"> +The IOTA RPC provides a [`queryEvents`](/iota-api-ref#iotax_queryevents) method to query on-chain packages and return available events. As an example, the following `curl` command queries the Deepbook package on Mainnet for a specific type of event: + +```sh +curl -X POST https://api.testnet.iota.cafe:443 \ +-H "Content-Type: application/json" \ +-d '{ + "jsonrpc": "2.0", + "id": 1, + "method": "iotax_queryEvents", + "params": [ + { + "MoveModule": { + "package": "0x0000000000000000000000000000000000000000000000000000000000000002", + "module": "display", + "type": "0x0000…0002::display::Display<0xba68…286b::testnet_nft::TestnetNFT>" + } + }, + null, + 3, + false + ] +}' +``` + +The TypeScript SDK provides a wrapper for the `iotax_queryEvents` method: +[`client.queryEvents`](../../references/ts-sdk/api/client/classes/IotaClient#queryevents). -To react to events emitted by Move modules, you need to subscribe to them. -IOTA full nodes support event subscriptions via JSON-RPC notifications over WebSocket. You can interact with the [RPC directly][iotax_subscribeEvent](/iota-api-ref#iotax_subscribeevent), [iotax_subscribeTransaction](/iota-api-ref#iotax_subscribetransaction) or use an SDK like the [IOTA TypeScript SDK](../../references/ts-sdk/typescript/index.mdx). +</TabItem> +<TabItem value="rs" label="Rust"> -The following excerpt from one of the examples uses the TypeScript SDK to create an asynchronous subscription to the filter identified in the filter. +You can use the following as an example on how to query for events using the `query_events` function. You should update +the `PACKAGE_ID_CONST` with a package of your choice. -```move -let unsubscribe = await provider.subscribeEvent({ - filter: { <PACKAGE_ID> }, - onMessage: (event) => { - console.log("subscribeEvent", JSON.stringify(event, null, 2)) +```rust +use iota_sdk::{rpc_types::EventFilter, types::Identifier, IotaClientBuilder}; + +const PACKAGE_ID_CONST: &str = ""; + +#[tokio::main] +async fn main() -> Result<(), anyhow::Error> { + let iota_testnet = IotaClientBuilder::default() + .build("https://api.testnet.iota.cafe:443") + .await?; + + let events = iota_testnet + .event_api() + .query_events( + EventFilter::MoveModule { + package: PACKAGE_ID_CONST.parse()?, + module: Identifier::new("dev_trophy")?, + }, + None, + None, + false, + ) + .await?; + + for event in events.data { + println!("Event: {:?}", event.parsed_json); } -}); + + Ok(()) +} ``` +</TabItem> +<TabItem value="graphql" label="GraphQL"> -Move smart contracts can call other smart contracts that emit events. For example, `0x107a::nft` calls the `0x2::display::new_with_fields` smart contract and emits a `0x2::display::DisplayCreated` event. Note that using package and transaction module to query for `0x2::display` misses the following event even though it is actually an event the `0x2` package emits. The current workaround for this issue is to know all the `packageId`s you care about and search those in the `queryEvent` call. +You can use GraphQL to query events instead of JSON RPC. The following example queries are in the +[`iota-graphql-rpc` crate](https://github.com/iotaledger/iota/tree/develop/crates/iota-graphql-rpc/examples/event_connection) in the IOTA repo. -```json -{ - "id": { - "txDigest": "DrZmtQDDCUKooLzFCi29VhUB4w6AT8phCsT9d62BAf8g", - "eventSeq": "0" - }, - "packageId": "0x000000000000000000000000000000000000000000000000000000000000107a", - "transactionModule": "nft", - "sender": "0x0000000000000000000000000000000000000000000000000000000000000000", - "type": "0x2::display::DisplayCreated<0x107a::nft::Nft>", - "parsedJson": { - "id": "0xa12d72c159d57d4c7f540b2b9e985327628d856b20c1d6cdfd3028a2a605abfe" - }, - "bcs": "CFbAeqXAwwkyTxUD36FtzTGEcMGrVj4zgcTR1G7AaRjb", - "timestampMs": "1521456213521" -} +#### Event Connection + +```graphql file=<rootDir>/crates/iota-graphql-rpc/examples/event_connection/event_connection.graphql +``` + +#### Filter Events By Sender + +```graphql file=<rootDir>/crates/iota-graphql-rpc/examples/event_connection/filter_by_sender.graphql ``` -## Examples +#### Filter Events By Emitting Package and Type -### Subscribe to Event +```graphql file=<rootDir>/crates/iota-graphql-rpc/examples/event_connection/filter_by_sender.graphql +``` + +:::tip + +The [TypeScript SDK](../../references/ts-sdk/api/graphql/classes/IotaGraphQLClient) provides functionality to +interact with the IOTA GraphQL service. + +::: + +</TabItem> +</Tabs> + + +## Subscribing to Events This example leverages the IOTA TypeScript SDK to subscribe to events the package with ID `<PACKAGE_ID>` emits. Each time the event fires, the code displays the response to the console. <Tabs> <TabItem value="rs" label="Rust"> -### Rust - See [Rust SDK](../../references/rust-sdk.mdx). ```rust @@ -132,8 +184,6 @@ async fn main() -> Result<()> { </TabItem> <TabItem value="ts" label="TypeScript"> -### TypeScript - To create the event subscription, you can use a basic Node.js app. You need the [IOTA TypeScript SDK](../../references/ts-sdk/typescript/index.mdx), so install the module using `npm install @iota/iota-sdk` at the root of your project. In your TypeScript code, import `JsonRpcProvider` and a connection from the library. ```ts @@ -199,9 +249,19 @@ subscribeEvent { </TabItem> </Tabs> +## Monitoring Events + +Firing events is not very useful in a vacuum. You also need the ability to respond to those events. +There are two methods from which to choose when you need to monitor on-chain events: +- Incorporate a [custom indexer](../advanced/custom-indexer.mdx) to take advantage of IOTA's micro-data ingestion framework. +- Poll the IOTA network on a schedule to query events. + +Using a custom indexer provides a near-real time monitoring of events, so is most useful when your project requires immediate reaction to the firing of events. Polling the network is most useful when the events you're monitoring don't fire often or the need to act on those events are not immediate. The following section provides a polling example. + + ## Filtering Events -You can filter events when querying or subscribing to receive only the events you are interested in. +You can filter events when [querying](#querying-events) or [subscribing](#subscribing-to-events) to receive only the events you are interested in. :::info diff --git a/docs/content/sidebars/developer.js b/docs/content/sidebars/developer.js index e8ac1eb1bb5..d1500f346fc 100644 --- a/docs/content/sidebars/developer.js +++ b/docs/content/sidebars/developer.js @@ -57,7 +57,6 @@ const developer = [ label: 'Typescript SDK', href: '/references/ts-sdk/typescript', }, - 'developer/iota-101/using-events', ], }, { @@ -70,6 +69,8 @@ const developer = [ 'developer/iota-101/move-overview/init', 'developer/iota-101/move-overview/visibility', 'developer/iota-101/move-overview/entry-functions', + 'developer/iota-101/using-events', + 'developer/iota-101/access-time', { type: 'category', label: 'Structs and Abilities', @@ -107,7 +108,6 @@ const developer = [ 'developer/iota-101/move-overview/patterns/id-pointer', ], }, - 'developer/iota-101/access-time', 'developer/iota-101/move-overview/conventions', ], }, From 619115c4472eabb4ce9762cfc8a025d6c4d7d5f4 Mon Sep 17 00:00:00 2001 From: JCNoguera <88061365+VmMad@users.noreply.github.com> Date: Tue, 17 Dec 2024 16:09:52 +0100 Subject: [PATCH 65/97] feat(wallet-dashboard): add unstake timelocked objects flow (#4300) * feat(dashboard): add unstake timelocked objects view * refactor: improve function * feat: add more unstaking information and rename constant * refactor: imports * fix: imports * fix: remove duplication collapsible * refactor: include both single stake and grouped in a unstake hook * refactor: unify usntake panel * fix: go back correctly to previous screen in staking * refactor: cleanup * refactor: remove popups * refactor: remove popups * revert "refactor: remove popups" * refactor: remove only unnecessary popups * refactor: divide hooks and move deeper inside components * fix: resolve re rendering issue * feat: remove redundant code * fix: update conditionally showing the stake dialog * fix(tooling-dashboard): improve stake wizard (#4454) * fix: improve stake wizzard * fix: add set view helper function * fix: add check for stake details --------- Co-authored-by: evavirseda <evirseda@boxfish.studio> * refactor: imports / exports * feat: add wait for transaction and refresh * feat: improve dialogs * feat(dashboard): minor fixes * fix: query key for timelocked staking * fix: revert constants changes * fix: disable stake button if no available amount for staking * fix: query key for timelocked staking transaction * fix: bigint serialization * fix: remove or check in the useNewStakeTimelockedTransaction --------- Co-authored-by: Bran <52735957+brancoder@users.noreply.github.com> Co-authored-by: evavirseda <evirseda@boxfish.studio> Co-authored-by: cpl121 <100352899+cpl121@users.noreply.github.com> Co-authored-by: cpl121 <cpeon@boxfish.studio> Co-authored-by: Branko <brankobosnic1@gmail.com> --- .../atoms/key-value-info/KeyValueInfo.tsx | 6 + .../loading-indicator/LoadingIndicator.tsx | 7 +- .../app/(protected)/staking/page.tsx | 80 +- .../app/(protected)/vesting/page.tsx | 387 ++++---- .../Dialogs/Staking/StakeDialog.tsx | 154 +--- .../Dialogs/Staking/enums/view.enums.ts | 1 - .../components/Dialogs/Staking/index.ts | 3 +- .../Dialogs/Staking/views/DetailsView.tsx | 6 +- .../Dialogs/Staking/views/EnterAmountView.tsx | 60 +- .../views/EnterTimelockedAmountView.tsx | 104 ++- .../Dialogs/Staking/views/UnstakeView.tsx | 201 ----- .../components/Dialogs/Staking/views/index.ts | 1 - .../components/Dialogs/TransactionDialog.tsx | 4 +- .../components/Dialogs/index.ts | 1 + .../Dialogs/unstake/UnstakeDialog.tsx | 56 ++ .../components/Dialogs/unstake/enums/index.ts | 4 + .../Dialogs/unstake/enums/views.enums.ts | 8 + .../components/Dialogs/unstake/hooks/index.ts | 4 + .../Dialogs/unstake/hooks/useUnstakeDialog.ts | 41 + .../components/Dialogs/unstake/index.ts | 8 + .../views/UnstakeTimelockedObjectsView.tsx | 213 +++++ .../Dialogs/unstake/views/UnstakeView.tsx | 167 ++++ .../components/Dialogs/unstake/views/index.ts | 5 + .../Popup/Popups/SendAssetPopup.tsx | 85 -- .../components/Popup/Popups/UnstakePopup.tsx | 49 - .../VestingPopup/TimelockedUnstakePopup.tsx | 84 -- .../Popup/Popups/VestingPopup/index.ts | 4 - .../components/Popup/Popups/index.ts | 7 - .../components/Popup/index.ts | 2 - .../components/StakeRewardsPanel.tsx | 70 ++ apps/wallet-dashboard/components/index.ts | 1 + .../staking-overview/StartStaking.tsx | 1 - .../components/staking-overview/index.ts | 1 + apps/wallet-dashboard/hooks/index.ts | 2 +- .../hooks/useNewStakeTransaction.ts | 46 +- .../hooks/useNewUnstakeTransaction.ts | 55 ++ .../hooks/useUnstakeTransaction.ts | 28 - apps/wallet-dashboard/package.json | 1 + pnpm-lock.yaml | 842 ++++++++---------- 39 files changed, 1511 insertions(+), 1288 deletions(-) delete mode 100644 apps/wallet-dashboard/components/Dialogs/Staking/views/UnstakeView.tsx create mode 100644 apps/wallet-dashboard/components/Dialogs/unstake/UnstakeDialog.tsx create mode 100644 apps/wallet-dashboard/components/Dialogs/unstake/enums/index.ts create mode 100644 apps/wallet-dashboard/components/Dialogs/unstake/enums/views.enums.ts create mode 100644 apps/wallet-dashboard/components/Dialogs/unstake/hooks/index.ts create mode 100644 apps/wallet-dashboard/components/Dialogs/unstake/hooks/useUnstakeDialog.ts create mode 100644 apps/wallet-dashboard/components/Dialogs/unstake/index.ts create mode 100644 apps/wallet-dashboard/components/Dialogs/unstake/views/UnstakeTimelockedObjectsView.tsx create mode 100644 apps/wallet-dashboard/components/Dialogs/unstake/views/UnstakeView.tsx create mode 100644 apps/wallet-dashboard/components/Dialogs/unstake/views/index.ts delete mode 100644 apps/wallet-dashboard/components/Popup/Popups/SendAssetPopup.tsx delete mode 100644 apps/wallet-dashboard/components/Popup/Popups/UnstakePopup.tsx delete mode 100644 apps/wallet-dashboard/components/Popup/Popups/VestingPopup/TimelockedUnstakePopup.tsx delete mode 100644 apps/wallet-dashboard/components/Popup/Popups/VestingPopup/index.ts delete mode 100644 apps/wallet-dashboard/components/Popup/Popups/index.ts create mode 100644 apps/wallet-dashboard/components/StakeRewardsPanel.tsx create mode 100644 apps/wallet-dashboard/hooks/useNewUnstakeTransaction.ts delete mode 100644 apps/wallet-dashboard/hooks/useUnstakeTransaction.ts diff --git a/apps/ui-kit/src/lib/components/atoms/key-value-info/KeyValueInfo.tsx b/apps/ui-kit/src/lib/components/atoms/key-value-info/KeyValueInfo.tsx index 569054372f2..d15da2af5de 100644 --- a/apps/ui-kit/src/lib/components/atoms/key-value-info/KeyValueInfo.tsx +++ b/apps/ui-kit/src/lib/components/atoms/key-value-info/KeyValueInfo.tsx @@ -57,6 +57,10 @@ interface KeyValueProps { * Reverse the KeyValue (optional). */ isReverse?: boolean; + /** + * Text shown on value hover. + */ + valueHoverTitle?: string; } export function KeyValueInfo({ @@ -72,6 +76,7 @@ export function KeyValueInfo({ onCopyError, fullwidth, isReverse = false, + valueHoverTitle, }: KeyValueProps): React.JSX.Element { const flexDirectionClass = isReverse ? 'flex-row-reverse' : 'flex-row'; async function handleCopyClick(event: React.MouseEvent<HTMLButtonElement>) { @@ -119,6 +124,7 @@ export function KeyValueInfo({ })} > <span + title={valueHoverTitle} className={cx( 'text-neutral-10 dark:text-neutral-92', size === ValueSize.Medium ? 'text-body-lg' : 'text-body-md', diff --git a/apps/ui-kit/src/lib/components/atoms/loading-indicator/LoadingIndicator.tsx b/apps/ui-kit/src/lib/components/atoms/loading-indicator/LoadingIndicator.tsx index 6a0c8d5df45..86160c55771 100644 --- a/apps/ui-kit/src/lib/components/atoms/loading-indicator/LoadingIndicator.tsx +++ b/apps/ui-kit/src/lib/components/atoms/loading-indicator/LoadingIndicator.tsx @@ -18,16 +18,21 @@ export interface LoadingIndicatorProps { * The text to display next to the loading indicator. */ text?: string; + /** + * The 'data-testid' attribute value (used in e2e tests) + */ + testId?: string; } export function LoadingIndicator({ color = 'text-primary-30 dark:text-primary-80', size = 'w-5 h-5', text, + testId, }: LoadingIndicatorProps): React.JSX.Element { return ( <div className="flex items-center justify-center gap-xs"> - <Loader className={cx('animate-spin', color, size)} /> + <Loader className={cx('animate-spin', color, size)} data-testid={testId} /> {text && <span className={cx('text-body-sm', color)}>{text}</span>} </div> ); diff --git a/apps/wallet-dashboard/app/(protected)/staking/page.tsx b/apps/wallet-dashboard/app/(protected)/staking/page.tsx index e33b1253b95..87f69eccffa 100644 --- a/apps/wallet-dashboard/app/(protected)/staking/page.tsx +++ b/apps/wallet-dashboard/app/(protected)/staking/page.tsx @@ -3,7 +3,6 @@ 'use client'; -import { StartStaking } from '@/components/staking-overview/StartStaking'; import { Button, ButtonSize, @@ -16,7 +15,15 @@ import { Title, TitleSize, } from '@iota/apps-ui-kit'; -import { StakeDialog, StakeDialogView } from '@/components'; +import { + StakeDialog, + StakeDialogView, + UnstakeDialog, + useUnstakeDialog, + UnstakeDialogView, + useStakeDialog, + StartStaking, +} from '@/components'; import { ExtendedDelegatedStake, formatDelegatedStake, @@ -32,8 +39,8 @@ import { useCurrentAccount, useIotaClient, useIotaClientQuery } from '@iota/dapp import { IotaSystemStateSummary } from '@iota/iota-sdk/client'; import { Info } from '@iota/ui-icons'; import { useMemo } from 'react'; -import { useStakeDialog } from '@/components/Dialogs/Staking/hooks/useStakeDialog'; import { IOTA_TYPE_ARG } from '@iota/iota-sdk/utils'; +import { IotaSignAndExecuteTransactionOutput } from '@iota/wallet-standard'; function StakingDashboardPage(): React.JSX.Element { const account = useCurrentAccount(); @@ -52,6 +59,14 @@ function StakingDashboardPage(): React.JSX.Element { handleCloseStakeDialog, handleNewStake, } = useStakeDialog(); + const { + isOpen: isUnstakeDialogOpen, + openUnstakeDialog, + defaultDialogProps, + handleClose: handleCloseUnstakeDialog, + setView: setUnstakeDialogView, + setTxDigest, + } = useUnstakeDialog(); const { data: delegatedStakeData, refetch: refetchDelegatedStakes } = useGetDelegatedStake({ address: account?.address || '', @@ -100,6 +115,34 @@ function StakingDashboardPage(): React.JSX.Element { .then(() => refetchDelegatedStakes()); } + function handleUnstakeClick() { + setStakeDialogView(undefined); + openUnstakeDialog(); + } + + function handleUnstakeDialogBack() { + setStakeDialogView(StakeDialogView.Details); + handleCloseUnstakeDialog(); + } + + function handleOnUnstakeBack(view: UnstakeDialogView): (() => void) | undefined { + if (view === UnstakeDialogView.Unstake) { + return handleUnstakeDialogBack; + } + } + + function handleOnUnstakeSuccess(tx: IotaSignAndExecuteTransactionOutput): void { + setUnstakeDialogView(UnstakeDialogView.TransactionDetails); + iotaClient + .waitForTransaction({ + digest: tx.digest, + }) + .then((tx) => { + refetchDelegatedStakes(); + setTxDigest(tx.digest); + }); + } + return ( <div className="flex justify-center"> <div className="w-3/4"> @@ -171,16 +214,27 @@ function StakingDashboardPage(): React.JSX.Element { </div> </div> </div> - <StakeDialog - stakedDetails={selectedStake} - onSuccess={handleOnStakeSuccess} - isOpen={isDialogStakeOpen} - handleClose={handleCloseStakeDialog} - view={stakeDialogView} - setView={setStakeDialogView} - selectedValidator={selectedValidator} - setSelectedValidator={setSelectedValidator} - /> + {isDialogStakeOpen && ( + <StakeDialog + stakedDetails={selectedStake} + onSuccess={handleOnStakeSuccess} + handleClose={handleCloseStakeDialog} + view={stakeDialogView} + setView={setStakeDialogView} + selectedValidator={selectedValidator} + setSelectedValidator={setSelectedValidator} + onUnstakeClick={handleUnstakeClick} + /> + )} + + {isUnstakeDialogOpen && selectedStake && ( + <UnstakeDialog + extendedStake={selectedStake} + onBack={handleOnUnstakeBack} + onSuccess={handleOnUnstakeSuccess} + {...defaultDialogProps} + /> + )} </Panel> ) : ( <div className="flex h-[270px] p-lg"> diff --git a/apps/wallet-dashboard/app/(protected)/vesting/page.tsx b/apps/wallet-dashboard/app/(protected)/vesting/page.tsx index b925d57e97c..2b95cf643b9 100644 --- a/apps/wallet-dashboard/app/(protected)/vesting/page.tsx +++ b/apps/wallet-dashboard/app/(protected)/vesting/page.tsx @@ -6,12 +6,14 @@ import { Banner, StakeDialog, - StakeDialogView, - TimelockedUnstakePopup, useStakeDialog, VestingScheduleDialog, + UnstakeDialog, + StakeDialogView, } from '@/components'; -import { useGetCurrentEpochStartTimestamp, useNotifications, usePopups } from '@/hooks'; +import { UnstakeDialogView } from '@/components/Dialogs/unstake/enums'; +import { useUnstakeDialog } from '@/components/Dialogs/unstake/hooks'; +import { useGetCurrentEpochStartTimestamp, useNotifications } from '@/hooks'; import { buildSupplyIncreaseVestingSchedule, formatDelegatedTimelockedStake, @@ -63,29 +65,33 @@ import { import { IotaValidatorSummary } from '@iota/iota-sdk/client'; import { IOTA_TYPE_ARG } from '@iota/iota-sdk/utils'; import { Calendar, StarHex } from '@iota/ui-icons'; -import { useQueryClient } from '@tanstack/react-query'; import { useRouter } from 'next/navigation'; import { useEffect, useState } from 'react'; import { StakedTimelockObject } from '@/components'; +import { IotaSignAndExecuteTransactionOutput } from '@iota/wallet-standard'; -function VestingDashboardPage(): JSX.Element { +export default function VestingDashboardPage(): JSX.Element { + const [timelockedObjectsToUnstake, setTimelockedObjectsToUnstake] = + useState<TimelockedStakedObjectsGrouped | null>(null); const account = useCurrentAccount(); - const queryClient = useQueryClient(); const iotaClient = useIotaClient(); const router = useRouter(); const { data: system } = useIotaClientQuery('getLatestIotaSystemState'); const [isVestingScheduleDialogOpen, setIsVestingScheduleDialogOpen] = useState(false); const { addNotification } = useNotifications(); - const { openPopup, closePopup } = usePopups(); const { data: currentEpochMs } = useGetCurrentEpochStartTimestamp(); const { data: activeValidators } = useGetActiveValidatorsInfo(); - const { data: timelockedObjects } = useGetAllOwnedObjects(account?.address || '', { - StructType: TIMELOCK_IOTA_TYPE, - }); - - const { data: timelockedStakedObjects, isLoading: istimelockedStakedObjectsLoading } = - useGetTimelockedStakedObjects(account?.address || ''); - + const { data: timelockedObjects, refetch: refetchGetAllOwnedObjects } = useGetAllOwnedObjects( + account?.address || '', + { + StructType: TIMELOCK_IOTA_TYPE, + }, + ); + const { + data: timelockedStakedObjects, + isLoading: istimelockedStakedObjectsLoading, + refetch: refetchTimelockedStakedObjects, + } = useGetTimelockedStakedObjects(account?.address || ''); const { mutateAsync: signAndExecuteTransaction } = useSignAndExecuteTransaction(); const { theme } = useTheme(); @@ -118,6 +124,14 @@ function VestingDashboardPage(): JSX.Element { handleNewStake, } = useStakeDialog(); + const { + isOpen: isUnstakeDialogOpen, + openUnstakeDialog, + defaultDialogProps, + setTxDigest, + setView: setUnstakeDialogView, + } = useUnstakeDialog(); + const nextPayout = getLatestOrEarliestSupplyIncreaseVestingPayout( [...timelockedMapped, ...timelockedstakedMapped], Number(currentEpochMs), @@ -183,25 +197,19 @@ function VestingDashboardPage(): JSX.Element { unlockedTimelockedObjectIds, ); + function refreshStakeList() { + refetchTimelockedStakedObjects(); + refetchGetAllOwnedObjects(); + } + function handleOnSuccess(digest: string): void { + setTimelockedObjectsToUnstake(null); + iotaClient .waitForTransaction({ digest, }) - .then(() => { - queryClient.invalidateQueries({ - queryKey: ['get-timelocked-staked-objects', account?.address], - }); - queryClient.invalidateQueries({ - queryKey: [ - 'get-all-owned-objects', - account?.address, - { - StructType: TIMELOCK_IOTA_TYPE, - }, - ], - }); - }); + .then(refreshStakeList); } const handleCollect = () => { @@ -228,27 +236,22 @@ function VestingDashboardPage(): JSX.Element { }; function handleUnstake(delegatedTimelockedStake: TimelockedStakedObjectsGrouped): void { - const validatorInfo = getValidatorByAddress(delegatedTimelockedStake.validatorAddress); - if (!account || !validatorInfo) { - addNotification('Cannot create transaction', NotificationType.Error); - return; - } - - openPopup( - <TimelockedUnstakePopup - accountAddress={account.address} - delegatedStake={delegatedTimelockedStake} - validatorInfo={validatorInfo} - closePopup={closePopup} - onSuccess={handleOnSuccess} - />, - ); + setTimelockedObjectsToUnstake(delegatedTimelockedStake); + openUnstakeDialog(UnstakeDialogView.TimelockedUnstake); } function openReceiveTokenPopup(): void { setIsVestingScheduleDialogOpen(true); } + function handleOnSuccessUnstake(tx: IotaSignAndExecuteTransactionOutput): void { + setUnstakeDialogView(UnstakeDialogView.TransactionDetails); + iotaClient.waitForTransaction({ digest: tx.digest }).then((tx) => { + refreshStakeList(); + setTxDigest(tx.digest); + }); + } + useEffect(() => { if (!supplyIncreaseVestingEnabled) { router.push('/'); @@ -264,152 +267,174 @@ function VestingDashboardPage(): JSX.Element { } return ( - <div className="flex w-full max-w-4xl flex-col items-stretch justify-center gap-lg justify-self-center md:flex-row"> - <div className="flex w-full flex-col gap-lg md:w-1/2"> - <Panel> - <Title title="Vesting" size={TitleSize.Medium} /> - <div className="flex flex-col gap-md p-lg pt-sm"> - <div className="flex h-24 flex-row gap-4"> - <DisplayStats - label="Total Vested" - value={formattedTotalVested} - supportingLabel={vestedSymbol} - /> - <DisplayStats - label="Total Locked" - value={formattedTotalLocked} - supportingLabel={lockedSymbol} - tooltipText="Total amount of IOTA that is still locked in your account." - tooltipPosition={TooltipPosition.Right} - /> - </div> - <Card type={CardType.Outlined}> - <CardImage type={ImageType.BgSolid} shape={ImageShape.SquareRounded}> - <StarHex className="h-5 w-5 text-primary-30 dark:text-primary-80" /> - </CardImage> - <CardBody - title={`${formattedAvailableClaiming} ${availableClaimingSymbol}`} - subtitle="Available Rewards" - /> - <CardAction - type={CardActionType.Button} - onClick={handleCollect} - title="Collect" - buttonType={ButtonType.Primary} - buttonDisabled={ - !vestingSchedule.availableClaiming || - vestingSchedule.availableClaiming === 0n - } - /> - </Card> - <Card type={CardType.Outlined}> - <CardImage type={ImageType.BgSolid} shape={ImageShape.SquareRounded}> - <Calendar className="h-5 w-5 text-primary-30 dark:text-primary-80" /> - </CardImage> - <CardBody - title={`${formattedNextPayout} ${nextPayoutSymbol}`} - subtitle={`Next payout ${ - nextPayout?.expirationTimestampMs - ? formattedLastPayoutExpirationTime - : '' - }`} - /> - <CardAction - type={CardActionType.Button} - onClick={openReceiveTokenPopup} - title="See All" - buttonType={ButtonType.Secondary} - buttonDisabled={!vestingPortfolio} - /> - </Card> - {vestingPortfolio && ( - <VestingScheduleDialog - open={isVestingScheduleDialogOpen} - setOpen={setIsVestingScheduleDialogOpen} - vestingPortfolio={vestingPortfolio} - /> - )} - </div> - </Panel> - - {timelockedstakedMapped.length === 0 ? ( - <Banner - videoSrc={videoSrc} - title="Stake Vested Tokens" - subtitle="Earn Rewards" - onButtonClick={() => handleNewStake()} - buttonText="Stake" - /> - ) : null} - </div> - - {timelockedstakedMapped.length !== 0 ? ( - <div className="flex w-full md:w-1/2"> + <> + <div className="flex w-full max-w-4xl flex-col items-stretch justify-center gap-lg justify-self-center md:flex-row"> + <div className="flex w-full flex-col gap-lg md:w-1/2"> <Panel> - <Title - title="Staked Vesting" - trailingElement={ - <Button - type={ButtonType.Primary} - text="Stake" - onClick={() => { - setStakeDialogView(StakeDialogView.SelectValidator); - }} - /> - } - /> - - <div className="flex flex-col px-lg py-sm"> - <div className="flex flex-row gap-md"> + <Title title="Vesting" size={TitleSize.Medium} /> + <div className="flex flex-col gap-md p-lg pt-sm"> + <div className="flex h-24 flex-row gap-4"> <DisplayStats - label="Your stake" - value={`${totalStakedFormatted} ${totalStakedSymbol}`} + label="Total Vested" + value={formattedTotalVested} + supportingLabel={vestedSymbol} /> <DisplayStats - label="Earned" - value={`${totalEarnedFormatted} ${totalEarnedSymbol}`} + label="Total Locked" + value={formattedTotalLocked} + supportingLabel={lockedSymbol} + tooltipText="Total amount of IOTA that is still locked in your account." + tooltipPosition={TooltipPosition.Right} /> </div> - </div> - <div className="flex flex-col px-lg py-sm"> - <div className="flex w-full flex-col items-center justify-center space-y-4 pt-4"> - {system && - timelockedStakedObjectsGrouped?.map( - (timelockedStakedObject) => { - return ( - <StakedTimelockObject - key={ - timelockedStakedObject.validatorAddress + - timelockedStakedObject.stakeRequestEpoch + - timelockedStakedObject.label - } - getValidatorByAddress={getValidatorByAddress} - timelockedStakedObject={timelockedStakedObject} - handleUnstake={handleUnstake} - currentEpoch={Number(system.epoch)} - /> - ); - }, - )} - </div> + <Card type={CardType.Outlined}> + <CardImage + type={ImageType.BgSolid} + shape={ImageShape.SquareRounded} + > + <StarHex className="h-5 w-5 text-primary-30 dark:text-primary-80" /> + </CardImage> + <CardBody + title={`${formattedAvailableClaiming} ${availableClaimingSymbol}`} + subtitle="Available Rewards" + /> + <CardAction + type={CardActionType.Button} + onClick={handleCollect} + title="Collect" + buttonType={ButtonType.Primary} + buttonDisabled={ + !vestingSchedule.availableClaiming || + vestingSchedule.availableClaiming === 0n + } + /> + </Card> + <Card type={CardType.Outlined}> + <CardImage + type={ImageType.BgSolid} + shape={ImageShape.SquareRounded} + > + <Calendar className="h-5 w-5 text-primary-30 dark:text-primary-80" /> + </CardImage> + <CardBody + title={`${formattedNextPayout} ${nextPayoutSymbol}`} + subtitle={`Next payout ${ + nextPayout?.expirationTimestampMs + ? formattedLastPayoutExpirationTime + : '' + }`} + /> + <CardAction + type={CardActionType.Button} + onClick={openReceiveTokenPopup} + title="See All" + buttonType={ButtonType.Secondary} + buttonDisabled={!vestingPortfolio} + /> + </Card> + {vestingPortfolio && ( + <VestingScheduleDialog + open={isVestingScheduleDialogOpen} + setOpen={setIsVestingScheduleDialogOpen} + vestingPortfolio={vestingPortfolio} + /> + )} </div> </Panel> + + {timelockedstakedMapped.length === 0 ? ( + <Banner + videoSrc={videoSrc} + title="Stake Vested Tokens" + subtitle="Earn Rewards" + onButtonClick={() => handleNewStake()} + buttonText="Stake" + /> + ) : null} </div> - ) : null} - <StakeDialog - isTimelockedStaking - stakedDetails={selectedStake} - onSuccess={handleOnSuccess} - isOpen={isDialogStakeOpen} - handleClose={handleCloseStakeDialog} - view={stakeDialogView} - setView={setStakeDialogView} - selectedValidator={selectedValidator} - setSelectedValidator={setSelectedValidator} - maxStakableTimelockedAmount={BigInt(vestingSchedule.availableStaking)} - /> - </div> + + {timelockedstakedMapped.length !== 0 ? ( + <div className="flex w-full md:w-1/2"> + <Panel> + <Title + title="Staked Vesting" + trailingElement={ + <Button + type={ButtonType.Primary} + text="Stake" + disabled={vestingSchedule.availableStaking === 0n} + onClick={() => { + setStakeDialogView(StakeDialogView.SelectValidator); + }} + /> + } + /> + + <div className="flex flex-col px-lg py-sm"> + <div className="flex flex-row gap-md"> + <DisplayStats + label="Your stake" + value={`${totalStakedFormatted} ${totalStakedSymbol}`} + /> + <DisplayStats + label="Earned" + value={`${totalEarnedFormatted} ${totalEarnedSymbol}`} + /> + </div> + </div> + <div className="flex flex-col px-lg py-sm"> + <div className="flex w-full flex-col items-center justify-center space-y-4 pt-4"> + {system && + timelockedStakedObjectsGrouped?.map( + (timelockedStakedObject) => { + return ( + <StakedTimelockObject + key={ + timelockedStakedObject.validatorAddress + + timelockedStakedObject.stakeRequestEpoch + + timelockedStakedObject.label + } + getValidatorByAddress={ + getValidatorByAddress + } + timelockedStakedObject={ + timelockedStakedObject + } + handleUnstake={handleUnstake} + currentEpoch={Number(system.epoch)} + /> + ); + }, + )} + </div> + </div> + </Panel> + </div> + ) : null} + + {isDialogStakeOpen && ( + <StakeDialog + isTimelockedStaking + stakedDetails={selectedStake} + onSuccess={handleOnSuccess} + handleClose={handleCloseStakeDialog} + view={stakeDialogView} + setView={setStakeDialogView} + selectedValidator={selectedValidator} + setSelectedValidator={setSelectedValidator} + maxStakableTimelockedAmount={BigInt(vestingSchedule.availableStaking)} + onUnstakeClick={openUnstakeDialog} + /> + )} + + {isUnstakeDialogOpen && timelockedObjectsToUnstake && ( + <UnstakeDialog + groupedTimelockedObjects={timelockedObjectsToUnstake} + onSuccess={handleOnSuccessUnstake} + {...defaultDialogProps} + /> + )} + </div> + </> ); } - -export default VestingDashboardPage; diff --git a/apps/wallet-dashboard/components/Dialogs/Staking/StakeDialog.tsx b/apps/wallet-dashboard/components/Dialogs/Staking/StakeDialog.tsx index 29f832afdf6..6829097f6c3 100644 --- a/apps/wallet-dashboard/components/Dialogs/Staking/StakeDialog.tsx +++ b/apps/wallet-dashboard/components/Dialogs/Staking/StakeDialog.tsx @@ -3,42 +3,28 @@ import React, { useMemo, useState } from 'react'; import { EnterAmountView, EnterTimelockedAmountView, SelectValidatorView } from './views'; -import { - useNotifications, - useNewStakeTransaction, - useGetCurrentEpochStartTimestamp, -} from '@/hooks'; import { ExtendedDelegatedStake, - GroupedTimelockObject, parseAmount, - TIMELOCK_IOTA_TYPE, useCoinMetadata, - useGetAllOwnedObjects, useGetValidatorsApy, useBalance, createValidationSchema, MIN_NUMBER_IOTA_TO_STAKE, } from '@iota/core'; import { FormikProvider, useFormik } from 'formik'; -import type { FormikHelpers } from 'formik'; -import { useCurrentAccount, useSignAndExecuteTransaction } from '@iota/dapp-kit'; +import { useCurrentAccount } from '@iota/dapp-kit'; import { IOTA_TYPE_ARG } from '@iota/iota-sdk/utils'; -import { NotificationType } from '@/stores/notificationStore'; -import { prepareObjectsForTimelockedStakingTransaction } from '@/lib/utils'; import { Dialog } from '@iota/apps-ui-kit'; -import { DetailsView, UnstakeView } from './views'; -import { FormValues } from './views/EnterAmountView'; +import { DetailsView } from './views'; import { TransactionDialogView } from '../TransactionDialog'; import { StakeDialogView } from './enums/view.enums'; -import { Transaction } from '@iota/iota-sdk/transactions'; const INITIAL_VALUES = { amount: '', }; interface StakeDialogProps { - isOpen: boolean; handleClose: () => void; view: StakeDialogView | undefined; setView: (view: StakeDialogView) => void; @@ -48,12 +34,12 @@ interface StakeDialogProps { onSuccess?: (digest: string) => void; selectedValidator?: string; setSelectedValidator?: (validator: string) => void; + onUnstakeClick?: () => void; } export function StakeDialog({ onSuccess, isTimelockedStaking, - isOpen, handleClose, view, setView, @@ -61,6 +47,7 @@ export function StakeDialog({ maxStakableTimelockedAmount, selectedValidator = '', setSelectedValidator, + onUnstakeClick, }: StakeDialogProps): JSX.Element { const account = useCurrentAccount(); const senderAddress = account?.address ?? ''; @@ -79,137 +66,69 @@ export function StakeDialog({ maxStakableTimelockedAmount ?? coinBalance, coinSymbol, coinDecimals, - view === StakeDialogView.Unstake, + false, minimumStake, ), - [maxStakableTimelockedAmount, coinBalance, coinSymbol, coinDecimals, view, minimumStake], + [maxStakableTimelockedAmount, coinBalance, coinSymbol, coinDecimals, minimumStake], ); const formik = useFormik({ initialValues: INITIAL_VALUES, validationSchema: validationSchema, - onSubmit: onSubmit, + onSubmit: () => undefined, validateOnMount: true, }); const amount = formik.values.amount || `${MIN_NUMBER_IOTA_TO_STAKE}`; const amountWithoutDecimals = parseAmount(amount, coinDecimals); - const { data: currentEpochMs } = useGetCurrentEpochStartTimestamp(); - const { data: timelockedObjects } = useGetAllOwnedObjects(senderAddress, { - StructType: TIMELOCK_IOTA_TYPE, - }); - let groupedTimelockObjects: GroupedTimelockObject[] = []; - if (isTimelockedStaking && timelockedObjects && currentEpochMs) { - groupedTimelockObjects = prepareObjectsForTimelockedStakingTransaction( - timelockedObjects, - amountWithoutDecimals, - currentEpochMs, - ); - } - - const { data: newStakeData, isLoading: isTransactionLoading } = useNewStakeTransaction( - selectedValidator, - amountWithoutDecimals, - senderAddress, - isTimelockedStaking, - groupedTimelockObjects, - ); - const { mutateAsync: signAndExecuteTransaction, isPending } = useSignAndExecuteTransaction(); - const { addNotification } = useNotifications(); const { data: rollingAverageApys } = useGetValidatorsApy(); const validators = Object.keys(rollingAverageApys ?? {}) ?? []; function handleBack(): void { - setView?.(StakeDialogView.SelectValidator); + setView(StakeDialogView.SelectValidator); } function handleValidatorSelect(validator: string): void { setSelectedValidator?.(validator); } + function setViewBasedOnStakingType() { + setView( + isTimelockedStaking + ? StakeDialogView.EnterTimelockedAmount + : StakeDialogView.EnterAmount, + ); + } + function selectValidatorHandleNext(): void { if (selectedValidator) { - setView?.( - isTimelockedStaking - ? StakeDialogView.EnterTimelockedAmount - : StakeDialogView.EnterAmount, - ); + setViewBasedOnStakingType(); } } - function detailsHandleUnstake() { - setView?.(StakeDialogView.Unstake); - } - function detailsHandleStake() { - setView?.(StakeDialogView.SelectValidator); - } - - function handleStake(): void { - if (isTimelockedStaking && groupedTimelockObjects.length === 0) { - addNotification('Invalid stake amount. Please try again.', NotificationType.Error); - return; - } - if (!newStakeData?.transaction) { - addNotification('Stake transaction was not created', NotificationType.Error); - return; + if (stakedDetails) { + setSelectedValidator?.(stakedDetails.validatorAddress); + setViewBasedOnStakingType(); } - signAndExecuteTransaction( - { - transaction: newStakeData?.transaction, - }, - { - onSuccess: (tx) => { - onSuccess?.(tx.digest); - addNotification('Stake transaction has been sent'); - setTxDigest(tx.digest); - setView?.(StakeDialogView.TransactionDetails); - }, - onError: () => { - addNotification('Stake transaction was not sent', NotificationType.Error); - }, - }, - ); } - function handleUnstake(transaction: Transaction): void { - if (!transaction) { - addNotification('Unstake transaction was not created', NotificationType.Error); - return; - } - signAndExecuteTransaction( - { - transaction: transaction, - }, - { - onSuccess: (tx) => { - onSuccess?.(tx.digest); - addNotification('Unstake transaction has been sent'); - setTxDigest(tx.digest); - setView?.(StakeDialogView.TransactionDetails); - }, - onError: () => { - addNotification('Unstake transaction was not sent', NotificationType.Error); - }, - }, - ); - } - - function onSubmit(_: FormValues, { resetForm }: FormikHelpers<FormValues>) { - handleStake(); - resetForm(); + function handleTransactionSuccess(digest: string) { + onSuccess?.(digest); + setTxDigest(digest); + setView(StakeDialogView.TransactionDetails); } return ( - <Dialog open={isOpen} onOpenChange={() => handleClose()}> + <Dialog open onOpenChange={() => handleClose()}> <FormikProvider value={formik}> <> {view === StakeDialogView.Details && stakedDetails && ( <DetailsView handleStake={detailsHandleStake} - handleUnstake={detailsHandleUnstake} + handleUnstake={onUnstakeClick} stakedDetails={stakedDetails} handleClose={handleClose} /> @@ -228,29 +147,20 @@ export function StakeDialog({ selectedValidator={selectedValidator} handleClose={handleClose} onBack={handleBack} - onStake={handleStake} - gasBudget={newStakeData?.gasBudget} - isTransactionLoading={isTransactionLoading} + amountWithoutDecimals={amountWithoutDecimals} + senderAddress={senderAddress} + onSuccess={handleTransactionSuccess} /> )} {view === StakeDialogView.EnterTimelockedAmount && ( <EnterTimelockedAmountView selectedValidator={selectedValidator} maxStakableTimelockedAmount={maxStakableTimelockedAmount ?? BigInt(0)} - hasGroupedTimelockObjects={groupedTimelockObjects.length > 0} handleClose={handleClose} onBack={handleBack} - onStake={handleStake} - gasBudget={newStakeData?.gasBudget} - isTransactionLoading={isTransactionLoading} - /> - )} - {view === StakeDialogView.Unstake && stakedDetails && ( - <UnstakeView - extendedStake={stakedDetails} - handleClose={handleClose} - onUnstake={handleUnstake} - isPending={isPending} + senderAddress={senderAddress} + onSuccess={handleTransactionSuccess} + amountWithoutDecimals={amountWithoutDecimals} /> )} {view === StakeDialogView.TransactionDetails && ( diff --git a/apps/wallet-dashboard/components/Dialogs/Staking/enums/view.enums.ts b/apps/wallet-dashboard/components/Dialogs/Staking/enums/view.enums.ts index 1bdb66a93ed..eb4f6cf20f5 100644 --- a/apps/wallet-dashboard/components/Dialogs/Staking/enums/view.enums.ts +++ b/apps/wallet-dashboard/components/Dialogs/Staking/enums/view.enums.ts @@ -5,7 +5,6 @@ export enum StakeDialogView { Details = 'Details', SelectValidator = 'SelectValidator', EnterAmount = 'EnterAmount', - Unstake = 'Unstake', EnterTimelockedAmount = 'EnterTimelockedAmount', TransactionDetails = 'TransactionDetails', } diff --git a/apps/wallet-dashboard/components/Dialogs/Staking/index.ts b/apps/wallet-dashboard/components/Dialogs/Staking/index.ts index bf9af6d49a4..e32885d1475 100644 --- a/apps/wallet-dashboard/components/Dialogs/Staking/index.ts +++ b/apps/wallet-dashboard/components/Dialogs/Staking/index.ts @@ -2,5 +2,6 @@ // SPDX-License-Identifier: Apache-2.0 export * from './enums'; -export * from './StakeDialog'; export * from './hooks'; + +export * from './StakeDialog'; diff --git a/apps/wallet-dashboard/components/Dialogs/Staking/views/DetailsView.tsx b/apps/wallet-dashboard/components/Dialogs/Staking/views/DetailsView.tsx index 0cdba0031e1..48ebf1b4f3c 100644 --- a/apps/wallet-dashboard/components/Dialogs/Staking/views/DetailsView.tsx +++ b/apps/wallet-dashboard/components/Dialogs/Staking/views/DetailsView.tsx @@ -33,11 +33,11 @@ import { formatAddress, IOTA_TYPE_ARG } from '@iota/iota-sdk/utils'; import { DialogLayout, DialogLayoutFooter, DialogLayoutBody } from '../../layout'; interface StakeDialogProps { - stakedDetails: ExtendedDelegatedStake; - showActiveStatus?: boolean; handleClose: () => void; - handleUnstake: () => void; handleStake: () => void; + stakedDetails: ExtendedDelegatedStake; + showActiveStatus?: boolean; + handleUnstake?: () => void; } export function DetailsView({ diff --git a/apps/wallet-dashboard/components/Dialogs/Staking/views/EnterAmountView.tsx b/apps/wallet-dashboard/components/Dialogs/Staking/views/EnterAmountView.tsx index b3869faed2b..a2c7f61d0db 100644 --- a/apps/wallet-dashboard/components/Dialogs/Staking/views/EnterAmountView.tsx +++ b/apps/wallet-dashboard/components/Dialogs/Staking/views/EnterAmountView.tsx @@ -26,11 +26,13 @@ import { } from '@iota/apps-ui-kit'; import { Field, type FieldProps, useFormikContext } from 'formik'; import { Exclamation } from '@iota/ui-icons'; -import { useCurrentAccount, useIotaClientQuery } from '@iota/dapp-kit'; +import { useIotaClientQuery, useSignAndExecuteTransaction } from '@iota/dapp-kit'; import { Validator } from './Validator'; import { StakedInfo } from './StakedInfo'; import { DialogLayout, DialogLayoutBody, DialogLayoutFooter } from '../../layout'; +import { useNewStakeTransaction, useNotifications } from '@/hooks'; +import { NotificationType } from '@/stores/notificationStore'; export interface FormValues { amount: string; @@ -39,37 +41,43 @@ export interface FormValues { interface EnterAmountViewProps { selectedValidator: string; onBack: () => void; - onStake: () => void; showActiveStatus?: boolean; - gasBudget?: string | number | null; handleClose: () => void; - isTransactionLoading?: boolean; + amountWithoutDecimals: bigint; + senderAddress: string; + onSuccess: (digest: string) => void; } function EnterAmountView({ selectedValidator: selectedValidatorAddress, onBack, - onStake, - gasBudget = 0, handleClose, - isTransactionLoading, + amountWithoutDecimals, + senderAddress, + onSuccess, }: EnterAmountViewProps): JSX.Element { const coinType = IOTA_TYPE_ARG; const { data: metadata } = useCoinMetadata(coinType); const decimals = metadata?.decimals ?? 0; - const account = useCurrentAccount(); - const accountAddress = account?.address; + const { addNotification } = useNotifications(); - const { values, errors } = useFormikContext<FormValues>(); + const { values, errors, resetForm } = useFormikContext<FormValues>(); const amount = values.amount; + const { data: newStakeData, isLoading: isTransactionLoading } = useNewStakeTransaction( + selectedValidatorAddress, + amountWithoutDecimals, + senderAddress, + ); + const { data: system } = useIotaClientQuery('getLatestIotaSystemState'); - const { data: iotaBalance } = useBalance(accountAddress!); + const { data: iotaBalance } = useBalance(senderAddress!); const coinBalance = BigInt(iotaBalance?.totalBalance || 0); + const { mutateAsync: signAndExecuteTransaction } = useSignAndExecuteTransaction(); - const gasBudgetBigInt = BigInt(gasBudget ?? 0); - const [gas, symbol] = useFormatCoin(gasBudget, IOTA_TYPE_ARG); + const gasBudgetBigInt = BigInt(newStakeData?.gasBudget ?? 0); + const [gas, symbol] = useFormatCoin(newStakeData?.gasBudget, IOTA_TYPE_ARG); const maxTokenBalance = coinBalance - gasBudgetBigInt; const [maxTokenFormatted, maxTokenFormattedSymbol] = useFormatCoin( @@ -89,6 +97,28 @@ function EnterAmountView({ const hasEnoughRemaingBalance = maxTokenBalance > parseAmount(values.amount, decimals) + BigInt(2) * gasBudgetBigInt; + function handleStake(): void { + if (!newStakeData?.transaction) { + addNotification('Stake transaction was not created', NotificationType.Error); + return; + } + signAndExecuteTransaction( + { + transaction: newStakeData?.transaction, + }, + { + onSuccess: (tx) => { + onSuccess(tx.digest); + addNotification('Stake transaction has been sent'); + resetForm(); + }, + onError: () => { + addNotification('Stake transaction was not sent', NotificationType.Error); + }, + }, + ); + } + return ( <DialogLayout> <Header title="Enter amount" onClose={handleClose} onBack={onBack} titleCentered /> @@ -104,7 +134,7 @@ function EnterAmountView({ </div> <StakedInfo validatorAddress={selectedValidatorAddress} - accountAddress={accountAddress!} + accountAddress={senderAddress!} /> <div className="my-md w-full"> <Field name="amount"> @@ -174,7 +204,7 @@ function EnterAmountView({ <Button fullWidth type={ButtonType.Primary} - onClick={onStake} + onClick={handleStake} disabled={!amount || !!errors?.amount} text="Stake" /> diff --git a/apps/wallet-dashboard/components/Dialogs/Staking/views/EnterTimelockedAmountView.tsx b/apps/wallet-dashboard/components/Dialogs/Staking/views/EnterTimelockedAmountView.tsx index 9eaeb41b6a2..af365e15f30 100644 --- a/apps/wallet-dashboard/components/Dialogs/Staking/views/EnterTimelockedAmountView.tsx +++ b/apps/wallet-dashboard/components/Dialogs/Staking/views/EnterTimelockedAmountView.tsx @@ -1,8 +1,15 @@ // Copyright (c) 2024 IOTA Stiftung // SPDX-License-Identifier: Apache-2.0 -import React from 'react'; -import { useFormatCoin, CoinFormat, useStakeTxnInfo } from '@iota/core'; +import React, { useEffect, useState } from 'react'; +import { + useFormatCoin, + CoinFormat, + useStakeTxnInfo, + GroupedTimelockObject, + useGetAllOwnedObjects, + TIMELOCK_IOTA_TYPE, +} from '@iota/core'; import { IOTA_TYPE_ARG } from '@iota/iota-sdk/utils'; import { Button, @@ -19,11 +26,17 @@ import { } from '@iota/apps-ui-kit'; import { Field, type FieldProps, useFormikContext } from 'formik'; import { Exclamation, Loader } from '@iota/ui-icons'; -import { useCurrentAccount, useIotaClientQuery } from '@iota/dapp-kit'; - +import { useIotaClientQuery, useSignAndExecuteTransaction } from '@iota/dapp-kit'; import { Validator } from './Validator'; import { StakedInfo } from './StakedInfo'; import { DialogLayout, DialogLayoutBody, DialogLayoutFooter } from '../../layout'; +import { + useGetCurrentEpochStartTimestamp, + useNewStakeTimelockedTransaction, + useNotifications, +} from '@/hooks'; +import { NotificationType } from '@/stores/notificationStore'; +import { prepareObjectsForTimelockedStakingTransaction } from '@/lib/utils'; export interface FormValues { amount: string; @@ -32,32 +45,51 @@ export interface FormValues { interface EnterTimelockedAmountViewProps { selectedValidator: string; maxStakableTimelockedAmount: bigint; + amountWithoutDecimals: bigint; + senderAddress: string; onBack: () => void; - onStake: () => void; - gasBudget?: string | number | null; handleClose: () => void; - hasGroupedTimelockObjects?: boolean; - isTransactionLoading?: boolean; + onSuccess: (digest: string) => void; } function EnterTimelockedAmountView({ - selectedValidator: selectedValidatorAddress, + selectedValidator, maxStakableTimelockedAmount, - hasGroupedTimelockObjects, + amountWithoutDecimals, + senderAddress, onBack, - onStake, - gasBudget, handleClose, - isTransactionLoading, + onSuccess, }: EnterTimelockedAmountViewProps): JSX.Element { - const account = useCurrentAccount(); - const accountAddress = account?.address; + const { addNotification } = useNotifications(); + const { mutateAsync: signAndExecuteTransaction } = useSignAndExecuteTransaction(); + const [groupedTimelockObjects, setGroupedTimelockObjects] = useState<GroupedTimelockObject[]>( + [], + ); + const { data: newStakeData, isLoading: isTransactionLoading } = + useNewStakeTimelockedTransaction(selectedValidator, senderAddress, groupedTimelockObjects); + const { data: currentEpochMs } = useGetCurrentEpochStartTimestamp(); + const { data: timelockedObjects } = useGetAllOwnedObjects(senderAddress, { + StructType: TIMELOCK_IOTA_TYPE, + }); + + useEffect(() => { + if (timelockedObjects && currentEpochMs) { + const groupedTimelockObjects = prepareObjectsForTimelockedStakingTransaction( + timelockedObjects, + amountWithoutDecimals, + currentEpochMs, + ); + setGroupedTimelockObjects(groupedTimelockObjects); + } + }, [timelockedObjects, currentEpochMs, amountWithoutDecimals]); - const { values, errors } = useFormikContext<FormValues>(); + const { values, errors, resetForm } = useFormikContext<FormValues>(); const amount = values.amount; + const hasGroupedTimelockObjects = groupedTimelockObjects.length > 0; const { data: system } = useIotaClientQuery('getLatestIotaSystemState'); - const [gas, symbol] = useFormatCoin(gasBudget ?? 0, IOTA_TYPE_ARG); + const [gas, symbol] = useFormatCoin(newStakeData?.gasBudget ?? 0, IOTA_TYPE_ARG); const [maxTokenFormatted, maxTokenFormattedSymbol] = useFormatCoin( maxStakableTimelockedAmount, @@ -71,6 +103,32 @@ function EnterTimelockedAmountView({ system?.epoch, ); + function handleStake(): void { + if (groupedTimelockObjects.length === 0) { + addNotification('Invalid stake amount. Please try again.', NotificationType.Error); + return; + } + if (!newStakeData?.transaction) { + addNotification('Stake transaction was not created', NotificationType.Error); + return; + } + signAndExecuteTransaction( + { + transaction: newStakeData?.transaction, + }, + { + onSuccess: (tx) => { + onSuccess?.(tx.digest); + addNotification('Stake transaction has been sent'); + resetForm(); + }, + onError: () => { + addNotification('Stake transaction was not sent', NotificationType.Error); + }, + }, + ); + } + return ( <DialogLayout> <Header title="Enter amount" onClose={handleClose} onBack={onBack} titleCentered /> @@ -78,15 +136,11 @@ function EnterTimelockedAmountView({ <div className="flex w-full flex-col justify-between"> <div> <div className="mb-md"> - <Validator - address={selectedValidatorAddress} - isSelected - showAction={false} - /> + <Validator address={selectedValidator} isSelected showAction={false} /> </div> <StakedInfo - validatorAddress={selectedValidatorAddress} - accountAddress={accountAddress!} + validatorAddress={selectedValidator} + accountAddress={senderAddress!} /> <div className="my-md w-full"> <Field name="amount"> @@ -162,7 +216,7 @@ function EnterTimelockedAmountView({ isTransactionLoading || !hasGroupedTimelockObjects } - onClick={onStake} + onClick={handleStake} text="Stake" icon={ isTransactionLoading ? ( diff --git a/apps/wallet-dashboard/components/Dialogs/Staking/views/UnstakeView.tsx b/apps/wallet-dashboard/components/Dialogs/Staking/views/UnstakeView.tsx deleted file mode 100644 index 302d1de5514..00000000000 --- a/apps/wallet-dashboard/components/Dialogs/Staking/views/UnstakeView.tsx +++ /dev/null @@ -1,201 +0,0 @@ -// Copyright (c) 2024 IOTA Stiftung -// SPDX-License-Identifier: Apache-2.0 - -import { - Header, - Button, - KeyValueInfo, - Divider, - ButtonType, - Panel, - LoadingIndicator, - InfoBoxType, - InfoBoxStyle, - InfoBox, -} from '@iota/apps-ui-kit'; -import { - createUnstakeTransaction, - ExtendedDelegatedStake, - GAS_SYMBOL, - TimeUnit, - useFormatCoin, - useGetTimeBeforeEpochNumber, - useGetStakingValidatorDetails, - useTimeAgo, - useTransactionGasBudget, -} from '@iota/core'; -import { IOTA_TYPE_ARG } from '@iota/iota-sdk/utils'; -import { useMemo } from 'react'; -import { useCurrentAccount } from '@iota/dapp-kit'; -import { Loader, Warning } from '@iota/ui-icons'; -import { useUnstakeTransaction } from '@/hooks'; -import { ValidatorStakingData } from '@/components'; -import { DialogLayout, DialogLayoutFooter, DialogLayoutBody } from '../../layout'; -import { Transaction } from '@iota/iota-sdk/transactions'; - -interface UnstakeViewProps { - extendedStake: ExtendedDelegatedStake; - handleClose: () => void; - onUnstake: (unstakeTransaction: Transaction) => void; - isPending: boolean; -} - -export function UnstakeView({ - extendedStake, - handleClose, - onUnstake, - isPending, -}: UnstakeViewProps): JSX.Element { - const stakingReward = BigInt(extendedStake.estimatedReward ?? '').toString(); - const [rewards, rewardSymbol] = useFormatCoin(stakingReward, IOTA_TYPE_ARG); - const activeAddress = useCurrentAccount()?.address ?? null; - - const { - totalStake: [tokenBalance], - totalStakeOriginal, - epoch, - systemDataResult, - delegatedStakeDataResult, - } = useGetStakingValidatorDetails({ - accountAddress: activeAddress, - validatorAddress: extendedStake.validatorAddress, - stakeId: extendedStake.stakedIotaId, - unstake: true, - }); - - const { isLoading: loadingValidators, error: errorValidators } = systemDataResult; - const { - isLoading: isLoadingDelegatedStakeData, - isError, - error: delegatedStakeDataError, - } = delegatedStakeDataResult; - - const delegationId = extendedStake?.stakedIotaId; - - const [totalIota] = useFormatCoin( - BigInt(stakingReward || 0) + totalStakeOriginal, - IOTA_TYPE_ARG, - ); - - const transaction = useMemo( - () => createUnstakeTransaction(extendedStake.stakedIotaId), - [extendedStake], - ); - const { data: gasBudget } = useTransactionGasBudget(activeAddress, transaction); - - const { data: currentEpochEndTime } = useGetTimeBeforeEpochNumber(epoch + 1 || 0); - const currentEpochEndTimeAgo = useTimeAgo({ - timeFrom: currentEpochEndTime, - endLabel: '--', - shortedTimeLabel: false, - shouldEnd: true, - maxTimeUnit: TimeUnit.ONE_HOUR, - }); - - const { data: unstakeData } = useUnstakeTransaction( - extendedStake.stakedIotaId, - activeAddress || '', - ); - - function handleUnstake(): void { - if (!unstakeData) return; - onUnstake(unstakeData.transaction); - } - - const currentEpochEndTimeFormatted = - currentEpochEndTime > 0 ? currentEpochEndTimeAgo : `Epoch #${epoch}`; - - if (isLoadingDelegatedStakeData || loadingValidators) { - return ( - <div className="flex h-full w-full items-center justify-center p-2"> - <LoadingIndicator /> - </div> - ); - } - - if (isError || errorValidators) { - return ( - <div className="mb-2 flex h-full w-full items-center justify-center p-2"> - <InfoBox - title="Something went wrong" - supportingText={delegatedStakeDataError?.message ?? 'An error occurred'} - style={InfoBoxStyle.Default} - type={InfoBoxType.Error} - icon={<Warning />} - /> - </div> - ); - } - - return ( - <DialogLayout> - <Header title="Unstake" onClose={handleClose} onBack={handleClose} titleCentered /> - <DialogLayoutBody> - <div className="flex flex-col gap-y-md"> - <ValidatorStakingData - validatorAddress={extendedStake.validatorAddress} - stakeId={extendedStake.stakedIotaId} - isUnstake - /> - - <Panel hasBorder> - <div className="flex flex-col gap-y-sm p-md"> - <KeyValueInfo - keyText="Current Epoch Ends" - value={currentEpochEndTimeFormatted} - fullwidth - /> - <Divider /> - <KeyValueInfo - keyText="Your Stake" - value={tokenBalance} - supportingLabel={GAS_SYMBOL} - fullwidth - /> - <KeyValueInfo - keyText="Rewards Earned" - value={rewards} - supportingLabel={rewardSymbol} - fullwidth - /> - <Divider /> - <KeyValueInfo - keyText="Total unstaked IOTA" - value={totalIota} - supportingLabel={GAS_SYMBOL} - fullwidth - /> - </div> - </Panel> - - <Panel hasBorder> - <div className="flex flex-col gap-y-sm p-md"> - <KeyValueInfo - keyText="Gas Fees" - value={gasBudget || '-'} - supportingLabel={GAS_SYMBOL} - fullwidth - /> - </div> - </Panel> - </div> - </DialogLayoutBody> - - <DialogLayoutFooter> - <Button - type={ButtonType.Secondary} - fullWidth - onClick={handleUnstake} - disabled={isPending || !delegationId} - text="Unstake" - icon={ - isPending ? ( - <Loader className="animate-spin" data-testid="loading-indicator" /> - ) : null - } - iconAfterText - /> - </DialogLayoutFooter> - </DialogLayout> - ); -} diff --git a/apps/wallet-dashboard/components/Dialogs/Staking/views/index.ts b/apps/wallet-dashboard/components/Dialogs/Staking/views/index.ts index 8ed3cfb4dee..685926f46f6 100644 --- a/apps/wallet-dashboard/components/Dialogs/Staking/views/index.ts +++ b/apps/wallet-dashboard/components/Dialogs/Staking/views/index.ts @@ -5,4 +5,3 @@ export { default as EnterAmountView } from './EnterAmountView'; export { default as EnterTimelockedAmountView } from './EnterTimelockedAmountView'; export { default as SelectValidatorView } from './SelectValidatorView'; export * from './DetailsView'; -export * from './UnstakeView'; diff --git a/apps/wallet-dashboard/components/Dialogs/TransactionDialog.tsx b/apps/wallet-dashboard/components/Dialogs/TransactionDialog.tsx index c1b6a845b01..8b78f53d190 100644 --- a/apps/wallet-dashboard/components/Dialogs/TransactionDialog.tsx +++ b/apps/wallet-dashboard/components/Dialogs/TransactionDialog.tsx @@ -46,7 +46,9 @@ export function TransactionDialogView({ renderValidatorLogo={Validator} /> ) : ( - <LoadingIndicator /> + <div className="flex h-full w-full justify-center"> + <LoadingIndicator /> + </div> )} </DialogLayoutBody> <DialogLayoutFooter> diff --git a/apps/wallet-dashboard/components/Dialogs/index.ts b/apps/wallet-dashboard/components/Dialogs/index.ts index 97ee2fabbad..3987a39aabf 100644 --- a/apps/wallet-dashboard/components/Dialogs/index.ts +++ b/apps/wallet-dashboard/components/Dialogs/index.ts @@ -4,4 +4,5 @@ export * from './SendToken'; export * from './ReceiveFundsDialog'; export * from './Staking'; +export * from './unstake'; export * from './vesting'; diff --git a/apps/wallet-dashboard/components/Dialogs/unstake/UnstakeDialog.tsx b/apps/wallet-dashboard/components/Dialogs/unstake/UnstakeDialog.tsx new file mode 100644 index 00000000000..16ef52b41bb --- /dev/null +++ b/apps/wallet-dashboard/components/Dialogs/unstake/UnstakeDialog.tsx @@ -0,0 +1,56 @@ +// Copyright (c) 2024 IOTA Stiftung +// SPDX-License-Identifier: Apache-2.0 + +import { Dialog } from '@iota/apps-ui-kit'; +import { UnstakeTimelockedObjectsView, UnstakeView } from './views'; +import { ExtendedDelegatedStake } from '@iota/core'; +import { TimelockedStakedObjectsGrouped } from '@/lib/utils'; +import { UnstakeDialogView } from './enums'; +import { IotaSignAndExecuteTransactionOutput } from '@iota/wallet-standard'; +import { TransactionDialogView } from '../TransactionDialog'; + +interface UnstakeDialogProps { + view: UnstakeDialogView; + handleClose: () => void; + onSuccess: (tx: IotaSignAndExecuteTransactionOutput) => void; + onBack?: (view: UnstakeDialogView) => (() => void) | undefined; + groupedTimelockedObjects?: TimelockedStakedObjectsGrouped; + extendedStake?: ExtendedDelegatedStake; + txDigest?: string; +} + +export function UnstakeDialog({ + view, + handleClose, + onSuccess, + extendedStake, + groupedTimelockedObjects, + onBack, + txDigest, +}: UnstakeDialogProps): React.JSX.Element { + return ( + <Dialog open onOpenChange={handleClose}> + {view === UnstakeDialogView.Unstake && extendedStake && ( + <UnstakeView + extendedStake={extendedStake} + handleClose={handleClose} + onBack={onBack?.(UnstakeDialogView.Unstake)} + showActiveStatus + onSuccess={onSuccess} + /> + )} + + {view === UnstakeDialogView.TimelockedUnstake && groupedTimelockedObjects && ( + <UnstakeTimelockedObjectsView + onClose={handleClose} + groupedTimelockedObjects={groupedTimelockedObjects} + onBack={onBack?.(UnstakeDialogView.TimelockedUnstake)} + onSuccess={onSuccess} + /> + )} + {view === UnstakeDialogView.TransactionDetails && ( + <TransactionDialogView txDigest={txDigest} onClose={handleClose} /> + )} + </Dialog> + ); +} diff --git a/apps/wallet-dashboard/components/Dialogs/unstake/enums/index.ts b/apps/wallet-dashboard/components/Dialogs/unstake/enums/index.ts new file mode 100644 index 00000000000..75ff18fcbaf --- /dev/null +++ b/apps/wallet-dashboard/components/Dialogs/unstake/enums/index.ts @@ -0,0 +1,4 @@ +// Copyright (c) 2024 IOTA Stiftung +// SPDX-License-Identifier: Apache-2.0 + +export * from './views.enums'; diff --git a/apps/wallet-dashboard/components/Dialogs/unstake/enums/views.enums.ts b/apps/wallet-dashboard/components/Dialogs/unstake/enums/views.enums.ts new file mode 100644 index 00000000000..1b0b313dcce --- /dev/null +++ b/apps/wallet-dashboard/components/Dialogs/unstake/enums/views.enums.ts @@ -0,0 +1,8 @@ +// Copyright (c) 2024 IOTA Stiftung +// SPDX-License-Identifier: Apache-2.0 + +export enum UnstakeDialogView { + Unstake = 'unstake', + TimelockedUnstake = 'timelockedUnstake', + TransactionDetails = 'transactionDetails', +} diff --git a/apps/wallet-dashboard/components/Dialogs/unstake/hooks/index.ts b/apps/wallet-dashboard/components/Dialogs/unstake/hooks/index.ts new file mode 100644 index 00000000000..8834415eafd --- /dev/null +++ b/apps/wallet-dashboard/components/Dialogs/unstake/hooks/index.ts @@ -0,0 +1,4 @@ +// Copyright (c) 2024 IOTA Stiftung +// SPDX-License-Identifier: Apache-2.0 + +export * from './useUnstakeDialog'; diff --git a/apps/wallet-dashboard/components/Dialogs/unstake/hooks/useUnstakeDialog.ts b/apps/wallet-dashboard/components/Dialogs/unstake/hooks/useUnstakeDialog.ts new file mode 100644 index 00000000000..88de6c40f25 --- /dev/null +++ b/apps/wallet-dashboard/components/Dialogs/unstake/hooks/useUnstakeDialog.ts @@ -0,0 +1,41 @@ +// Copyright (c) 2024 IOTA Stiftung +// SPDX-License-Identifier: Apache-2.0 + +import { ComponentProps, useState } from 'react'; +import { UnstakeDialogView } from '../enums'; +import type { UnstakeDialog } from '../UnstakeDialog'; + +export function useUnstakeDialog() { + const [isOpen, setIsOpen] = useState(false); + const [view, setView] = useState<UnstakeDialogView>(UnstakeDialogView.Unstake); + const [txDigest, setTxDigest] = useState<string | undefined>(); + + function openUnstakeDialog(view?: UnstakeDialogView) { + setIsOpen(true); + if (view) { + setView(view); + } + } + + function handleClose() { + setIsOpen(false); + } + + const defaultDialogProps: Omit<ComponentProps<typeof UnstakeDialog>, 'onSuccess'> = { + view, + handleClose: () => setIsOpen(false), + txDigest, + }; + + return { + isOpen, + setIsOpen, + view, + setView, + openUnstakeDialog, + txDigest, + setTxDigest, + defaultDialogProps, + handleClose, + }; +} diff --git a/apps/wallet-dashboard/components/Dialogs/unstake/index.ts b/apps/wallet-dashboard/components/Dialogs/unstake/index.ts new file mode 100644 index 00000000000..05b9b934af5 --- /dev/null +++ b/apps/wallet-dashboard/components/Dialogs/unstake/index.ts @@ -0,0 +1,8 @@ +// Copyright (c) 2024 IOTA Stiftung +// SPDX-License-Identifier: Apache-2.0 + +export * from './views'; +export * from './enums'; +export * from './hooks'; + +export * from './UnstakeDialog'; diff --git a/apps/wallet-dashboard/components/Dialogs/unstake/views/UnstakeTimelockedObjectsView.tsx b/apps/wallet-dashboard/components/Dialogs/unstake/views/UnstakeTimelockedObjectsView.tsx new file mode 100644 index 00000000000..45e34ee5cf0 --- /dev/null +++ b/apps/wallet-dashboard/components/Dialogs/unstake/views/UnstakeTimelockedObjectsView.tsx @@ -0,0 +1,213 @@ +// Copyright (c) 2024 IOTA Stiftung +// SPDX-License-Identifier: Apache-2.0 + +import { StakeRewardsPanel, ValidatorStakingData } from '@/components'; +import { DialogLayout, DialogLayoutBody, DialogLayoutFooter } from '../../layout'; +import { Validator } from '../../Staking/views/Validator'; +import { useNewUnstakeTimelockedTransaction, useNotifications } from '@/hooks'; +import { + Collapsible, + TimeUnit, + useFormatCoin, + useGetActiveValidatorsInfo, + useTimeAgo, +} from '@iota/core'; +import { ExtendedDelegatedTimelockedStake, TimelockedStakedObjectsGrouped } from '@/lib/utils'; +import { formatAddress, IOTA_TYPE_ARG } from '@iota/iota-sdk/utils'; +import { + Panel, + LoadingIndicator, + KeyValueInfo, + Header, + ButtonType, + Button, +} from '@iota/apps-ui-kit'; +import { useCurrentAccount, useSignAndExecuteTransaction } from '@iota/dapp-kit'; +import { IotaSignAndExecuteTransactionOutput } from '@iota/wallet-standard'; +import { NotificationType } from '@/stores/notificationStore'; + +interface UnstakeTimelockedObjectsViewProps { + onClose: () => void; + groupedTimelockedObjects: TimelockedStakedObjectsGrouped; + onSuccess: (tx: IotaSignAndExecuteTransactionOutput) => void; + onBack?: () => void; +} + +export function UnstakeTimelockedObjectsView({ + groupedTimelockedObjects, + onClose, + onBack, + onSuccess, +}: UnstakeTimelockedObjectsViewProps) { + const { addNotification } = useNotifications(); + const activeAddress = useCurrentAccount()?.address ?? ''; + const { data: activeValidators } = useGetActiveValidatorsInfo(); + + const stakes = groupedTimelockedObjects.stakes; + const timelockedStakedIotaIds = stakes.map((stake) => stake.timelockedStakedIotaId); + + const { data: unstakeData, isPending: isUnstakeTxPending } = useNewUnstakeTimelockedTransaction( + activeAddress, + timelockedStakedIotaIds, + ); + const { mutateAsync: signAndExecuteTransaction, isPending: isTransactionPending } = + useSignAndExecuteTransaction(); + + const validatorInfo = activeValidators?.find( + ({ iotaAddress: validatorAddress }) => + validatorAddress === groupedTimelockedObjects.validatorAddress, + ); + + const stakeId = stakes[0].timelockedStakedIotaId; + const totalStakedAmount = stakes.reduce((acc, stake) => acc + parseInt(stake.principal), 0); + const totalRewards = stakes.reduce( + (acc, stake) => acc + (stake.status === 'Active' ? parseInt(stake.estimatedReward) : 0), + 0, + ); + + const [rewardsPoolFormatted, rewardsToken] = useFormatCoin( + validatorInfo?.rewardsPool, + IOTA_TYPE_ARG, + ); + + function handleCopySuccess() { + addNotification('Copied to clipboard'); + } + + async function handleUnstake(): Promise<void> { + if (!unstakeData) return; + + await signAndExecuteTransaction( + { + transaction: unstakeData.transaction, + }, + { + onSuccess: (tx) => { + addNotification('Unstake transaction has been sent'); + onSuccess(tx); + }, + }, + ).catch(() => { + addNotification('Unstake transaction was not sent', NotificationType.Error); + }); + } + + return ( + <DialogLayout> + <Header title="Unstake" onClose={onClose} onBack={onBack} /> + <DialogLayoutBody> + <div className="flex flex-col gap-md"> + <Validator + address={groupedTimelockedObjects.validatorAddress} + isSelected + showActiveStatus + /> + + {stakeId && ( + <ValidatorStakingData + key={stakeId} + validatorAddress={groupedTimelockedObjects.validatorAddress} + stakeId={stakeId} + isUnstake + /> + )} + + <StakeRewardsPanel + stakingRewards={totalRewards} + totalStaked={totalStakedAmount} + isTimelocked + /> + + <Panel hasBorder> + <div className="flex flex-col gap-y-sm p-md"> + <KeyValueInfo + keyText="Stake Request Epoch" + value={groupedTimelockedObjects.stakeRequestEpoch} + fullwidth + /> + {rewardsPoolFormatted && ( + <KeyValueInfo + keyText="Rewards Pool" + value={rewardsPoolFormatted} + supportingLabel={rewardsToken} + fullwidth + /> + )} + <KeyValueInfo keyText="Total Stakes" value={stakes.length} fullwidth /> + </div> + </Panel> + + {stakes.map((stake, index) => ( + <TimelockedStakeCollapsible + title={`Stake Nº${index + 1}`} + key={stake.timelockedStakedIotaId} + stake={stake} + handleCopySuccess={handleCopySuccess} + /> + ))} + </div> + </DialogLayoutBody> + <DialogLayoutFooter> + <Button + onClick={handleUnstake} + text="Unstake" + icon={!unstakeData || isUnstakeTxPending ? <LoadingIndicator /> : undefined} + disabled={!unstakeData || isTransactionPending || isUnstakeTxPending} + type={ButtonType.Secondary} + fullWidth + /> + </DialogLayoutFooter> + </DialogLayout> + ); +} + +interface TimelockedStakeCollapsibleProps { + stake: ExtendedDelegatedTimelockedStake; + title: string; + handleCopySuccess: () => void; +} +function TimelockedStakeCollapsible({ + stake, + title, + handleCopySuccess, +}: TimelockedStakeCollapsibleProps) { + const currentEpochEndTimeAgo = useTimeAgo({ + timeFrom: Number(stake.expirationTimestampMs), + endLabel: '--', + shortedTimeLabel: false, + shouldEnd: true, + maxTimeUnit: TimeUnit.ONE_DAY, + }); + return ( + <Collapsible defaultOpen key={stake.timelockedStakedIotaId} title={title}> + <Panel> + <div className="flex flex-col gap-y-sm p-md--rs py-sm"> + <KeyValueInfo + keyText="Stake ID" + value={formatAddress(stake.timelockedStakedIotaId)} + valueHoverTitle={stake.timelockedStakedIotaId} + onCopySuccess={handleCopySuccess} + copyText={stake.timelockedStakedIotaId} + fullwidth + /> + <KeyValueInfo + keyText="Expiration time" + value={currentEpochEndTimeAgo} + fullwidth + /> + {stake.label && ( + <KeyValueInfo + keyText="Label" + value={formatAddress(stake.label)} + copyText={stake.label} + valueHoverTitle={stake.label} + onCopySuccess={handleCopySuccess} + fullwidth + /> + )} + <KeyValueInfo keyText="Status" value={stake.status} fullwidth /> + </div> + </Panel> + </Collapsible> + ); +} diff --git a/apps/wallet-dashboard/components/Dialogs/unstake/views/UnstakeView.tsx b/apps/wallet-dashboard/components/Dialogs/unstake/views/UnstakeView.tsx new file mode 100644 index 00000000000..5d07eadcec3 --- /dev/null +++ b/apps/wallet-dashboard/components/Dialogs/unstake/views/UnstakeView.tsx @@ -0,0 +1,167 @@ +// Copyright (c) 2024 IOTA Stiftung +// SPDX-License-Identifier: Apache-2.0 + +import { + Header, + Button, + KeyValueInfo, + ButtonType, + Panel, + LoadingIndicator, + InfoBoxType, + InfoBoxStyle, + InfoBox, +} from '@iota/apps-ui-kit'; +import { + ExtendedDelegatedStake, + GAS_SYMBOL, + useFormatCoin, + useGetStakingValidatorDetails, +} from '@iota/core'; +import { IOTA_TYPE_ARG } from '@iota/iota-sdk/utils'; +import { useCurrentAccount, useSignAndExecuteTransaction } from '@iota/dapp-kit'; +import { Warning } from '@iota/ui-icons'; +import { StakeRewardsPanel, ValidatorStakingData } from '@/components'; +import { DialogLayout, DialogLayoutFooter, DialogLayoutBody } from '../../layout'; +import { Validator } from '../../Staking/views/Validator'; +import { useNewUnstakeTransaction, useNotifications } from '@/hooks'; +import { IotaSignAndExecuteTransactionOutput } from '@iota/wallet-standard'; +import { NotificationType } from '@/stores/notificationStore'; + +interface UnstakeDialogProps { + extendedStake: ExtendedDelegatedStake; + handleClose: () => void; + onSuccess: (tx: IotaSignAndExecuteTransactionOutput) => void; + showActiveStatus?: boolean; + onBack?: () => void; +} + +export function UnstakeView({ + extendedStake, + handleClose, + onBack, + onSuccess, + showActiveStatus, +}: UnstakeDialogProps): JSX.Element { + const activeAddress = useCurrentAccount()?.address ?? ''; + const { addNotification } = useNotifications(); + const { data: unstakeData, isPending: isUnstakeTxPending } = useNewUnstakeTransaction( + activeAddress, + extendedStake.stakedIotaId, + ); + const [gasFormatted] = useFormatCoin(unstakeData?.gasBudget, IOTA_TYPE_ARG); + + const { mutateAsync: signAndExecuteTransaction, isPending: isTransactionPending } = + useSignAndExecuteTransaction(); + + const { totalStakeOriginal, systemDataResult, delegatedStakeDataResult } = + useGetStakingValidatorDetails({ + accountAddress: activeAddress, + validatorAddress: extendedStake.validatorAddress, + stakeId: extendedStake.stakedIotaId, + unstake: true, + }); + + const { isLoading: loadingValidators, error: errorValidators } = systemDataResult; + const { + isLoading: isLoadingDelegatedStakeData, + isError, + error: delegatedStakeDataError, + } = delegatedStakeDataResult; + + const delegationId = extendedStake?.stakedIotaId; + const isPreparingUnstake = !unstakeData || isUnstakeTxPending; + + async function handleUnstake(): Promise<void> { + if (!unstakeData) return; + + await signAndExecuteTransaction( + { + transaction: unstakeData.transaction, + }, + { + onSuccess: (tx) => { + addNotification('Unstake transaction has been sent'); + onSuccess(tx); + }, + }, + ).catch(() => { + addNotification('Unstake transaction was not sent', NotificationType.Error); + }); + } + + if (isLoadingDelegatedStakeData || loadingValidators) { + return ( + <div className="flex h-full w-full items-center justify-center p-2"> + <LoadingIndicator /> + </div> + ); + } + + if (isError || errorValidators) { + return ( + <div className="mb-2 flex h-full w-full items-center justify-center p-2"> + <InfoBox + title="Something went wrong" + supportingText={delegatedStakeDataError?.message ?? 'An error occurred'} + style={InfoBoxStyle.Default} + type={InfoBoxType.Error} + icon={<Warning />} + /> + </div> + ); + } + + return ( + <DialogLayout> + <Header title="Unstake" onClose={handleClose} onBack={onBack} titleCentered /> + <DialogLayoutBody> + <div className="flex flex-col gap-y-md"> + <Validator + address={extendedStake.validatorAddress} + isSelected + showActiveStatus={showActiveStatus} + /> + + <ValidatorStakingData + validatorAddress={extendedStake.validatorAddress} + stakeId={extendedStake.stakedIotaId} + isUnstake + /> + + <StakeRewardsPanel + stakingRewards={extendedStake.estimatedReward} + totalStaked={totalStakeOriginal} + /> + + <Panel hasBorder> + <div className="flex flex-col gap-y-sm p-md"> + <KeyValueInfo + keyText="Gas Fees" + value={gasFormatted || '-'} + supportingLabel={GAS_SYMBOL} + fullwidth + /> + </div> + </Panel> + </div> + </DialogLayoutBody> + + <DialogLayoutFooter> + <Button + type={ButtonType.Secondary} + fullWidth + onClick={handleUnstake} + disabled={isPreparingUnstake || isTransactionPending || !delegationId} + text="Unstake" + icon={ + isPreparingUnstake ? ( + <LoadingIndicator data-testid="loading-indicator" /> + ) : null + } + iconAfterText + /> + </DialogLayoutFooter> + </DialogLayout> + ); +} diff --git a/apps/wallet-dashboard/components/Dialogs/unstake/views/index.ts b/apps/wallet-dashboard/components/Dialogs/unstake/views/index.ts new file mode 100644 index 00000000000..88b177871cd --- /dev/null +++ b/apps/wallet-dashboard/components/Dialogs/unstake/views/index.ts @@ -0,0 +1,5 @@ +// Copyright (c) 2024 IOTA Stiftung +// SPDX-License-Identifier: Apache-2.0 + +export * from './UnstakeView'; +export * from './UnstakeTimelockedObjectsView'; diff --git a/apps/wallet-dashboard/components/Popup/Popups/SendAssetPopup.tsx b/apps/wallet-dashboard/components/Popup/Popups/SendAssetPopup.tsx deleted file mode 100644 index 679c4002d96..00000000000 --- a/apps/wallet-dashboard/components/Popup/Popups/SendAssetPopup.tsx +++ /dev/null @@ -1,85 +0,0 @@ -// Copyright (c) 2024 IOTA Stiftung -// SPDX-License-Identifier: Apache-2.0 - -import React, { useCallback, useState } from 'react'; -import { IotaObjectData } from '@iota/iota-sdk/client'; -import { VisualAssetTile, Input } from '@/components'; -import { Button } from '@/components/Buttons'; -import { FlexDirection } from '@/lib/ui/enums'; -import { useCurrentAccount } from '@iota/dapp-kit'; -import { createNftSendValidationSchema, ValidationError } from '@iota/core'; -import { useRouter } from 'next/navigation'; -import { useNotifications } from '@/hooks'; -import { NotificationType } from '@/stores/notificationStore'; -import { useCreateSendAssetTransaction } from '@/hooks'; -import { ASSETS_ROUTE } from '@/lib/constants/routes.constants'; - -interface SendAssetPopupProps { - asset: IotaObjectData; - onClose: () => void; -} - -export default function SendAssetPopup({ asset, onClose }: SendAssetPopupProps): JSX.Element { - const [recipientAddress, setRecipientAddress] = useState<string>(''); - const [errors, setErrors] = useState<string[]>([]); - const activeAddress = useCurrentAccount()?.address; - const router = useRouter(); - const { addNotification } = useNotifications(); - const { mutation: sendAsset } = useCreateSendAssetTransaction( - asset.objectId, - onSendAssetSuccess, - onSendAssetError, - ); - - const schema = createNftSendValidationSchema(activeAddress || '', asset.objectId); - - async function handleAddressChange(address: string): Promise<void> { - setRecipientAddress(address); - - try { - await schema.validate({ to: address }); - setErrors([]); - } catch (error) { - if (error instanceof ValidationError) { - setErrors(error.errors); - } - } - } - - function onSendAssetSuccess() { - addNotification('Transfer transaction successful', NotificationType.Success); - onClose?.(); - router.push(ASSETS_ROUTE.path + '/assets'); - } - - function onSendAssetError() { - addNotification('Transfer transaction failed', NotificationType.Error); - onClose?.(); - } - - const handleSendAsset = useCallback(async () => { - try { - await sendAsset.mutateAsync(recipientAddress); - } catch (error) { - addNotification('Transfer transaction failed', NotificationType.Error); - } - }, [recipientAddress, sendAsset, addNotification]); - - return ( - <div className="flex flex-col space-y-4"> - <VisualAssetTile asset={asset} flexDirection={FlexDirection.Column} /> - <div className="flex flex-col space-y-2"> - <Input - type="text" - value={recipientAddress} - placeholder="Enter Address" - onChange={(e) => handleAddressChange(e.target.value)} - label="Enter recipient address" - error={errors[0]} - /> - </div> - <Button onClick={handleSendAsset}>Send</Button> - <Button onClick={onClose}>Cancel</Button> - </div> - ); -} diff --git a/apps/wallet-dashboard/components/Popup/Popups/UnstakePopup.tsx b/apps/wallet-dashboard/components/Popup/Popups/UnstakePopup.tsx deleted file mode 100644 index 0518809fced..00000000000 --- a/apps/wallet-dashboard/components/Popup/Popups/UnstakePopup.tsx +++ /dev/null @@ -1,49 +0,0 @@ -// Copyright (c) 2024 IOTA Stiftung -// SPDX-License-Identifier: Apache-2.0 - -import React from 'react'; -import { Button } from '@/components'; -import { useUnstakeTransaction } from '@/hooks'; -import { useCurrentAccount, useSignAndExecuteTransaction } from '@iota/dapp-kit'; -import { ExtendedDelegatedStake } from '@iota/core'; - -interface UnstakePopupProps { - extendedStake: ExtendedDelegatedStake; - closePopup: () => void; -} - -function UnstakePopup({ extendedStake, closePopup }: UnstakePopupProps): JSX.Element { - const account = useCurrentAccount(); - const { data: unstakeData } = useUnstakeTransaction( - extendedStake.stakedIotaId, - account?.address || '', - ); - const { mutateAsync: signAndExecuteTransaction, isPending } = useSignAndExecuteTransaction(); - - async function handleUnstake(): Promise<void> { - if (!unstakeData) return; - await signAndExecuteTransaction({ - transaction: unstakeData.transaction, - }); - closePopup(); - } - - return ( - <div className="flex min-w-[300px] flex-col gap-2"> - <p>Stake ID: {extendedStake.stakedIotaId}</p> - <p>Validator: {extendedStake.validatorAddress}</p> - <p>Stake: {extendedStake.principal}</p> - {extendedStake.status === 'Active' && ( - <p>Estimated reward: {extendedStake.estimatedReward}</p> - )} - <p>Gas Fees: {unstakeData?.gasBudget?.toString() || '--'}</p> - {isPending ? ( - <Button disabled>Loading...</Button> - ) : ( - <Button onClick={handleUnstake}>Confirm Unstake</Button> - )} - </div> - ); -} - -export default UnstakePopup; diff --git a/apps/wallet-dashboard/components/Popup/Popups/VestingPopup/TimelockedUnstakePopup.tsx b/apps/wallet-dashboard/components/Popup/Popups/VestingPopup/TimelockedUnstakePopup.tsx deleted file mode 100644 index 9cfdc96f035..00000000000 --- a/apps/wallet-dashboard/components/Popup/Popups/VestingPopup/TimelockedUnstakePopup.tsx +++ /dev/null @@ -1,84 +0,0 @@ -// Copyright (c) 2024 IOTA Stiftung -// SPDX-License-Identifier: Apache-2.0 - -import React from 'react'; -import { Button } from '@/components'; -import { useNotifications, useTimelockedUnstakeTransaction } from '@/hooks'; -import { useSignAndExecuteTransaction } from '@iota/dapp-kit'; -import { IotaValidatorSummary } from '@iota/iota-sdk/client'; -import { NotificationType } from '@/stores/notificationStore'; -import { TimelockedStakedObjectsGrouped } from '@/lib/utils'; - -interface UnstakePopupProps { - accountAddress: string; - delegatedStake: TimelockedStakedObjectsGrouped; - validatorInfo: IotaValidatorSummary; - closePopup: () => void; - onSuccess?: (digest: string) => void; -} - -function TimelockedUnstakePopup({ - accountAddress, - delegatedStake, - validatorInfo, - closePopup, - onSuccess, -}: UnstakePopupProps): JSX.Element { - const objectIds = delegatedStake.stakes.map((stake) => stake.timelockedStakedIotaId); - const { data: timelockedUnstake } = useTimelockedUnstakeTransaction(objectIds, accountAddress); - const { mutateAsync: signAndExecuteTransaction, isPending } = useSignAndExecuteTransaction(); - const { addNotification } = useNotifications(); - - async function handleTimelockedUnstake(): Promise<void> { - if (!timelockedUnstake) return; - signAndExecuteTransaction( - { - transaction: timelockedUnstake.transaction, - }, - { - onSuccess: (tx) => { - if (onSuccess) { - onSuccess(tx.digest); - } - }, - }, - ) - .then(() => { - closePopup(); - addNotification('Unstake transaction has been sent'); - }) - .catch(() => { - addNotification('Unstake transaction was not sent', NotificationType.Error); - }); - } - - return ( - <div className="flex min-w-[300px] flex-col gap-2"> - <p>Validator Name: {validatorInfo.name}</p> - <p>Validator Address: {delegatedStake.validatorAddress}</p> - <p>Stake Request Epoch: {delegatedStake.stakeRequestEpoch}</p> - <p>Rewards: {validatorInfo.rewardsPool}</p> - <p>Total Stakes: {delegatedStake.stakes.length}</p> - {delegatedStake.stakes.map((stake, index) => { - return ( - <div key={stake.timelockedStakedIotaId} className="m-4 flex flex-col"> - <span> - Stake {index + 1}: {stake.timelockedStakedIotaId} - </span> - <span>Expiration time: {stake.expirationTimestampMs}</span> - <span>Label: {stake.label}</span> - <span>Status: {stake.status}</span> - </div> - ); - })} - <p>Gas Fees: {timelockedUnstake?.gasBudget?.toString() || '--'}</p> - {isPending ? ( - <Button disabled>Loading...</Button> - ) : ( - <Button onClick={handleTimelockedUnstake}>Confirm Unstake</Button> - )} - </div> - ); -} - -export default TimelockedUnstakePopup; diff --git a/apps/wallet-dashboard/components/Popup/Popups/VestingPopup/index.ts b/apps/wallet-dashboard/components/Popup/Popups/VestingPopup/index.ts deleted file mode 100644 index 2a8ca3b61df..00000000000 --- a/apps/wallet-dashboard/components/Popup/Popups/VestingPopup/index.ts +++ /dev/null @@ -1,4 +0,0 @@ -// Copyright (c) 2024 IOTA Stiftung -// SPDX-License-Identifier: Apache-2.0 - -export { default as TimelockedUnstakePopup } from './TimelockedUnstakePopup'; diff --git a/apps/wallet-dashboard/components/Popup/Popups/index.ts b/apps/wallet-dashboard/components/Popup/Popups/index.ts deleted file mode 100644 index ebdfc7f7391..00000000000 --- a/apps/wallet-dashboard/components/Popup/Popups/index.ts +++ /dev/null @@ -1,7 +0,0 @@ -// Copyright (c) 2024 IOTA Stiftung -// SPDX-License-Identifier: Apache-2.0 - -export { default as UnstakePopup } from './UnstakePopup'; -export { default as SendAssetPopup } from './SendAssetPopup'; - -export * from './VestingPopup'; diff --git a/apps/wallet-dashboard/components/Popup/index.ts b/apps/wallet-dashboard/components/Popup/index.ts index baeafee23a7..8acf67167f9 100644 --- a/apps/wallet-dashboard/components/Popup/index.ts +++ b/apps/wallet-dashboard/components/Popup/index.ts @@ -3,5 +3,3 @@ export { default as Popup } from './Popup'; export { default as PopupProvider } from './PopupProvider'; - -export * from './Popups'; diff --git a/apps/wallet-dashboard/components/StakeRewardsPanel.tsx b/apps/wallet-dashboard/components/StakeRewardsPanel.tsx new file mode 100644 index 00000000000..a7e5e84619c --- /dev/null +++ b/apps/wallet-dashboard/components/StakeRewardsPanel.tsx @@ -0,0 +1,70 @@ +// Copyright (c) 2024 IOTA Stiftung +// SPDX-License-Identifier: Apache-2.0 + +import { Divider, KeyValueInfo, Panel } from '@iota/apps-ui-kit'; +import { TimeUnit, useFormatCoin, useGetTimeBeforeEpochNumber, useTimeAgo } from '@iota/core'; +import { useIotaClientQuery } from '@iota/dapp-kit'; +import { IOTA_TYPE_ARG } from '@iota/iota-sdk/utils'; + +interface StakeRewardsPanelProps { + stakingRewards: string | number | undefined; + totalStaked: number | bigint; + isTimelocked?: boolean; +} +export function StakeRewardsPanel({ + stakingRewards, + totalStaked, + isTimelocked, +}: StakeRewardsPanelProps) { + const { epoch = '0' } = useIotaClientQuery('getLatestIotaSystemState')?.data || {}; + const [rewards, symbol] = useFormatCoin(stakingRewards ?? 0, IOTA_TYPE_ARG); + const [stakedBalance] = useFormatCoin(totalStaked, IOTA_TYPE_ARG); + const [stakedAndRewards] = useFormatCoin( + BigInt(stakingRewards || 0) + BigInt(totalStaked), + IOTA_TYPE_ARG, + ); + + const { data: currentEpochEndTime } = useGetTimeBeforeEpochNumber(Number(epoch) + 1); + const currentEpochEndTimeAgo = useTimeAgo({ + timeFrom: currentEpochEndTime, + endLabel: '--', + shortedTimeLabel: false, + shouldEnd: true, + maxTimeUnit: TimeUnit.ONE_HOUR, + }); + + const currentEpochEndTimeFormatted = + currentEpochEndTime > 0 ? currentEpochEndTimeAgo : `Epoch #${epoch}`; + + return ( + <Panel hasBorder> + <div className="flex flex-col gap-y-sm p-md"> + <KeyValueInfo + keyText="Current Epoch Ends" + value={currentEpochEndTimeFormatted} + fullwidth + /> + <Divider /> + <KeyValueInfo + keyText="Your Stake" + value={stakedBalance} + supportingLabel={symbol} + fullwidth + /> + <KeyValueInfo + keyText="Rewards Earned" + value={rewards} + supportingLabel={symbol} + fullwidth + /> + <Divider /> + <KeyValueInfo + keyText={'Total unstaked ' + (isTimelocked ? 'Timelocked' : 'IOTA')} + value={stakedAndRewards} + supportingLabel={symbol} + fullwidth + /> + </div> + </Panel> + ); +} diff --git a/apps/wallet-dashboard/components/index.ts b/apps/wallet-dashboard/components/index.ts index 1e655a49bdc..f85f12e1beb 100644 --- a/apps/wallet-dashboard/components/index.ts +++ b/apps/wallet-dashboard/components/index.ts @@ -26,5 +26,6 @@ export * from './tiles'; export * from './migration'; export * from './Toaster'; export * from './Banner'; +export * from './StakeRewardsPanel'; export * from './MigrationOverview'; export * from './staked-timelock-object'; diff --git a/apps/wallet-dashboard/components/staking-overview/StartStaking.tsx b/apps/wallet-dashboard/components/staking-overview/StartStaking.tsx index 828abc974ab..573a254a3d2 100644 --- a/apps/wallet-dashboard/components/staking-overview/StartStaking.tsx +++ b/apps/wallet-dashboard/components/staking-overview/StartStaking.tsx @@ -35,7 +35,6 @@ export function StartStaking() { {isDialogStakeOpen && stakeDialogView && ( <StakeDialog stakedDetails={selectedStake} - isOpen={isDialogStakeOpen} handleClose={handleCloseStakeDialog} view={stakeDialogView} setView={setStakeDialogView} diff --git a/apps/wallet-dashboard/components/staking-overview/index.ts b/apps/wallet-dashboard/components/staking-overview/index.ts index 88d8d1794ef..a2fdb941d58 100644 --- a/apps/wallet-dashboard/components/staking-overview/index.ts +++ b/apps/wallet-dashboard/components/staking-overview/index.ts @@ -2,3 +2,4 @@ // SPDX-License-Identifier: Apache-2.0 export * from './StakingOverview'; +export * from './StartStaking'; diff --git a/apps/wallet-dashboard/hooks/index.ts b/apps/wallet-dashboard/hooks/index.ts index f33eda9c3fc..2bb5d86ba7e 100644 --- a/apps/wallet-dashboard/hooks/index.ts +++ b/apps/wallet-dashboard/hooks/index.ts @@ -1,7 +1,7 @@ // Copyright (c) 2024 IOTA Stiftung // SPDX-License-Identifier: Apache-2.0 -export * from './useUnstakeTransaction'; +export * from './useNewUnstakeTransaction'; export * from './usePopups'; export * from './useNewStakeTransaction'; export * from './useNotifications'; diff --git a/apps/wallet-dashboard/hooks/useNewStakeTransaction.ts b/apps/wallet-dashboard/hooks/useNewStakeTransaction.ts index 7bd856cf77d..3e45ccd6144 100644 --- a/apps/wallet-dashboard/hooks/useNewStakeTransaction.ts +++ b/apps/wallet-dashboard/hooks/useNewStakeTransaction.ts @@ -9,26 +9,54 @@ import { import { useIotaClient } from '@iota/dapp-kit'; import { useQuery } from '@tanstack/react-query'; -export function useNewStakeTransaction( +export function useNewStakeTransaction(validator: string, amount: bigint, senderAddress: string) { + const client = useIotaClient(); + return useQuery({ + // eslint-disable-next-line @tanstack/query/exhaustive-deps + queryKey: ['stake-transaction', validator, amount.toString(), senderAddress], + queryFn: async () => { + const transaction = createStakeTransaction(amount, validator); + transaction.setSender(senderAddress); + await transaction.build({ client }); + return transaction; + }, + enabled: !!amount && !!validator && !!senderAddress, + gcTime: 0, + select: (transaction) => { + return { + transaction, + gasBudget: transaction.getData().gasData.budget, + }; + }, + }); +} + +export function useNewStakeTimelockedTransaction( validator: string, - amount: bigint, senderAddress: string, - isTimelockedStaking: boolean = false, - groupedTimelockObjects?: GroupedTimelockObject[], + groupedTimelockObjects: GroupedTimelockObject[], ) { + const amount = groupedTimelockObjects.reduce( + (acc, obj) => acc + (obj.totalLockedAmount - (obj.splitAmount ?? 0n)), + 0n, + ); const client = useIotaClient(); return useQuery({ // eslint-disable-next-line @tanstack/query/exhaustive-deps - queryKey: ['stake-transaction', validator, amount.toString(), senderAddress], + queryKey: [ + 'stake-timelocked-transaction', + validator, + senderAddress, + amount.toString(), + groupedTimelockObjects.length, + ], queryFn: async () => { - const transaction = isTimelockedStaking - ? createTimelockedStakeTransaction(groupedTimelockObjects || [], validator) - : createStakeTransaction(amount, validator); + const transaction = createTimelockedStakeTransaction(groupedTimelockObjects, validator); transaction.setSender(senderAddress); await transaction.build({ client }); return transaction; }, - enabled: !!amount && !!validator && !!senderAddress, + enabled: !!(validator && senderAddress && groupedTimelockObjects?.length), gcTime: 0, select: (transaction) => { return { diff --git a/apps/wallet-dashboard/hooks/useNewUnstakeTransaction.ts b/apps/wallet-dashboard/hooks/useNewUnstakeTransaction.ts new file mode 100644 index 00000000000..5704507f448 --- /dev/null +++ b/apps/wallet-dashboard/hooks/useNewUnstakeTransaction.ts @@ -0,0 +1,55 @@ +// Copyright (c) 2024 IOTA Stiftung +// SPDX-License-Identifier: Apache-2.0 + +import { createTimelockedUnstakeTransaction, createUnstakeTransaction } from '@iota/core'; +import { useIotaClient } from '@iota/dapp-kit'; +import { useQuery } from '@tanstack/react-query'; + +export function useNewUnstakeTransaction(senderAddress: string, unstakeIotaId: string) { + const client = useIotaClient(); + + return useQuery({ + // eslint-disable-next-line @tanstack/query/exhaustive-deps + queryKey: ['unstake-transaction', unstakeIotaId, senderAddress], + queryFn: async () => { + const transaction = createUnstakeTransaction(unstakeIotaId); + transaction.setSender(senderAddress); + await transaction.build({ client }); + return transaction; + }, + enabled: !!(senderAddress && unstakeIotaId), + gcTime: 0, + select: (transaction) => { + return { + transaction, + gasBudget: transaction.getData().gasData.budget, + }; + }, + }); +} + +export function useNewUnstakeTimelockedTransaction( + senderAddress: string, + timelockedUnstakeIotaIds: string[], +) { + const client = useIotaClient(); + + return useQuery({ + // eslint-disable-next-line @tanstack/query/exhaustive-deps + queryKey: ['timelocked-unstake-transaction', timelockedUnstakeIotaIds, senderAddress], + queryFn: async () => { + const transaction = createTimelockedUnstakeTransaction(timelockedUnstakeIotaIds); + transaction.setSender(senderAddress); + await transaction.build({ client }); + return transaction; + }, + enabled: !!(senderAddress && timelockedUnstakeIotaIds?.length), + gcTime: 0, + select: (transaction) => { + return { + transaction, + gasBudget: transaction.getData().gasData.budget, + }; + }, + }); +} diff --git a/apps/wallet-dashboard/hooks/useUnstakeTransaction.ts b/apps/wallet-dashboard/hooks/useUnstakeTransaction.ts deleted file mode 100644 index 9f8644eda4c..00000000000 --- a/apps/wallet-dashboard/hooks/useUnstakeTransaction.ts +++ /dev/null @@ -1,28 +0,0 @@ -// Copyright (c) 2024 IOTA Stiftung -// SPDX-License-Identifier: Apache-2.0 - -import { createUnstakeTransaction } from '@iota/core'; -import { useIotaClient } from '@iota/dapp-kit'; -import { useQuery } from '@tanstack/react-query'; - -export function useUnstakeTransaction(stakedIotaId: string, senderAddress: string) { - const client = useIotaClient(); - return useQuery({ - // eslint-disable-next-line @tanstack/query/exhaustive-deps - queryKey: ['unstake-transaction', stakedIotaId, senderAddress], - queryFn: async () => { - const transaction = createUnstakeTransaction(stakedIotaId); - transaction.setSender(senderAddress); - await transaction.build({ client }); - return transaction; - }, - enabled: !!stakedIotaId && !!senderAddress, - gcTime: 0, - select: (transaction) => { - return { - transaction, - gasBudget: transaction.getData().gasData.budget, - }; - }, - }); -} diff --git a/apps/wallet-dashboard/package.json b/apps/wallet-dashboard/package.json index 3cf781bca2f..dfa1df8a693 100644 --- a/apps/wallet-dashboard/package.json +++ b/apps/wallet-dashboard/package.json @@ -22,6 +22,7 @@ "@iota/dapp-kit": "workspace:*", "@iota/iota-sdk": "workspace:*", "@iota/ui-icons": "workspace:*", + "@iota/wallet-standard": "workspace:*", "@tanstack/react-query": "^5.50.1", "@tanstack/react-virtual": "^3.5.0", "clsx": "^2.1.1", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 6aba893215d..19bc39c4bca 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -60,13 +60,13 @@ importers: version: 9.1.0(eslint@8.57.1) eslint-import-resolver-typescript: specifier: ^3.6.1 - version: 3.6.3(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.6.2))(eslint-plugin-import@2.30.0)(eslint@8.57.1) + version: 3.6.3(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.30.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.6.2))(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.6.2))(eslint-plugin-import@2.30.0)(eslint@8.57.1))(eslint@8.57.1))(eslint@8.57.1) eslint-plugin-header: specifier: ^3.1.1 version: 3.1.1(eslint@8.57.1) eslint-plugin-import: specifier: ^2.29.1 - version: 2.30.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.6.2))(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.1) + version: 2.30.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.6.2))(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.6.2))(eslint-plugin-import@2.30.0)(eslint@8.57.1))(eslint@8.57.1) eslint-plugin-license-check: specifier: link:linting/license-check version: link:linting/license-check @@ -145,7 +145,7 @@ importers: devDependencies: '@nestjs/cli': specifier: ^10.0.0 - version: 10.4.5(@swc/core@1.7.28) + version: 10.4.5(@swc/core@1.7.28(@swc/helpers@0.5.5)) '@nestjs/schematics': specifier: ^10.0.0 version: 10.1.4(chokidar@3.6.0)(typescript@5.6.2) @@ -181,7 +181,7 @@ importers: version: 5.2.1(@types/eslint@8.56.12)(eslint-config-prettier@9.1.0(eslint@8.57.1))(eslint@8.57.1)(prettier@3.3.3) jest: specifier: ^29.5.0 - version: 29.7.0(@types/node@20.16.9)(babel-plugin-macros@3.1.0)(node-notifier@10.0.0)(ts-node@10.9.2(@types/node@20.16.9)(typescript@5.6.2)) + version: 29.7.0(@types/node@20.16.9)(babel-plugin-macros@3.1.0)(node-notifier@10.0.0)(ts-node@10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(typescript@5.6.2)) prettier: specifier: ^3.3.1 version: 3.3.3 @@ -193,13 +193,13 @@ importers: version: 6.3.4 ts-jest: specifier: ^29.1.0 - version: 29.2.5(@babel/core@7.25.2)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.25.2))(jest@29.7.0(@types/node@20.16.9)(babel-plugin-macros@3.1.0)(node-notifier@10.0.0)(ts-node@10.9.2(@types/node@20.16.9)(typescript@5.6.2)))(typescript@5.6.2) + version: 29.2.5(@babel/core@7.25.2)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.25.2))(jest@29.7.0(@types/node@20.16.9)(babel-plugin-macros@3.1.0)(node-notifier@10.0.0)(ts-node@10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(typescript@5.6.2)))(typescript@5.6.2) ts-loader: specifier: ^9.4.4 - version: 9.5.1(typescript@5.6.2)(webpack@5.95.0(@swc/core@1.7.28)) + version: 9.5.1(typescript@5.6.2)(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))) ts-node: specifier: ^10.9.1 - version: 10.9.2(@swc/core@1.7.28)(@types/node@20.16.9)(typescript@5.6.2) + version: 10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(typescript@5.6.2) tsconfig-paths: specifier: ^4.2.0 version: 4.2.0 @@ -278,13 +278,13 @@ importers: devDependencies: '@headlessui/tailwindcss': specifier: ^0.1.3 - version: 0.1.3(tailwindcss@3.4.13(ts-node@10.9.2(@types/node@22.7.3)(typescript@5.6.2))) + version: 0.1.3(tailwindcss@3.4.13(ts-node@10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@22.7.3)(typescript@5.6.2))) '@tailwindcss/aspect-ratio': specifier: ^0.4.2 - version: 0.4.2(tailwindcss@3.4.13(ts-node@10.9.2(@types/node@22.7.3)(typescript@5.6.2))) + version: 0.4.2(tailwindcss@3.4.13(ts-node@10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@22.7.3)(typescript@5.6.2))) '@tailwindcss/forms': specifier: ^0.5.7 - version: 0.5.9(tailwindcss@3.4.13(ts-node@10.9.2(@types/node@22.7.3)(typescript@5.6.2))) + version: 0.5.9(tailwindcss@3.4.13(ts-node@10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@22.7.3)(typescript@5.6.2))) '@types/react': specifier: ^18.3.3 version: 18.3.9 @@ -296,7 +296,7 @@ importers: version: 8.4.47 tailwindcss: specifier: ^3.3.3 - version: 3.4.13(ts-node@10.9.2(@types/node@22.7.3)(typescript@5.6.2)) + version: 3.4.13(ts-node@10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@22.7.3)(typescript@5.6.2)) typescript: specifier: ^5.5.3 version: 5.6.2 @@ -519,7 +519,7 @@ importers: version: 2.0.8 tailwindcss: specifier: ^3.3.3 - version: 3.4.13(ts-node@10.9.2(@swc/core@1.7.28)(@types/node@20.16.9)(typescript@5.6.2)) + version: 3.4.13(ts-node@10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(typescript@5.6.2)) tsconfig-paths: specifier: ^4.2.0 version: 4.2.0 @@ -646,7 +646,7 @@ importers: version: 4.0.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@7.6.20) tailwindcss: specifier: ^3.3.3 - version: 3.4.13(ts-node@10.9.2(@swc/core@1.7.28)(@types/node@20.16.9)(typescript@5.6.2)) + version: 3.4.13(ts-node@10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(typescript@5.6.2)) typescript: specifier: ^5.5.3 version: 5.6.2 @@ -911,7 +911,7 @@ importers: version: 0.10.7 '@types/webpack': specifier: ^5.28.1 - version: 5.28.5(@swc/core@1.7.28)(webpack-cli@5.1.4(webpack@5.95.0)) + version: 5.28.5(@swc/core@1.7.28(@swc/helpers@0.5.5))(webpack-cli@5.1.4(webpack@5.95.0)) '@types/zxcvbn': specifier: ^4.4.1 version: 4.4.5 @@ -920,19 +920,19 @@ importers: version: 4.3.1(vite@5.4.8(@types/node@20.16.9)(sass@1.79.3)(terser@5.34.0)) copy-webpack-plugin: specifier: ^11.0.0 - version: 11.0.0(webpack@5.95.0(@swc/core@1.7.28)(webpack-cli@5.1.4)) + version: 11.0.0(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(webpack-cli@5.1.4)) cross-env: specifier: ^7.0.3 version: 7.0.3 css-loader: specifier: ^6.7.3 - version: 6.11.0(webpack@5.95.0(@swc/core@1.7.28)(webpack-cli@5.1.4)) + version: 6.11.0(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(webpack-cli@5.1.4)) dotenv: specifier: ^16.4.5 version: 16.4.5 eslint-webpack-plugin: specifier: ^4.0.1 - version: 4.2.0(eslint@8.57.1)(webpack@5.95.0(@swc/core@1.7.28)(webpack-cli@5.1.4)) + version: 4.2.0(eslint@8.57.1)(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(webpack-cli@5.1.4)) git-rev-sync: specifier: ^3.0.2 version: 3.0.2 @@ -941,10 +941,10 @@ importers: version: 15.11.7 html-webpack-plugin: specifier: ^5.5.3 - version: 5.6.0(webpack@5.95.0(@swc/core@1.7.28)(webpack-cli@5.1.4)) + version: 5.6.0(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(webpack-cli@5.1.4)) mini-css-extract-plugin: specifier: ^2.7.6 - version: 2.9.1(webpack@5.95.0(@swc/core@1.7.28)(webpack-cli@5.1.4)) + version: 2.9.1(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(webpack-cli@5.1.4)) onchange: specifier: ^7.1.0 version: 7.1.0 @@ -953,7 +953,7 @@ importers: version: 8.4.47 postcss-loader: specifier: ^7.3.3 - version: 7.3.4(postcss@8.4.47)(typescript@5.6.2)(webpack@5.95.0(@swc/core@1.7.28)(webpack-cli@5.1.4)) + version: 7.3.4(postcss@8.4.47)(typescript@5.6.2)(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(webpack-cli@5.1.4)) postcss-preset-env: specifier: ^9.0.0 version: 9.6.0(postcss@8.4.47) @@ -962,19 +962,19 @@ importers: version: 1.79.3 sass-loader: specifier: ^13.3.2 - version: 13.3.3(sass@1.79.3)(webpack@5.95.0(@swc/core@1.7.28)(webpack-cli@5.1.4)) + version: 13.3.3(sass@1.79.3)(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(webpack-cli@5.1.4)) tailwindcss: specifier: ^3.3.3 - version: 3.4.13(ts-node@10.9.2(@swc/core@1.7.28)(@types/node@20.16.9)(typescript@5.6.2)) + version: 3.4.13(ts-node@10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(typescript@5.6.2)) tailwindcss-animate: specifier: ^1.0.7 - version: 1.0.7(tailwindcss@3.4.13(ts-node@10.9.2(@swc/core@1.7.28)(@types/node@20.16.9)(typescript@5.6.2))) + version: 1.0.7(tailwindcss@3.4.13(ts-node@10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(typescript@5.6.2))) ts-loader: specifier: ^9.4.4 - version: 9.5.1(typescript@5.6.2)(webpack@5.95.0(@swc/core@1.7.28)(webpack-cli@5.1.4)) + version: 9.5.1(typescript@5.6.2)(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(webpack-cli@5.1.4)) ts-node: specifier: ^10.9.1 - version: 10.9.2(@swc/core@1.7.28)(@types/node@20.16.9)(typescript@5.6.2) + version: 10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(typescript@5.6.2) tsconfig-paths: specifier: ^4.2.0 version: 4.2.0 @@ -995,7 +995,7 @@ importers: version: 7.12.0(body-parser@1.20.3) webpack: specifier: ^5.79.0 - version: 5.95.0(@swc/core@1.7.28)(webpack-cli@5.1.4) + version: 5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(webpack-cli@5.1.4) webpack-cli: specifier: ^5.0.1 version: 5.1.4(webpack@5.95.0) @@ -1026,6 +1026,9 @@ importers: '@iota/ui-icons': specifier: workspace:* version: link:../ui-icons + '@iota/wallet-standard': + specifier: workspace:* + version: link:../../sdk/wallet-standard '@tanstack/react-query': specifier: ^5.50.1 version: 5.56.2(react@18.3.1) @@ -1068,16 +1071,16 @@ importers: version: 14.2.3(eslint@8.57.1)(typescript@5.6.2) jest: specifier: ^29.5.0 - version: 29.7.0(@types/node@20.16.9)(babel-plugin-macros@3.1.0)(node-notifier@10.0.0)(ts-node@10.9.2(@types/node@20.16.9)(typescript@5.6.2)) + version: 29.7.0(@types/node@20.16.9)(babel-plugin-macros@3.1.0)(node-notifier@10.0.0)(ts-node@10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(typescript@5.6.2)) postcss: specifier: ^8.4.31 version: 8.4.47 tailwindcss: specifier: ^3.3.3 - version: 3.4.13(ts-node@10.9.2(@swc/core@1.7.28)(@types/node@20.16.9)(typescript@5.6.2)) + version: 3.4.13(ts-node@10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(typescript@5.6.2)) ts-jest: specifier: ^29.1.0 - version: 29.2.5(@babel/core@7.25.2)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.25.2))(jest@29.7.0(@types/node@20.16.9)(babel-plugin-macros@3.1.0)(node-notifier@10.0.0)(ts-node@10.9.2(@types/node@20.16.9)(typescript@5.6.2)))(typescript@5.6.2) + version: 29.2.5(@babel/core@7.25.2)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.25.2))(jest@29.7.0(@types/node@20.16.9)(babel-plugin-macros@3.1.0)(node-notifier@10.0.0)(ts-node@10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(typescript@5.6.2)))(typescript@5.6.2) typescript: specifier: ^5.5.3 version: 5.6.2 @@ -1117,7 +1120,7 @@ importers: devDependencies: '@headlessui/tailwindcss': specifier: ^0.1.3 - version: 0.1.3(tailwindcss@3.4.13(ts-node@10.9.2(@types/node@22.7.3)(typescript@5.6.2))) + version: 0.1.3(tailwindcss@3.4.13(ts-node@10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@22.7.3)(typescript@5.6.2))) '@types/react': specifier: ^18.3.3 version: 18.3.9 @@ -1135,7 +1138,7 @@ importers: version: 8.4.47 tailwindcss: specifier: ^3.3.3 - version: 3.4.13(ts-node@10.9.2(@types/node@22.7.3)(typescript@5.6.2)) + version: 3.4.13(ts-node@10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@22.7.3)(typescript@5.6.2)) typescript: specifier: ^5.5.3 version: 5.6.2 @@ -1229,7 +1232,7 @@ importers: devDependencies: '@tailwindcss/forms': specifier: ^0.5.7 - version: 0.5.9(tailwindcss@3.4.13(ts-node@10.9.2(@types/node@22.7.3)(typescript@5.6.2))) + version: 0.5.9(tailwindcss@3.4.13(ts-node@10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@22.7.3)(typescript@5.6.2))) '@tsconfig/docusaurus': specifier: ^2.0.3 version: 2.0.3 @@ -1250,10 +1253,10 @@ importers: version: 8.4.47 tailwindcss: specifier: ^3.3.3 - version: 3.4.13(ts-node@10.9.2(@types/node@22.7.3)(typescript@5.6.2)) + version: 3.4.13(ts-node@10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@22.7.3)(typescript@5.6.2)) tailwindcss-animate: specifier: ^1.0.7 - version: 1.0.7(tailwindcss@3.4.13(ts-node@10.9.2(@types/node@22.7.3)(typescript@5.6.2))) + version: 1.0.7(tailwindcss@3.4.13(ts-node@10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@22.7.3)(typescript@5.6.2))) typescript: specifier: ^5.5.3 version: 5.6.2 @@ -1299,7 +1302,7 @@ importers: version: 8.4.47 tailwindcss: specifier: ^3.3.3 - version: 3.4.13(ts-node@10.9.2(@types/node@22.7.3)(typescript@5.6.2)) + version: 3.4.13(ts-node@10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@22.7.3)(typescript@5.6.2)) typescript: specifier: ^5.5.3 version: 5.6.2 @@ -1320,25 +1323,25 @@ importers: version: 3.6.1(@algolia/client-search@4.24.0)(@types/react@18.3.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@docusaurus/core': specifier: 3.5.2 - version: 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) + version: 3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) '@docusaurus/preset-classic': specifier: 3.5.2 - version: 3.5.2(@algolia/client-search@4.24.0)(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@types/react@18.3.9)(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) + version: 3.5.2(@algolia/client-search@4.24.0)(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/react@18.3.9)(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) '@docusaurus/remark-plugin-npm2yarn': specifier: ^3.5.2 version: 3.5.2 '@docusaurus/theme-common': specifier: ^3.5.2 - version: 3.5.2(@docusaurus/plugin-content-docs@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16))(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2) + version: 3.5.2(@docusaurus/plugin-content-docs@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16))(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2) '@docusaurus/theme-live-codeblock': specifier: ^3.5.2 - version: 3.5.2(@docusaurus/plugin-content-docs@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16))(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) + version: 3.5.2(@docusaurus/plugin-content-docs@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16))(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) '@docusaurus/theme-mermaid': specifier: ^3.5.2 - version: 3.5.2(@docusaurus/plugin-content-docs@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) + version: 3.5.2(@docusaurus/plugin-content-docs@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) '@docusaurus/theme-search-algolia': specifier: ^3.5.2 - version: 3.5.2(@algolia/client-search@4.24.0)(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@types/react@18.3.9)(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) + version: 3.5.2(@algolia/client-search@4.24.0)(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/react@18.3.9)(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) '@emotion/react': specifier: ^11.11.4 version: 11.13.3(@types/react@18.3.9)(react@18.3.1) @@ -1347,7 +1350,7 @@ importers: version: 11.13.0(@emotion/react@11.13.3(@types/react@18.3.9)(react@18.3.1))(@types/react@18.3.9)(react@18.3.1) '@graphql-markdown/docusaurus': specifier: ^1.24.1 - version: 1.26.2(@docusaurus/logger@3.5.2)(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(graphql-config@5.1.2(@types/node@22.7.3)(graphql@16.9.0)(typescript@5.6.2))(graphql@16.9.0)(prettier@3.3.3)(typescript@5.6.2) + version: 1.26.2(@docusaurus/logger@3.5.2)(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(graphql-config@5.1.2(@types/node@22.7.3)(graphql@16.9.0)(typescript@5.6.2))(graphql@16.9.0)(prettier@3.3.3)(typescript@5.6.2) '@graphql-tools/graphql-file-loader': specifier: ^8.0.1 version: 8.0.1(graphql@16.9.0) @@ -1383,7 +1386,7 @@ importers: version: 3.2.0 docusaurus-theme-search-typesense: specifier: 0.20.0-0 - version: 0.20.0-0(@algolia/client-search@4.24.0)(@babel/runtime@7.25.6)(@docusaurus/core@3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16))(@docusaurus/theme-common@3.5.2(@docusaurus/plugin-content-docs@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16))(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2))(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/react@18.3.9)(algoliasearch@4.24.0)(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) + version: 0.20.0-0(iea5eyhbiud2dlcqtud2g4pxzm) dotenv: specifier: ^16.4.5 version: 16.4.5 @@ -1446,7 +1449,7 @@ importers: version: 6.0.0 tailwindcss: specifier: ^3.3.3 - version: 3.4.13(ts-node@10.9.2(@types/node@22.7.3)(typescript@5.6.2)) + version: 3.4.13(ts-node@10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@22.7.3)(typescript@5.6.2)) web3: specifier: ^4.2.2 version: 4.13.0(typescript@5.6.2)(zod@3.23.8) @@ -1456,13 +1459,13 @@ importers: version: 7.25.2(@babel/core@7.25.2) '@docusaurus/module-type-aliases': specifier: 3.5.2 - version: 3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@docusaurus/tsconfig': specifier: 3.5.2 version: 3.5.2 '@docusaurus/types': specifier: 3.5.2 - version: 3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@metamask/providers': specifier: ^10.2.1 version: 10.2.1 @@ -2040,7 +2043,7 @@ importers: version: 5.6.2 typescript-json-schema: specifier: ^0.64.0 - version: 0.64.0(@swc/core@1.7.28) + version: 0.64.0(@swc/core@1.7.28(@swc/helpers@0.5.5)) packages: @@ -18518,7 +18521,7 @@ snapshots: transitivePeerDependencies: - '@algolia/client-search' - '@docusaurus/core@3.4.0(@docusaurus/types@3.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16)': + '@docusaurus/core@3.4.0(@docusaurus/types@3.4.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16)': dependencies: '@babel/core': 7.25.2 '@babel/generator': 7.25.6 @@ -18532,12 +18535,12 @@ snapshots: '@babel/traverse': 7.25.6 '@docusaurus/cssnano-preset': 3.4.0 '@docusaurus/logger': 3.4.0 - '@docusaurus/mdx-loader': 3.4.0(@docusaurus/types@3.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2) - '@docusaurus/utils': 3.4.0(@docusaurus/types@3.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.6.2) - '@docusaurus/utils-common': 3.4.0(@docusaurus/types@3.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) - '@docusaurus/utils-validation': 3.4.0(@docusaurus/types@3.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.6.2) + '@docusaurus/mdx-loader': 3.4.0(@docusaurus/types@3.4.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2) + '@docusaurus/utils': 3.4.0(@docusaurus/types@3.4.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(typescript@5.6.2) + '@docusaurus/utils-common': 3.4.0(@docusaurus/types@3.4.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + '@docusaurus/utils-validation': 3.4.0(@docusaurus/types@3.4.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(typescript@5.6.2) autoprefixer: 10.4.20(postcss@8.4.47) - babel-loader: 9.2.1(@babel/core@7.25.2)(webpack@5.95.0) + babel-loader: 9.2.1(@babel/core@7.25.2)(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))) babel-plugin-dynamic-import-node: 2.3.3 boxen: 6.2.1 chalk: 4.1.2 @@ -18546,34 +18549,34 @@ snapshots: cli-table3: 0.6.5 combine-promises: 1.2.0 commander: 5.1.0 - copy-webpack-plugin: 11.0.0(webpack@5.95.0) + copy-webpack-plugin: 11.0.0(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))) core-js: 3.38.1 - css-loader: 6.11.0(webpack@5.95.0) - css-minimizer-webpack-plugin: 5.0.1(clean-css@5.3.3)(webpack@5.95.0) + css-loader: 6.11.0(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))) + css-minimizer-webpack-plugin: 5.0.1(clean-css@5.3.3)(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))) cssnano: 6.1.2(postcss@8.4.47) del: 6.1.1 detect-port: 1.6.1 escape-html: 1.0.3 eta: 2.2.0 eval: 0.1.8 - file-loader: 6.2.0(webpack@5.95.0) + file-loader: 6.2.0(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))) fs-extra: 11.2.0 html-minifier-terser: 7.2.0 html-tags: 3.3.1 - html-webpack-plugin: 5.6.0(webpack@5.95.0) + html-webpack-plugin: 5.6.0(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))) leven: 3.1.0 lodash: 4.17.21 - mini-css-extract-plugin: 2.9.1(webpack@5.95.0) + mini-css-extract-plugin: 2.9.1(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))) p-map: 4.0.0 postcss: 8.4.47 - postcss-loader: 7.3.4(postcss@8.4.47)(typescript@5.6.2)(webpack@5.95.0) + postcss-loader: 7.3.4(postcss@8.4.47)(typescript@5.6.2)(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))) prompts: 2.4.2 react: 18.3.1 - react-dev-utils: 12.0.1(eslint@8.57.1)(typescript@5.6.2)(vue-template-compiler@2.7.16)(webpack@5.95.0) + react-dev-utils: 12.0.1(eslint@8.57.1)(typescript@5.6.2)(vue-template-compiler@2.7.16)(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))) react-dom: 18.3.1(react@18.3.1) react-helmet-async: 1.3.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react-loadable: '@docusaurus/react-loadable@6.0.0(react@18.3.1)' - react-loadable-ssr-addon-v5-slorber: 1.0.1(@docusaurus/react-loadable@6.0.0(react@18.3.1))(webpack@5.95.0) + react-loadable-ssr-addon-v5-slorber: 1.0.1(@docusaurus/react-loadable@6.0.0(react@18.3.1))(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))) react-router: 5.3.4(react@18.3.1) react-router-config: 5.1.1(react-router@5.3.4(react@18.3.1))(react@18.3.1) react-router-dom: 5.3.4(react@18.3.1) @@ -18581,15 +18584,15 @@ snapshots: semver: 7.6.3 serve-handler: 6.1.5 shelljs: 0.8.5 - terser-webpack-plugin: 5.3.10(webpack@5.95.0) + terser-webpack-plugin: 5.3.10(@swc/core@1.7.28(@swc/helpers@0.5.5))(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))) tslib: 2.7.0 update-notifier: 6.0.2 - url-loader: 4.1.1(file-loader@6.2.0(webpack@5.95.0))(webpack@5.95.0) - webpack: 5.95.0 + url-loader: 4.1.1(file-loader@6.2.0(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))))(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))) + webpack: 5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5)) webpack-bundle-analyzer: 4.10.2 - webpack-dev-server: 4.15.2(webpack@5.95.0) + webpack-dev-server: 4.15.2(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))) webpack-merge: 5.10.0 - webpackbar: 5.0.2(webpack@5.95.0) + webpackbar: 5.0.2(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))) transitivePeerDependencies: - '@docusaurus/types' - '@parcel/css' @@ -18609,7 +18612,7 @@ snapshots: - vue-template-compiler - webpack-cli - '@docusaurus/core@3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16)': + '@docusaurus/core@3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16)': dependencies: '@babel/core': 7.25.2 '@babel/generator': 7.25.6 @@ -18623,13 +18626,13 @@ snapshots: '@babel/traverse': 7.25.6 '@docusaurus/cssnano-preset': 3.5.2 '@docusaurus/logger': 3.5.2 - '@docusaurus/mdx-loader': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2) - '@docusaurus/utils': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.6.2) - '@docusaurus/utils-common': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) - '@docusaurus/utils-validation': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.6.2) + '@docusaurus/mdx-loader': 3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2) + '@docusaurus/utils': 3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(typescript@5.6.2) + '@docusaurus/utils-common': 3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + '@docusaurus/utils-validation': 3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(typescript@5.6.2) '@mdx-js/react': 3.0.1(@types/react@18.3.9)(react@18.3.1) autoprefixer: 10.4.20(postcss@8.4.47) - babel-loader: 9.2.1(@babel/core@7.25.2)(webpack@5.95.0) + babel-loader: 9.2.1(@babel/core@7.25.2)(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))) babel-plugin-dynamic-import-node: 2.3.3 boxen: 6.2.1 chalk: 4.1.2 @@ -18638,34 +18641,34 @@ snapshots: cli-table3: 0.6.5 combine-promises: 1.2.0 commander: 5.1.0 - copy-webpack-plugin: 11.0.0(webpack@5.95.0) + copy-webpack-plugin: 11.0.0(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))) core-js: 3.38.1 - css-loader: 6.11.0(webpack@5.95.0) - css-minimizer-webpack-plugin: 5.0.1(clean-css@5.3.3)(webpack@5.95.0) + css-loader: 6.11.0(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))) + css-minimizer-webpack-plugin: 5.0.1(clean-css@5.3.3)(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))) cssnano: 6.1.2(postcss@8.4.47) del: 6.1.1 detect-port: 1.6.1 escape-html: 1.0.3 eta: 2.2.0 eval: 0.1.8 - file-loader: 6.2.0(webpack@5.95.0) + file-loader: 6.2.0(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))) fs-extra: 11.2.0 html-minifier-terser: 7.2.0 html-tags: 3.3.1 - html-webpack-plugin: 5.6.0(webpack@5.95.0) + html-webpack-plugin: 5.6.0(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))) leven: 3.1.0 lodash: 4.17.21 - mini-css-extract-plugin: 2.9.1(webpack@5.95.0) + mini-css-extract-plugin: 2.9.1(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))) p-map: 4.0.0 postcss: 8.4.47 - postcss-loader: 7.3.4(postcss@8.4.47)(typescript@5.6.2)(webpack@5.95.0) + postcss-loader: 7.3.4(postcss@8.4.47)(typescript@5.6.2)(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))) prompts: 2.4.2 react: 18.3.1 - react-dev-utils: 12.0.1(eslint@8.57.1)(typescript@5.6.2)(vue-template-compiler@2.7.16)(webpack@5.95.0) + react-dev-utils: 12.0.1(eslint@8.57.1)(typescript@5.6.2)(vue-template-compiler@2.7.16)(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))) react-dom: 18.3.1(react@18.3.1) react-helmet-async: 1.3.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react-loadable: '@docusaurus/react-loadable@6.0.0(react@18.3.1)' - react-loadable-ssr-addon-v5-slorber: 1.0.1(@docusaurus/react-loadable@6.0.0(react@18.3.1))(webpack@5.95.0) + react-loadable-ssr-addon-v5-slorber: 1.0.1(@docusaurus/react-loadable@6.0.0(react@18.3.1))(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))) react-router: 5.3.4(react@18.3.1) react-router-config: 5.1.1(react-router@5.3.4(react@18.3.1))(react@18.3.1) react-router-dom: 5.3.4(react@18.3.1) @@ -18673,15 +18676,15 @@ snapshots: semver: 7.6.3 serve-handler: 6.1.5 shelljs: 0.8.5 - terser-webpack-plugin: 5.3.10(webpack@5.95.0) + terser-webpack-plugin: 5.3.10(@swc/core@1.7.28(@swc/helpers@0.5.5))(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))) tslib: 2.7.0 update-notifier: 6.0.2 - url-loader: 4.1.1(file-loader@6.2.0(webpack@5.95.0))(webpack@5.95.0) - webpack: 5.95.0 + url-loader: 4.1.1(file-loader@6.2.0(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))))(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))) + webpack: 5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5)) webpack-bundle-analyzer: 4.10.2 - webpack-dev-server: 4.15.2(webpack@5.95.0) + webpack-dev-server: 4.15.2(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))) webpack-merge: 5.10.0 - webpackbar: 5.0.2(webpack@5.95.0) + webpackbar: 5.0.2(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))) transitivePeerDependencies: - '@docusaurus/types' - '@parcel/css' @@ -18725,16 +18728,16 @@ snapshots: chalk: 4.1.2 tslib: 2.7.0 - '@docusaurus/mdx-loader@3.4.0(@docusaurus/types@3.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)': + '@docusaurus/mdx-loader@3.4.0(@docusaurus/types@3.4.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)': dependencies: '@docusaurus/logger': 3.4.0 - '@docusaurus/utils': 3.4.0(@docusaurus/types@3.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.6.2) - '@docusaurus/utils-validation': 3.4.0(@docusaurus/types@3.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.6.2) + '@docusaurus/utils': 3.4.0(@docusaurus/types@3.4.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(typescript@5.6.2) + '@docusaurus/utils-validation': 3.4.0(@docusaurus/types@3.4.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(typescript@5.6.2) '@mdx-js/mdx': 3.0.1 '@slorber/remark-comment': 1.0.0 escape-html: 1.0.3 estree-util-value-to-estree: 3.1.2 - file-loader: 6.2.0(webpack@5.95.0) + file-loader: 6.2.0(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))) fs-extra: 11.2.0 image-size: 1.1.1 mdast-util-mdx: 3.0.0 @@ -18750,9 +18753,9 @@ snapshots: tslib: 2.7.0 unified: 11.0.5 unist-util-visit: 5.0.0 - url-loader: 4.1.1(file-loader@6.2.0(webpack@5.95.0))(webpack@5.95.0) + url-loader: 4.1.1(file-loader@6.2.0(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))))(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))) vfile: 6.0.3 - webpack: 5.95.0 + webpack: 5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5)) transitivePeerDependencies: - '@docusaurus/types' - '@swc/core' @@ -18762,16 +18765,16 @@ snapshots: - uglify-js - webpack-cli - '@docusaurus/mdx-loader@3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)': + '@docusaurus/mdx-loader@3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)': dependencies: '@docusaurus/logger': 3.5.2 - '@docusaurus/utils': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.6.2) - '@docusaurus/utils-validation': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.6.2) + '@docusaurus/utils': 3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(typescript@5.6.2) + '@docusaurus/utils-validation': 3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(typescript@5.6.2) '@mdx-js/mdx': 3.0.1 '@slorber/remark-comment': 1.0.0 escape-html: 1.0.3 estree-util-value-to-estree: 3.1.2 - file-loader: 6.2.0(webpack@5.95.0) + file-loader: 6.2.0(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))) fs-extra: 11.2.0 image-size: 1.1.1 mdast-util-mdx: 3.0.0 @@ -18787,9 +18790,9 @@ snapshots: tslib: 2.7.0 unified: 11.0.5 unist-util-visit: 5.0.0 - url-loader: 4.1.1(file-loader@6.2.0(webpack@5.95.0))(webpack@5.95.0) + url-loader: 4.1.1(file-loader@6.2.0(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))))(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))) vfile: 6.0.3 - webpack: 5.95.0 + webpack: 5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5)) transitivePeerDependencies: - '@docusaurus/types' - '@swc/core' @@ -18799,9 +18802,9 @@ snapshots: - uglify-js - webpack-cli - '@docusaurus/module-type-aliases@3.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@docusaurus/module-type-aliases@3.4.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@docusaurus/types': 3.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@docusaurus/types': 3.4.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@types/history': 4.7.11 '@types/react': 18.3.9 '@types/react-router-config': 5.0.11 @@ -18817,9 +18820,9 @@ snapshots: - uglify-js - webpack-cli - '@docusaurus/module-type-aliases@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@docusaurus/module-type-aliases@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@docusaurus/types': 3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@docusaurus/types': 3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@types/history': 4.7.11 '@types/react': 18.3.9 '@types/react-router-config': 5.0.11 @@ -18835,17 +18838,17 @@ snapshots: - uglify-js - webpack-cli - '@docusaurus/plugin-content-blog@3.5.2(@docusaurus/plugin-content-docs@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16)': + '@docusaurus/plugin-content-blog@3.5.2(@docusaurus/plugin-content-docs@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16)': dependencies: - '@docusaurus/core': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) + '@docusaurus/core': 3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) '@docusaurus/logger': 3.5.2 - '@docusaurus/mdx-loader': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2) - '@docusaurus/plugin-content-docs': 3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) - '@docusaurus/theme-common': 3.5.2(@docusaurus/plugin-content-docs@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16))(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2) - '@docusaurus/types': 3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@docusaurus/utils': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.6.2) - '@docusaurus/utils-common': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) - '@docusaurus/utils-validation': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.6.2) + '@docusaurus/mdx-loader': 3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2) + '@docusaurus/plugin-content-docs': 3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) + '@docusaurus/theme-common': 3.5.2(@docusaurus/plugin-content-docs@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16))(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2) + '@docusaurus/types': 3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@docusaurus/utils': 3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(typescript@5.6.2) + '@docusaurus/utils-common': 3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + '@docusaurus/utils-validation': 3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(typescript@5.6.2) cheerio: 1.0.0-rc.12 feed: 4.2.2 fs-extra: 11.2.0 @@ -18857,7 +18860,7 @@ snapshots: tslib: 2.7.0 unist-util-visit: 5.0.0 utility-types: 3.11.0 - webpack: 5.95.0 + webpack: 5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5)) transitivePeerDependencies: - '@mdx-js/react' - '@parcel/css' @@ -18877,16 +18880,16 @@ snapshots: - vue-template-compiler - webpack-cli - '@docusaurus/plugin-content-docs@3.4.0(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16)': + '@docusaurus/plugin-content-docs@3.4.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16)': dependencies: - '@docusaurus/core': 3.4.0(@docusaurus/types@3.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) + '@docusaurus/core': 3.4.0(@docusaurus/types@3.4.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) '@docusaurus/logger': 3.4.0 - '@docusaurus/mdx-loader': 3.4.0(@docusaurus/types@3.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2) - '@docusaurus/module-type-aliases': 3.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@docusaurus/types': 3.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@docusaurus/utils': 3.4.0(@docusaurus/types@3.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.6.2) - '@docusaurus/utils-common': 3.4.0(@docusaurus/types@3.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) - '@docusaurus/utils-validation': 3.4.0(@docusaurus/types@3.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.6.2) + '@docusaurus/mdx-loader': 3.4.0(@docusaurus/types@3.4.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2) + '@docusaurus/module-type-aliases': 3.4.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@docusaurus/types': 3.4.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@docusaurus/utils': 3.4.0(@docusaurus/types@3.4.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(typescript@5.6.2) + '@docusaurus/utils-common': 3.4.0(@docusaurus/types@3.4.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + '@docusaurus/utils-validation': 3.4.0(@docusaurus/types@3.4.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(typescript@5.6.2) '@types/react-router-config': 5.0.11 combine-promises: 1.2.0 fs-extra: 11.2.0 @@ -18896,7 +18899,7 @@ snapshots: react-dom: 18.3.1(react@18.3.1) tslib: 2.7.0 utility-types: 3.11.0 - webpack: 5.95.0 + webpack: 5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5)) transitivePeerDependencies: - '@parcel/css' - '@rspack/core' @@ -18915,17 +18918,17 @@ snapshots: - vue-template-compiler - webpack-cli - '@docusaurus/plugin-content-docs@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16)': + '@docusaurus/plugin-content-docs@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16)': dependencies: - '@docusaurus/core': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) + '@docusaurus/core': 3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) '@docusaurus/logger': 3.5.2 - '@docusaurus/mdx-loader': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2) - '@docusaurus/module-type-aliases': 3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@docusaurus/theme-common': 3.5.2(@docusaurus/plugin-content-docs@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16))(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2) - '@docusaurus/types': 3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@docusaurus/utils': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.6.2) - '@docusaurus/utils-common': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) - '@docusaurus/utils-validation': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.6.2) + '@docusaurus/mdx-loader': 3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2) + '@docusaurus/module-type-aliases': 3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@docusaurus/theme-common': 3.5.2(@docusaurus/plugin-content-docs@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16))(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2) + '@docusaurus/types': 3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@docusaurus/utils': 3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(typescript@5.6.2) + '@docusaurus/utils-common': 3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + '@docusaurus/utils-validation': 3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(typescript@5.6.2) '@types/react-router-config': 5.0.11 combine-promises: 1.2.0 fs-extra: 11.2.0 @@ -18935,7 +18938,7 @@ snapshots: react-dom: 18.3.1(react@18.3.1) tslib: 2.7.0 utility-types: 3.11.0 - webpack: 5.95.0 + webpack: 5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5)) transitivePeerDependencies: - '@mdx-js/react' - '@parcel/css' @@ -18955,18 +18958,18 @@ snapshots: - vue-template-compiler - webpack-cli - '@docusaurus/plugin-content-pages@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16)': + '@docusaurus/plugin-content-pages@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16)': dependencies: - '@docusaurus/core': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) - '@docusaurus/mdx-loader': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2) - '@docusaurus/types': 3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@docusaurus/utils': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.6.2) - '@docusaurus/utils-validation': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.6.2) + '@docusaurus/core': 3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) + '@docusaurus/mdx-loader': 3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2) + '@docusaurus/types': 3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@docusaurus/utils': 3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(typescript@5.6.2) + '@docusaurus/utils-validation': 3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(typescript@5.6.2) fs-extra: 11.2.0 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) tslib: 2.7.0 - webpack: 5.95.0 + webpack: 5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5)) transitivePeerDependencies: - '@mdx-js/react' - '@parcel/css' @@ -18986,11 +18989,11 @@ snapshots: - vue-template-compiler - webpack-cli - '@docusaurus/plugin-debug@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16)': + '@docusaurus/plugin-debug@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16)': dependencies: - '@docusaurus/core': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) - '@docusaurus/types': 3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@docusaurus/utils': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.6.2) + '@docusaurus/core': 3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) + '@docusaurus/types': 3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@docusaurus/utils': 3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(typescript@5.6.2) fs-extra: 11.2.0 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) @@ -19015,11 +19018,11 @@ snapshots: - vue-template-compiler - webpack-cli - '@docusaurus/plugin-google-analytics@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16)': + '@docusaurus/plugin-google-analytics@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16)': dependencies: - '@docusaurus/core': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) - '@docusaurus/types': 3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@docusaurus/utils-validation': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.6.2) + '@docusaurus/core': 3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) + '@docusaurus/types': 3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@docusaurus/utils-validation': 3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(typescript@5.6.2) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) tslib: 2.7.0 @@ -19042,11 +19045,11 @@ snapshots: - vue-template-compiler - webpack-cli - '@docusaurus/plugin-google-gtag@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16)': + '@docusaurus/plugin-google-gtag@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16)': dependencies: - '@docusaurus/core': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) - '@docusaurus/types': 3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@docusaurus/utils-validation': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.6.2) + '@docusaurus/core': 3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) + '@docusaurus/types': 3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@docusaurus/utils-validation': 3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(typescript@5.6.2) '@types/gtag.js': 0.0.12 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) @@ -19070,11 +19073,11 @@ snapshots: - vue-template-compiler - webpack-cli - '@docusaurus/plugin-google-tag-manager@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16)': + '@docusaurus/plugin-google-tag-manager@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16)': dependencies: - '@docusaurus/core': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) - '@docusaurus/types': 3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@docusaurus/utils-validation': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.6.2) + '@docusaurus/core': 3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) + '@docusaurus/types': 3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@docusaurus/utils-validation': 3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(typescript@5.6.2) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) tslib: 2.7.0 @@ -19097,14 +19100,14 @@ snapshots: - vue-template-compiler - webpack-cli - '@docusaurus/plugin-sitemap@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16)': + '@docusaurus/plugin-sitemap@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16)': dependencies: - '@docusaurus/core': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) + '@docusaurus/core': 3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) '@docusaurus/logger': 3.5.2 - '@docusaurus/types': 3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@docusaurus/utils': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.6.2) - '@docusaurus/utils-common': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) - '@docusaurus/utils-validation': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.6.2) + '@docusaurus/types': 3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@docusaurus/utils': 3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(typescript@5.6.2) + '@docusaurus/utils-common': 3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + '@docusaurus/utils-validation': 3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(typescript@5.6.2) fs-extra: 11.2.0 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) @@ -19129,21 +19132,21 @@ snapshots: - vue-template-compiler - webpack-cli - '@docusaurus/preset-classic@3.5.2(@algolia/client-search@4.24.0)(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@types/react@18.3.9)(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16)': - dependencies: - '@docusaurus/core': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) - '@docusaurus/plugin-content-blog': 3.5.2(@docusaurus/plugin-content-docs@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) - '@docusaurus/plugin-content-docs': 3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) - '@docusaurus/plugin-content-pages': 3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) - '@docusaurus/plugin-debug': 3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) - '@docusaurus/plugin-google-analytics': 3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) - '@docusaurus/plugin-google-gtag': 3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) - '@docusaurus/plugin-google-tag-manager': 3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) - '@docusaurus/plugin-sitemap': 3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) - '@docusaurus/theme-classic': 3.5.2(@types/react@18.3.9)(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) - '@docusaurus/theme-common': 3.5.2(@docusaurus/plugin-content-docs@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16))(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2) - '@docusaurus/theme-search-algolia': 3.5.2(@algolia/client-search@4.24.0)(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@types/react@18.3.9)(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) - '@docusaurus/types': 3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@docusaurus/preset-classic@3.5.2(@algolia/client-search@4.24.0)(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/react@18.3.9)(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16)': + dependencies: + '@docusaurus/core': 3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) + '@docusaurus/plugin-content-blog': 3.5.2(@docusaurus/plugin-content-docs@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) + '@docusaurus/plugin-content-docs': 3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) + '@docusaurus/plugin-content-pages': 3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) + '@docusaurus/plugin-debug': 3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) + '@docusaurus/plugin-google-analytics': 3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) + '@docusaurus/plugin-google-gtag': 3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) + '@docusaurus/plugin-google-tag-manager': 3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) + '@docusaurus/plugin-sitemap': 3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) + '@docusaurus/theme-classic': 3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/react@18.3.9)(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) + '@docusaurus/theme-common': 3.5.2(@docusaurus/plugin-content-docs@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16))(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2) + '@docusaurus/theme-search-algolia': 3.5.2(@algolia/client-search@4.24.0)(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/react@18.3.9)(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) + '@docusaurus/types': 3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) transitivePeerDependencies: @@ -19183,20 +19186,20 @@ snapshots: transitivePeerDependencies: - supports-color - '@docusaurus/theme-classic@3.5.2(@types/react@18.3.9)(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16)': + '@docusaurus/theme-classic@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/react@18.3.9)(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16)': dependencies: - '@docusaurus/core': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) - '@docusaurus/mdx-loader': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2) - '@docusaurus/module-type-aliases': 3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@docusaurus/plugin-content-blog': 3.5.2(@docusaurus/plugin-content-docs@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) - '@docusaurus/plugin-content-docs': 3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) - '@docusaurus/plugin-content-pages': 3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) - '@docusaurus/theme-common': 3.5.2(@docusaurus/plugin-content-docs@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16))(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2) + '@docusaurus/core': 3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) + '@docusaurus/mdx-loader': 3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2) + '@docusaurus/module-type-aliases': 3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@docusaurus/plugin-content-blog': 3.5.2(@docusaurus/plugin-content-docs@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) + '@docusaurus/plugin-content-docs': 3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) + '@docusaurus/plugin-content-pages': 3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) + '@docusaurus/theme-common': 3.5.2(@docusaurus/plugin-content-docs@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16))(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2) '@docusaurus/theme-translations': 3.5.2 - '@docusaurus/types': 3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@docusaurus/utils': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.6.2) - '@docusaurus/utils-common': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) - '@docusaurus/utils-validation': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.6.2) + '@docusaurus/types': 3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@docusaurus/utils': 3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(typescript@5.6.2) + '@docusaurus/utils-common': 3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + '@docusaurus/utils-validation': 3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(typescript@5.6.2) '@mdx-js/react': 3.0.1(@types/react@18.3.9)(react@18.3.1) clsx: 2.1.1 copy-text-to-clipboard: 3.2.0 @@ -19231,13 +19234,13 @@ snapshots: - vue-template-compiler - webpack-cli - '@docusaurus/theme-common@3.5.2(@docusaurus/plugin-content-docs@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16))(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)': + '@docusaurus/theme-common@3.5.2(@docusaurus/plugin-content-docs@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16))(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)': dependencies: - '@docusaurus/mdx-loader': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2) - '@docusaurus/module-type-aliases': 3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@docusaurus/plugin-content-docs': 3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) - '@docusaurus/utils': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.6.2) - '@docusaurus/utils-common': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + '@docusaurus/mdx-loader': 3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2) + '@docusaurus/module-type-aliases': 3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@docusaurus/plugin-content-docs': 3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) + '@docusaurus/utils': 3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(typescript@5.6.2) + '@docusaurus/utils-common': 3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) '@types/history': 4.7.11 '@types/react': 18.3.9 '@types/react-router-config': 5.0.11 @@ -19257,12 +19260,12 @@ snapshots: - uglify-js - webpack-cli - '@docusaurus/theme-live-codeblock@3.5.2(@docusaurus/plugin-content-docs@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16))(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16)': + '@docusaurus/theme-live-codeblock@3.5.2(@docusaurus/plugin-content-docs@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16))(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16)': dependencies: - '@docusaurus/core': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) - '@docusaurus/theme-common': 3.5.2(@docusaurus/plugin-content-docs@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16))(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2) + '@docusaurus/core': 3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) + '@docusaurus/theme-common': 3.5.2(@docusaurus/plugin-content-docs@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16))(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2) '@docusaurus/theme-translations': 3.5.2 - '@docusaurus/utils-validation': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.6.2) + '@docusaurus/utils-validation': 3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(typescript@5.6.2) '@philpl/buble': 0.19.7 clsx: 2.1.1 fs-extra: 11.2.0 @@ -19291,13 +19294,13 @@ snapshots: - vue-template-compiler - webpack-cli - '@docusaurus/theme-mermaid@3.5.2(@docusaurus/plugin-content-docs@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16)': + '@docusaurus/theme-mermaid@3.5.2(@docusaurus/plugin-content-docs@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16)': dependencies: - '@docusaurus/core': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) - '@docusaurus/module-type-aliases': 3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@docusaurus/theme-common': 3.5.2(@docusaurus/plugin-content-docs@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16))(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2) - '@docusaurus/types': 3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@docusaurus/utils-validation': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.6.2) + '@docusaurus/core': 3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) + '@docusaurus/module-type-aliases': 3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@docusaurus/theme-common': 3.5.2(@docusaurus/plugin-content-docs@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16))(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2) + '@docusaurus/types': 3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@docusaurus/utils-validation': 3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(typescript@5.6.2) mermaid: 10.9.3 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) @@ -19322,16 +19325,16 @@ snapshots: - vue-template-compiler - webpack-cli - '@docusaurus/theme-search-algolia@3.5.2(@algolia/client-search@4.24.0)(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@types/react@18.3.9)(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16)': + '@docusaurus/theme-search-algolia@3.5.2(@algolia/client-search@4.24.0)(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/react@18.3.9)(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16)': dependencies: '@docsearch/react': 3.6.1(@algolia/client-search@4.24.0)(@types/react@18.3.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@docusaurus/core': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) + '@docusaurus/core': 3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) '@docusaurus/logger': 3.5.2 - '@docusaurus/plugin-content-docs': 3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) - '@docusaurus/theme-common': 3.5.2(@docusaurus/plugin-content-docs@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16))(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2) + '@docusaurus/plugin-content-docs': 3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) + '@docusaurus/theme-common': 3.5.2(@docusaurus/plugin-content-docs@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16))(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2) '@docusaurus/theme-translations': 3.5.2 - '@docusaurus/utils': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.6.2) - '@docusaurus/utils-validation': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.6.2) + '@docusaurus/utils': 3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(typescript@5.6.2) + '@docusaurus/utils-validation': 3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(typescript@5.6.2) algoliasearch: 4.24.0 algoliasearch-helper: 3.22.5(algoliasearch@4.24.0) clsx: 2.1.1 @@ -19377,7 +19380,7 @@ snapshots: '@docusaurus/tsconfig@3.5.2': {} - '@docusaurus/types@3.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@docusaurus/types@3.4.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@mdx-js/mdx': 3.0.1 '@types/history': 4.7.11 @@ -19388,7 +19391,7 @@ snapshots: react-dom: 18.3.1(react@18.3.1) react-helmet-async: 1.3.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) utility-types: 3.11.0 - webpack: 5.95.0 + webpack: 5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5)) webpack-merge: 5.10.0 transitivePeerDependencies: - '@swc/core' @@ -19397,7 +19400,7 @@ snapshots: - uglify-js - webpack-cli - '@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@mdx-js/mdx': 3.0.1 '@types/history': 4.7.11 @@ -19408,7 +19411,7 @@ snapshots: react-dom: 18.3.1(react@18.3.1) react-helmet-async: 1.3.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) utility-types: 3.11.0 - webpack: 5.95.0 + webpack: 5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5)) webpack-merge: 5.10.0 transitivePeerDependencies: - '@swc/core' @@ -19417,29 +19420,29 @@ snapshots: - uglify-js - webpack-cli - '@docusaurus/utils-common@3.4.0(@docusaurus/types@3.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1))': + '@docusaurus/utils-common@3.4.0(@docusaurus/types@3.4.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))': dependencies: tslib: 2.7.0 optionalDependencies: - '@docusaurus/types': 3.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@docusaurus/types': 3.4.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@docusaurus/utils-common@3.4.0(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))': + '@docusaurus/utils-common@3.4.0(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))': dependencies: tslib: 2.7.0 optionalDependencies: - '@docusaurus/types': 3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@docusaurus/types': 3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@docusaurus/utils-common@3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))': + '@docusaurus/utils-common@3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))': dependencies: tslib: 2.7.0 optionalDependencies: - '@docusaurus/types': 3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@docusaurus/types': 3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@docusaurus/utils-validation@3.4.0(@docusaurus/types@3.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.6.2)': + '@docusaurus/utils-validation@3.4.0(@docusaurus/types@3.4.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(typescript@5.6.2)': dependencies: '@docusaurus/logger': 3.4.0 - '@docusaurus/utils': 3.4.0(@docusaurus/types@3.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.6.2) - '@docusaurus/utils-common': 3.4.0(@docusaurus/types@3.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + '@docusaurus/utils': 3.4.0(@docusaurus/types@3.4.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(typescript@5.6.2) + '@docusaurus/utils-common': 3.4.0(@docusaurus/types@3.4.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) fs-extra: 11.2.0 joi: 17.13.3 js-yaml: 4.1.0 @@ -19454,11 +19457,11 @@ snapshots: - uglify-js - webpack-cli - '@docusaurus/utils-validation@3.4.0(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.6.2)': + '@docusaurus/utils-validation@3.4.0(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(typescript@5.6.2)': dependencies: '@docusaurus/logger': 3.4.0 - '@docusaurus/utils': 3.4.0(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.6.2) - '@docusaurus/utils-common': 3.4.0(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + '@docusaurus/utils': 3.4.0(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(typescript@5.6.2) + '@docusaurus/utils-common': 3.4.0(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) fs-extra: 11.2.0 joi: 17.13.3 js-yaml: 4.1.0 @@ -19473,11 +19476,11 @@ snapshots: - uglify-js - webpack-cli - '@docusaurus/utils-validation@3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.6.2)': + '@docusaurus/utils-validation@3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(typescript@5.6.2)': dependencies: '@docusaurus/logger': 3.5.2 - '@docusaurus/utils': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.6.2) - '@docusaurus/utils-common': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + '@docusaurus/utils': 3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(typescript@5.6.2) + '@docusaurus/utils-common': 3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) fs-extra: 11.2.0 joi: 17.13.3 js-yaml: 4.1.0 @@ -19492,13 +19495,13 @@ snapshots: - uglify-js - webpack-cli - '@docusaurus/utils@3.4.0(@docusaurus/types@3.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.6.2)': + '@docusaurus/utils@3.4.0(@docusaurus/types@3.4.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(typescript@5.6.2)': dependencies: '@docusaurus/logger': 3.4.0 - '@docusaurus/utils-common': 3.4.0(@docusaurus/types@3.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + '@docusaurus/utils-common': 3.4.0(@docusaurus/types@3.4.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) '@svgr/webpack': 8.1.0(typescript@5.6.2) escape-string-regexp: 4.0.0 - file-loader: 6.2.0(webpack@5.95.0) + file-loader: 6.2.0(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))) fs-extra: 11.2.0 github-slugger: 1.5.0 globby: 11.1.0 @@ -19511,11 +19514,11 @@ snapshots: resolve-pathname: 3.0.0 shelljs: 0.8.5 tslib: 2.7.0 - url-loader: 4.1.1(file-loader@6.2.0(webpack@5.95.0))(webpack@5.95.0) + url-loader: 4.1.1(file-loader@6.2.0(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))))(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))) utility-types: 3.11.0 - webpack: 5.95.0 + webpack: 5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5)) optionalDependencies: - '@docusaurus/types': 3.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@docusaurus/types': 3.4.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) transitivePeerDependencies: - '@swc/core' - esbuild @@ -19524,13 +19527,13 @@ snapshots: - uglify-js - webpack-cli - '@docusaurus/utils@3.4.0(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.6.2)': + '@docusaurus/utils@3.4.0(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(typescript@5.6.2)': dependencies: '@docusaurus/logger': 3.4.0 - '@docusaurus/utils-common': 3.4.0(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + '@docusaurus/utils-common': 3.4.0(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) '@svgr/webpack': 8.1.0(typescript@5.6.2) escape-string-regexp: 4.0.0 - file-loader: 6.2.0(webpack@5.95.0) + file-loader: 6.2.0(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))) fs-extra: 11.2.0 github-slugger: 1.5.0 globby: 11.1.0 @@ -19543,11 +19546,11 @@ snapshots: resolve-pathname: 3.0.0 shelljs: 0.8.5 tslib: 2.7.0 - url-loader: 4.1.1(file-loader@6.2.0(webpack@5.95.0))(webpack@5.95.0) + url-loader: 4.1.1(file-loader@6.2.0(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))))(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))) utility-types: 3.11.0 - webpack: 5.95.0 + webpack: 5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5)) optionalDependencies: - '@docusaurus/types': 3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@docusaurus/types': 3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) transitivePeerDependencies: - '@swc/core' - esbuild @@ -19556,13 +19559,13 @@ snapshots: - uglify-js - webpack-cli - '@docusaurus/utils@3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.6.2)': + '@docusaurus/utils@3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(typescript@5.6.2)': dependencies: '@docusaurus/logger': 3.5.2 - '@docusaurus/utils-common': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + '@docusaurus/utils-common': 3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) '@svgr/webpack': 8.1.0(typescript@5.6.2) escape-string-regexp: 4.0.0 - file-loader: 6.2.0(webpack@5.95.0) + file-loader: 6.2.0(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))) fs-extra: 11.2.0 github-slugger: 1.5.0 globby: 11.1.0 @@ -19575,11 +19578,11 @@ snapshots: resolve-pathname: 3.0.0 shelljs: 0.8.5 tslib: 2.7.0 - url-loader: 4.1.1(file-loader@6.2.0(webpack@5.95.0))(webpack@5.95.0) + url-loader: 4.1.1(file-loader@6.2.0(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))))(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))) utility-types: 3.11.0 - webpack: 5.95.0 + webpack: 5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5)) optionalDependencies: - '@docusaurus/types': 3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@docusaurus/types': 3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) transitivePeerDependencies: - '@swc/core' - esbuild @@ -20144,24 +20147,24 @@ snapshots: - encoding - supports-color - '@graphql-markdown/core@1.12.0(@graphql-markdown/printer-legacy@1.9.0(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(graphql@16.9.0)(prettier@3.3.3)(typescript@5.6.2))(graphql-config@5.1.2(@types/node@22.7.3)(graphql@16.9.0)(typescript@5.6.2))(graphql@16.9.0)(prettier@3.3.3)': + '@graphql-markdown/core@1.12.0(@graphql-markdown/printer-legacy@1.9.0(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(graphql@16.9.0)(prettier@3.3.3)(typescript@5.6.2))(graphql-config@5.1.2(@types/node@22.7.3)(graphql@16.9.0)(typescript@5.6.2))(graphql@16.9.0)(prettier@3.3.3)': dependencies: '@graphql-markdown/graphql': 1.1.4(graphql@16.9.0)(prettier@3.3.3) '@graphql-markdown/logger': 1.0.4 '@graphql-markdown/utils': 1.7.0(prettier@3.3.3) optionalDependencies: - '@graphql-markdown/printer-legacy': 1.9.0(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(graphql@16.9.0)(prettier@3.3.3)(typescript@5.6.2) + '@graphql-markdown/printer-legacy': 1.9.0(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(graphql@16.9.0)(prettier@3.3.3)(typescript@5.6.2) graphql-config: 5.1.2(@types/node@22.7.3)(graphql@16.9.0)(typescript@5.6.2) transitivePeerDependencies: - graphql - prettier - '@graphql-markdown/docusaurus@1.26.2(@docusaurus/logger@3.5.2)(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(graphql-config@5.1.2(@types/node@22.7.3)(graphql@16.9.0)(typescript@5.6.2))(graphql@16.9.0)(prettier@3.3.3)(typescript@5.6.2)': + '@graphql-markdown/docusaurus@1.26.2(@docusaurus/logger@3.5.2)(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(graphql-config@5.1.2(@types/node@22.7.3)(graphql@16.9.0)(typescript@5.6.2))(graphql@16.9.0)(prettier@3.3.3)(typescript@5.6.2)': dependencies: '@docusaurus/logger': 3.5.2 - '@graphql-markdown/core': 1.12.0(@graphql-markdown/printer-legacy@1.9.0(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(graphql@16.9.0)(prettier@3.3.3)(typescript@5.6.2))(graphql-config@5.1.2(@types/node@22.7.3)(graphql@16.9.0)(typescript@5.6.2))(graphql@16.9.0)(prettier@3.3.3) + '@graphql-markdown/core': 1.12.0(@graphql-markdown/printer-legacy@1.9.0(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(graphql@16.9.0)(prettier@3.3.3)(typescript@5.6.2))(graphql-config@5.1.2(@types/node@22.7.3)(graphql@16.9.0)(typescript@5.6.2))(graphql@16.9.0)(prettier@3.3.3) '@graphql-markdown/logger': 1.0.4 - '@graphql-markdown/printer-legacy': 1.9.0(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(graphql@16.9.0)(prettier@3.3.3)(typescript@5.6.2) + '@graphql-markdown/printer-legacy': 1.9.0(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(graphql@16.9.0)(prettier@3.3.3)(typescript@5.6.2) transitivePeerDependencies: - '@docusaurus/types' - '@graphql-markdown/diff' @@ -20186,9 +20189,9 @@ snapshots: '@graphql-markdown/logger@1.0.4': {} - '@graphql-markdown/printer-legacy@1.9.0(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(graphql@16.9.0)(prettier@3.3.3)(typescript@5.6.2)': + '@graphql-markdown/printer-legacy@1.9.0(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(graphql@16.9.0)(prettier@3.3.3)(typescript@5.6.2)': dependencies: - '@docusaurus/utils': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.6.2) + '@docusaurus/utils': 3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(typescript@5.6.2) '@graphql-markdown/graphql': 1.1.4(graphql@16.9.0)(prettier@3.3.3) '@graphql-markdown/utils': 1.7.0(prettier@3.3.3) transitivePeerDependencies: @@ -20526,9 +20529,9 @@ snapshots: react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - '@headlessui/tailwindcss@0.1.3(tailwindcss@3.4.13(ts-node@10.9.2(@types/node@22.7.3)(typescript@5.6.2)))': + '@headlessui/tailwindcss@0.1.3(tailwindcss@3.4.13(ts-node@10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@22.7.3)(typescript@5.6.2)))': dependencies: - tailwindcss: 3.4.13(ts-node@10.9.2(@types/node@22.7.3)(typescript@5.6.2)) + tailwindcss: 3.4.13(ts-node@10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@22.7.3)(typescript@5.6.2)) '@hookform/resolvers@3.9.0(react-hook-form@7.53.0(react@18.3.1))': dependencies: @@ -20606,7 +20609,7 @@ snapshots: jest-util: 29.7.0 slash: 3.0.0 - '@jest/core@29.7.0(babel-plugin-macros@3.1.0)(node-notifier@10.0.0)(ts-node@10.9.2(@types/node@20.16.9)(typescript@5.6.2))': + '@jest/core@29.7.0(babel-plugin-macros@3.1.0)(node-notifier@10.0.0)(ts-node@10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(typescript@5.6.2))': dependencies: '@jest/console': 29.7.0 '@jest/reporters': 29.7.0(node-notifier@10.0.0) @@ -20620,7 +20623,7 @@ snapshots: exit: 0.1.2 graceful-fs: 4.2.11 jest-changed-files: 29.7.0 - jest-config: 29.7.0(@types/node@20.16.9)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@20.16.9)(typescript@5.6.2)) + jest-config: 29.7.0(@types/node@20.16.9)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(typescript@5.6.2)) jest-haste-map: 29.7.0 jest-message-util: 29.7.0 jest-regex-util: 29.6.3 @@ -21132,7 +21135,7 @@ snapshots: cache-manager: 5.7.6 rxjs: 7.8.1 - '@nestjs/cli@10.4.5(@swc/core@1.7.28)': + '@nestjs/cli@10.4.5(@swc/core@1.7.28(@swc/helpers@0.5.5))': dependencies: '@angular-devkit/core': 17.3.8(chokidar@3.6.0) '@angular-devkit/schematics': 17.3.8(chokidar@3.6.0) @@ -21142,7 +21145,7 @@ snapshots: chokidar: 3.6.0 cli-table3: 0.6.5 commander: 4.1.1 - fork-ts-checker-webpack-plugin: 9.0.2(typescript@5.3.3)(webpack@5.94.0(@swc/core@1.7.28)) + fork-ts-checker-webpack-plugin: 9.0.2(typescript@5.3.3)(webpack@5.94.0(@swc/core@1.7.28(@swc/helpers@0.5.5))) glob: 10.4.2 inquirer: 8.2.6 node-emoji: 1.11.0 @@ -21151,7 +21154,7 @@ snapshots: tsconfig-paths: 4.2.0 tsconfig-paths-webpack-plugin: 4.1.0 typescript: 5.3.3 - webpack: 5.94.0(@swc/core@1.7.28) + webpack: 5.94.0(@swc/core@1.7.28(@swc/helpers@0.5.5)) webpack-node-externals: 3.0.0 optionalDependencies: '@swc/core': 1.7.28(@swc/helpers@0.5.5) @@ -23860,14 +23863,14 @@ snapshots: dependencies: defer-to-connect: 2.0.1 - '@tailwindcss/aspect-ratio@0.4.2(tailwindcss@3.4.13(ts-node@10.9.2(@types/node@22.7.3)(typescript@5.6.2)))': + '@tailwindcss/aspect-ratio@0.4.2(tailwindcss@3.4.13(ts-node@10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@22.7.3)(typescript@5.6.2)))': dependencies: - tailwindcss: 3.4.13(ts-node@10.9.2(@types/node@22.7.3)(typescript@5.6.2)) + tailwindcss: 3.4.13(ts-node@10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@22.7.3)(typescript@5.6.2)) - '@tailwindcss/forms@0.5.9(tailwindcss@3.4.13(ts-node@10.9.2(@types/node@22.7.3)(typescript@5.6.2)))': + '@tailwindcss/forms@0.5.9(tailwindcss@3.4.13(ts-node@10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@22.7.3)(typescript@5.6.2)))': dependencies: mini-svg-data-uri: 1.4.4 - tailwindcss: 3.4.13(ts-node@10.9.2(@types/node@22.7.3)(typescript@5.6.2)) + tailwindcss: 3.4.13(ts-node@10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@22.7.3)(typescript@5.6.2)) '@tanstack/eslint-plugin-query@5.58.1(eslint@8.57.1)(typescript@5.6.2)': dependencies: @@ -24371,11 +24374,11 @@ snapshots: '@types/webextension-polyfill@0.10.7': {} - '@types/webpack@5.28.5(@swc/core@1.7.28)(webpack-cli@5.1.4(webpack@5.95.0))': + '@types/webpack@5.28.5(@swc/core@1.7.28(@swc/helpers@0.5.5))(webpack-cli@5.1.4(webpack@5.95.0))': dependencies: '@types/node': 20.16.9 tapable: 2.2.1 - webpack: 5.95.0(@swc/core@1.7.28)(webpack-cli@5.1.4) + webpack: 5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(webpack-cli@5.1.4) transitivePeerDependencies: - '@swc/core' - esbuild @@ -25150,19 +25153,19 @@ snapshots: '@webassemblyjs/ast': 1.12.1 '@xtuc/long': 4.2.2 - '@webpack-cli/configtest@2.1.1(webpack-cli@5.1.4(webpack@5.95.0))(webpack@5.95.0(@swc/core@1.7.28)(webpack-cli@5.1.4))': + '@webpack-cli/configtest@2.1.1(webpack-cli@5.1.4(webpack@5.95.0))(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(webpack-cli@5.1.4))': dependencies: - webpack: 5.95.0(@swc/core@1.7.28)(webpack-cli@5.1.4) + webpack: 5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(webpack-cli@5.1.4) webpack-cli: 5.1.4(webpack@5.95.0) - '@webpack-cli/info@2.0.2(webpack-cli@5.1.4(webpack@5.95.0))(webpack@5.95.0(@swc/core@1.7.28)(webpack-cli@5.1.4))': + '@webpack-cli/info@2.0.2(webpack-cli@5.1.4(webpack@5.95.0))(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(webpack-cli@5.1.4))': dependencies: - webpack: 5.95.0(@swc/core@1.7.28)(webpack-cli@5.1.4) + webpack: 5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(webpack-cli@5.1.4) webpack-cli: 5.1.4(webpack@5.95.0) - '@webpack-cli/serve@2.0.5(webpack-cli@5.1.4(webpack@5.95.0))(webpack@5.95.0(@swc/core@1.7.28)(webpack-cli@5.1.4))': + '@webpack-cli/serve@2.0.5(webpack-cli@5.1.4(webpack@5.95.0))(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(webpack-cli@5.1.4))': dependencies: - webpack: 5.95.0(@swc/core@1.7.28)(webpack-cli@5.1.4) + webpack: 5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(webpack-cli@5.1.4) webpack-cli: 5.1.4(webpack@5.95.0) '@whatwg-node/events@0.0.3': {} @@ -25651,12 +25654,12 @@ snapshots: transitivePeerDependencies: - supports-color - babel-loader@9.2.1(@babel/core@7.25.2)(webpack@5.95.0): + babel-loader@9.2.1(@babel/core@7.25.2)(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))): dependencies: '@babel/core': 7.25.2 find-cache-dir: 4.0.0 schema-utils: 4.2.0 - webpack: 5.95.0 + webpack: 5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5)) babel-plugin-dynamic-import-node@2.3.3: dependencies: @@ -26456,7 +26459,7 @@ snapshots: copy-text-to-clipboard@3.2.0: {} - copy-webpack-plugin@11.0.0(webpack@5.95.0(@swc/core@1.7.28)(webpack-cli@5.1.4)): + copy-webpack-plugin@11.0.0(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(webpack-cli@5.1.4)): dependencies: fast-glob: 3.3.2 glob-parent: 6.0.2 @@ -26464,9 +26467,9 @@ snapshots: normalize-path: 3.0.0 schema-utils: 4.2.0 serialize-javascript: 6.0.2 - webpack: 5.95.0(@swc/core@1.7.28)(webpack-cli@5.1.4) + webpack: 5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(webpack-cli@5.1.4) - copy-webpack-plugin@11.0.0(webpack@5.95.0): + copy-webpack-plugin@11.0.0(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))): dependencies: fast-glob: 3.3.2 glob-parent: 6.0.2 @@ -26474,7 +26477,7 @@ snapshots: normalize-path: 3.0.0 schema-utils: 4.2.0 serialize-javascript: 6.0.2 - webpack: 5.95.0 + webpack: 5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5)) core-js-compat@3.38.1: dependencies: @@ -26544,13 +26547,13 @@ snapshots: crc-32@1.2.2: {} - create-jest@29.7.0(@types/node@20.16.9)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@20.16.9)(typescript@5.6.2)): + create-jest@29.7.0(@types/node@20.16.9)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(typescript@5.6.2)): dependencies: '@jest/types': 29.6.3 chalk: 4.1.2 exit: 0.1.2 graceful-fs: 4.2.11 - jest-config: 29.7.0(@types/node@20.16.9)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@20.16.9)(typescript@5.6.2)) + jest-config: 29.7.0(@types/node@20.16.9)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(typescript@5.6.2)) jest-util: 29.7.0 prompts: 2.4.2 transitivePeerDependencies: @@ -26614,7 +26617,7 @@ snapshots: postcss-selector-parser: 6.1.2 postcss-value-parser: 4.2.0 - css-loader@6.11.0(webpack@5.95.0(@swc/core@1.7.28)(webpack-cli@5.1.4)): + css-loader@6.11.0(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(webpack-cli@5.1.4)): dependencies: icss-utils: 5.1.0(postcss@8.4.47) postcss: 8.4.47 @@ -26625,9 +26628,9 @@ snapshots: postcss-value-parser: 4.2.0 semver: 7.6.3 optionalDependencies: - webpack: 5.95.0(@swc/core@1.7.28)(webpack-cli@5.1.4) + webpack: 5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(webpack-cli@5.1.4) - css-loader@6.11.0(webpack@5.95.0): + css-loader@6.11.0(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))): dependencies: icss-utils: 5.1.0(postcss@8.4.47) postcss: 8.4.47 @@ -26638,9 +26641,9 @@ snapshots: postcss-value-parser: 4.2.0 semver: 7.6.3 optionalDependencies: - webpack: 5.95.0 + webpack: 5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5)) - css-minimizer-webpack-plugin@5.0.1(clean-css@5.3.3)(webpack@5.95.0): + css-minimizer-webpack-plugin@5.0.1(clean-css@5.3.3)(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))): dependencies: '@jridgewell/trace-mapping': 0.3.25 cssnano: 6.1.2(postcss@8.4.47) @@ -26648,7 +26651,7 @@ snapshots: postcss: 8.4.47 schema-utils: 4.2.0 serialize-javascript: 6.0.2 - webpack: 5.95.0 + webpack: 5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5)) optionalDependencies: clean-css: 5.3.3 @@ -27197,15 +27200,15 @@ snapshots: dependencies: typedoc-plugin-markdown: 4.2.10(typedoc@0.26.11(typescript@5.6.2)) - docusaurus-theme-search-typesense@0.20.0-0(@algolia/client-search@4.24.0)(@babel/runtime@7.25.6)(@docusaurus/core@3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16))(@docusaurus/theme-common@3.5.2(@docusaurus/plugin-content-docs@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16))(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2))(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/react@18.3.9)(algoliasearch@4.24.0)(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16): + docusaurus-theme-search-typesense@0.20.0-0(iea5eyhbiud2dlcqtud2g4pxzm): dependencies: - '@docusaurus/core': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) + '@docusaurus/core': 3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) '@docusaurus/logger': 3.4.0 - '@docusaurus/plugin-content-docs': 3.4.0(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) - '@docusaurus/theme-common': 3.5.2(@docusaurus/plugin-content-docs@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16))(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2) + '@docusaurus/plugin-content-docs': 3.4.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) + '@docusaurus/theme-common': 3.5.2(@docusaurus/plugin-content-docs@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16))(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2) '@docusaurus/theme-translations': 3.4.0 - '@docusaurus/utils': 3.4.0(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.6.2) - '@docusaurus/utils-validation': 3.4.0(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.6.2) + '@docusaurus/utils': 3.4.0(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(typescript@5.6.2) + '@docusaurus/utils-validation': 3.4.0(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(typescript@5.6.2) algoliasearch-helper: 3.22.5(algoliasearch@4.24.0) clsx: 1.2.1 eta: 2.2.0 @@ -27621,8 +27624,8 @@ snapshots: '@typescript-eslint/parser': 6.21.0(eslint@8.57.1)(typescript@5.6.2) eslint: 8.57.1 eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.6.3(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.30.0)(eslint@8.57.1) - eslint-plugin-import: 2.30.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.6.2))(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.1) + eslint-import-resolver-typescript: 3.6.3(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.30.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.6.2))(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.6.2))(eslint-plugin-import@2.30.0)(eslint@8.57.1))(eslint@8.57.1))(eslint@8.57.1) + eslint-plugin-import: 2.30.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.6.2))(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.6.2))(eslint-plugin-import@2.30.0)(eslint@8.57.1))(eslint@8.57.1) eslint-plugin-jsx-a11y: 6.10.0(eslint@8.57.1) eslint-plugin-react: 7.37.0(eslint@8.57.1) eslint-plugin-react-hooks: 4.6.2(eslint@8.57.1) @@ -27645,26 +27648,7 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.30.0)(eslint@8.57.1): - dependencies: - '@nolyfill/is-core-module': 1.0.39 - debug: 4.3.7(supports-color@8.1.1) - enhanced-resolve: 5.17.1 - eslint: 8.57.1 - eslint-module-utils: 2.12.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.30.0)(eslint@8.57.1))(eslint@8.57.1) - fast-glob: 3.3.2 - get-tsconfig: 4.8.1 - is-bun-module: 1.2.1 - is-glob: 4.0.3 - optionalDependencies: - eslint-plugin-import: 2.30.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.6.2))(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.1) - transitivePeerDependencies: - - '@typescript-eslint/parser' - - eslint-import-resolver-node - - eslint-import-resolver-webpack - - supports-color - - eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.6.2))(eslint-plugin-import@2.30.0)(eslint@8.57.1): + eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.30.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.6.2))(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.6.2))(eslint-plugin-import@2.30.0)(eslint@8.57.1))(eslint@8.57.1))(eslint@8.57.1): dependencies: '@nolyfill/is-core-module': 1.0.39 debug: 4.3.7(supports-color@8.1.1) @@ -27676,24 +27660,13 @@ snapshots: is-bun-module: 1.2.1 is-glob: 4.0.3 optionalDependencies: - eslint-plugin-import: 2.30.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.6.2))(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.1) + eslint-plugin-import: 2.30.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.6.2))(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.6.2))(eslint-plugin-import@2.30.0)(eslint@8.57.1))(eslint@8.57.1) transitivePeerDependencies: - '@typescript-eslint/parser' - eslint-import-resolver-node - eslint-import-resolver-webpack - supports-color - eslint-module-utils@2.12.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.30.0)(eslint@8.57.1))(eslint@8.57.1): - dependencies: - debug: 3.2.7 - optionalDependencies: - '@typescript-eslint/parser': 6.21.0(eslint@8.57.1)(typescript@5.6.2) - eslint: 8.57.1 - eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.6.3(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.30.0)(eslint@8.57.1) - transitivePeerDependencies: - - supports-color - eslint-module-utils@2.12.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.6.2))(eslint-plugin-import@2.30.0)(eslint@8.57.1))(eslint@8.57.1): dependencies: debug: 3.2.7 @@ -27701,7 +27674,7 @@ snapshots: '@typescript-eslint/parser': 6.21.0(eslint@8.57.1)(typescript@5.6.2) eslint: 8.57.1 eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.6.3(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.6.2))(eslint-plugin-import@2.30.0)(eslint@8.57.1) + eslint-import-resolver-typescript: 3.6.3(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.30.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.6.2))(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.6.2))(eslint-plugin-import@2.30.0)(eslint@8.57.1))(eslint@8.57.1))(eslint@8.57.1) transitivePeerDependencies: - supports-color @@ -27709,7 +27682,7 @@ snapshots: dependencies: eslint: 8.57.1 - eslint-plugin-import@2.30.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.6.2))(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.1): + eslint-plugin-import@2.30.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.6.2))(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.6.2))(eslint-plugin-import@2.30.0)(eslint@8.57.1))(eslint@8.57.1): dependencies: '@rtsao/scc': 1.1.0 array-includes: 3.1.8 @@ -27835,7 +27808,7 @@ snapshots: eslint-visitor-keys@4.1.0: {} - eslint-webpack-plugin@4.2.0(eslint@8.57.1)(webpack@5.95.0(@swc/core@1.7.28)(webpack-cli@5.1.4)): + eslint-webpack-plugin@4.2.0(eslint@8.57.1)(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(webpack-cli@5.1.4)): dependencies: '@types/eslint': 8.56.12 eslint: 8.57.1 @@ -27843,7 +27816,7 @@ snapshots: micromatch: 4.0.8 normalize-path: 3.0.0 schema-utils: 4.2.0 - webpack: 5.95.0(@swc/core@1.7.28)(webpack-cli@5.1.4) + webpack: 5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(webpack-cli@5.1.4) eslint@8.57.1: dependencies: @@ -28208,11 +28181,11 @@ snapshots: dependencies: flat-cache: 3.2.0 - file-loader@6.2.0(webpack@5.95.0): + file-loader@6.2.0(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))): dependencies: loader-utils: 2.0.4 schema-utils: 3.3.0 - webpack: 5.95.0 + webpack: 5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5)) file-system-cache@2.3.0: dependencies: @@ -28320,7 +28293,7 @@ snapshots: forever-agent@0.6.1: {} - fork-ts-checker-webpack-plugin@6.5.3(eslint@8.57.1)(typescript@5.6.2)(vue-template-compiler@2.7.16)(webpack@5.95.0): + fork-ts-checker-webpack-plugin@6.5.3(eslint@8.57.1)(typescript@5.6.2)(vue-template-compiler@2.7.16)(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))): dependencies: '@babel/code-frame': 7.24.7 '@types/json-schema': 7.0.15 @@ -28336,12 +28309,12 @@ snapshots: semver: 7.6.3 tapable: 1.1.3 typescript: 5.6.2 - webpack: 5.95.0 + webpack: 5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5)) optionalDependencies: eslint: 8.57.1 vue-template-compiler: 2.7.16 - fork-ts-checker-webpack-plugin@9.0.2(typescript@5.3.3)(webpack@5.94.0(@swc/core@1.7.28)): + fork-ts-checker-webpack-plugin@9.0.2(typescript@5.3.3)(webpack@5.94.0(@swc/core@1.7.28(@swc/helpers@0.5.5))): dependencies: '@babel/code-frame': 7.24.7 chalk: 4.1.2 @@ -28356,7 +28329,7 @@ snapshots: semver: 7.6.3 tapable: 2.2.1 typescript: 5.3.3 - webpack: 5.94.0(@swc/core@1.7.28) + webpack: 5.94.0(@swc/core@1.7.28(@swc/helpers@0.5.5)) form-data-encoder@2.1.4: {} @@ -29139,7 +29112,7 @@ snapshots: html-void-elements@3.0.0: {} - html-webpack-plugin@5.6.0(webpack@5.95.0(@swc/core@1.7.28)(webpack-cli@5.1.4)): + html-webpack-plugin@5.6.0(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(webpack-cli@5.1.4)): dependencies: '@types/html-minifier-terser': 6.1.0 html-minifier-terser: 6.1.0 @@ -29147,9 +29120,9 @@ snapshots: pretty-error: 4.0.0 tapable: 2.2.1 optionalDependencies: - webpack: 5.95.0(@swc/core@1.7.28)(webpack-cli@5.1.4) + webpack: 5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(webpack-cli@5.1.4) - html-webpack-plugin@5.6.0(webpack@5.95.0): + html-webpack-plugin@5.6.0(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))): dependencies: '@types/html-minifier-terser': 6.1.0 html-minifier-terser: 6.1.0 @@ -29157,7 +29130,7 @@ snapshots: pretty-error: 4.0.0 tapable: 2.2.1 optionalDependencies: - webpack: 5.95.0 + webpack: 5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5)) htmlparser2@6.1.0: dependencies: @@ -29799,16 +29772,16 @@ snapshots: - babel-plugin-macros - supports-color - jest-cli@29.7.0(@types/node@20.16.9)(babel-plugin-macros@3.1.0)(node-notifier@10.0.0)(ts-node@10.9.2(@types/node@20.16.9)(typescript@5.6.2)): + jest-cli@29.7.0(@types/node@20.16.9)(babel-plugin-macros@3.1.0)(node-notifier@10.0.0)(ts-node@10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(typescript@5.6.2)): dependencies: - '@jest/core': 29.7.0(babel-plugin-macros@3.1.0)(node-notifier@10.0.0)(ts-node@10.9.2(@types/node@20.16.9)(typescript@5.6.2)) + '@jest/core': 29.7.0(babel-plugin-macros@3.1.0)(node-notifier@10.0.0)(ts-node@10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(typescript@5.6.2)) '@jest/test-result': 29.7.0 '@jest/types': 29.6.3 chalk: 4.1.2 - create-jest: 29.7.0(@types/node@20.16.9)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@20.16.9)(typescript@5.6.2)) + create-jest: 29.7.0(@types/node@20.16.9)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(typescript@5.6.2)) exit: 0.1.2 import-local: 3.2.0 - jest-config: 29.7.0(@types/node@20.16.9)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@20.16.9)(typescript@5.6.2)) + jest-config: 29.7.0(@types/node@20.16.9)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(typescript@5.6.2)) jest-util: 29.7.0 jest-validate: 29.7.0 yargs: 17.7.2 @@ -29820,7 +29793,7 @@ snapshots: - supports-color - ts-node - jest-config@29.7.0(@types/node@20.16.9)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@20.16.9)(typescript@5.6.2)): + jest-config@29.7.0(@types/node@20.16.9)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(typescript@5.6.2)): dependencies: '@babel/core': 7.25.2 '@jest/test-sequencer': 29.7.0 @@ -29846,7 +29819,7 @@ snapshots: strip-json-comments: 3.1.1 optionalDependencies: '@types/node': 20.16.9 - ts-node: 10.9.2(@swc/core@1.7.28)(@types/node@20.16.9)(typescript@5.6.2) + ts-node: 10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(typescript@5.6.2) transitivePeerDependencies: - babel-plugin-macros - supports-color @@ -30077,12 +30050,12 @@ snapshots: merge-stream: 2.0.0 supports-color: 8.1.1 - jest@29.7.0(@types/node@20.16.9)(babel-plugin-macros@3.1.0)(node-notifier@10.0.0)(ts-node@10.9.2(@types/node@20.16.9)(typescript@5.6.2)): + jest@29.7.0(@types/node@20.16.9)(babel-plugin-macros@3.1.0)(node-notifier@10.0.0)(ts-node@10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(typescript@5.6.2)): dependencies: - '@jest/core': 29.7.0(babel-plugin-macros@3.1.0)(node-notifier@10.0.0)(ts-node@10.9.2(@types/node@20.16.9)(typescript@5.6.2)) + '@jest/core': 29.7.0(babel-plugin-macros@3.1.0)(node-notifier@10.0.0)(ts-node@10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(typescript@5.6.2)) '@jest/types': 29.6.3 import-local: 3.2.0 - jest-cli: 29.7.0(@types/node@20.16.9)(babel-plugin-macros@3.1.0)(node-notifier@10.0.0)(ts-node@10.9.2(@types/node@20.16.9)(typescript@5.6.2)) + jest-cli: 29.7.0(@types/node@20.16.9)(babel-plugin-macros@3.1.0)(node-notifier@10.0.0)(ts-node@10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(typescript@5.6.2)) optionalDependencies: node-notifier: 10.0.0 transitivePeerDependencies: @@ -31366,17 +31339,17 @@ snapshots: min-indent@1.0.1: {} - mini-css-extract-plugin@2.9.1(webpack@5.95.0(@swc/core@1.7.28)(webpack-cli@5.1.4)): + mini-css-extract-plugin@2.9.1(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(webpack-cli@5.1.4)): dependencies: schema-utils: 4.2.0 tapable: 2.2.1 - webpack: 5.95.0(@swc/core@1.7.28)(webpack-cli@5.1.4) + webpack: 5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(webpack-cli@5.1.4) - mini-css-extract-plugin@2.9.1(webpack@5.95.0): + mini-css-extract-plugin@2.9.1(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))): dependencies: schema-utils: 4.2.0 tapable: 2.2.1 - webpack: 5.95.0 + webpack: 5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5)) mini-svg-data-uri@1.4.4: {} @@ -32313,39 +32286,39 @@ snapshots: '@csstools/utilities': 1.0.0(postcss@8.4.47) postcss: 8.4.47 - postcss-load-config@4.0.2(postcss@8.4.47)(ts-node@10.9.2(@swc/core@1.7.28)(@types/node@20.16.9)(typescript@5.6.2)): + postcss-load-config@4.0.2(postcss@8.4.47)(ts-node@10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(typescript@5.6.2)): dependencies: lilconfig: 3.1.2 yaml: 2.5.1 optionalDependencies: postcss: 8.4.47 - ts-node: 10.9.2(@swc/core@1.7.28)(@types/node@20.16.9)(typescript@5.6.2) + ts-node: 10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(typescript@5.6.2) - postcss-load-config@4.0.2(postcss@8.4.47)(ts-node@10.9.2(@types/node@22.7.3)(typescript@5.6.2)): + postcss-load-config@4.0.2(postcss@8.4.47)(ts-node@10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@22.7.3)(typescript@5.6.2)): dependencies: lilconfig: 3.1.2 yaml: 2.5.1 optionalDependencies: postcss: 8.4.47 - ts-node: 10.9.2(@types/node@22.7.3)(typescript@5.6.2) + ts-node: 10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@22.7.3)(typescript@5.6.2) - postcss-loader@7.3.4(postcss@8.4.47)(typescript@5.6.2)(webpack@5.95.0(@swc/core@1.7.28)(webpack-cli@5.1.4)): + postcss-loader@7.3.4(postcss@8.4.47)(typescript@5.6.2)(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(webpack-cli@5.1.4)): dependencies: cosmiconfig: 8.3.6(typescript@5.6.2) jiti: 1.21.6 postcss: 8.4.47 semver: 7.6.3 - webpack: 5.95.0(@swc/core@1.7.28)(webpack-cli@5.1.4) + webpack: 5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(webpack-cli@5.1.4) transitivePeerDependencies: - typescript - postcss-loader@7.3.4(postcss@8.4.47)(typescript@5.6.2)(webpack@5.95.0): + postcss-loader@7.3.4(postcss@8.4.47)(typescript@5.6.2)(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))): dependencies: cosmiconfig: 8.3.6(typescript@5.6.2) jiti: 1.21.6 postcss: 8.4.47 semver: 7.6.3 - webpack: 5.95.0 + webpack: 5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5)) transitivePeerDependencies: - typescript @@ -32850,7 +32823,7 @@ snapshots: react: 18.3.1 tween-functions: 1.2.0 - react-dev-utils@12.0.1(eslint@8.57.1)(typescript@5.6.2)(vue-template-compiler@2.7.16)(webpack@5.95.0): + react-dev-utils@12.0.1(eslint@8.57.1)(typescript@5.6.2)(vue-template-compiler@2.7.16)(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))): dependencies: '@babel/code-frame': 7.24.7 address: 1.2.2 @@ -32861,7 +32834,7 @@ snapshots: escape-string-regexp: 4.0.0 filesize: 8.0.7 find-up: 5.0.0 - fork-ts-checker-webpack-plugin: 6.5.3(eslint@8.57.1)(typescript@5.6.2)(vue-template-compiler@2.7.16)(webpack@5.95.0) + fork-ts-checker-webpack-plugin: 6.5.3(eslint@8.57.1)(typescript@5.6.2)(vue-template-compiler@2.7.16)(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))) global-modules: 2.0.0 globby: 11.1.0 gzip-size: 6.0.0 @@ -32876,7 +32849,7 @@ snapshots: shell-quote: 1.8.1 strip-ansi: 6.0.1 text-table: 0.2.0 - webpack: 5.95.0 + webpack: 5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5)) optionalDependencies: typescript: 5.6.2 transitivePeerDependencies: @@ -32977,11 +32950,11 @@ snapshots: sucrase: 3.35.0 use-editable: 2.3.3(react@18.3.1) - react-loadable-ssr-addon-v5-slorber@1.0.1(@docusaurus/react-loadable@6.0.0(react@18.3.1))(webpack@5.95.0): + react-loadable-ssr-addon-v5-slorber@1.0.1(@docusaurus/react-loadable@6.0.0(react@18.3.1))(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))): dependencies: '@babel/runtime': 7.25.6 react-loadable: '@docusaurus/react-loadable@6.0.0(react@18.3.1)' - webpack: 5.95.0 + webpack: 5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5)) react-number-format@5.4.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: @@ -33680,10 +33653,10 @@ snapshots: safer-buffer@2.1.2: {} - sass-loader@13.3.3(sass@1.79.3)(webpack@5.95.0(@swc/core@1.7.28)(webpack-cli@5.1.4)): + sass-loader@13.3.3(sass@1.79.3)(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(webpack-cli@5.1.4)): dependencies: neo-async: 2.6.2 - webpack: 5.95.0(@swc/core@1.7.28)(webpack-cli@5.1.4) + webpack: 5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(webpack-cli@5.1.4) optionalDependencies: sass: 1.79.3 @@ -34413,15 +34386,15 @@ snapshots: tailwind-merge@2.5.2: {} - tailwindcss-animate@1.0.7(tailwindcss@3.4.13(ts-node@10.9.2(@swc/core@1.7.28)(@types/node@20.16.9)(typescript@5.6.2))): + tailwindcss-animate@1.0.7(tailwindcss@3.4.13(ts-node@10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(typescript@5.6.2))): dependencies: - tailwindcss: 3.4.13(ts-node@10.9.2(@swc/core@1.7.28)(@types/node@20.16.9)(typescript@5.6.2)) + tailwindcss: 3.4.13(ts-node@10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(typescript@5.6.2)) - tailwindcss-animate@1.0.7(tailwindcss@3.4.13(ts-node@10.9.2(@types/node@22.7.3)(typescript@5.6.2))): + tailwindcss-animate@1.0.7(tailwindcss@3.4.13(ts-node@10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@22.7.3)(typescript@5.6.2))): dependencies: - tailwindcss: 3.4.13(ts-node@10.9.2(@types/node@22.7.3)(typescript@5.6.2)) + tailwindcss: 3.4.13(ts-node@10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@22.7.3)(typescript@5.6.2)) - tailwindcss@3.4.13(ts-node@10.9.2(@swc/core@1.7.28)(@types/node@20.16.9)(typescript@5.6.2)): + tailwindcss@3.4.13(ts-node@10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(typescript@5.6.2)): dependencies: '@alloc/quick-lru': 5.2.0 arg: 5.0.2 @@ -34440,7 +34413,7 @@ snapshots: postcss: 8.4.47 postcss-import: 15.1.0(postcss@8.4.47) postcss-js: 4.0.1(postcss@8.4.47) - postcss-load-config: 4.0.2(postcss@8.4.47)(ts-node@10.9.2(@swc/core@1.7.28)(@types/node@20.16.9)(typescript@5.6.2)) + postcss-load-config: 4.0.2(postcss@8.4.47)(ts-node@10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(typescript@5.6.2)) postcss-nested: 6.2.0(postcss@8.4.47) postcss-selector-parser: 6.1.2 resolve: 1.22.8 @@ -34448,7 +34421,7 @@ snapshots: transitivePeerDependencies: - ts-node - tailwindcss@3.4.13(ts-node@10.9.2(@types/node@22.7.3)(typescript@5.6.2)): + tailwindcss@3.4.13(ts-node@10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@22.7.3)(typescript@5.6.2)): dependencies: '@alloc/quick-lru': 5.2.0 arg: 5.0.2 @@ -34467,7 +34440,7 @@ snapshots: postcss: 8.4.47 postcss-import: 15.1.0(postcss@8.4.47) postcss-js: 4.0.1(postcss@8.4.47) - postcss-load-config: 4.0.2(postcss@8.4.47)(ts-node@10.9.2(@types/node@22.7.3)(typescript@5.6.2)) + postcss-load-config: 4.0.2(postcss@8.4.47)(ts-node@10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@22.7.3)(typescript@5.6.2)) postcss-nested: 6.2.0(postcss@8.4.47) postcss-selector-parser: 6.1.2 resolve: 1.22.8 @@ -34523,48 +34496,39 @@ snapshots: term-size@2.2.1: {} - terser-webpack-plugin@5.3.10(@swc/core@1.7.28)(webpack@5.94.0(@swc/core@1.7.28)): + terser-webpack-plugin@5.3.10(@swc/core@1.7.28(@swc/helpers@0.5.5))(webpack@5.94.0(@swc/core@1.7.28(@swc/helpers@0.5.5))): dependencies: '@jridgewell/trace-mapping': 0.3.25 jest-worker: 27.5.1 schema-utils: 3.3.0 serialize-javascript: 6.0.2 terser: 5.34.0 - webpack: 5.94.0(@swc/core@1.7.28) + webpack: 5.94.0(@swc/core@1.7.28(@swc/helpers@0.5.5)) optionalDependencies: '@swc/core': 1.7.28(@swc/helpers@0.5.5) - terser-webpack-plugin@5.3.10(@swc/core@1.7.28)(webpack@5.95.0(@swc/core@1.7.28)(webpack-cli@5.1.4)): + terser-webpack-plugin@5.3.10(@swc/core@1.7.28(@swc/helpers@0.5.5))(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(webpack-cli@5.1.4)): dependencies: '@jridgewell/trace-mapping': 0.3.25 jest-worker: 27.5.1 schema-utils: 3.3.0 serialize-javascript: 6.0.2 terser: 5.34.0 - webpack: 5.95.0(@swc/core@1.7.28)(webpack-cli@5.1.4) + webpack: 5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(webpack-cli@5.1.4) optionalDependencies: '@swc/core': 1.7.28(@swc/helpers@0.5.5) - terser-webpack-plugin@5.3.10(@swc/core@1.7.28)(webpack@5.95.0(@swc/core@1.7.28)): + terser-webpack-plugin@5.3.10(@swc/core@1.7.28(@swc/helpers@0.5.5))(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))): dependencies: '@jridgewell/trace-mapping': 0.3.25 jest-worker: 27.5.1 schema-utils: 3.3.0 serialize-javascript: 6.0.2 terser: 5.34.0 - webpack: 5.95.0(@swc/core@1.7.28) + webpack: 5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5)) optionalDependencies: '@swc/core': 1.7.28(@swc/helpers@0.5.5) - terser-webpack-plugin@5.3.10(webpack@5.95.0): - dependencies: - '@jridgewell/trace-mapping': 0.3.25 - jest-worker: 27.5.1 - schema-utils: 3.3.0 - serialize-javascript: 6.0.2 - terser: 5.34.0 - webpack: 5.95.0 - terser@5.34.0: dependencies: '@jridgewell/source-map': 0.3.6 @@ -34709,12 +34673,12 @@ snapshots: ts-interface-checker@0.1.13: {} - ts-jest@29.2.5(@babel/core@7.25.2)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.25.2))(jest@29.7.0(@types/node@20.16.9)(babel-plugin-macros@3.1.0)(node-notifier@10.0.0)(ts-node@10.9.2(@types/node@20.16.9)(typescript@5.6.2)))(typescript@5.6.2): + ts-jest@29.2.5(@babel/core@7.25.2)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.25.2))(jest@29.7.0(@types/node@20.16.9)(babel-plugin-macros@3.1.0)(node-notifier@10.0.0)(ts-node@10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(typescript@5.6.2)))(typescript@5.6.2): dependencies: bs-logger: 0.2.6 ejs: 3.1.10 fast-json-stable-stringify: 2.1.0 - jest: 29.7.0(@types/node@20.16.9)(babel-plugin-macros@3.1.0)(node-notifier@10.0.0)(ts-node@10.9.2(@types/node@20.16.9)(typescript@5.6.2)) + jest: 29.7.0(@types/node@20.16.9)(babel-plugin-macros@3.1.0)(node-notifier@10.0.0)(ts-node@10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(typescript@5.6.2)) jest-util: 29.7.0 json5: 2.2.3 lodash.memoize: 4.1.2 @@ -34728,7 +34692,7 @@ snapshots: '@jest/types': 29.6.3 babel-jest: 29.7.0(@babel/core@7.25.2) - ts-loader@9.5.1(typescript@5.6.2)(webpack@5.95.0(@swc/core@1.7.28)(webpack-cli@5.1.4)): + ts-loader@9.5.1(typescript@5.6.2)(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(webpack-cli@5.1.4)): dependencies: chalk: 4.1.2 enhanced-resolve: 5.17.1 @@ -34736,9 +34700,9 @@ snapshots: semver: 7.6.3 source-map: 0.7.4 typescript: 5.6.2 - webpack: 5.95.0(@swc/core@1.7.28)(webpack-cli@5.1.4) + webpack: 5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(webpack-cli@5.1.4) - ts-loader@9.5.1(typescript@5.6.2)(webpack@5.95.0(@swc/core@1.7.28)): + ts-loader@9.5.1(typescript@5.6.2)(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))): dependencies: chalk: 4.1.2 enhanced-resolve: 5.17.1 @@ -34746,11 +34710,11 @@ snapshots: semver: 7.6.3 source-map: 0.7.4 typescript: 5.6.2 - webpack: 5.95.0(@swc/core@1.7.28) + webpack: 5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5)) ts-log@2.2.5: {} - ts-node@10.9.2(@swc/core@1.7.28)(@types/node@16.18.111)(typescript@5.1.6): + ts-node@10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@16.18.111)(typescript@5.1.6): dependencies: '@cspotcode/source-map-support': 0.8.1 '@tsconfig/node10': 1.0.11 @@ -34770,7 +34734,7 @@ snapshots: optionalDependencies: '@swc/core': 1.7.28(@swc/helpers@0.5.5) - ts-node@10.9.2(@swc/core@1.7.28)(@types/node@20.16.9)(typescript@5.6.2): + ts-node@10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(typescript@5.6.2): dependencies: '@cspotcode/source-map-support': 0.8.1 '@tsconfig/node10': 1.0.11 @@ -34790,7 +34754,7 @@ snapshots: optionalDependencies: '@swc/core': 1.7.28(@swc/helpers@0.5.5) - ts-node@10.9.2(@types/node@22.7.3)(typescript@5.6.2): + ts-node@10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@22.7.3)(typescript@5.6.2): dependencies: '@cspotcode/source-map-support': 0.8.1 '@tsconfig/node10': 1.0.11 @@ -34807,6 +34771,8 @@ snapshots: typescript: 5.6.2 v8-compile-cache-lib: 3.0.1 yn: 3.1.1 + optionalDependencies: + '@swc/core': 1.7.28(@swc/helpers@0.5.5) optional: true ts-retry-promise@0.8.1: {} @@ -34976,14 +34942,14 @@ snapshots: transitivePeerDependencies: - supports-color - typescript-json-schema@0.64.0(@swc/core@1.7.28): + typescript-json-schema@0.64.0(@swc/core@1.7.28(@swc/helpers@0.5.5)): dependencies: '@types/json-schema': 7.0.15 '@types/node': 16.18.111 glob: 7.2.3 path-equal: 1.2.5 safe-stable-stringify: 2.5.0 - ts-node: 10.9.2(@swc/core@1.7.28)(@types/node@16.18.111)(typescript@5.1.6) + ts-node: 10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@16.18.111)(typescript@5.1.6) typescript: 5.1.6 yargs: 17.7.2 transitivePeerDependencies: @@ -35224,14 +35190,14 @@ snapshots: dependencies: punycode: 2.3.1 - url-loader@4.1.1(file-loader@6.2.0(webpack@5.95.0))(webpack@5.95.0): + url-loader@4.1.1(file-loader@6.2.0(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))))(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))): dependencies: loader-utils: 2.0.4 mime-types: 2.1.35 schema-utils: 3.3.0 - webpack: 5.95.0 + webpack: 5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5)) optionalDependencies: - file-loader: 6.2.0(webpack@5.95.0) + file-loader: 6.2.0(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))) url-parse@1.5.10: dependencies: @@ -35978,9 +35944,9 @@ snapshots: webpack-cli@5.1.4(webpack@5.95.0): dependencies: '@discoveryjs/json-ext': 0.5.7 - '@webpack-cli/configtest': 2.1.1(webpack-cli@5.1.4(webpack@5.95.0))(webpack@5.95.0(@swc/core@1.7.28)(webpack-cli@5.1.4)) - '@webpack-cli/info': 2.0.2(webpack-cli@5.1.4(webpack@5.95.0))(webpack@5.95.0(@swc/core@1.7.28)(webpack-cli@5.1.4)) - '@webpack-cli/serve': 2.0.5(webpack-cli@5.1.4(webpack@5.95.0))(webpack@5.95.0(@swc/core@1.7.28)(webpack-cli@5.1.4)) + '@webpack-cli/configtest': 2.1.1(webpack-cli@5.1.4(webpack@5.95.0))(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(webpack-cli@5.1.4)) + '@webpack-cli/info': 2.0.2(webpack-cli@5.1.4(webpack@5.95.0))(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(webpack-cli@5.1.4)) + '@webpack-cli/serve': 2.0.5(webpack-cli@5.1.4(webpack@5.95.0))(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(webpack-cli@5.1.4)) colorette: 2.0.20 commander: 10.0.1 cross-spawn: 7.0.5 @@ -35989,19 +35955,19 @@ snapshots: import-local: 3.2.0 interpret: 3.1.1 rechoir: 0.8.0 - webpack: 5.95.0(@swc/core@1.7.28)(webpack-cli@5.1.4) + webpack: 5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(webpack-cli@5.1.4) webpack-merge: 5.10.0 - webpack-dev-middleware@5.3.4(webpack@5.95.0): + webpack-dev-middleware@5.3.4(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))): dependencies: colorette: 2.0.20 memfs: 3.5.3 mime-types: 2.1.35 range-parser: 1.2.1 schema-utils: 4.2.0 - webpack: 5.95.0 + webpack: 5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5)) - webpack-dev-server@4.15.2(webpack@5.95.0): + webpack-dev-server@4.15.2(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))): dependencies: '@types/bonjour': 3.5.13 '@types/connect-history-api-fallback': 1.5.4 @@ -36031,10 +35997,10 @@ snapshots: serve-index: 1.9.1 sockjs: 0.3.24 spdy: 4.0.2 - webpack-dev-middleware: 5.3.4(webpack@5.95.0) + webpack-dev-middleware: 5.3.4(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))) ws: 8.18.0 optionalDependencies: - webpack: 5.95.0 + webpack: 5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5)) transitivePeerDependencies: - bufferutil - debug @@ -36053,37 +36019,7 @@ snapshots: webpack-virtual-modules@0.6.2: {} - webpack@5.94.0(@swc/core@1.7.28): - dependencies: - '@types/estree': 1.0.6 - '@webassemblyjs/ast': 1.12.1 - '@webassemblyjs/wasm-edit': 1.12.1 - '@webassemblyjs/wasm-parser': 1.12.1 - acorn: 8.12.1 - acorn-import-attributes: 1.9.5(acorn@8.12.1) - browserslist: 4.24.0 - chrome-trace-event: 1.0.4 - enhanced-resolve: 5.17.1 - es-module-lexer: 1.5.4 - eslint-scope: 5.1.1 - events: 3.3.0 - glob-to-regexp: 0.4.1 - graceful-fs: 4.2.11 - json-parse-even-better-errors: 2.3.1 - loader-runner: 4.3.0 - mime-types: 2.1.35 - neo-async: 2.6.2 - schema-utils: 3.3.0 - tapable: 2.2.1 - terser-webpack-plugin: 5.3.10(@swc/core@1.7.28)(webpack@5.94.0(@swc/core@1.7.28)) - watchpack: 2.4.2 - webpack-sources: 3.2.3 - transitivePeerDependencies: - - '@swc/core' - - esbuild - - uglify-js - - webpack@5.95.0: + webpack@5.94.0(@swc/core@1.7.28(@swc/helpers@0.5.5)): dependencies: '@types/estree': 1.0.6 '@webassemblyjs/ast': 1.12.1 @@ -36105,7 +36041,7 @@ snapshots: neo-async: 2.6.2 schema-utils: 3.3.0 tapable: 2.2.1 - terser-webpack-plugin: 5.3.10(webpack@5.95.0) + terser-webpack-plugin: 5.3.10(@swc/core@1.7.28(@swc/helpers@0.5.5))(webpack@5.94.0(@swc/core@1.7.28(@swc/helpers@0.5.5))) watchpack: 2.4.2 webpack-sources: 3.2.3 transitivePeerDependencies: @@ -36113,7 +36049,7 @@ snapshots: - esbuild - uglify-js - webpack@5.95.0(@swc/core@1.7.28): + webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5)): dependencies: '@types/estree': 1.0.6 '@webassemblyjs/ast': 1.12.1 @@ -36135,7 +36071,7 @@ snapshots: neo-async: 2.6.2 schema-utils: 3.3.0 tapable: 2.2.1 - terser-webpack-plugin: 5.3.10(@swc/core@1.7.28)(webpack@5.95.0(@swc/core@1.7.28)) + terser-webpack-plugin: 5.3.10(@swc/core@1.7.28(@swc/helpers@0.5.5))(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))) watchpack: 2.4.2 webpack-sources: 3.2.3 transitivePeerDependencies: @@ -36143,7 +36079,7 @@ snapshots: - esbuild - uglify-js - webpack@5.95.0(@swc/core@1.7.28)(webpack-cli@5.1.4): + webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(webpack-cli@5.1.4): dependencies: '@types/estree': 1.0.6 '@webassemblyjs/ast': 1.12.1 @@ -36165,7 +36101,7 @@ snapshots: neo-async: 2.6.2 schema-utils: 3.3.0 tapable: 2.2.1 - terser-webpack-plugin: 5.3.10(@swc/core@1.7.28)(webpack@5.95.0(@swc/core@1.7.28)(webpack-cli@5.1.4)) + terser-webpack-plugin: 5.3.10(@swc/core@1.7.28(@swc/helpers@0.5.5))(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(webpack-cli@5.1.4)) watchpack: 2.4.2 webpack-sources: 3.2.3 optionalDependencies: @@ -36175,13 +36111,13 @@ snapshots: - esbuild - uglify-js - webpackbar@5.0.2(webpack@5.95.0): + webpackbar@5.0.2(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))): dependencies: chalk: 4.1.2 consola: 2.15.3 pretty-time: 1.1.0 std-env: 3.7.0 - webpack: 5.95.0 + webpack: 5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5)) websocket-driver@0.7.4: dependencies: From 82ffdcce7cf3bed0d3288a9302fd8d8843fb028b Mon Sep 17 00:00:00 2001 From: Lucas Tortora <85233773+lucas-tortora@users.noreply.github.com> Date: Tue, 17 Dec 2024 13:07:09 -0300 Subject: [PATCH 66/97] task(devx): Switch to algolia search (#4447) * task(devx): Switch to algolia search * feat(devx): update pnpm-lock * fix(devx): remove typesense dep * fix(devx) update pnpm-lock --- docs/site/docusaurus.config.js | 24 +- docs/site/package.json | 1 - pnpm-lock.yaml | 671 +++------------------------------ 3 files changed, 62 insertions(+), 634 deletions(-) diff --git a/docs/site/docusaurus.config.js b/docs/site/docusaurus.config.js index feb04ab538a..df5b62b56b3 100644 --- a/docs/site/docusaurus.config.js +++ b/docs/site/docusaurus.config.js @@ -191,29 +191,15 @@ const config = { type: "text/css", }, ], - themes: ["@docusaurus/theme-mermaid", 'docusaurus-theme-search-typesense', + themes: ["@docusaurus/theme-mermaid", '@saucelabs/theme-github-codeblock', '@docusaurus/theme-live-codeblock'], themeConfig: /** @type {import('@docusaurus/preset-classic').ThemeConfig} */ ({ - typesense: { - // Replace this with the name of your index/collection. - // It should match the "index_name" entry in the scraper's "config.json" file. - typesenseCollectionName: 'IOTADocs', - typesenseServerConfig: { - nodes: [ - { - host: 'docs-search.iota.org', - port: '', - protocol: 'https', - }, - ], - apiKey: 'C!jA3iCujG*PjK!eUVWFBxnU', - }, - // Optional: Typesense search parameters: https://typesense.org/docs/0.24.0/api/search.html#search-parameters - typesenseSearchParameters: {}, - // Optional - contextualSearch: true, + algolia: { + apiKey: '24b141ea7e65db2181463e44dbe564a5', + appId: '9PMBZGRP3B', + indexName: 'iota', }, image: "img/iota-doc-og.png", docs: { diff --git a/docs/site/package.json b/docs/site/package.json index 3962ebe7ef2..d8d580fffdf 100644 --- a/docs/site/package.json +++ b/docs/site/package.json @@ -43,7 +43,6 @@ "axios": "^1.7.4", "clsx": "^2.1.1", "copy-text-to-clipboard": "^3.2.0", - "docusaurus-theme-search-typesense": "0.20.0-0", "dotenv": "^16.4.5", "graphql": "^16.9.0", "graphql-config": "^5.0.3", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 19bc39c4bca..9ec2db66a8f 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -60,7 +60,7 @@ importers: version: 9.1.0(eslint@8.57.1) eslint-import-resolver-typescript: specifier: ^3.6.1 - version: 3.6.3(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.30.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.6.2))(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.6.2))(eslint-plugin-import@2.30.0)(eslint@8.57.1))(eslint@8.57.1))(eslint@8.57.1) + version: 3.6.3(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.30.0)(eslint@8.57.1) eslint-plugin-header: specifier: ^3.1.1 version: 3.1.1(eslint@8.57.1) @@ -120,7 +120,7 @@ importers: version: link:../../sdk/typescript '@nestjs/cache-manager': specifier: ^2.2.2 - version: 2.2.2(@nestjs/common@10.4.4(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/core@10.4.4(@nestjs/common@10.4.4(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/platform-express@10.4.4)(reflect-metadata@0.2.2)(rxjs@7.8.1))(cache-manager@5.7.6)(rxjs@7.8.1) + version: 2.2.2(@nestjs/common@10.4.4(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/core@10.4.4)(cache-manager@5.7.6)(rxjs@7.8.1) '@nestjs/common': specifier: ^10.0.0 version: 10.4.4(reflect-metadata@0.2.2)(rxjs@7.8.1) @@ -135,7 +135,7 @@ importers: version: 10.4.4(@nestjs/common@10.4.4(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/core@10.4.4) '@nestjs/schedule': specifier: ^4.0.2 - version: 4.1.1(@nestjs/common@10.4.4(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/core@10.4.4(@nestjs/common@10.4.4(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/platform-express@10.4.4)(reflect-metadata@0.2.2)(rxjs@7.8.1)) + version: 4.1.1(@nestjs/common@10.4.4(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/core@10.4.4) cache-manager: specifier: ^5.6.1 version: 5.7.6 @@ -151,7 +151,7 @@ importers: version: 10.1.4(chokidar@3.6.0)(typescript@5.6.2) '@nestjs/testing': specifier: ^10.0.0 - version: 10.4.4(@nestjs/common@10.4.4(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/core@10.4.4(@nestjs/common@10.4.4(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/platform-express@10.4.4)(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/platform-express@10.4.4(@nestjs/common@10.4.4(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/core@10.4.4)) + version: 10.4.4(@nestjs/common@10.4.4(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/core@10.4.4)(@nestjs/platform-express@10.4.4) '@types/express': specifier: ^4.17.17 version: 4.17.21 @@ -911,7 +911,7 @@ importers: version: 0.10.7 '@types/webpack': specifier: ^5.28.1 - version: 5.28.5(@swc/core@1.7.28(@swc/helpers@0.5.5))(webpack-cli@5.1.4(webpack@5.95.0)) + version: 5.28.5(@swc/core@1.7.28(@swc/helpers@0.5.5))(webpack-cli@5.1.4) '@types/zxcvbn': specifier: ^4.4.1 version: 4.4.5 @@ -920,19 +920,19 @@ importers: version: 4.3.1(vite@5.4.8(@types/node@20.16.9)(sass@1.79.3)(terser@5.34.0)) copy-webpack-plugin: specifier: ^11.0.0 - version: 11.0.0(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(webpack-cli@5.1.4)) + version: 11.0.0(webpack@5.95.0) cross-env: specifier: ^7.0.3 version: 7.0.3 css-loader: specifier: ^6.7.3 - version: 6.11.0(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(webpack-cli@5.1.4)) + version: 6.11.0(webpack@5.95.0) dotenv: specifier: ^16.4.5 version: 16.4.5 eslint-webpack-plugin: specifier: ^4.0.1 - version: 4.2.0(eslint@8.57.1)(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(webpack-cli@5.1.4)) + version: 4.2.0(eslint@8.57.1)(webpack@5.95.0) git-rev-sync: specifier: ^3.0.2 version: 3.0.2 @@ -941,10 +941,10 @@ importers: version: 15.11.7 html-webpack-plugin: specifier: ^5.5.3 - version: 5.6.0(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(webpack-cli@5.1.4)) + version: 5.6.0(webpack@5.95.0) mini-css-extract-plugin: specifier: ^2.7.6 - version: 2.9.1(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(webpack-cli@5.1.4)) + version: 2.9.1(webpack@5.95.0) onchange: specifier: ^7.1.0 version: 7.1.0 @@ -953,7 +953,7 @@ importers: version: 8.4.47 postcss-loader: specifier: ^7.3.3 - version: 7.3.4(postcss@8.4.47)(typescript@5.6.2)(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(webpack-cli@5.1.4)) + version: 7.3.4(postcss@8.4.47)(typescript@5.6.2)(webpack@5.95.0) postcss-preset-env: specifier: ^9.0.0 version: 9.6.0(postcss@8.4.47) @@ -962,7 +962,7 @@ importers: version: 1.79.3 sass-loader: specifier: ^13.3.2 - version: 13.3.3(sass@1.79.3)(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(webpack-cli@5.1.4)) + version: 13.3.3(sass@1.79.3)(webpack@5.95.0) tailwindcss: specifier: ^3.3.3 version: 3.4.13(ts-node@10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(typescript@5.6.2)) @@ -971,7 +971,7 @@ importers: version: 1.0.7(tailwindcss@3.4.13(ts-node@10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(typescript@5.6.2))) ts-loader: specifier: ^9.4.4 - version: 9.5.1(typescript@5.6.2)(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(webpack-cli@5.1.4)) + version: 9.5.1(typescript@5.6.2)(webpack@5.95.0) ts-node: specifier: ^10.9.1 version: 10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(typescript@5.6.2) @@ -1384,9 +1384,6 @@ importers: copy-text-to-clipboard: specifier: ^3.2.0 version: 3.2.0 - docusaurus-theme-search-typesense: - specifier: 0.20.0-0 - version: 0.20.0-0(iea5eyhbiud2dlcqtud2g4pxzm) dotenv: specifier: ^16.4.5 version: 16.4.5 @@ -2067,9 +2064,6 @@ packages: '@adraffy/ens-normalize@1.11.0': resolution: {integrity: sha512-/3DDPKHqqIqxUULp8yP4zODUY1i+2xvVWsv8A79xGWdCAG+8sb0hRh0Rk2QyOJUnnbyPUAZYcpBuRe3nS2OIUg==} - '@algolia/autocomplete-core@1.8.2': - resolution: {integrity: sha512-mTeshsyFhAqw/ebqNsQpMtbnjr+qVOSKXArEj4K0d7sqc8It1XD0gkASwecm9mF/jlOQ4Z9RNg1HbdA8JPdRwQ==} - '@algolia/autocomplete-core@1.9.3': resolution: {integrity: sha512-009HdfugtGCdC4JdXUbVJClA0q0zh24yyePn+KUGk3rP7j8FEe/m5Yo/z65gn6nP/cM39PxpzqKrL7A6fP6PPw==} @@ -2078,21 +2072,12 @@ packages: peerDependencies: search-insights: '>= 1 < 3' - '@algolia/autocomplete-preset-algolia@1.8.2': - resolution: {integrity: sha512-J0oTx4me6ZM9kIKPuL3lyU3aB8DEvpVvR6xWmHVROx5rOYJGQcZsdG4ozxwcOyiiu3qxMkIbzntnV1S1VWD8yA==} - peerDependencies: - '@algolia/client-search': '>= 4.9.1 < 6' - algoliasearch: '>= 4.9.1 < 6' - '@algolia/autocomplete-preset-algolia@1.9.3': resolution: {integrity: sha512-d4qlt6YmrLMYy95n5TB52wtNDr6EgAIPH81dvvvW8UmuWRgxEtY0NJiPwl/h95JtG2vmRM804M0DSwMCNZlzRA==} peerDependencies: '@algolia/client-search': '>= 4.9.1 < 6' algoliasearch: '>= 4.9.1 < 6' - '@algolia/autocomplete-shared@1.8.2': - resolution: {integrity: sha512-b6Z/X4MczChMcfhk6kfRmBzPgjoPzuS9KGR4AFsiLulLNRAAqhP+xZTKtMnZGhLuc61I20d5WqlId02AZvcO6g==} - '@algolia/autocomplete-shared@1.9.3': resolution: {integrity: sha512-Wnm9E4Ye6Rl6sTTqjoymD+l8DjSTHsHboVRYrKgEt8Q7UHm9nYbqhN/i0fhUYA3OAEH7WA8x3jfpnmJm3rKvaQ==} peerDependencies: @@ -3313,14 +3298,6 @@ packages: search-insights: optional: true - '@docusaurus/core@3.4.0': - resolution: {integrity: sha512-g+0wwmN2UJsBqy2fQRQ6fhXruoEa62JDeEa5d8IdTJlMoaDaEDfHh7WjwGRn4opuTQWpjAwP/fbcgyHKlE+64w==} - engines: {node: '>=18.0'} - hasBin: true - peerDependencies: - react: ^18.0.0 - react-dom: ^18.0.0 - '@docusaurus/core@3.5.2': resolution: {integrity: sha512-4Z1WkhCSkX4KO0Fw5m/Vuc7Q3NxBG53NE5u59Rs96fWkMPZVSrzEPP16/Nk6cWb/shK7xXPndTmalJtw7twL/w==} engines: {node: '>=18.0'} @@ -3330,29 +3307,14 @@ packages: react: ^18.0.0 react-dom: ^18.0.0 - '@docusaurus/cssnano-preset@3.4.0': - resolution: {integrity: sha512-qwLFSz6v/pZHy/UP32IrprmH5ORce86BGtN0eBtG75PpzQJAzp9gefspox+s8IEOr0oZKuQ/nhzZ3xwyc3jYJQ==} - engines: {node: '>=18.0'} - '@docusaurus/cssnano-preset@3.5.2': resolution: {integrity: sha512-D3KiQXOMA8+O0tqORBrTOEQyQxNIfPm9jEaJoALjjSjc2M/ZAWcUfPQEnwr2JB2TadHw2gqWgpZckQmrVWkytA==} engines: {node: '>=18.0'} - '@docusaurus/logger@3.4.0': - resolution: {integrity: sha512-bZwkX+9SJ8lB9kVRkXw+xvHYSMGG4bpYHKGXeXFvyVc79NMeeBSGgzd4TQLHH+DYeOJoCdl8flrFJVxlZ0wo/Q==} - engines: {node: '>=18.0'} - '@docusaurus/logger@3.5.2': resolution: {integrity: sha512-LHC540SGkeLfyT3RHK3gAMK6aS5TRqOD4R72BEU/DE2M/TY8WwEUAMY576UUc/oNJXv8pGhBmQB6N9p3pt8LQw==} engines: {node: '>=18.0'} - '@docusaurus/mdx-loader@3.4.0': - resolution: {integrity: sha512-kSSbrrk4nTjf4d+wtBA9H+FGauf2gCax89kV8SUSJu3qaTdSIKdWERlngsiHaCFgZ7laTJ8a67UFf+xlFPtuTw==} - engines: {node: '>=18.0'} - peerDependencies: - react: ^18.0.0 - react-dom: ^18.0.0 - '@docusaurus/mdx-loader@3.5.2': resolution: {integrity: sha512-ku3xO9vZdwpiMIVd8BzWV0DCqGEbCP5zs1iHfKX50vw6jX8vQo0ylYo1YJMZyz6e+JFJ17HYHT5FzVidz2IflA==} engines: {node: '>=18.0'} @@ -3360,12 +3322,6 @@ packages: react: ^18.0.0 react-dom: ^18.0.0 - '@docusaurus/module-type-aliases@3.4.0': - resolution: {integrity: sha512-A1AyS8WF5Bkjnb8s+guTDuYmUiwJzNrtchebBHpc0gz0PyHJNMaybUlSrmJjHVcGrya0LKI4YcR3lBDQfXRYLw==} - peerDependencies: - react: '*' - react-dom: '*' - '@docusaurus/module-type-aliases@3.5.2': resolution: {integrity: sha512-Z+Xu3+2rvKef/YKTMxZHsEXp1y92ac0ngjDiExRdqGTmEKtCUpkbNYH8v5eXo5Ls+dnW88n6WTa+Q54kLOkwPg==} peerDependencies: @@ -3380,13 +3336,6 @@ packages: react: ^18.0.0 react-dom: ^18.0.0 - '@docusaurus/plugin-content-docs@3.4.0': - resolution: {integrity: sha512-HkUCZffhBo7ocYheD9oZvMcDloRnGhBMOZRyVcAQRFmZPmNqSyISlXA1tQCIxW+r478fty97XXAGjNYzBjpCsg==} - engines: {node: '>=18.0'} - peerDependencies: - react: ^18.0.0 - react-dom: ^18.0.0 - '@docusaurus/plugin-content-docs@3.5.2': resolution: {integrity: sha512-Bt+OXn/CPtVqM3Di44vHjE7rPCEsRCB/DMo2qoOuozB9f7+lsdrHvD0QCHdBs0uhz6deYJDppAr2VgqybKPlVQ==} engines: {node: '>=18.0'} @@ -3488,10 +3437,6 @@ packages: react: ^18.0.0 react-dom: ^18.0.0 - '@docusaurus/theme-translations@3.4.0': - resolution: {integrity: sha512-zSxCSpmQCCdQU5Q4CnX/ID8CSUUI3fvmq4hU/GNP/XoAWtXo9SAVnM3TzpU8Gb//H3WCsT8mJcTfyOk3d9ftNg==} - engines: {node: '>=18.0'} - '@docusaurus/theme-translations@3.5.2': resolution: {integrity: sha512-GPZLcu4aT1EmqSTmbdpVrDENGR2yObFEX8ssEFYTCiAIVc0EihNSdOIBTazUvgNqwvnoU1A8vIs1xyzc3LITTw==} engines: {node: '>=18.0'} @@ -3499,27 +3444,12 @@ packages: '@docusaurus/tsconfig@3.5.2': resolution: {integrity: sha512-rQ7toURCFnWAIn8ubcquDs0ewhPwviMzxh6WpRjBW7sJVCXb6yzwUaY3HMNa0VXCFw+qkIbFywrMTf+Pb4uHWQ==} - '@docusaurus/types@3.4.0': - resolution: {integrity: sha512-4jcDO8kXi5Cf9TcyikB/yKmz14f2RZ2qTRerbHAsS+5InE9ZgSLBNLsewtFTcTOXSVcbU3FoGOzcNWAmU1TR0A==} - peerDependencies: - react: ^18.0.0 - react-dom: ^18.0.0 - '@docusaurus/types@3.5.2': resolution: {integrity: sha512-N6GntLXoLVUwkZw7zCxwy9QiuEXIcTVzA9AkmNw16oc0AP3SXLrMmDMMBIfgqwuKWa6Ox6epHol9kMtJqekACw==} peerDependencies: react: ^18.0.0 react-dom: ^18.0.0 - '@docusaurus/utils-common@3.4.0': - resolution: {integrity: sha512-NVx54Wr4rCEKsjOH5QEVvxIqVvm+9kh7q8aYTU5WzUU9/Hctd6aTrcZ3G0Id4zYJ+AeaG5K5qHA4CY5Kcm2iyQ==} - engines: {node: '>=18.0'} - peerDependencies: - '@docusaurus/types': '*' - peerDependenciesMeta: - '@docusaurus/types': - optional: true - '@docusaurus/utils-common@3.5.2': resolution: {integrity: sha512-i0AZjHiRgJU6d7faQngIhuHKNrszpL/SHQPgF1zH4H+Ij6E9NBYGy6pkcGWToIv7IVPbs+pQLh1P3whn0gWXVg==} engines: {node: '>=18.0'} @@ -3529,23 +3459,10 @@ packages: '@docusaurus/types': optional: true - '@docusaurus/utils-validation@3.4.0': - resolution: {integrity: sha512-hYQ9fM+AXYVTWxJOT1EuNaRnrR2WGpRdLDQG07O8UOpsvCPWUVOeo26Rbm0JWY2sGLfzAb+tvJ62yF+8F+TV0g==} - engines: {node: '>=18.0'} - '@docusaurus/utils-validation@3.5.2': resolution: {integrity: sha512-m+Foq7augzXqB6HufdS139PFxDC5d5q2QKZy8q0qYYvGdI6nnlNsGH4cIGsgBnV7smz+mopl3g4asbSDvMV0jA==} engines: {node: '>=18.0'} - '@docusaurus/utils@3.4.0': - resolution: {integrity: sha512-fRwnu3L3nnWaXOgs88BVBmG1yGjcQqZNHG+vInhEa2Sz2oQB+ZjbEMO5Rh9ePFpZ0YDiDUhpaVjwmS+AU2F14g==} - engines: {node: '>=18.0'} - peerDependencies: - '@docusaurus/types': '*' - peerDependenciesMeta: - '@docusaurus/types': - optional: true - '@docusaurus/utils@3.5.2': resolution: {integrity: sha512-33QvcNFh+Gv+C2dP9Y9xWEzMgf3JzrpL2nW9PopidiohS1nDcyknKRx2DWaFvyVTTYIkkABVSr073VTj/NITNA==} engines: {node: '>=18.0'} @@ -8744,10 +8661,6 @@ packages: resolution: {integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==} engines: {node: '>=0.8'} - clsx@1.2.1: - resolution: {integrity: sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg==} - engines: {node: '>=6'} - clsx@2.0.0: resolution: {integrity: sha512-rQ1+kcj+ttHG0MKVGBUXwayCCF1oh39BF5COIpRzuCEv8Mwjv0XucrI2ExNTOn9IlLifGClWQcU9BrZORvtw6Q==} engines: {node: '>=6'} @@ -9630,15 +9543,6 @@ packages: peerDependencies: typedoc-plugin-markdown: '>=4.0.0' - docusaurus-theme-search-typesense@0.20.0-0: - resolution: {integrity: sha512-MW6fLJsZYfKKDRXC6pTe77OMhyQBishJO/L1M14hZymavKW2IyYFy+Mczp8TXL9QqvkLsW7Ja7YtnWXjmt5sCw==} - engines: {node: '>=18'} - peerDependencies: - '@docusaurus/core': 3.4.0 - '@docusaurus/theme-common': 3.4.0 - react: ^18.0.0 - react-dom: ^18.0.0 - dom-accessibility-api@0.5.16: resolution: {integrity: sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==} @@ -12126,10 +12030,6 @@ packages: resolution: {integrity: sha512-9ie8ItPR6tjY5uYJh8K/Zrv/RMZ5VOlOWvtZdEHYSTFKZfIBPQa9tOAEeAWhd+AnIneLJ22w5fjOYtoutpWq5w==} engines: {node: '>=18'} - loglevel@1.9.2: - resolution: {integrity: sha512-HgMmCqIJSAKqo68l0rS2AanEWfkxaZ5wNiEFb5ggm08lDs9Xl2KxBlX3PTcaD2chBM1gXAYf491/M2Rv8Jwayg==} - engines: {node: '>= 0.6.0'} - longest-streak@3.1.0: resolution: {integrity: sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==} @@ -15851,35 +15751,6 @@ packages: engines: {node: '>=14.17'} hasBin: true - typesense-docsearch-css@0.4.1: - resolution: {integrity: sha512-mN8K18pfIpCrhzsMAJBzoS7l/YDcC4P3f9vsScenUceXmC8n3FCPldmF10dKDJmK3Lr7aAScQt70jCA5126y2w==} - - typesense-docsearch-react@3.4.1: - resolution: {integrity: sha512-d0PQym/B/p5oP+hfdFEOH6goiKa1JLR63bikZSDGq1+jT2FtuwNrdMGVBZZMNFUsXVsJRA8ULHJpsREmfSJmVw==} - peerDependencies: - '@types/react': '>= 16.8.0 < 19.0.0' - react: '>= 16.8.0 < 19.0.0' - react-dom: '>= 16.8.0 < 19.0.0' - peerDependenciesMeta: - '@types/react': - optional: true - react: - optional: true - react-dom: - optional: true - - typesense-instantsearch-adapter@2.8.0: - resolution: {integrity: sha512-2q4QVpHoUV0ncf1XOqIC0dufOTkFRxQ0mHzg//H3WK02ZYqdNNPCAacZODhQlltl1cNJdTI8Y4uuGVd6fJuGzw==} - engines: {node: '>=16'} - peerDependencies: - '@babel/runtime': ^7.17.2 - - typesense@1.8.2: - resolution: {integrity: sha512-aBpePjA99Qvo+OP2pJwMpvga4Jrm1Y2oV5NsrWXBxlqUDNEUCPZBIksPv2Hq0jxQxHhLLyJVbjXjByXsvpCDVA==} - engines: {node: '>=18'} - peerDependencies: - '@babel/runtime': ^7.23.2 - ua-parser-js@1.0.39: resolution: {integrity: sha512-k24RCVWlEcjkdOxYmVJgeD/0a1TiSpqLg+ZalVGV9lsnr4yqu0w7tX/x2xX6G4zpkgQnRf89lxuZ1wsbjXM8lw==} hasBin: true @@ -16817,10 +16688,6 @@ snapshots: '@adraffy/ens-normalize@1.11.0': {} - '@algolia/autocomplete-core@1.8.2': - dependencies: - '@algolia/autocomplete-shared': 1.8.2 - '@algolia/autocomplete-core@1.9.3(@algolia/client-search@4.24.0)(algoliasearch@4.24.0)': dependencies: '@algolia/autocomplete-plugin-algolia-insights': 1.9.3(@algolia/client-search@4.24.0)(algoliasearch@4.24.0) @@ -16837,20 +16704,12 @@ snapshots: - '@algolia/client-search' - algoliasearch - '@algolia/autocomplete-preset-algolia@1.8.2(@algolia/client-search@4.24.0)(algoliasearch@4.24.0)': - dependencies: - '@algolia/autocomplete-shared': 1.8.2 - '@algolia/client-search': 4.24.0 - algoliasearch: 4.24.0 - '@algolia/autocomplete-preset-algolia@1.9.3(@algolia/client-search@4.24.0)(algoliasearch@4.24.0)': dependencies: '@algolia/autocomplete-shared': 1.9.3(@algolia/client-search@4.24.0)(algoliasearch@4.24.0) '@algolia/client-search': 4.24.0 algoliasearch: 4.24.0 - '@algolia/autocomplete-shared@1.8.2': {} - '@algolia/autocomplete-shared@1.9.3(@algolia/client-search@4.24.0)(algoliasearch@4.24.0)': dependencies: '@algolia/client-search': 4.24.0 @@ -18521,97 +18380,6 @@ snapshots: transitivePeerDependencies: - '@algolia/client-search' - '@docusaurus/core@3.4.0(@docusaurus/types@3.4.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16)': - dependencies: - '@babel/core': 7.25.2 - '@babel/generator': 7.25.6 - '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.25.2) - '@babel/plugin-transform-runtime': 7.25.4(@babel/core@7.25.2) - '@babel/preset-env': 7.25.4(@babel/core@7.25.2) - '@babel/preset-react': 7.24.7(@babel/core@7.25.2) - '@babel/preset-typescript': 7.24.7(@babel/core@7.25.2) - '@babel/runtime': 7.25.6 - '@babel/runtime-corejs3': 7.25.6 - '@babel/traverse': 7.25.6 - '@docusaurus/cssnano-preset': 3.4.0 - '@docusaurus/logger': 3.4.0 - '@docusaurus/mdx-loader': 3.4.0(@docusaurus/types@3.4.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2) - '@docusaurus/utils': 3.4.0(@docusaurus/types@3.4.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(typescript@5.6.2) - '@docusaurus/utils-common': 3.4.0(@docusaurus/types@3.4.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) - '@docusaurus/utils-validation': 3.4.0(@docusaurus/types@3.4.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(typescript@5.6.2) - autoprefixer: 10.4.20(postcss@8.4.47) - babel-loader: 9.2.1(@babel/core@7.25.2)(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))) - babel-plugin-dynamic-import-node: 2.3.3 - boxen: 6.2.1 - chalk: 4.1.2 - chokidar: 3.6.0 - clean-css: 5.3.3 - cli-table3: 0.6.5 - combine-promises: 1.2.0 - commander: 5.1.0 - copy-webpack-plugin: 11.0.0(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))) - core-js: 3.38.1 - css-loader: 6.11.0(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))) - css-minimizer-webpack-plugin: 5.0.1(clean-css@5.3.3)(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))) - cssnano: 6.1.2(postcss@8.4.47) - del: 6.1.1 - detect-port: 1.6.1 - escape-html: 1.0.3 - eta: 2.2.0 - eval: 0.1.8 - file-loader: 6.2.0(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))) - fs-extra: 11.2.0 - html-minifier-terser: 7.2.0 - html-tags: 3.3.1 - html-webpack-plugin: 5.6.0(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))) - leven: 3.1.0 - lodash: 4.17.21 - mini-css-extract-plugin: 2.9.1(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))) - p-map: 4.0.0 - postcss: 8.4.47 - postcss-loader: 7.3.4(postcss@8.4.47)(typescript@5.6.2)(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))) - prompts: 2.4.2 - react: 18.3.1 - react-dev-utils: 12.0.1(eslint@8.57.1)(typescript@5.6.2)(vue-template-compiler@2.7.16)(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))) - react-dom: 18.3.1(react@18.3.1) - react-helmet-async: 1.3.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - react-loadable: '@docusaurus/react-loadable@6.0.0(react@18.3.1)' - react-loadable-ssr-addon-v5-slorber: 1.0.1(@docusaurus/react-loadable@6.0.0(react@18.3.1))(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))) - react-router: 5.3.4(react@18.3.1) - react-router-config: 5.1.1(react-router@5.3.4(react@18.3.1))(react@18.3.1) - react-router-dom: 5.3.4(react@18.3.1) - rtl-detect: 1.1.2 - semver: 7.6.3 - serve-handler: 6.1.5 - shelljs: 0.8.5 - terser-webpack-plugin: 5.3.10(@swc/core@1.7.28(@swc/helpers@0.5.5))(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))) - tslib: 2.7.0 - update-notifier: 6.0.2 - url-loader: 4.1.1(file-loader@6.2.0(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))))(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))) - webpack: 5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5)) - webpack-bundle-analyzer: 4.10.2 - webpack-dev-server: 4.15.2(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))) - webpack-merge: 5.10.0 - webpackbar: 5.0.2(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))) - transitivePeerDependencies: - - '@docusaurus/types' - - '@parcel/css' - - '@rspack/core' - - '@swc/core' - - '@swc/css' - - bufferutil - - csso - - debug - - esbuild - - eslint - - lightningcss - - supports-color - - typescript - - uglify-js - - utf-8-validate - - vue-template-compiler - - webpack-cli - '@docusaurus/core@3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16)': dependencies: '@babel/core': 7.25.2 @@ -18704,13 +18472,6 @@ snapshots: - vue-template-compiler - webpack-cli - '@docusaurus/cssnano-preset@3.4.0': - dependencies: - cssnano-preset-advanced: 6.1.2(postcss@8.4.47) - postcss: 8.4.47 - postcss-sort-media-queries: 5.2.0(postcss@8.4.47) - tslib: 2.7.0 - '@docusaurus/cssnano-preset@3.5.2': dependencies: cssnano-preset-advanced: 6.1.2(postcss@8.4.47) @@ -18718,53 +18479,11 @@ snapshots: postcss-sort-media-queries: 5.2.0(postcss@8.4.47) tslib: 2.7.0 - '@docusaurus/logger@3.4.0': - dependencies: - chalk: 4.1.2 - tslib: 2.7.0 - '@docusaurus/logger@3.5.2': dependencies: chalk: 4.1.2 tslib: 2.7.0 - '@docusaurus/mdx-loader@3.4.0(@docusaurus/types@3.4.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)': - dependencies: - '@docusaurus/logger': 3.4.0 - '@docusaurus/utils': 3.4.0(@docusaurus/types@3.4.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(typescript@5.6.2) - '@docusaurus/utils-validation': 3.4.0(@docusaurus/types@3.4.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(typescript@5.6.2) - '@mdx-js/mdx': 3.0.1 - '@slorber/remark-comment': 1.0.0 - escape-html: 1.0.3 - estree-util-value-to-estree: 3.1.2 - file-loader: 6.2.0(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))) - fs-extra: 11.2.0 - image-size: 1.1.1 - mdast-util-mdx: 3.0.0 - mdast-util-to-string: 4.0.0 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - rehype-raw: 7.0.0 - remark-directive: 3.0.0 - remark-emoji: 4.0.1 - remark-frontmatter: 5.0.0 - remark-gfm: 4.0.0 - stringify-object: 3.3.0 - tslib: 2.7.0 - unified: 11.0.5 - unist-util-visit: 5.0.0 - url-loader: 4.1.1(file-loader@6.2.0(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))))(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))) - vfile: 6.0.3 - webpack: 5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5)) - transitivePeerDependencies: - - '@docusaurus/types' - - '@swc/core' - - esbuild - - supports-color - - typescript - - uglify-js - - webpack-cli - '@docusaurus/mdx-loader@3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)': dependencies: '@docusaurus/logger': 3.5.2 @@ -18802,24 +18521,6 @@ snapshots: - uglify-js - webpack-cli - '@docusaurus/module-type-aliases@3.4.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': - dependencies: - '@docusaurus/types': 3.4.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@types/history': 4.7.11 - '@types/react': 18.3.9 - '@types/react-router-config': 5.0.11 - '@types/react-router-dom': 5.3.3 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - react-helmet-async: 2.0.5(react@18.3.1) - react-loadable: '@docusaurus/react-loadable@6.0.0(react@18.3.1)' - transitivePeerDependencies: - - '@swc/core' - - esbuild - - supports-color - - uglify-js - - webpack-cli - '@docusaurus/module-type-aliases@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@docusaurus/types': 3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) @@ -18880,44 +18581,6 @@ snapshots: - vue-template-compiler - webpack-cli - '@docusaurus/plugin-content-docs@3.4.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16)': - dependencies: - '@docusaurus/core': 3.4.0(@docusaurus/types@3.4.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) - '@docusaurus/logger': 3.4.0 - '@docusaurus/mdx-loader': 3.4.0(@docusaurus/types@3.4.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2) - '@docusaurus/module-type-aliases': 3.4.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@docusaurus/types': 3.4.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@docusaurus/utils': 3.4.0(@docusaurus/types@3.4.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(typescript@5.6.2) - '@docusaurus/utils-common': 3.4.0(@docusaurus/types@3.4.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) - '@docusaurus/utils-validation': 3.4.0(@docusaurus/types@3.4.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(typescript@5.6.2) - '@types/react-router-config': 5.0.11 - combine-promises: 1.2.0 - fs-extra: 11.2.0 - js-yaml: 4.1.0 - lodash: 4.17.21 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - tslib: 2.7.0 - utility-types: 3.11.0 - webpack: 5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5)) - transitivePeerDependencies: - - '@parcel/css' - - '@rspack/core' - - '@swc/core' - - '@swc/css' - - bufferutil - - csso - - debug - - esbuild - - eslint - - lightningcss - - supports-color - - typescript - - uglify-js - - utf-8-validate - - vue-template-compiler - - webpack-cli - '@docusaurus/plugin-content-docs@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16)': dependencies: '@docusaurus/core': 3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) @@ -19368,11 +19031,6 @@ snapshots: - vue-template-compiler - webpack-cli - '@docusaurus/theme-translations@3.4.0': - dependencies: - fs-extra: 11.2.0 - tslib: 2.7.0 - '@docusaurus/theme-translations@3.5.2': dependencies: fs-extra: 11.2.0 @@ -19380,26 +19038,6 @@ snapshots: '@docusaurus/tsconfig@3.5.2': {} - '@docusaurus/types@3.4.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': - dependencies: - '@mdx-js/mdx': 3.0.1 - '@types/history': 4.7.11 - '@types/react': 18.3.9 - commander: 5.1.0 - joi: 17.13.3 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - react-helmet-async: 1.3.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - utility-types: 3.11.0 - webpack: 5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5)) - webpack-merge: 5.10.0 - transitivePeerDependencies: - - '@swc/core' - - esbuild - - supports-color - - uglify-js - - webpack-cli - '@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@mdx-js/mdx': 3.0.1 @@ -19420,62 +19058,12 @@ snapshots: - uglify-js - webpack-cli - '@docusaurus/utils-common@3.4.0(@docusaurus/types@3.4.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))': - dependencies: - tslib: 2.7.0 - optionalDependencies: - '@docusaurus/types': 3.4.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - - '@docusaurus/utils-common@3.4.0(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))': - dependencies: - tslib: 2.7.0 - optionalDependencies: - '@docusaurus/types': 3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@docusaurus/utils-common@3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))': dependencies: tslib: 2.7.0 optionalDependencies: '@docusaurus/types': 3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@docusaurus/utils-validation@3.4.0(@docusaurus/types@3.4.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(typescript@5.6.2)': - dependencies: - '@docusaurus/logger': 3.4.0 - '@docusaurus/utils': 3.4.0(@docusaurus/types@3.4.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(typescript@5.6.2) - '@docusaurus/utils-common': 3.4.0(@docusaurus/types@3.4.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) - fs-extra: 11.2.0 - joi: 17.13.3 - js-yaml: 4.1.0 - lodash: 4.17.21 - tslib: 2.7.0 - transitivePeerDependencies: - - '@docusaurus/types' - - '@swc/core' - - esbuild - - supports-color - - typescript - - uglify-js - - webpack-cli - - '@docusaurus/utils-validation@3.4.0(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(typescript@5.6.2)': - dependencies: - '@docusaurus/logger': 3.4.0 - '@docusaurus/utils': 3.4.0(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(typescript@5.6.2) - '@docusaurus/utils-common': 3.4.0(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) - fs-extra: 11.2.0 - joi: 17.13.3 - js-yaml: 4.1.0 - lodash: 4.17.21 - tslib: 2.7.0 - transitivePeerDependencies: - - '@docusaurus/types' - - '@swc/core' - - esbuild - - supports-color - - typescript - - uglify-js - - webpack-cli - '@docusaurus/utils-validation@3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(typescript@5.6.2)': dependencies: '@docusaurus/logger': 3.5.2 @@ -19495,70 +19083,6 @@ snapshots: - uglify-js - webpack-cli - '@docusaurus/utils@3.4.0(@docusaurus/types@3.4.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(typescript@5.6.2)': - dependencies: - '@docusaurus/logger': 3.4.0 - '@docusaurus/utils-common': 3.4.0(@docusaurus/types@3.4.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) - '@svgr/webpack': 8.1.0(typescript@5.6.2) - escape-string-regexp: 4.0.0 - file-loader: 6.2.0(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))) - fs-extra: 11.2.0 - github-slugger: 1.5.0 - globby: 11.1.0 - gray-matter: 4.0.3 - jiti: 1.21.6 - js-yaml: 4.1.0 - lodash: 4.17.21 - micromatch: 4.0.8 - prompts: 2.4.2 - resolve-pathname: 3.0.0 - shelljs: 0.8.5 - tslib: 2.7.0 - url-loader: 4.1.1(file-loader@6.2.0(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))))(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))) - utility-types: 3.11.0 - webpack: 5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5)) - optionalDependencies: - '@docusaurus/types': 3.4.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - transitivePeerDependencies: - - '@swc/core' - - esbuild - - supports-color - - typescript - - uglify-js - - webpack-cli - - '@docusaurus/utils@3.4.0(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(typescript@5.6.2)': - dependencies: - '@docusaurus/logger': 3.4.0 - '@docusaurus/utils-common': 3.4.0(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) - '@svgr/webpack': 8.1.0(typescript@5.6.2) - escape-string-regexp: 4.0.0 - file-loader: 6.2.0(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))) - fs-extra: 11.2.0 - github-slugger: 1.5.0 - globby: 11.1.0 - gray-matter: 4.0.3 - jiti: 1.21.6 - js-yaml: 4.1.0 - lodash: 4.17.21 - micromatch: 4.0.8 - prompts: 2.4.2 - resolve-pathname: 3.0.0 - shelljs: 0.8.5 - tslib: 2.7.0 - url-loader: 4.1.1(file-loader@6.2.0(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))))(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))) - utility-types: 3.11.0 - webpack: 5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5)) - optionalDependencies: - '@docusaurus/types': 3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - transitivePeerDependencies: - - '@swc/core' - - esbuild - - supports-color - - typescript - - uglify-js - - webpack-cli - '@docusaurus/utils@3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(typescript@5.6.2)': dependencies: '@docusaurus/logger': 3.5.2 @@ -21128,7 +20652,7 @@ snapshots: pump: 3.0.2 tar-fs: 2.1.1 - '@nestjs/cache-manager@2.2.2(@nestjs/common@10.4.4(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/core@10.4.4(@nestjs/common@10.4.4(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/platform-express@10.4.4)(reflect-metadata@0.2.2)(rxjs@7.8.1))(cache-manager@5.7.6)(rxjs@7.8.1)': + '@nestjs/cache-manager@2.2.2(@nestjs/common@10.4.4(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/core@10.4.4)(cache-manager@5.7.6)(rxjs@7.8.1)': dependencies: '@nestjs/common': 10.4.4(reflect-metadata@0.2.2)(rxjs@7.8.1) '@nestjs/core': 10.4.4(@nestjs/common@10.4.4(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/platform-express@10.4.4)(reflect-metadata@0.2.2)(rxjs@7.8.1) @@ -21207,7 +20731,7 @@ snapshots: transitivePeerDependencies: - supports-color - '@nestjs/schedule@4.1.1(@nestjs/common@10.4.4(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/core@10.4.4(@nestjs/common@10.4.4(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/platform-express@10.4.4)(reflect-metadata@0.2.2)(rxjs@7.8.1))': + '@nestjs/schedule@4.1.1(@nestjs/common@10.4.4(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/core@10.4.4)': dependencies: '@nestjs/common': 10.4.4(reflect-metadata@0.2.2)(rxjs@7.8.1) '@nestjs/core': 10.4.4(@nestjs/common@10.4.4(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/platform-express@10.4.4)(reflect-metadata@0.2.2)(rxjs@7.8.1) @@ -21236,7 +20760,7 @@ snapshots: transitivePeerDependencies: - chokidar - '@nestjs/testing@10.4.4(@nestjs/common@10.4.4(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/core@10.4.4(@nestjs/common@10.4.4(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/platform-express@10.4.4)(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/platform-express@10.4.4(@nestjs/common@10.4.4(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/core@10.4.4))': + '@nestjs/testing@10.4.4(@nestjs/common@10.4.4(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/core@10.4.4)(@nestjs/platform-express@10.4.4)': dependencies: '@nestjs/common': 10.4.4(reflect-metadata@0.2.2)(rxjs@7.8.1) '@nestjs/core': 10.4.4(@nestjs/common@10.4.4(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/platform-express@10.4.4)(reflect-metadata@0.2.2)(rxjs@7.8.1) @@ -24374,7 +23898,7 @@ snapshots: '@types/webextension-polyfill@0.10.7': {} - '@types/webpack@5.28.5(@swc/core@1.7.28(@swc/helpers@0.5.5))(webpack-cli@5.1.4(webpack@5.95.0))': + '@types/webpack@5.28.5(@swc/core@1.7.28(@swc/helpers@0.5.5))(webpack-cli@5.1.4)': dependencies: '@types/node': 20.16.9 tapable: 2.2.1 @@ -25153,17 +24677,17 @@ snapshots: '@webassemblyjs/ast': 1.12.1 '@xtuc/long': 4.2.2 - '@webpack-cli/configtest@2.1.1(webpack-cli@5.1.4(webpack@5.95.0))(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(webpack-cli@5.1.4))': + '@webpack-cli/configtest@2.1.1(webpack-cli@5.1.4)(webpack@5.95.0)': dependencies: webpack: 5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(webpack-cli@5.1.4) webpack-cli: 5.1.4(webpack@5.95.0) - '@webpack-cli/info@2.0.2(webpack-cli@5.1.4(webpack@5.95.0))(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(webpack-cli@5.1.4))': + '@webpack-cli/info@2.0.2(webpack-cli@5.1.4)(webpack@5.95.0)': dependencies: webpack: 5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(webpack-cli@5.1.4) webpack-cli: 5.1.4(webpack@5.95.0) - '@webpack-cli/serve@2.0.5(webpack-cli@5.1.4(webpack@5.95.0))(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(webpack-cli@5.1.4))': + '@webpack-cli/serve@2.0.5(webpack-cli@5.1.4)(webpack@5.95.0)': dependencies: webpack: 5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(webpack-cli@5.1.4) webpack-cli: 5.1.4(webpack@5.95.0) @@ -26265,8 +25789,6 @@ snapshots: clone@1.0.4: {} - clsx@1.2.1: {} - clsx@2.0.0: {} clsx@2.1.1: {} @@ -26459,7 +25981,7 @@ snapshots: copy-text-to-clipboard@3.2.0: {} - copy-webpack-plugin@11.0.0(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(webpack-cli@5.1.4)): + copy-webpack-plugin@11.0.0(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))): dependencies: fast-glob: 3.3.2 glob-parent: 6.0.2 @@ -26467,9 +25989,9 @@ snapshots: normalize-path: 3.0.0 schema-utils: 4.2.0 serialize-javascript: 6.0.2 - webpack: 5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(webpack-cli@5.1.4) + webpack: 5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5)) - copy-webpack-plugin@11.0.0(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))): + copy-webpack-plugin@11.0.0(webpack@5.95.0): dependencies: fast-glob: 3.3.2 glob-parent: 6.0.2 @@ -26477,7 +25999,7 @@ snapshots: normalize-path: 3.0.0 schema-utils: 4.2.0 serialize-javascript: 6.0.2 - webpack: 5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5)) + webpack: 5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(webpack-cli@5.1.4) core-js-compat@3.38.1: dependencies: @@ -26617,7 +26139,7 @@ snapshots: postcss-selector-parser: 6.1.2 postcss-value-parser: 4.2.0 - css-loader@6.11.0(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(webpack-cli@5.1.4)): + css-loader@6.11.0(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))): dependencies: icss-utils: 5.1.0(postcss@8.4.47) postcss: 8.4.47 @@ -26628,9 +26150,9 @@ snapshots: postcss-value-parser: 4.2.0 semver: 7.6.3 optionalDependencies: - webpack: 5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(webpack-cli@5.1.4) + webpack: 5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5)) - css-loader@6.11.0(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))): + css-loader@6.11.0(webpack@5.95.0): dependencies: icss-utils: 5.1.0(postcss@8.4.47) postcss: 8.4.47 @@ -26641,7 +26163,7 @@ snapshots: postcss-value-parser: 4.2.0 semver: 7.6.3 optionalDependencies: - webpack: 5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5)) + webpack: 5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(webpack-cli@5.1.4) css-minimizer-webpack-plugin@5.0.1(clean-css@5.3.3)(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))): dependencies: @@ -27200,49 +26722,6 @@ snapshots: dependencies: typedoc-plugin-markdown: 4.2.10(typedoc@0.26.11(typescript@5.6.2)) - docusaurus-theme-search-typesense@0.20.0-0(iea5eyhbiud2dlcqtud2g4pxzm): - dependencies: - '@docusaurus/core': 3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) - '@docusaurus/logger': 3.4.0 - '@docusaurus/plugin-content-docs': 3.4.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) - '@docusaurus/theme-common': 3.5.2(@docusaurus/plugin-content-docs@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16))(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2) - '@docusaurus/theme-translations': 3.4.0 - '@docusaurus/utils': 3.4.0(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(typescript@5.6.2) - '@docusaurus/utils-validation': 3.4.0(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(typescript@5.6.2) - algoliasearch-helper: 3.22.5(algoliasearch@4.24.0) - clsx: 1.2.1 - eta: 2.2.0 - fs-extra: 10.1.0 - lodash: 4.17.21 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - tslib: 2.7.0 - typesense-docsearch-react: 3.4.1(@algolia/client-search@4.24.0)(@babel/runtime@7.25.6)(@types/react@18.3.9)(algoliasearch@4.24.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - typesense-instantsearch-adapter: 2.8.0(@babel/runtime@7.25.6) - utility-types: 3.11.0 - transitivePeerDependencies: - - '@algolia/client-search' - - '@babel/runtime' - - '@docusaurus/types' - - '@parcel/css' - - '@rspack/core' - - '@swc/core' - - '@swc/css' - - '@types/react' - - algoliasearch - - bufferutil - - csso - - debug - - esbuild - - eslint - - lightningcss - - supports-color - - typescript - - uglify-js - - utf-8-validate - - vue-template-compiler - - webpack-cli - dom-accessibility-api@0.5.16: {} dom-accessibility-api@0.6.3: {} @@ -27624,7 +27103,7 @@ snapshots: '@typescript-eslint/parser': 6.21.0(eslint@8.57.1)(typescript@5.6.2) eslint: 8.57.1 eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.6.3(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.30.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.6.2))(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.6.2))(eslint-plugin-import@2.30.0)(eslint@8.57.1))(eslint@8.57.1))(eslint@8.57.1) + eslint-import-resolver-typescript: 3.6.3(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.30.0)(eslint@8.57.1) eslint-plugin-import: 2.30.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.6.2))(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.6.2))(eslint-plugin-import@2.30.0)(eslint@8.57.1))(eslint@8.57.1) eslint-plugin-jsx-a11y: 6.10.0(eslint@8.57.1) eslint-plugin-react: 7.37.0(eslint@8.57.1) @@ -27648,7 +27127,7 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.30.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.6.2))(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.6.2))(eslint-plugin-import@2.30.0)(eslint@8.57.1))(eslint@8.57.1))(eslint@8.57.1): + eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.30.0)(eslint@8.57.1): dependencies: '@nolyfill/is-core-module': 1.0.39 debug: 4.3.7(supports-color@8.1.1) @@ -27674,7 +27153,7 @@ snapshots: '@typescript-eslint/parser': 6.21.0(eslint@8.57.1)(typescript@5.6.2) eslint: 8.57.1 eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.6.3(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.30.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.6.2))(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.6.2))(eslint-plugin-import@2.30.0)(eslint@8.57.1))(eslint@8.57.1))(eslint@8.57.1) + eslint-import-resolver-typescript: 3.6.3(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.30.0)(eslint@8.57.1) transitivePeerDependencies: - supports-color @@ -27808,7 +27287,7 @@ snapshots: eslint-visitor-keys@4.1.0: {} - eslint-webpack-plugin@4.2.0(eslint@8.57.1)(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(webpack-cli@5.1.4)): + eslint-webpack-plugin@4.2.0(eslint@8.57.1)(webpack@5.95.0): dependencies: '@types/eslint': 8.56.12 eslint: 8.57.1 @@ -29112,7 +28591,7 @@ snapshots: html-void-elements@3.0.0: {} - html-webpack-plugin@5.6.0(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(webpack-cli@5.1.4)): + html-webpack-plugin@5.6.0(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))): dependencies: '@types/html-minifier-terser': 6.1.0 html-minifier-terser: 6.1.0 @@ -29120,9 +28599,9 @@ snapshots: pretty-error: 4.0.0 tapable: 2.2.1 optionalDependencies: - webpack: 5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(webpack-cli@5.1.4) + webpack: 5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5)) - html-webpack-plugin@5.6.0(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))): + html-webpack-plugin@5.6.0(webpack@5.95.0): dependencies: '@types/html-minifier-terser': 6.1.0 html-minifier-terser: 6.1.0 @@ -29130,7 +28609,7 @@ snapshots: pretty-error: 4.0.0 tapable: 2.2.1 optionalDependencies: - webpack: 5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5)) + webpack: 5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(webpack-cli@5.1.4) htmlparser2@6.1.0: dependencies: @@ -30454,8 +29933,6 @@ snapshots: strip-ansi: 7.1.0 wrap-ansi: 9.0.0 - loglevel@1.9.2: {} - longest-streak@3.1.0: {} loose-envify@1.4.0: @@ -31339,17 +30816,17 @@ snapshots: min-indent@1.0.1: {} - mini-css-extract-plugin@2.9.1(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(webpack-cli@5.1.4)): + mini-css-extract-plugin@2.9.1(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))): dependencies: schema-utils: 4.2.0 tapable: 2.2.1 - webpack: 5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(webpack-cli@5.1.4) + webpack: 5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5)) - mini-css-extract-plugin@2.9.1(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))): + mini-css-extract-plugin@2.9.1(webpack@5.95.0): dependencies: schema-utils: 4.2.0 tapable: 2.2.1 - webpack: 5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5)) + webpack: 5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(webpack-cli@5.1.4) mini-svg-data-uri@1.4.4: {} @@ -32302,23 +31779,23 @@ snapshots: postcss: 8.4.47 ts-node: 10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@22.7.3)(typescript@5.6.2) - postcss-loader@7.3.4(postcss@8.4.47)(typescript@5.6.2)(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(webpack-cli@5.1.4)): + postcss-loader@7.3.4(postcss@8.4.47)(typescript@5.6.2)(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))): dependencies: cosmiconfig: 8.3.6(typescript@5.6.2) jiti: 1.21.6 postcss: 8.4.47 semver: 7.6.3 - webpack: 5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(webpack-cli@5.1.4) + webpack: 5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5)) transitivePeerDependencies: - typescript - postcss-loader@7.3.4(postcss@8.4.47)(typescript@5.6.2)(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))): + postcss-loader@7.3.4(postcss@8.4.47)(typescript@5.6.2)(webpack@5.95.0): dependencies: cosmiconfig: 8.3.6(typescript@5.6.2) jiti: 1.21.6 postcss: 8.4.47 semver: 7.6.3 - webpack: 5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5)) + webpack: 5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(webpack-cli@5.1.4) transitivePeerDependencies: - typescript @@ -33653,7 +33130,7 @@ snapshots: safer-buffer@2.1.2: {} - sass-loader@13.3.3(sass@1.79.3)(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(webpack-cli@5.1.4)): + sass-loader@13.3.3(sass@1.79.3)(webpack@5.95.0): dependencies: neo-async: 2.6.2 webpack: 5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(webpack-cli@5.1.4) @@ -34507,25 +33984,25 @@ snapshots: optionalDependencies: '@swc/core': 1.7.28(@swc/helpers@0.5.5) - terser-webpack-plugin@5.3.10(@swc/core@1.7.28(@swc/helpers@0.5.5))(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(webpack-cli@5.1.4)): + terser-webpack-plugin@5.3.10(@swc/core@1.7.28(@swc/helpers@0.5.5))(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))): dependencies: '@jridgewell/trace-mapping': 0.3.25 jest-worker: 27.5.1 schema-utils: 3.3.0 serialize-javascript: 6.0.2 terser: 5.34.0 - webpack: 5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(webpack-cli@5.1.4) + webpack: 5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5)) optionalDependencies: '@swc/core': 1.7.28(@swc/helpers@0.5.5) - terser-webpack-plugin@5.3.10(@swc/core@1.7.28(@swc/helpers@0.5.5))(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))): + terser-webpack-plugin@5.3.10(@swc/core@1.7.28(@swc/helpers@0.5.5))(webpack@5.95.0): dependencies: '@jridgewell/trace-mapping': 0.3.25 jest-worker: 27.5.1 schema-utils: 3.3.0 serialize-javascript: 6.0.2 terser: 5.34.0 - webpack: 5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5)) + webpack: 5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(webpack-cli@5.1.4) optionalDependencies: '@swc/core': 1.7.28(@swc/helpers@0.5.5) @@ -34692,7 +34169,7 @@ snapshots: '@jest/types': 29.6.3 babel-jest: 29.7.0(@babel/core@7.25.2) - ts-loader@9.5.1(typescript@5.6.2)(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(webpack-cli@5.1.4)): + ts-loader@9.5.1(typescript@5.6.2)(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))): dependencies: chalk: 4.1.2 enhanced-resolve: 5.17.1 @@ -34700,9 +34177,9 @@ snapshots: semver: 7.6.3 source-map: 0.7.4 typescript: 5.6.2 - webpack: 5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(webpack-cli@5.1.4) + webpack: 5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5)) - ts-loader@9.5.1(typescript@5.6.2)(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))): + ts-loader@9.5.1(typescript@5.6.2)(webpack@5.95.0): dependencies: chalk: 4.1.2 enhanced-resolve: 5.17.1 @@ -34710,7 +34187,7 @@ snapshots: semver: 7.6.3 source-map: 0.7.4 typescript: 5.6.2 - webpack: 5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5)) + webpack: 5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(webpack-cli@5.1.4) ts-log@2.2.5: {} @@ -34966,40 +34443,6 @@ snapshots: typescript@5.6.2: {} - typesense-docsearch-css@0.4.1: {} - - typesense-docsearch-react@3.4.1(@algolia/client-search@4.24.0)(@babel/runtime@7.25.6)(@types/react@18.3.9)(algoliasearch@4.24.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1): - dependencies: - '@algolia/autocomplete-core': 1.8.2 - '@algolia/autocomplete-preset-algolia': 1.8.2(@algolia/client-search@4.24.0)(algoliasearch@4.24.0) - typesense: 1.8.2(@babel/runtime@7.25.6) - typesense-docsearch-css: 0.4.1 - typesense-instantsearch-adapter: 2.8.0(@babel/runtime@7.25.6) - optionalDependencies: - '@types/react': 18.3.9 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - transitivePeerDependencies: - - '@algolia/client-search' - - '@babel/runtime' - - algoliasearch - - debug - - typesense-instantsearch-adapter@2.8.0(@babel/runtime@7.25.6): - dependencies: - '@babel/runtime': 7.25.6 - typesense: 1.8.2(@babel/runtime@7.25.6) - transitivePeerDependencies: - - debug - - typesense@1.8.2(@babel/runtime@7.25.6): - dependencies: - '@babel/runtime': 7.25.6 - axios: 1.7.7(debug@4.3.7) - loglevel: 1.9.2 - transitivePeerDependencies: - - debug - ua-parser-js@1.0.39: {} uc.micro@2.1.0: {} @@ -35944,9 +35387,9 @@ snapshots: webpack-cli@5.1.4(webpack@5.95.0): dependencies: '@discoveryjs/json-ext': 0.5.7 - '@webpack-cli/configtest': 2.1.1(webpack-cli@5.1.4(webpack@5.95.0))(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(webpack-cli@5.1.4)) - '@webpack-cli/info': 2.0.2(webpack-cli@5.1.4(webpack@5.95.0))(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(webpack-cli@5.1.4)) - '@webpack-cli/serve': 2.0.5(webpack-cli@5.1.4(webpack@5.95.0))(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(webpack-cli@5.1.4)) + '@webpack-cli/configtest': 2.1.1(webpack-cli@5.1.4)(webpack@5.95.0) + '@webpack-cli/info': 2.0.2(webpack-cli@5.1.4)(webpack@5.95.0) + '@webpack-cli/serve': 2.0.5(webpack-cli@5.1.4)(webpack@5.95.0) colorette: 2.0.20 commander: 10.0.1 cross-spawn: 7.0.5 @@ -36101,7 +35544,7 @@ snapshots: neo-async: 2.6.2 schema-utils: 3.3.0 tapable: 2.2.1 - terser-webpack-plugin: 5.3.10(@swc/core@1.7.28(@swc/helpers@0.5.5))(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(webpack-cli@5.1.4)) + terser-webpack-plugin: 5.3.10(@swc/core@1.7.28(@swc/helpers@0.5.5))(webpack@5.95.0) watchpack: 2.4.2 webpack-sources: 3.2.3 optionalDependencies: From 070a6353f2f202473ac2fa58569df57fa4094804 Mon Sep 17 00:00:00 2001 From: cpl121 <100352899+cpl121@users.noreply.github.com> Date: Tue, 17 Dec 2024 18:19:13 +0100 Subject: [PATCH 67/97] chore(ts-sdk): regenerate graphql and json rpc to update comments (#4519) --- sdk/typescript/src/client/types/params.ts | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/sdk/typescript/src/client/types/params.ts b/sdk/typescript/src/client/types/params.ts index feb1c6ccf3c..6d6a88d5b48 100644 --- a/sdk/typescript/src/client/types/params.ts +++ b/sdk/typescript/src/client/types/params.ts @@ -326,7 +326,8 @@ export interface GetValidatorsApyParams {} /** Return list of events for a specified query criteria. */ export interface QueryEventsParams { /** - * The event query criteria. See [Event filter](https://docs.iota.org/developer/iota-101/using-events#applying-event-filters) + * The event query criteria. See + * [Event filter](https://docs.iota.org/developer/iota-101/using-events#applying-event-filters) * documentation for examples. */ query: RpcTypes.IotaEventFilter; @@ -353,7 +354,8 @@ export type QueryTransactionBlocksParams = { export interface SubscribeEventParams { /** * The filter criteria of the event stream. See - * [Event filter](https://docs.iota.org/developer/iota-101/using-events#applying-event-filters) documentation for examples. + * [Event filter](https://docs.iota.org/developer/iota-101/using-events#applying-event-filters) + * documentation for examples. */ filter: RpcTypes.IotaEventFilter; } From 504aa0b8c1e78004cf0a6db412ac892b70005674 Mon Sep 17 00:00:00 2001 From: evavirseda <evirseda@boxfish.studio> Date: Wed, 18 Dec 2024 09:09:54 +0100 Subject: [PATCH 68/97] feat(wallet-dashboard): style migration flow (#4510) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * feat(dashboard): add migration overview * feat: refine values * fix: update summarizeMigratableObjectValues function * feat(dashboard): add migratable object details * feat: add object details * fix: add missing type * feat: use react query to cache data * refactor: show expiration label correctly * feat: add missing asset fallback * feat: simplify code, add correct timestamps * fix: remove package id * fix: bring back missing logic * fix: remove unnecesary memos and improve skeleton * feat: create migration dialog * feat: style * perf: fetch objects in chunks * fix props * feat: refine dialog * feat: refine dialog styles * cleanup * fix import * feat: add totalStorageDepositReturnAmount * feat: fix virtual list and remove duplicated import * feat: update storage deposit return amount * fix format * feat: improve naming and make onSuccess not optional * feat: rmeove debris * feat: update names * feat: remove debris after merge * chore: rename function --------- Co-authored-by: JCNoguera <88061365+VmMad@users.noreply.github.com> Co-authored-by: Marc Espin <mespinsanz@gmail.com> Co-authored-by: Begoña Alvarez <balvarez@boxfish.studio> --- .../app/(protected)/migrations/page.tsx | 34 ++-- .../app/(protected)/vesting/page.tsx | 4 +- .../components/Dialogs/MigrationDialog.tsx | 176 ++++++++++++++++++ .../Dialogs/SendToken/SendTokenDialog.tsx | 6 +- .../components/Dialogs/index.ts | 1 + .../components/Popup/Popup.tsx | 31 --- .../components/Popup/PopupProvider.tsx | 29 --- .../components/Popup/Popups/MigratePopup.tsx | 115 ------------ .../components/Popup/index.ts | 5 - .../components/VirtualList.tsx | 11 +- .../account-balance/AccountBalance.tsx | 8 +- apps/wallet-dashboard/components/index.ts | 1 - .../wallet-dashboard/contexts/PopupContext.ts | 12 -- apps/wallet-dashboard/contexts/index.ts | 4 - apps/wallet-dashboard/hooks/index.ts | 1 - apps/wallet-dashboard/hooks/usePopups.ts | 9 - .../utils/migration/groupMigrationObjects.ts | 7 +- .../groupStardustObjectsByMigrationStatus.ts | 29 ++- .../providers/AppProviders.tsx | 10 +- 19 files changed, 241 insertions(+), 252 deletions(-) create mode 100644 apps/wallet-dashboard/components/Dialogs/MigrationDialog.tsx delete mode 100644 apps/wallet-dashboard/components/Popup/Popup.tsx delete mode 100644 apps/wallet-dashboard/components/Popup/PopupProvider.tsx delete mode 100644 apps/wallet-dashboard/components/Popup/Popups/MigratePopup.tsx delete mode 100644 apps/wallet-dashboard/components/Popup/index.ts delete mode 100644 apps/wallet-dashboard/contexts/PopupContext.ts delete mode 100644 apps/wallet-dashboard/contexts/index.ts delete mode 100644 apps/wallet-dashboard/hooks/usePopups.ts diff --git a/apps/wallet-dashboard/app/(protected)/migrations/page.tsx b/apps/wallet-dashboard/app/(protected)/migrations/page.tsx index acc5dd6f40c..e933cca2553 100644 --- a/apps/wallet-dashboard/app/(protected)/migrations/page.tsx +++ b/apps/wallet-dashboard/app/(protected)/migrations/page.tsx @@ -6,8 +6,7 @@ import { useState, useMemo, useCallback } from 'react'; import { useQueryClient } from '@tanstack/react-query'; import clsx from 'clsx'; -import MigratePopup from '@/components/Popup/Popups/MigratePopup'; -import { useGetStardustMigratableObjects, usePopups } from '@/hooks'; +import { useGetStardustMigratableObjects } from '@/hooks'; import { summarizeMigratableObjectValues, summarizeUnmigratableObjectValues } from '@/lib/utils'; import { Button, @@ -25,15 +24,14 @@ import { useCurrentAccount, useIotaClient } from '@iota/dapp-kit'; import { STARDUST_BASIC_OUTPUT_TYPE, STARDUST_NFT_OUTPUT_TYPE, useFormatCoin } from '@iota/core'; import { IOTA_TYPE_ARG } from '@iota/iota-sdk/utils'; import { StardustOutputMigrationStatus } from '@/lib/enums'; -import { MigrationObjectsPanel } from '@/components'; +import { MigrationObjectsPanel, MigrationDialog } from '@/components'; function MigrationDashboardPage(): JSX.Element { const account = useCurrentAccount(); const address = account?.address || ''; - const { openPopup, closePopup } = usePopups(); const queryClient = useQueryClient(); const iotaClient = useIotaClient(); - + const [isMigrationDialogOpen, setIsMigrationDialogOpen] = useState(false); const [selectedStardustObjectsCategory, setSelectedStardustObjectsCategory] = useState< StardustOutputMigrationStatus | undefined >(undefined); @@ -133,15 +131,8 @@ function MigrationDashboardPage(): JSX.Element { return []; }, [selectedStardustObjectsCategory, stardustMigrationObjects]); - function openMigratePopup(): void { - openPopup( - <MigratePopup - basicOutputObjects={migratableBasicOutputs} - nftOutputObjects={migratableNftOutputs} - closePopup={closePopup} - onSuccess={handleOnSuccess} - />, - ); + function openMigrationDialog(): void { + setIsMigrationDialogOpen(true); } function handleCloseDetailsPanel() { @@ -157,6 +148,19 @@ function MigrationDashboardPage(): JSX.Element { )} > <div className="flex w-1/3 flex-col gap-md--rs"> + {isMigrationDialogOpen && ( + <MigrationDialog + basicOutputObjects={migratableBasicOutputs} + nftOutputObjects={migratableNftOutputs} + onSuccess={handleOnSuccess} + open={isMigrationDialogOpen} + setOpen={setIsMigrationDialogOpen} + isTimelocked={ + selectedStardustObjectsCategory === + StardustOutputMigrationStatus.TimeLocked + } + /> + )} <Panel> <Title title="Migration" @@ -164,7 +168,7 @@ function MigrationDashboardPage(): JSX.Element { <Button text="Migrate All" disabled={!hasMigratableObjects} - onClick={openMigratePopup} + onClick={openMigrationDialog} size={ButtonSize.Small} /> } diff --git a/apps/wallet-dashboard/app/(protected)/vesting/page.tsx b/apps/wallet-dashboard/app/(protected)/vesting/page.tsx index 2b95cf643b9..cf53a40fe85 100644 --- a/apps/wallet-dashboard/app/(protected)/vesting/page.tsx +++ b/apps/wallet-dashboard/app/(protected)/vesting/page.tsx @@ -240,7 +240,7 @@ export default function VestingDashboardPage(): JSX.Element { openUnstakeDialog(UnstakeDialogView.TimelockedUnstake); } - function openReceiveTokenPopup(): void { + function openReceiveTokenDialog(): void { setIsVestingScheduleDialogOpen(true); } @@ -326,7 +326,7 @@ export default function VestingDashboardPage(): JSX.Element { /> <CardAction type={CardActionType.Button} - onClick={openReceiveTokenPopup} + onClick={openReceiveTokenDialog} title="See All" buttonType={ButtonType.Secondary} buttonDisabled={!vestingPortfolio} diff --git a/apps/wallet-dashboard/components/Dialogs/MigrationDialog.tsx b/apps/wallet-dashboard/components/Dialogs/MigrationDialog.tsx new file mode 100644 index 00000000000..f1f661c2db4 --- /dev/null +++ b/apps/wallet-dashboard/components/Dialogs/MigrationDialog.tsx @@ -0,0 +1,176 @@ +// Copyright (c) 2024 IOTA Stiftung +// SPDX-License-Identifier: Apache-2.0 + +import React from 'react'; +import { VirtualList } from '@/components'; +import { useCurrentAccount, useSignAndExecuteTransaction } from '@iota/dapp-kit'; +import { IotaObjectData } from '@iota/iota-sdk/client'; +import { useMigrationTransaction } from '@/hooks/useMigrationTransaction'; +import { + Button, + Dialog, + Header, + InfoBox, + InfoBoxStyle, + InfoBoxType, + KeyValueInfo, + LoadingIndicator, + Panel, + Title, + TitleSize, +} from '@iota/apps-ui-kit'; +import { useGroupedMigrationObjectsByExpirationDate } from '@/hooks'; +import { Loader, Warning } from '@iota/ui-icons'; +import { DialogLayout, DialogLayoutBody, DialogLayoutFooter } from './layout'; +import { MigrationObjectDetailsCard } from '../migration/migration-object-details-card'; +import { Collapsible, useFormatCoin } from '@iota/core'; +import { IOTA_TYPE_ARG } from '@iota/iota-sdk/utils'; +import { summarizeMigratableObjectValues } from '@/lib/utils'; +import toast from 'react-hot-toast'; + +interface MigrationDialogProps { + basicOutputObjects: IotaObjectData[] | undefined; + nftOutputObjects: IotaObjectData[] | undefined; + onSuccess: (digest: string) => void; + setOpen: (bool: boolean) => void; + open: boolean; + isTimelocked: boolean; +} + +export function MigrationDialog({ + basicOutputObjects = [], + nftOutputObjects = [], + onSuccess, + open, + setOpen, + isTimelocked, +}: MigrationDialogProps): JSX.Element { + const account = useCurrentAccount(); + const { + data: migrateData, + isPending: isMigrationPending, + isError: isMigrationError, + } = useMigrationTransaction(account?.address || '', basicOutputObjects, nftOutputObjects); + + const { + data: resolvedObjects = [], + isLoading, + error: isGroupedMigrationError, + } = useGroupedMigrationObjectsByExpirationDate( + [...basicOutputObjects, ...nftOutputObjects], + isTimelocked, + ); + + const { mutateAsync: signAndExecuteTransaction, isPending: isSendingTransaction } = + useSignAndExecuteTransaction(); + const { totalNotOwnedStorageDepositReturnAmount } = summarizeMigratableObjectValues({ + basicOutputs: basicOutputObjects, + nftOutputs: nftOutputObjects, + address: account?.address || '', + }); + + const [gasFee, gasFeeSymbol] = useFormatCoin(migrateData?.gasBudget, IOTA_TYPE_ARG); + const [totalStorageDepositReturnAmountFormatted, totalStorageDepositReturnAmountSymbol] = + useFormatCoin(totalNotOwnedStorageDepositReturnAmount.toString(), IOTA_TYPE_ARG); + + async function handleMigrate(): Promise<void> { + if (!migrateData) return; + signAndExecuteTransaction( + { + transaction: migrateData.transaction, + }, + { + onSuccess: (tx) => { + onSuccess(tx.digest); + }, + }, + ) + .then(() => { + toast.success('Migration transaction has been sent'); + }) + .catch(() => { + toast.error('Migration transaction was not sent'); + }); + } + + return ( + <Dialog open={open} onOpenChange={setOpen}> + <DialogLayout> + <Header title="Confirmation" onClose={() => setOpen(false)} titleCentered /> + <DialogLayoutBody> + <div className="flex h-full flex-col gap-y-md overflow-y-auto"> + {isGroupedMigrationError && !isLoading && ( + <InfoBox + title="Error" + supportingText="Failed to load migration objects" + style={InfoBoxStyle.Elevated} + type={InfoBoxType.Error} + icon={<Warning />} + /> + )} + {isLoading ? ( + <LoadingIndicator text="Loading migration objects" /> + ) : ( + <> + <Collapsible + defaultOpen + render={() => ( + <Title size={TitleSize.Small} title="Assets to Migrate" /> + )} + > + <div className="h-[600px] pb-md--rs"> + <VirtualList + heightClassName="h-full" + overflowClassName="overflow-y-auto" + items={resolvedObjects} + estimateSize={() => 58} + render={(migrationObject) => ( + <MigrationObjectDetailsCard + migrationObject={migrationObject} + isTimelocked={isTimelocked} + /> + )} + /> + </div> + </Collapsible> + <Panel hasBorder> + <div className="flex flex-col gap-y-sm p-md"> + <KeyValueInfo + keyText="Legacy storage deposit" + value={totalStorageDepositReturnAmountFormatted || '-'} + supportingLabel={totalStorageDepositReturnAmountSymbol} + fullwidth + /> + <KeyValueInfo + keyText="Gas Fees" + value={gasFee || '-'} + supportingLabel={gasFeeSymbol} + fullwidth + /> + </div> + </Panel> + </> + )} + </div> + </DialogLayoutBody> + <DialogLayoutFooter> + <Button + text="Migrate" + disabled={isMigrationPending || isMigrationError || isSendingTransaction} + onClick={handleMigrate} + icon={ + isMigrationPending || isSendingTransaction ? ( + <Loader + className="h-4 w-4 animate-spin" + data-testid="loading-indicator" + /> + ) : null + } + iconAfterText + fullWidth + /> + </DialogLayoutFooter> + </DialogLayout> + </Dialog> + ); +} diff --git a/apps/wallet-dashboard/components/Dialogs/SendToken/SendTokenDialog.tsx b/apps/wallet-dashboard/components/Dialogs/SendToken/SendTokenDialog.tsx index 913e362e27d..a33f018a09c 100644 --- a/apps/wallet-dashboard/components/Dialogs/SendToken/SendTokenDialog.tsx +++ b/apps/wallet-dashboard/components/Dialogs/SendToken/SendTokenDialog.tsx @@ -13,7 +13,7 @@ import { INITIAL_VALUES } from './constants'; import { IOTA_TYPE_ARG } from '@iota/iota-sdk/utils'; import { useTransferTransactionMutation } from '@/hooks'; -interface SendCoinPopupProps { +interface SendCoinDialogProps { coin: CoinBalance; activeAddress: string; setOpen: (bool: boolean) => void; @@ -30,7 +30,7 @@ function SendTokenDialogBody({ coin, activeAddress, setOpen, -}: SendCoinPopupProps): React.JSX.Element { +}: SendCoinDialogProps): React.JSX.Element { const [step, setStep] = useState<FormStep>(FormStep.EnterValues); const [selectedCoin, setSelectedCoin] = useState<CoinBalance>(coin); const [formData, setFormData] = useState<FormDataValues>(INITIAL_VALUES); @@ -125,7 +125,7 @@ function SendTokenDialogBody({ ); } -export function SendTokenDialog(props: SendCoinPopupProps) { +export function SendTokenDialog(props: SendCoinDialogProps) { return ( <Dialog open={props.open} onOpenChange={props.setOpen}> <DialogContent containerId="overlay-portal-container" position={DialogPosition.Right}> diff --git a/apps/wallet-dashboard/components/Dialogs/index.ts b/apps/wallet-dashboard/components/Dialogs/index.ts index 3987a39aabf..50ba05f1571 100644 --- a/apps/wallet-dashboard/components/Dialogs/index.ts +++ b/apps/wallet-dashboard/components/Dialogs/index.ts @@ -6,3 +6,4 @@ export * from './ReceiveFundsDialog'; export * from './Staking'; export * from './unstake'; export * from './vesting'; +export * from './MigrationDialog'; diff --git a/apps/wallet-dashboard/components/Popup/Popup.tsx b/apps/wallet-dashboard/components/Popup/Popup.tsx deleted file mode 100644 index e16a915882c..00000000000 --- a/apps/wallet-dashboard/components/Popup/Popup.tsx +++ /dev/null @@ -1,31 +0,0 @@ -// Copyright (c) 2024 IOTA Stiftung -// SPDX-License-Identifier: Apache-2.0 - -import React from 'react'; -import { usePopups } from '@/hooks'; - -function Popup(): JSX.Element { - const { popups, closePopup } = usePopups(); - - return ( - <> - {popups.map((popup, index) => ( - <div - key={index} - className="fixed left-0 top-0 z-[1000] flex h-full w-full items-center justify-center bg-black/20" - > - <div className="relative"> - <div className="absolute left-2/4 top-2/4 flex max-h-[80vh] min-w-[200px] -translate-x-2/4 -translate-y-2/4 flex-col gap-3 overflow-y-auto rounded-lg bg-white p-5 text-black"> - <button className="cursor-pointer self-end" onClick={closePopup}> - X - </button> - {popup} - </div> - </div> - </div> - ))} - </> - ); -} - -export default Popup; diff --git a/apps/wallet-dashboard/components/Popup/PopupProvider.tsx b/apps/wallet-dashboard/components/Popup/PopupProvider.tsx deleted file mode 100644 index 8eb6fbfc3a3..00000000000 --- a/apps/wallet-dashboard/components/Popup/PopupProvider.tsx +++ /dev/null @@ -1,29 +0,0 @@ -// Copyright (c) 2024 IOTA Stiftung -// SPDX-License-Identifier: Apache-2.0 -'use client'; -import { PopupContext } from '@/contexts'; -import React, { useState, ReactNode } from 'react'; - -interface PopupProviderProps { - children: ReactNode; -} - -function PopupProvider({ children }: PopupProviderProps): JSX.Element { - const [popups, setPopups] = useState<ReactNode[]>([]); - - const openPopup = (content: ReactNode) => { - setPopups((prevPopups) => [...prevPopups, content]); - }; - - const closePopup = () => { - setPopups((prevPopups) => prevPopups.slice(0, prevPopups.length - 1)); - }; - - return ( - <PopupContext.Provider value={{ popups, openPopup, closePopup }}> - {children} - </PopupContext.Provider> - ); -} - -export default PopupProvider; diff --git a/apps/wallet-dashboard/components/Popup/Popups/MigratePopup.tsx b/apps/wallet-dashboard/components/Popup/Popups/MigratePopup.tsx deleted file mode 100644 index e824e41a24d..00000000000 --- a/apps/wallet-dashboard/components/Popup/Popups/MigratePopup.tsx +++ /dev/null @@ -1,115 +0,0 @@ -// Copyright (c) 2024 IOTA Stiftung -// SPDX-License-Identifier: Apache-2.0 - -import React from 'react'; -import { VirtualList } from '@/components'; -import { - useCurrentAccount, - useIotaClientContext, - useSignAndExecuteTransaction, -} from '@iota/dapp-kit'; -import { getNetwork, IotaObjectData } from '@iota/iota-sdk/client'; -import { useMigrationTransaction } from '@/hooks/useMigrationTransaction'; -import { Button, InfoBox, InfoBoxStyle, InfoBoxType } from '@iota/apps-ui-kit'; -import { useNotifications } from '@/hooks'; -import { NotificationType } from '@/stores/notificationStore'; -import { Loader, Warning } from '@iota/ui-icons'; - -interface MigratePopupProps { - basicOutputObjects: IotaObjectData[] | undefined; - nftOutputObjects: IotaObjectData[] | undefined; - closePopup: () => void; - onSuccess?: (digest: string) => void; -} - -function MigratePopup({ - basicOutputObjects = [], - nftOutputObjects = [], - closePopup, - onSuccess, -}: MigratePopupProps): JSX.Element { - const account = useCurrentAccount(); - const { addNotification } = useNotifications(); - const { - data: migrateData, - isPending, - isError, - error, - } = useMigrationTransaction(account?.address || '', basicOutputObjects, nftOutputObjects); - - const { network } = useIotaClientContext(); - const { explorer } = getNetwork(network); - const { mutateAsync: signAndExecuteTransaction, isPending: isSendingTransaction } = - useSignAndExecuteTransaction(); - - async function handleMigrate(): Promise<void> { - if (!migrateData) return; - signAndExecuteTransaction( - { - transaction: migrateData.transaction, - }, - { - onSuccess: (tx) => { - if (onSuccess) { - onSuccess(tx.digest); - } - }, - }, - ) - .then(() => { - closePopup(); - addNotification('Migration transaction has been sent'); - }) - .catch(() => { - addNotification('Migration transaction was not sent', NotificationType.Error); - }); - } - - const virtualItem = (asset: IotaObjectData): JSX.Element => ( - <a href={`${explorer}/object/${asset.objectId}`} target="_blank" rel="noreferrer"> - {asset.objectId} - </a> - ); - return ( - <div className="flex min-w-[300px] flex-col gap-2"> - <div className="flex flex-col"> - <h1>Migratable Basic Outputs: {basicOutputObjects?.length}</h1> - <VirtualList - items={basicOutputObjects ?? []} - estimateSize={() => 30} - render={virtualItem} - /> - </div> - <div className="flex flex-col"> - <h1>Migratable Nft Outputs: {nftOutputObjects?.length}</h1> - <VirtualList - items={nftOutputObjects ?? []} - estimateSize={() => 30} - render={virtualItem} - /> - </div> - <p>Gas Fees: {migrateData?.gasBudget?.toString() || '--'}</p> - {isError ? ( - <InfoBox - type={InfoBoxType.Error} - title={error?.message || 'Error creating migration transcation'} - icon={<Warning />} - style={InfoBoxStyle.Elevated} - /> - ) : null} - <Button - text="Migrate" - disabled={isPending || isError || isSendingTransaction} - onClick={handleMigrate} - icon={ - isPending || isSendingTransaction ? ( - <Loader className="h-4 w-4 animate-spin" /> - ) : null - } - iconAfterText - /> - </div> - ); -} - -export default MigratePopup; diff --git a/apps/wallet-dashboard/components/Popup/index.ts b/apps/wallet-dashboard/components/Popup/index.ts deleted file mode 100644 index 8acf67167f9..00000000000 --- a/apps/wallet-dashboard/components/Popup/index.ts +++ /dev/null @@ -1,5 +0,0 @@ -// Copyright (c) 2024 IOTA Stiftung -// SPDX-License-Identifier: Apache-2.0 - -export { default as Popup } from './Popup'; -export { default as PopupProvider } from './PopupProvider'; diff --git a/apps/wallet-dashboard/components/VirtualList.tsx b/apps/wallet-dashboard/components/VirtualList.tsx index 54920f7d64c..58dc598a364 100644 --- a/apps/wallet-dashboard/components/VirtualList.tsx +++ b/apps/wallet-dashboard/components/VirtualList.tsx @@ -27,7 +27,7 @@ function VirtualList<T>({ estimateSize, render, onClick, - heightClassName = 'h-full', + heightClassName = 'h-fit', overflowClassName, }: VirtualListProps<T>): JSX.Element { const containerRef = React.useRef<HTMLDivElement | null>(null); @@ -56,14 +56,7 @@ function VirtualList<T>({ if (lastItem.index >= items.length - 1 && hasNextPage && !isFetchingNextPage) { fetchNextPage(); } - }, [ - hasNextPage, - fetchNextPage, - items.length, - isFetchingNextPage, - virtualizer, - virtualizer.getVirtualItems(), - ]); + }, [hasNextPage, fetchNextPage, items.length, isFetchingNextPage, virtualizer, virtualItems]); return ( <div diff --git a/apps/wallet-dashboard/components/account-balance/AccountBalance.tsx b/apps/wallet-dashboard/components/account-balance/AccountBalance.tsx index 151a46d473f..9bb3f297b27 100644 --- a/apps/wallet-dashboard/components/account-balance/AccountBalance.tsx +++ b/apps/wallet-dashboard/components/account-balance/AccountBalance.tsx @@ -22,11 +22,11 @@ export function AccountBalance() { const [isSendTokenDialogOpen, setIsSendTokenDialogOpen] = useState(false); const explorerLink = `${explorer}/address/${address}`; - function openSendTokenPopup(): void { + function openSendTokenDialog(): void { setIsSendTokenDialogOpen(true); } - function openReceiveTokenPopup(): void { + function openReceiveTokenDialog(): void { setIsReceiveDialogOpen(true); } @@ -56,7 +56,7 @@ export function AccountBalance() { </span> <div className="flex w-full max-w-56 gap-xs"> <Button - onClick={openSendTokenPopup} + onClick={openSendTokenDialog} text="Send" size={ButtonSize.Small} disabled={!address} @@ -64,7 +64,7 @@ export function AccountBalance() { fullWidth /> <Button - onClick={openReceiveTokenPopup} + onClick={openReceiveTokenDialog} type={ButtonType.Secondary} text="Receive" size={ButtonSize.Small} diff --git a/apps/wallet-dashboard/components/index.ts b/apps/wallet-dashboard/components/index.ts index f85f12e1beb..e39bf76a350 100644 --- a/apps/wallet-dashboard/components/index.ts +++ b/apps/wallet-dashboard/components/index.ts @@ -13,7 +13,6 @@ export * from './PaginationOptions'; export * from './account-balance/AccountBalance'; export * from './coins'; -export * from './Popup'; export * from './AppList'; export * from './Cards'; export * from './Buttons'; diff --git a/apps/wallet-dashboard/contexts/PopupContext.ts b/apps/wallet-dashboard/contexts/PopupContext.ts deleted file mode 100644 index ced7b13cc33..00000000000 --- a/apps/wallet-dashboard/contexts/PopupContext.ts +++ /dev/null @@ -1,12 +0,0 @@ -// Copyright (c) 2024 IOTA Stiftung -// SPDX-License-Identifier: Apache-2.0 - -import { ReactNode, createContext } from 'react'; - -export interface PopupManager { - popups: ReactNode[]; - openPopup: (content: ReactNode) => void; - closePopup: () => void; -} - -export const PopupContext = createContext<PopupManager>({} as PopupManager); diff --git a/apps/wallet-dashboard/contexts/index.ts b/apps/wallet-dashboard/contexts/index.ts deleted file mode 100644 index d356e2485ed..00000000000 --- a/apps/wallet-dashboard/contexts/index.ts +++ /dev/null @@ -1,4 +0,0 @@ -// Copyright (c) 2024 IOTA Stiftung -// SPDX-License-Identifier: Apache-2.0 - -export * from './PopupContext'; diff --git a/apps/wallet-dashboard/hooks/index.ts b/apps/wallet-dashboard/hooks/index.ts index 2bb5d86ba7e..2c8fed3331f 100644 --- a/apps/wallet-dashboard/hooks/index.ts +++ b/apps/wallet-dashboard/hooks/index.ts @@ -2,7 +2,6 @@ // SPDX-License-Identifier: Apache-2.0 export * from './useNewUnstakeTransaction'; -export * from './usePopups'; export * from './useNewStakeTransaction'; export * from './useNotifications'; export * from './useSendCoinTransaction'; diff --git a/apps/wallet-dashboard/hooks/usePopups.ts b/apps/wallet-dashboard/hooks/usePopups.ts deleted file mode 100644 index b4867bbac73..00000000000 --- a/apps/wallet-dashboard/hooks/usePopups.ts +++ /dev/null @@ -1,9 +0,0 @@ -// Copyright (c) 2024 IOTA Stiftung -// SPDX-License-Identifier: Apache-2.0 - -import { PopupContext, PopupManager } from '@/contexts'; -import { useContext } from 'react'; - -export const usePopups = (): PopupManager => { - return useContext(PopupContext); -}; diff --git a/apps/wallet-dashboard/lib/utils/migration/groupMigrationObjects.ts b/apps/wallet-dashboard/lib/utils/migration/groupMigrationObjects.ts index 98badabacdd..73991f4ac09 100644 --- a/apps/wallet-dashboard/lib/utils/migration/groupMigrationObjects.ts +++ b/apps/wallet-dashboard/lib/utils/migration/groupMigrationObjects.ts @@ -16,7 +16,7 @@ import { STARDUST_BASIC_OUTPUT_TYPE, STARDUST_NFT_OUTPUT_TYPE, } from '@iota/core'; -import { extractMigrationOutputFields, extractStorageDepositReturnAmount } from '.'; +import { extractMigrationOutputFields, extractOwnedStorageDepositReturnAmount } from '.'; import { IotaClient, IotaObjectData } from '@iota/iota-sdk/client'; import { MIGRATION_OBJECT_WITHOUT_UC_KEY } from '@/lib/constants'; @@ -56,7 +56,10 @@ export async function groupMigrationObjectsByUnlockCondition( if (object.type === STARDUST_BASIC_OUTPUT_TYPE) { const existing = basicObjectMap.get(groupKey); - const gasReturn = extractStorageDepositReturnAmount(objectFields, currentAddress); + const gasReturn = extractOwnedStorageDepositReturnAmount( + objectFields, + currentAddress, + ); const newBalance = (existing ? existing.balance : 0n) + BigInt(objectFields.balance) + diff --git a/apps/wallet-dashboard/lib/utils/migration/groupStardustObjectsByMigrationStatus.ts b/apps/wallet-dashboard/lib/utils/migration/groupStardustObjectsByMigrationStatus.ts index c7aa8f0e784..b036aacf55c 100644 --- a/apps/wallet-dashboard/lib/utils/migration/groupStardustObjectsByMigrationStatus.ts +++ b/apps/wallet-dashboard/lib/utils/migration/groupStardustObjectsByMigrationStatus.ts @@ -52,6 +52,7 @@ interface MigratableObjectsData { totalNativeTokens: number; totalVisualAssets: number; totalIotaAmount: bigint; + totalNotOwnedStorageDepositReturnAmount: bigint; } interface SummarizeMigrationObjectParams { @@ -67,6 +68,7 @@ export function summarizeMigratableObjectValues({ }: SummarizeMigrationObjectParams): MigratableObjectsData { let totalNativeTokens = 0; let totalIotaAmount: bigint = 0n; + let totalNotOwnedStorageDepositReturnAmount: bigint = 0n; const totalVisualAssets = nftOutputs.length; const outputObjects = [...basicOutputs, ...nftOutputs]; @@ -76,10 +78,18 @@ export function summarizeMigratableObjectValues({ totalIotaAmount += BigInt(outputObjectFields.balance); totalNativeTokens += parseInt(outputObjectFields.native_tokens.fields.size); - totalIotaAmount += extractStorageDepositReturnAmount(outputObjectFields, address) || 0n; + totalIotaAmount += + extractOwnedStorageDepositReturnAmount(outputObjectFields, address) || 0n; + totalNotOwnedStorageDepositReturnAmount += + extractNotOwnedStorageDepositReturnAmount(outputObjectFields, address) || 0n; } - return { totalNativeTokens, totalVisualAssets, totalIotaAmount }; + return { + totalNativeTokens, + totalVisualAssets, + totalIotaAmount, + totalNotOwnedStorageDepositReturnAmount, + }; } interface UnmmigratableObjectsData { @@ -105,7 +115,7 @@ export function summarizeUnmigratableObjectValues({ return { totalUnmigratableObjects }; } -export function extractStorageDepositReturnAmount( +export function extractOwnedStorageDepositReturnAmount( { storage_deposit_return_uc }: CommonOutputObjectWithUc, address: string, ): bigint | null { @@ -127,3 +137,16 @@ export function extractMigrationOutputFields( } ).fields; } + +export function extractNotOwnedStorageDepositReturnAmount( + { storage_deposit_return_uc }: CommonOutputObjectWithUc, + address: string, +): bigint | null { + if ( + storage_deposit_return_uc?.fields && + storage_deposit_return_uc?.fields.return_address !== address + ) { + return BigInt(storage_deposit_return_uc?.fields.return_amount); + } + return null; +} diff --git a/apps/wallet-dashboard/providers/AppProviders.tsx b/apps/wallet-dashboard/providers/AppProviders.tsx index 27744398f86..68283c410ab 100644 --- a/apps/wallet-dashboard/providers/AppProviders.tsx +++ b/apps/wallet-dashboard/providers/AppProviders.tsx @@ -3,7 +3,7 @@ 'use client'; -import { PopupProvider, Toaster } from '@/components'; +import { Toaster } from '@/components'; import { GrowthBookProvider } from '@growthbook/growthbook-react'; import { IotaClientProvider, lightTheme, darkTheme, WalletProvider } from '@iota/dapp-kit'; import { getAllNetworks, getDefaultNetwork } from '@iota/iota-sdk/client'; @@ -11,7 +11,6 @@ import { QueryClient, QueryClientProvider } from '@tanstack/react-query'; import { useState } from 'react'; import { KioskClientProvider } from '@iota/core'; import { growthbook } from '@/lib/utils'; -import { Popup } from '@/components/Popup'; import { ThemeProvider } from '@iota/core'; growthbook.init(); @@ -39,11 +38,8 @@ export function AppProviders({ children }: React.PropsWithChildren) { ]} > <ThemeProvider appId="iota-dashboard"> - <PopupProvider> - {children} - <Toaster /> - <Popup /> - </PopupProvider> + {children} + <Toaster /> </ThemeProvider> </WalletProvider> </KioskClientProvider> From 0ae9833cfa1ccb8b3bf9731d57672ee3d579e430 Mon Sep 17 00:00:00 2001 From: Marc Espin <mespinsanz@gmail.com> Date: Wed, 18 Dec 2024 10:04:09 +0100 Subject: [PATCH 69/97] fix(explorer): Fix `not a correct flattenable data` for string arguments in txs (#4529) * fix(explorer): Fix 'not a correct flattenable data' for string arguments in txs * show them raw * fmt --- .../transaction-result/programmable-transaction-view/utils.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/apps/explorer/src/pages/transaction-result/programmable-transaction-view/utils.ts b/apps/explorer/src/pages/transaction-result/programmable-transaction-view/utils.ts index 92e2e32d939..e239ce3a86e 100644 --- a/apps/explorer/src/pages/transaction-result/programmable-transaction-view/utils.ts +++ b/apps/explorer/src/pages/transaction-result/programmable-transaction-view/utils.ts @@ -24,10 +24,11 @@ export function flattenIotaArguments(data: (IotaArgument | IotaArgument[])[]): s } else if ('NestedResult' in value) { return `NestedResult(${value.NestedResult[0]}, ${value.NestedResult[1]})`; } + } else if (typeof value === 'string') { + return value; } else { throw new Error('Not a correct flattenable data'); } - return ''; }) .join(', '); } From 01b20d610e08328f5b5b9b5ee52ab59a459d1ded Mon Sep 17 00:00:00 2001 From: Marc Espin <mespinsanz@gmail.com> Date: Wed, 18 Dec 2024 10:12:12 +0100 Subject: [PATCH 70/97] refactor(dashboard): Update NextJS to 14.2.15 (#4525) --- apps/wallet-dashboard/package.json | 2 +- pnpm-lock.yaml | 791 ++++++++++++++++------------- 2 files changed, 430 insertions(+), 363 deletions(-) diff --git a/apps/wallet-dashboard/package.json b/apps/wallet-dashboard/package.json index dfa1df8a693..9cff8865c4d 100644 --- a/apps/wallet-dashboard/package.json +++ b/apps/wallet-dashboard/package.json @@ -27,7 +27,7 @@ "@tanstack/react-virtual": "^3.5.0", "clsx": "^2.1.1", "formik": "^2.4.2", - "next": "14.2.10", + "next": "14.2.15", "react": "^18.3.1", "react-hot-toast": "^2.4.1", "zustand": "^4.4.1" diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 9ec2db66a8f..2d3181eaebb 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -60,13 +60,13 @@ importers: version: 9.1.0(eslint@8.57.1) eslint-import-resolver-typescript: specifier: ^3.6.1 - version: 3.6.3(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.30.0)(eslint@8.57.1) + version: 3.6.3(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.6.2))(eslint-plugin-import@2.30.0)(eslint@8.57.1) eslint-plugin-header: specifier: ^3.1.1 version: 3.1.1(eslint@8.57.1) eslint-plugin-import: specifier: ^2.29.1 - version: 2.30.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.6.2))(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.6.2))(eslint-plugin-import@2.30.0)(eslint@8.57.1))(eslint@8.57.1) + version: 2.30.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.6.2))(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.1) eslint-plugin-license-check: specifier: link:linting/license-check version: link:linting/license-check @@ -120,7 +120,7 @@ importers: version: link:../../sdk/typescript '@nestjs/cache-manager': specifier: ^2.2.2 - version: 2.2.2(@nestjs/common@10.4.4(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/core@10.4.4)(cache-manager@5.7.6)(rxjs@7.8.1) + version: 2.2.2(@nestjs/common@10.4.4(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/core@10.4.4(@nestjs/common@10.4.4(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/platform-express@10.4.4)(reflect-metadata@0.2.2)(rxjs@7.8.1))(cache-manager@5.7.6)(rxjs@7.8.1) '@nestjs/common': specifier: ^10.0.0 version: 10.4.4(reflect-metadata@0.2.2)(rxjs@7.8.1) @@ -135,7 +135,7 @@ importers: version: 10.4.4(@nestjs/common@10.4.4(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/core@10.4.4) '@nestjs/schedule': specifier: ^4.0.2 - version: 4.1.1(@nestjs/common@10.4.4(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/core@10.4.4) + version: 4.1.1(@nestjs/common@10.4.4(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/core@10.4.4(@nestjs/common@10.4.4(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/platform-express@10.4.4)(reflect-metadata@0.2.2)(rxjs@7.8.1)) cache-manager: specifier: ^5.6.1 version: 5.7.6 @@ -145,13 +145,13 @@ importers: devDependencies: '@nestjs/cli': specifier: ^10.0.0 - version: 10.4.5(@swc/core@1.7.28(@swc/helpers@0.5.5)) + version: 10.4.5(@swc/core@1.7.28) '@nestjs/schematics': specifier: ^10.0.0 version: 10.1.4(chokidar@3.6.0)(typescript@5.6.2) '@nestjs/testing': specifier: ^10.0.0 - version: 10.4.4(@nestjs/common@10.4.4(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/core@10.4.4)(@nestjs/platform-express@10.4.4) + version: 10.4.4(@nestjs/common@10.4.4(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/core@10.4.4(@nestjs/common@10.4.4(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/platform-express@10.4.4)(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/platform-express@10.4.4(@nestjs/common@10.4.4(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/core@10.4.4)) '@types/express': specifier: ^4.17.17 version: 4.17.21 @@ -181,7 +181,7 @@ importers: version: 5.2.1(@types/eslint@8.56.12)(eslint-config-prettier@9.1.0(eslint@8.57.1))(eslint@8.57.1)(prettier@3.3.3) jest: specifier: ^29.5.0 - version: 29.7.0(@types/node@20.16.9)(babel-plugin-macros@3.1.0)(node-notifier@10.0.0)(ts-node@10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(typescript@5.6.2)) + version: 29.7.0(@types/node@20.16.9)(babel-plugin-macros@3.1.0)(node-notifier@10.0.0)(ts-node@10.9.2(@types/node@20.16.9)(typescript@5.6.2)) prettier: specifier: ^3.3.1 version: 3.3.3 @@ -193,13 +193,13 @@ importers: version: 6.3.4 ts-jest: specifier: ^29.1.0 - version: 29.2.5(@babel/core@7.25.2)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.25.2))(jest@29.7.0(@types/node@20.16.9)(babel-plugin-macros@3.1.0)(node-notifier@10.0.0)(ts-node@10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(typescript@5.6.2)))(typescript@5.6.2) + version: 29.2.5(@babel/core@7.25.2)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.25.2))(jest@29.7.0(@types/node@20.16.9)(babel-plugin-macros@3.1.0)(node-notifier@10.0.0)(ts-node@10.9.2(@types/node@20.16.9)(typescript@5.6.2)))(typescript@5.6.2) ts-loader: specifier: ^9.4.4 - version: 9.5.1(typescript@5.6.2)(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))) + version: 9.5.1(typescript@5.6.2)(webpack@5.95.0(@swc/core@1.7.28)) ts-node: specifier: ^10.9.1 - version: 10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(typescript@5.6.2) + version: 10.9.2(@swc/core@1.7.28)(@types/node@20.16.9)(typescript@5.6.2) tsconfig-paths: specifier: ^4.2.0 version: 4.2.0 @@ -278,13 +278,13 @@ importers: devDependencies: '@headlessui/tailwindcss': specifier: ^0.1.3 - version: 0.1.3(tailwindcss@3.4.13(ts-node@10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@22.7.3)(typescript@5.6.2))) + version: 0.1.3(tailwindcss@3.4.13(ts-node@10.9.2(@types/node@22.7.3)(typescript@5.6.2))) '@tailwindcss/aspect-ratio': specifier: ^0.4.2 - version: 0.4.2(tailwindcss@3.4.13(ts-node@10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@22.7.3)(typescript@5.6.2))) + version: 0.4.2(tailwindcss@3.4.13(ts-node@10.9.2(@types/node@22.7.3)(typescript@5.6.2))) '@tailwindcss/forms': specifier: ^0.5.7 - version: 0.5.9(tailwindcss@3.4.13(ts-node@10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@22.7.3)(typescript@5.6.2))) + version: 0.5.9(tailwindcss@3.4.13(ts-node@10.9.2(@types/node@22.7.3)(typescript@5.6.2))) '@types/react': specifier: ^18.3.3 version: 18.3.9 @@ -296,7 +296,7 @@ importers: version: 8.4.47 tailwindcss: specifier: ^3.3.3 - version: 3.4.13(ts-node@10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@22.7.3)(typescript@5.6.2)) + version: 3.4.13(ts-node@10.9.2(@types/node@22.7.3)(typescript@5.6.2)) typescript: specifier: ^5.5.3 version: 5.6.2 @@ -519,7 +519,7 @@ importers: version: 2.0.8 tailwindcss: specifier: ^3.3.3 - version: 3.4.13(ts-node@10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(typescript@5.6.2)) + version: 3.4.13(ts-node@10.9.2(@swc/core@1.7.28)(@types/node@20.16.9)(typescript@5.6.2)) tsconfig-paths: specifier: ^4.2.0 version: 4.2.0 @@ -646,7 +646,7 @@ importers: version: 4.0.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@7.6.20) tailwindcss: specifier: ^3.3.3 - version: 3.4.13(ts-node@10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(typescript@5.6.2)) + version: 3.4.13(ts-node@10.9.2(@swc/core@1.7.28)(@types/node@20.16.9)(typescript@5.6.2)) typescript: specifier: ^5.5.3 version: 5.6.2 @@ -911,7 +911,7 @@ importers: version: 0.10.7 '@types/webpack': specifier: ^5.28.1 - version: 5.28.5(@swc/core@1.7.28(@swc/helpers@0.5.5))(webpack-cli@5.1.4) + version: 5.28.5(@swc/core@1.7.28)(webpack-cli@5.1.4(webpack@5.95.0)) '@types/zxcvbn': specifier: ^4.4.1 version: 4.4.5 @@ -920,19 +920,19 @@ importers: version: 4.3.1(vite@5.4.8(@types/node@20.16.9)(sass@1.79.3)(terser@5.34.0)) copy-webpack-plugin: specifier: ^11.0.0 - version: 11.0.0(webpack@5.95.0) + version: 11.0.0(webpack@5.95.0(@swc/core@1.7.28)(webpack-cli@5.1.4)) cross-env: specifier: ^7.0.3 version: 7.0.3 css-loader: specifier: ^6.7.3 - version: 6.11.0(webpack@5.95.0) + version: 6.11.0(webpack@5.95.0(@swc/core@1.7.28)(webpack-cli@5.1.4)) dotenv: specifier: ^16.4.5 version: 16.4.5 eslint-webpack-plugin: specifier: ^4.0.1 - version: 4.2.0(eslint@8.57.1)(webpack@5.95.0) + version: 4.2.0(eslint@8.57.1)(webpack@5.95.0(@swc/core@1.7.28)(webpack-cli@5.1.4)) git-rev-sync: specifier: ^3.0.2 version: 3.0.2 @@ -941,10 +941,10 @@ importers: version: 15.11.7 html-webpack-plugin: specifier: ^5.5.3 - version: 5.6.0(webpack@5.95.0) + version: 5.6.0(webpack@5.95.0(@swc/core@1.7.28)(webpack-cli@5.1.4)) mini-css-extract-plugin: specifier: ^2.7.6 - version: 2.9.1(webpack@5.95.0) + version: 2.9.1(webpack@5.95.0(@swc/core@1.7.28)(webpack-cli@5.1.4)) onchange: specifier: ^7.1.0 version: 7.1.0 @@ -953,7 +953,7 @@ importers: version: 8.4.47 postcss-loader: specifier: ^7.3.3 - version: 7.3.4(postcss@8.4.47)(typescript@5.6.2)(webpack@5.95.0) + version: 7.3.4(postcss@8.4.47)(typescript@5.6.2)(webpack@5.95.0(@swc/core@1.7.28)(webpack-cli@5.1.4)) postcss-preset-env: specifier: ^9.0.0 version: 9.6.0(postcss@8.4.47) @@ -962,19 +962,19 @@ importers: version: 1.79.3 sass-loader: specifier: ^13.3.2 - version: 13.3.3(sass@1.79.3)(webpack@5.95.0) + version: 13.3.3(sass@1.79.3)(webpack@5.95.0(@swc/core@1.7.28)(webpack-cli@5.1.4)) tailwindcss: specifier: ^3.3.3 - version: 3.4.13(ts-node@10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(typescript@5.6.2)) + version: 3.4.13(ts-node@10.9.2(@swc/core@1.7.28)(@types/node@20.16.9)(typescript@5.6.2)) tailwindcss-animate: specifier: ^1.0.7 - version: 1.0.7(tailwindcss@3.4.13(ts-node@10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(typescript@5.6.2))) + version: 1.0.7(tailwindcss@3.4.13(ts-node@10.9.2(@swc/core@1.7.28)(@types/node@20.16.9)(typescript@5.6.2))) ts-loader: specifier: ^9.4.4 - version: 9.5.1(typescript@5.6.2)(webpack@5.95.0) + version: 9.5.1(typescript@5.6.2)(webpack@5.95.0(@swc/core@1.7.28)(webpack-cli@5.1.4)) ts-node: specifier: ^10.9.1 - version: 10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(typescript@5.6.2) + version: 10.9.2(@swc/core@1.7.28)(@types/node@20.16.9)(typescript@5.6.2) tsconfig-paths: specifier: ^4.2.0 version: 4.2.0 @@ -995,7 +995,7 @@ importers: version: 7.12.0(body-parser@1.20.3) webpack: specifier: ^5.79.0 - version: 5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(webpack-cli@5.1.4) + version: 5.95.0(@swc/core@1.7.28)(webpack-cli@5.1.4) webpack-cli: specifier: ^5.0.1 version: 5.1.4(webpack@5.95.0) @@ -1042,8 +1042,8 @@ importers: specifier: ^2.4.2 version: 2.4.6(react@18.3.1) next: - specifier: 14.2.10 - version: 14.2.10(@babel/core@7.25.2)(@playwright/test@1.47.2)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.79.3) + specifier: 14.2.15 + version: 14.2.15(@babel/core@7.25.2)(@playwright/test@1.47.2)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.79.3) react: specifier: ^18.3.1 version: 18.3.1 @@ -1071,16 +1071,16 @@ importers: version: 14.2.3(eslint@8.57.1)(typescript@5.6.2) jest: specifier: ^29.5.0 - version: 29.7.0(@types/node@20.16.9)(babel-plugin-macros@3.1.0)(node-notifier@10.0.0)(ts-node@10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(typescript@5.6.2)) + version: 29.7.0(@types/node@20.16.9)(babel-plugin-macros@3.1.0)(node-notifier@10.0.0)(ts-node@10.9.2(@types/node@20.16.9)(typescript@5.6.2)) postcss: specifier: ^8.4.31 version: 8.4.47 tailwindcss: specifier: ^3.3.3 - version: 3.4.13(ts-node@10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(typescript@5.6.2)) + version: 3.4.13(ts-node@10.9.2(@swc/core@1.7.28)(@types/node@20.16.9)(typescript@5.6.2)) ts-jest: specifier: ^29.1.0 - version: 29.2.5(@babel/core@7.25.2)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.25.2))(jest@29.7.0(@types/node@20.16.9)(babel-plugin-macros@3.1.0)(node-notifier@10.0.0)(ts-node@10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(typescript@5.6.2)))(typescript@5.6.2) + version: 29.2.5(@babel/core@7.25.2)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.25.2))(jest@29.7.0(@types/node@20.16.9)(babel-plugin-macros@3.1.0)(node-notifier@10.0.0)(ts-node@10.9.2(@types/node@20.16.9)(typescript@5.6.2)))(typescript@5.6.2) typescript: specifier: ^5.5.3 version: 5.6.2 @@ -1120,7 +1120,7 @@ importers: devDependencies: '@headlessui/tailwindcss': specifier: ^0.1.3 - version: 0.1.3(tailwindcss@3.4.13(ts-node@10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@22.7.3)(typescript@5.6.2))) + version: 0.1.3(tailwindcss@3.4.13(ts-node@10.9.2(@types/node@22.7.3)(typescript@5.6.2))) '@types/react': specifier: ^18.3.3 version: 18.3.9 @@ -1138,7 +1138,7 @@ importers: version: 8.4.47 tailwindcss: specifier: ^3.3.3 - version: 3.4.13(ts-node@10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@22.7.3)(typescript@5.6.2)) + version: 3.4.13(ts-node@10.9.2(@types/node@22.7.3)(typescript@5.6.2)) typescript: specifier: ^5.5.3 version: 5.6.2 @@ -1232,7 +1232,7 @@ importers: devDependencies: '@tailwindcss/forms': specifier: ^0.5.7 - version: 0.5.9(tailwindcss@3.4.13(ts-node@10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@22.7.3)(typescript@5.6.2))) + version: 0.5.9(tailwindcss@3.4.13(ts-node@10.9.2(@types/node@22.7.3)(typescript@5.6.2))) '@tsconfig/docusaurus': specifier: ^2.0.3 version: 2.0.3 @@ -1253,10 +1253,10 @@ importers: version: 8.4.47 tailwindcss: specifier: ^3.3.3 - version: 3.4.13(ts-node@10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@22.7.3)(typescript@5.6.2)) + version: 3.4.13(ts-node@10.9.2(@types/node@22.7.3)(typescript@5.6.2)) tailwindcss-animate: specifier: ^1.0.7 - version: 1.0.7(tailwindcss@3.4.13(ts-node@10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@22.7.3)(typescript@5.6.2))) + version: 1.0.7(tailwindcss@3.4.13(ts-node@10.9.2(@types/node@22.7.3)(typescript@5.6.2))) typescript: specifier: ^5.5.3 version: 5.6.2 @@ -1302,7 +1302,7 @@ importers: version: 8.4.47 tailwindcss: specifier: ^3.3.3 - version: 3.4.13(ts-node@10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@22.7.3)(typescript@5.6.2)) + version: 3.4.13(ts-node@10.9.2(@types/node@22.7.3)(typescript@5.6.2)) typescript: specifier: ^5.5.3 version: 5.6.2 @@ -1323,25 +1323,25 @@ importers: version: 3.6.1(@algolia/client-search@4.24.0)(@types/react@18.3.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@docusaurus/core': specifier: 3.5.2 - version: 3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) + version: 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) '@docusaurus/preset-classic': specifier: 3.5.2 - version: 3.5.2(@algolia/client-search@4.24.0)(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/react@18.3.9)(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) + version: 3.5.2(@algolia/client-search@4.24.0)(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@types/react@18.3.9)(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) '@docusaurus/remark-plugin-npm2yarn': specifier: ^3.5.2 version: 3.5.2 '@docusaurus/theme-common': specifier: ^3.5.2 - version: 3.5.2(@docusaurus/plugin-content-docs@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16))(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2) + version: 3.5.2(@docusaurus/plugin-content-docs@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16))(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2) '@docusaurus/theme-live-codeblock': specifier: ^3.5.2 - version: 3.5.2(@docusaurus/plugin-content-docs@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16))(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) + version: 3.5.2(@docusaurus/plugin-content-docs@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16))(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) '@docusaurus/theme-mermaid': specifier: ^3.5.2 - version: 3.5.2(@docusaurus/plugin-content-docs@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) + version: 3.5.2(@docusaurus/plugin-content-docs@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) '@docusaurus/theme-search-algolia': specifier: ^3.5.2 - version: 3.5.2(@algolia/client-search@4.24.0)(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/react@18.3.9)(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) + version: 3.5.2(@algolia/client-search@4.24.0)(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@types/react@18.3.9)(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) '@emotion/react': specifier: ^11.11.4 version: 11.13.3(@types/react@18.3.9)(react@18.3.1) @@ -1350,7 +1350,7 @@ importers: version: 11.13.0(@emotion/react@11.13.3(@types/react@18.3.9)(react@18.3.1))(@types/react@18.3.9)(react@18.3.1) '@graphql-markdown/docusaurus': specifier: ^1.24.1 - version: 1.26.2(@docusaurus/logger@3.5.2)(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(graphql-config@5.1.2(@types/node@22.7.3)(graphql@16.9.0)(typescript@5.6.2))(graphql@16.9.0)(prettier@3.3.3)(typescript@5.6.2) + version: 1.26.2(@docusaurus/logger@3.5.2)(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(graphql-config@5.1.2(@types/node@22.7.3)(graphql@16.9.0)(typescript@5.6.2))(graphql@16.9.0)(prettier@3.3.3)(typescript@5.6.2) '@graphql-tools/graphql-file-loader': specifier: ^8.0.1 version: 8.0.1(graphql@16.9.0) @@ -1446,7 +1446,7 @@ importers: version: 6.0.0 tailwindcss: specifier: ^3.3.3 - version: 3.4.13(ts-node@10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@22.7.3)(typescript@5.6.2)) + version: 3.4.13(ts-node@10.9.2(@types/node@22.7.3)(typescript@5.6.2)) web3: specifier: ^4.2.2 version: 4.13.0(typescript@5.6.2)(zod@3.23.8) @@ -1456,13 +1456,13 @@ importers: version: 7.25.2(@babel/core@7.25.2) '@docusaurus/module-type-aliases': specifier: 3.5.2 - version: 3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@docusaurus/tsconfig': specifier: 3.5.2 version: 3.5.2 '@docusaurus/types': specifier: 3.5.2 - version: 3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@metamask/providers': specifier: ^10.2.1 version: 10.2.1 @@ -2040,7 +2040,7 @@ importers: version: 5.6.2 typescript-json-schema: specifier: ^0.64.0 - version: 0.64.0(@swc/core@1.7.28(@swc/helpers@0.5.5)) + version: 0.64.0(@swc/core@1.7.28) packages: @@ -4785,62 +4785,62 @@ packages: '@nestjs/platform-express': optional: true - '@next/env@14.2.10': - resolution: {integrity: sha512-dZIu93Bf5LUtluBXIv4woQw2cZVZ2DJTjax5/5DOs3lzEOeKLy7GxRSr4caK9/SCPdaW6bCgpye6+n4Dh9oJPw==} + '@next/env@14.2.15': + resolution: {integrity: sha512-S1qaj25Wru2dUpcIZMjxeMVSwkt8BK4dmWHHiBuRstcIyOsMapqT4A4jSB6onvqeygkSSmOkyny9VVx8JIGamQ==} '@next/eslint-plugin-next@14.2.3': resolution: {integrity: sha512-L3oDricIIjgj1AVnRdRor21gI7mShlSwU/1ZGHmqM3LzHhXXhdkrfeNY5zif25Bi5Dd7fiJHsbhoZCHfXYvlAw==} - '@next/swc-darwin-arm64@14.2.10': - resolution: {integrity: sha512-V3z10NV+cvMAfxQUMhKgfQnPbjw+Ew3cnr64b0lr8MDiBJs3eLnM6RpGC46nhfMZsiXgQngCJKWGTC/yDcgrDQ==} + '@next/swc-darwin-arm64@14.2.15': + resolution: {integrity: sha512-Rvh7KU9hOUBnZ9TJ28n2Oa7dD9cvDBKua9IKx7cfQQ0GoYUwg9ig31O2oMwH3wm+pE3IkAQ67ZobPfEgurPZIA==} engines: {node: '>= 10'} cpu: [arm64] os: [darwin] - '@next/swc-darwin-x64@14.2.10': - resolution: {integrity: sha512-Y0TC+FXbFUQ2MQgimJ/7Ina2mXIKhE7F+GUe1SgnzRmwFY3hX2z8nyVCxE82I2RicspdkZnSWMn4oTjIKz4uzA==} + '@next/swc-darwin-x64@14.2.15': + resolution: {integrity: sha512-5TGyjFcf8ampZP3e+FyCax5zFVHi+Oe7sZyaKOngsqyaNEpOgkKB3sqmymkZfowy3ufGA/tUgDPPxpQx931lHg==} engines: {node: '>= 10'} cpu: [x64] os: [darwin] - '@next/swc-linux-arm64-gnu@14.2.10': - resolution: {integrity: sha512-ZfQ7yOy5zyskSj9rFpa0Yd7gkrBnJTkYVSya95hX3zeBG9E55Z6OTNPn1j2BTFWvOVVj65C3T+qsjOyVI9DQpA==} + '@next/swc-linux-arm64-gnu@14.2.15': + resolution: {integrity: sha512-3Bwv4oc08ONiQ3FiOLKT72Q+ndEMyLNsc/D3qnLMbtUYTQAmkx9E/JRu0DBpHxNddBmNT5hxz1mYBphJ3mfrrw==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] - '@next/swc-linux-arm64-musl@14.2.10': - resolution: {integrity: sha512-n2i5o3y2jpBfXFRxDREr342BGIQCJbdAUi/K4q6Env3aSx8erM9VuKXHw5KNROK9ejFSPf0LhoSkU/ZiNdacpQ==} + '@next/swc-linux-arm64-musl@14.2.15': + resolution: {integrity: sha512-k5xf/tg1FBv/M4CMd8S+JL3uV9BnnRmoe7F+GWC3DxkTCD9aewFRH1s5rJ1zkzDa+Do4zyN8qD0N8c84Hu96FQ==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] - '@next/swc-linux-x64-gnu@14.2.10': - resolution: {integrity: sha512-GXvajAWh2woTT0GKEDlkVhFNxhJS/XdDmrVHrPOA83pLzlGPQnixqxD8u3bBB9oATBKB//5e4vpACnx5Vaxdqg==} + '@next/swc-linux-x64-gnu@14.2.15': + resolution: {integrity: sha512-kE6q38hbrRbKEkkVn62reLXhThLRh6/TvgSP56GkFNhU22TbIrQDEMrO7j0IcQHcew2wfykq8lZyHFabz0oBrA==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - '@next/swc-linux-x64-musl@14.2.10': - resolution: {integrity: sha512-opFFN5B0SnO+HTz4Wq4HaylXGFV+iHrVxd3YvREUX9K+xfc4ePbRrxqOuPOFjtSuiVouwe6uLeDtabjEIbkmDA==} + '@next/swc-linux-x64-musl@14.2.15': + resolution: {integrity: sha512-PZ5YE9ouy/IdO7QVJeIcyLn/Rc4ml9M2G4y3kCM9MNf1YKvFY4heg3pVa/jQbMro+tP6yc4G2o9LjAz1zxD7tQ==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - '@next/swc-win32-arm64-msvc@14.2.10': - resolution: {integrity: sha512-9NUzZuR8WiXTvv+EiU/MXdcQ1XUvFixbLIMNQiVHuzs7ZIFrJDLJDaOF1KaqttoTujpcxljM/RNAOmw1GhPPQQ==} + '@next/swc-win32-arm64-msvc@14.2.15': + resolution: {integrity: sha512-2raR16703kBvYEQD9HNLyb0/394yfqzmIeyp2nDzcPV4yPjqNUG3ohX6jX00WryXz6s1FXpVhsCo3i+g4RUX+g==} engines: {node: '>= 10'} cpu: [arm64] os: [win32] - '@next/swc-win32-ia32-msvc@14.2.10': - resolution: {integrity: sha512-fr3aEbSd1GeW3YUMBkWAu4hcdjZ6g4NBl1uku4gAn661tcxd1bHs1THWYzdsbTRLcCKLjrDZlNp6j2HTfrw+Bg==} + '@next/swc-win32-ia32-msvc@14.2.15': + resolution: {integrity: sha512-fyTE8cklgkyR1p03kJa5zXEaZ9El+kDNM5A+66+8evQS5e/6v0Gk28LqA0Jet8gKSOyP+OTm/tJHzMlGdQerdQ==} engines: {node: '>= 10'} cpu: [ia32] os: [win32] - '@next/swc-win32-x64-msvc@14.2.10': - resolution: {integrity: sha512-UjeVoRGKNL2zfbcQ6fscmgjBAS/inHBh63mjIlfPg/NG8Yn2ztqylXt5qilYb6hoHIwaU2ogHknHWWmahJjgZQ==} + '@next/swc-win32-x64-msvc@14.2.15': + resolution: {integrity: sha512-SzqGbsLsP9OwKNUG9nekShTwhj6JSB9ZLMWQ8g1gG6hdE5gQLncbnbymrwy2yVmH9nikSLYRYxYMFu78Ggp7/g==} engines: {node: '>= 10'} cpu: [x64] os: [win32] @@ -12681,8 +12681,8 @@ packages: neo-async@2.6.2: resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} - next@14.2.10: - resolution: {integrity: sha512-sDDExXnh33cY3RkS9JuFEKaS4HmlWmDKP1VJioucCG6z5KuA008DPsDZOzi8UfqEk3Ii+2NCQSJrfbEWtZZfww==} + next@14.2.15: + resolution: {integrity: sha512-h9ctmOokpoDphRvMGnwOJAedT6zKhwqyZML9mDtspgf4Rh3Pn7UTYKqePNoDvhsWBAO5GoPNYshnAUGIazVGmw==} engines: {node: '>=18.17.0'} hasBin: true peerDependencies: @@ -18380,7 +18380,7 @@ snapshots: transitivePeerDependencies: - '@algolia/client-search' - '@docusaurus/core@3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16)': + '@docusaurus/core@3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16)': dependencies: '@babel/core': 7.25.2 '@babel/generator': 7.25.6 @@ -18394,13 +18394,13 @@ snapshots: '@babel/traverse': 7.25.6 '@docusaurus/cssnano-preset': 3.5.2 '@docusaurus/logger': 3.5.2 - '@docusaurus/mdx-loader': 3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2) - '@docusaurus/utils': 3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(typescript@5.6.2) - '@docusaurus/utils-common': 3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) - '@docusaurus/utils-validation': 3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(typescript@5.6.2) + '@docusaurus/mdx-loader': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2) + '@docusaurus/utils': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.6.2) + '@docusaurus/utils-common': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + '@docusaurus/utils-validation': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.6.2) '@mdx-js/react': 3.0.1(@types/react@18.3.9)(react@18.3.1) autoprefixer: 10.4.20(postcss@8.4.47) - babel-loader: 9.2.1(@babel/core@7.25.2)(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))) + babel-loader: 9.2.1(@babel/core@7.25.2)(webpack@5.95.0) babel-plugin-dynamic-import-node: 2.3.3 boxen: 6.2.1 chalk: 4.1.2 @@ -18409,34 +18409,34 @@ snapshots: cli-table3: 0.6.5 combine-promises: 1.2.0 commander: 5.1.0 - copy-webpack-plugin: 11.0.0(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))) + copy-webpack-plugin: 11.0.0(webpack@5.95.0) core-js: 3.38.1 - css-loader: 6.11.0(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))) - css-minimizer-webpack-plugin: 5.0.1(clean-css@5.3.3)(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))) + css-loader: 6.11.0(webpack@5.95.0) + css-minimizer-webpack-plugin: 5.0.1(clean-css@5.3.3)(webpack@5.95.0) cssnano: 6.1.2(postcss@8.4.47) del: 6.1.1 detect-port: 1.6.1 escape-html: 1.0.3 eta: 2.2.0 eval: 0.1.8 - file-loader: 6.2.0(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))) + file-loader: 6.2.0(webpack@5.95.0) fs-extra: 11.2.0 html-minifier-terser: 7.2.0 html-tags: 3.3.1 - html-webpack-plugin: 5.6.0(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))) + html-webpack-plugin: 5.6.0(webpack@5.95.0) leven: 3.1.0 lodash: 4.17.21 - mini-css-extract-plugin: 2.9.1(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))) + mini-css-extract-plugin: 2.9.1(webpack@5.95.0) p-map: 4.0.0 postcss: 8.4.47 - postcss-loader: 7.3.4(postcss@8.4.47)(typescript@5.6.2)(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))) + postcss-loader: 7.3.4(postcss@8.4.47)(typescript@5.6.2)(webpack@5.95.0) prompts: 2.4.2 react: 18.3.1 - react-dev-utils: 12.0.1(eslint@8.57.1)(typescript@5.6.2)(vue-template-compiler@2.7.16)(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))) + react-dev-utils: 12.0.1(eslint@8.57.1)(typescript@5.6.2)(vue-template-compiler@2.7.16)(webpack@5.95.0) react-dom: 18.3.1(react@18.3.1) react-helmet-async: 1.3.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react-loadable: '@docusaurus/react-loadable@6.0.0(react@18.3.1)' - react-loadable-ssr-addon-v5-slorber: 1.0.1(@docusaurus/react-loadable@6.0.0(react@18.3.1))(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))) + react-loadable-ssr-addon-v5-slorber: 1.0.1(@docusaurus/react-loadable@6.0.0(react@18.3.1))(webpack@5.95.0) react-router: 5.3.4(react@18.3.1) react-router-config: 5.1.1(react-router@5.3.4(react@18.3.1))(react@18.3.1) react-router-dom: 5.3.4(react@18.3.1) @@ -18444,15 +18444,15 @@ snapshots: semver: 7.6.3 serve-handler: 6.1.5 shelljs: 0.8.5 - terser-webpack-plugin: 5.3.10(@swc/core@1.7.28(@swc/helpers@0.5.5))(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))) + terser-webpack-plugin: 5.3.10(webpack@5.95.0) tslib: 2.7.0 update-notifier: 6.0.2 - url-loader: 4.1.1(file-loader@6.2.0(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))))(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))) - webpack: 5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5)) + url-loader: 4.1.1(file-loader@6.2.0(webpack@5.95.0))(webpack@5.95.0) + webpack: 5.95.0 webpack-bundle-analyzer: 4.10.2 - webpack-dev-server: 4.15.2(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))) + webpack-dev-server: 4.15.2(webpack@5.95.0) webpack-merge: 5.10.0 - webpackbar: 5.0.2(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))) + webpackbar: 5.0.2(webpack@5.95.0) transitivePeerDependencies: - '@docusaurus/types' - '@parcel/css' @@ -18484,16 +18484,16 @@ snapshots: chalk: 4.1.2 tslib: 2.7.0 - '@docusaurus/mdx-loader@3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)': + '@docusaurus/mdx-loader@3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)': dependencies: '@docusaurus/logger': 3.5.2 - '@docusaurus/utils': 3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(typescript@5.6.2) - '@docusaurus/utils-validation': 3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(typescript@5.6.2) + '@docusaurus/utils': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.6.2) + '@docusaurus/utils-validation': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.6.2) '@mdx-js/mdx': 3.0.1 '@slorber/remark-comment': 1.0.0 escape-html: 1.0.3 estree-util-value-to-estree: 3.1.2 - file-loader: 6.2.0(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))) + file-loader: 6.2.0(webpack@5.95.0) fs-extra: 11.2.0 image-size: 1.1.1 mdast-util-mdx: 3.0.0 @@ -18509,9 +18509,9 @@ snapshots: tslib: 2.7.0 unified: 11.0.5 unist-util-visit: 5.0.0 - url-loader: 4.1.1(file-loader@6.2.0(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))))(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))) + url-loader: 4.1.1(file-loader@6.2.0(webpack@5.95.0))(webpack@5.95.0) vfile: 6.0.3 - webpack: 5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5)) + webpack: 5.95.0 transitivePeerDependencies: - '@docusaurus/types' - '@swc/core' @@ -18521,9 +18521,9 @@ snapshots: - uglify-js - webpack-cli - '@docusaurus/module-type-aliases@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@docusaurus/module-type-aliases@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@docusaurus/types': 3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@docusaurus/types': 3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@types/history': 4.7.11 '@types/react': 18.3.9 '@types/react-router-config': 5.0.11 @@ -18539,17 +18539,17 @@ snapshots: - uglify-js - webpack-cli - '@docusaurus/plugin-content-blog@3.5.2(@docusaurus/plugin-content-docs@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16)': + '@docusaurus/plugin-content-blog@3.5.2(@docusaurus/plugin-content-docs@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16)': dependencies: - '@docusaurus/core': 3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) + '@docusaurus/core': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) '@docusaurus/logger': 3.5.2 - '@docusaurus/mdx-loader': 3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2) - '@docusaurus/plugin-content-docs': 3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) - '@docusaurus/theme-common': 3.5.2(@docusaurus/plugin-content-docs@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16))(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2) - '@docusaurus/types': 3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@docusaurus/utils': 3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(typescript@5.6.2) - '@docusaurus/utils-common': 3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) - '@docusaurus/utils-validation': 3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(typescript@5.6.2) + '@docusaurus/mdx-loader': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2) + '@docusaurus/plugin-content-docs': 3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) + '@docusaurus/theme-common': 3.5.2(@docusaurus/plugin-content-docs@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16))(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2) + '@docusaurus/types': 3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@docusaurus/utils': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.6.2) + '@docusaurus/utils-common': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + '@docusaurus/utils-validation': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.6.2) cheerio: 1.0.0-rc.12 feed: 4.2.2 fs-extra: 11.2.0 @@ -18561,7 +18561,7 @@ snapshots: tslib: 2.7.0 unist-util-visit: 5.0.0 utility-types: 3.11.0 - webpack: 5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5)) + webpack: 5.95.0 transitivePeerDependencies: - '@mdx-js/react' - '@parcel/css' @@ -18581,17 +18581,17 @@ snapshots: - vue-template-compiler - webpack-cli - '@docusaurus/plugin-content-docs@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16)': + '@docusaurus/plugin-content-docs@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16)': dependencies: - '@docusaurus/core': 3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) + '@docusaurus/core': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) '@docusaurus/logger': 3.5.2 - '@docusaurus/mdx-loader': 3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2) - '@docusaurus/module-type-aliases': 3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@docusaurus/theme-common': 3.5.2(@docusaurus/plugin-content-docs@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16))(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2) - '@docusaurus/types': 3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@docusaurus/utils': 3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(typescript@5.6.2) - '@docusaurus/utils-common': 3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) - '@docusaurus/utils-validation': 3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(typescript@5.6.2) + '@docusaurus/mdx-loader': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2) + '@docusaurus/module-type-aliases': 3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@docusaurus/theme-common': 3.5.2(@docusaurus/plugin-content-docs@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16))(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2) + '@docusaurus/types': 3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@docusaurus/utils': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.6.2) + '@docusaurus/utils-common': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + '@docusaurus/utils-validation': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.6.2) '@types/react-router-config': 5.0.11 combine-promises: 1.2.0 fs-extra: 11.2.0 @@ -18601,7 +18601,7 @@ snapshots: react-dom: 18.3.1(react@18.3.1) tslib: 2.7.0 utility-types: 3.11.0 - webpack: 5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5)) + webpack: 5.95.0 transitivePeerDependencies: - '@mdx-js/react' - '@parcel/css' @@ -18621,18 +18621,18 @@ snapshots: - vue-template-compiler - webpack-cli - '@docusaurus/plugin-content-pages@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16)': + '@docusaurus/plugin-content-pages@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16)': dependencies: - '@docusaurus/core': 3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) - '@docusaurus/mdx-loader': 3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2) - '@docusaurus/types': 3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@docusaurus/utils': 3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(typescript@5.6.2) - '@docusaurus/utils-validation': 3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(typescript@5.6.2) + '@docusaurus/core': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) + '@docusaurus/mdx-loader': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2) + '@docusaurus/types': 3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@docusaurus/utils': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.6.2) + '@docusaurus/utils-validation': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.6.2) fs-extra: 11.2.0 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) tslib: 2.7.0 - webpack: 5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5)) + webpack: 5.95.0 transitivePeerDependencies: - '@mdx-js/react' - '@parcel/css' @@ -18652,11 +18652,11 @@ snapshots: - vue-template-compiler - webpack-cli - '@docusaurus/plugin-debug@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16)': + '@docusaurus/plugin-debug@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16)': dependencies: - '@docusaurus/core': 3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) - '@docusaurus/types': 3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@docusaurus/utils': 3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(typescript@5.6.2) + '@docusaurus/core': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) + '@docusaurus/types': 3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@docusaurus/utils': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.6.2) fs-extra: 11.2.0 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) @@ -18681,11 +18681,11 @@ snapshots: - vue-template-compiler - webpack-cli - '@docusaurus/plugin-google-analytics@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16)': + '@docusaurus/plugin-google-analytics@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16)': dependencies: - '@docusaurus/core': 3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) - '@docusaurus/types': 3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@docusaurus/utils-validation': 3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(typescript@5.6.2) + '@docusaurus/core': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) + '@docusaurus/types': 3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@docusaurus/utils-validation': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.6.2) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) tslib: 2.7.0 @@ -18708,11 +18708,11 @@ snapshots: - vue-template-compiler - webpack-cli - '@docusaurus/plugin-google-gtag@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16)': + '@docusaurus/plugin-google-gtag@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16)': dependencies: - '@docusaurus/core': 3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) - '@docusaurus/types': 3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@docusaurus/utils-validation': 3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(typescript@5.6.2) + '@docusaurus/core': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) + '@docusaurus/types': 3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@docusaurus/utils-validation': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.6.2) '@types/gtag.js': 0.0.12 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) @@ -18736,11 +18736,11 @@ snapshots: - vue-template-compiler - webpack-cli - '@docusaurus/plugin-google-tag-manager@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16)': + '@docusaurus/plugin-google-tag-manager@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16)': dependencies: - '@docusaurus/core': 3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) - '@docusaurus/types': 3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@docusaurus/utils-validation': 3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(typescript@5.6.2) + '@docusaurus/core': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) + '@docusaurus/types': 3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@docusaurus/utils-validation': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.6.2) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) tslib: 2.7.0 @@ -18763,14 +18763,14 @@ snapshots: - vue-template-compiler - webpack-cli - '@docusaurus/plugin-sitemap@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16)': + '@docusaurus/plugin-sitemap@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16)': dependencies: - '@docusaurus/core': 3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) + '@docusaurus/core': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) '@docusaurus/logger': 3.5.2 - '@docusaurus/types': 3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@docusaurus/utils': 3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(typescript@5.6.2) - '@docusaurus/utils-common': 3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) - '@docusaurus/utils-validation': 3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(typescript@5.6.2) + '@docusaurus/types': 3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@docusaurus/utils': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.6.2) + '@docusaurus/utils-common': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + '@docusaurus/utils-validation': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.6.2) fs-extra: 11.2.0 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) @@ -18795,21 +18795,21 @@ snapshots: - vue-template-compiler - webpack-cli - '@docusaurus/preset-classic@3.5.2(@algolia/client-search@4.24.0)(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/react@18.3.9)(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16)': - dependencies: - '@docusaurus/core': 3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) - '@docusaurus/plugin-content-blog': 3.5.2(@docusaurus/plugin-content-docs@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) - '@docusaurus/plugin-content-docs': 3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) - '@docusaurus/plugin-content-pages': 3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) - '@docusaurus/plugin-debug': 3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) - '@docusaurus/plugin-google-analytics': 3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) - '@docusaurus/plugin-google-gtag': 3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) - '@docusaurus/plugin-google-tag-manager': 3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) - '@docusaurus/plugin-sitemap': 3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) - '@docusaurus/theme-classic': 3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/react@18.3.9)(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) - '@docusaurus/theme-common': 3.5.2(@docusaurus/plugin-content-docs@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16))(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2) - '@docusaurus/theme-search-algolia': 3.5.2(@algolia/client-search@4.24.0)(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/react@18.3.9)(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) - '@docusaurus/types': 3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@docusaurus/preset-classic@3.5.2(@algolia/client-search@4.24.0)(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@types/react@18.3.9)(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16)': + dependencies: + '@docusaurus/core': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) + '@docusaurus/plugin-content-blog': 3.5.2(@docusaurus/plugin-content-docs@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) + '@docusaurus/plugin-content-docs': 3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) + '@docusaurus/plugin-content-pages': 3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) + '@docusaurus/plugin-debug': 3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) + '@docusaurus/plugin-google-analytics': 3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) + '@docusaurus/plugin-google-gtag': 3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) + '@docusaurus/plugin-google-tag-manager': 3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) + '@docusaurus/plugin-sitemap': 3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) + '@docusaurus/theme-classic': 3.5.2(@types/react@18.3.9)(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) + '@docusaurus/theme-common': 3.5.2(@docusaurus/plugin-content-docs@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16))(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2) + '@docusaurus/theme-search-algolia': 3.5.2(@algolia/client-search@4.24.0)(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@types/react@18.3.9)(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) + '@docusaurus/types': 3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) transitivePeerDependencies: @@ -18849,20 +18849,20 @@ snapshots: transitivePeerDependencies: - supports-color - '@docusaurus/theme-classic@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/react@18.3.9)(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16)': + '@docusaurus/theme-classic@3.5.2(@types/react@18.3.9)(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16)': dependencies: - '@docusaurus/core': 3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) - '@docusaurus/mdx-loader': 3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2) - '@docusaurus/module-type-aliases': 3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@docusaurus/plugin-content-blog': 3.5.2(@docusaurus/plugin-content-docs@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) - '@docusaurus/plugin-content-docs': 3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) - '@docusaurus/plugin-content-pages': 3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) - '@docusaurus/theme-common': 3.5.2(@docusaurus/plugin-content-docs@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16))(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2) + '@docusaurus/core': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) + '@docusaurus/mdx-loader': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2) + '@docusaurus/module-type-aliases': 3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@docusaurus/plugin-content-blog': 3.5.2(@docusaurus/plugin-content-docs@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) + '@docusaurus/plugin-content-docs': 3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) + '@docusaurus/plugin-content-pages': 3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) + '@docusaurus/theme-common': 3.5.2(@docusaurus/plugin-content-docs@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16))(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2) '@docusaurus/theme-translations': 3.5.2 - '@docusaurus/types': 3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@docusaurus/utils': 3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(typescript@5.6.2) - '@docusaurus/utils-common': 3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) - '@docusaurus/utils-validation': 3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(typescript@5.6.2) + '@docusaurus/types': 3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@docusaurus/utils': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.6.2) + '@docusaurus/utils-common': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + '@docusaurus/utils-validation': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.6.2) '@mdx-js/react': 3.0.1(@types/react@18.3.9)(react@18.3.1) clsx: 2.1.1 copy-text-to-clipboard: 3.2.0 @@ -18897,13 +18897,13 @@ snapshots: - vue-template-compiler - webpack-cli - '@docusaurus/theme-common@3.5.2(@docusaurus/plugin-content-docs@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16))(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)': + '@docusaurus/theme-common@3.5.2(@docusaurus/plugin-content-docs@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16))(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)': dependencies: - '@docusaurus/mdx-loader': 3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2) - '@docusaurus/module-type-aliases': 3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@docusaurus/plugin-content-docs': 3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) - '@docusaurus/utils': 3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(typescript@5.6.2) - '@docusaurus/utils-common': 3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + '@docusaurus/mdx-loader': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2) + '@docusaurus/module-type-aliases': 3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@docusaurus/plugin-content-docs': 3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) + '@docusaurus/utils': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.6.2) + '@docusaurus/utils-common': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) '@types/history': 4.7.11 '@types/react': 18.3.9 '@types/react-router-config': 5.0.11 @@ -18923,12 +18923,12 @@ snapshots: - uglify-js - webpack-cli - '@docusaurus/theme-live-codeblock@3.5.2(@docusaurus/plugin-content-docs@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16))(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16)': + '@docusaurus/theme-live-codeblock@3.5.2(@docusaurus/plugin-content-docs@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16))(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16)': dependencies: - '@docusaurus/core': 3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) - '@docusaurus/theme-common': 3.5.2(@docusaurus/plugin-content-docs@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16))(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2) + '@docusaurus/core': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) + '@docusaurus/theme-common': 3.5.2(@docusaurus/plugin-content-docs@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16))(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2) '@docusaurus/theme-translations': 3.5.2 - '@docusaurus/utils-validation': 3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(typescript@5.6.2) + '@docusaurus/utils-validation': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.6.2) '@philpl/buble': 0.19.7 clsx: 2.1.1 fs-extra: 11.2.0 @@ -18957,13 +18957,13 @@ snapshots: - vue-template-compiler - webpack-cli - '@docusaurus/theme-mermaid@3.5.2(@docusaurus/plugin-content-docs@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16)': + '@docusaurus/theme-mermaid@3.5.2(@docusaurus/plugin-content-docs@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16)': dependencies: - '@docusaurus/core': 3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) - '@docusaurus/module-type-aliases': 3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@docusaurus/theme-common': 3.5.2(@docusaurus/plugin-content-docs@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16))(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2) - '@docusaurus/types': 3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@docusaurus/utils-validation': 3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(typescript@5.6.2) + '@docusaurus/core': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) + '@docusaurus/module-type-aliases': 3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@docusaurus/theme-common': 3.5.2(@docusaurus/plugin-content-docs@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16))(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2) + '@docusaurus/types': 3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@docusaurus/utils-validation': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.6.2) mermaid: 10.9.3 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) @@ -18988,16 +18988,16 @@ snapshots: - vue-template-compiler - webpack-cli - '@docusaurus/theme-search-algolia@3.5.2(@algolia/client-search@4.24.0)(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/react@18.3.9)(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16)': + '@docusaurus/theme-search-algolia@3.5.2(@algolia/client-search@4.24.0)(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@types/react@18.3.9)(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16)': dependencies: '@docsearch/react': 3.6.1(@algolia/client-search@4.24.0)(@types/react@18.3.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@docusaurus/core': 3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) + '@docusaurus/core': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) '@docusaurus/logger': 3.5.2 - '@docusaurus/plugin-content-docs': 3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) - '@docusaurus/theme-common': 3.5.2(@docusaurus/plugin-content-docs@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16))(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2) + '@docusaurus/plugin-content-docs': 3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) + '@docusaurus/theme-common': 3.5.2(@docusaurus/plugin-content-docs@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16))(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2) '@docusaurus/theme-translations': 3.5.2 - '@docusaurus/utils': 3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(typescript@5.6.2) - '@docusaurus/utils-validation': 3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(typescript@5.6.2) + '@docusaurus/utils': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.6.2) + '@docusaurus/utils-validation': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.6.2) algoliasearch: 4.24.0 algoliasearch-helper: 3.22.5(algoliasearch@4.24.0) clsx: 2.1.1 @@ -19038,7 +19038,7 @@ snapshots: '@docusaurus/tsconfig@3.5.2': {} - '@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@mdx-js/mdx': 3.0.1 '@types/history': 4.7.11 @@ -19049,7 +19049,7 @@ snapshots: react-dom: 18.3.1(react@18.3.1) react-helmet-async: 1.3.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) utility-types: 3.11.0 - webpack: 5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5)) + webpack: 5.95.0 webpack-merge: 5.10.0 transitivePeerDependencies: - '@swc/core' @@ -19058,17 +19058,17 @@ snapshots: - uglify-js - webpack-cli - '@docusaurus/utils-common@3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))': + '@docusaurus/utils-common@3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))': dependencies: tslib: 2.7.0 optionalDependencies: - '@docusaurus/types': 3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@docusaurus/types': 3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@docusaurus/utils-validation@3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(typescript@5.6.2)': + '@docusaurus/utils-validation@3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.6.2)': dependencies: '@docusaurus/logger': 3.5.2 - '@docusaurus/utils': 3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(typescript@5.6.2) - '@docusaurus/utils-common': 3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + '@docusaurus/utils': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.6.2) + '@docusaurus/utils-common': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) fs-extra: 11.2.0 joi: 17.13.3 js-yaml: 4.1.0 @@ -19083,13 +19083,13 @@ snapshots: - uglify-js - webpack-cli - '@docusaurus/utils@3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(typescript@5.6.2)': + '@docusaurus/utils@3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.6.2)': dependencies: '@docusaurus/logger': 3.5.2 - '@docusaurus/utils-common': 3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + '@docusaurus/utils-common': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) '@svgr/webpack': 8.1.0(typescript@5.6.2) escape-string-regexp: 4.0.0 - file-loader: 6.2.0(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))) + file-loader: 6.2.0(webpack@5.95.0) fs-extra: 11.2.0 github-slugger: 1.5.0 globby: 11.1.0 @@ -19102,11 +19102,11 @@ snapshots: resolve-pathname: 3.0.0 shelljs: 0.8.5 tslib: 2.7.0 - url-loader: 4.1.1(file-loader@6.2.0(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))))(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))) + url-loader: 4.1.1(file-loader@6.2.0(webpack@5.95.0))(webpack@5.95.0) utility-types: 3.11.0 - webpack: 5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5)) + webpack: 5.95.0 optionalDependencies: - '@docusaurus/types': 3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@docusaurus/types': 3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) transitivePeerDependencies: - '@swc/core' - esbuild @@ -19671,24 +19671,24 @@ snapshots: - encoding - supports-color - '@graphql-markdown/core@1.12.0(@graphql-markdown/printer-legacy@1.9.0(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(graphql@16.9.0)(prettier@3.3.3)(typescript@5.6.2))(graphql-config@5.1.2(@types/node@22.7.3)(graphql@16.9.0)(typescript@5.6.2))(graphql@16.9.0)(prettier@3.3.3)': + '@graphql-markdown/core@1.12.0(@graphql-markdown/printer-legacy@1.9.0(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(graphql@16.9.0)(prettier@3.3.3)(typescript@5.6.2))(graphql-config@5.1.2(@types/node@22.7.3)(graphql@16.9.0)(typescript@5.6.2))(graphql@16.9.0)(prettier@3.3.3)': dependencies: '@graphql-markdown/graphql': 1.1.4(graphql@16.9.0)(prettier@3.3.3) '@graphql-markdown/logger': 1.0.4 '@graphql-markdown/utils': 1.7.0(prettier@3.3.3) optionalDependencies: - '@graphql-markdown/printer-legacy': 1.9.0(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(graphql@16.9.0)(prettier@3.3.3)(typescript@5.6.2) + '@graphql-markdown/printer-legacy': 1.9.0(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(graphql@16.9.0)(prettier@3.3.3)(typescript@5.6.2) graphql-config: 5.1.2(@types/node@22.7.3)(graphql@16.9.0)(typescript@5.6.2) transitivePeerDependencies: - graphql - prettier - '@graphql-markdown/docusaurus@1.26.2(@docusaurus/logger@3.5.2)(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(graphql-config@5.1.2(@types/node@22.7.3)(graphql@16.9.0)(typescript@5.6.2))(graphql@16.9.0)(prettier@3.3.3)(typescript@5.6.2)': + '@graphql-markdown/docusaurus@1.26.2(@docusaurus/logger@3.5.2)(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(graphql-config@5.1.2(@types/node@22.7.3)(graphql@16.9.0)(typescript@5.6.2))(graphql@16.9.0)(prettier@3.3.3)(typescript@5.6.2)': dependencies: '@docusaurus/logger': 3.5.2 - '@graphql-markdown/core': 1.12.0(@graphql-markdown/printer-legacy@1.9.0(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(graphql@16.9.0)(prettier@3.3.3)(typescript@5.6.2))(graphql-config@5.1.2(@types/node@22.7.3)(graphql@16.9.0)(typescript@5.6.2))(graphql@16.9.0)(prettier@3.3.3) + '@graphql-markdown/core': 1.12.0(@graphql-markdown/printer-legacy@1.9.0(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(graphql@16.9.0)(prettier@3.3.3)(typescript@5.6.2))(graphql-config@5.1.2(@types/node@22.7.3)(graphql@16.9.0)(typescript@5.6.2))(graphql@16.9.0)(prettier@3.3.3) '@graphql-markdown/logger': 1.0.4 - '@graphql-markdown/printer-legacy': 1.9.0(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(graphql@16.9.0)(prettier@3.3.3)(typescript@5.6.2) + '@graphql-markdown/printer-legacy': 1.9.0(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(graphql@16.9.0)(prettier@3.3.3)(typescript@5.6.2) transitivePeerDependencies: - '@docusaurus/types' - '@graphql-markdown/diff' @@ -19713,9 +19713,9 @@ snapshots: '@graphql-markdown/logger@1.0.4': {} - '@graphql-markdown/printer-legacy@1.9.0(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(graphql@16.9.0)(prettier@3.3.3)(typescript@5.6.2)': + '@graphql-markdown/printer-legacy@1.9.0(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(graphql@16.9.0)(prettier@3.3.3)(typescript@5.6.2)': dependencies: - '@docusaurus/utils': 3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(typescript@5.6.2) + '@docusaurus/utils': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.6.2) '@graphql-markdown/graphql': 1.1.4(graphql@16.9.0)(prettier@3.3.3) '@graphql-markdown/utils': 1.7.0(prettier@3.3.3) transitivePeerDependencies: @@ -20053,9 +20053,9 @@ snapshots: react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - '@headlessui/tailwindcss@0.1.3(tailwindcss@3.4.13(ts-node@10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@22.7.3)(typescript@5.6.2)))': + '@headlessui/tailwindcss@0.1.3(tailwindcss@3.4.13(ts-node@10.9.2(@types/node@22.7.3)(typescript@5.6.2)))': dependencies: - tailwindcss: 3.4.13(ts-node@10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@22.7.3)(typescript@5.6.2)) + tailwindcss: 3.4.13(ts-node@10.9.2(@types/node@22.7.3)(typescript@5.6.2)) '@hookform/resolvers@3.9.0(react-hook-form@7.53.0(react@18.3.1))': dependencies: @@ -20133,7 +20133,7 @@ snapshots: jest-util: 29.7.0 slash: 3.0.0 - '@jest/core@29.7.0(babel-plugin-macros@3.1.0)(node-notifier@10.0.0)(ts-node@10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(typescript@5.6.2))': + '@jest/core@29.7.0(babel-plugin-macros@3.1.0)(node-notifier@10.0.0)(ts-node@10.9.2(@types/node@20.16.9)(typescript@5.6.2))': dependencies: '@jest/console': 29.7.0 '@jest/reporters': 29.7.0(node-notifier@10.0.0) @@ -20147,7 +20147,7 @@ snapshots: exit: 0.1.2 graceful-fs: 4.2.11 jest-changed-files: 29.7.0 - jest-config: 29.7.0(@types/node@20.16.9)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(typescript@5.6.2)) + jest-config: 29.7.0(@types/node@20.16.9)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@20.16.9)(typescript@5.6.2)) jest-haste-map: 29.7.0 jest-message-util: 29.7.0 jest-regex-util: 29.6.3 @@ -20652,14 +20652,14 @@ snapshots: pump: 3.0.2 tar-fs: 2.1.1 - '@nestjs/cache-manager@2.2.2(@nestjs/common@10.4.4(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/core@10.4.4)(cache-manager@5.7.6)(rxjs@7.8.1)': + '@nestjs/cache-manager@2.2.2(@nestjs/common@10.4.4(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/core@10.4.4(@nestjs/common@10.4.4(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/platform-express@10.4.4)(reflect-metadata@0.2.2)(rxjs@7.8.1))(cache-manager@5.7.6)(rxjs@7.8.1)': dependencies: '@nestjs/common': 10.4.4(reflect-metadata@0.2.2)(rxjs@7.8.1) '@nestjs/core': 10.4.4(@nestjs/common@10.4.4(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/platform-express@10.4.4)(reflect-metadata@0.2.2)(rxjs@7.8.1) cache-manager: 5.7.6 rxjs: 7.8.1 - '@nestjs/cli@10.4.5(@swc/core@1.7.28(@swc/helpers@0.5.5))': + '@nestjs/cli@10.4.5(@swc/core@1.7.28)': dependencies: '@angular-devkit/core': 17.3.8(chokidar@3.6.0) '@angular-devkit/schematics': 17.3.8(chokidar@3.6.0) @@ -20669,7 +20669,7 @@ snapshots: chokidar: 3.6.0 cli-table3: 0.6.5 commander: 4.1.1 - fork-ts-checker-webpack-plugin: 9.0.2(typescript@5.3.3)(webpack@5.94.0(@swc/core@1.7.28(@swc/helpers@0.5.5))) + fork-ts-checker-webpack-plugin: 9.0.2(typescript@5.3.3)(webpack@5.94.0(@swc/core@1.7.28)) glob: 10.4.2 inquirer: 8.2.6 node-emoji: 1.11.0 @@ -20678,7 +20678,7 @@ snapshots: tsconfig-paths: 4.2.0 tsconfig-paths-webpack-plugin: 4.1.0 typescript: 5.3.3 - webpack: 5.94.0(@swc/core@1.7.28(@swc/helpers@0.5.5)) + webpack: 5.94.0(@swc/core@1.7.28) webpack-node-externals: 3.0.0 optionalDependencies: '@swc/core': 1.7.28(@swc/helpers@0.5.5) @@ -20731,7 +20731,7 @@ snapshots: transitivePeerDependencies: - supports-color - '@nestjs/schedule@4.1.1(@nestjs/common@10.4.4(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/core@10.4.4)': + '@nestjs/schedule@4.1.1(@nestjs/common@10.4.4(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/core@10.4.4(@nestjs/common@10.4.4(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/platform-express@10.4.4)(reflect-metadata@0.2.2)(rxjs@7.8.1))': dependencies: '@nestjs/common': 10.4.4(reflect-metadata@0.2.2)(rxjs@7.8.1) '@nestjs/core': 10.4.4(@nestjs/common@10.4.4(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/platform-express@10.4.4)(reflect-metadata@0.2.2)(rxjs@7.8.1) @@ -20760,7 +20760,7 @@ snapshots: transitivePeerDependencies: - chokidar - '@nestjs/testing@10.4.4(@nestjs/common@10.4.4(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/core@10.4.4)(@nestjs/platform-express@10.4.4)': + '@nestjs/testing@10.4.4(@nestjs/common@10.4.4(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/core@10.4.4(@nestjs/common@10.4.4(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/platform-express@10.4.4)(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/platform-express@10.4.4(@nestjs/common@10.4.4(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/core@10.4.4))': dependencies: '@nestjs/common': 10.4.4(reflect-metadata@0.2.2)(rxjs@7.8.1) '@nestjs/core': 10.4.4(@nestjs/common@10.4.4(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/platform-express@10.4.4)(reflect-metadata@0.2.2)(rxjs@7.8.1) @@ -20768,37 +20768,37 @@ snapshots: optionalDependencies: '@nestjs/platform-express': 10.4.4(@nestjs/common@10.4.4(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/core@10.4.4) - '@next/env@14.2.10': {} + '@next/env@14.2.15': {} '@next/eslint-plugin-next@14.2.3': dependencies: glob: 10.3.10 - '@next/swc-darwin-arm64@14.2.10': + '@next/swc-darwin-arm64@14.2.15': optional: true - '@next/swc-darwin-x64@14.2.10': + '@next/swc-darwin-x64@14.2.15': optional: true - '@next/swc-linux-arm64-gnu@14.2.10': + '@next/swc-linux-arm64-gnu@14.2.15': optional: true - '@next/swc-linux-arm64-musl@14.2.10': + '@next/swc-linux-arm64-musl@14.2.15': optional: true - '@next/swc-linux-x64-gnu@14.2.10': + '@next/swc-linux-x64-gnu@14.2.15': optional: true - '@next/swc-linux-x64-musl@14.2.10': + '@next/swc-linux-x64-musl@14.2.15': optional: true - '@next/swc-win32-arm64-msvc@14.2.10': + '@next/swc-win32-arm64-msvc@14.2.15': optional: true - '@next/swc-win32-ia32-msvc@14.2.10': + '@next/swc-win32-ia32-msvc@14.2.15': optional: true - '@next/swc-win32-x64-msvc@14.2.10': + '@next/swc-win32-x64-msvc@14.2.15': optional: true '@noble/curves@1.4.2': @@ -23387,14 +23387,14 @@ snapshots: dependencies: defer-to-connect: 2.0.1 - '@tailwindcss/aspect-ratio@0.4.2(tailwindcss@3.4.13(ts-node@10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@22.7.3)(typescript@5.6.2)))': + '@tailwindcss/aspect-ratio@0.4.2(tailwindcss@3.4.13(ts-node@10.9.2(@types/node@22.7.3)(typescript@5.6.2)))': dependencies: - tailwindcss: 3.4.13(ts-node@10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@22.7.3)(typescript@5.6.2)) + tailwindcss: 3.4.13(ts-node@10.9.2(@types/node@22.7.3)(typescript@5.6.2)) - '@tailwindcss/forms@0.5.9(tailwindcss@3.4.13(ts-node@10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@22.7.3)(typescript@5.6.2)))': + '@tailwindcss/forms@0.5.9(tailwindcss@3.4.13(ts-node@10.9.2(@types/node@22.7.3)(typescript@5.6.2)))': dependencies: mini-svg-data-uri: 1.4.4 - tailwindcss: 3.4.13(ts-node@10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@22.7.3)(typescript@5.6.2)) + tailwindcss: 3.4.13(ts-node@10.9.2(@types/node@22.7.3)(typescript@5.6.2)) '@tanstack/eslint-plugin-query@5.58.1(eslint@8.57.1)(typescript@5.6.2)': dependencies: @@ -23898,11 +23898,11 @@ snapshots: '@types/webextension-polyfill@0.10.7': {} - '@types/webpack@5.28.5(@swc/core@1.7.28(@swc/helpers@0.5.5))(webpack-cli@5.1.4)': + '@types/webpack@5.28.5(@swc/core@1.7.28)(webpack-cli@5.1.4(webpack@5.95.0))': dependencies: '@types/node': 20.16.9 tapable: 2.2.1 - webpack: 5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(webpack-cli@5.1.4) + webpack: 5.95.0(@swc/core@1.7.28)(webpack-cli@5.1.4) transitivePeerDependencies: - '@swc/core' - esbuild @@ -24677,19 +24677,19 @@ snapshots: '@webassemblyjs/ast': 1.12.1 '@xtuc/long': 4.2.2 - '@webpack-cli/configtest@2.1.1(webpack-cli@5.1.4)(webpack@5.95.0)': + '@webpack-cli/configtest@2.1.1(webpack-cli@5.1.4(webpack@5.95.0))(webpack@5.95.0(@swc/core@1.7.28)(webpack-cli@5.1.4))': dependencies: - webpack: 5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(webpack-cli@5.1.4) + webpack: 5.95.0(@swc/core@1.7.28)(webpack-cli@5.1.4) webpack-cli: 5.1.4(webpack@5.95.0) - '@webpack-cli/info@2.0.2(webpack-cli@5.1.4)(webpack@5.95.0)': + '@webpack-cli/info@2.0.2(webpack-cli@5.1.4(webpack@5.95.0))(webpack@5.95.0(@swc/core@1.7.28)(webpack-cli@5.1.4))': dependencies: - webpack: 5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(webpack-cli@5.1.4) + webpack: 5.95.0(@swc/core@1.7.28)(webpack-cli@5.1.4) webpack-cli: 5.1.4(webpack@5.95.0) - '@webpack-cli/serve@2.0.5(webpack-cli@5.1.4)(webpack@5.95.0)': + '@webpack-cli/serve@2.0.5(webpack-cli@5.1.4(webpack@5.95.0))(webpack@5.95.0(@swc/core@1.7.28)(webpack-cli@5.1.4))': dependencies: - webpack: 5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(webpack-cli@5.1.4) + webpack: 5.95.0(@swc/core@1.7.28)(webpack-cli@5.1.4) webpack-cli: 5.1.4(webpack@5.95.0) '@whatwg-node/events@0.0.3': {} @@ -25178,12 +25178,12 @@ snapshots: transitivePeerDependencies: - supports-color - babel-loader@9.2.1(@babel/core@7.25.2)(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))): + babel-loader@9.2.1(@babel/core@7.25.2)(webpack@5.95.0): dependencies: '@babel/core': 7.25.2 find-cache-dir: 4.0.0 schema-utils: 4.2.0 - webpack: 5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5)) + webpack: 5.95.0 babel-plugin-dynamic-import-node@2.3.3: dependencies: @@ -25981,7 +25981,7 @@ snapshots: copy-text-to-clipboard@3.2.0: {} - copy-webpack-plugin@11.0.0(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))): + copy-webpack-plugin@11.0.0(webpack@5.95.0(@swc/core@1.7.28)(webpack-cli@5.1.4)): dependencies: fast-glob: 3.3.2 glob-parent: 6.0.2 @@ -25989,7 +25989,7 @@ snapshots: normalize-path: 3.0.0 schema-utils: 4.2.0 serialize-javascript: 6.0.2 - webpack: 5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5)) + webpack: 5.95.0(@swc/core@1.7.28)(webpack-cli@5.1.4) copy-webpack-plugin@11.0.0(webpack@5.95.0): dependencies: @@ -25999,7 +25999,7 @@ snapshots: normalize-path: 3.0.0 schema-utils: 4.2.0 serialize-javascript: 6.0.2 - webpack: 5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(webpack-cli@5.1.4) + webpack: 5.95.0 core-js-compat@3.38.1: dependencies: @@ -26069,13 +26069,13 @@ snapshots: crc-32@1.2.2: {} - create-jest@29.7.0(@types/node@20.16.9)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(typescript@5.6.2)): + create-jest@29.7.0(@types/node@20.16.9)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@20.16.9)(typescript@5.6.2)): dependencies: '@jest/types': 29.6.3 chalk: 4.1.2 exit: 0.1.2 graceful-fs: 4.2.11 - jest-config: 29.7.0(@types/node@20.16.9)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(typescript@5.6.2)) + jest-config: 29.7.0(@types/node@20.16.9)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@20.16.9)(typescript@5.6.2)) jest-util: 29.7.0 prompts: 2.4.2 transitivePeerDependencies: @@ -26139,7 +26139,7 @@ snapshots: postcss-selector-parser: 6.1.2 postcss-value-parser: 4.2.0 - css-loader@6.11.0(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))): + css-loader@6.11.0(webpack@5.95.0(@swc/core@1.7.28)(webpack-cli@5.1.4)): dependencies: icss-utils: 5.1.0(postcss@8.4.47) postcss: 8.4.47 @@ -26150,7 +26150,7 @@ snapshots: postcss-value-parser: 4.2.0 semver: 7.6.3 optionalDependencies: - webpack: 5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5)) + webpack: 5.95.0(@swc/core@1.7.28)(webpack-cli@5.1.4) css-loader@6.11.0(webpack@5.95.0): dependencies: @@ -26163,9 +26163,9 @@ snapshots: postcss-value-parser: 4.2.0 semver: 7.6.3 optionalDependencies: - webpack: 5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(webpack-cli@5.1.4) + webpack: 5.95.0 - css-minimizer-webpack-plugin@5.0.1(clean-css@5.3.3)(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))): + css-minimizer-webpack-plugin@5.0.1(clean-css@5.3.3)(webpack@5.95.0): dependencies: '@jridgewell/trace-mapping': 0.3.25 cssnano: 6.1.2(postcss@8.4.47) @@ -26173,7 +26173,7 @@ snapshots: postcss: 8.4.47 schema-utils: 4.2.0 serialize-javascript: 6.0.2 - webpack: 5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5)) + webpack: 5.95.0 optionalDependencies: clean-css: 5.3.3 @@ -27104,7 +27104,7 @@ snapshots: eslint: 8.57.1 eslint-import-resolver-node: 0.3.9 eslint-import-resolver-typescript: 3.6.3(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.30.0)(eslint@8.57.1) - eslint-plugin-import: 2.30.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.6.2))(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.6.2))(eslint-plugin-import@2.30.0)(eslint@8.57.1))(eslint@8.57.1) + eslint-plugin-import: 2.30.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.6.2))(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.1) eslint-plugin-jsx-a11y: 6.10.0(eslint@8.57.1) eslint-plugin-react: 7.37.0(eslint@8.57.1) eslint-plugin-react-hooks: 4.6.2(eslint@8.57.1) @@ -27128,6 +27128,25 @@ snapshots: - supports-color eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.30.0)(eslint@8.57.1): + dependencies: + '@nolyfill/is-core-module': 1.0.39 + debug: 4.3.7(supports-color@8.1.1) + enhanced-resolve: 5.17.1 + eslint: 8.57.1 + eslint-module-utils: 2.12.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.30.0)(eslint@8.57.1))(eslint@8.57.1) + fast-glob: 3.3.2 + get-tsconfig: 4.8.1 + is-bun-module: 1.2.1 + is-glob: 4.0.3 + optionalDependencies: + eslint-plugin-import: 2.30.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.6.2))(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.1) + transitivePeerDependencies: + - '@typescript-eslint/parser' + - eslint-import-resolver-node + - eslint-import-resolver-webpack + - supports-color + + eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.6.2))(eslint-plugin-import@2.30.0)(eslint@8.57.1): dependencies: '@nolyfill/is-core-module': 1.0.39 debug: 4.3.7(supports-color@8.1.1) @@ -27139,14 +27158,14 @@ snapshots: is-bun-module: 1.2.1 is-glob: 4.0.3 optionalDependencies: - eslint-plugin-import: 2.30.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.6.2))(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.6.2))(eslint-plugin-import@2.30.0)(eslint@8.57.1))(eslint@8.57.1) + eslint-plugin-import: 2.30.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.6.2))(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.1) transitivePeerDependencies: - '@typescript-eslint/parser' - eslint-import-resolver-node - eslint-import-resolver-webpack - supports-color - eslint-module-utils@2.12.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.6.2))(eslint-plugin-import@2.30.0)(eslint@8.57.1))(eslint@8.57.1): + eslint-module-utils@2.12.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.30.0)(eslint@8.57.1))(eslint@8.57.1): dependencies: debug: 3.2.7 optionalDependencies: @@ -27157,11 +27176,22 @@ snapshots: transitivePeerDependencies: - supports-color + eslint-module-utils@2.12.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.6.2))(eslint-plugin-import@2.30.0)(eslint@8.57.1))(eslint@8.57.1): + dependencies: + debug: 3.2.7 + optionalDependencies: + '@typescript-eslint/parser': 6.21.0(eslint@8.57.1)(typescript@5.6.2) + eslint: 8.57.1 + eslint-import-resolver-node: 0.3.9 + eslint-import-resolver-typescript: 3.6.3(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.6.2))(eslint-plugin-import@2.30.0)(eslint@8.57.1) + transitivePeerDependencies: + - supports-color + eslint-plugin-header@3.1.1(eslint@8.57.1): dependencies: eslint: 8.57.1 - eslint-plugin-import@2.30.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.6.2))(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.6.2))(eslint-plugin-import@2.30.0)(eslint@8.57.1))(eslint@8.57.1): + eslint-plugin-import@2.30.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.6.2))(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.1): dependencies: '@rtsao/scc': 1.1.0 array-includes: 3.1.8 @@ -27287,7 +27317,7 @@ snapshots: eslint-visitor-keys@4.1.0: {} - eslint-webpack-plugin@4.2.0(eslint@8.57.1)(webpack@5.95.0): + eslint-webpack-plugin@4.2.0(eslint@8.57.1)(webpack@5.95.0(@swc/core@1.7.28)(webpack-cli@5.1.4)): dependencies: '@types/eslint': 8.56.12 eslint: 8.57.1 @@ -27295,7 +27325,7 @@ snapshots: micromatch: 4.0.8 normalize-path: 3.0.0 schema-utils: 4.2.0 - webpack: 5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(webpack-cli@5.1.4) + webpack: 5.95.0(@swc/core@1.7.28)(webpack-cli@5.1.4) eslint@8.57.1: dependencies: @@ -27660,11 +27690,11 @@ snapshots: dependencies: flat-cache: 3.2.0 - file-loader@6.2.0(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))): + file-loader@6.2.0(webpack@5.95.0): dependencies: loader-utils: 2.0.4 schema-utils: 3.3.0 - webpack: 5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5)) + webpack: 5.95.0 file-system-cache@2.3.0: dependencies: @@ -27772,7 +27802,7 @@ snapshots: forever-agent@0.6.1: {} - fork-ts-checker-webpack-plugin@6.5.3(eslint@8.57.1)(typescript@5.6.2)(vue-template-compiler@2.7.16)(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))): + fork-ts-checker-webpack-plugin@6.5.3(eslint@8.57.1)(typescript@5.6.2)(vue-template-compiler@2.7.16)(webpack@5.95.0): dependencies: '@babel/code-frame': 7.24.7 '@types/json-schema': 7.0.15 @@ -27788,12 +27818,12 @@ snapshots: semver: 7.6.3 tapable: 1.1.3 typescript: 5.6.2 - webpack: 5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5)) + webpack: 5.95.0 optionalDependencies: eslint: 8.57.1 vue-template-compiler: 2.7.16 - fork-ts-checker-webpack-plugin@9.0.2(typescript@5.3.3)(webpack@5.94.0(@swc/core@1.7.28(@swc/helpers@0.5.5))): + fork-ts-checker-webpack-plugin@9.0.2(typescript@5.3.3)(webpack@5.94.0(@swc/core@1.7.28)): dependencies: '@babel/code-frame': 7.24.7 chalk: 4.1.2 @@ -27808,7 +27838,7 @@ snapshots: semver: 7.6.3 tapable: 2.2.1 typescript: 5.3.3 - webpack: 5.94.0(@swc/core@1.7.28(@swc/helpers@0.5.5)) + webpack: 5.94.0(@swc/core@1.7.28) form-data-encoder@2.1.4: {} @@ -28591,7 +28621,7 @@ snapshots: html-void-elements@3.0.0: {} - html-webpack-plugin@5.6.0(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))): + html-webpack-plugin@5.6.0(webpack@5.95.0(@swc/core@1.7.28)(webpack-cli@5.1.4)): dependencies: '@types/html-minifier-terser': 6.1.0 html-minifier-terser: 6.1.0 @@ -28599,7 +28629,7 @@ snapshots: pretty-error: 4.0.0 tapable: 2.2.1 optionalDependencies: - webpack: 5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5)) + webpack: 5.95.0(@swc/core@1.7.28)(webpack-cli@5.1.4) html-webpack-plugin@5.6.0(webpack@5.95.0): dependencies: @@ -28609,7 +28639,7 @@ snapshots: pretty-error: 4.0.0 tapable: 2.2.1 optionalDependencies: - webpack: 5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(webpack-cli@5.1.4) + webpack: 5.95.0 htmlparser2@6.1.0: dependencies: @@ -29251,16 +29281,16 @@ snapshots: - babel-plugin-macros - supports-color - jest-cli@29.7.0(@types/node@20.16.9)(babel-plugin-macros@3.1.0)(node-notifier@10.0.0)(ts-node@10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(typescript@5.6.2)): + jest-cli@29.7.0(@types/node@20.16.9)(babel-plugin-macros@3.1.0)(node-notifier@10.0.0)(ts-node@10.9.2(@types/node@20.16.9)(typescript@5.6.2)): dependencies: - '@jest/core': 29.7.0(babel-plugin-macros@3.1.0)(node-notifier@10.0.0)(ts-node@10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(typescript@5.6.2)) + '@jest/core': 29.7.0(babel-plugin-macros@3.1.0)(node-notifier@10.0.0)(ts-node@10.9.2(@types/node@20.16.9)(typescript@5.6.2)) '@jest/test-result': 29.7.0 '@jest/types': 29.6.3 chalk: 4.1.2 - create-jest: 29.7.0(@types/node@20.16.9)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(typescript@5.6.2)) + create-jest: 29.7.0(@types/node@20.16.9)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@20.16.9)(typescript@5.6.2)) exit: 0.1.2 import-local: 3.2.0 - jest-config: 29.7.0(@types/node@20.16.9)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(typescript@5.6.2)) + jest-config: 29.7.0(@types/node@20.16.9)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@20.16.9)(typescript@5.6.2)) jest-util: 29.7.0 jest-validate: 29.7.0 yargs: 17.7.2 @@ -29272,7 +29302,7 @@ snapshots: - supports-color - ts-node - jest-config@29.7.0(@types/node@20.16.9)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(typescript@5.6.2)): + jest-config@29.7.0(@types/node@20.16.9)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@20.16.9)(typescript@5.6.2)): dependencies: '@babel/core': 7.25.2 '@jest/test-sequencer': 29.7.0 @@ -29298,7 +29328,7 @@ snapshots: strip-json-comments: 3.1.1 optionalDependencies: '@types/node': 20.16.9 - ts-node: 10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(typescript@5.6.2) + ts-node: 10.9.2(@swc/core@1.7.28)(@types/node@20.16.9)(typescript@5.6.2) transitivePeerDependencies: - babel-plugin-macros - supports-color @@ -29529,12 +29559,12 @@ snapshots: merge-stream: 2.0.0 supports-color: 8.1.1 - jest@29.7.0(@types/node@20.16.9)(babel-plugin-macros@3.1.0)(node-notifier@10.0.0)(ts-node@10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(typescript@5.6.2)): + jest@29.7.0(@types/node@20.16.9)(babel-plugin-macros@3.1.0)(node-notifier@10.0.0)(ts-node@10.9.2(@types/node@20.16.9)(typescript@5.6.2)): dependencies: - '@jest/core': 29.7.0(babel-plugin-macros@3.1.0)(node-notifier@10.0.0)(ts-node@10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(typescript@5.6.2)) + '@jest/core': 29.7.0(babel-plugin-macros@3.1.0)(node-notifier@10.0.0)(ts-node@10.9.2(@types/node@20.16.9)(typescript@5.6.2)) '@jest/types': 29.6.3 import-local: 3.2.0 - jest-cli: 29.7.0(@types/node@20.16.9)(babel-plugin-macros@3.1.0)(node-notifier@10.0.0)(ts-node@10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(typescript@5.6.2)) + jest-cli: 29.7.0(@types/node@20.16.9)(babel-plugin-macros@3.1.0)(node-notifier@10.0.0)(ts-node@10.9.2(@types/node@20.16.9)(typescript@5.6.2)) optionalDependencies: node-notifier: 10.0.0 transitivePeerDependencies: @@ -30816,17 +30846,17 @@ snapshots: min-indent@1.0.1: {} - mini-css-extract-plugin@2.9.1(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))): + mini-css-extract-plugin@2.9.1(webpack@5.95.0(@swc/core@1.7.28)(webpack-cli@5.1.4)): dependencies: schema-utils: 4.2.0 tapable: 2.2.1 - webpack: 5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5)) + webpack: 5.95.0(@swc/core@1.7.28)(webpack-cli@5.1.4) mini-css-extract-plugin@2.9.1(webpack@5.95.0): dependencies: schema-utils: 4.2.0 tapable: 2.2.1 - webpack: 5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(webpack-cli@5.1.4) + webpack: 5.95.0 mini-svg-data-uri@1.4.4: {} @@ -30981,9 +31011,9 @@ snapshots: neo-async@2.6.2: {} - next@14.2.10(@babel/core@7.25.2)(@playwright/test@1.47.2)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.79.3): + next@14.2.15(@babel/core@7.25.2)(@playwright/test@1.47.2)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.79.3): dependencies: - '@next/env': 14.2.10 + '@next/env': 14.2.15 '@swc/helpers': 0.5.5 busboy: 1.6.0 caniuse-lite: 1.0.30001664 @@ -30993,15 +31023,15 @@ snapshots: react-dom: 18.3.1(react@18.3.1) styled-jsx: 5.1.1(@babel/core@7.25.2)(babel-plugin-macros@3.1.0)(react@18.3.1) optionalDependencies: - '@next/swc-darwin-arm64': 14.2.10 - '@next/swc-darwin-x64': 14.2.10 - '@next/swc-linux-arm64-gnu': 14.2.10 - '@next/swc-linux-arm64-musl': 14.2.10 - '@next/swc-linux-x64-gnu': 14.2.10 - '@next/swc-linux-x64-musl': 14.2.10 - '@next/swc-win32-arm64-msvc': 14.2.10 - '@next/swc-win32-ia32-msvc': 14.2.10 - '@next/swc-win32-x64-msvc': 14.2.10 + '@next/swc-darwin-arm64': 14.2.15 + '@next/swc-darwin-x64': 14.2.15 + '@next/swc-linux-arm64-gnu': 14.2.15 + '@next/swc-linux-arm64-musl': 14.2.15 + '@next/swc-linux-x64-gnu': 14.2.15 + '@next/swc-linux-x64-musl': 14.2.15 + '@next/swc-win32-arm64-msvc': 14.2.15 + '@next/swc-win32-ia32-msvc': 14.2.15 + '@next/swc-win32-x64-msvc': 14.2.15 '@playwright/test': 1.47.2 sass: 1.79.3 transitivePeerDependencies: @@ -31763,29 +31793,29 @@ snapshots: '@csstools/utilities': 1.0.0(postcss@8.4.47) postcss: 8.4.47 - postcss-load-config@4.0.2(postcss@8.4.47)(ts-node@10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(typescript@5.6.2)): + postcss-load-config@4.0.2(postcss@8.4.47)(ts-node@10.9.2(@swc/core@1.7.28)(@types/node@20.16.9)(typescript@5.6.2)): dependencies: lilconfig: 3.1.2 yaml: 2.5.1 optionalDependencies: postcss: 8.4.47 - ts-node: 10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(typescript@5.6.2) + ts-node: 10.9.2(@swc/core@1.7.28)(@types/node@20.16.9)(typescript@5.6.2) - postcss-load-config@4.0.2(postcss@8.4.47)(ts-node@10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@22.7.3)(typescript@5.6.2)): + postcss-load-config@4.0.2(postcss@8.4.47)(ts-node@10.9.2(@types/node@22.7.3)(typescript@5.6.2)): dependencies: lilconfig: 3.1.2 yaml: 2.5.1 optionalDependencies: postcss: 8.4.47 - ts-node: 10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@22.7.3)(typescript@5.6.2) + ts-node: 10.9.2(@types/node@22.7.3)(typescript@5.6.2) - postcss-loader@7.3.4(postcss@8.4.47)(typescript@5.6.2)(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))): + postcss-loader@7.3.4(postcss@8.4.47)(typescript@5.6.2)(webpack@5.95.0(@swc/core@1.7.28)(webpack-cli@5.1.4)): dependencies: cosmiconfig: 8.3.6(typescript@5.6.2) jiti: 1.21.6 postcss: 8.4.47 semver: 7.6.3 - webpack: 5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5)) + webpack: 5.95.0(@swc/core@1.7.28)(webpack-cli@5.1.4) transitivePeerDependencies: - typescript @@ -31795,7 +31825,7 @@ snapshots: jiti: 1.21.6 postcss: 8.4.47 semver: 7.6.3 - webpack: 5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(webpack-cli@5.1.4) + webpack: 5.95.0 transitivePeerDependencies: - typescript @@ -32300,7 +32330,7 @@ snapshots: react: 18.3.1 tween-functions: 1.2.0 - react-dev-utils@12.0.1(eslint@8.57.1)(typescript@5.6.2)(vue-template-compiler@2.7.16)(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))): + react-dev-utils@12.0.1(eslint@8.57.1)(typescript@5.6.2)(vue-template-compiler@2.7.16)(webpack@5.95.0): dependencies: '@babel/code-frame': 7.24.7 address: 1.2.2 @@ -32311,7 +32341,7 @@ snapshots: escape-string-regexp: 4.0.0 filesize: 8.0.7 find-up: 5.0.0 - fork-ts-checker-webpack-plugin: 6.5.3(eslint@8.57.1)(typescript@5.6.2)(vue-template-compiler@2.7.16)(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))) + fork-ts-checker-webpack-plugin: 6.5.3(eslint@8.57.1)(typescript@5.6.2)(vue-template-compiler@2.7.16)(webpack@5.95.0) global-modules: 2.0.0 globby: 11.1.0 gzip-size: 6.0.0 @@ -32326,7 +32356,7 @@ snapshots: shell-quote: 1.8.1 strip-ansi: 6.0.1 text-table: 0.2.0 - webpack: 5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5)) + webpack: 5.95.0 optionalDependencies: typescript: 5.6.2 transitivePeerDependencies: @@ -32427,11 +32457,11 @@ snapshots: sucrase: 3.35.0 use-editable: 2.3.3(react@18.3.1) - react-loadable-ssr-addon-v5-slorber@1.0.1(@docusaurus/react-loadable@6.0.0(react@18.3.1))(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))): + react-loadable-ssr-addon-v5-slorber@1.0.1(@docusaurus/react-loadable@6.0.0(react@18.3.1))(webpack@5.95.0): dependencies: '@babel/runtime': 7.25.6 react-loadable: '@docusaurus/react-loadable@6.0.0(react@18.3.1)' - webpack: 5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5)) + webpack: 5.95.0 react-number-format@5.4.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: @@ -33130,10 +33160,10 @@ snapshots: safer-buffer@2.1.2: {} - sass-loader@13.3.3(sass@1.79.3)(webpack@5.95.0): + sass-loader@13.3.3(sass@1.79.3)(webpack@5.95.0(@swc/core@1.7.28)(webpack-cli@5.1.4)): dependencies: neo-async: 2.6.2 - webpack: 5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(webpack-cli@5.1.4) + webpack: 5.95.0(@swc/core@1.7.28)(webpack-cli@5.1.4) optionalDependencies: sass: 1.79.3 @@ -33863,15 +33893,15 @@ snapshots: tailwind-merge@2.5.2: {} - tailwindcss-animate@1.0.7(tailwindcss@3.4.13(ts-node@10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(typescript@5.6.2))): + tailwindcss-animate@1.0.7(tailwindcss@3.4.13(ts-node@10.9.2(@swc/core@1.7.28)(@types/node@20.16.9)(typescript@5.6.2))): dependencies: - tailwindcss: 3.4.13(ts-node@10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(typescript@5.6.2)) + tailwindcss: 3.4.13(ts-node@10.9.2(@swc/core@1.7.28)(@types/node@20.16.9)(typescript@5.6.2)) - tailwindcss-animate@1.0.7(tailwindcss@3.4.13(ts-node@10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@22.7.3)(typescript@5.6.2))): + tailwindcss-animate@1.0.7(tailwindcss@3.4.13(ts-node@10.9.2(@types/node@22.7.3)(typescript@5.6.2))): dependencies: - tailwindcss: 3.4.13(ts-node@10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@22.7.3)(typescript@5.6.2)) + tailwindcss: 3.4.13(ts-node@10.9.2(@types/node@22.7.3)(typescript@5.6.2)) - tailwindcss@3.4.13(ts-node@10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(typescript@5.6.2)): + tailwindcss@3.4.13(ts-node@10.9.2(@swc/core@1.7.28)(@types/node@20.16.9)(typescript@5.6.2)): dependencies: '@alloc/quick-lru': 5.2.0 arg: 5.0.2 @@ -33890,7 +33920,7 @@ snapshots: postcss: 8.4.47 postcss-import: 15.1.0(postcss@8.4.47) postcss-js: 4.0.1(postcss@8.4.47) - postcss-load-config: 4.0.2(postcss@8.4.47)(ts-node@10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(typescript@5.6.2)) + postcss-load-config: 4.0.2(postcss@8.4.47)(ts-node@10.9.2(@swc/core@1.7.28)(@types/node@20.16.9)(typescript@5.6.2)) postcss-nested: 6.2.0(postcss@8.4.47) postcss-selector-parser: 6.1.2 resolve: 1.22.8 @@ -33898,7 +33928,7 @@ snapshots: transitivePeerDependencies: - ts-node - tailwindcss@3.4.13(ts-node@10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@22.7.3)(typescript@5.6.2)): + tailwindcss@3.4.13(ts-node@10.9.2(@types/node@22.7.3)(typescript@5.6.2)): dependencies: '@alloc/quick-lru': 5.2.0 arg: 5.0.2 @@ -33917,7 +33947,7 @@ snapshots: postcss: 8.4.47 postcss-import: 15.1.0(postcss@8.4.47) postcss-js: 4.0.1(postcss@8.4.47) - postcss-load-config: 4.0.2(postcss@8.4.47)(ts-node@10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@22.7.3)(typescript@5.6.2)) + postcss-load-config: 4.0.2(postcss@8.4.47)(ts-node@10.9.2(@types/node@22.7.3)(typescript@5.6.2)) postcss-nested: 6.2.0(postcss@8.4.47) postcss-selector-parser: 6.1.2 resolve: 1.22.8 @@ -33973,39 +34003,48 @@ snapshots: term-size@2.2.1: {} - terser-webpack-plugin@5.3.10(@swc/core@1.7.28(@swc/helpers@0.5.5))(webpack@5.94.0(@swc/core@1.7.28(@swc/helpers@0.5.5))): + terser-webpack-plugin@5.3.10(@swc/core@1.7.28)(webpack@5.94.0(@swc/core@1.7.28)): dependencies: '@jridgewell/trace-mapping': 0.3.25 jest-worker: 27.5.1 schema-utils: 3.3.0 serialize-javascript: 6.0.2 terser: 5.34.0 - webpack: 5.94.0(@swc/core@1.7.28(@swc/helpers@0.5.5)) + webpack: 5.94.0(@swc/core@1.7.28) optionalDependencies: '@swc/core': 1.7.28(@swc/helpers@0.5.5) - terser-webpack-plugin@5.3.10(@swc/core@1.7.28(@swc/helpers@0.5.5))(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))): + terser-webpack-plugin@5.3.10(@swc/core@1.7.28)(webpack@5.95.0(@swc/core@1.7.28)(webpack-cli@5.1.4)): dependencies: '@jridgewell/trace-mapping': 0.3.25 jest-worker: 27.5.1 schema-utils: 3.3.0 serialize-javascript: 6.0.2 terser: 5.34.0 - webpack: 5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5)) + webpack: 5.95.0(@swc/core@1.7.28)(webpack-cli@5.1.4) optionalDependencies: '@swc/core': 1.7.28(@swc/helpers@0.5.5) - terser-webpack-plugin@5.3.10(@swc/core@1.7.28(@swc/helpers@0.5.5))(webpack@5.95.0): + terser-webpack-plugin@5.3.10(@swc/core@1.7.28)(webpack@5.95.0(@swc/core@1.7.28)): dependencies: '@jridgewell/trace-mapping': 0.3.25 jest-worker: 27.5.1 schema-utils: 3.3.0 serialize-javascript: 6.0.2 terser: 5.34.0 - webpack: 5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(webpack-cli@5.1.4) + webpack: 5.95.0(@swc/core@1.7.28) optionalDependencies: '@swc/core': 1.7.28(@swc/helpers@0.5.5) + terser-webpack-plugin@5.3.10(webpack@5.95.0): + dependencies: + '@jridgewell/trace-mapping': 0.3.25 + jest-worker: 27.5.1 + schema-utils: 3.3.0 + serialize-javascript: 6.0.2 + terser: 5.34.0 + webpack: 5.95.0 + terser@5.34.0: dependencies: '@jridgewell/source-map': 0.3.6 @@ -34150,12 +34189,12 @@ snapshots: ts-interface-checker@0.1.13: {} - ts-jest@29.2.5(@babel/core@7.25.2)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.25.2))(jest@29.7.0(@types/node@20.16.9)(babel-plugin-macros@3.1.0)(node-notifier@10.0.0)(ts-node@10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(typescript@5.6.2)))(typescript@5.6.2): + ts-jest@29.2.5(@babel/core@7.25.2)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.25.2))(jest@29.7.0(@types/node@20.16.9)(babel-plugin-macros@3.1.0)(node-notifier@10.0.0)(ts-node@10.9.2(@types/node@20.16.9)(typescript@5.6.2)))(typescript@5.6.2): dependencies: bs-logger: 0.2.6 ejs: 3.1.10 fast-json-stable-stringify: 2.1.0 - jest: 29.7.0(@types/node@20.16.9)(babel-plugin-macros@3.1.0)(node-notifier@10.0.0)(ts-node@10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(typescript@5.6.2)) + jest: 29.7.0(@types/node@20.16.9)(babel-plugin-macros@3.1.0)(node-notifier@10.0.0)(ts-node@10.9.2(@types/node@20.16.9)(typescript@5.6.2)) jest-util: 29.7.0 json5: 2.2.3 lodash.memoize: 4.1.2 @@ -34169,7 +34208,7 @@ snapshots: '@jest/types': 29.6.3 babel-jest: 29.7.0(@babel/core@7.25.2) - ts-loader@9.5.1(typescript@5.6.2)(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))): + ts-loader@9.5.1(typescript@5.6.2)(webpack@5.95.0(@swc/core@1.7.28)(webpack-cli@5.1.4)): dependencies: chalk: 4.1.2 enhanced-resolve: 5.17.1 @@ -34177,9 +34216,9 @@ snapshots: semver: 7.6.3 source-map: 0.7.4 typescript: 5.6.2 - webpack: 5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5)) + webpack: 5.95.0(@swc/core@1.7.28)(webpack-cli@5.1.4) - ts-loader@9.5.1(typescript@5.6.2)(webpack@5.95.0): + ts-loader@9.5.1(typescript@5.6.2)(webpack@5.95.0(@swc/core@1.7.28)): dependencies: chalk: 4.1.2 enhanced-resolve: 5.17.1 @@ -34187,11 +34226,11 @@ snapshots: semver: 7.6.3 source-map: 0.7.4 typescript: 5.6.2 - webpack: 5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(webpack-cli@5.1.4) + webpack: 5.95.0(@swc/core@1.7.28) ts-log@2.2.5: {} - ts-node@10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@16.18.111)(typescript@5.1.6): + ts-node@10.9.2(@swc/core@1.7.28)(@types/node@16.18.111)(typescript@5.1.6): dependencies: '@cspotcode/source-map-support': 0.8.1 '@tsconfig/node10': 1.0.11 @@ -34211,7 +34250,7 @@ snapshots: optionalDependencies: '@swc/core': 1.7.28(@swc/helpers@0.5.5) - ts-node@10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(typescript@5.6.2): + ts-node@10.9.2(@swc/core@1.7.28)(@types/node@20.16.9)(typescript@5.6.2): dependencies: '@cspotcode/source-map-support': 0.8.1 '@tsconfig/node10': 1.0.11 @@ -34231,7 +34270,7 @@ snapshots: optionalDependencies: '@swc/core': 1.7.28(@swc/helpers@0.5.5) - ts-node@10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@22.7.3)(typescript@5.6.2): + ts-node@10.9.2(@types/node@22.7.3)(typescript@5.6.2): dependencies: '@cspotcode/source-map-support': 0.8.1 '@tsconfig/node10': 1.0.11 @@ -34248,8 +34287,6 @@ snapshots: typescript: 5.6.2 v8-compile-cache-lib: 3.0.1 yn: 3.1.1 - optionalDependencies: - '@swc/core': 1.7.28(@swc/helpers@0.5.5) optional: true ts-retry-promise@0.8.1: {} @@ -34419,14 +34456,14 @@ snapshots: transitivePeerDependencies: - supports-color - typescript-json-schema@0.64.0(@swc/core@1.7.28(@swc/helpers@0.5.5)): + typescript-json-schema@0.64.0(@swc/core@1.7.28): dependencies: '@types/json-schema': 7.0.15 '@types/node': 16.18.111 glob: 7.2.3 path-equal: 1.2.5 safe-stable-stringify: 2.5.0 - ts-node: 10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@16.18.111)(typescript@5.1.6) + ts-node: 10.9.2(@swc/core@1.7.28)(@types/node@16.18.111)(typescript@5.1.6) typescript: 5.1.6 yargs: 17.7.2 transitivePeerDependencies: @@ -34633,14 +34670,14 @@ snapshots: dependencies: punycode: 2.3.1 - url-loader@4.1.1(file-loader@6.2.0(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))))(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))): + url-loader@4.1.1(file-loader@6.2.0(webpack@5.95.0))(webpack@5.95.0): dependencies: loader-utils: 2.0.4 mime-types: 2.1.35 schema-utils: 3.3.0 - webpack: 5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5)) + webpack: 5.95.0 optionalDependencies: - file-loader: 6.2.0(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))) + file-loader: 6.2.0(webpack@5.95.0) url-parse@1.5.10: dependencies: @@ -35387,9 +35424,9 @@ snapshots: webpack-cli@5.1.4(webpack@5.95.0): dependencies: '@discoveryjs/json-ext': 0.5.7 - '@webpack-cli/configtest': 2.1.1(webpack-cli@5.1.4)(webpack@5.95.0) - '@webpack-cli/info': 2.0.2(webpack-cli@5.1.4)(webpack@5.95.0) - '@webpack-cli/serve': 2.0.5(webpack-cli@5.1.4)(webpack@5.95.0) + '@webpack-cli/configtest': 2.1.1(webpack-cli@5.1.4(webpack@5.95.0))(webpack@5.95.0(@swc/core@1.7.28)(webpack-cli@5.1.4)) + '@webpack-cli/info': 2.0.2(webpack-cli@5.1.4(webpack@5.95.0))(webpack@5.95.0(@swc/core@1.7.28)(webpack-cli@5.1.4)) + '@webpack-cli/serve': 2.0.5(webpack-cli@5.1.4(webpack@5.95.0))(webpack@5.95.0(@swc/core@1.7.28)(webpack-cli@5.1.4)) colorette: 2.0.20 commander: 10.0.1 cross-spawn: 7.0.5 @@ -35398,19 +35435,19 @@ snapshots: import-local: 3.2.0 interpret: 3.1.1 rechoir: 0.8.0 - webpack: 5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(webpack-cli@5.1.4) + webpack: 5.95.0(@swc/core@1.7.28)(webpack-cli@5.1.4) webpack-merge: 5.10.0 - webpack-dev-middleware@5.3.4(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))): + webpack-dev-middleware@5.3.4(webpack@5.95.0): dependencies: colorette: 2.0.20 memfs: 3.5.3 mime-types: 2.1.35 range-parser: 1.2.1 schema-utils: 4.2.0 - webpack: 5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5)) + webpack: 5.95.0 - webpack-dev-server@4.15.2(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))): + webpack-dev-server@4.15.2(webpack@5.95.0): dependencies: '@types/bonjour': 3.5.13 '@types/connect-history-api-fallback': 1.5.4 @@ -35440,10 +35477,10 @@ snapshots: serve-index: 1.9.1 sockjs: 0.3.24 spdy: 4.0.2 - webpack-dev-middleware: 5.3.4(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))) + webpack-dev-middleware: 5.3.4(webpack@5.95.0) ws: 8.18.0 optionalDependencies: - webpack: 5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5)) + webpack: 5.95.0 transitivePeerDependencies: - bufferutil - debug @@ -35462,7 +35499,37 @@ snapshots: webpack-virtual-modules@0.6.2: {} - webpack@5.94.0(@swc/core@1.7.28(@swc/helpers@0.5.5)): + webpack@5.94.0(@swc/core@1.7.28): + dependencies: + '@types/estree': 1.0.6 + '@webassemblyjs/ast': 1.12.1 + '@webassemblyjs/wasm-edit': 1.12.1 + '@webassemblyjs/wasm-parser': 1.12.1 + acorn: 8.12.1 + acorn-import-attributes: 1.9.5(acorn@8.12.1) + browserslist: 4.24.0 + chrome-trace-event: 1.0.4 + enhanced-resolve: 5.17.1 + es-module-lexer: 1.5.4 + eslint-scope: 5.1.1 + events: 3.3.0 + glob-to-regexp: 0.4.1 + graceful-fs: 4.2.11 + json-parse-even-better-errors: 2.3.1 + loader-runner: 4.3.0 + mime-types: 2.1.35 + neo-async: 2.6.2 + schema-utils: 3.3.0 + tapable: 2.2.1 + terser-webpack-plugin: 5.3.10(@swc/core@1.7.28)(webpack@5.94.0(@swc/core@1.7.28)) + watchpack: 2.4.2 + webpack-sources: 3.2.3 + transitivePeerDependencies: + - '@swc/core' + - esbuild + - uglify-js + + webpack@5.95.0: dependencies: '@types/estree': 1.0.6 '@webassemblyjs/ast': 1.12.1 @@ -35484,7 +35551,7 @@ snapshots: neo-async: 2.6.2 schema-utils: 3.3.0 tapable: 2.2.1 - terser-webpack-plugin: 5.3.10(@swc/core@1.7.28(@swc/helpers@0.5.5))(webpack@5.94.0(@swc/core@1.7.28(@swc/helpers@0.5.5))) + terser-webpack-plugin: 5.3.10(webpack@5.95.0) watchpack: 2.4.2 webpack-sources: 3.2.3 transitivePeerDependencies: @@ -35492,7 +35559,7 @@ snapshots: - esbuild - uglify-js - webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5)): + webpack@5.95.0(@swc/core@1.7.28): dependencies: '@types/estree': 1.0.6 '@webassemblyjs/ast': 1.12.1 @@ -35514,7 +35581,7 @@ snapshots: neo-async: 2.6.2 schema-utils: 3.3.0 tapable: 2.2.1 - terser-webpack-plugin: 5.3.10(@swc/core@1.7.28(@swc/helpers@0.5.5))(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))) + terser-webpack-plugin: 5.3.10(@swc/core@1.7.28)(webpack@5.95.0(@swc/core@1.7.28)) watchpack: 2.4.2 webpack-sources: 3.2.3 transitivePeerDependencies: @@ -35522,7 +35589,7 @@ snapshots: - esbuild - uglify-js - webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(webpack-cli@5.1.4): + webpack@5.95.0(@swc/core@1.7.28)(webpack-cli@5.1.4): dependencies: '@types/estree': 1.0.6 '@webassemblyjs/ast': 1.12.1 @@ -35544,7 +35611,7 @@ snapshots: neo-async: 2.6.2 schema-utils: 3.3.0 tapable: 2.2.1 - terser-webpack-plugin: 5.3.10(@swc/core@1.7.28(@swc/helpers@0.5.5))(webpack@5.95.0) + terser-webpack-plugin: 5.3.10(@swc/core@1.7.28)(webpack@5.95.0(@swc/core@1.7.28)(webpack-cli@5.1.4)) watchpack: 2.4.2 webpack-sources: 3.2.3 optionalDependencies: @@ -35554,13 +35621,13 @@ snapshots: - esbuild - uglify-js - webpackbar@5.0.2(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))): + webpackbar@5.0.2(webpack@5.95.0): dependencies: chalk: 4.1.2 consola: 2.15.3 pretty-time: 1.1.0 std-env: 3.7.0 - webpack: 5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5)) + webpack: 5.95.0 websocket-driver@0.7.4: dependencies: From 6b522486923fc388a9c3f9930c876b18416ca9a8 Mon Sep 17 00:00:00 2001 From: Thibault Martinez <thibault@iota.org> Date: Wed, 18 Dec 2024 10:16:37 +0100 Subject: [PATCH 71/97] chore(ci): print git status in simtest clippy.sh (#4530) * chore(ci): print git status in simtest clippy.sh * remove echo (to allow colors) --- scripts/simtest/clippy.sh | 1 + scripts/simtest/simtest-cov.sh | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/scripts/simtest/clippy.sh b/scripts/simtest/clippy.sh index 951e372c211..9b64233cc5e 100755 --- a/scripts/simtest/clippy.sh +++ b/scripts/simtest/clippy.sh @@ -5,6 +5,7 @@ # verify that git repo is clean if [[ -n $(git status -s) ]]; then echo "Working directory is not clean. Please commit all changes before running this script." + git status -s exit 1 fi diff --git a/scripts/simtest/simtest-cov.sh b/scripts/simtest/simtest-cov.sh index a8701b87c0c..acd415165eb 100755 --- a/scripts/simtest/simtest-cov.sh +++ b/scripts/simtest/simtest-cov.sh @@ -6,7 +6,7 @@ # verify that git repo is clean if [[ -n $(git status -s) ]]; then echo "Working directory is not clean. Please commit all changes before running this script." - echo $(git status -s) + git status -s exit 1 fi From b207e707aebc8f3e6a3236cc982cbb80edcbcfd4 Mon Sep 17 00:00:00 2001 From: cpl121 <100352899+cpl121@users.noreply.github.com> Date: Wed, 18 Dec 2024 10:37:25 +0100 Subject: [PATCH 72/97] feat(wallet-dashboard): add supply increase vesting overview to homepage (#4420) * feat: add supply increase vesting overview to homepage * fix: linter * fix(dashboard): remove isHoverable prop * fix(dashboard): use showDays in formatCountdown * fix(dashboard): rename vesting by supplyIncreaseVesting * fix: format * fix(dashboard): build * fix(dashboard): format * fix(dashboard): styles * fix(dashboard): isTimelockedStakedObjectsLoading name and join 2 invalidateQueries in 1 * fix(dashboard): format * fix(dasboard): undo the split of the query invalidation * fix(dashboard): rename unlockAllsupplyIncreaseVesting and disable new stake button * feat(dashboard): add object for the options in useCountdownByTimestamp * fix: linter * fix: linter * fix(core): improve naming * fix(core): linter --------- Co-authored-by: evavirseda <evirseda@boxfish.studio> Co-authored-by: Bran <52735957+brancoder@users.noreply.github.com> --- .../core/src/hooks/useCountdownByTimestamp.ts | 34 +++- .../app/(protected)/home/page.tsx | 6 +- .../app/(protected)/vesting/page.tsx | 118 ++++---------- apps/wallet-dashboard/app/globals.css | 54 +++++++ .../SupplyIncreaseVestingOverview.tsx | 151 ++++++++++++++++++ apps/wallet-dashboard/components/index.ts | 1 + apps/wallet-dashboard/hooks/index.ts | 1 + .../useGetSupplyIncreaseVestingObjects.ts | 112 +++++++++++++ 8 files changed, 383 insertions(+), 94 deletions(-) create mode 100644 apps/wallet-dashboard/components/SupplyIncreaseVestingOverview.tsx create mode 100644 apps/wallet-dashboard/hooks/useGetSupplyIncreaseVestingObjects.ts diff --git a/apps/core/src/hooks/useCountdownByTimestamp.ts b/apps/core/src/hooks/useCountdownByTimestamp.ts index 3b79b69b915..18a5a598292 100644 --- a/apps/core/src/hooks/useCountdownByTimestamp.ts +++ b/apps/core/src/hooks/useCountdownByTimestamp.ts @@ -9,7 +9,17 @@ import { MILLISECONDS_PER_SECOND, } from '../constants'; -export function useCountdownByTimestamp(initialTimestamp: number | null): string { +interface FormatCountdownOptions { + showSeconds?: boolean; + showMinutes?: boolean; + showHours?: boolean; + showDays?: boolean; +} + +export function useCountdownByTimestamp( + initialTimestamp: number | null, + options?: FormatCountdownOptions, +): string { const [timeRemainingMs, setTimeRemainingMs] = useState<number>(0); useEffect(() => { @@ -22,11 +32,19 @@ export function useCountdownByTimestamp(initialTimestamp: number | null): string return () => clearInterval(interval); }, [initialTimestamp]); - const formattedCountdown = formatCountdown(timeRemainingMs); + const formattedCountdown = formatCountdown(timeRemainingMs, options); return formattedCountdown; } -function formatCountdown(totalMilliseconds: number) { +function formatCountdown( + totalMilliseconds: number, + { + showSeconds = true, + showMinutes = true, + showHours = true, + showDays = true, + }: FormatCountdownOptions = {}, +) { const days = Math.floor(totalMilliseconds / MILLISECONDS_PER_DAY); const hours = Math.floor((totalMilliseconds % MILLISECONDS_PER_DAY) / MILLISECONDS_PER_HOUR); const minutes = Math.floor( @@ -36,11 +54,11 @@ function formatCountdown(totalMilliseconds: number) { (totalMilliseconds % MILLISECONDS_PER_MINUTE) / MILLISECONDS_PER_SECOND, ); - const timeUnits = []; - if (days > 0) timeUnits.push(`${days}d`); - if (hours > 0) timeUnits.push(`${hours}h`); - if (minutes > 0) timeUnits.push(`${minutes}m`); - if (seconds > 0 || timeUnits.length === 0) timeUnits.push(`${seconds}s`); + const timeUnits: string[] = []; + if (showDays && days > 0) timeUnits.push(`${days}d`); + if (showHours && hours > 0) timeUnits.push(`${hours}h`); + if (showMinutes && minutes > 0) timeUnits.push(`${minutes}m`); + if (showSeconds && (seconds > 0 || timeUnits.length === 0)) timeUnits.push(`${seconds}s`); return timeUnits.join(' '); } diff --git a/apps/wallet-dashboard/app/(protected)/home/page.tsx b/apps/wallet-dashboard/app/(protected)/home/page.tsx index 61f55475702..774edce294c 100644 --- a/apps/wallet-dashboard/app/(protected)/home/page.tsx +++ b/apps/wallet-dashboard/app/(protected)/home/page.tsx @@ -8,6 +8,7 @@ import { TransactionsOverview, StakingOverview, MigrationOverview, + SupplyIncreaseVestingOverview, } from '@/components'; import { useFeature } from '@growthbook/growthbook-react'; import { Feature } from '@iota/core'; @@ -18,6 +19,7 @@ function HomeDashboardPage(): JSX.Element { const account = useCurrentAccount(); const stardustMigrationEnabled = useFeature<boolean>(Feature.StardustMigration).value; + const supplyIncreaseVestingEnabled = useFeature<boolean>(Feature.SupplyIncreaseVesting).value; return ( <main className="flex flex-1 flex-col items-center space-y-8 py-md"> @@ -34,9 +36,7 @@ function HomeDashboardPage(): JSX.Element { <div style={{ gridArea: 'coins' }}> <MyCoins /> </div> - <div style={{ gridArea: 'vesting' }} className="flex grow overflow-hidden"> - Vesting - </div> + {supplyIncreaseVestingEnabled && <SupplyIncreaseVestingOverview />} <div style={{ gridArea: 'activity' }} className="flex grow overflow-hidden"> <TransactionsOverview /> </div> diff --git a/apps/wallet-dashboard/app/(protected)/vesting/page.tsx b/apps/wallet-dashboard/app/(protected)/vesting/page.tsx index cf53a40fe85..e29d94a7fef 100644 --- a/apps/wallet-dashboard/app/(protected)/vesting/page.tsx +++ b/apps/wallet-dashboard/app/(protected)/vesting/page.tsx @@ -13,17 +13,8 @@ import { } from '@/components'; import { UnstakeDialogView } from '@/components/Dialogs/unstake/enums'; import { useUnstakeDialog } from '@/components/Dialogs/unstake/hooks'; -import { useGetCurrentEpochStartTimestamp, useNotifications } from '@/hooks'; -import { - buildSupplyIncreaseVestingSchedule, - formatDelegatedTimelockedStake, - getLatestOrEarliestSupplyIncreaseVestingPayout, - getVestingOverview, - groupTimelockedStakedObjects, - isTimelockedUnlockable, - mapTimelockObjects, - TimelockedStakedObjectsGrouped, -} from '@/lib/utils'; +import { useGetSupplyIncreaseVestingObjects, useNotifications } from '@/hooks'; +import { groupTimelockedStakedObjects, TimelockedStakedObjectsGrouped } from '@/lib/utils'; import { NotificationType } from '@/stores/notificationStore'; import { useFeature } from '@growthbook/growthbook-react'; import { @@ -46,13 +37,9 @@ import { } from '@iota/apps-ui-kit'; import { Theme, - TIMELOCK_IOTA_TYPE, useFormatCoin, useGetActiveValidatorsInfo, - useGetAllOwnedObjects, - useGetTimelockedStakedObjects, useTheme, - useUnlockTimelockedObjectsTransaction, useCountdownByTimestamp, Feature, } from '@iota/core'; @@ -74,24 +61,13 @@ export default function VestingDashboardPage(): JSX.Element { const [timelockedObjectsToUnstake, setTimelockedObjectsToUnstake] = useState<TimelockedStakedObjectsGrouped | null>(null); const account = useCurrentAccount(); + const address = account?.address || ''; const iotaClient = useIotaClient(); const router = useRouter(); const { data: system } = useIotaClientQuery('getLatestIotaSystemState'); const [isVestingScheduleDialogOpen, setIsVestingScheduleDialogOpen] = useState(false); const { addNotification } = useNotifications(); - const { data: currentEpochMs } = useGetCurrentEpochStartTimestamp(); const { data: activeValidators } = useGetActiveValidatorsInfo(); - const { data: timelockedObjects, refetch: refetchGetAllOwnedObjects } = useGetAllOwnedObjects( - account?.address || '', - { - StructType: TIMELOCK_IOTA_TYPE, - }, - ); - const { - data: timelockedStakedObjects, - isLoading: istimelockedStakedObjectsLoading, - refetch: refetchTimelockedStakedObjects, - } = useGetTimelockedStakedObjects(account?.address || ''); const { mutateAsync: signAndExecuteTransaction } = useSignAndExecuteTransaction(); const { theme } = useTheme(); @@ -102,16 +78,19 @@ export default function VestingDashboardPage(): JSX.Element { const supplyIncreaseVestingEnabled = useFeature<boolean>(Feature.SupplyIncreaseVesting).value; - const timelockedMapped = mapTimelockObjects(timelockedObjects || []); - const timelockedstakedMapped = formatDelegatedTimelockedStake(timelockedStakedObjects || []); + const { + nextPayout, + supplyIncreaseVestingPortfolio, + supplyIncreaseVestingSchedule, + supplyIncreaseVestingMapped, + supplyIncreaseVestingStakedMapped, + isTimelockedStakedObjectsLoading, + unlockAllSupplyIncreaseVesting, + refreshStakeList, + } = useGetSupplyIncreaseVestingObjects(address); const timelockedStakedObjectsGrouped: TimelockedStakedObjectsGrouped[] = - groupTimelockedStakedObjects(timelockedstakedMapped || []); - - const vestingSchedule = getVestingOverview( - [...timelockedMapped, ...timelockedstakedMapped], - Number(currentEpochMs), - ); + groupTimelockedStakedObjects(supplyIncreaseVestingStakedMapped || []); const { isDialogStakeOpen, @@ -132,37 +111,22 @@ export default function VestingDashboardPage(): JSX.Element { setView: setUnstakeDialogView, } = useUnstakeDialog(); - const nextPayout = getLatestOrEarliestSupplyIncreaseVestingPayout( - [...timelockedMapped, ...timelockedstakedMapped], - Number(currentEpochMs), - false, - ); - - const lastPayout = getLatestOrEarliestSupplyIncreaseVestingPayout( - [...timelockedMapped, ...timelockedstakedMapped], - Number(currentEpochMs), - true, - ); - - const vestingPortfolio = - lastPayout && buildSupplyIncreaseVestingSchedule(lastPayout, Number(currentEpochMs)); - const formattedLastPayoutExpirationTime = useCountdownByTimestamp( Number(nextPayout?.expirationTimestampMs), ); const [formattedTotalVested, vestedSymbol] = useFormatCoin( - vestingSchedule.totalVested, + supplyIncreaseVestingSchedule.totalVested, IOTA_TYPE_ARG, ); const [formattedTotalLocked, lockedSymbol] = useFormatCoin( - vestingSchedule.totalLocked, + supplyIncreaseVestingSchedule.totalLocked, IOTA_TYPE_ARG, ); const [formattedAvailableClaiming, availableClaimingSymbol] = useFormatCoin( - vestingSchedule.availableClaiming, + supplyIncreaseVestingSchedule.availableClaiming, IOTA_TYPE_ARG, ); @@ -178,30 +142,15 @@ export default function VestingDashboardPage(): JSX.Element { } const [totalStakedFormatted, totalStakedSymbol] = useFormatCoin( - vestingSchedule.totalStaked, + supplyIncreaseVestingSchedule.totalStaked, IOTA_TYPE_ARG, ); const [totalEarnedFormatted, totalEarnedSymbol] = useFormatCoin( - vestingSchedule.totalEarned, + supplyIncreaseVestingSchedule.totalEarned, IOTA_TYPE_ARG, ); - const unlockedTimelockedObjects = timelockedMapped?.filter((timelockedObject) => - isTimelockedUnlockable(timelockedObject, Number(currentEpochMs)), - ); - const unlockedTimelockedObjectIds: string[] = - unlockedTimelockedObjects.map((timelocked) => timelocked.id.id) || []; - const { data: unlockAllTimelockedObjects } = useUnlockTimelockedObjectsTransaction( - account?.address || '', - unlockedTimelockedObjectIds, - ); - - function refreshStakeList() { - refetchTimelockedStakedObjects(); - refetchGetAllOwnedObjects(); - } - function handleOnSuccess(digest: string): void { setTimelockedObjectsToUnstake(null); @@ -213,13 +162,13 @@ export default function VestingDashboardPage(): JSX.Element { } const handleCollect = () => { - if (!unlockAllTimelockedObjects?.transactionBlock) { + if (!unlockAllSupplyIncreaseVesting?.transactionBlock) { addNotification('Failed to create a Transaction', NotificationType.Error); return; } signAndExecuteTransaction( { - transaction: unlockAllTimelockedObjects.transactionBlock, + transaction: unlockAllSupplyIncreaseVesting.transactionBlock, }, { onSuccess: (tx) => { @@ -258,7 +207,7 @@ export default function VestingDashboardPage(): JSX.Element { } }, [router, supplyIncreaseVestingEnabled]); - if (istimelockedStakedObjectsLoading) { + if (isTimelockedStakedObjectsLoading) { return ( <div className="flex w-full max-w-4xl items-start justify-center justify-self-center"> <LoadingIndicator /> @@ -304,8 +253,8 @@ export default function VestingDashboardPage(): JSX.Element { title="Collect" buttonType={ButtonType.Primary} buttonDisabled={ - !vestingSchedule.availableClaiming || - vestingSchedule.availableClaiming === 0n + !supplyIncreaseVestingSchedule.availableClaiming || + supplyIncreaseVestingSchedule.availableClaiming === 0n } /> </Card> @@ -329,20 +278,20 @@ export default function VestingDashboardPage(): JSX.Element { onClick={openReceiveTokenDialog} title="See All" buttonType={ButtonType.Secondary} - buttonDisabled={!vestingPortfolio} + buttonDisabled={!supplyIncreaseVestingPortfolio} /> </Card> - {vestingPortfolio && ( + {supplyIncreaseVestingPortfolio && ( <VestingScheduleDialog open={isVestingScheduleDialogOpen} setOpen={setIsVestingScheduleDialogOpen} - vestingPortfolio={vestingPortfolio} + vestingPortfolio={supplyIncreaseVestingPortfolio} /> )} </div> </Panel> - {timelockedstakedMapped.length === 0 ? ( + {supplyIncreaseVestingMapped.length === 0 ? ( <Banner videoSrc={videoSrc} title="Stake Vested Tokens" @@ -353,7 +302,7 @@ export default function VestingDashboardPage(): JSX.Element { ) : null} </div> - {timelockedstakedMapped.length !== 0 ? ( + {supplyIncreaseVestingMapped.length !== 0 ? ( <div className="flex w-full md:w-1/2"> <Panel> <Title @@ -362,7 +311,9 @@ export default function VestingDashboardPage(): JSX.Element { <Button type={ButtonType.Primary} text="Stake" - disabled={vestingSchedule.availableStaking === 0n} + disabled={ + supplyIncreaseVestingSchedule.availableStaking === 0n + } onClick={() => { setStakeDialogView(StakeDialogView.SelectValidator); }} @@ -422,8 +373,9 @@ export default function VestingDashboardPage(): JSX.Element { setView={setStakeDialogView} selectedValidator={selectedValidator} setSelectedValidator={setSelectedValidator} - maxStakableTimelockedAmount={BigInt(vestingSchedule.availableStaking)} - onUnstakeClick={openUnstakeDialog} + maxStakableTimelockedAmount={BigInt( + supplyIncreaseVestingSchedule.availableStaking, + )} /> )} diff --git a/apps/wallet-dashboard/app/globals.css b/apps/wallet-dashboard/app/globals.css index 04c6811f389..2d87e758bc0 100644 --- a/apps/wallet-dashboard/app/globals.css +++ b/apps/wallet-dashboard/app/globals.css @@ -24,7 +24,24 @@ body { 'balance' 'staking' 'coins' + 'activity'; + + & + > *:where( + [style*='grid-area: balance'], + [style*='grid-area: staking'], + [style*='grid-area: migration'] + ) { + height: 200px; + } + } + .home-page-grid-container:has(.with-vesting) { + @apply grid grid-cols-1 gap-lg; + grid-template-areas: + 'balance' + 'staking' 'vesting' + 'coins' 'activity'; & @@ -42,7 +59,16 @@ body { 'staking' 'migration' 'coins' + 'activity'; + } + .home-page-grid-container:has(.with-migration), + .home-page-grid-container:has(.with-vesting) { + grid-template-areas: + 'balance' + 'staking' + 'migration' 'vesting' + 'coins' 'activity'; } @@ -53,7 +79,15 @@ body { 'balance balance' 'staking staking' 'coins coins' + 'activity activity'; + } + .home-page-grid-container:has(.with-vesting) { + @apply grid-cols-2; + grid-template-areas: + 'balance balance' + 'staking staking' 'vesting vesting' + 'coins coins' 'activity activity'; } .home-page-grid-container:has(.with-migration) { @@ -61,7 +95,15 @@ body { 'balance balance' 'staking migration' 'coins coins' + 'activity activity'; + } + .home-page-grid-container:has(.with-migration), + .home-page-grid-container:has(.with-vesting) { + grid-template-areas: + 'balance balance' + 'staking migration' 'vesting vesting' + 'coins coins' 'activity activity'; } } @@ -69,12 +111,24 @@ body { @screen md { .home-page-grid-container { @apply grid-cols-3; + grid-template-areas: + 'balance staking staking' + 'coins activity activity'; + } + .home-page-grid-container:has(.with-vesting) { grid-template-areas: 'balance staking staking' 'coins vesting vesting' 'coins activity activity'; } .home-page-grid-container:has(.with-migration) { + @apply grid-cols-3; + grid-template-areas: + 'balance staking migration' + 'coins activity activity'; + } + .home-page-grid-container:has(.with-migration), + .home-page-grid-container:has(.with-vesting) { grid-template-areas: 'balance staking migration' 'coins vesting vesting' diff --git a/apps/wallet-dashboard/components/SupplyIncreaseVestingOverview.tsx b/apps/wallet-dashboard/components/SupplyIncreaseVestingOverview.tsx new file mode 100644 index 00000000000..7608bda1a3a --- /dev/null +++ b/apps/wallet-dashboard/components/SupplyIncreaseVestingOverview.tsx @@ -0,0 +1,151 @@ +// Copyright (c) 2024 IOTA Stiftung +// SPDX-License-Identifier: Apache-2.0 + +import { useCurrentAccount, useIotaClient } from '@iota/dapp-kit'; +import { useGetSupplyIncreaseVestingObjects } from '@/hooks'; +import { + ButtonType, + Card, + CardAction, + CardActionType, + CardBody, + CardType, + LabelText, + LabelTextSize, + Panel, + Title, +} from '@iota/apps-ui-kit'; +import { StakeDialog, useStakeDialog } from './Dialogs'; +import { TIMELOCK_IOTA_TYPE, useCountdownByTimestamp, useFormatCoin } from '@iota/core'; +import { IOTA_TYPE_ARG } from '@iota/iota-sdk/utils'; +import SvgClock from '@iota/ui-icons/src/Clock'; +import { useQueryClient } from '@tanstack/react-query'; + +export function SupplyIncreaseVestingOverview() { + const account = useCurrentAccount(); + const address = account?.address || ''; + const iotaClient = useIotaClient(); + const queryClient = useQueryClient(); + const { + nextPayout, + supplyIncreaseVestingSchedule, + supplyIncreaseVestingMapped, + supplyIncreaseVestingStakedMapped, + } = useGetSupplyIncreaseVestingObjects(address); + + const { + stakeDialogView, + setStakeDialogView, + selectedStake, + selectedValidator, + setSelectedValidator, + handleCloseStakeDialog, + handleNewStake, + } = useStakeDialog(); + + const formattedLastPayoutExpirationTime = useCountdownByTimestamp( + Number(nextPayout?.expirationTimestampMs), + { showSeconds: false, showMinutes: false }, + ); + const [formattedNextPayout, nextPayoutSymbol, nextPayoutResult] = useFormatCoin( + nextPayout?.amount, + IOTA_TYPE_ARG, + ); + + const [formattedAvailableStaking, availableStakingSymbol] = useFormatCoin( + supplyIncreaseVestingSchedule.availableStaking, + IOTA_TYPE_ARG, + ); + + const showSupplyIncreaseVestingOverview = + supplyIncreaseVestingMapped.length > 0 || supplyIncreaseVestingStakedMapped.length > 0; + + function handleOnSuccess(digest: string): void { + iotaClient + .waitForTransaction({ + digest, + }) + .then(() => { + queryClient.invalidateQueries({ + queryKey: ['get-timelocked-staked-objects', account?.address], + }); + queryClient.invalidateQueries({ + queryKey: [ + 'get-all-owned-objects', + account?.address, + { + StructType: TIMELOCK_IOTA_TYPE, + }, + ], + }); + }); + } + + return showSupplyIncreaseVestingOverview ? ( + <div style={{ gridArea: 'vesting' }} className="with-vesting flex grow overflow-hidden"> + <Panel> + <Title title="Vesting" /> + <div className="flex h-full w-full items-center gap-md p-md--rs"> + <div className="w-1/2"> + <Card type={CardType.Filled}> + <CardBody + title="" + subtitle={ + <LabelText + size={LabelTextSize.Large} + label="Next reward" + text={ + nextPayoutResult.isPending + ? '-' + : `${formattedNextPayout} ` + } + supportingLabel={nextPayoutSymbol} + /> + } + /> + <CardAction + type={CardActionType.Button} + buttonType={ButtonType.Ghost} + title={formattedLastPayoutExpirationTime} + icon={<SvgClock />} + /> + </Card> + </div> + <div className="w-1/2"> + <Card type={CardType.Filled}> + <CardBody + title="" + subtitle={ + <LabelText + size={LabelTextSize.Large} + label="Available for staking" + text={formattedAvailableStaking} + supportingLabel={availableStakingSymbol} + /> + } + /> + <CardAction + type={CardActionType.Button} + buttonType={ButtonType.Primary} + title={'Stake'} + onClick={() => handleNewStake()} + buttonDisabled={!supplyIncreaseVestingSchedule.availableStaking} + /> + </Card> + </div> + </div> + </Panel> + <StakeDialog + isTimelockedStaking={true} + stakedDetails={selectedStake} + onSuccess={handleOnSuccess} + handleClose={handleCloseStakeDialog} + view={stakeDialogView} + setView={setStakeDialogView} + selectedValidator={selectedValidator} + setSelectedValidator={setSelectedValidator} + maxStakableTimelockedAmount={BigInt(supplyIncreaseVestingSchedule.availableStaking)} + /> + </div> + ) : null; +} diff --git a/apps/wallet-dashboard/components/index.ts b/apps/wallet-dashboard/components/index.ts index e39bf76a350..fcccf7b3a95 100644 --- a/apps/wallet-dashboard/components/index.ts +++ b/apps/wallet-dashboard/components/index.ts @@ -27,4 +27,5 @@ export * from './Toaster'; export * from './Banner'; export * from './StakeRewardsPanel'; export * from './MigrationOverview'; +export * from './SupplyIncreaseVestingOverview'; export * from './staked-timelock-object'; diff --git a/apps/wallet-dashboard/hooks/index.ts b/apps/wallet-dashboard/hooks/index.ts index 2c8fed3331f..5ad872afeed 100644 --- a/apps/wallet-dashboard/hooks/index.ts +++ b/apps/wallet-dashboard/hooks/index.ts @@ -10,5 +10,6 @@ export * from './useGetCurrentEpochStartTimestamp'; export * from './useTimelockedUnstakeTransaction'; export * from './useExplorerLinkGetter'; export * from './useGetStardustMigratableObjects'; +export * from './useGetSupplyIncreaseVestingObjects'; export * from './useGroupedMigrationObjectsByExpirationDate'; export * from './useTransferTransaction'; diff --git a/apps/wallet-dashboard/hooks/useGetSupplyIncreaseVestingObjects.ts b/apps/wallet-dashboard/hooks/useGetSupplyIncreaseVestingObjects.ts new file mode 100644 index 00000000000..58d19d63641 --- /dev/null +++ b/apps/wallet-dashboard/hooks/useGetSupplyIncreaseVestingObjects.ts @@ -0,0 +1,112 @@ +// Copyright (c) 2024 IOTA Stiftung +// SPDX-License-Identifier: Apache-2.0 + +import { useGetCurrentEpochStartTimestamp } from '@/hooks'; +import { + SupplyIncreaseVestingPayout, + SupplyIncreaseVestingPortfolio, + TimelockedObject, + VestingOverview, +} from '@/lib/interfaces'; +import { + buildSupplyIncreaseVestingSchedule, + ExtendedDelegatedTimelockedStake, + formatDelegatedTimelockedStake, + getLatestOrEarliestSupplyIncreaseVestingPayout, + getVestingOverview, + isSupplyIncreaseVestingObject, + isTimelockedUnlockable, + mapTimelockObjects, +} from '@/lib/utils'; +import { + TIMELOCK_IOTA_TYPE, + useGetAllOwnedObjects, + useGetTimelockedStakedObjects, + useUnlockTimelockedObjectsTransaction, +} from '@iota/core'; +import { Transaction } from '@iota/iota-sdk/transactions'; + +export function useGetSupplyIncreaseVestingObjects(address: string): { + nextPayout: SupplyIncreaseVestingPayout | undefined; + lastPayout: SupplyIncreaseVestingPayout | undefined; + supplyIncreaseVestingSchedule: VestingOverview; + supplyIncreaseVestingPortfolio: SupplyIncreaseVestingPortfolio | undefined; + supplyIncreaseVestingMapped: TimelockedObject[]; + supplyIncreaseVestingStakedMapped: ExtendedDelegatedTimelockedStake[]; + isTimelockedStakedObjectsLoading: boolean; + unlockAllSupplyIncreaseVesting: + | { + transactionBlock: Transaction; + } + | undefined; + refreshStakeList: () => void; +} { + const { data: currentEpochMs } = useGetCurrentEpochStartTimestamp(); + + const { data: timelockedObjects, refetch: refetchGetAllOwnedObjects } = useGetAllOwnedObjects( + address || '', + { + StructType: TIMELOCK_IOTA_TYPE, + }, + ); + const { + data: timelockedStakedObjects, + isLoading: isTimelockedStakedObjectsLoading, + refetch: refetchTimelockedStakedObjects, + } = useGetTimelockedStakedObjects(address || ''); + + const supplyIncreaseVestingMapped = mapTimelockObjects(timelockedObjects || []).filter( + isSupplyIncreaseVestingObject, + ); + const supplyIncreaseVestingStakedMapped = formatDelegatedTimelockedStake( + timelockedStakedObjects || [], + ).filter(isSupplyIncreaseVestingObject); + + const supplyIncreaseVestingSchedule = getVestingOverview( + [...supplyIncreaseVestingMapped, ...supplyIncreaseVestingStakedMapped], + Number(currentEpochMs), + ); + + const nextPayout = getLatestOrEarliestSupplyIncreaseVestingPayout( + [...supplyIncreaseVestingMapped, ...supplyIncreaseVestingStakedMapped], + Number(currentEpochMs), + false, + ); + + const lastPayout = getLatestOrEarliestSupplyIncreaseVestingPayout( + [...supplyIncreaseVestingMapped, ...supplyIncreaseVestingStakedMapped], + Number(currentEpochMs), + true, + ); + + const supplyIncreaseVestingPortfolio = + lastPayout && buildSupplyIncreaseVestingSchedule(lastPayout, Number(currentEpochMs)); + + const supplyIncreaseVestingUnlocked = supplyIncreaseVestingMapped?.filter( + (supplyIncreaseVestingObject) => + isTimelockedUnlockable(supplyIncreaseVestingObject, Number(currentEpochMs)), + ); + const supplyIncreaseVestingUnlockedObjectIds: string[] = + supplyIncreaseVestingUnlocked.map((unlockedObject) => unlockedObject.id.id) || []; + const { data: unlockAllSupplyIncreaseVesting } = useUnlockTimelockedObjectsTransaction( + address || '', + supplyIncreaseVestingUnlockedObjectIds, + ); + + function refreshStakeList() { + refetchTimelockedStakedObjects(); + refetchGetAllOwnedObjects(); + } + + return { + nextPayout, + lastPayout, + supplyIncreaseVestingSchedule, + supplyIncreaseVestingPortfolio, + supplyIncreaseVestingMapped, + supplyIncreaseVestingStakedMapped, + isTimelockedStakedObjectsLoading, + unlockAllSupplyIncreaseVesting, + refreshStakeList, + }; +} From 8c3a220bfb09fb5edf4327b041a808b9780061a4 Mon Sep 17 00:00:00 2001 From: Marc Espin <mespinsanz@gmail.com> Date: Wed, 18 Dec 2024 10:42:08 +0100 Subject: [PATCH 73/97] refactor(sdk): Update to eslint v9 in create-dapp templates (#4507) * refactor(sdk): Update to eslint v9 in create-dapp react-client-dapp * refactor(sdk): Update to eslint v9 in create-dapp react-e2e-counter * refactor(sdk): Exclude the templates from the pnpm workspace * fmt * Add changeset --- .changeset/nice-crabs-wink.md | 5 + pnpm-lock.yaml | 747 +++--------------- pnpm-workspace.yaml | 2 +- .../react-client-dapp/eslint.config.js | 28 + .../templates/react-client-dapp/package.json | 18 +- .../react-e2e-counter/eslint.config.js | 28 + .../templates/react-e2e-counter/package.json | 18 +- 7 files changed, 173 insertions(+), 673 deletions(-) create mode 100644 .changeset/nice-crabs-wink.md create mode 100644 sdk/create-dapp/templates/react-client-dapp/eslint.config.js create mode 100644 sdk/create-dapp/templates/react-e2e-counter/eslint.config.js diff --git a/.changeset/nice-crabs-wink.md b/.changeset/nice-crabs-wink.md new file mode 100644 index 00000000000..63aac17cb26 --- /dev/null +++ b/.changeset/nice-crabs-wink.md @@ -0,0 +1,5 @@ +--- +'@iota/create-dapp': minor +--- + +Update some outdated eslint dependencies of the `@iota/create-dapp` templates, to their eslint v9-compatible versions diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 2d3181eaebb..005fb06d7d4 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1560,128 +1560,6 @@ importers: specifier: ^5.5.3 version: 5.6.2 - sdk/create-dapp/templates/react-client-dapp: - dependencies: - '@iota/dapp-kit': - specifier: workspace:* - version: link:../../../dapp-kit - '@iota/iota-sdk': - specifier: workspace:* - version: link:../../../typescript - '@radix-ui/colors': - specifier: ^3.0.0 - version: 3.0.0 - '@radix-ui/react-icons': - specifier: ^1.3.0 - version: 1.3.0(react@18.3.1) - '@radix-ui/themes': - specifier: ^3.1.1 - version: 3.1.4(@types/react-dom@18.3.0)(@types/react@18.3.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@tanstack/react-query': - specifier: ^5.50.1 - version: 5.56.2(react@18.3.1) - react: - specifier: ^18.3.1 - version: 18.3.1 - react-dom: - specifier: ^18.3.1 - version: 18.3.1(react@18.3.1) - devDependencies: - '@types/react': - specifier: ^18.3.3 - version: 18.3.9 - '@types/react-dom': - specifier: ^18.3.0 - version: 18.3.0 - '@typescript-eslint/eslint-plugin': - specifier: ^7.16.0 - version: 7.18.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.6.2))(eslint@8.57.1)(typescript@5.6.2) - '@typescript-eslint/parser': - specifier: ^7.16.0 - version: 7.18.0(eslint@8.57.1)(typescript@5.6.2) - '@vitejs/plugin-react-swc': - specifier: ^3.7.0 - version: 3.7.0(@swc/helpers@0.5.5)(vite@5.4.8(@types/node@22.7.3)(sass@1.79.3)(terser@5.34.0)) - eslint: - specifier: 8.57.1 - version: 8.57.1 - eslint-plugin-react-hooks: - specifier: ^4.6.2 - version: 4.6.2(eslint@8.57.1) - eslint-plugin-react-refresh: - specifier: ^0.4.7 - version: 0.4.12(eslint@8.57.1) - prettier: - specifier: ^3.3.2 - version: 3.3.3 - typescript: - specifier: ^5.5.3 - version: 5.6.2 - vite: - specifier: ^5.3.3 - version: 5.4.8(@types/node@22.7.3)(sass@1.79.3)(terser@5.34.0) - - sdk/create-dapp/templates/react-e2e-counter: - dependencies: - '@iota/dapp-kit': - specifier: workspace:* - version: link:../../../dapp-kit - '@iota/iota-sdk': - specifier: workspace:* - version: link:../../../typescript - '@radix-ui/colors': - specifier: ^3.0.0 - version: 3.0.0 - '@radix-ui/react-icons': - specifier: ^1.3.0 - version: 1.3.0(react@18.3.1) - '@radix-ui/themes': - specifier: ^3.1.1 - version: 3.1.4(@types/react-dom@18.3.0)(@types/react@18.3.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@tanstack/react-query': - specifier: ^5.50.1 - version: 5.56.2(react@18.3.1) - react: - specifier: ^18.3.1 - version: 18.3.1 - react-dom: - specifier: ^18.3.1 - version: 18.3.1(react@18.3.1) - devDependencies: - '@types/react': - specifier: ^18.3.3 - version: 18.3.9 - '@types/react-dom': - specifier: ^18.3.0 - version: 18.3.0 - '@typescript-eslint/eslint-plugin': - specifier: ^6.1.0 - version: 6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.6.2))(eslint@8.57.1)(typescript@5.6.2) - '@typescript-eslint/parser': - specifier: ^6.1.0 - version: 6.21.0(eslint@8.57.1)(typescript@5.6.2) - '@vitejs/plugin-react-swc': - specifier: ^3.7.0 - version: 3.7.0(@swc/helpers@0.5.5)(vite@5.4.8(@types/node@22.7.3)(sass@1.79.3)(terser@5.34.0)) - eslint: - specifier: 8.57.1 - version: 8.57.1 - eslint-plugin-react-hooks: - specifier: ^4.6.2 - version: 4.6.2(eslint@8.57.1) - eslint-plugin-react-refresh: - specifier: ^0.4.7 - version: 0.4.12(eslint@8.57.1) - prettier: - specifier: ^3.3.2 - version: 3.3.3 - typescript: - specifier: ^5.5.3 - version: 5.6.2 - vite: - specifier: ^5.3.3 - version: 5.4.8(@types/node@22.7.3)(sass@1.79.3)(terser@5.34.0) - sdk/dapp-kit: dependencies: '@iota/iota-sdk': @@ -5086,15 +4964,9 @@ packages: '@popperjs/core@2.11.8': resolution: {integrity: sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==} - '@radix-ui/colors@3.0.0': - resolution: {integrity: sha512-FUOsGBkHrYJwCSEtWRCIfQbZG7q1e6DgxCIOe1SUQzDe/7rXXeA47s8yCn6fuTNQAj1Zq4oTFi9Yjp3wzElcxg==} - '@radix-ui/number@1.0.1': resolution: {integrity: sha512-T5gIdVO2mmPW3NNhjNgEP3cqMXjXL9UbO0BzWcXfvdBs+BohbQxvd/K5hSVKmn9/lbTdsQVKbUcP5WLCwvUbBg==} - '@radix-ui/number@1.1.0': - resolution: {integrity: sha512-V3gRzhVNU1ldS5XhAPTom1fOIo4ccrjjJgmE+LI2h/WaFpHmx0MQApT+KZHnx8abG6Avtfcz4WoEciMnpFT3HQ==} - '@radix-ui/primitive@1.0.0': resolution: {integrity: sha512-3e7rn8FDMin4CgeL7Z/49smCA3rFYY3Ha2rUQ7HRWFadS5iCRw08ZgVT1LaNTCNqgvrUiyczLflrVrF0SRQtNA==} @@ -5104,32 +4976,6 @@ packages: '@radix-ui/primitive@1.1.0': resolution: {integrity: sha512-4Z8dn6Upk0qk4P74xBhZ6Hd/w0mPEzOOLxy4xiPXOXqjF7jZS0VAKk7/x/H6FyY2zCkYJqePf1G5KmkmNJ4RBA==} - '@radix-ui/react-accessible-icon@1.1.0': - resolution: {integrity: sha512-i9Zg4NOSXlfUva0agzI2DjWrvFJm9uO4L6CMW7nmMa5CIOOX/Yin894W7WwjodFQWPwe5kmAJ4JF33R8slKI2g==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - - '@radix-ui/react-alert-dialog@1.1.1': - resolution: {integrity: sha512-wmCoJwj7byuVuiLKqDLlX7ClSUU0vd9sdCeM+2Ls+uf13+cpSJoMgwysHq1SGVVkJj5Xn0XWi1NoRCdkMpr6Mw==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - '@radix-ui/react-arrow@1.0.3': resolution: {integrity: sha512-wSP+pHsB/jQRaL6voubsQ/ZlrGBHHrOjmBnr19hxYgtS0WvAFwZhK2WP/YY5yF9uKECCEEDGxuLxq1NBK51wFA==} peerDependencies: @@ -5156,45 +5002,6 @@ packages: '@types/react-dom': optional: true - '@radix-ui/react-aspect-ratio@1.1.0': - resolution: {integrity: sha512-dP87DM/Y7jFlPgUZTlhx6FF5CEzOiaxp2rBCKlaXlpH5Ip/9Fg5zZ9lDOQ5o/MOfUlf36eak14zoWYpgcgGoOg==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - - '@radix-ui/react-avatar@1.1.0': - resolution: {integrity: sha512-Q/PbuSMk/vyAd/UoIShVGZ7StHHeRFYU7wXmi5GV+8cLXflZAEpHL/F697H1klrzxKXNtZ97vWiC0q3RKUH8UA==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - - '@radix-ui/react-checkbox@1.1.0': - resolution: {integrity: sha512-3+kSzVfMONtP3B6CvaOrXLVTyGYws7tGmG5kOY0AfyH9sexkLytIwciNwjZhY0RoGOEbxI7bMS21XYB8H5itWQ==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - '@radix-ui/react-checkbox@1.1.1': resolution: {integrity: sha512-0i/EKJ222Afa1FE0C6pNJxDq1itzcl3HChE9DwskA4th4KRse8ojx8a1nVcOjwJdbpDLcz7uol77yYnQNMHdKw==} peerDependencies: @@ -5270,19 +5077,6 @@ packages: '@types/react': optional: true - '@radix-ui/react-context-menu@2.2.1': - resolution: {integrity: sha512-wvMKKIeb3eOrkJ96s722vcidZ+2ZNfcYZWBPRHIB1VWrF+fiF851Io6LX0kmK5wTDQFKdulCCKJk2c3SBaQHvA==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - '@radix-ui/react-context@1.0.0': resolution: {integrity: sha512-1pVM9RfOQ+n/N5PJK33kRSKsr1glNxomxONs5c49MliinBY6Yw2Q995qfBUUo0/Mbg05B/sGA0gkgPI7kmSHBg==} peerDependencies: @@ -5443,37 +5237,6 @@ packages: '@types/react-dom': optional: true - '@radix-ui/react-form@0.1.0': - resolution: {integrity: sha512-1/oVYPDjbFILOLIarcGcMKo+y6SbTVT/iUKVEw59CF4offwZgBgC3ZOeSBewjqU0vdA6FWTPWTN63obj55S/tQ==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - - '@radix-ui/react-hover-card@1.1.1': - resolution: {integrity: sha512-IwzAOP97hQpDADYVKrEEHUH/b2LA+9MgB0LgdmnbFO2u/3M5hmEofjjr2M6CyzUblaAqJdFm6B7oFtU72DPXrA==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - - '@radix-ui/react-icons@1.3.0': - resolution: {integrity: sha512-jQxj/0LKgp+j9BiTXz3O3sgs26RNet2iLWmsPyRz2SIcR4q/4SbazXfnYwbAr+vLYKSfc7qxzyGQA1HLlYiuNw==} - peerDependencies: - react: ^16.x || ^17.x || ^18.x - '@radix-ui/react-id@1.0.0': resolution: {integrity: sha512-Q6iAB/U7Tq3NTolBBQbHTgclPmGWE3OlktGGqrClPozSw4vkQ1DfQAOtzgRPecKsMdJINE05iaoDUG8tRzCBjw==} peerDependencies: @@ -5658,32 +5421,6 @@ packages: '@types/react-dom': optional: true - '@radix-ui/react-progress@1.1.0': - resolution: {integrity: sha512-aSzvnYpP725CROcxAOEBVZZSIQVQdHgBr2QQFKySsaD14u8dNT0batuXI+AAGDdAHfXH8rbnHmjYFqVJ21KkRg==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - - '@radix-ui/react-radio-group@1.2.0': - resolution: {integrity: sha512-yv+oiLaicYMBpqgfpSPw6q+RyXlLdIpQWDHZbUKURxe+nEh53hFXPPlfhfQQtYkS5MMK/5IWIa76SksleQZSzw==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - '@radix-ui/react-roving-focus@1.1.0': resolution: {integrity: sha512-EA6AMGeq9AEeQDeSH0aZgG198qkfHSbvWTf1HvoDmOB5bBG/qTxjYMWUKMnYiV6J/iP/J8MEFSuB2zRU2n7ODA==} peerDependencies: @@ -5697,19 +5434,6 @@ packages: '@types/react-dom': optional: true - '@radix-ui/react-scroll-area@1.1.0': - resolution: {integrity: sha512-9ArIZ9HWhsrfqS765h+GZuLoxaRHD/j0ZWOWilsCvYTpYJp8XwCqNG7Dt9Nu/TItKOdgLGkOPCodQvDc+UMwYg==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - '@radix-ui/react-select@1.2.2': resolution: {integrity: sha512-zI7McXr8fNaSrUY9mZe4x/HC0jTLY9fWNhO1oLWYMQGDXuV4UCivIGTxwioSzO0ZCYX9iSLyWmAh/1TOmX3Cnw==} peerDependencies: @@ -5723,19 +5447,6 @@ packages: '@types/react-dom': optional: true - '@radix-ui/react-select@2.1.1': - resolution: {integrity: sha512-8iRDfyLtzxlprOo9IicnzvpsO1wNCkuwzzCM+Z5Rb5tNOpCdMvcc2AkzX0Fz+Tz9v6NJ5B/7EEgyZveo4FBRfQ==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - '@radix-ui/react-separator@1.1.0': resolution: {integrity: sha512-3uBAs+egzvJBDZAzvb/n4NxxOYpnspmWxO2u5NbZ8Y6FM/NdrGSF9bop3Cf6F6C71z1rTSn8KV0Fo2ZVd79lGA==} peerDependencies: @@ -5749,19 +5460,6 @@ packages: '@types/react-dom': optional: true - '@radix-ui/react-slider@1.2.0': - resolution: {integrity: sha512-dAHCDA4/ySXROEPaRtaMV5WHL8+JB/DbtyTbJjYkY0RXmKMO2Ln8DFZhywG5/mVQ4WqHDBc8smc14yPXPqZHYA==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - '@radix-ui/react-slot@1.0.0': resolution: {integrity: sha512-3mrKauI/tWXo1Ll+gN5dHcxDPdm/Df1ufcDLCecn+pnCIVcdWE7CujXo8QaXOWRJyZyQWWbpB8eFwHzWXlv5mQ==} peerDependencies: @@ -5850,19 +5548,6 @@ packages: '@types/react-dom': optional: true - '@radix-ui/react-tooltip@1.1.1': - resolution: {integrity: sha512-LLE8nzNE4MzPMw3O2zlVlkLFid3y9hMUs7uCbSHyKSo+tCN4yMCf+ZCCcfrYgsOC0TiHBPQ1mtpJ2liY3ZT3SQ==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - '@radix-ui/react-use-callback-ref@1.0.0': resolution: {integrity: sha512-GZtyzoHz95Rhs6S63D2t/eqvdFCm7I+yHMLVQheKM7nBD8mbZIt+ct1jz4536MDnaOGKIxynJ8eHTkVGVVkoTg==} peerDependencies: @@ -6041,19 +5726,6 @@ packages: '@radix-ui/rect@1.1.0': resolution: {integrity: sha512-A9+lCBZoaMJlVKcRBz2YByCG+Cp2t6nAnMnNba+XiWxnj6r4JUFqfsgwocMBZU9LPtdxC6wB56ySYpc7LQIoJg==} - '@radix-ui/themes@3.1.4': - resolution: {integrity: sha512-HmyU8UpoYPmdfXSQIwbEnJS2Wv/5wbzxe/Niw/sMLMJTrlZiUKM/dEOM7N+bc7w2OMpUaQ8OH9czCGpcjHx98w==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: 16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: 16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - '@reduxjs/toolkit@1.9.7': resolution: {integrity: sha512-t7v8ZPxhhKgOKtU+uyJT13lu4vL7az5aFi4IdoDs/eS548edn2M8Ik9h8fxgvMjGoAUVFSt6ZC1P5cWmQ014QQ==} peerDependencies: @@ -8412,10 +8084,18 @@ packages: resolution: {integrity: sha512-zkDT5WAF4hSSoUgyfg5tFIxz8XQK+25W/TLVojJTMKBaxevLBBtLxgqguAuVQB8PVW79FVjHcU+GJ9tVbDZ9mQ==} engines: {node: '>=14.16'} + call-bind-apply-helpers@1.0.1: + resolution: {integrity: sha512-BhYE+WDaywFg2TBWYNXAE+8B1ATnThNBqXHP5nQu0jWJdVvY2hvkpyB3qOmtmDePiS5/BDQ8wASEWGMWRG148g==} + engines: {node: '>= 0.4'} + call-bind@1.0.7: resolution: {integrity: sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==} engines: {node: '>= 0.4'} + call-bind@1.0.8: + resolution: {integrity: sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==} + engines: {node: '>= 0.4'} + callsites@3.1.0: resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} engines: {node: '>=6'} @@ -8576,9 +8256,6 @@ packages: class-variance-authority@0.7.0: resolution: {integrity: sha512-jFI8IQw4hczaL4ALINxqLEXQbWcNjoSkloa4IaufXCJr6QawJyw7tuRysRsrE8w2p/4gGaxKIt/hX3qz/IbD1A==} - classnames@2.3.2: - resolution: {integrity: sha512-CSbhY4cFEJRe6/GQzIk5qXZ4Jeg5pcsP7b5peFSDpffpe1cqjASH/n9UTjBwOp6XpMSTwQ8Za2K5V02ueA7Tmw==} - classnames@2.5.1: resolution: {integrity: sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow==} @@ -9616,6 +9293,10 @@ packages: resolution: {integrity: sha512-b7Z7cNtHPhH9EJhNNbbeqTcXB8LGFFZhq1PGgEvpeHlzd36bhbdTWoE/Ba/YguqpBSlAPKnARWhVlhunCMwfxg==} engines: {node: '>=0.10'} + dunder-proto@1.0.0: + resolution: {integrity: sha512-9+Sj30DIu+4KvHqMfLUGLFYL2PkURSYMVXJyXe92nFRvlYq5hBjLEhblKB+vkd/WVlUYMWigiY07T91Fkk0+4A==} + engines: {node: '>= 0.4'} + duplexer@0.1.2: resolution: {integrity: sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==} @@ -9718,6 +9399,10 @@ packages: resolution: {integrity: sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==} engines: {node: '>= 0.4'} + es-define-property@1.0.1: + resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} + engines: {node: '>= 0.4'} + es-errors@1.3.0: resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} engines: {node: '>= 0.4'} @@ -9910,11 +9595,6 @@ packages: peerDependencies: eslint: 8.57.1 - eslint-plugin-react-refresh@0.4.12: - resolution: {integrity: sha512-9neVjoGv20FwYtCP6CB1dzR1vr57ZDNOXst21wd2xJ/cTlM2xLq0GWVlSNTdMn/4BtP6cHYBMCSp1wFBJ9jBsg==} - peerDependencies: - eslint: 8.57.1 - eslint-plugin-react@7.37.0: resolution: {integrity: sha512-IHBePmfWH5lKhJnJ7WB1V+v/GolbB0rjS8XYVCSQCZKaQCAUhMoVoOEn1Ef8Z8Wf0a7l8KTJvuZg5/e4qrZ6nA==} engines: {node: '>=4'} @@ -10505,6 +10185,10 @@ packages: resolution: {integrity: sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==} engines: {node: '>= 0.4'} + get-intrinsic@1.2.6: + resolution: {integrity: sha512-qxsEs+9A+u85HhllWJJFicJfPDhRmjzoYdl64aMWW9yRIJmSyxdn8IEkuIM530/7T+lv0TIHd8L6Q/ra0tEoeA==} + engines: {node: '>= 0.4'} + get-nonce@1.0.1: resolution: {integrity: sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==} engines: {node: '>=6'} @@ -10652,6 +10336,10 @@ packages: gopd@1.0.1: resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} + gopd@1.2.0: + resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} + engines: {node: '>= 0.4'} + got@12.6.1: resolution: {integrity: sha512-mThBblvlAF1d4O5oqyvN+ZxLAYwIJK7bpMxgYqPD9okW0C3qm5FFn7k811QrcuEBwaogR3ngOFoCfs6mRv7teQ==} engines: {node: '>=14.16'} @@ -10779,6 +10467,10 @@ packages: resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} engines: {node: '>= 0.4'} + has-symbols@1.1.0: + resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} + engines: {node: '>= 0.4'} + has-tostringtag@1.0.2: resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} engines: {node: '>= 0.4'} @@ -12157,6 +11849,10 @@ packages: math-expression-evaluator@1.4.0: resolution: {integrity: sha512-4vRUvPyxdO8cWULGTh9dZWL2tZK6LDBvj+OGHBER7poH9Qdt7kXEoj20wiz4lQUbUXQZFjPbe5mVDo9nutizCw==} + math-intrinsics@1.0.0: + resolution: {integrity: sha512-4MqMiKP90ybymYvsut0CH2g4XWbfLtmlCkXmtmdcDCxNB+mQcu1w/1+L/VD7vi/PSv7X2JYV7SCcR+jiPXnQtA==} + engines: {node: '>= 0.4'} + mdast-util-definitions@4.0.0: resolution: {integrity: sha512-k8AJ6aNnUkB7IE+5azR9h81O5EQ/cTDXtWdMq9Kk5KcEW/8ritU5CeLg/9HhOC++nALHBlaogJ5jz0Ybk3kPMQ==} @@ -14124,16 +13820,6 @@ packages: resolution: {integrity: sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA==} engines: {node: '>=0.10.0'} - react-remove-scroll-bar@2.3.4: - resolution: {integrity: sha512-63C4YQBUt0m6ALadE9XV56hV8BgJWDmmTPY758iIJjfQKt2nYwoUrPk0LXRXcB/yIj82T1/Ixfdpdk68LwIB0A==} - engines: {node: '>=10'} - peerDependencies: - '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - peerDependenciesMeta: - '@types/react': - optional: true - react-remove-scroll-bar@2.3.6: resolution: {integrity: sha512-DtSYaao4mBmX+HDo5YWYdBWQwYIQQshUV/dVxFxK+KM26Wjwp1gZ6rv6OC3oujI6Bfu6Xyg3TwK533AQutsn/g==} engines: {node: '>=10'} @@ -21107,105 +20793,41 @@ snapshots: '@pnpm/npm-conf@2.3.1': dependencies: - '@pnpm/config.env-replace': 1.1.0 - '@pnpm/network.ca-file': 1.0.2 - config-chain: 1.1.13 - - '@polka/url@1.0.0-next.28': {} - - '@popperjs/core@2.11.8': {} - - '@radix-ui/colors@3.0.0': {} - - '@radix-ui/number@1.0.1': - dependencies: - '@babel/runtime': 7.25.6 - - '@radix-ui/number@1.1.0': {} - - '@radix-ui/primitive@1.0.0': - dependencies: - '@babel/runtime': 7.25.6 - - '@radix-ui/primitive@1.0.1': - dependencies: - '@babel/runtime': 7.25.6 - - '@radix-ui/primitive@1.1.0': {} - - '@radix-ui/react-accessible-icon@1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': - dependencies: - '@radix-ui/react-visually-hidden': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - optionalDependencies: - '@types/react': 18.3.9 - '@types/react-dom': 18.3.0 - - '@radix-ui/react-alert-dialog@1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': - dependencies: - '@radix-ui/primitive': 1.1.0 - '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.9)(react@18.3.1) - '@radix-ui/react-context': 1.1.0(@types/react@18.3.9)(react@18.3.1) - '@radix-ui/react-dialog': 1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-slot': 1.1.0(@types/react@18.3.9)(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - optionalDependencies: - '@types/react': 18.3.9 - '@types/react-dom': 18.3.0 + '@pnpm/config.env-replace': 1.1.0 + '@pnpm/network.ca-file': 1.0.2 + config-chain: 1.1.13 - '@radix-ui/react-arrow@1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@polka/url@1.0.0-next.28': {} + + '@popperjs/core@2.11.8': {} + + '@radix-ui/number@1.0.1': dependencies: '@babel/runtime': 7.25.6 - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - optionalDependencies: - '@types/react': 18.3.9 - '@types/react-dom': 18.3.0 - '@radix-ui/react-arrow@1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@radix-ui/primitive@1.0.0': dependencies: - '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - optionalDependencies: - '@types/react': 18.3.9 - '@types/react-dom': 18.3.0 + '@babel/runtime': 7.25.6 - '@radix-ui/react-aspect-ratio@1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@radix-ui/primitive@1.0.1': dependencies: - '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - optionalDependencies: - '@types/react': 18.3.9 - '@types/react-dom': 18.3.0 + '@babel/runtime': 7.25.6 - '@radix-ui/react-avatar@1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@radix-ui/primitive@1.1.0': {} + + '@radix-ui/react-arrow@1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@radix-ui/react-context': 1.1.0(@types/react@18.3.9)(react@18.3.1) - '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.9)(react@18.3.1) - '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.9)(react@18.3.1) + '@babel/runtime': 7.25.6 + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) optionalDependencies: '@types/react': 18.3.9 '@types/react-dom': 18.3.0 - '@radix-ui/react-checkbox@1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@radix-ui/react-arrow@1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@radix-ui/primitive': 1.1.0 - '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.9)(react@18.3.1) - '@radix-ui/react-context': 1.1.0(@types/react@18.3.9)(react@18.3.1) - '@radix-ui/react-presence': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.9)(react@18.3.1) - '@radix-ui/react-use-previous': 1.1.0(@types/react@18.3.9)(react@18.3.1) - '@radix-ui/react-use-size': 1.1.0(@types/react@18.3.9)(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) optionalDependencies: @@ -21287,20 +20909,6 @@ snapshots: optionalDependencies: '@types/react': 18.3.9 - '@radix-ui/react-context-menu@2.2.1(@types/react-dom@18.3.0)(@types/react@18.3.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': - dependencies: - '@radix-ui/primitive': 1.1.0 - '@radix-ui/react-context': 1.1.0(@types/react@18.3.9)(react@18.3.1) - '@radix-ui/react-menu': 2.1.1(@types/react-dom@18.3.0)(@types/react@18.3.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.9)(react@18.3.1) - '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.9)(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - optionalDependencies: - '@types/react': 18.3.9 - '@types/react-dom': 18.3.0 - '@radix-ui/react-context@1.0.0(react@18.3.1)': dependencies: '@babel/runtime': 7.25.6 @@ -21479,41 +21087,6 @@ snapshots: '@types/react': 18.3.9 '@types/react-dom': 18.3.0 - '@radix-ui/react-form@0.1.0(@types/react-dom@18.3.0)(@types/react@18.3.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': - dependencies: - '@radix-ui/primitive': 1.1.0 - '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.9)(react@18.3.1) - '@radix-ui/react-context': 1.1.0(@types/react@18.3.9)(react@18.3.1) - '@radix-ui/react-id': 1.1.0(@types/react@18.3.9)(react@18.3.1) - '@radix-ui/react-label': 2.1.0(@types/react-dom@18.3.0)(@types/react@18.3.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - optionalDependencies: - '@types/react': 18.3.9 - '@types/react-dom': 18.3.0 - - '@radix-ui/react-hover-card@1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': - dependencies: - '@radix-ui/primitive': 1.1.0 - '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.9)(react@18.3.1) - '@radix-ui/react-context': 1.1.0(@types/react@18.3.9)(react@18.3.1) - '@radix-ui/react-dismissable-layer': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-popper': 1.2.0(@types/react-dom@18.3.0)(@types/react@18.3.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-portal': 1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-presence': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.9)(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - optionalDependencies: - '@types/react': 18.3.9 - '@types/react-dom': 18.3.0 - - '@radix-ui/react-icons@1.3.0(react@18.3.1)': - dependencies: - react: 18.3.1 - '@radix-ui/react-id@1.0.0(react@18.3.1)': dependencies: '@babel/runtime': 7.25.6 @@ -21723,34 +21296,6 @@ snapshots: '@types/react': 18.3.9 '@types/react-dom': 18.3.0 - '@radix-ui/react-progress@1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': - dependencies: - '@radix-ui/react-context': 1.1.0(@types/react@18.3.9)(react@18.3.1) - '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - optionalDependencies: - '@types/react': 18.3.9 - '@types/react-dom': 18.3.0 - - '@radix-ui/react-radio-group@1.2.0(@types/react-dom@18.3.0)(@types/react@18.3.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': - dependencies: - '@radix-ui/primitive': 1.1.0 - '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.9)(react@18.3.1) - '@radix-ui/react-context': 1.1.0(@types/react@18.3.9)(react@18.3.1) - '@radix-ui/react-direction': 1.1.0(@types/react@18.3.9)(react@18.3.1) - '@radix-ui/react-presence': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-roving-focus': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.9)(react@18.3.1) - '@radix-ui/react-use-previous': 1.1.0(@types/react@18.3.9)(react@18.3.1) - '@radix-ui/react-use-size': 1.1.0(@types/react@18.3.9)(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - optionalDependencies: - '@types/react': 18.3.9 - '@types/react-dom': 18.3.0 - '@radix-ui/react-roving-focus@1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@radix-ui/primitive': 1.1.0 @@ -21768,23 +21313,6 @@ snapshots: '@types/react': 18.3.9 '@types/react-dom': 18.3.0 - '@radix-ui/react-scroll-area@1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': - dependencies: - '@radix-ui/number': 1.1.0 - '@radix-ui/primitive': 1.1.0 - '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.9)(react@18.3.1) - '@radix-ui/react-context': 1.1.0(@types/react@18.3.9)(react@18.3.1) - '@radix-ui/react-direction': 1.1.0(@types/react@18.3.9)(react@18.3.1) - '@radix-ui/react-presence': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.9)(react@18.3.1) - '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.9)(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - optionalDependencies: - '@types/react': 18.3.9 - '@types/react-dom': 18.3.0 - '@radix-ui/react-select@1.2.2(@types/react-dom@18.3.0)(@types/react@18.3.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@babel/runtime': 7.25.6 @@ -21815,35 +21343,6 @@ snapshots: '@types/react': 18.3.9 '@types/react-dom': 18.3.0 - '@radix-ui/react-select@2.1.1(@types/react-dom@18.3.0)(@types/react@18.3.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': - dependencies: - '@radix-ui/number': 1.1.0 - '@radix-ui/primitive': 1.1.0 - '@radix-ui/react-collection': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.9)(react@18.3.1) - '@radix-ui/react-context': 1.1.0(@types/react@18.3.9)(react@18.3.1) - '@radix-ui/react-direction': 1.1.0(@types/react@18.3.9)(react@18.3.1) - '@radix-ui/react-dismissable-layer': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-focus-guards': 1.1.0(@types/react@18.3.9)(react@18.3.1) - '@radix-ui/react-focus-scope': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-id': 1.1.0(@types/react@18.3.9)(react@18.3.1) - '@radix-ui/react-popper': 1.2.0(@types/react-dom@18.3.0)(@types/react@18.3.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-portal': 1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-slot': 1.1.0(@types/react@18.3.9)(react@18.3.1) - '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.9)(react@18.3.1) - '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.9)(react@18.3.1) - '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.9)(react@18.3.1) - '@radix-ui/react-use-previous': 1.1.0(@types/react@18.3.9)(react@18.3.1) - '@radix-ui/react-visually-hidden': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - aria-hidden: 1.2.4 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - react-remove-scroll: 2.5.7(@types/react@18.3.9)(react@18.3.1) - optionalDependencies: - '@types/react': 18.3.9 - '@types/react-dom': 18.3.0 - '@radix-ui/react-separator@1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) @@ -21853,25 +21352,6 @@ snapshots: '@types/react': 18.3.9 '@types/react-dom': 18.3.0 - '@radix-ui/react-slider@1.2.0(@types/react-dom@18.3.0)(@types/react@18.3.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': - dependencies: - '@radix-ui/number': 1.1.0 - '@radix-ui/primitive': 1.1.0 - '@radix-ui/react-collection': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.9)(react@18.3.1) - '@radix-ui/react-context': 1.1.0(@types/react@18.3.9)(react@18.3.1) - '@radix-ui/react-direction': 1.1.0(@types/react@18.3.9)(react@18.3.1) - '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.9)(react@18.3.1) - '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.9)(react@18.3.1) - '@radix-ui/react-use-previous': 1.1.0(@types/react@18.3.9)(react@18.3.1) - '@radix-ui/react-use-size': 1.1.0(@types/react@18.3.9)(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - optionalDependencies: - '@types/react': 18.3.9 - '@types/react-dom': 18.3.0 - '@radix-ui/react-slot@1.0.0(react@18.3.1)': dependencies: '@babel/runtime': 7.25.6 @@ -21965,26 +21445,6 @@ snapshots: '@types/react': 18.3.9 '@types/react-dom': 18.3.0 - '@radix-ui/react-tooltip@1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': - dependencies: - '@radix-ui/primitive': 1.1.0 - '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.9)(react@18.3.1) - '@radix-ui/react-context': 1.1.0(@types/react@18.3.9)(react@18.3.1) - '@radix-ui/react-dismissable-layer': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-id': 1.1.0(@types/react@18.3.9)(react@18.3.1) - '@radix-ui/react-popper': 1.2.0(@types/react-dom@18.3.0)(@types/react@18.3.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-portal': 1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-presence': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-slot': 1.1.0(@types/react@18.3.9)(react@18.3.1) - '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.9)(react@18.3.1) - '@radix-ui/react-visually-hidden': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - optionalDependencies: - '@types/react': 18.3.9 - '@types/react-dom': 18.3.0 - '@radix-ui/react-use-callback-ref@1.0.0(react@18.3.1)': dependencies: '@babel/runtime': 7.25.6 @@ -22131,49 +21591,6 @@ snapshots: '@radix-ui/rect@1.1.0': {} - '@radix-ui/themes@3.1.4(@types/react-dom@18.3.0)(@types/react@18.3.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': - dependencies: - '@radix-ui/colors': 3.0.0 - '@radix-ui/primitive': 1.1.0 - '@radix-ui/react-accessible-icon': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-alert-dialog': 1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-aspect-ratio': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-avatar': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-checkbox': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.9)(react@18.3.1) - '@radix-ui/react-context': 1.1.0(@types/react@18.3.9)(react@18.3.1) - '@radix-ui/react-context-menu': 2.2.1(@types/react-dom@18.3.0)(@types/react@18.3.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-dialog': 1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-direction': 1.1.0(@types/react@18.3.9)(react@18.3.1) - '@radix-ui/react-dropdown-menu': 2.1.1(@types/react-dom@18.3.0)(@types/react@18.3.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-form': 0.1.0(@types/react-dom@18.3.0)(@types/react@18.3.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-hover-card': 1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-navigation-menu': 1.2.0(@types/react-dom@18.3.0)(@types/react@18.3.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-popover': 1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-portal': 1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-progress': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-radio-group': 1.2.0(@types/react-dom@18.3.0)(@types/react@18.3.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-roving-focus': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-scroll-area': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-select': 2.1.1(@types/react-dom@18.3.0)(@types/react@18.3.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-slider': 1.2.0(@types/react-dom@18.3.0)(@types/react@18.3.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-slot': 1.1.0(@types/react@18.3.9)(react@18.3.1) - '@radix-ui/react-switch': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-tabs': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-toggle-group': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-tooltip': 1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.9)(react@18.3.1) - '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.9)(react@18.3.1) - '@radix-ui/react-visually-hidden': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - classnames: 2.3.2 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - react-remove-scroll-bar: 2.3.4(@types/react@18.3.9)(react@18.3.1) - optionalDependencies: - '@types/react': 18.3.9 - '@types/react-dom': 18.3.0 - '@reduxjs/toolkit@1.9.7(react-redux@8.1.3(@types/react-dom@18.3.0)(@types/react@18.3.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(redux@4.2.1))(react@18.3.1)': dependencies: immer: 9.0.21 @@ -24409,13 +23826,6 @@ snapshots: transitivePeerDependencies: - '@swc/helpers' - '@vitejs/plugin-react-swc@3.7.0(@swc/helpers@0.5.5)(vite@5.4.8(@types/node@22.7.3)(sass@1.79.3)(terser@5.34.0))': - dependencies: - '@swc/core': 1.7.28(@swc/helpers@0.5.5) - vite: 5.4.8(@types/node@22.7.3)(sass@1.79.3)(terser@5.34.0) - transitivePeerDependencies: - - '@swc/helpers' - '@vitejs/plugin-react@3.1.0(vite@5.4.8(@types/node@20.16.9)(sass@1.79.3)(terser@5.34.0))': dependencies: '@babel/core': 7.25.2 @@ -25496,6 +24906,11 @@ snapshots: normalize-url: 8.0.1 responselike: 3.0.0 + call-bind-apply-helpers@1.0.1: + dependencies: + es-errors: 1.3.0 + function-bind: 1.1.2 + call-bind@1.0.7: dependencies: es-define-property: 1.0.0 @@ -25504,6 +24919,13 @@ snapshots: get-intrinsic: 1.2.4 set-function-length: 1.2.2 + call-bind@1.0.8: + dependencies: + call-bind-apply-helpers: 1.0.1 + es-define-property: 1.0.0 + get-intrinsic: 1.2.6 + set-function-length: 1.2.2 + callsites@3.1.0: {} camel-case@4.1.2: @@ -25683,8 +25105,6 @@ snapshots: dependencies: clsx: 2.0.0 - classnames@2.3.2: {} - classnames@2.5.1: {} clean-css@5.3.3: @@ -26799,6 +26219,12 @@ snapshots: nan: 2.20.0 optional: true + dunder-proto@1.0.0: + dependencies: + call-bind-apply-helpers: 1.0.1 + es-errors: 1.3.0 + gopd: 1.2.0 + duplexer@0.1.2: {} duplexify@3.7.1: @@ -26928,6 +26354,8 @@ snapshots: dependencies: get-intrinsic: 1.2.4 + es-define-property@1.0.1: {} + es-errors@1.3.0: {} es-get-iterator@1.1.3: @@ -27257,10 +26685,6 @@ snapshots: dependencies: eslint: 8.57.1 - eslint-plugin-react-refresh@0.4.12(eslint@8.57.1): - dependencies: - eslint: 8.57.1 - eslint-plugin-react@7.37.0(eslint@8.57.1): dependencies: array-includes: 3.1.8 @@ -28003,6 +27427,19 @@ snapshots: has-symbols: 1.0.3 hasown: 2.0.2 + get-intrinsic@1.2.6: + dependencies: + call-bind-apply-helpers: 1.0.1 + dunder-proto: 1.0.0 + es-define-property: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.0.0 + function-bind: 1.1.2 + gopd: 1.2.0 + has-symbols: 1.1.0 + hasown: 2.0.2 + math-intrinsics: 1.0.0 + get-nonce@1.0.1: {} get-npm-tarball-url@2.1.0: {} @@ -28192,6 +27629,8 @@ snapshots: dependencies: get-intrinsic: 1.2.4 + gopd@1.2.0: {} + got@12.6.1: dependencies: '@sindresorhus/is': 5.6.0 @@ -28367,6 +27806,8 @@ snapshots: has-symbols@1.0.3: {} + has-symbols@1.1.0: {} + has-tostringtag@1.0.2: dependencies: has-symbols: 1.0.3 @@ -29146,8 +28587,8 @@ snapshots: is-weakset@2.0.3: dependencies: - call-bind: 1.0.7 - get-intrinsic: 1.2.4 + call-bind: 1.0.8 + get-intrinsic: 1.2.6 is-windows@1.0.2: {} @@ -30084,6 +29525,8 @@ snapshots: math-expression-evaluator@1.4.0: {} + math-intrinsics@1.0.0: {} + mdast-util-definitions@4.0.0: dependencies: unist-util-visit: 2.0.3 @@ -32487,14 +31930,6 @@ snapshots: react-refresh@0.14.2: {} - react-remove-scroll-bar@2.3.4(@types/react@18.3.9)(react@18.3.1): - dependencies: - react: 18.3.1 - react-style-singleton: 2.2.1(@types/react@18.3.9)(react@18.3.1) - tslib: 2.7.0 - optionalDependencies: - '@types/react': 18.3.9 - react-remove-scroll-bar@2.3.6(@types/react@18.3.9)(react@18.3.1): dependencies: react: 18.3.1 diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 58699ae570b..3ad2792cd72 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -5,7 +5,7 @@ packages: - "sdk/**" - "!**/dist/**" - "!**/.next/**" - - "!sdk/create-dapp/templates" + - "!sdk/create-dapp/templates/*" - "!sdk/typescript/bcs" - "!sdk/typescript/client" - "!sdk/typescript/cryptography" diff --git a/sdk/create-dapp/templates/react-client-dapp/eslint.config.js b/sdk/create-dapp/templates/react-client-dapp/eslint.config.js new file mode 100644 index 00000000000..7c663262678 --- /dev/null +++ b/sdk/create-dapp/templates/react-client-dapp/eslint.config.js @@ -0,0 +1,28 @@ +import eslint from "@eslint/js"; +import tseslint from "typescript-eslint"; +import react from "eslint-plugin-react"; +import reactHooks from "eslint-plugin-react-hooks"; +import reactRefresh from "eslint-plugin-react-refresh"; + +export default tseslint.config( + { + files: ["**/*.{js,jsx,mjs,cjs,ts,tsx}"], + plugins: { + react, + reactHooks, + reactRefresh, + }, + settings: { + version: "18", + }, + languageOptions: { + parserOptions: { + ecmaFeatures: { + jsx: true, + }, + }, + }, + }, + eslint.configs.recommended, + tseslint.configs.recommended, +); diff --git a/sdk/create-dapp/templates/react-client-dapp/package.json b/sdk/create-dapp/templates/react-client-dapp/package.json index 8e79c61bd6b..611f666329d 100644 --- a/sdk/create-dapp/templates/react-client-dapp/package.json +++ b/sdk/create-dapp/templates/react-client-dapp/package.json @@ -6,28 +6,30 @@ "scripts": { "dev": "vite", "build": "tsc && vite build", - "lint": "eslint . --ext ts,tsx --report-unused-disable-directives --max-warnings 0", - "preview": "vite preview" + "lint": "eslint .", + "preview": "vite preview", + "format": "prettier -w ." }, "dependencies": { "@iota/dapp-kit": "workspace:*", "@iota/iota-sdk": "workspace:*", - "@radix-ui/colors": "^3.0.0", - "@radix-ui/react-icons": "^1.3.0", "@radix-ui/themes": "^3.1.1", "@tanstack/react-query": "^5.50.1", "react": "^18.3.1", "react-dom": "^18.3.1" }, "devDependencies": { + "@eslint/js": "^9.17.0", "@types/react": "^18.3.3", "@types/react-dom": "^18.3.0", - "@typescript-eslint/eslint-plugin": "^7.16.0", - "@typescript-eslint/parser": "^7.16.0", + "@typescript-eslint/eslint-plugin": "^8.18.0", + "@typescript-eslint/parser": "^8.18.0", "@vitejs/plugin-react-swc": "^3.7.0", - "eslint": "^9.6.0", - "eslint-plugin-react-hooks": "^4.6.2", + "eslint": "^9.17.0", + "eslint-plugin-react-hooks": "^5.1.0", "eslint-plugin-react-refresh": "^0.4.7", + "eslint-plugin-react": "^7.37.2", + "typescript-eslint": "^8.18.0", "prettier": "^3.3.2", "typescript": "^5.5.3", "vite": "^5.3.3" diff --git a/sdk/create-dapp/templates/react-e2e-counter/eslint.config.js b/sdk/create-dapp/templates/react-e2e-counter/eslint.config.js new file mode 100644 index 00000000000..7c663262678 --- /dev/null +++ b/sdk/create-dapp/templates/react-e2e-counter/eslint.config.js @@ -0,0 +1,28 @@ +import eslint from "@eslint/js"; +import tseslint from "typescript-eslint"; +import react from "eslint-plugin-react"; +import reactHooks from "eslint-plugin-react-hooks"; +import reactRefresh from "eslint-plugin-react-refresh"; + +export default tseslint.config( + { + files: ["**/*.{js,jsx,mjs,cjs,ts,tsx}"], + plugins: { + react, + reactHooks, + reactRefresh, + }, + settings: { + version: "18", + }, + languageOptions: { + parserOptions: { + ecmaFeatures: { + jsx: true, + }, + }, + }, + }, + eslint.configs.recommended, + tseslint.configs.recommended, +); diff --git a/sdk/create-dapp/templates/react-e2e-counter/package.json b/sdk/create-dapp/templates/react-e2e-counter/package.json index 607acf6b606..0be7053cb16 100644 --- a/sdk/create-dapp/templates/react-e2e-counter/package.json +++ b/sdk/create-dapp/templates/react-e2e-counter/package.json @@ -6,28 +6,30 @@ "scripts": { "dev": "vite", "build": "tsc && vite build", - "lint": "eslint . --ext ts,tsx --report-unused-disable-directives --max-warnings 0", - "preview": "vite preview" + "lint": "eslint .", + "preview": "vite preview", + "format": "prettier -w ." }, "dependencies": { "@iota/dapp-kit": "workspace:*", "@iota/iota-sdk": "workspace:*", - "@radix-ui/colors": "^3.0.0", - "@radix-ui/react-icons": "^1.3.0", "@radix-ui/themes": "^3.1.1", "@tanstack/react-query": "^5.50.1", "react": "^18.3.1", "react-dom": "^18.3.1" }, "devDependencies": { + "@eslint/js": "^9.17.0", "@types/react": "^18.3.3", "@types/react-dom": "^18.3.0", - "@typescript-eslint/eslint-plugin": "^6.1.0", - "@typescript-eslint/parser": "^6.1.0", + "@typescript-eslint/eslint-plugin": "^8.18.0", + "@typescript-eslint/parser": "^8.18.0", "@vitejs/plugin-react-swc": "^3.7.0", - "eslint": "^8.45.0", - "eslint-plugin-react-hooks": "^4.6.2", + "eslint": "^9.17.0", + "eslint-plugin-react-hooks": "^5.1.0", "eslint-plugin-react-refresh": "^0.4.7", + "eslint-plugin-react": "^7.37.2", + "typescript-eslint": "^8.18.0", "prettier": "^3.3.2", "typescript": "^5.5.3", "vite": "^5.3.3" From 23fc005216996a3a96c49a3704e78f829c40a3d7 Mon Sep 17 00:00:00 2001 From: evavirseda <evirseda@boxfish.studio> Date: Wed, 18 Dec 2024 10:53:54 +0100 Subject: [PATCH 74/97] feat(wallet-dashboard): polish homepage scroll (#4502) * feat: add supply increase vesting overview to homepage * fix: linter * fix(dashboard): remove isHoverable prop * fix(dashboard): use showDays in formatCountdown * fix(dashboard): rename vesting by supplyIncreaseVesting * fix: format * fix(dashboard): build * fix(dashboard): format * fix(dashboard): styles * fix(dashboard): isTimelockedStakedObjectsLoading name and join 2 invalidateQueries in 1 * feat: polish homepage scroll * fix(dashboard): format * feat: update styles and add missing dependency * feat: add min height * feat. add padding * fix(dasboard): undo the split of the query invalidation * fix(dashboard): rename unlockAllsupplyIncreaseVesting and disable new stake button * fix grid * feat(dashboard): add object for the options in useCountdownByTimestamp * fix: linter * fix: linter * fix(core): improve naming * fix(core): linter --------- Co-authored-by: cpl121 <cpeon@boxfish.studio> Co-authored-by: Bran <52735957+brancoder@users.noreply.github.com> Co-authored-by: cpl121 <100352899+cpl121@users.noreply.github.com> --- .../app/(protected)/home/page.tsx | 4 +- apps/wallet-dashboard/app/globals.css | 37 ++++------- .../components/coins/MyCoins.tsx | 64 +++++++++---------- .../transactions/TransactionsOverview.tsx | 2 +- 4 files changed, 47 insertions(+), 60 deletions(-) diff --git a/apps/wallet-dashboard/app/(protected)/home/page.tsx b/apps/wallet-dashboard/app/(protected)/home/page.tsx index 774edce294c..d435d44f630 100644 --- a/apps/wallet-dashboard/app/(protected)/home/page.tsx +++ b/apps/wallet-dashboard/app/(protected)/home/page.tsx @@ -25,7 +25,7 @@ function HomeDashboardPage(): JSX.Element { <main className="flex flex-1 flex-col items-center space-y-8 py-md"> {connectionStatus === 'connected' && account && ( <> - <div className="home-page-grid-container h-full w-full"> + <div className="home-page-grid-container w-full content-start"> <div style={{ gridArea: 'balance' }} className="flex grow overflow-hidden"> <AccountBalance /> </div> @@ -33,7 +33,7 @@ function HomeDashboardPage(): JSX.Element { <StakingOverview /> </div> {stardustMigrationEnabled && <MigrationOverview />} - <div style={{ gridArea: 'coins' }}> + <div style={{ gridArea: 'coins' }} className="flex grow overflow-hidden"> <MyCoins /> </div> {supplyIncreaseVestingEnabled && <SupplyIncreaseVestingOverview />} diff --git a/apps/wallet-dashboard/app/globals.css b/apps/wallet-dashboard/app/globals.css index 2d87e758bc0..69ca23f41f2 100644 --- a/apps/wallet-dashboard/app/globals.css +++ b/apps/wallet-dashboard/app/globals.css @@ -35,25 +35,15 @@ body { height: 200px; } } - .home-page-grid-container:has(.with-vesting) { - @apply grid grid-cols-1 gap-lg; + .home-page-grid-container:has(.with-vesting):not(:has(.with-migration)) { grid-template-areas: 'balance' 'staking' 'vesting' 'coins' 'activity'; - - & - > *:where( - [style*='grid-area: balance'], - [style*='grid-area: staking'], - [style*='grid-area: migration'] - ) { - height: 200px; - } } - .home-page-grid-container:has(.with-migration) { + .home-page-grid-container:has(.with-migration):not(:has(.with-vesting)) { grid-template-areas: 'balance' 'staking' @@ -61,8 +51,7 @@ body { 'coins' 'activity'; } - .home-page-grid-container:has(.with-migration), - .home-page-grid-container:has(.with-vesting) { + .home-page-grid-container:has(.with-migration):has(.with-vesting) { grid-template-areas: 'balance' 'staking' @@ -81,8 +70,7 @@ body { 'coins coins' 'activity activity'; } - .home-page-grid-container:has(.with-vesting) { - @apply grid-cols-2; + .home-page-grid-container:has(.with-vesting):not(:has(.with-migration)) { grid-template-areas: 'balance balance' 'staking staking' @@ -90,15 +78,14 @@ body { 'coins coins' 'activity activity'; } - .home-page-grid-container:has(.with-migration) { + .home-page-grid-container:has(.with-migration):not(:has(.with-vesting)) { grid-template-areas: 'balance balance' 'staking migration' 'coins coins' 'activity activity'; } - .home-page-grid-container:has(.with-migration), - .home-page-grid-container:has(.with-vesting) { + .home-page-grid-container:has(.with-migration):has(.with-vesting) { grid-template-areas: 'balance balance' 'staking migration' @@ -110,25 +97,27 @@ body { @screen md { .home-page-grid-container { + min-height: 700px; + height: calc(100vh - 140px); @apply grid-cols-3; grid-template-areas: 'balance staking staking' 'coins activity activity'; } - .home-page-grid-container:has(.with-vesting) { + .home-page-grid-container:has(.with-vesting):not(:has(.with-migration)) { grid-template-areas: 'balance staking staking' 'coins vesting vesting' 'coins activity activity'; } - .home-page-grid-container:has(.with-migration) { - @apply grid-cols-3; + + .home-page-grid-container:has(.with-migration):not(:has(.with-vesting)) { grid-template-areas: 'balance staking migration' 'coins activity activity'; } - .home-page-grid-container:has(.with-migration), - .home-page-grid-container:has(.with-vesting) { + + .home-page-grid-container:has(.with-migration):has(.with-vesting) { grid-template-areas: 'balance staking migration' 'coins vesting vesting' diff --git a/apps/wallet-dashboard/components/coins/MyCoins.tsx b/apps/wallet-dashboard/components/coins/MyCoins.tsx index fc441d76148..411d7cdc702 100644 --- a/apps/wallet-dashboard/components/coins/MyCoins.tsx +++ b/apps/wallet-dashboard/components/coins/MyCoins.tsx @@ -71,9 +71,9 @@ function MyCoins(): React.JSX.Element { return ( <Panel> - <div className="flex w-full flex-col"> + <div className="flex h-full w-full flex-col"> <Title title="My Coins" /> - <div className="px-sm pb-md pt-sm"> + <div className="px-sm py-sm"> <div className="inline-flex"> <SegmentedButton type={SegmentedButtonType.Filled}> {TOKEN_CATEGORIES.map(({ label, value }) => { @@ -96,37 +96,35 @@ function MyCoins(): React.JSX.Element { })} </SegmentedButton> </div> - <div className="pb-md pt-sm"> - {[TokenCategory.All, TokenCategory.Recognized].includes( - selectedTokenCategory, - ) && - recognized?.map((coin, index) => { - return ( - <CoinItem - key={index} - coinType={coin.coinType} - balance={BigInt(coin.totalBalance)} - onClick={() => openSendTokenDialog(coin)} - icon={ - <RecognizedBadge className="h-4 w-4 text-primary-40" /> - } - /> - ); - })} - {[TokenCategory.All, TokenCategory.Unrecognized].includes( - selectedTokenCategory, - ) && - unrecognized?.map((coin, index) => { - return ( - <CoinItem - key={index} - coinType={coin.coinType} - balance={BigInt(coin.totalBalance)} - onClick={() => openSendTokenDialog(coin)} - /> - ); - })} - </div> + </div> + <div className="h-full overflow-y-auto px-sm pb-md pt-sm"> + {[TokenCategory.All, TokenCategory.Recognized].includes( + selectedTokenCategory, + ) && + recognized?.map((coin, index) => { + return ( + <CoinItem + key={index} + coinType={coin.coinType} + balance={BigInt(coin.totalBalance)} + onClick={() => openSendTokenDialog(coin)} + icon={<RecognizedBadge className="h-4 w-4 text-primary-40" />} + /> + ); + })} + {[TokenCategory.All, TokenCategory.Unrecognized].includes( + selectedTokenCategory, + ) && + unrecognized?.map((coin, index) => { + return ( + <CoinItem + key={index} + coinType={coin.coinType} + balance={BigInt(coin.totalBalance)} + onClick={() => openSendTokenDialog(coin)} + /> + ); + })} </div> </div> {selectedCoin && activeAccountAddress && ( diff --git a/apps/wallet-dashboard/components/transactions/TransactionsOverview.tsx b/apps/wallet-dashboard/components/transactions/TransactionsOverview.tsx index a590e3abcdb..fcaf74eddaa 100644 --- a/apps/wallet-dashboard/components/transactions/TransactionsOverview.tsx +++ b/apps/wallet-dashboard/components/transactions/TransactionsOverview.tsx @@ -9,7 +9,7 @@ function TransactionsOverview() { return ( <Panel> <Title title="Activity" /> - <div className="px-sm pb-md pt-sm"> + <div className="h-full overflow-y-auto px-sm pb-md pt-sm"> <TransactionsList /> </div> </Panel> From 683e71d60e7320a17db15fba742644f90144de93 Mon Sep 17 00:00:00 2001 From: cpl121 <100352899+cpl121@users.noreply.github.com> Date: Wed, 18 Dec 2024 11:03:47 +0100 Subject: [PATCH 75/97] fix(wallet-dashboard, tooling-core): review staking numbers for bigints (#4483) * feat(core, dashboard): review staking numbers for bigints * fix(dashboard): format and error in bigint with decimals * fix(explorer): linter * fix: improve types in unstake transaction * fix(core): linter * fix: clean debris * fix: linter --------- Co-authored-by: Marc Espin <mespinsanz@gmail.com> --- apps/core/src/components/stake/StakedCard.tsx | 2 +- .../info/UnstakeTransactionInfo.tsx | 12 +-- apps/core/src/utils/getStakeIotaByIotaId.ts | 2 +- .../Dialogs/vesting/VestingScheduleBox.tsx | 2 +- .../StakedTimelockObject.tsx | 4 +- .../transactions/TransactionAmount.tsx | 2 +- .../lib/constants/vesting.constants.ts | 66 ++++++++-------- .../lib/interfaces/timelock.interface.ts | 2 +- .../lib/interfaces/vesting.interface.ts | 2 +- apps/wallet-dashboard/lib/utils/timelock.ts | 4 +- .../lib/utils/vesting/vesting.spec.ts | 76 +++++++------------ .../lib/utils/vesting/vesting.ts | 10 +-- 12 files changed, 83 insertions(+), 101 deletions(-) diff --git a/apps/core/src/components/stake/StakedCard.tsx b/apps/core/src/components/stake/StakedCard.tsx index 58bc5c82f20..92f6b0e8184 100644 --- a/apps/core/src/components/stake/StakedCard.tsx +++ b/apps/core/src/components/stake/StakedCard.tsx @@ -37,7 +37,7 @@ export function StakedCard({ // For inactive validator, show principal + rewards const [principalStaked, symbol] = useFormatCoin( - inactiveValidator ? principal + rewards : principal, + inactiveValidator ? BigInt(principal) + rewards : principal, IOTA_TYPE_ARG, ); diff --git a/apps/core/src/components/transaction/info/UnstakeTransactionInfo.tsx b/apps/core/src/components/transaction/info/UnstakeTransactionInfo.tsx index bb69cf69226..94e120821d3 100644 --- a/apps/core/src/components/transaction/info/UnstakeTransactionInfo.tsx +++ b/apps/core/src/components/transaction/info/UnstakeTransactionInfo.tsx @@ -27,21 +27,21 @@ export function UnstakeTransactionInfo({ renderExplorerLink, }: UnstakeTransactionInfoProps) { const json = event.parsedJson as { - principal_amount?: number; - reward_amount?: number; + principal_amount?: string; + reward_amount?: string; validator_address?: string; }; - const principalAmount = json?.principal_amount || 0; - const rewardAmount = json?.reward_amount || 0; + const principalAmount = json?.principal_amount || '0'; + const rewardAmount = json?.reward_amount || '0'; const validatorAddress = json?.validator_address; - const totalAmount = Number(principalAmount) + Number(rewardAmount); + const totalAmount = BigInt(principalAmount) + BigInt(rewardAmount); const [formatPrinciple, symbol] = useFormatCoin(principalAmount, IOTA_TYPE_ARG); const [formatRewards] = useFormatCoin(rewardAmount || 0, IOTA_TYPE_ARG); return ( <div className="flex flex-col gap-y-md"> {validatorAddress && <ValidatorLogo address={validatorAddress} isSelected />} - {totalAmount && ( + {totalAmount !== 0n && ( <TransactionAmount amount={totalAmount} coinType={IOTA_TYPE_ARG} subtitle="Total" /> )} <Panel hasBorder> diff --git a/apps/core/src/utils/getStakeIotaByIotaId.ts b/apps/core/src/utils/getStakeIotaByIotaId.ts index 5bdaa2a01ee..ba2e8837c99 100644 --- a/apps/core/src/utils/getStakeIotaByIotaId.ts +++ b/apps/core/src/utils/getStakeIotaByIotaId.ts @@ -10,7 +10,7 @@ export function getStakeIotaByIotaId(allDelegation: DelegatedStake[], stakeIotaI allDelegation.reduce((acc, curr) => { const total = BigInt( curr.stakes.find(({ stakedIotaId }) => stakedIotaId === stakeIotaId)?.principal || - 0, + 0n, ); return total + acc; }, 0n) || 0n diff --git a/apps/wallet-dashboard/components/Dialogs/vesting/VestingScheduleBox.tsx b/apps/wallet-dashboard/components/Dialogs/vesting/VestingScheduleBox.tsx index 25f861590a0..d9a93fc8d7c 100644 --- a/apps/wallet-dashboard/components/Dialogs/vesting/VestingScheduleBox.tsx +++ b/apps/wallet-dashboard/components/Dialogs/vesting/VestingScheduleBox.tsx @@ -8,7 +8,7 @@ import { IOTA_TYPE_ARG } from '@iota/iota-sdk/utils'; import { LockLocked } from '@iota/ui-icons'; interface VestingScheduleBoxProps { - amount: number; + amount: bigint; expirationTimestampMs: number; } diff --git a/apps/wallet-dashboard/components/staked-timelock-object/StakedTimelockObject.tsx b/apps/wallet-dashboard/components/staked-timelock-object/StakedTimelockObject.tsx index 8696705bc12..f7e21915a3a 100644 --- a/apps/wallet-dashboard/components/staked-timelock-object/StakedTimelockObject.tsx +++ b/apps/wallet-dashboard/components/staked-timelock-object/StakedTimelockObject.tsx @@ -27,11 +27,11 @@ export function StakedTimelockObject({ // TODO probably we could calculate estimated reward on grouping stage. const summary = timelockedStakedObject.stakes.reduce( (acc, stake) => { - const estimatedReward = stake.status === 'Active' ? stake.estimatedReward : 0; + const estimatedReward = stake.status === 'Active' ? BigInt(stake.estimatedReward) : 0n; return { principal: BigInt(stake.principal) + acc.principal, - estimatedReward: BigInt(estimatedReward) + acc.estimatedReward, + estimatedReward: estimatedReward + acc.estimatedReward, stakeRequestEpoch: stake.stakeRequestEpoch, }; }, diff --git a/apps/wallet-dashboard/components/transactions/TransactionAmount.tsx b/apps/wallet-dashboard/components/transactions/TransactionAmount.tsx index ae7654b0273..498ebc19522 100644 --- a/apps/wallet-dashboard/components/transactions/TransactionAmount.tsx +++ b/apps/wallet-dashboard/components/transactions/TransactionAmount.tsx @@ -5,7 +5,7 @@ import { useFormatCoin } from '@iota/core'; interface TransactionAmountProps { - amount: string | number; + amount: string | number | bigint; coinType: string; label: string; approximation?: boolean; diff --git a/apps/wallet-dashboard/lib/constants/vesting.constants.ts b/apps/wallet-dashboard/lib/constants/vesting.constants.ts index 5e290e70e06..51ace2168a7 100644 --- a/apps/wallet-dashboard/lib/constants/vesting.constants.ts +++ b/apps/wallet-dashboard/lib/constants/vesting.constants.ts @@ -32,7 +32,7 @@ export const MOCKED_SUPPLY_INCREASE_VESTING_TIMELOCKED_OBJECTS: TimelockedObject id: '0xfe755ca67e3a0714f97ec3c49cfc6f3ecdab2673d96b5840294d3a5db376c99', }, locked: { - value: 2_000_000_000, + value: 2_000_000_000n, }, expirationTimestampMs: 1697320800000, label: SUPPLY_INCREASE_VESTING_LABEL, @@ -42,7 +42,7 @@ export const MOCKED_SUPPLY_INCREASE_VESTING_TIMELOCKED_OBJECTS: TimelockedObject id: '0x682d14613231dd1dde39397977cdfafb6b6263b5683b6782348c597c104b834', }, locked: { - value: 2_000_000_000, + value: 2_000_000_000n, }, expirationTimestampMs: 1698530400000, label: SUPPLY_INCREASE_VESTING_LABEL, @@ -52,7 +52,7 @@ export const MOCKED_SUPPLY_INCREASE_VESTING_TIMELOCKED_OBJECTS: TimelockedObject id: '0x93f2bf2d044e45e1a85c010c22357892d1625436b8c95b26dcdb6f309319064', }, locked: { - value: 2_000_000_000, + value: 2_000_000_000n, }, expirationTimestampMs: 1699740000000, label: SUPPLY_INCREASE_VESTING_LABEL, @@ -62,7 +62,7 @@ export const MOCKED_SUPPLY_INCREASE_VESTING_TIMELOCKED_OBJECTS: TimelockedObject id: '0x44fa510ba216cd555ecd6b99d1ebd612f82e2bf421091c973bca49b064dc72b', }, locked: { - value: 2_000_000_000, + value: 2_000_000_000n, }, expirationTimestampMs: 1700949600000, label: SUPPLY_INCREASE_VESTING_LABEL, @@ -72,7 +72,7 @@ export const MOCKED_SUPPLY_INCREASE_VESTING_TIMELOCKED_OBJECTS: TimelockedObject id: '0xacd861b6dc5d108af03655a2175545ac6d432c526bcbe294b90e722fa36b459', }, locked: { - value: 2_000_000_000, + value: 2_000_000_000n, }, expirationTimestampMs: 1702159200000, label: SUPPLY_INCREASE_VESTING_LABEL, @@ -82,7 +82,7 @@ export const MOCKED_SUPPLY_INCREASE_VESTING_TIMELOCKED_OBJECTS: TimelockedObject id: '0x8f9eeb5953c77d53dcff3057619af7a29be1d9ce67bf66c86ad5309379d17e5', }, locked: { - value: 2_000_000_000, + value: 2_000_000_000n, }, expirationTimestampMs: 1703368800000, label: SUPPLY_INCREASE_VESTING_LABEL, @@ -92,7 +92,7 @@ export const MOCKED_SUPPLY_INCREASE_VESTING_TIMELOCKED_OBJECTS: TimelockedObject id: '0x70b1063c1104760afc06df5217bebdf02f937e1aff51211fc0472e677ba8c74', }, locked: { - value: 2_000_000_000, + value: 2_000_000_000n, }, expirationTimestampMs: 1704578400000, label: SUPPLY_INCREASE_VESTING_LABEL, @@ -102,7 +102,7 @@ export const MOCKED_SUPPLY_INCREASE_VESTING_TIMELOCKED_OBJECTS: TimelockedObject id: '0xb0aa6f655d08f630c15a2cfb4e3e13e307ce9d96c52c1e91c65a71a204819bd', }, locked: { - value: 2_000_000_000, + value: 2_000_000_000n, }, expirationTimestampMs: 1705788000000, label: SUPPLY_INCREASE_VESTING_LABEL, @@ -112,7 +112,7 @@ export const MOCKED_SUPPLY_INCREASE_VESTING_TIMELOCKED_OBJECTS: TimelockedObject id: '0x65224b9a3b9eadc55be4cb6efa363f283b924607496d60c02deef2aa6bf9e22', }, locked: { - value: 2_000_000_000, + value: 2_000_000_000n, }, expirationTimestampMs: 1706997600000, label: SUPPLY_INCREASE_VESTING_LABEL, @@ -122,7 +122,7 @@ export const MOCKED_SUPPLY_INCREASE_VESTING_TIMELOCKED_OBJECTS: TimelockedObject id: '0x68f9a2af0ebd0bcd9e3cc836ac7103670a9602e8dca8fd28e7b2b5a693898f2', }, locked: { - value: 2_000_000_000, + value: 2_000_000_000n, }, expirationTimestampMs: 1708207200000, label: SUPPLY_INCREASE_VESTING_LABEL, @@ -132,7 +132,7 @@ export const MOCKED_SUPPLY_INCREASE_VESTING_TIMELOCKED_OBJECTS: TimelockedObject id: '0x637e6b758efdb8d49ee96397ca909d579bb77b79f8b64e7e7f1af13ad4f7ce4', }, locked: { - value: 2_000_000_000, + value: 2_000_000_000n, }, expirationTimestampMs: 1709416800000, label: SUPPLY_INCREASE_VESTING_LABEL, @@ -142,7 +142,7 @@ export const MOCKED_SUPPLY_INCREASE_VESTING_TIMELOCKED_OBJECTS: TimelockedObject id: '0xbd0f349c21b67faec992b6c9a1b9b6343b4ff1f2ad5f33b0b4cd0fc31be2b31', }, locked: { - value: 2_000_000_000, + value: 2_000_000_000n, }, expirationTimestampMs: 1710626400000, label: SUPPLY_INCREASE_VESTING_LABEL, @@ -152,7 +152,7 @@ export const MOCKED_SUPPLY_INCREASE_VESTING_TIMELOCKED_OBJECTS: TimelockedObject id: '0xfb8c3539b22e4086bd03417027e70515e6fb6d18f366876ad5ad0d8da3bde0f', }, locked: { - value: 2_000_000_000, + value: 2_000_000_000n, }, expirationTimestampMs: 1711836000000, label: SUPPLY_INCREASE_VESTING_LABEL, @@ -162,7 +162,7 @@ export const MOCKED_SUPPLY_INCREASE_VESTING_TIMELOCKED_OBJECTS: TimelockedObject id: '0xbfb7c1a941885cc55a191e579c7c6d5dc345d6b5b9cfa439f724a343d354032', }, locked: { - value: 2_000_000_000, + value: 2_000_000_000n, }, expirationTimestampMs: 1713045600000, label: SUPPLY_INCREASE_VESTING_LABEL, @@ -172,7 +172,7 @@ export const MOCKED_SUPPLY_INCREASE_VESTING_TIMELOCKED_OBJECTS: TimelockedObject id: '0x8935a904f90e23f6f453cb0c85a03859e07f1c9e5a5d1644b2fbe7005d8e158', }, locked: { - value: 2_000_000_000, + value: 2_000_000_000n, }, expirationTimestampMs: 1714255200000, label: SUPPLY_INCREASE_VESTING_LABEL, @@ -182,7 +182,7 @@ export const MOCKED_SUPPLY_INCREASE_VESTING_TIMELOCKED_OBJECTS: TimelockedObject id: '0x73be6f8df4b73b83f8ccf909d61aabb56c56c56aa597d2806eccf3ab4fac66b', }, locked: { - value: 2_000_000_000, + value: 2_000_000_000n, }, expirationTimestampMs: 1715464800000, label: SUPPLY_INCREASE_VESTING_LABEL, @@ -192,7 +192,7 @@ export const MOCKED_SUPPLY_INCREASE_VESTING_TIMELOCKED_OBJECTS: TimelockedObject id: '0x20075cc2ebd5fa6e069829e58e55e6e010ad115e8cbc48d7a3d98d079ce649a', }, locked: { - value: 2_000_000_000, + value: 2_000_000_000n, }, expirationTimestampMs: 1716674400000, label: SUPPLY_INCREASE_VESTING_LABEL, @@ -202,7 +202,7 @@ export const MOCKED_SUPPLY_INCREASE_VESTING_TIMELOCKED_OBJECTS: TimelockedObject id: '0xce03433d496cb231ead90a661fe08b924eb9b0cfb43dd560ea02a8060f6afd0', }, locked: { - value: 2_000_000_000, + value: 2_000_000_000n, }, expirationTimestampMs: 1717884000000, label: SUPPLY_INCREASE_VESTING_LABEL, @@ -212,7 +212,7 @@ export const MOCKED_SUPPLY_INCREASE_VESTING_TIMELOCKED_OBJECTS: TimelockedObject id: '0xf111b8705ba276f8c6b76bdf72a4a46889cb8207cc5a80d3df0f40d9576116a', }, locked: { - value: 2_000_000_000, + value: 2_000_000_000n, }, expirationTimestampMs: 1719093600000, label: SUPPLY_INCREASE_VESTING_LABEL, @@ -222,7 +222,7 @@ export const MOCKED_SUPPLY_INCREASE_VESTING_TIMELOCKED_OBJECTS: TimelockedObject id: '0xbc27940fb9c6f96ae9e2c11ad151446e30de5281172e48aac7f600d1da92c10', }, locked: { - value: 2_000_000_000, + value: 2_000_000_000n, }, expirationTimestampMs: 1720303200000, label: SUPPLY_INCREASE_VESTING_LABEL, @@ -232,7 +232,7 @@ export const MOCKED_SUPPLY_INCREASE_VESTING_TIMELOCKED_OBJECTS: TimelockedObject id: '0x016fae8797d3d12a26e215ec1815ee8adce70bb93149b4d55eb06a81c476ff9', }, locked: { - value: 2_000_000_000, + value: 2_000_000_000n, }, expirationTimestampMs: 1721512800000, label: SUPPLY_INCREASE_VESTING_LABEL, @@ -242,7 +242,7 @@ export const MOCKED_SUPPLY_INCREASE_VESTING_TIMELOCKED_OBJECTS: TimelockedObject id: '0x06f1e354ff551d76da8dc890eab728a65319defb3608991b4c70a1a2b30e8f1', }, locked: { - value: 2_000_000_000, + value: 2_000_000_000n, }, expirationTimestampMs: 1722722400000, label: SUPPLY_INCREASE_VESTING_LABEL, @@ -252,7 +252,7 @@ export const MOCKED_SUPPLY_INCREASE_VESTING_TIMELOCKED_OBJECTS: TimelockedObject id: '0xc4cf3ea32480aab7d78784c6f00b9210ce0ffaabbcbb8cddd846073e7455386', }, locked: { - value: 2_000_000_000, + value: 2_000_000_000n, }, expirationTimestampMs: 1723932000000, label: SUPPLY_INCREASE_VESTING_LABEL, @@ -262,7 +262,7 @@ export const MOCKED_SUPPLY_INCREASE_VESTING_TIMELOCKED_OBJECTS: TimelockedObject id: '0x6dc10a8008855549b8d92e7704c799253a953d9835af001970426414fdd3ba7', }, locked: { - value: 2_000_000_000, + value: 2_000_000_000n, }, expirationTimestampMs: 1725141600000, label: SUPPLY_INCREASE_VESTING_LABEL, @@ -272,7 +272,7 @@ export const MOCKED_SUPPLY_INCREASE_VESTING_TIMELOCKED_OBJECTS: TimelockedObject id: '0xa5f7a66c575db3f74c5fe7043c28f7231a2127aec4dc2de88f5b9d3cf020511', }, locked: { - value: 2_000_000_000, + value: 2_000_000_000n, }, expirationTimestampMs: 1726351200000, label: SUPPLY_INCREASE_VESTING_LABEL, @@ -282,7 +282,7 @@ export const MOCKED_SUPPLY_INCREASE_VESTING_TIMELOCKED_OBJECTS: TimelockedObject id: '0xde0a4c2e0f16541983302c596339815ffa4d4743509e8115bc06fcf7f71ea8f', }, locked: { - value: 2_000_000_000, + value: 2_000_000_000n, }, expirationTimestampMs: 1727560800000, label: SUPPLY_INCREASE_VESTING_LABEL, @@ -292,7 +292,7 @@ export const MOCKED_SUPPLY_INCREASE_VESTING_TIMELOCKED_OBJECTS: TimelockedObject id: '0xccc5d23ab69789b934b9bf7f5006e43eef45c2d7a251e3eec8b7dd24bc20a07', }, locked: { - value: 2_000_000_000, + value: 2_000_000_000n, }, expirationTimestampMs: 1728770400000, label: SUPPLY_INCREASE_VESTING_LABEL, @@ -302,7 +302,7 @@ export const MOCKED_SUPPLY_INCREASE_VESTING_TIMELOCKED_OBJECTS: TimelockedObject id: '0x503dc8844b0cd6e74e735433751328e8283569e81b4602aaa6941ce3fe826bb', }, locked: { - value: 2_000_000_000, + value: 2_000_000_000n, }, expirationTimestampMs: 1729980000000, label: SUPPLY_INCREASE_VESTING_LABEL, @@ -312,7 +312,7 @@ export const MOCKED_SUPPLY_INCREASE_VESTING_TIMELOCKED_OBJECTS: TimelockedObject id: '0x0fac98b5ac955644dffa0700933aababe438fae6fc58b8a4bd1f740c8aba941', }, locked: { - value: 2_000_000_000, + value: 2_000_000_000n, }, expirationTimestampMs: 1731189600000, label: SUPPLY_INCREASE_VESTING_LABEL, @@ -322,7 +322,7 @@ export const MOCKED_SUPPLY_INCREASE_VESTING_TIMELOCKED_OBJECTS: TimelockedObject id: '0x756483e3c7dd3491ea405f682df6c5dc1e4a59d8b5c9725b0d194815a25ea95', }, locked: { - value: 2_000_000_000, + value: 2_000_000_000n, }, expirationTimestampMs: 1732399200000, label: SUPPLY_INCREASE_VESTING_LABEL, @@ -332,7 +332,7 @@ export const MOCKED_SUPPLY_INCREASE_VESTING_TIMELOCKED_OBJECTS: TimelockedObject id: '0x72c4318876f51bed94c2228b395d18f5dce5f243039c7e3d8fad690dfe918fc', }, locked: { - value: 2_000_000_000, + value: 2_000_000_000n, }, expirationTimestampMs: 1733608800000, label: SUPPLY_INCREASE_VESTING_LABEL, @@ -342,7 +342,7 @@ export const MOCKED_SUPPLY_INCREASE_VESTING_TIMELOCKED_OBJECTS: TimelockedObject id: '0x37f68fd72af05b4c923268b64a0baa7511f27bc4cbd90641e444e7116f02604', }, locked: { - value: 2_000_000_000, + value: 2_000_000_000n, }, expirationTimestampMs: 1734818400000, label: SUPPLY_INCREASE_VESTING_LABEL, @@ -352,7 +352,7 @@ export const MOCKED_SUPPLY_INCREASE_VESTING_TIMELOCKED_OBJECTS: TimelockedObject id: '0x97bedf66e48392a0b9baf8a8280e72fcce9b32ff980832edfe1a90a14ce9047', }, locked: { - value: 2_000_000_000, + value: 2_000_000_000n, }, expirationTimestampMs: 1736028000000, label: SUPPLY_INCREASE_VESTING_LABEL, diff --git a/apps/wallet-dashboard/lib/interfaces/timelock.interface.ts b/apps/wallet-dashboard/lib/interfaces/timelock.interface.ts index 12b26daeecb..2cb58e1a988 100644 --- a/apps/wallet-dashboard/lib/interfaces/timelock.interface.ts +++ b/apps/wallet-dashboard/lib/interfaces/timelock.interface.ts @@ -6,7 +6,7 @@ export interface UID { } export interface Balance { - value: number; + value: bigint; } export interface TimelockedObject { diff --git a/apps/wallet-dashboard/lib/interfaces/vesting.interface.ts b/apps/wallet-dashboard/lib/interfaces/vesting.interface.ts index ba846d71e6c..4eac7bcc774 100644 --- a/apps/wallet-dashboard/lib/interfaces/vesting.interface.ts +++ b/apps/wallet-dashboard/lib/interfaces/vesting.interface.ts @@ -7,7 +7,7 @@ export enum SupplyIncreaseUserType { } export interface SupplyIncreaseVestingPayout { - amount: number; + amount: bigint; expirationTimestampMs: number; } diff --git a/apps/wallet-dashboard/lib/utils/timelock.ts b/apps/wallet-dashboard/lib/utils/timelock.ts index 90c77c0ba9f..f8e06340922 100644 --- a/apps/wallet-dashboard/lib/utils/timelock.ts +++ b/apps/wallet-dashboard/lib/utils/timelock.ts @@ -42,14 +42,14 @@ export function mapTimelockObjects(iotaObjects: IotaObjectData[]): TimelockedObj if (!iotaObject?.content?.dataType || iotaObject.content.dataType !== 'moveObject') { return { id: { id: '' }, - locked: { value: 0 }, + locked: { value: 0n }, expirationTimestampMs: 0, }; } const fields = iotaObject.content.fields as unknown as TimelockedIotaResponse; return { id: fields.id, - locked: { value: Number(fields.locked) }, + locked: { value: BigInt(fields.locked) }, expirationTimestampMs: Number(fields.expiration_timestamp_ms), label: fields.label, }; diff --git a/apps/wallet-dashboard/lib/utils/vesting/vesting.spec.ts b/apps/wallet-dashboard/lib/utils/vesting/vesting.spec.ts index e0bb1f37bd5..3612418d48b 100644 --- a/apps/wallet-dashboard/lib/utils/vesting/vesting.spec.ts +++ b/apps/wallet-dashboard/lib/utils/vesting/vesting.spec.ts @@ -21,10 +21,6 @@ import { const MOCKED_CURRENT_EPOCH_TIMESTAMP = Date.now() + MILLISECONDS_PER_HOUR * 6; // 6 hours later -function bigIntRound(n: number) { - return BigInt(Math.floor(n)); -} - describe('get last supply increase vesting payout', () => { it('should get the object with highest expirationTimestampMs', () => { const timelockedObjects = MOCKED_SUPPLY_INCREASE_VESTING_TIMELOCKED_OBJECTS; @@ -48,7 +44,7 @@ describe('get last supply increase vesting payout', () => { describe('get supply increase user type', () => { it('should return staker, if last payout is two years away from vesting starting year (2023)', () => { const vestingPayout: SupplyIncreaseVestingPayout = { - amount: 1000, + amount: 1000n, expirationTimestampMs: 1735689661000, // Wednesday, 1 January 2025 00:01:01 }; const userType = getSupplyIncreaseVestingUserType([vestingPayout]); @@ -57,7 +53,7 @@ describe('get supply increase user type', () => { it('should return entity, if last payout is more than two years away from vesting starting year (2023)', () => { const vestingPayout: SupplyIncreaseVestingPayout = { - amount: 1000, + amount: 1000n, expirationTimestampMs: 1798761661000, // Friday, 1 January 2027 00:01:01 }; const userType = getSupplyIncreaseVestingUserType([vestingPayout]); @@ -125,12 +121,12 @@ describe('vesting overview', () => { it('should get correct vesting overview data with timelocked objects', () => { const timelockedObjects = MOCKED_SUPPLY_INCREASE_VESTING_TIMELOCKED_OBJECTS; const lastPayout = timelockedObjects[timelockedObjects.length - 1]; - const totalAmount = bigIntRound( - (SUPPLY_INCREASE_STAKER_VESTING_DURATION * - SUPPLY_INCREASE_VESTING_PAYOUTS_IN_1_YEAR * + const totalAmount = + (BigInt(SUPPLY_INCREASE_STAKER_VESTING_DURATION) * + BigInt(SUPPLY_INCREASE_VESTING_PAYOUTS_IN_1_YEAR) * + 10n * lastPayout.locked.value) / - 0.9, - ); + 9n; const vestingOverview = getVestingOverview(timelockedObjects, Date.now()); expect(vestingOverview.totalVested).toEqual(totalAmount); @@ -145,9 +141,7 @@ describe('vesting overview', () => { const lockedAmount = vestingPortfolio.reduce( (acc, current) => - current.expirationTimestampMs > Date.now() - ? acc + bigIntRound(current.amount) - : acc, + current.expirationTimestampMs > Date.now() ? acc + current.amount : acc, 0n, ); @@ -159,16 +153,12 @@ describe('vesting overview', () => { const lockedObjectsAmount = timelockedObjects.reduce( (acc, current) => - current.expirationTimestampMs > Date.now() - ? acc + bigIntRound(current.locked.value) - : acc, + current.expirationTimestampMs > Date.now() ? acc + current.locked.value : acc, 0n, ); const unlockedObjectsAmount = timelockedObjects.reduce( (acc, current) => - current.expirationTimestampMs <= Date.now() - ? acc + bigIntRound(current.locked.value) - : acc, + current.expirationTimestampMs <= Date.now() ? acc + current.locked.value : acc, 0n, ); @@ -182,20 +172,20 @@ describe('vesting overview', () => { formatDelegatedTimelockedStake(timelockedStakedObjects); const lastPayout = extendedTimelockedStakedObjects[extendedTimelockedStakedObjects.length - 1]; - const lastPayoutValue = Number(lastPayout.principal); - const totalAmount = bigIntRound( - (SUPPLY_INCREASE_STAKER_VESTING_DURATION * - SUPPLY_INCREASE_VESTING_PAYOUTS_IN_1_YEAR * - lastPayoutValue) / - 0.9, - ); + const lastPayoutValue = BigInt(lastPayout.principal); + const totalAmount = + (BigInt(SUPPLY_INCREASE_STAKER_VESTING_DURATION) * + BigInt(SUPPLY_INCREASE_VESTING_PAYOUTS_IN_1_YEAR) * + lastPayoutValue * + 10n) / + 9n; const vestingOverview = getVestingOverview(extendedTimelockedStakedObjects, Date.now()); expect(vestingOverview.totalVested).toEqual(totalAmount); const vestingPortfolio = buildVestingPortfolio( { - amount: lastPayoutValue, + amount: BigInt(lastPayoutValue), expirationTimestampMs: Number(lastPayout.expirationTimestampMs), }, Date.now(), @@ -203,9 +193,7 @@ describe('vesting overview', () => { const lockedAmount = vestingPortfolio.reduce( (acc, current) => - current.expirationTimestampMs > Date.now() - ? acc + bigIntRound(current.amount) - : acc, + current.expirationTimestampMs > Date.now() ? acc + current.amount : acc, 0n, ); @@ -215,7 +203,7 @@ describe('vesting overview', () => { let totalStaked = 0n; for (const timelockedStakedObject of timelockedStakedObjects) { const stakesAmount = timelockedStakedObject.stakes.reduce( - (acc, current) => acc + bigIntRound(Number(current.principal)), + (acc, current) => acc + BigInt(current.principal), 0n, ); totalStaked += stakesAmount; @@ -239,12 +227,12 @@ describe('vesting overview', () => { mixedObjects, MOCKED_CURRENT_EPOCH_TIMESTAMP, )!; - const totalAmount = bigIntRound( - (SUPPLY_INCREASE_STAKER_VESTING_DURATION * - SUPPLY_INCREASE_VESTING_PAYOUTS_IN_1_YEAR * + const totalAmount = + (BigInt(SUPPLY_INCREASE_STAKER_VESTING_DURATION) * + BigInt(SUPPLY_INCREASE_VESTING_PAYOUTS_IN_1_YEAR) * + 10n * lastPayout.amount) / - 0.9, - ); + 9n; const vestingOverview = getVestingOverview(mixedObjects, Date.now()); expect(vestingOverview.totalVested).toEqual(totalAmount); @@ -259,9 +247,7 @@ describe('vesting overview', () => { const lockedAmount = vestingPortfolio.reduce( (acc, current) => - current.expirationTimestampMs > Date.now() - ? acc + bigIntRound(current.amount) - : acc, + current.expirationTimestampMs > Date.now() ? acc + current.amount : acc, 0n, ); @@ -269,7 +255,7 @@ describe('vesting overview', () => { expect(vestingOverview.totalUnlocked).toEqual(totalAmount - lockedAmount); const totalStaked = extendedTimelockedStakedObjects.reduce( - (acc, current) => acc + bigIntRound(Number(current.principal)), + (acc, current) => acc + BigInt(current.principal), 0n, ); @@ -278,16 +264,12 @@ describe('vesting overview', () => { const timelockObjects = mixedObjects.filter(isTimelockedObject); const availableClaiming = timelockObjects.reduce( (acc, current) => - current.expirationTimestampMs <= Date.now() - ? acc + bigIntRound(current.locked.value) - : acc, + current.expirationTimestampMs <= Date.now() ? acc + current.locked.value : acc, 0n, ); const availableStaking = timelockObjects.reduce( (acc, current) => - current.expirationTimestampMs > Date.now() - ? acc + bigIntRound(current.locked.value) - : acc, + current.expirationTimestampMs > Date.now() ? acc + current.locked.value : acc, 0n, ); expect(vestingOverview.availableClaiming).toEqual(availableClaiming); diff --git a/apps/wallet-dashboard/lib/utils/vesting/vesting.ts b/apps/wallet-dashboard/lib/utils/vesting/vesting.ts index e0bb8a29158..374d9a19204 100644 --- a/apps/wallet-dashboard/lib/utils/vesting/vesting.ts +++ b/apps/wallet-dashboard/lib/utils/vesting/vesting.ts @@ -53,7 +53,7 @@ export function getLatestOrEarliestSupplyIncreaseVestingPayout( } function addVestingPayoutToSupplyIncreaseMap( - value: number, + value: bigint, expirationTimestampMs: number, supplyIncreaseMap: Map<number, SupplyIncreaseVestingPayout>, ) { @@ -85,7 +85,7 @@ function supplyIncreaseVestingObjectsToPayoutMap( expirationToVestingPayout, ); } else if (isTimelockedStakedIota(vestingObject)) { - const objectValue = Number(vestingObject.principal); + const objectValue = BigInt(vestingObject.principal); const expirationTimestampMs = Number(vestingObject.expirationTimestampMs); addVestingPayoutToSupplyIncreaseMap( objectValue, @@ -162,7 +162,7 @@ export function getVestingOverview( const userType = getSupplyIncreaseVestingUserType([latestPayout]); const vestingPayoutsCount = getSupplyIncreaseVestingPayoutsCount(userType!); // Note: we add the initial payout to the total rewards, 10% of the total rewards are paid out immediately - const totalVestedAmount = BigInt(Math.floor((vestingPayoutsCount * latestPayout.amount) / 0.9)); + const totalVestedAmount = (BigInt(vestingPayoutsCount) * latestPayout.amount * 10n) / 9n; const vestingPortfolio = buildSupplyIncreaseVestingSchedule( latestPayout, currentEpochTimestamp, @@ -326,7 +326,7 @@ export function prepareObjectsForTimelockedStakingTransaction( targetAmount: bigint, currentEpochMs: string, ): GroupedTimelockObject[] { - if (Number(targetAmount) === 0) { + if (targetAmount === 0n) { return []; } const timelockedMapped = mapTimelockObjects(timelockedObjects); @@ -368,7 +368,7 @@ export function prepareObjectsForTimelockedStakingTransaction( const remainingAmount = totalLocked - targetAmount; // Add splitAmount property to the vesting objects that need to be split - if (remainingAmount > 0) { + if (remainingAmount > 0n) { selectedGroupedTimelockObjects = adjustSplitAmountsInGroupedTimelockObjects( selectedGroupedTimelockObjects, remainingAmount, From a0d25ff848c4aee370539a0aa5bc0c14db710c8a Mon Sep 17 00:00:00 2001 From: Bran <52735957+brancoder@users.noreply.github.com> Date: Wed, 18 Dec 2024 11:12:01 +0100 Subject: [PATCH 76/97] feat(wallet-dashboard): add settings menu and network switcher (#4509) * feat: add settings menu and network switcher * fix: reset react queries * fix: change notifications for toast * fix: view enums and icon ordering in top nav --- .../(protected)/components/top-nav/TopNav.tsx | 31 +++++++++- .../components/Dialogs/index.ts | 1 + .../Dialogs/settings/SettingsDialog.tsx | 38 ++++++++++++ .../Dialogs/settings/enums/index.ts | 4 ++ .../Dialogs/settings/enums/view.enums.ts | 7 +++ .../Dialogs/settings/hooks/index.ts | 4 ++ .../settings/hooks/useSettingsDialog.ts | 27 +++++++++ .../components/Dialogs/settings/index.ts | 7 +++ .../settings/views/NetworkSelectorView.tsx | 53 ++++++++++++++++ .../settings/views/SettingsListView.tsx | 60 +++++++++++++++++++ .../Dialogs/settings/views/index.ts | 5 ++ .../providers/AppProviders.tsx | 10 +++- 12 files changed, 242 insertions(+), 5 deletions(-) create mode 100644 apps/wallet-dashboard/components/Dialogs/settings/SettingsDialog.tsx create mode 100644 apps/wallet-dashboard/components/Dialogs/settings/enums/index.ts create mode 100644 apps/wallet-dashboard/components/Dialogs/settings/enums/view.enums.ts create mode 100644 apps/wallet-dashboard/components/Dialogs/settings/hooks/index.ts create mode 100644 apps/wallet-dashboard/components/Dialogs/settings/hooks/useSettingsDialog.ts create mode 100644 apps/wallet-dashboard/components/Dialogs/settings/index.ts create mode 100644 apps/wallet-dashboard/components/Dialogs/settings/views/NetworkSelectorView.tsx create mode 100644 apps/wallet-dashboard/components/Dialogs/settings/views/SettingsListView.tsx create mode 100644 apps/wallet-dashboard/components/Dialogs/settings/views/index.ts diff --git a/apps/wallet-dashboard/app/(protected)/components/top-nav/TopNav.tsx b/apps/wallet-dashboard/app/(protected)/components/top-nav/TopNav.tsx index 2fe8eba32f3..3b802387ca8 100644 --- a/apps/wallet-dashboard/app/(protected)/components/top-nav/TopNav.tsx +++ b/apps/wallet-dashboard/app/(protected)/components/top-nav/TopNav.tsx @@ -1,18 +1,43 @@ // Copyright (c) 2024 IOTA Stiftung // SPDX-License-Identifier: Apache-2.0 +import { SettingsDialog, useSettingsDialog } from '@/components'; import { Badge, BadgeType, Button, ButtonType } from '@iota/apps-ui-kit'; +import { ConnectButton, useIotaClientContext } from '@iota/dapp-kit'; +import { getNetwork, Network } from '@iota/iota-sdk/client'; import { ThemeSwitcher } from '@iota/core'; -import { ConnectButton } from '@iota/dapp-kit'; import { Settings } from '@iota/ui-icons'; export function TopNav() { + const { network } = useIotaClientContext(); + const { name: networkName } = getNetwork(network); + const { + isSettingsDialogOpen, + settingsDialogView, + setSettingsDialogView, + onCloseSettingsDialogClick, + onOpenSettingsDialogClick, + } = useSettingsDialog(); + return ( <div className="flex w-full flex-row items-center justify-end gap-md py-xs--rs"> - <Badge label="Mainnet" type={BadgeType.PrimarySoft} /> + <Badge + label={networkName} + type={network === Network.Mainnet ? BadgeType.PrimarySoft : BadgeType.Neutral} + /> <ConnectButton size="md" /> + <SettingsDialog + isOpen={isSettingsDialogOpen} + handleClose={onCloseSettingsDialogClick} + view={settingsDialogView} + setView={setSettingsDialogView} + /> <ThemeSwitcher /> - <Button icon={<Settings />} type={ButtonType.Ghost} /> + <Button + icon={<Settings />} + type={ButtonType.Ghost} + onClick={onOpenSettingsDialogClick} + /> </div> ); } diff --git a/apps/wallet-dashboard/components/Dialogs/index.ts b/apps/wallet-dashboard/components/Dialogs/index.ts index 50ba05f1571..db380d17927 100644 --- a/apps/wallet-dashboard/components/Dialogs/index.ts +++ b/apps/wallet-dashboard/components/Dialogs/index.ts @@ -6,4 +6,5 @@ export * from './ReceiveFundsDialog'; export * from './Staking'; export * from './unstake'; export * from './vesting'; +export * from './settings'; export * from './MigrationDialog'; diff --git a/apps/wallet-dashboard/components/Dialogs/settings/SettingsDialog.tsx b/apps/wallet-dashboard/components/Dialogs/settings/SettingsDialog.tsx new file mode 100644 index 00000000000..2c87b522af2 --- /dev/null +++ b/apps/wallet-dashboard/components/Dialogs/settings/SettingsDialog.tsx @@ -0,0 +1,38 @@ +// Copyright (c) 2024 IOTA Stiftung +// SPDX-License-Identifier: Apache-2.0 + +import React from 'react'; +import { Dialog } from '@iota/apps-ui-kit'; +import { SettingsDialogView } from './enums'; +import { SettingsListView, NetworkSelectorView } from './views'; + +interface SettingsDialogProps { + isOpen: boolean; + handleClose: () => void; + view: SettingsDialogView | undefined; + setView: (view: SettingsDialogView) => void; +} + +export function SettingsDialog({ + isOpen, + handleClose, + view, + setView, +}: SettingsDialogProps): JSX.Element { + function onBack(): void { + setView(SettingsDialogView.SelectSetting); + } + + return ( + <Dialog open={isOpen} onOpenChange={() => handleClose()}> + <> + {view === SettingsDialogView.SelectSetting && ( + <SettingsListView handleClose={handleClose} setView={setView} /> + )} + {view === SettingsDialogView.NetworkSettings && ( + <NetworkSelectorView handleClose={handleClose} onBack={onBack} /> + )} + </> + </Dialog> + ); +} diff --git a/apps/wallet-dashboard/components/Dialogs/settings/enums/index.ts b/apps/wallet-dashboard/components/Dialogs/settings/enums/index.ts new file mode 100644 index 00000000000..6f408e39b8c --- /dev/null +++ b/apps/wallet-dashboard/components/Dialogs/settings/enums/index.ts @@ -0,0 +1,4 @@ +// Copyright (c) 2024 IOTA Stiftung +// SPDX-License-Identifier: Apache-2.0 + +export * from './view.enums'; diff --git a/apps/wallet-dashboard/components/Dialogs/settings/enums/view.enums.ts b/apps/wallet-dashboard/components/Dialogs/settings/enums/view.enums.ts new file mode 100644 index 00000000000..b3f17bb2130 --- /dev/null +++ b/apps/wallet-dashboard/components/Dialogs/settings/enums/view.enums.ts @@ -0,0 +1,7 @@ +// Copyright (c) 2024 IOTA Stiftung +// SPDX-License-Identifier: Apache-2.0 + +export enum SettingsDialogView { + SelectSetting = 'SelectSetting', + NetworkSettings = 'NetworkSettings', +} diff --git a/apps/wallet-dashboard/components/Dialogs/settings/hooks/index.ts b/apps/wallet-dashboard/components/Dialogs/settings/hooks/index.ts new file mode 100644 index 00000000000..dfc58ee2f8b --- /dev/null +++ b/apps/wallet-dashboard/components/Dialogs/settings/hooks/index.ts @@ -0,0 +1,4 @@ +// Copyright (c) 2024 IOTA Stiftung +// SPDX-License-Identifier: Apache-2.0 + +export * from './useSettingsDialog'; diff --git a/apps/wallet-dashboard/components/Dialogs/settings/hooks/useSettingsDialog.ts b/apps/wallet-dashboard/components/Dialogs/settings/hooks/useSettingsDialog.ts new file mode 100644 index 00000000000..6691f971e6c --- /dev/null +++ b/apps/wallet-dashboard/components/Dialogs/settings/hooks/useSettingsDialog.ts @@ -0,0 +1,27 @@ +// Copyright (c) 2024 IOTA Stiftung +// SPDX-License-Identifier: Apache-2.0 + +import { useState } from 'react'; +import { SettingsDialogView } from '../enums'; + +export function useSettingsDialog() { + const [settingsDialogView, setSettingsDialogView] = useState<SettingsDialogView | undefined>(); + + const isSettingsDialogOpen = settingsDialogView !== undefined; + + function onCloseSettingsDialogClick() { + setSettingsDialogView(undefined); + } + + function onOpenSettingsDialogClick() { + setSettingsDialogView(SettingsDialogView.SelectSetting); + } + + return { + isSettingsDialogOpen, + settingsDialogView, + setSettingsDialogView, + onCloseSettingsDialogClick, + onOpenSettingsDialogClick, + }; +} diff --git a/apps/wallet-dashboard/components/Dialogs/settings/index.ts b/apps/wallet-dashboard/components/Dialogs/settings/index.ts new file mode 100644 index 00000000000..00a59c7b679 --- /dev/null +++ b/apps/wallet-dashboard/components/Dialogs/settings/index.ts @@ -0,0 +1,7 @@ +// Copyright (c) 2024 IOTA Stiftung +// SPDX-License-Identifier: Apache-2.0 + +export * from './enums'; +export * from './SettingsDialog'; +export * from './hooks'; +export * from './views'; diff --git a/apps/wallet-dashboard/components/Dialogs/settings/views/NetworkSelectorView.tsx b/apps/wallet-dashboard/components/Dialogs/settings/views/NetworkSelectorView.tsx new file mode 100644 index 00000000000..cc9b573a9a9 --- /dev/null +++ b/apps/wallet-dashboard/components/Dialogs/settings/views/NetworkSelectorView.tsx @@ -0,0 +1,53 @@ +// Copyright (c) 2024 IOTA Stiftung +// SPDX-License-Identifier: Apache-2.0 + +import React from 'react'; +import { Header, RadioButton } from '@iota/apps-ui-kit'; +import { DialogLayout, DialogLayoutBody } from '../../layout'; +import { NetworkConfiguration } from '@iota/iota-sdk/client'; +import { useIotaClientContext } from '@iota/dapp-kit'; +import toast from 'react-hot-toast'; + +interface NetworkSelectorViewProps { + handleClose: () => void; + onBack: () => void; +} + +export function NetworkSelectorView({ + handleClose, + onBack, +}: NetworkSelectorViewProps): JSX.Element { + const clientContext = useIotaClientContext(); + const activeNetwork = clientContext.network; + + async function handleNetworkChange(network: NetworkConfiguration) { + if (activeNetwork === network.id) { + return; + } + clientContext.selectNetwork(network.id); + toast.success(`Switched to ${network.name}`); + } + return ( + <DialogLayout> + <Header title="Network" onClose={handleClose} onBack={onBack} titleCentered /> + <DialogLayoutBody> + <div className="flex w-full flex-col gap-md"> + {Object.keys(clientContext.networks).map((network) => { + const networkConfig = clientContext.networks[ + network + ] as NetworkConfiguration; + return ( + <div className="px-md" key={networkConfig.id}> + <RadioButton + label={networkConfig.name} + isChecked={activeNetwork === networkConfig.id} + onChange={() => handleNetworkChange(networkConfig)} + /> + </div> + ); + })} + </div> + </DialogLayoutBody> + </DialogLayout> + ); +} diff --git a/apps/wallet-dashboard/components/Dialogs/settings/views/SettingsListView.tsx b/apps/wallet-dashboard/components/Dialogs/settings/views/SettingsListView.tsx new file mode 100644 index 00000000000..d5d619b3186 --- /dev/null +++ b/apps/wallet-dashboard/components/Dialogs/settings/views/SettingsListView.tsx @@ -0,0 +1,60 @@ +// Copyright (c) 2024 IOTA Stiftung +// SPDX-License-Identifier: Apache-2.0 + +import React from 'react'; +import { + Card, + CardAction, + CardActionType, + CardBody, + CardImage, + CardType, + Header, + ImageType, +} from '@iota/apps-ui-kit'; +import { DialogLayout, DialogLayoutBody } from '../../layout'; +import { SettingsDialogView } from '../enums'; +import { getNetwork } from '@iota/iota-sdk/client'; +import { useIotaClientContext } from '@iota/dapp-kit'; +import { Globe } from '@iota/ui-icons'; + +interface SettingsListViewProps { + handleClose: () => void; + setView: (view: SettingsDialogView) => void; +} + +export function SettingsListView({ handleClose, setView }: SettingsListViewProps): JSX.Element { + const { network } = useIotaClientContext(); + const { name: networkName } = getNetwork(network); + function onSelectSettingClick(view: SettingsDialogView): void { + setView(view); + } + const MENU_ITEMS = [ + { + title: 'Network', + subtitle: networkName, + icon: <Globe />, + onClick: () => onSelectSettingClick(SettingsDialogView.NetworkSettings), + }, + ]; + return ( + <DialogLayout> + <Header title="Settings" onClose={handleClose} onBack={handleClose} titleCentered /> + <DialogLayoutBody> + <div className="flex w-full flex-col gap-md"> + {MENU_ITEMS.map((item, index) => ( + <Card key={index} type={CardType.Default} onClick={item.onClick}> + <CardImage type={ImageType.BgSolid}> + <div className="flex h-10 w-10 items-center justify-center rounded-full text-neutral-10 dark:text-neutral-92 [&_svg]:h-5 [&_svg]:w-5"> + <span className="text-2xl">{item.icon}</span> + </div> + </CardImage> + <CardBody title={item.title} subtitle={item.subtitle} /> + <CardAction type={CardActionType.Link} /> + </Card> + ))} + </div> + </DialogLayoutBody> + </DialogLayout> + ); +} diff --git a/apps/wallet-dashboard/components/Dialogs/settings/views/index.ts b/apps/wallet-dashboard/components/Dialogs/settings/views/index.ts new file mode 100644 index 00000000000..738311af3ac --- /dev/null +++ b/apps/wallet-dashboard/components/Dialogs/settings/views/index.ts @@ -0,0 +1,5 @@ +// Copyright (c) 2024 IOTA Stiftung +// SPDX-License-Identifier: Apache-2.0 + +export * from './SettingsListView'; +export * from './NetworkSelectorView'; diff --git a/apps/wallet-dashboard/providers/AppProviders.tsx b/apps/wallet-dashboard/providers/AppProviders.tsx index 68283c410ab..46d69758c94 100644 --- a/apps/wallet-dashboard/providers/AppProviders.tsx +++ b/apps/wallet-dashboard/providers/AppProviders.tsx @@ -19,11 +19,17 @@ export function AppProviders({ children }: React.PropsWithChildren) { const [queryClient] = useState(() => new QueryClient()); const allNetworks = getAllNetworks(); const defaultNetwork = getDefaultNetwork(); - + function handleNetworkChange() { + queryClient.resetQueries(); + } return ( <GrowthBookProvider growthbook={growthbook}> <QueryClientProvider client={queryClient}> - <IotaClientProvider networks={allNetworks} defaultNetwork={defaultNetwork}> + <IotaClientProvider + networks={allNetworks} + defaultNetwork={defaultNetwork} + onNetworkChange={handleNetworkChange} + > <KioskClientProvider> <WalletProvider autoConnect={true} From 22394e9854b2eea20ef99f452c3478fa9933fc97 Mon Sep 17 00:00:00 2001 From: evavirseda <evirseda@boxfish.studio> Date: Wed, 18 Dec 2024 11:40:13 +0100 Subject: [PATCH 77/97] feat(wallet): improve dapp account selection in darkmode (#4531) * feat: improve darkmode * fix missing darkmode style --- apps/wallet/src/ui/app/components/accounts/AccountIcon.tsx | 4 ++-- apps/wallet/src/ui/app/pages/accounts/WelcomePage.tsx | 6 +++++- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/apps/wallet/src/ui/app/components/accounts/AccountIcon.tsx b/apps/wallet/src/ui/app/components/accounts/AccountIcon.tsx index ffcc77d28dc..5ae5de338f1 100644 --- a/apps/wallet/src/ui/app/components/accounts/AccountIcon.tsx +++ b/apps/wallet/src/ui/app/components/accounts/AccountIcon.tsx @@ -11,7 +11,7 @@ interface AccountIconProps { export function AccountIcon({ account }: AccountIconProps) { if (account.type === AccountType.LedgerDerived) { - return <Ledger className="h-5 w-5" />; + return <Ledger className="h-5 w-5 text-neutral-10 dark:text-neutral-92" />; } - return <IotaLogoMark className="h-5 w-5" />; + return <IotaLogoMark className="h-5 w-5 text-neutral-10 dark:text-neutral-92" />; } diff --git a/apps/wallet/src/ui/app/pages/accounts/WelcomePage.tsx b/apps/wallet/src/ui/app/pages/accounts/WelcomePage.tsx index a9ac8919e66..c9f6d36ddd7 100644 --- a/apps/wallet/src/ui/app/pages/accounts/WelcomePage.tsx +++ b/apps/wallet/src/ui/app/pages/accounts/WelcomePage.tsx @@ -23,7 +23,11 @@ export function WelcomePage() { return ( <Loading loading={isInitializedLoading || isFullscreenGuardLoading}> <div className="flex h-full w-full flex-col items-center justify-between bg-neutral-100 px-md py-2xl shadow-wallet-content dark:bg-neutral-6"> - <IotaLogoWeb width={130} height={32} /> + <IotaLogoWeb + width={130} + height={32} + className="text-neutral-10 dark:text-neutral-92" + /> <div className="flex flex-col items-center gap-8 text-center"> <div className="flex flex-col items-center gap-4"> <span className="text-headline-sm text-neutral-40">Welcome to</span> From 7829d84e27eee69c172ef16123e13f7855545c09 Mon Sep 17 00:00:00 2001 From: cpl121 <100352899+cpl121@users.noreply.github.com> Date: Wed, 18 Dec 2024 11:51:19 +0100 Subject: [PATCH 78/97] fix(wallet-dashboard): stardust timelocked/unmigratabale item grouping (#4527) * fix(dashboard): stardust item grouping * fix(dashboard): format --------- Co-authored-by: Bran <52735957+brancoder@users.noreply.github.com> --- .../app/(protected)/migrations/page.tsx | 20 ++++++------ .../migration/MigrationObjectsPanel.tsx | 6 ++-- .../hooks/useGetStardustMigratableObjects.ts | 12 +++---- .../lib/constants/migration.constants.ts | 7 ++--- .../groupStardustObjectsByMigrationStatus.ts | 31 +++++++++---------- 5 files changed, 37 insertions(+), 39 deletions(-) diff --git a/apps/wallet-dashboard/app/(protected)/migrations/page.tsx b/apps/wallet-dashboard/app/(protected)/migrations/page.tsx index e933cca2553..b042465c49e 100644 --- a/apps/wallet-dashboard/app/(protected)/migrations/page.tsx +++ b/apps/wallet-dashboard/app/(protected)/migrations/page.tsx @@ -7,7 +7,7 @@ import { useState, useMemo, useCallback } from 'react'; import { useQueryClient } from '@tanstack/react-query'; import clsx from 'clsx'; import { useGetStardustMigratableObjects } from '@/hooks'; -import { summarizeMigratableObjectValues, summarizeUnmigratableObjectValues } from '@/lib/utils'; +import { summarizeMigratableObjectValues, summarizeTimelockedObjectValues } from '@/lib/utils'; import { Button, ButtonSize, @@ -41,8 +41,8 @@ function MigrationDashboardPage(): JSX.Element { const { migratableBasicOutputs, migratableNftOutputs, - unmigratableBasicOutputs, - unmigratableNftOutputs, + timelockedBasicOutputs, + timelockedNftOutputs, } = stardustMigrationObjects || {}; const { @@ -54,9 +54,9 @@ function MigrationDashboardPage(): JSX.Element { nftOutputs: migratableNftOutputs, address, }); - const { totalUnmigratableObjects } = summarizeUnmigratableObjectValues({ - basicOutputs: unmigratableBasicOutputs, - nftOutputs: unmigratableNftOutputs, + const { totalTimelockedObjects } = summarizeTimelockedObjectValues({ + basicOutputs: timelockedBasicOutputs, + nftOutputs: timelockedNftOutputs, }); const hasMigratableObjects = @@ -106,7 +106,7 @@ function MigrationDashboardPage(): JSX.Element { const TIMELOCKED_ASSETS_CARDS: MigrationDisplayCardProps[] = [ { - title: `${totalUnmigratableObjects}`, + title: `${totalTimelockedObjects}`, subtitle: 'Time-locked', icon: Clock, }, @@ -123,8 +123,8 @@ function MigrationDashboardPage(): JSX.Element { selectedStardustObjectsCategory === StardustOutputMigrationStatus.TimeLocked ) { return [ - ...stardustMigrationObjects.unmigratableBasicOutputs, - ...stardustMigrationObjects.unmigratableNftOutputs, + ...stardustMigrationObjects.timelockedBasicOutputs, + ...stardustMigrationObjects.timelockedNftOutputs, ]; } } @@ -216,7 +216,7 @@ function MigrationDashboardPage(): JSX.Element { disabled={ selectedStardustObjectsCategory === StardustOutputMigrationStatus.TimeLocked || - !totalUnmigratableObjects + !totalTimelockedObjects } onClick={() => setSelectedStardustObjectsCategory( diff --git a/apps/wallet-dashboard/components/migration/MigrationObjectsPanel.tsx b/apps/wallet-dashboard/components/migration/MigrationObjectsPanel.tsx index 4d5d80d0af3..915cc56dda5 100644 --- a/apps/wallet-dashboard/components/migration/MigrationObjectsPanel.tsx +++ b/apps/wallet-dashboard/components/migration/MigrationObjectsPanel.tsx @@ -6,7 +6,7 @@ import { useGroupedMigrationObjectsByExpirationDate } from '@/hooks'; import { STARDUST_MIGRATABLE_OBJECTS_FILTER_LIST, - STARDUST_UNMIGRATABLE_OBJECTS_FILTER_LIST, + STARDUST_TIMELOCKED_OBJECTS_FILTER_LIST, } from '@/lib/constants'; import { StardustOutputDetailsFilter } from '@/lib/enums'; import { @@ -33,7 +33,7 @@ import { filterMigrationObjects } from '@/lib/utils'; const FILTERS = { migratable: STARDUST_MIGRATABLE_OBJECTS_FILTER_LIST, - unmigratable: STARDUST_UNMIGRATABLE_OBJECTS_FILTER_LIST, + timelocked: STARDUST_TIMELOCKED_OBJECTS_FILTER_LIST, }; interface MigrationObjectsPanelProps { @@ -58,7 +58,7 @@ export function MigrationObjectsPanel({ const filteredObjects = filterMigrationObjects(resolvedObjects, stardustOutputDetailsFilter); - const filters = isTimelocked ? FILTERS.unmigratable : FILTERS.migratable; + const filters = isTimelocked ? FILTERS.timelocked : FILTERS.migratable; const isHidden = selectedObjects.length === 0; return ( diff --git a/apps/wallet-dashboard/hooks/useGetStardustMigratableObjects.ts b/apps/wallet-dashboard/hooks/useGetStardustMigratableObjects.ts index 8480e9d9e2a..e17bb3d6b3b 100644 --- a/apps/wallet-dashboard/hooks/useGetStardustMigratableObjects.ts +++ b/apps/wallet-dashboard/hooks/useGetStardustMigratableObjects.ts @@ -31,17 +31,17 @@ export function useGetStardustMigratableObjects(address: string) { queryFn: () => { const epochMs = Number(currentEpochMs) || 0; - const { migratable: migratableBasicOutputs, unmigratable: unmigratableBasicOutputs } = + const { migratable: migratableBasicOutputs, timelocked: timelockedBasicOutputs } = groupStardustObjectsByMigrationStatus(basicOutputObjects ?? [], epochMs, address); - const { migratable: migratableNftOutputs, unmigratable: unmigratableNftOutputs } = + const { migratable: migratableNftOutputs, timelocked: timelockedNftOutputs } = groupStardustObjectsByMigrationStatus(nftOutputObjects ?? [], epochMs, address); return { migratableBasicOutputs, - unmigratableBasicOutputs, + timelockedBasicOutputs, migratableNftOutputs, - unmigratableNftOutputs, + timelockedNftOutputs, }; }, enabled: @@ -52,9 +52,9 @@ export function useGetStardustMigratableObjects(address: string) { staleTime: TimeUnit.ONE_SECOND * TimeUnit.ONE_MINUTE * 5, placeholderData: { migratableBasicOutputs: [], - unmigratableBasicOutputs: [], + timelockedBasicOutputs: [], migratableNftOutputs: [], - unmigratableNftOutputs: [], + timelockedNftOutputs: [], }, }); } diff --git a/apps/wallet-dashboard/lib/constants/migration.constants.ts b/apps/wallet-dashboard/lib/constants/migration.constants.ts index 5aa2c5a5c0f..1a203fc50e9 100644 --- a/apps/wallet-dashboard/lib/constants/migration.constants.ts +++ b/apps/wallet-dashboard/lib/constants/migration.constants.ts @@ -7,9 +7,8 @@ export const STARDUST_MIGRATABLE_OBJECTS_FILTER_LIST: StardustOutputDetailsFilte StardustOutputDetailsFilter, ); -export const STARDUST_UNMIGRATABLE_OBJECTS_FILTER_LIST: StardustOutputDetailsFilter[] = - Object.values(StardustOutputDetailsFilter).filter( - (element) => element !== StardustOutputDetailsFilter.WithExpiration, - ); +export const STARDUST_TIMELOCKED_OBJECTS_FILTER_LIST: StardustOutputDetailsFilter[] = Object.values( + StardustOutputDetailsFilter, +).filter((element) => element !== StardustOutputDetailsFilter.WithExpiration); export const MIGRATION_OBJECT_WITHOUT_UC_KEY = 'no-unlock-condition-timestamp'; diff --git a/apps/wallet-dashboard/lib/utils/migration/groupStardustObjectsByMigrationStatus.ts b/apps/wallet-dashboard/lib/utils/migration/groupStardustObjectsByMigrationStatus.ts index b036aacf55c..b10f1cf4218 100644 --- a/apps/wallet-dashboard/lib/utils/migration/groupStardustObjectsByMigrationStatus.ts +++ b/apps/wallet-dashboard/lib/utils/migration/groupStardustObjectsByMigrationStatus.ts @@ -6,7 +6,7 @@ import { IotaObjectData } from '@iota/iota-sdk/client'; export type StardustMigrationGroupedObjects = { migratable: IotaObjectData[]; - unmigratable: IotaObjectData[]; + timelocked: IotaObjectData[]; }; export function groupStardustObjectsByMigrationStatus( @@ -15,13 +15,21 @@ export function groupStardustObjectsByMigrationStatus( address: string, ): StardustMigrationGroupedObjects { const migratable: IotaObjectData[] = []; - const unmigratable: IotaObjectData[] = []; + const timelocked: IotaObjectData[] = []; const epochUnix = epochTimestampMs / MILLISECONDS_PER_SECOND; for (const outputObject of stardustOutputObjects) { const outputObjectFields = extractMigrationOutputFields(outputObject); + if ( + outputObjectFields.timelock_uc && + outputObjectFields.timelock_uc.fields.unix_time > epochUnix + ) { + timelocked.push(outputObject); + continue; + } + if (outputObjectFields.expiration_uc) { const unlockableAddress = outputObjectFields.expiration_uc.fields.unix_time <= epochUnix @@ -29,23 +37,14 @@ export function groupStardustObjectsByMigrationStatus( : outputObjectFields.expiration_uc.fields.owner; if (unlockableAddress !== address) { - unmigratable.push(outputObject); continue; } } - if ( - outputObjectFields.timelock_uc && - outputObjectFields.timelock_uc.fields.unix_time > epochUnix - ) { - unmigratable.push(outputObject); - continue; - } - migratable.push(outputObject); } - return { migratable, unmigratable }; + return { migratable, timelocked }; } interface MigratableObjectsData { @@ -93,10 +92,10 @@ export function summarizeMigratableObjectValues({ } interface UnmmigratableObjectsData { - totalUnmigratableObjects: number; + totalTimelockedObjects: number; } -export function summarizeUnmigratableObjectValues({ +export function summarizeTimelockedObjectValues({ basicOutputs = [], nftOutputs = [], }: Omit<SummarizeMigrationObjectParams, 'address'>): UnmmigratableObjectsData { @@ -110,9 +109,9 @@ export function summarizeUnmigratableObjectValues({ nativeTokens += parseInt(outputObjectFields.native_tokens.fields.size); } - const totalUnmigratableObjects = basicObjects + nativeTokens + nftObjects; + const totalTimelockedObjects = basicObjects + nativeTokens + nftObjects; - return { totalUnmigratableObjects }; + return { totalTimelockedObjects }; } export function extractOwnedStorageDepositReturnAmount( From 70ac44cda80abf610bf3196c4f5cee282c6f75c4 Mon Sep 17 00:00:00 2001 From: Marc Espin <mespinsanz@gmail.com> Date: Wed, 18 Dec 2024 12:08:22 +0100 Subject: [PATCH 79/97] fix(pnpm): Fix npm medium alerts (#4478) * fix(pnpm): Fix npm medium alerts * merge develop * resolve conflicts * fixes * fix dev dependency audit --- apps/ui-kit/package.json | 2 +- apps/wallet/package.json | 5 +- package.json | 9 +- pnpm-lock.yaml | 1628 ++++++++++++++++---------------------- 4 files changed, 689 insertions(+), 955 deletions(-) diff --git a/apps/ui-kit/package.json b/apps/ui-kit/package.json index ff323347fea..89e9785c466 100644 --- a/apps/ui-kit/package.json +++ b/apps/ui-kit/package.json @@ -66,7 +66,7 @@ "tailwindcss": "^3.3.3", "typescript": "^5.5.3", "vite": "^5.3.3", - "vite-plugin-dts": "^3.9.1", + "vite-plugin-dts": "^4.3.0", "vite-tsconfig-paths": "^4.2.0" } } diff --git a/apps/wallet/package.json b/apps/wallet/package.json index a240f6170bb..c7df5bf5895 100644 --- a/apps/wallet/package.json +++ b/apps/wallet/package.json @@ -81,7 +81,7 @@ "vite": "^5.3.3", "vite-tsconfig-paths": "^4.2.0", "vitest": "^2.0.1", - "web-ext": "^7.6.2", + "web-ext": "^8.3.0", "webpack": "^5.79.0", "webpack-cli": "^5.0.1", "webpack-merge": "^5.8.0" @@ -117,7 +117,7 @@ "@reduxjs/toolkit": "^1.9.5", "@scure/bip32": "^1.4.0", "@scure/bip39": "^1.3.0", - "@sentry/browser": "^7.61.0", + "@sentry/browser": "^7.120.2", "@tanstack/react-query": "^5.50.1", "@tanstack/react-query-persist-client": "^5.40.1", "axios": "^1.7.4", @@ -132,7 +132,6 @@ "formik": "^2.4.2", "framer-motion": "^10.12.22", "idb-keyval": "^6.2.1", - "jose": "^5.2.3", "mitt": "^3.0.1", "poseidon-lite": "^0.2.0", "react": "^18.3.1", diff --git a/package.json b/package.json index 76d65042397..9ceeb891cd9 100644 --- a/package.json +++ b/package.json @@ -37,7 +37,7 @@ "semver@<7.5.2": ">=7.5.2", "postcss@<8.4.31": ">=8.4.31", "braces": ">=3.0.3", - "path-to-regexp@0.1.7": "0.1.10", + "path-to-regexp@<0.1.12": "0.1.12", "path-to-regexp@2.2.1": "3.3.0", "path-to-regexp@3.2.0": "3.3.0", "body-parser": ">=1.20.3", @@ -46,7 +46,12 @@ "mermaid@10.9.1": "10.9.3", "http-proxy-middleware": "2.0.7", "cross-spawn": "7.0.5", - "ws": "8.18.0" + "axios@<0.28.0": "0.28.0", + "tough-cookie@<4.1.3": "4.1.3", + "ws": "8.18.0", + "@sentry/browser": "7.120.2", + "nanoid@3.3.7": "3.3.8", + "nanoid@5.0.7": "5.0.9" } }, "engines": { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 005fb06d7d4..dc5cd8b2bf3 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -12,7 +12,7 @@ overrides: semver@<7.5.2: '>=7.5.2' postcss@<8.4.31: '>=8.4.31' braces: '>=3.0.3' - path-to-regexp@0.1.7: 0.1.10 + path-to-regexp@<0.1.12: 0.1.12 path-to-regexp@2.2.1: 3.3.0 path-to-regexp@3.2.0: 3.3.0 body-parser: '>=1.20.3' @@ -21,7 +21,12 @@ overrides: mermaid@10.9.1: 10.9.3 http-proxy-middleware: 2.0.7 cross-spawn: 7.0.5 + axios@<0.28.0: 0.28.0 + tough-cookie@<4.1.3: 4.1.3 ws: 8.18.0 + '@sentry/browser': 7.120.2 + nanoid@3.3.7: 3.3.8 + nanoid@5.0.7: 5.0.9 importers: @@ -654,8 +659,8 @@ importers: specifier: ^5.3.3 version: 5.4.8(@types/node@20.16.9)(sass@1.79.3)(terser@5.34.0) vite-plugin-dts: - specifier: ^3.9.1 - version: 3.9.1(@types/node@20.16.9)(rollup@4.22.4)(typescript@5.6.2)(vite@5.4.8(@types/node@20.16.9)(sass@1.79.3)(terser@5.34.0)) + specifier: ^4.3.0 + version: 4.3.0(@types/node@20.16.9)(rollup@4.22.4)(typescript@5.6.2)(vite@5.4.8(@types/node@20.16.9)(sass@1.79.3)(terser@5.34.0)) vite-tsconfig-paths: specifier: ^4.2.0 version: 4.3.2(typescript@5.6.2)(vite@5.4.8(@types/node@20.16.9)(sass@1.79.3)(terser@5.34.0)) @@ -753,8 +758,8 @@ importers: specifier: ^1.3.0 version: 1.4.0 '@sentry/browser': - specifier: ^7.61.0 - version: 7.119.0 + specifier: 7.120.2 + version: 7.120.2 '@tanstack/react-query': specifier: ^5.50.1 version: 5.56.2(react@18.3.1) @@ -797,9 +802,6 @@ importers: idb-keyval: specifier: ^6.2.1 version: 6.2.1 - jose: - specifier: ^5.2.3 - version: 5.9.3 mitt: specifier: ^3.0.1 version: 3.0.1 @@ -991,8 +993,8 @@ importers: specifier: ^2.0.1 version: 2.1.1(@types/node@20.16.9)(@vitest/ui@0.33.0)(happy-dom@15.11.7)(jsdom@24.1.3)(msw@2.4.9(typescript@5.6.2))(sass@1.79.3)(terser@5.34.0) web-ext: - specifier: ^7.6.2 - version: 7.12.0(body-parser@1.20.3) + specifier: ^8.3.0 + version: 8.3.0(body-parser@1.20.3) webpack: specifier: ^5.79.0 version: 5.95.0(@swc/core@1.7.28)(webpack-cli@5.1.4) @@ -1323,25 +1325,25 @@ importers: version: 3.6.1(@algolia/client-search@4.24.0)(@types/react@18.3.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@docusaurus/core': specifier: 3.5.2 - version: 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) + version: 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2) '@docusaurus/preset-classic': specifier: 3.5.2 - version: 3.5.2(@algolia/client-search@4.24.0)(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@types/react@18.3.9)(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) + version: 3.5.2(@algolia/client-search@4.24.0)(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@types/react@18.3.9)(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2) '@docusaurus/remark-plugin-npm2yarn': specifier: ^3.5.2 version: 3.5.2 '@docusaurus/theme-common': specifier: ^3.5.2 - version: 3.5.2(@docusaurus/plugin-content-docs@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16))(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2) + version: 3.5.2(@docusaurus/plugin-content-docs@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2))(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2) '@docusaurus/theme-live-codeblock': specifier: ^3.5.2 - version: 3.5.2(@docusaurus/plugin-content-docs@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16))(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) + version: 3.5.2(@docusaurus/plugin-content-docs@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2))(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2) '@docusaurus/theme-mermaid': specifier: ^3.5.2 - version: 3.5.2(@docusaurus/plugin-content-docs@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) + version: 3.5.2(@docusaurus/plugin-content-docs@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2) '@docusaurus/theme-search-algolia': specifier: ^3.5.2 - version: 3.5.2(@algolia/client-search@4.24.0)(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@types/react@18.3.9)(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) + version: 3.5.2(@algolia/client-search@4.24.0)(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@types/react@18.3.9)(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2) '@emotion/react': specifier: ^11.11.4 version: 11.13.3(@types/react@18.3.9)(react@18.3.1) @@ -2788,10 +2790,6 @@ packages: resolution: {integrity: sha512-Gz0Nrobx8szge6kQQ5Z5MX9L3ObqNwCQY1PSwSNzreFL7aHGxv8Fp2j3ETV6/wWdbiV+mW6OSm8oQhg3Tcsniw==} engines: {node: '>=6.9.0'} - '@babel/runtime@7.21.0': - resolution: {integrity: sha512-xwII0//EObnq89Ji5AKYQaRYiW/nZ3llSv29d49IuxPhKbtJoLP+9QUUZ4nVragQVtaVGeZrpB+ZtG/Pdy/POw==} - engines: {node: '>=6.9.0'} - '@babel/runtime@7.25.6': resolution: {integrity: sha512-VBj9MYyDb9tuLq7yzqjgzt6Q+IBQLrGZfdjOekyEirZPHxXWoTSGUTMrpsfi58Up73d13NfYLv8HT9vmznjzhQ==} engines: {node: '>=6.9.0'} @@ -3147,8 +3145,8 @@ packages: resolution: {integrity: sha512-ZzZY/b66W2Jd6NHbAhLyDWOEIBWC11VizGFk7Wx7M61JZRz7HR9Cq5P+65RKWUU7u6wgsE8Lmh9nE4Mz+U2eTg==} engines: {node: '>= 0.10.4'} - '@devicefarmer/adbkit@3.2.3': - resolution: {integrity: sha512-wK9rVrabs4QU0oK8Jnwi+HRBEm+s1x/o63kgthUe0y7K1bfcYmgLuQf41/adsj/5enddlSxzkJavl2EwOu+r1g==} + '@devicefarmer/adbkit@3.2.6': + resolution: {integrity: sha512-8lO1hSeTgtxcOHhp4tTWq/JaOysp5KNbbyFoxNEBnwkCDZu/Bji3ZfOaG++Riv9jN6c9bgdLBOZqJTC5VJPRKQ==} engines: {node: '>= 0.10.4'} hasBin: true @@ -4443,8 +4441,8 @@ packages: resolution: {integrity: sha512-3lBouSuF7CqlseLB+FKES0K4FQ02JrbEoRtJhxnsyB1s5v4AP03gsoohN8jp7DcOImhaR9scYdztq3/sLfk/qQ==} engines: {node: '>=14.18.0'} - '@mdn/browser-compat-data@5.5.29': - resolution: {integrity: sha512-NHdG3QOiAsxh8ygBSKMa/WaNJwpNt87uVqW+S2RlnSqgeRdk+L3foNWTX6qd0I3NHSlCFb47rgopeNCJtRDY5A==} + '@mdn/browser-compat-data@5.6.0': + resolution: {integrity: sha512-xArvLyzuk0r2m6hFVjTMYoLvhWwys3h7W8pO15tjSAea+U39cErWDNfoUs4g2C08HVg6bDHyDMBc0LC6FKRpVw==} '@mdx-js/mdx@3.0.1': resolution: {integrity: sha512-eIQ4QTrOWyL3LWEe/bu6Taqzq2HQvHcyTMaOrI95P2/LmJE7AsfPfgJGuFLPVqBUE1BC1rik3VIhU+s9u72arA==} @@ -4479,19 +4477,25 @@ packages: resolution: {integrity: sha512-ihb3B0T/wJm1eUuArYP4lCTSEoZsClHhuWyfo/kMX3m/odpqNcPfsz5O2A3NT7dXCAgWPGDQGPqygCpgeniKMw==} engines: {node: '>=12.0.0'} - '@microsoft/api-extractor-model@7.28.13': - resolution: {integrity: sha512-39v/JyldX4MS9uzHcdfmjjfS6cYGAoXV+io8B5a338pkHiSt+gy2eXQ0Q7cGFJ7quSa1VqqlMdlPrB6sLR/cAw==} + '@microsoft/api-extractor-model@7.30.1': + resolution: {integrity: sha512-CTS2PlASJHxVY8hqHORVb1HdECWOEMcMnM6/kDkPr0RZapAFSIHhg9D4jxuE8g+OWYHtPc10LCpmde5pylTRlA==} - '@microsoft/api-extractor@7.43.0': - resolution: {integrity: sha512-GFhTcJpB+MI6FhvXEI9b2K0snulNLWHqC/BbcJtyNYcKUiw7l3Lgis5ApsYncJ0leALX7/of4XfmXk+maT111w==} + '@microsoft/api-extractor@7.48.1': + resolution: {integrity: sha512-HN9Osa1WxqLM66RaqB5nPAadx+nTIQmY/XtkFdaJvusjG8Tus++QqZtD7KPZDSkhEMGHsYeSyeU8qUzCDUXPjg==} hasBin: true '@microsoft/tsdoc-config@0.16.2': resolution: {integrity: sha512-OGiIzzoBLgWWR0UdRJX98oYO+XKGf7tiK4Zk6tQ/E4IJqGCe7dvkTvgDZV5cFJUzLGDOjeAXrnZoA6QkVySuxw==} + '@microsoft/tsdoc-config@0.17.1': + resolution: {integrity: sha512-UtjIFe0C6oYgTnad4q1QP4qXwLhe6tIpNTRStJ2RZEPIkqQPREAwE5spzVxsdn9UaEMUqhh0AqSx3X4nWAKXWw==} + '@microsoft/tsdoc@0.14.2': resolution: {integrity: sha512-9b8mPpKrfeGRuhFH5iO1iwCLeIIsV6+H1sRfxbkoGXIyQE2BTsPd9zqSqQJ+pv5sJ/hT5M1zvOFL02MnEezFug==} + '@microsoft/tsdoc@0.15.1': + resolution: {integrity: sha512-4aErSrCR/On/e5G2hDP0wjooqDdauzEbIq8hIkIe5pXV0rtWJZvdCEKL0ykZxex+IxIwBp0eGeV48hQN07dXtw==} + '@mswjs/interceptors@0.35.8': resolution: {integrity: sha512-PFfqpHplKa7KMdoQdj5td03uG05VK2Ng1dG0sP4pT9h0dGSX2v9txYt/AnrzPb/vAmfyBBC0NQV7VaBEX+efgQ==} engines: {node: '>=18'} @@ -5839,27 +5843,27 @@ packages: '@rushstack/eslint-patch@1.10.4': resolution: {integrity: sha512-WJgX9nzTqknM393q1QJDJmoW28kUfEnybeTfVNcNAPnIx210RXm2DiXiHzfNPJNIUUb1tJnz/l4QGtJ30PgWmA==} - '@rushstack/node-core-library@4.0.2': - resolution: {integrity: sha512-hyES82QVpkfQMeBMteQUnrhASL/KHPhd7iJ8euduwNJG4mu2GSOKybf0rOEjOm1Wz7CwJEUm9y0yD7jg2C1bfg==} + '@rushstack/node-core-library@5.10.1': + resolution: {integrity: sha512-BSb/KcyBHmUQwINrgtzo6jiH0HlGFmrUy33vO6unmceuVKTEyL2q+P0fQq2oB5hvXVWOEUhxB2QvlkZluvUEmg==} peerDependencies: '@types/node': '*' peerDependenciesMeta: '@types/node': optional: true - '@rushstack/rig-package@0.5.2': - resolution: {integrity: sha512-mUDecIJeH3yYGZs2a48k+pbhM6JYwWlgjs2Ca5f2n1G2/kgdgP9D/07oglEGf6mRyXEnazhEENeYTSNDRCwdqA==} + '@rushstack/rig-package@0.5.3': + resolution: {integrity: sha512-olzSSjYrvCNxUFZowevC3uz8gvKr3WTpHQ7BkpjtRpA3wK+T0ybep/SRUMfr195gBzJm5gaXw0ZMgjIyHqJUow==} - '@rushstack/terminal@0.10.0': - resolution: {integrity: sha512-UbELbXnUdc7EKwfH2sb8ChqNgapUOdqcCIdQP4NGxBpTZV2sQyeekuK3zmfQSa/MN+/7b4kBogl2wq0vpkpYGw==} + '@rushstack/terminal@0.14.4': + resolution: {integrity: sha512-NxACqERW0PHq8Rpq1V6v5iTHEwkRGxenjEW+VWqRYQ8T9puUzgmGHmEZUaUEDHAe9Qyvp0/Ew04sAiQw9XjhJg==} peerDependencies: '@types/node': '*' peerDependenciesMeta: '@types/node': optional: true - '@rushstack/ts-command-line@4.19.1': - resolution: {integrity: sha512-J7H768dgcpG60d7skZ5uSSwyCZs/S2HrWP1Ds8d1qYAyaaeJmpmmLr9BVw97RjFzmQPOYnoXcKA4GkqDCkduQg==} + '@rushstack/ts-command-line@4.23.2': + resolution: {integrity: sha512-JJ7XZX5K3ThBBva38aomgsPv1L7FV6XmSOcR6HtM7HDFZJkepqT65imw26h9ggGqMjsY0R9jcl30tzKcVj9aOQ==} '@saucelabs/theme-github-codeblock@0.3.0': resolution: {integrity: sha512-+8xWxBfN+I8StJ0QXERMbGf+BHwRXHWV3mFl9uDayXERiZ/rR93d0nAS3s9s/rKjqh/YSm/4dThEkBNBLnGs4Q==} @@ -5879,20 +5883,20 @@ packages: '@scure/bip39@1.4.0': resolution: {integrity: sha512-BEEm6p8IueV/ZTfQLp/0vhw4NPnT9oWf5+28nvmeUICjP99f4vr2d+qc7AVGDDtwRep6ifR43Yed9ERVmiITzw==} - '@sentry-internal/feedback@7.119.0': - resolution: {integrity: sha512-om8TkAU5CQGO8nkmr7qsSBVkP+/vfeS4JgtW3sjoTK0fhj26+DljR6RlfCGWtYQdPSP6XV7atcPTjbSnsmG9FQ==} + '@sentry-internal/feedback@7.120.2': + resolution: {integrity: sha512-AAKW/Qii2qFA/jIZc9HK/CgQLfJ/9zBCqC9FF3bUTnAxzZAbJHO1TLnHqDl5k5wYtt449NrpObHORpopSk7TBg==} engines: {node: '>=12'} - '@sentry-internal/replay-canvas@7.119.0': - resolution: {integrity: sha512-NL02VQx6ekPxtVRcsdp1bp5Tb5w6vnfBKSIfMKuDRBy5A10Uc3GSoy/c3mPyHjOxB84452A+xZSx6bliEzAnuA==} + '@sentry-internal/replay-canvas@7.120.2': + resolution: {integrity: sha512-2Xm9rJxUA5/CCUYRHNH4VxG13eQpXvM05/cHQKn+pmjaPq/+3fbOHrZZM84gF1FSHjeN8Kg1igoMSekU2kavOQ==} engines: {node: '>=12'} - '@sentry-internal/tracing@7.119.0': - resolution: {integrity: sha512-oKdFJnn+56f0DHUADlL8o9l8jTib3VDLbWQBVkjD9EprxfaCwt2m8L5ACRBdQ8hmpxCEo4I8/6traZ7qAdBUqA==} + '@sentry-internal/tracing@7.120.2': + resolution: {integrity: sha512-eo2F8cP6X+vr54Mp6vu+NoQEDz0M5O24Tz8jPY0T1CpiWdwCmHb7Sln+oLXeQ3/LlWdVQihBfKDBZfBdUfsBTg==} engines: {node: '>=8'} - '@sentry/browser@7.119.0': - resolution: {integrity: sha512-WwmW1Y4D764kVGeKmdsNvQESZiAn9t8LmCWO0ucBksrjL2zw9gBPtOpRcO6l064sCLeSxxzCN+kIxhRm1gDFEA==} + '@sentry/browser@7.120.2': + resolution: {integrity: sha512-o5ll2Yv5MfnblbWxTvMlKK3RVXIbeJ+SPC+uw12b4j/pkrQg+/y7dyTLBXh6t0EgokSOsRUyYosQwSvxG/xs/Q==} engines: {node: '>=8'} '@sentry/cli@1.77.3': @@ -5908,12 +5912,16 @@ packages: resolution: {integrity: sha512-CS2kUv9rAJJEjiRat6wle3JATHypB0SyD7pt4cpX5y0dN5dZ1JrF57oLHRMnga9fxRivydHz7tMTuBhSSwhzjw==} engines: {node: '>=8'} + '@sentry/core@7.120.2': + resolution: {integrity: sha512-eurLBFQJC7WWWYoEna25Z9I/GJjqAmH339tv52XP8sqXV7B5hRcHDcfrsT/UGHpU316M24p3lWhj0eimtCZ0SQ==} + engines: {node: '>=8'} + '@sentry/hub@6.19.7': resolution: {integrity: sha512-y3OtbYFAqKHCWezF0EGGr5lcyI2KbaXW2Ik7Xp8Mu9TxbSTuwTe4rTntwg8ngPjUQU3SUHzgjqVB8qjiGqFXCA==} engines: {node: '>=6'} - '@sentry/integrations@7.119.0': - resolution: {integrity: sha512-OHShvtsRW0A+ZL/ZbMnMqDEtJddPasndjq+1aQXw40mN+zeP7At/V1yPZyFaURy86iX7Ucxw5BtmzuNy7hLyTA==} + '@sentry/integrations@7.120.2': + resolution: {integrity: sha512-bMvL2fD3TGLM5YAUoQ2Qz6bYeVU8f7YRFNSjKNxK4EbvFgAU9j1FD6EKg0V0RNOJYnJjGIZYMmcWTXBbVTJL6w==} engines: {node: '>=8'} '@sentry/minimal@6.19.7': @@ -5930,8 +5938,8 @@ packages: peerDependencies: react: 15.x || 16.x || 17.x || 18.x - '@sentry/replay@7.119.0': - resolution: {integrity: sha512-BnNsYL+X5I4WCH6wOpY6HQtp4MgVt0NVlhLUsEyrvMUiTs0bPkDBrulsgZQBUKJsbOr3l9nHrFoNVB/0i6WNLA==} + '@sentry/replay@7.120.2': + resolution: {integrity: sha512-UAw0anHwXeej0Rfx+7qZVbRb3rj3mQ0DuHqdpPTSd9WpfRGOvCfthMIKD7rfHX7GjMnPMgdmsaU8K3lpe60h+w==} engines: {node: '>=12'} '@sentry/types@6.19.7': @@ -5942,6 +5950,10 @@ packages: resolution: {integrity: sha512-27qQbutDBPKGbuJHROxhIWc1i0HJaGLA90tjMu11wt0E4UNxXRX+UQl4Twu68v4EV3CPvQcEpQfgsViYcXmq+w==} engines: {node: '>=8'} + '@sentry/types@7.120.2': + resolution: {integrity: sha512-FWVoiblHQJ892GaOqdXx/5/n5XDLF28z81vJ0lCY49PMh8waz8LJ0b9RSmt9tasSDl0OQ7eUlPl1xu1jTrv1NA==} + engines: {node: '>=8'} + '@sentry/utils@6.19.7': resolution: {integrity: sha512-z95ECmE3i9pbWoXQrD/7PgkBAzJYR+iXtPuTkpBjDKs86O3mT+PXOT3BAn79w2wkn7/i3vOGD2xVr1uiMl26dA==} engines: {node: '>=6'} @@ -5950,6 +5962,10 @@ packages: resolution: {integrity: sha512-ZwyXexWn2ZIe2bBoYnXJVPc2esCSbKpdc6+0WJa8eutXfHq3FRKg4ohkfCBpfxljQGEfP1+kfin945lA21Ka+A==} engines: {node: '>=8'} + '@sentry/utils@7.120.2': + resolution: {integrity: sha512-jgnQlw11mRfQrQRAXbq4zEd+tbYwHel5eqeS/oU6EImXRjmHNtS79nB8MHvJeQu1FMCpFs1Ymrrs5FICwS6VeQ==} + engines: {node: '>=8'} + '@sentry/webpack-plugin@1.21.0': resolution: {integrity: sha512-x0PYIMWcsTauqxgl7vWUY6sANl+XGKtx7DCVnnY7aOIIlIna0jChTAPANTfA2QrK+VK+4I/4JxatCEZBnXh3Og==} engines: {node: '>= 8'} @@ -7318,14 +7334,14 @@ packages: '@vitest/utils@2.1.1': resolution: {integrity: sha512-Y6Q9TsI+qJ2CC0ZKj6VBb+T8UPz593N113nnUykqwANqhgf3QkZeHFlusgKLTqrnVHbj/XDKZcDHol+dxVT+rQ==} - '@volar/language-core@1.11.1': - resolution: {integrity: sha512-dOcNn3i9GgZAcJt43wuaEykSluAuOkQgzni1cuxLxTV0nJKanQztp7FxyswdRILaKH+P2XZMPRp2S4MV/pElCw==} + '@volar/language-core@2.4.11': + resolution: {integrity: sha512-lN2C1+ByfW9/JRPpqScuZt/4OrUUse57GLI6TbLgTIqBVemdl1wNcZ1qYGEo2+Gw8coYLgCy7SuKqn6IrQcQgg==} - '@volar/source-map@1.11.1': - resolution: {integrity: sha512-hJnOnwZ4+WT5iupLRnuzbULZ42L7BWWPMmruzwtLhJfpDVoZLjNBxHDi2sY2bgZXCKlpU5XcsMFoYrsQmPhfZg==} + '@volar/source-map@2.4.11': + resolution: {integrity: sha512-ZQpmafIGvaZMn/8iuvCFGrW3smeqkq/IIh9F1SdSx9aUl0J4Iurzd6/FhmjNO5g2ejF3rT45dKskgXWiofqlZQ==} - '@volar/typescript@1.11.1': - resolution: {integrity: sha512-iU+t2mas/4lYierSnoFOeRFQUhAEMgsFuQxoxvwn5EdQopw43j+J27a4lt9LMInx1gLJBC6qL14WYGlgymaSMQ==} + '@volar/typescript@2.4.11': + resolution: {integrity: sha512-2DT+Tdh88Spp5PyPbqhyoYavYCPDsqbHLFwcUI9K1NlY1YgUJvujGdrqUp0zWxnW7KWNTr3xSpMuv2WnaTKDAw==} '@vue/compiler-core@3.5.9': resolution: {integrity: sha512-KE1sCdwqSKq0CQ/ltg3XnlMTKeinjegIkuFsuq9DKvNPmqLGdmI51ChZdGBBRXIvEYTLm8X/JxOuBQ1HqF/+PA==} @@ -7333,8 +7349,11 @@ packages: '@vue/compiler-dom@3.5.9': resolution: {integrity: sha512-gEAURwPo902AsJF50vl59VaWR+Cx6cX9SoqLYHu1jq9hDbmQlXvpZyYNIIbxa2JTJ+FD/oBQweVUwuTQv79KTg==} - '@vue/language-core@1.8.27': - resolution: {integrity: sha512-L8Kc27VdQserNaCUNiSFdDl9LWT24ly8Hpwf1ECy3aFb9m6bDhBGQYOujDm21N7EW3moKIOKEanQwe1q5BK+mA==} + '@vue/compiler-vue2@2.7.16': + resolution: {integrity: sha512-qYC3Psj9S/mfu9uVi5WvNZIzq+xnXMhOwbTFKKDD7b1lhpnn71jXSFdTQ+WsIEk0ONCd7VV2IMm7ONl6tbQ86A==} + + '@vue/language-core@2.1.6': + resolution: {integrity: sha512-MW569cSky9R/ooKMh6xa2g1D0AtRKbL56k83dzus/bx//RDJk24RHWkMzbAlXjMdDNyxAaagKPRquBIxkxlCkg==} peerDependencies: typescript: '*' peerDependenciesMeta: @@ -7533,19 +7552,24 @@ packages: engines: {node: '>=0.4.0'} hasBin: true - addons-linter@6.28.0: - resolution: {integrity: sha512-fCTjXL/yG4hwq74JG8tQdrvEu0OvGrEN9yU+Df0020RDtHl3g/tTCyMeC4G1uyk8IuyMzp4myCBNnOGC7MWSQQ==} - engines: {node: '>=16.0.0'} + acorn@8.14.0: + resolution: {integrity: sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==} + engines: {node: '>=0.4.0'} + hasBin: true + + addons-linter@7.1.0: + resolution: {integrity: sha512-UmkUB3dZSpf8bqhlulGDbpoxBwcfOk8JvaJTRvJ+AAXKHvTjqeNlFC+GRMqa0EjJJh/0yqpBaJzyaUIx+fjl+A==} + engines: {node: '>=18.0.0'} hasBin: true addons-moz-compare@1.3.0: resolution: {integrity: sha512-/rXpQeaY0nOKhNx00pmZXdk5Mu+KhVlL3/pSBuAYwrxRrNiTvI/9xfQI8Lmm7DMMl+PDhtfAHY/0ibTpdeoQQQ==} - addons-scanner-utils@9.10.1: - resolution: {integrity: sha512-Tz9OUQx9Ja0TyQ+H2GakB9KlJ50myI6ESBGRlA8N80nHBzMjjPRFGm0APADSaCd5NP74SrFtEvL4TRpDwZXETA==} + addons-scanner-utils@9.11.0: + resolution: {integrity: sha512-X95V8ymnue9EHmOLz3zJTGHvHDFlWKiavlH+kJKOlv2sJDWFvD3TWeJMHJgxS9GKOqT/545mOXvX3vuuGGum+g==} peerDependencies: body-parser: '>=1.20.3' - express: 4.18.3 + express: 4.19.2 node-fetch: 2.6.11 safe-compare: 1.1.4 peerDependenciesMeta: @@ -7582,9 +7606,20 @@ packages: resolution: {integrity: sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==} engines: {node: '>=8'} + ajv-draft-04@1.0.0: + resolution: {integrity: sha512-mv00Te6nmYbRp5DCwclxtt7yV/joXJPGS7nM+97GdxvuttCOfgI3K4U25zboyeX0O+myI8ERluxQe5wljMmVIw==} + peerDependencies: + ajv: ^8.5.0 + peerDependenciesMeta: + ajv: + optional: true + ajv-formats@2.1.1: resolution: {integrity: sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==} + ajv-formats@3.0.1: + resolution: {integrity: sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==} + ajv-keywords@3.5.2: resolution: {integrity: sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==} peerDependencies: @@ -7761,17 +7796,10 @@ packages: asap@2.0.6: resolution: {integrity: sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==} - asn1@0.2.6: - resolution: {integrity: sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==} - asn1js@3.0.5: resolution: {integrity: sha512-FVnvrKJwpt9LP2lAMl8qZswRNm3T4q9CON+bxldk2iwk3FFpuwhx2FfinyitizWHsVYyaY+y5JzDR0rCMV5yTQ==} engines: {node: '>=12.0.0'} - assert-plus@1.0.0: - resolution: {integrity: sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==} - engines: {node: '>=0.8'} - assert@2.1.0: resolution: {integrity: sha512-eLHpSK/Y4nhMJ07gDaAzoX/XAKS8PSaojml3M0DM4JpV1LAi5JOJ/p6H/XWrl8L+DzVEvVCW1z3vWAaB9oTsQw==} @@ -7808,6 +7836,9 @@ packages: resolution: {integrity: sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==} engines: {node: '>=8.0.0'} + atomically@2.0.3: + resolution: {integrity: sha512-kU6FmrwZ3Lx7/7y3hPS5QnbJfaohcIul5fGqf7ok+4KklIEk9tJ0C2IQPdacSbVUWv6zVHXEBWoWd6NrVMT7Cw==} + auto-bind@4.0.0: resolution: {integrity: sha512-Hdw8qdNiqdJ8LqT0iK0sVzkFbzg6fhnQqqfWhBDxcHZvU75+B+ayzTy8x+k5Ix0Y92XOhOUlx74ps+bA6BeYMQ==} engines: {node: '>=8'} @@ -7823,18 +7854,12 @@ packages: resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} engines: {node: '>= 0.4'} - aws-sign2@0.7.0: - resolution: {integrity: sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==} - - aws4@1.13.2: - resolution: {integrity: sha512-lHe62zvbTB5eEABUVi/AwVh0ZKY9rMMDhmm+eeyuuUQbQ3+J+fONVQOZyj+DdrvD4BY33uYniyRJ4UJIaSKAfw==} - axe-core@4.10.0: resolution: {integrity: sha512-Mr2ZakwQ7XUAjp7pAwQWRhhK8mQQ6JAaNWSjmjxil0R8BPioMtQsTLOolGYkji1rcL++3dCqZA3zWqpT+9Ew6g==} engines: {node: '>=4'} - axios@0.26.1: - resolution: {integrity: sha512-fPwcX4EvnSHuInCMItEhAGnaSEXRBjtzh9fOtsE6E1G6p7vl7edEeZe11QHf18+6+9gR5PbKV/sGKNaD8YaMeA==} + axios@0.28.0: + resolution: {integrity: sha512-Tu7NYoGY4Yoc7I+Npf9HhUMtEEpV7ZiLH9yndTCoNhcpBH0kwcvFbzYN9/u5QKI5A6uefjsNNWaz5olJVYS62Q==} axios@1.7.7: resolution: {integrity: sha512-S4kL7XrjgBmvdGut0sN3yJxqYzrDOnivkBiN0OFs6hLiUam3UPvswUo0kqGyhqUZGEOytHyumEdXsAkgCOUf3Q==} @@ -7928,9 +7953,6 @@ packages: batch@0.6.1: resolution: {integrity: sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==} - bcrypt-pbkdf@1.0.2: - resolution: {integrity: sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==} - bech32@2.0.0: resolution: {integrity: sha512-LcknSilhIGatDAsY1ak2I8VtGaHNhgMSYVxFrGLXv+xLHytaKZKcaUJJUE7qmBr7h33o5YQwP55pMI0xmkpJwg==} @@ -7987,6 +8009,10 @@ packages: resolution: {integrity: sha512-2hCgjEmP8YLWQ130n2FerGv7rYpfBmnmp9Uy2Le1vge6X3gZIfSmEzP5QTDElFxcvVcXlEn8Aq6MU/PZygIOog==} engines: {node: '>=14.16'} + boxen@8.0.1: + resolution: {integrity: sha512-F3PH5k5juxom4xktynS7MoFY+NUWH5LC4CnH11YB8NPew+HLpmBLCybSAEyb2F+4pRXhuhWqFesoQd6DAyc2hw==} + engines: {node: '>=18'} + bplist-parser@0.2.0: resolution: {integrity: sha512-z0M+byMThzQmD9NILRniCUXYsYpjwnlO8N5uCFaCqIOpqRsJCrQL9NK3JsD67CN5a08nF5oIL2bD6loTdHOuKw==} engines: {node: '>= 5.10.0'} @@ -8025,9 +8051,6 @@ packages: buffer-crc32@0.2.13: resolution: {integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==} - buffer-equal-constant-time@1.0.1: - resolution: {integrity: sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==} - buffer-from@1.1.2: resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} @@ -8040,10 +8063,9 @@ packages: builtins@1.0.3: resolution: {integrity: sha512-uYBjakWipfaO/bXI7E8rq6kpwHRZK5cNYrUv2OzZSI/FvmdMyXJ2tG9dKcjEC5YHmHpUAwsargWIZNWdxb/bnQ==} - bunyan@1.8.15: - resolution: {integrity: sha512-0tECWShh6wUysgucJcBAoYegf3JJoZWibxdqhTm7OHPeT42qdjkZ29QCMcKwbgU1kiH+auSIasNRXMLWXafXig==} - engines: {'0': node >=0.10.0} - hasBin: true + bundle-name@3.0.0: + resolution: {integrity: sha512-PKA4BeSvBpQKQ8iPOGCSiell+N8P+Tf1DlwqmYhpe2gAhKPHn8EYOxVT+ShuGmhg8lN8XiSlS80yiExKXrURlw==} + engines: {node: '>=12'} busboy@1.6.0: resolution: {integrity: sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==} @@ -8084,18 +8106,10 @@ packages: resolution: {integrity: sha512-zkDT5WAF4hSSoUgyfg5tFIxz8XQK+25W/TLVojJTMKBaxevLBBtLxgqguAuVQB8PVW79FVjHcU+GJ9tVbDZ9mQ==} engines: {node: '>=14.16'} - call-bind-apply-helpers@1.0.1: - resolution: {integrity: sha512-BhYE+WDaywFg2TBWYNXAE+8B1ATnThNBqXHP5nQu0jWJdVvY2hvkpyB3qOmtmDePiS5/BDQ8wASEWGMWRG148g==} - engines: {node: '>= 0.4'} - call-bind@1.0.7: resolution: {integrity: sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==} engines: {node: '>= 0.4'} - call-bind@1.0.8: - resolution: {integrity: sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==} - engines: {node: '>= 0.4'} - callsites@3.1.0: resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} engines: {node: '>=6'} @@ -8119,6 +8133,10 @@ packages: resolution: {integrity: sha512-xlx1yCK2Oc1APsPXDL2LdlNP6+uu8OCDdhOBSVT279M/S+y75O30C2VuD8T2ogdePBBl7PfPF4504tnLgX3zfw==} engines: {node: '>=14.16'} + camelcase@8.0.0: + resolution: {integrity: sha512-8WB3Jcas3swSvjIeA2yvCJ+Miyz5l1ZmB6HFb9R1317dt9LCQoswg/BGrmAmkWVEszSrrg4RwmO46qIm2OEnSA==} + engines: {node: '>=16'} + caniuse-api@3.0.0: resolution: {integrity: sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==} @@ -8132,9 +8150,6 @@ packages: resolution: {integrity: sha512-JSr5eOgoEymtYHBjNWyjrMqet9Am2miJhlfKNdqLp6zoeAh0KN5dRAcxlecj5mAJrmQomgiOBj35xHLrFjqBpw==} hasBin: true - caseless@0.12.0: - resolution: {integrity: sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==} - ccount@2.0.1: resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} @@ -8234,8 +8249,8 @@ packages: '@chromatic-com/playwright': optional: true - chrome-launcher@0.15.1: - resolution: {integrity: sha512-UugC8u59/w2AyX5sHLZUHoxBAiSiunUhZa3zZwMH6zPVis0C3dDKiRWyUGIo14tTbZHGVviWxv3PQWZ7taZ4fg==} + chrome-launcher@1.1.2: + resolution: {integrity: sha512-YclTJey34KUm5jB1aEJCq807bSievi7Nb/TU4Gu504fUYi3jw3KCIaH6L7nFWQhdEgH3V+wCh+kKD1P5cXnfxw==} engines: {node: '>=12.13.0'} hasBin: true @@ -8456,6 +8471,9 @@ packages: commondir@1.0.1: resolution: {integrity: sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==} + compare-versions@6.1.1: + resolution: {integrity: sha512-4hm4VPpIecmlg59CHXnRDnqGplJFrbLG4aFEl5vl6cK1u76ws3LLvX7ikFnTDl5vo39sjWD6AaDPYodJp/NNHg==} + component-emitter@1.3.1: resolution: {integrity: sha512-T0+barUSQRTUQASh8bx02dl+DhF54GtIDY13Y3m9oWTklKbb3Wv974meRpeZ3lp1JpLVECWWNHC4vaG2XHXouQ==} @@ -8489,6 +8507,9 @@ packages: confbox@0.1.7: resolution: {integrity: sha512-uJcB/FKZtBMCJpK8MQji6bJHgu1tixKPxRLeGkNzBoOZzpnZUJm0jm2/sBDWcuBx1dYgxV4JU+g5hmNxCyAmdA==} + confbox@0.1.8: + resolution: {integrity: sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==} + config-chain@1.1.13: resolution: {integrity: sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==} @@ -8496,6 +8517,10 @@ packages: resolution: {integrity: sha512-cD31W1v3GqUlQvbBCGcXmd2Nj9SvLDOP1oQ0YFuLETufzSPaKp11rYBsSOm7rCsW3OnIRAFM3OxRhceaXNYHkA==} engines: {node: '>=12'} + configstore@7.0.0: + resolution: {integrity: sha512-yk7/5PN5im4qwz0WFZW3PXnzHgPu9mX29Y8uZ3aefe2lBPC1FYttWZRcaW9fKkT0pBCJyuQ2HfbmPVaODi9jcQ==} + engines: {node: '>=18'} + connect-history-api-fallback@2.0.0: resolution: {integrity: sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==} engines: {node: '>=0.8'} @@ -8562,15 +8587,9 @@ packages: core-js-pure@3.38.1: resolution: {integrity: sha512-BY8Etc1FZqdw1glX0XNOq2FDwfrg/VGqoZOZCdaL+UmdaqDwQwYXkMJT4t6In+zfEfOJDcM9T0KdbBeJg8KKCQ==} - core-js@3.29.0: - resolution: {integrity: sha512-VG23vuEisJNkGl6XQmFJd3rEG/so/CNatqeE+7uZAwTSwFeB/qaO0be8xZYUNWprJ/GIwL8aMt9cj1kvbpTZhg==} - core-js@3.38.1: resolution: {integrity: sha512-OP35aUorbU3Zvlx7pjsFdu1rGNnD4pgw/CWoYzRY3t2EzoVT7shKHY1dlAy3f41cGIO7ZDPQimhGFTlEYkG/Hw==} - core-util-is@1.0.2: - resolution: {integrity: sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==} - core-util-is@1.0.3: resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} @@ -8941,18 +8960,10 @@ packages: damerau-levenshtein@1.0.8: resolution: {integrity: sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==} - dashdash@1.14.1: - resolution: {integrity: sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==} - engines: {node: '>=0.10'} - dashify@2.0.0: resolution: {integrity: sha512-hpA5C/YrPjucXypHPPc0oJ1l9Hf6wWbiOL7Ik42cxnsUOhWiCB/fylKbKqqJalW9FgkNQCw16YO8uW9Hs0Iy1A==} engines: {node: '>=4'} - data-uri-to-buffer@4.0.1: - resolution: {integrity: sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==} - engines: {node: '>= 12'} - data-urls@5.0.0: resolution: {integrity: sha512-ZYP5VBHshaDAiVZxjbRVcFJpc+4xGgT0bK3vzy1HLN8jTO975HEbuYzZJcHoQEY5K1a0z8YayJkyVETa08eNTg==} engines: {node: '>=18'} @@ -9058,9 +9069,6 @@ packages: deep-object-diff@1.1.9: resolution: {integrity: sha512-Rn+RuwkmkDwCi2/oXOFS9Gsr5lJZu/yTGpK7wAaAIE75CC+LCGEZHpY6VQJa/RoJcrmaA/docWJZvYohlNkWPA==} - deepcopy@2.1.0: - resolution: {integrity: sha512-8cZeTb1ZKC3bdSCP6XOM1IsTczIO73fdqtwa2B0N15eAz7gmyhQo+mc5gnFuulsgN3vIQYmTgbmQVKalH1dKvQ==} - deepmerge@2.2.1: resolution: {integrity: sha512-R9hc1Xa/NOBi9WRVUWg19rl1UB7Tt4kuPd+thNJgFZoxXsTz7ncaPaeIm+40oSGuP33DfMb4sZt1QIGiJzC4EA==} engines: {node: '>=0.10.0'} @@ -9073,6 +9081,10 @@ packages: resolution: {integrity: sha512-OZ1y3y0SqSICtE8DE4S8YOE9UZOJ8wO16fKWVP5J1Qz42kV9jcnMVFrEE/noXb/ss3Q4pZIH79kxofzyNNtUNA==} engines: {node: '>=12'} + default-browser@4.0.0: + resolution: {integrity: sha512-wX5pXO1+BrhMkSbROFsyxUm0i/cJEScyNhA4PPxc41ICuv05ZZB/MX28s8aZx6xjmatvebIapF6hLEKEcpneUA==} + engines: {node: '>=14.16'} + default-gateway@6.0.3: resolution: {integrity: sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg==} engines: {node: '>= 10'} @@ -9092,6 +9104,10 @@ packages: resolution: {integrity: sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==} engines: {node: '>=8'} + define-lazy-prop@3.0.0: + resolution: {integrity: sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==} + engines: {node: '>=12'} + define-properties@1.2.1: resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} engines: {node: '>= 0.4'} @@ -9273,6 +9289,10 @@ packages: resolution: {integrity: sha512-tE7ztYzXHIeyvc7N+hR3oi7FIbf/NIjVP9hmAt3yMXzrQ072/fpjGLx2GxNxGxUl5V73MEqYzioOMoVhGMJ5cA==} engines: {node: '>=10'} + dot-prop@9.0.0: + resolution: {integrity: sha512-1gxPBJpI/pcjQhKgIU91II6Wkay+dLcN3M6rf2uwP8hRur3HtQXjVrdAK3sjC0piaEuxzMwjXChcETiJl47lAQ==} + engines: {node: '>=18'} + dotenv-expand@10.0.0: resolution: {integrity: sha512-GopVGCpVS1UKH75VKHGuQFqS1Gusej0z4FyQkPdwjil2gNIv+LNsqBlboOzpJFZKVT95GkCyWJbBSdFEFUWI2A==} engines: {node: '>=12'} @@ -9289,14 +9309,6 @@ packages: resolution: {integrity: sha512-2QF/g9/zTaPDc3BjNcVTGoBbXBgYfMTTceLaYcFJ/W9kggFUkhxD/hMEeuLKbugyef9SqAx8cpgwlIP/jinUTA==} engines: {node: '>=4'} - dtrace-provider@0.8.8: - resolution: {integrity: sha512-b7Z7cNtHPhH9EJhNNbbeqTcXB8LGFFZhq1PGgEvpeHlzd36bhbdTWoE/Ba/YguqpBSlAPKnARWhVlhunCMwfxg==} - engines: {node: '>=0.10'} - - dunder-proto@1.0.0: - resolution: {integrity: sha512-9+Sj30DIu+4KvHqMfLUGLFYL2PkURSYMVXJyXe92nFRvlYq5hBjLEhblKB+vkd/WVlUYMWigiY07T91Fkk0+4A==} - engines: {node: '>= 0.4'} - duplexer@0.1.2: resolution: {integrity: sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==} @@ -9306,12 +9318,6 @@ packages: eastasianwidth@0.2.0: resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} - ecc-jsbn@0.1.2: - resolution: {integrity: sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==} - - ecdsa-sig-formatter@1.0.11: - resolution: {integrity: sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==} - ee-first@1.1.1: resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} @@ -9399,10 +9405,6 @@ packages: resolution: {integrity: sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==} engines: {node: '>= 0.4'} - es-define-property@1.0.1: - resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} - engines: {node: '>= 0.4'} - es-errors@1.3.0: resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} engines: {node: '>= 0.4'} @@ -9438,10 +9440,6 @@ packages: es6-error@4.1.1: resolution: {integrity: sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==} - es6-promisify@7.0.0: - resolution: {integrity: sha512-ginqzK3J90Rd4/Yz7qRrqUeIpe3TwSXTPPZtPne7tGBPeAaQiU8qt4fpKApnxHcq1AwtUdHVg5P77x/yrggG8Q==} - engines: {node: '>=6'} - esbuild-plugin-alias@0.2.1: resolution: {integrity: sha512-jyfL/pwPqaFXyKnj8lP8iLk6Z0m099uXR45aSN8Av1XD4vhvQutxxPzgA2bTcAwQpa1zCXDcWOlhFgyP3GKqhQ==} @@ -9657,8 +9655,8 @@ packages: deprecated: This version is no longer supported. Please see https://eslint.org/version-support for other options. hasBin: true - espree@10.0.1: - resolution: {integrity: sha512-MWkrWZbJsL2UwnjxTX3gG8FneachS/Mwg7tdGXce011sJd5b0JG54vat5KHnfSBODZ3Wvzd2WnjxyzsRoVv+ww==} + espree@10.1.0: + resolution: {integrity: sha512-M1M6CpiE6ffoigIOWYO9UDP8TMUw9kqb21tf+08IgDYjCsOvCuDt4jQcZmoYxx+w7zlKw9/N0KXfto+I8/FrXA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} espree@9.6.1: @@ -9757,6 +9755,10 @@ packages: resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} engines: {node: '>=10'} + execa@7.2.0: + resolution: {integrity: sha512-UduyVP7TLB5IcAQl+OzLyLcS/l32W/GLg+AhHJ+ow40FOk2U3SAllPwR44v4vmdFwIWqpdwxxpQbF1n5ta9seA==} + engines: {node: ^14.18.0 || ^16.14.0 || >=18.0.0} + execa@8.0.1: resolution: {integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==} engines: {node: '>=16.17'} @@ -9807,10 +9809,6 @@ packages: resolution: {integrity: sha512-xoh5G1W/PB0/27lXgMQyIhP5DSY/LhoCsOyZgb+6iMmRtCwVBo55uKaMoEYrDCKQhWvqEip5ZPKAc6eFNyf/MA==} hasBin: true - extsprintf@1.3.0: - resolution: {integrity: sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==} - engines: {'0': node >=0.6.0} - fast-decode-uri-component@1.0.1: resolution: {integrity: sha512-WKgKWg5eUxvRZGwW8FvfbaH7AXSh2cL+3j5fMGzUMCxWBJ3dV3a7Wz8y2f/uQ0e3B6WmodD3oS54jTQ9HVTIIg==} @@ -9896,10 +9894,6 @@ packages: resolution: {integrity: sha512-u5/sxGfiMfZNtJ3OvQpXcvotFpYkL0n9u9mM2vkui2nGo8b4wvDkJ8gAkYqbA8QpGyFCv3RK0Z+Iv+9veCS9bQ==} engines: {node: '>=0.4.0'} - fetch-blob@3.2.0: - resolution: {integrity: sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==} - engines: {node: ^12.20 || >= 14.13} - fetch-retry@5.0.6: resolution: {integrity: sha512-3yurQZ2hD9VISAhJJP9bpYFNQrHHBXE2JxxjY5aLEcDi46RmAzJE2OC9FAde0yis5ElW0jTTzs0zfg/Cca4XqQ==} @@ -9977,8 +9971,9 @@ packages: resolution: {integrity: sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - firefox-profile@4.3.2: - resolution: {integrity: sha512-/C+Eqa0YgIsQT2p66p7Ygzqe7NlE/GNTbhw2SBCm5V3OsWDPITNdTPEcH2Q2fe7eMpYYNPKdUcuVioZBZiR6kA==} + firefox-profile@4.7.0: + resolution: {integrity: sha512-aGApEu5bfCNbA4PGUZiRJAIU6jKmghV2UVdklXAofnNtiDjqYw0czLS46W7IfFqVKgKhFB8Ao2YoNGHY4BoIMQ==} + engines: {node: '>=18'} hasBin: true first-chunk-stream@3.0.0: @@ -10016,9 +10011,6 @@ packages: resolution: {integrity: sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==} engines: {node: '>=14'} - forever-agent@0.6.1: - resolution: {integrity: sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==} - fork-ts-checker-webpack-plugin@6.5.3: resolution: {integrity: sha512-SbH/l9ikmMWycd5puHJKTkZJKddF4iRLyW3DeZ08HTI7NGyLS38MXd/KGgeWumQO7YNQbW2u/NtPT2YowbPaGQ==} engines: {node: '>=10', yarn: '>=1.0.0'} @@ -10044,10 +10036,6 @@ packages: resolution: {integrity: sha512-yDYSgNMraqvnxiEXO4hi88+YZxaHC6QKzb5N84iRCTDeRO7ZALpir/lVmf/uXUhnwUr2O4HU8s/n6x+yNjQkHw==} engines: {node: '>= 14.17'} - form-data@2.3.3: - resolution: {integrity: sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==} - engines: {node: '>= 0.12'} - form-data@3.0.1: resolution: {integrity: sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==} engines: {node: '>= 6'} @@ -10060,10 +10048,6 @@ packages: resolution: {integrity: sha512-wzsgA6WOq+09wrU1tsJ09udeR/YZRaeArL9e1wPbFg3GG2yDnC2ldKpxs4xunpFF9DgqCqOIra3bc1HWrJ37Ww==} engines: {node: '>=0.4.x'} - formdata-polyfill@4.0.10: - resolution: {integrity: sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==} - engines: {node: '>=12.20.0'} - formidable@2.1.2: resolution: {integrity: sha512-CM3GuJ57US06mlpQ47YcunuUZ9jpm8Vx+P2CGt2j7HpgkKZO/DJYQ0Bobim8G6PFQmK5lOqOOdUXboU+h73A4g==} @@ -10104,10 +10088,6 @@ packages: resolution: {integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==} engines: {node: '>=12'} - fs-extra@11.1.0: - resolution: {integrity: sha512-0rcTq621PD5jM/e0a3EJoGC/1TC5ZBCERW82LQuwfGnCa1V8w7dpYH1yNu+SLb6E5dkeCBzKEyLGlFrnr+dUyw==} - engines: {node: '>=14.14'} - fs-extra@11.1.1: resolution: {integrity: sha512-MGIE4HOvQCeUCzmlHs0vXpih4ysz4wg9qiSAu6cd42lVwPbTM1TjV7RusoyQqMmk/95gdQZX72u+YW+c3eEpFQ==} engines: {node: '>=14.14'} @@ -10124,10 +10104,6 @@ packages: resolution: {integrity: sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==} engines: {node: '>=6 <7 || >=8'} - fs-extra@9.0.1: - resolution: {integrity: sha512-h2iAoN838FqAFJY2/qVpzFXy+EBxfVE220PalAqQLDVsFOHLJrZvut5puAbCdNv6WJk+B8ihI+k0c7JK5erwqQ==} - engines: {node: '>=10'} - fs-extra@9.1.0: resolution: {integrity: sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==} engines: {node: '>=10'} @@ -10185,10 +10161,6 @@ packages: resolution: {integrity: sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==} engines: {node: '>= 0.4'} - get-intrinsic@1.2.6: - resolution: {integrity: sha512-qxsEs+9A+u85HhllWJJFicJfPDhRmjzoYdl64aMWW9yRIJmSyxdn8IEkuIM530/7T+lv0TIHd8L6Q/ra0tEoeA==} - engines: {node: '>= 0.4'} - get-nonce@1.0.1: resolution: {integrity: sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==} engines: {node: '>=6'} @@ -10227,9 +10199,6 @@ packages: get-tsconfig@4.8.1: resolution: {integrity: sha512-k9PN+cFBmaLWtVz29SkUoqU5O0slLuHJXt/2P+tMVFT+phsSGXGkp9t3rQIqdz0e+06EHNGs3oM6ZX1s2zHxRg==} - getpass@0.1.7: - resolution: {integrity: sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==} - giget@1.2.3: resolution: {integrity: sha512-8EHPljDvs7qKykr6uw8b+lqLiUc/vUg+KVTI0uND4s63TdsZM2Xus3mflvF0DDG9SiM4RlCkFGL+7aAjRmV7KA==} hasBin: true @@ -10262,11 +10231,6 @@ packages: engines: {node: '>=16 || 14 >=14.17'} hasBin: true - glob@10.4.1: - resolution: {integrity: sha512-2jelhlq3E4ho74ZyVLN03oKdAZVUa6UDZzFLVH1H7dnoax+y9qyaq8zBkfDIggjniU19z0wU18y16jMB2eyVIw==} - engines: {node: '>=16 || 14 >=14.18'} - hasBin: true - glob@10.4.2: resolution: {integrity: sha512-GwMlUF6PkPo3Gk21UxkCohOv0PLcIXVtKyLlpEI28R/cO/4eNOdmLk3CMW1wROV/WR/EsZOWAfBbBOqYvs88/w==} engines: {node: '>=16 || 14 >=14.18'} @@ -10276,10 +10240,6 @@ packages: resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==} hasBin: true - glob@6.0.4: - resolution: {integrity: sha512-MKZeRNyYZAVVVG1oZeLaWie1uweH40m9AZwIwxyPbTSX4hHrVYSzLg0Ro5Z5R7XKkIX+Cc6oD1rqeDJnwsB8/A==} - deprecated: Glob versions prior to v9 are no longer supported - glob@7.2.3: resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} deprecated: Glob versions prior to v9 are no longer supported @@ -10289,6 +10249,10 @@ packages: engines: {node: '>=12'} deprecated: Glob versions prior to v9 are no longer supported + global-directory@4.0.1: + resolution: {integrity: sha512-wHTUcDUoZ1H5/0iVqEudYW4/kAlN5cZ3j/bXn0Dpbizl9iaUVeWSHqiOjsgk6OW2bkLclbBjzewBz6weQ1zA2Q==} + engines: {node: '>=18'} + global-dirs@3.0.1: resolution: {integrity: sha512-NBcGGFbBA9s1VzD41QXDG+3++t9Mn5t1FpLdhESY6oKY4gYTFpX4wO3sqGUa0Srjtbfj3szX0RnemmrVRUdULA==} engines: {node: '>=10'} @@ -10336,10 +10300,6 @@ packages: gopd@1.0.1: resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} - gopd@1.2.0: - resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} - engines: {node: '>= 0.4'} - got@12.6.1: resolution: {integrity: sha512-mThBblvlAF1d4O5oqyvN+ZxLAYwIJK7bpMxgYqPD9okW0C3qm5FFn7k811QrcuEBwaogR3ngOFoCfs6mRv7teQ==} engines: {node: '>=14.16'} @@ -10432,15 +10392,6 @@ packages: resolution: {integrity: sha512-KyrFvnl+J9US63TEzwoiJOQzZBJY7KgBushJA8X61DMbNsH+2ONkDuLDnCnwUiPTF42tLoEmrPyoqbenVA5zrg==} engines: {node: '>=18.0.0'} - har-schema@2.0.0: - resolution: {integrity: sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==} - engines: {node: '>=4'} - - har-validator@5.1.5: - resolution: {integrity: sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==} - engines: {node: '>=6'} - deprecated: this library is no longer supported - has-bigints@1.0.2: resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==} @@ -10467,10 +10418,6 @@ packages: resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} engines: {node: '>= 0.4'} - has-symbols@1.1.0: - resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} - engines: {node: '>= 0.4'} - has-tostringtag@1.0.2: resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} engines: {node: '>= 0.4'} @@ -10664,10 +10611,6 @@ packages: resolution: {integrity: sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==} engines: {node: '>=8.0.0'} - http-signature@1.2.0: - resolution: {integrity: sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==} - engines: {node: '>=0.8', npm: '>=1.3.7'} - http2-wrapper@2.2.1: resolution: {integrity: sha512-V5nVw1PAOgfI3Lmeaj2Exmeg7fenjhRUgz1lPSezy1CuhPYbgQtbQj4jZfEAEMlaL+vupsvhjqCyjzob0yxsmQ==} engines: {node: '>=10.19.0'} @@ -10695,6 +10638,10 @@ packages: resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} engines: {node: '>=10.17.0'} + human-signals@4.3.1: + resolution: {integrity: sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==} + engines: {node: '>=14.18.0'} + human-signals@5.0.0: resolution: {integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==} engines: {node: '>=16.17.0'} @@ -10803,6 +10750,14 @@ packages: resolution: {integrity: sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==} engines: {node: '>=10'} + ini@4.1.1: + resolution: {integrity: sha512-QQnnxNyfvmHFIsj7gkPcYymR8Jdw/o7mp5ZFihxn6h8Ci6fh3Dx4E1gPjpQEpIuPo9XVNY/ZUwh4BPMjGyL01g==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + ini@4.1.3: + resolution: {integrity: sha512-X7rqawQBvfdjS10YU1y1YVreA3SsLrW9dX2CewP2EbBJM4ypVNLDkO5y04gejPwKIY9lR+7r9gn3rFPt/kmWFg==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + inline-style-parser@0.1.1: resolution: {integrity: sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q==} @@ -10948,6 +10903,11 @@ packages: engines: {node: '>=8'} hasBin: true + is-docker@3.0.0: + resolution: {integrity: sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + hasBin: true + is-extendable@0.1.1: resolution: {integrity: sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==} engines: {node: '>=0.10.0'} @@ -10993,10 +10953,24 @@ packages: is-hexadecimal@2.0.1: resolution: {integrity: sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==} + is-in-ci@1.0.0: + resolution: {integrity: sha512-eUuAjybVTHMYWm/U+vBO1sY/JOCgoPCXRxzdju0K+K0BiGW0SChEL1MLC0PoCIR1OlPo5YAp8HuQoUlsWEICwg==} + engines: {node: '>=18'} + hasBin: true + + is-inside-container@1.0.0: + resolution: {integrity: sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==} + engines: {node: '>=14.16'} + hasBin: true + is-installed-globally@0.4.0: resolution: {integrity: sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==} engines: {node: '>=10'} + is-installed-globally@1.0.0: + resolution: {integrity: sha512-K55T22lfpQ63N4KEN57jZUAaAYqYHEe8veb/TycJRk9DdSCLLcovXz/mL6mOnhQaZsQGwPhuFopdQIlqGSEjiQ==} + engines: {node: '>=18'} + is-interactive@1.0.0: resolution: {integrity: sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==} engines: {node: '>=8'} @@ -11008,9 +10982,6 @@ packages: resolution: {integrity: sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==} engines: {node: '>= 0.4'} - is-mergeable-object@1.1.1: - resolution: {integrity: sha512-CPduJfuGg8h8vW74WOxHtHmtQutyQBzR+3MjQ6iDHIYdbOnm1YC7jv43SqCoU8OPGTJD4nibmiryA4kmogbGrA==} - is-nan@1.3.2: resolution: {integrity: sha512-E+zBKpQ2t6MEo1VsonYmluk9NxGrbzpeeLC2xIViuO2EjU2xsXsBPwTr3Ykv9l08UYEVEdWeRZNouaZqF6RN0w==} engines: {node: '>= 0.4'} @@ -11050,6 +11021,10 @@ packages: resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} engines: {node: '>=8'} + is-path-inside@4.0.0: + resolution: {integrity: sha512-lJJV/5dYS+RcL8uQdBDW9c9uWFLLBNRyFhnAKXw5tVqLlKZ4RMGZKv+YQ/IA3OhD+RpbJa1LLFM1FQPGyIXvOA==} + engines: {node: '>=12'} + is-plain-obj@3.0.0: resolution: {integrity: sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==} engines: {node: '>=10'} @@ -11192,9 +11167,6 @@ packages: peerDependencies: ws: 8.18.0 - isstream@0.1.2: - resolution: {integrity: sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==} - istanbul-lib-coverage@3.2.2: resolution: {integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==} engines: {node: '>=8'} @@ -11391,8 +11363,8 @@ packages: joi@17.13.3: resolution: {integrity: sha512-otDA4ldcIx+ZXsKHWmp0YizCweVRZG96J10b0FevjfuncLO1oX59THoAmHkNubYJ+9gWsYsp5k8v4ib6oDv1fA==} - jose@4.13.1: - resolution: {integrity: sha512-MSJQC5vXco5Br38mzaQKiq9mwt7lwj2eXpgpRyQYNHYt2lq1PjkWa7DLXX0WVcQLE9HhMh3jPiufS7fhJf+CLQ==} + jose@5.9.2: + resolution: {integrity: sha512-ILI2xx/I57b20sd7rHZvgiiQrmp2mcotwsAH+5ajbpFQbrYVQdNHYlQhoA5cFb78CgtBOxtC05TeA+mcgkuCqQ==} jose@5.9.3: resolution: {integrity: sha512-egLIoYSpcd+QUF+UHgobt5YzI2Pkw/H39ou9suW687MY6PmCwPmkNV/4TNjn1p2tX5xO3j0d0sq5hiYE24bSlg==} @@ -11408,9 +11380,6 @@ packages: resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} hasBin: true - jsbn@0.1.1: - resolution: {integrity: sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==} - jscodeshift@0.15.2: resolution: {integrity: sha512-FquR7Okgmc4Sd0aEDwqho3rEiKR3BdvuG9jfdHjLJ6JQoWSMpavug3AoIfnfWhxFlf+5pzQh8qjqz0DWFrNQzA==} hasBin: true @@ -11450,6 +11419,10 @@ packages: json-parse-even-better-errors@2.3.1: resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} + json-parse-even-better-errors@3.0.2: + resolution: {integrity: sha512-fi0NG4bPjCHunUJffmLd0gxssIgkNmArMvis4iNah6Owg1MCJjWhEcDLmsK6iGkJq3tHwbDkTlce70/tmXN4cQ==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + json-rpc-engine@6.1.0: resolution: {integrity: sha512-NEdLrtrq1jUZyfjkr9OCz9EzCNhnRyWtt1PAnvnhwy6e8XETS0Dtc+ZNCO2gvuAoKsIn2+vCSowXTYE4CkgnAQ==} engines: {node: '>=10.0.0'} @@ -11467,15 +11440,9 @@ packages: json-schema-typed@7.0.3: resolution: {integrity: sha512-7DE8mpG+/fVw+dTpjbxnx47TaMnDfOI1jwft9g1VybltZCduyRQPJPvc+zzKY9WPHxhPWczyFuYa6I8Mw4iU5A==} - json-schema@0.4.0: - resolution: {integrity: sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==} - json-stable-stringify-without-jsonify@1.0.1: resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} - json-stringify-safe@5.0.1: - resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==} - json-to-pretty-yaml@1.2.2: resolution: {integrity: sha512-rvm6hunfCcqegwYaG5T4yKJWxc9FXFgBVrcTZ4XfSVRwa5HA/Xs+vB/Eo9treYYHCeNM0nrSUr82V/M31Urc7A==} engines: {node: '>= 0.2.0'} @@ -11501,14 +11468,6 @@ packages: jsonfile@6.1.0: resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} - jsonwebtoken@9.0.0: - resolution: {integrity: sha512-tuGfYXxkQGDPnLJ7SibiQgVgeDgfbPq2k2ICcbgqW8WxWLBAxKQM/ZCu/IT8SOSwmaYl4dpTFCW5xZv7YbbWUw==} - engines: {node: '>=12', npm: '>=6'} - - jsprim@1.4.2: - resolution: {integrity: sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==} - engines: {node: '>=0.6.0'} - jsx-ast-utils@3.3.5: resolution: {integrity: sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==} engines: {node: '>=4.0'} @@ -11516,12 +11475,6 @@ packages: jszip@3.10.1: resolution: {integrity: sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==} - jwa@1.4.1: - resolution: {integrity: sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==} - - jws@3.2.2: - resolution: {integrity: sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==} - katex@0.16.11: resolution: {integrity: sha512-RQrI8rlHY92OLf3rho/Ts8i/XvjgguEjOkO1BEXcU3N8BqPpSzBNwV/G0Ukr+P/l3ivvJUE/Fa/CwbS6HesGNQ==} hasBin: true @@ -11547,6 +11500,10 @@ packages: kolorist@1.8.0: resolution: {integrity: sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==} + ky@1.7.3: + resolution: {integrity: sha512-Sz49ZWR/BjNOq+2UK1k9ONZUVq8eyuCj30Zgc8VrRNtFlTBZduzuvehUd5kjQF6/Fms3Ir3EYqzJryw9tRvsSw==} + engines: {node: '>=18'} + language-subtag-registry@0.3.23: resolution: {integrity: sha512-0K65Lea881pHotoGEa5gDlMxt3pctLi2RplBb7Ezh4rRdLEOtgi7n4EwK9lamnUCkKBqaeKRVebTq6BAxSkpXQ==} @@ -11558,6 +11515,10 @@ packages: resolution: {integrity: sha512-KvNT4XqAMzdcL6ka6Tl3i2lYeFDgXNCuIX+xNx6ZMVR1dFq+idXd9FLKNMOIx0t9mJ9/HudyX4oZWXZQ0UJHeg==} engines: {node: '>=14.16'} + latest-version@9.0.0: + resolution: {integrity: sha512-7W0vV3rqv5tokqkBAFV1LbR7HPOWzXQDpDgEuib/aJ1jsZZx6x3c2mBI+TJhJzOhkGeaLbCKEHXEXLfirtG2JA==} + engines: {node: '>=18'} + launch-editor@2.9.1: resolution: {integrity: sha512-Gcnl4Bd+hRO9P9icCP/RVVT2o8SFlPXofuCxvA2SaZuH45whSvf5p8x5oih5ftLiVhEI4sp5xDY+R+b3zJBh5w==} @@ -11590,8 +11551,8 @@ packages: lie@3.3.0: resolution: {integrity: sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==} - lighthouse-logger@1.4.2: - resolution: {integrity: sha512-gPWxznF6TKmUHrOQjlVo2UbaL2EJ71mb2CCeRs/2qBpi4L/g4LUVc9+3lKQ6DTUZwJswfM7ainGrLO1+fOqa2g==} + lighthouse-logger@2.0.1: + resolution: {integrity: sha512-ioBrW3s2i97noEmnXxmUq7cjIcVRjT5HBpAYy8zE11CxU9HqlWHHeRxfeN1tn8F7OEMVPIC9x1f8t3Z7US9ehQ==} lilconfig@2.1.0: resolution: {integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==} @@ -11641,6 +11602,10 @@ packages: resolution: {integrity: sha512-FMJTLMXfCLMLfJxcX9PFqX5qD88Z5MRGaZCVzfuqeZSPsyiBzs+pahDQjbIWz2QIzPZz0NX9Zy4FX3lmK6YHIg==} engines: {node: '>= 12.13.0'} + local-pkg@0.5.1: + resolution: {integrity: sha512-9rrA30MRRP3gBD3HTGnC6cDFpaE1kVDWxWgqWJUN0RvDNAo+Nz/9GxB+nHOH0ifbVFy0hSA1V6vFDvnx54lTEQ==} + engines: {node: '>=14'} + localforage@1.10.0: resolution: {integrity: sha512-14/H1aX7hzBBmmh7sGPd+AOMkkIrHM3Z1PAyGgZigA1H1p5O5ANnMyWzvpAETtG68/dC4pC0ncy3+PPGzXZHPg==} @@ -11672,12 +11637,6 @@ packages: lodash.deburr@4.1.0: resolution: {integrity: sha512-m/M1U1f3ddMCs6Hq2tAsYThTBDaAKFDX3dwDo97GEYzamXi9SqUpjWi/Rrj/gf3X2n8ktwgZrlP1z6E3v/IExQ==} - lodash.get@4.4.2: - resolution: {integrity: sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==} - - lodash.isequal@4.5.0: - resolution: {integrity: sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==} - lodash.isnumber@3.0.3: resolution: {integrity: sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==} @@ -11849,10 +11808,6 @@ packages: math-expression-evaluator@1.4.0: resolution: {integrity: sha512-4vRUvPyxdO8cWULGTh9dZWL2tZK6LDBvj+OGHBER7poH9Qdt7kXEoj20wiz4lQUbUXQZFjPbe5mVDo9nutizCw==} - math-intrinsics@1.0.0: - resolution: {integrity: sha512-4MqMiKP90ybymYvsut0CH2g4XWbfLtmlCkXmtmdcDCxNB+mQcu1w/1+L/VD7vi/PSv7X2JYV7SCcR+jiPXnQtA==} - engines: {node: '>= 0.4'} - mdast-util-definitions@4.0.0: resolution: {integrity: sha512-k8AJ6aNnUkB7IE+5azR9h81O5EQ/cTDXtWdMq9Kk5KcEW/8ritU5CeLg/9HhOC++nALHBlaogJ5jz0Ybk3kPMQ==} @@ -12285,6 +12240,9 @@ packages: mlly@1.7.1: resolution: {integrity: sha512-rrVRZRELyQzrIUAVMHxP97kv+G786pHmOKzuFII8zDYahFBS7qnHh2AlYSl1GAHhaMPCz6/oHjVMcfFYgFYHgA==} + mlly@1.7.3: + resolution: {integrity: sha512-xUsx5n/mN0uQf4V548PKQ+YShA4/IW0KI1dZhrNrPCLG+xizETbHTkOa1f8/xut9JRPp8kQuMnz0oqwkTiLo/A==} + modern-ahocorasick@1.0.1: resolution: {integrity: sha512-yoe+JbhTClckZ67b2itRtistFKf8yPYelHLc7e5xAwtNAXxM6wJTUx2C7QeVSJFDzKT7bCIFyBVybPMKvmB9AA==} @@ -12315,8 +12273,8 @@ packages: typescript: optional: true - muggle-string@0.3.1: - resolution: {integrity: sha512-ckmWDJjphvd/FvZawgygcUeQCxzvohjFO5RxTjj4eq8kw359gFF3E1brjfI+viLMxss5JrHTDRHZvu2/tuy0Qg==} + muggle-string@0.4.1: + resolution: {integrity: sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ==} multer@1.4.4-lts.1: resolution: {integrity: sha512-WeSGziVj6+Z2/MwQo3GvqzgR+9Uc+qt8SwHKh3gvNPiISKfsMfG4SvCOFYlxxgkXt7yIV2i1yczehm0EOKIxIg==} @@ -12337,23 +12295,16 @@ packages: resolution: {integrity: sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - mv@2.1.1: - resolution: {integrity: sha512-at/ZndSy3xEGJ8i0ygALh8ru9qy7gWW1cmkaqBN29JmMlIvM//MEO9y1sk/avxuwnPcfhkejkLsuPxH81BrkSg==} - engines: {node: '>=0.8.0'} - mz@2.7.0: resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} - nan@2.20.0: - resolution: {integrity: sha512-bk3gXBZDGILuuo/6sKtr0DQmSThYHLtNCdSdXk9YkxD/jK6X2vmCyyXBBxyqZ4XcnzTyYEAThfX3DCEnLf6igw==} - - nanoid@3.3.7: - resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} + nanoid@3.3.8: + resolution: {integrity: sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true - nanoid@5.0.7: - resolution: {integrity: sha512-oLxFY2gd2IqnjcYyOXD8XGCftpGtZP2AbHbOkthDkvRywH5ayNtPVy9YlOPcHckXzbLTCHpkb7FB+yuxKV13pQ==} + nanoid@5.0.9: + resolution: {integrity: sha512-Aooyr6MXU6HpvvWXKoVoXwKMs/KyVakWwg7xQfv5/S/RIgJMy0Ifa45H9qqYy7pTCszrHzP21Uk4PZq2HpEM8Q==} engines: {node: ^18 || >=20} hasBin: true @@ -12366,10 +12317,6 @@ packages: natural-orderby@2.0.3: resolution: {integrity: sha512-p7KTHxU0CUrcOXe62Zfrb5Z13nLvPhSWR/so3kFulUQU0sgUll2Z0LwpsLN351eOOD+hRGu/F1g+6xDfPeD++Q==} - ncp@2.0.0: - resolution: {integrity: sha512-zIdGUrPRFTUELUvr3Gmc7KZ2Sw/h1PiVM0Af/oHB6zgnV1ikqSfRk+TOufi79aHYCW3NiOXmr1BP5nWbzojLaA==} - hasBin: true - negotiator@0.6.3: resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} engines: {node: '>= 0.6'} @@ -12408,10 +12355,6 @@ packages: resolution: {integrity: sha512-tmPX422rYgofd4epzrNoOXiE8XFZYOcCq1vD7MAXCDO+O+zndlA2ztdKKMa+EeuBG5tHETpr4ml4RGgpqDCCAg==} engines: {node: '>= 0.10.5'} - node-domexception@1.0.0: - resolution: {integrity: sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==} - engines: {node: '>=10.5.0'} - node-emoji@1.11.0: resolution: {integrity: sha512-wo2DpQkQp7Sjm2A0cq+sN7EHKO6Sl0ctXeBdFZrL9T9+UywORbufTcTZxom8YqpLQt/FqNMUkOpkZrJVYSKD3A==} @@ -12431,10 +12374,6 @@ packages: encoding: optional: true - node-fetch@3.3.1: - resolution: {integrity: sha512-cRVc/kyto/7E5shrWca1Wsea4y6tL9iYJE5FBCius3JQfb/4P4I295PfhgbJQBLTx6lATE4z+wK0rPM4VS2uow==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - node-forge@1.3.1: resolution: {integrity: sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==} engines: {node: '>= 6.13.0'} @@ -12499,9 +12438,6 @@ packages: engines: {node: ^14.16.0 || >=16.10.0} hasBin: true - oauth-sign@0.9.0: - resolution: {integrity: sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==} - object-assign@4.1.1: resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} engines: {node: '>=0.10.0'} @@ -12594,6 +12530,10 @@ packages: resolution: {integrity: sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==} engines: {node: '>=12'} + open@9.1.0: + resolution: {integrity: sha512-OS+QTnw1/4vrf+9hh1jc1jnYjzSG4ttTBB8UxOwAnInG3Uo4ssetzC1ihqaIHjLJnA5GGlRl6QlZXOTQhRBUvg==} + engines: {node: '>=14.16'} + opener@1.5.2: resolution: {integrity: sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==} hasBin: true @@ -12695,6 +12635,10 @@ packages: package-json-from-dist@1.0.1: resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} + package-json@10.0.1: + resolution: {integrity: sha512-ua1L4OgXSBdsu1FPb7F3tYH0F48a6kxvod4pLUlGY9COeJAJQNX/sNH2IiEmsxw7lqYiAwrdHMjz1FctOsyDQg==} + engines: {node: '>=18'} + package-json@8.1.1: resolution: {integrity: sha512-cbH9IAIJHNj9uXi196JVsRlt7cHKak6u/e6AkL/bkRelZ7rlL3X1YKxsZwa36xipOEKAsdtmaG6aAJoM1fx2zA==} engines: {node: '>=14.16'} @@ -12738,9 +12682,9 @@ packages: resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} engines: {node: '>=8'} - parse-json@6.0.2: - resolution: {integrity: sha512-SA5aMiaIjXkAiBrW/yPgLgQAQg42f7K3ACO+2l/zOvtQBwX58DMUsFJXelW2fx3yMBmWOVkR6j1MGsdSbCA4UA==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + parse-json@7.1.1: + resolution: {integrity: sha512-SgOTCX/EZXtZxBE5eJ97P4yGM5n37BwRU+YMsH4vNzFqJV/oWFXXCmwFlgWUM4PrakybVOueJJ6pwHqSVhTFDw==} + engines: {node: '>=16'} parse-numeric-range@1.3.0: resolution: {integrity: sha512-twN+njEipszzlMJd4ONUYgSfZPDxgHhT9Ahed5uTigpQn90FggW4SA/AIPq/6a149fTbE9qBEcSwE3FAEp6wQQ==} @@ -12815,8 +12759,8 @@ packages: resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} engines: {node: '>=16 || 14 >=14.18'} - path-to-regexp@0.1.10: - resolution: {integrity: sha512-7lf7qcQidTku0Gu3YDPc8DJ1q7OOucfa/BSsIwjuh56VU7katFvuM8hULfkwB3Fns/rsVF7PwPKVw1sl5KQS9w==} + path-to-regexp@0.1.12: + resolution: {integrity: sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==} path-to-regexp@1.9.0: resolution: {integrity: sha512-xIp7/apCFJuUHdDLWe8O1HIkb0kQrOMb/0u6FXQjemHn/ii5LrIzU6bdECnsiTF/GjZkMEKg1xdiZwNqDYlZ6g==} @@ -12847,9 +12791,6 @@ packages: pend@1.2.0: resolution: {integrity: sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==} - performance-now@2.1.0: - resolution: {integrity: sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==} - periscopic@3.1.0: resolution: {integrity: sha512-vKiQ8RRtkl9P+r/+oefh25C3fhybptkHKCZSPlcXiJux2tJF55GnEj3BVn4A5gKfq9NWWXXrxkHBwVPUfH0opw==} @@ -12890,10 +12831,17 @@ packages: pino-std-serializers@6.2.2: resolution: {integrity: sha512-cHjPPsE+vhj/tnhCy/wiMh3M3z3h/j15zHQX+S9GkTBgqJuTuJzYJ4gUyACLhDaJ7kk9ba9iRDmbH2tJU03OiA==} + pino-std-serializers@7.0.0: + resolution: {integrity: sha512-e906FRY0+tV27iq4juKzSYPbUj2do2X2JX4EzSca1631EB2QJQUqGbDuERal7LCtOpxl6x3+nvo9NPZcmjkiFA==} + pino@8.20.0: resolution: {integrity: sha512-uhIfMj5TVp+WynVASaVEJFTncTUe4dHBq6CWplu/vBgvGHhvBvQfxz+vcOrnnBQdORH3izaGEurLfNlq3YxdFQ==} hasBin: true + pino@9.4.0: + resolution: {integrity: sha512-nbkQb5+9YPhQRz/BeQmrWpEknAaqjpAqRK8NwJpmrX/JHu7JuZC5G1CeAwJDJfGes4h+YihC6in3Q2nGb+Y09w==} + hasBin: true + pirates@4.0.6: resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} engines: {node: '>= 6'} @@ -12920,6 +12868,9 @@ packages: pkg-types@1.2.0: resolution: {integrity: sha512-+ifYuSSqOQ8CqP4MbZA5hDpb97n3E8SVWdJe+Wms9kj745lmd3b7EZJiqvmLwAlmRfjrI7Hi5z3kdBJ93lFNPA==} + pkg-types@1.2.1: + resolution: {integrity: sha512-sQoqa8alT3nHjGuTjuKgOnvjo4cljkufdtLMnO2LBP/wRwuDlo1tkaEdMxCRhyGRPacv/ztlZgDPm2b7FAmEvw==} + pkg-up@3.1.0: resolution: {integrity: sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==} engines: {node: '>=8'} @@ -13525,6 +13476,9 @@ packages: process-warning@3.0.0: resolution: {integrity: sha512-mqn0kFRl0EoqhnL0GQ0veqFHyIN1yig9RHh/InzORTUiZHFRAur+aMtRkELNwGs9aNwKS6tg/An4NYBPGwvtzQ==} + process-warning@4.0.0: + resolution: {integrity: sha512-/MyYDxttz7DfGMMHiysAsFE4qF+pQYAA8ziO/3NcRVrQ5fSk+Mns4QZA/oRPFzvcqNoVJXQNWNAsdwBXLUkQKw==} + process@0.11.10: resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==} engines: {node: '>= 0.6.0'} @@ -13625,10 +13579,6 @@ packages: resolution: {integrity: sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==} engines: {node: '>=0.6'} - qs@6.5.3: - resolution: {integrity: sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==} - engines: {node: '>=0.6'} - querystringify@2.2.0: resolution: {integrity: sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==} @@ -14041,9 +13991,6 @@ packages: regenerate@1.4.2: resolution: {integrity: sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==} - regenerator-runtime@0.13.11: - resolution: {integrity: sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==} - regenerator-runtime@0.14.1: resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} @@ -14160,11 +14107,6 @@ packages: resolution: {integrity: sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==} engines: {node: '>=0.10'} - request@2.88.2: - resolution: {integrity: sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==} - engines: {node: '>= 6'} - deprecated: request has been deprecated, see https://github.com/request/request/issues/3142 - require-directory@2.1.1: resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} engines: {node: '>=0.10.0'} @@ -14244,11 +14186,6 @@ packages: rfdc@1.4.1: resolution: {integrity: sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==} - rimraf@2.4.5: - resolution: {integrity: sha512-J5xnxTyqaiw06JjMftq7L9ouA448dw/E7dKghkP9WpKNuwmARNNg+Gk8/u5ryb9N/Yo2+z3MCwuqFK/+qPOPfQ==} - deprecated: Rimraf versions prior to v4 are no longer supported - hasBin: true - rimraf@2.6.3: resolution: {integrity: sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==} deprecated: Rimraf versions prior to v4 are no longer supported @@ -14292,6 +14229,10 @@ packages: engines: {node: '>=12.0.0'} hasBin: true + run-applescript@5.0.0: + resolution: {integrity: sha512-XcT5rBksx1QdIhlFOCtgZkB99ZEouFZ1E2Kc2LHqNW13U3/74YGdkQRmThTwxy4QIyookibDKYZOPqX//6BlAg==} + engines: {node: '>=12'} + run-async@2.4.1: resolution: {integrity: sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==} engines: {node: '>=0.12.0'} @@ -14323,9 +14264,6 @@ packages: safe-buffer@5.2.1: resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} - safe-json-stringify@1.2.0: - resolution: {integrity: sha512-gH8eh2nZudPQO6TytOvbxnuhYBOvDBBLW52tz5q6X58lJcd/tkmqFR+5Z9adS8aJtURSXWThWy/xJtJwixErvg==} - safe-regex-test@1.0.3: resolution: {integrity: sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==} engines: {node: '>= 0.4'} @@ -14409,11 +14347,6 @@ packages: engines: {node: '>=10'} hasBin: true - semver@7.6.2: - resolution: {integrity: sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==} - engines: {node: '>=10'} - hasBin: true - semver@7.6.3: resolution: {integrity: sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==} engines: {node: '>=10'} @@ -14463,10 +14396,6 @@ packages: setprototypeof@1.2.0: resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} - sha.js@2.4.11: - resolution: {integrity: sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==} - hasBin: true - shallow-clone@3.0.1: resolution: {integrity: sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==} engines: {node: '>=8'} @@ -14506,10 +14435,6 @@ packages: siginfo@2.0.0: resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} - sign-addon@5.3.0: - resolution: {integrity: sha512-7nHlCzhQgVMLBNiXVEgbG/raq48awOW0lYMN5uo1BaB3mp0+k8M8pvDwbfTlr3apcxZJsk9HQsAW1POwoJugpQ==} - deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. - signal-exit@3.0.7: resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} @@ -14574,6 +14499,9 @@ packages: sonic-boom@3.8.1: resolution: {integrity: sha512-y4Z8LCDBuum+PBP3lSV7RHrXscqksve/bi0as7mhwVnBW+/wUqKT/2Kb7um8yqcFy0duYbbPxzt89Zy2nOCaxg==} + sonic-boom@4.2.0: + resolution: {integrity: sha512-INb7TM37/mAcsGmc9hyyI6+QR3rR1zVRu36B0NeGXKnOOLiZOfER5SA+N7X7k3yUYRzLWafduTDvJAfDswwEww==} + sort-css-media-queries@2.2.0: resolution: {integrity: sha512-0xtkGhWCC9MGt/EzgnvbbbKhqWjl1+/rncmhTh5qCpbYguXh6S/qwePfv/JQ8jePXXmqingylxoC49pCkSPIbA==} engines: {node: '>= 6.3.0'} @@ -14658,11 +14586,6 @@ packages: resolution: {integrity: sha512-wvLeHgcVHKO8Sc/H/5lkGreJQVeYMm9rlmt8PuR1xE31rIuXhuzznUUqAt8MqLhB3MqJdFzlNAfpcWnxiFUcPw==} engines: {node: '>=12'} - sshpk@1.18.0: - resolution: {integrity: sha512-2p2KJZTSqQ/I3+HX42EpYOa2l3f8Erv8MWKsy2I9uf4wA7yFIkXRffYdsx86y6z4vHtV8u7g+pPlr8/4ouAxsQ==} - engines: {node: '>=0.10.0'} - hasBin: true - stack-utils@2.0.6: resolution: {integrity: sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==} engines: {node: '>=10'} @@ -14713,13 +14636,6 @@ packages: stream-shift@1.0.3: resolution: {integrity: sha512-76ORR0DO1o1hlKwTbi/DM3EXWGf3ZJYO8cXX5RJwnul2DEg2oyoZyjLNoQM8WsvZiFKCRfC1O0J7iCvie3RZmQ==} - stream-to-array@2.3.0: - resolution: {integrity: sha512-UsZtOYEn4tWU2RGLOXr/o/xjRBftZRlG3dEWoaHr8j4GuypJ3isitGbVyjQKAuMu+xbiop8q224TjiZWc4XTZA==} - - stream-to-promise@3.0.0: - resolution: {integrity: sha512-h+7wLeFiYegOdgTfTxjRsrT7/Op7grnKEIHWgaO1RTHwcwk7xRreMr3S8XpDfDMesSxzgM2V4CxNCFAGo6ssnA==} - engines: {node: '>= 10'} - streamsearch@1.1.0: resolution: {integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==} engines: {node: '>=10.0.0'} @@ -14844,10 +14760,13 @@ packages: resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} engines: {node: '>=8'} - strip-json-comments@5.0.0: - resolution: {integrity: sha512-V1LGY4UUo0jgwC+ELQ2BNWfPa17TIuwBLg+j1AA/9RPzKINl1lhxVEu2r+ZTTO8aetIsUzE5Qj6LMSBkoGYKKw==} + strip-json-comments@5.0.1: + resolution: {integrity: sha512-0fk9zBqO67Nq5M/m45qHCJxylV/DhBlIOVExqgOMiCCrzrhU6tCibRXNqE3jwJLftzE9SNuZtYbpzcO+i9FiKw==} engines: {node: '>=14.16'} + stubborn-fs@1.2.5: + resolution: {integrity: sha512-H2N9c26eXjzL/S/K+i/RHHcFanE74dptvvjM8iwzwbVcWY/zjBbgRqF3K0DY4+OD+uTTASTBvDoxPDaPN02D7g==} + style-to-js@1.1.16: resolution: {integrity: sha512-/Q6ld50hKYPH3d/r6nr117TZkHR0w0kGGIVfpG9N6D8NymRPM9RqCUv4pRpJ62E5DqOYx2AFpbZMyCPnjQCnOw==} @@ -15039,6 +14958,9 @@ packages: thread-stream@2.7.0: resolution: {integrity: sha512-qQiRWsU/wvNolI6tbbCKd9iKaTnCXsTwVxhhKM6nctPdujTyztjlbUkUTUymidWcMnZ5pWR0ej4a0tjsW021vw==} + thread-stream@3.1.0: + resolution: {integrity: sha512-OqyPZ9u96VohAyMfJykzmivOrY2wfMSf3C5TtFJVgN+Hm6aj+voFhlK+kZEIv2FBh1X6Xp3DlnCOfEQ3B2J86A==} + throttle-debounce@5.0.2: resolution: {integrity: sha512-B71/4oyj61iNH0KeCamLuE2rmKuTO5byTOSVwECM5FA7TiAiAW+UqTKZ9ERueC4qvgSttUhdmq1mXC3kJqGX7A==} engines: {node: '>=12.22'} @@ -15089,14 +15011,14 @@ packages: title-case@3.0.3: resolution: {integrity: sha512-e1zGYRvbffpcHIrnuqT0Dh+gEJtDaxDSoG4JAIpq4oDFyooziLBIiYQv0GBT4FUAnUop5uZ1hiIAj7oAF6sOCA==} + titleize@3.0.0: + resolution: {integrity: sha512-KxVu8EYHDPBdUYdKZdKtU2aj2XfEx9AfjXxE/Aj0vT06w2icA09Vus1rh6eSu1y01akYg6BjIK/hxyLJINoMLQ==} + engines: {node: '>=12'} + tmp@0.0.33: resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==} engines: {node: '>=0.6.0'} - tmp@0.2.1: - resolution: {integrity: sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==} - engines: {node: '>=8.17.0'} - tmp@0.2.3: resolution: {integrity: sha512-nZD7m9iCPC5g0pYmcaxogYKggSfLsdxl8of3Q/oIbqCqLLIO9IAF0GWjX1z9NZRHPiXv8Wex4yDCaZsgEw0Y8w==} engines: {node: '>=14.14'} @@ -15128,18 +15050,10 @@ packages: toposort@2.0.2: resolution: {integrity: sha512-0a5EOkAUp8D4moMi2W8ZF8jcga7BgZd91O/yabJCFY8az+XSzeGyTKs0Aoo897iV1Nj6guFq8orWDS96z91oGg==} - tosource@1.0.0: - resolution: {integrity: sha512-N6g8eQ1eerw6Y1pBhdgkubWIiPFwXa2POSUrlL8jth5CyyEWNWzoGKRkO3CaO7Jx27hlJP54muB3btIAbx4MPg==} - engines: {node: '>=0.4.0'} - totalist@3.0.1: resolution: {integrity: sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==} engines: {node: '>=6'} - tough-cookie@2.5.0: - resolution: {integrity: sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==} - engines: {node: '>=0.8'} - tough-cookie@4.1.4: resolution: {integrity: sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==} engines: {node: '>=6'} @@ -15309,9 +15223,6 @@ packages: tween-functions@1.2.0: resolution: {integrity: sha512-PZBtLYcCLtEcjL14Fzb1gSxPBeL7nWvGhO5ZFPGqziCcr8uvHp0NDmdjBchp6KHL+tExcg0m3NISmKxhU394dA==} - tweetnacl@0.14.5: - resolution: {integrity: sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==} - tweetnacl@1.0.3: resolution: {integrity: sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw==} @@ -15323,10 +15234,6 @@ packages: resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} engines: {node: '>=4'} - type-detect@4.1.0: - resolution: {integrity: sha512-Acylog8/luQ8L7il+geoSxhEkazvkslg7PSNKOX59mbB9cOveP5aq9h74Y7YU8yDpJwetzQQrfIwtf4Wp4LKcw==} - engines: {node: '>=4'} - type-fest@0.16.0: resolution: {integrity: sha512-eaBzG6MxNzEn9kiwvtre90cXaNLkmadMWa1zQMs3XORCXNbsH/OewwbxC5ia9dCxIxnTAsSxXJaa/p5y8DlvJg==} engines: {node: '>=10'} @@ -15355,6 +15262,10 @@ packages: resolution: {integrity: sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==} engines: {node: '>=12.20'} + type-fest@3.13.1: + resolution: {integrity: sha512-tLq3bSNx+xSpwvAJnzrK0Ep5CLNWjvFTOp71URMaAEWBfRb9nnJiBoUe0tF8bI4ZFO3omgBR6NvnbzVUT3Ly4g==} + engines: {node: '>=14.16'} + type-fest@4.26.1: resolution: {integrity: sha512-yOGpmOAL7CkKe/91I5O3gPICmJNLJ1G4zFYVAsRHg7M64biSnPtRj0WNQt++bRkjYOqjWXrhnUw1utzmVErAdg==} engines: {node: '>=16'} @@ -15556,10 +15467,6 @@ packages: resolution: {integrity: sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==} engines: {node: '>= 4.0.0'} - universalify@1.0.0: - resolution: {integrity: sha512-rb6X1W158d7pRQBg5gkR8uPaSfiids68LTJQYOtEUhoJUWBdaQHsuT/EUduxXYxcrt4r5PJ4fuHW1MHT6p0qug==} - engines: {node: '>= 10.0.0'} - universalify@2.0.1: resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} engines: {node: '>= 10.0.0'} @@ -15599,6 +15506,10 @@ packages: resolution: {integrity: sha512-EDxhTEVPZZRLWYcJ4ZXjGFN0oP7qYvbXWzEgRm/Yql4dHX5wDbvh89YHP6PK1lzZJYrMtXUuZZz8XGK+U6U1og==} engines: {node: '>=14.16'} + update-notifier@7.3.1: + resolution: {integrity: sha512-+dwUY4L35XFYEzE+OAL3sarJdUioVovq+8f7lcIJ7wnmnYQV5UD1Y/lcwaMSyaQ6Bj3JMj1XSTjZbNLHn/19yA==} + engines: {node: '>=18'} + upper-case-first@2.0.2: resolution: {integrity: sha512-514ppYHBaKwfJRK/pNC6c/OxfGa0obSnAl106u97Ed0I625Nin96KAjttZF6ZL3e1XLtphxnqrOi9iWgm+u+bg==} @@ -15707,11 +15618,6 @@ packages: resolution: {integrity: sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==} hasBin: true - uuid@3.4.0: - resolution: {integrity: sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==} - deprecated: Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details. - hasBin: true - uuid@8.3.2: resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} hasBin: true @@ -15741,10 +15647,6 @@ packages: validate-npm-package-name@3.0.0: resolution: {integrity: sha512-M6w37eVCMMouJ9V/sdPGnC5H4uDr73/+xdq0FBLO3TFFX1+7wiUY6Es328NN+y43tmY+doUdN9g9J21vqB7iLw==} - validator@13.12.0: - resolution: {integrity: sha512-c1Q0mCiPlgdTVVVIJIrBuxNicYE+t/7oKeI9MWLj3fh/uq2Pxh/3eeWbVZ4OcGW1TUf53At0njHw5SMdA3tmMg==} - engines: {node: '>= 0.10'} - value-equal@1.0.1: resolution: {integrity: sha512-NOJ6JZCAWr0zlxZt+xqCHNTEKOsrks2HQd4MqhP1qy4z1SkbEP467eNx6TgDKXMvUOb+OENfJCZwM+16n7fRfw==} @@ -15759,10 +15661,6 @@ packages: resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} engines: {node: '>= 0.8'} - verror@1.10.0: - resolution: {integrity: sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==} - engines: {'0': node >=0.6.0} - vfile-location@5.0.3: resolution: {integrity: sha512-5yXvWDEgqeiYiBe1lbxYF7UMAIm/IcopxMHrMQDq3nvKcjPKIhZklUKL+AE7J7uApI4kwe2snsK+eI6UTj9EHg==} @@ -15788,8 +15686,8 @@ packages: engines: {node: ^18.0.0 || >=20.0.0} hasBin: true - vite-plugin-dts@3.9.1: - resolution: {integrity: sha512-rVp2KM9Ue22NGWB8dNtWEr+KekN3rIgz1tWD050QnRGlriUCmaDwa7qA5zDEjbXg5lAXhYMSBJtx3q3hQIJZSg==} + vite-plugin-dts@4.3.0: + resolution: {integrity: sha512-LkBJh9IbLwL6/rxh0C1/bOurDrIEmRE7joC+jFdOEEciAFPbpEKOLSAr5nNh5R7CJ45cMbksTrFfy52szzC5eA==} engines: {node: ^14.18.0 || >=16.0.0} peerDependencies: typescript: '*' @@ -15867,19 +15765,13 @@ packages: jsdom: optional: true + vscode-uri@3.0.8: + resolution: {integrity: sha512-AyFQ0EVmsOZOlAnxoFOGOq1SQDWAB7C6aqMGS23svWAllfOaxbuFvcT8D1i8z3Gyn8fraVeZNNmN6e9bxxXkKw==} + vue-parser@1.1.6: resolution: {integrity: sha512-v3/R7PLbaFVF/c8IIzWs1HgRpT2gN0dLRkaLIT5q+zJGVgmhN4VuZJF4Y9N4hFtFjS4B1EHxAOP6/tzqM4Ug2g==} engines: {node: '>= 4.0.0', npm: '>= 3.0.0'} - vue-template-compiler@2.7.16: - resolution: {integrity: sha512-AYbUWAJHLGGQM7+cNTELw+KsOG9nl2CnSv467WobS5Cv9uk3wFcnr1Etsz2sEIHEZvw1U+o9mRlEO6QbZvUPGQ==} - - vue-tsc@1.8.27: - resolution: {integrity: sha512-WesKCAZCRAbmmhuGl3+VrdWItEvfoFIPXOvUJkjULi+x+6G/Dy69yO3TBRJDr9eUlmsNAwVmxsNZxvHKzbkKdg==} - hasBin: true - peerDependencies: - typescript: '*' - w3c-xmlserializer@5.0.0: resolution: {integrity: sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==} engines: {node: '>=18'} @@ -15901,10 +15793,6 @@ packages: resolution: {integrity: sha512-AmboGZEnZoIcVCzSlkLEmNFEqJN+IwgshJ5S7pi30uNUTce4LvWkifQzsQRxnWj47G8gkqZxlyGlyQplsnIS7w==} hasBin: true - watchpack@2.4.0: - resolution: {integrity: sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==} - engines: {node: '>=10.13.0'} - watchpack@2.4.2: resolution: {integrity: sha512-TnbFSbcOCcDgjZ4piURLCbJ3nJhznVh9kw6F6iokjiFPl8ONxe9A6nMDVXDiNbrSfLILs6vB07F7wLBrwPYzJw==} engines: {node: '>=10.13.0'} @@ -15915,9 +15803,9 @@ packages: wcwidth@1.0.1: resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==} - web-ext@7.12.0: - resolution: {integrity: sha512-h+uWOYBlHlPKy5CqxuZKocgOdL8J7I4ctMw/rAGbQl7jq7tr+NmY/Lhh2FPMSlJ1Y0T2VeUqwBVighK0MM1+zA==} - engines: {node: '>=14.0.0', npm: '>=6.9.0'} + web-ext@8.3.0: + resolution: {integrity: sha512-mXSOiDtmm3n0KNpSuQ65fJpypAoNLAmZv3QkdlVbJ6etn0BK+hl/k+tjHefSIKdbzGUIeFbhn2oxWMe9Tdyrdg==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true web-namespaces@2.0.1: @@ -16135,6 +16023,9 @@ packages: whatwg-url@5.0.0: resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} + when-exit@2.1.3: + resolution: {integrity: sha512-uVieSTccFIr/SFQdFWN/fFaQYmV37OKtuaGphMAzi4DmmUlrvRBJW5WSLkHyjNQY/ePJMz3LoiX9R3yy1Su6Hw==} + when@3.7.7: resolution: {integrity: sha512-9lFZp/KHoqH6bPKjbWqa+3Dg/K/r2v0X/3/G2x4DBGchVS2QX2VXL3cZV994WQVnTM1/PD71Az25nAzryEUugw==} @@ -16182,6 +16073,10 @@ packages: resolution: {integrity: sha512-o0cyEG0e8GPzT4iGHphIOh0cJOV8fivsXxddQasHPHfoZf1ZexrfeA21w2NaEN1RHE+fXlfISmOE8R9N3u3Qig==} engines: {node: '>=12'} + widest-line@5.0.0: + resolution: {integrity: sha512-c9bZp7b5YtRj2wOe6dlj32MK+Bx/M/d+9VB2SHM1OtsUHR0aV0tdP6DWh/iMt0kWi1t5g1Iudu6hQRNd1A4PVA==} + engines: {node: '>=18'} + wildcard@2.0.1: resolution: {integrity: sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==} @@ -16248,8 +16143,8 @@ packages: resolution: {integrity: sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==} engines: {node: '>=18'} - xml2js@0.5.0: - resolution: {integrity: sha512-drPFnkQJik/O+uPKpqSgr22mpuFHqKdbS835iAQrUC73L2F5WkboIRd63ai/2Yg6I1jzifPFKH2NTK+cfglkIA==} + xml2js@0.6.2: + resolution: {integrity: sha512-T4rieHaC1EXcES0Kxxj4JWgaUQHDk+qwHcYOCFHfiwKz7tOVPLq7Hjq9dM1WCMhylqMEfP7hMcOIChvotiZegA==} engines: {node: '>=4.0.0'} xmlbuilder@11.0.1: @@ -16296,10 +16191,6 @@ packages: resolution: {integrity: sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==} engines: {node: '>=8'} - yargs@17.7.1: - resolution: {integrity: sha512-cwiTb08Xuv5fqF4AovYacTFNxk62th7LKJ6BL9IGUpTJrWoU7/7WdQGTP2SjKf1dUNBGzDd28p/Yfs/GI6JrLw==} - engines: {node: '>=12'} - yargs@17.7.2: resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} engines: {node: '>=12'} @@ -16326,11 +16217,6 @@ packages: yup@1.4.0: resolution: {integrity: sha512-wPbgkJRCqIf+OHyiTBQoJiP5PFuAXaWiJK6AmYkzQAh5/c2K9hzSApBZG5wV9KoKSePF7sAxmNSvh/13YHkFDg==} - z-schema@5.0.5: - resolution: {integrity: sha512-D7eujBWkLa3p2sIpJA0d1pr7es+a7m0vFAnZLlCEKq/Ij2k0MLi9Br2UPxoxdYystm5K1yeBGzub0FlYUEWj2Q==} - engines: {node: '>=8.0.0'} - hasBin: true - zip-dir@2.0.0: resolution: {integrity: sha512-uhlsJZWz26FLYXOD6WVuq+fIcZ3aBPGo/cFdiLlv3KNwpa52IF3ISV8fLhQLiqVu5No3VhlqlgthN6gehil1Dg==} @@ -17577,10 +17463,6 @@ snapshots: core-js-pure: 3.38.1 regenerator-runtime: 0.14.1 - '@babel/runtime@7.21.0': - dependencies: - regenerator-runtime: 0.13.11 - '@babel/runtime@7.25.6': dependencies: regenerator-runtime: 0.14.1 @@ -18037,7 +17919,7 @@ snapshots: '@devicefarmer/adbkit-monkey@1.2.1': {} - '@devicefarmer/adbkit@3.2.3': + '@devicefarmer/adbkit@3.2.6': dependencies: '@devicefarmer/adbkit-logcat': 2.1.3 '@devicefarmer/adbkit-monkey': 1.2.1 @@ -18066,7 +17948,7 @@ snapshots: transitivePeerDependencies: - '@algolia/client-search' - '@docusaurus/core@3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16)': + '@docusaurus/core@3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)': dependencies: '@babel/core': 7.25.2 '@babel/generator': 7.25.6 @@ -18118,7 +18000,7 @@ snapshots: postcss-loader: 7.3.4(postcss@8.4.47)(typescript@5.6.2)(webpack@5.95.0) prompts: 2.4.2 react: 18.3.1 - react-dev-utils: 12.0.1(eslint@8.57.1)(typescript@5.6.2)(vue-template-compiler@2.7.16)(webpack@5.95.0) + react-dev-utils: 12.0.1(eslint@8.57.1)(typescript@5.6.2)(webpack@5.95.0) react-dom: 18.3.1(react@18.3.1) react-helmet-async: 1.3.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react-loadable: '@docusaurus/react-loadable@6.0.0(react@18.3.1)' @@ -18225,13 +18107,13 @@ snapshots: - uglify-js - webpack-cli - '@docusaurus/plugin-content-blog@3.5.2(@docusaurus/plugin-content-docs@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16)': + '@docusaurus/plugin-content-blog@3.5.2(@docusaurus/plugin-content-docs@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)': dependencies: - '@docusaurus/core': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) + '@docusaurus/core': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2) '@docusaurus/logger': 3.5.2 '@docusaurus/mdx-loader': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2) - '@docusaurus/plugin-content-docs': 3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) - '@docusaurus/theme-common': 3.5.2(@docusaurus/plugin-content-docs@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16))(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2) + '@docusaurus/plugin-content-docs': 3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2) + '@docusaurus/theme-common': 3.5.2(@docusaurus/plugin-content-docs@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2))(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2) '@docusaurus/types': 3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@docusaurus/utils': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.6.2) '@docusaurus/utils-common': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) @@ -18267,13 +18149,13 @@ snapshots: - vue-template-compiler - webpack-cli - '@docusaurus/plugin-content-docs@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16)': + '@docusaurus/plugin-content-docs@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)': dependencies: - '@docusaurus/core': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) + '@docusaurus/core': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2) '@docusaurus/logger': 3.5.2 '@docusaurus/mdx-loader': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2) '@docusaurus/module-type-aliases': 3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@docusaurus/theme-common': 3.5.2(@docusaurus/plugin-content-docs@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16))(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2) + '@docusaurus/theme-common': 3.5.2(@docusaurus/plugin-content-docs@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2))(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2) '@docusaurus/types': 3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@docusaurus/utils': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.6.2) '@docusaurus/utils-common': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) @@ -18307,9 +18189,9 @@ snapshots: - vue-template-compiler - webpack-cli - '@docusaurus/plugin-content-pages@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16)': + '@docusaurus/plugin-content-pages@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)': dependencies: - '@docusaurus/core': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) + '@docusaurus/core': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2) '@docusaurus/mdx-loader': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2) '@docusaurus/types': 3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@docusaurus/utils': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.6.2) @@ -18338,9 +18220,9 @@ snapshots: - vue-template-compiler - webpack-cli - '@docusaurus/plugin-debug@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16)': + '@docusaurus/plugin-debug@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)': dependencies: - '@docusaurus/core': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) + '@docusaurus/core': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2) '@docusaurus/types': 3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@docusaurus/utils': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.6.2) fs-extra: 11.2.0 @@ -18367,9 +18249,9 @@ snapshots: - vue-template-compiler - webpack-cli - '@docusaurus/plugin-google-analytics@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16)': + '@docusaurus/plugin-google-analytics@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)': dependencies: - '@docusaurus/core': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) + '@docusaurus/core': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2) '@docusaurus/types': 3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@docusaurus/utils-validation': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.6.2) react: 18.3.1 @@ -18394,9 +18276,9 @@ snapshots: - vue-template-compiler - webpack-cli - '@docusaurus/plugin-google-gtag@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16)': + '@docusaurus/plugin-google-gtag@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)': dependencies: - '@docusaurus/core': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) + '@docusaurus/core': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2) '@docusaurus/types': 3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@docusaurus/utils-validation': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.6.2) '@types/gtag.js': 0.0.12 @@ -18422,9 +18304,9 @@ snapshots: - vue-template-compiler - webpack-cli - '@docusaurus/plugin-google-tag-manager@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16)': + '@docusaurus/plugin-google-tag-manager@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)': dependencies: - '@docusaurus/core': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) + '@docusaurus/core': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2) '@docusaurus/types': 3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@docusaurus/utils-validation': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.6.2) react: 18.3.1 @@ -18449,9 +18331,9 @@ snapshots: - vue-template-compiler - webpack-cli - '@docusaurus/plugin-sitemap@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16)': + '@docusaurus/plugin-sitemap@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)': dependencies: - '@docusaurus/core': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) + '@docusaurus/core': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2) '@docusaurus/logger': 3.5.2 '@docusaurus/types': 3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@docusaurus/utils': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.6.2) @@ -18481,20 +18363,20 @@ snapshots: - vue-template-compiler - webpack-cli - '@docusaurus/preset-classic@3.5.2(@algolia/client-search@4.24.0)(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@types/react@18.3.9)(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16)': - dependencies: - '@docusaurus/core': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) - '@docusaurus/plugin-content-blog': 3.5.2(@docusaurus/plugin-content-docs@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) - '@docusaurus/plugin-content-docs': 3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) - '@docusaurus/plugin-content-pages': 3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) - '@docusaurus/plugin-debug': 3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) - '@docusaurus/plugin-google-analytics': 3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) - '@docusaurus/plugin-google-gtag': 3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) - '@docusaurus/plugin-google-tag-manager': 3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) - '@docusaurus/plugin-sitemap': 3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) - '@docusaurus/theme-classic': 3.5.2(@types/react@18.3.9)(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) - '@docusaurus/theme-common': 3.5.2(@docusaurus/plugin-content-docs@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16))(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2) - '@docusaurus/theme-search-algolia': 3.5.2(@algolia/client-search@4.24.0)(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@types/react@18.3.9)(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) + '@docusaurus/preset-classic@3.5.2(@algolia/client-search@4.24.0)(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@types/react@18.3.9)(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)': + dependencies: + '@docusaurus/core': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2) + '@docusaurus/plugin-content-blog': 3.5.2(@docusaurus/plugin-content-docs@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2) + '@docusaurus/plugin-content-docs': 3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2) + '@docusaurus/plugin-content-pages': 3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2) + '@docusaurus/plugin-debug': 3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2) + '@docusaurus/plugin-google-analytics': 3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2) + '@docusaurus/plugin-google-gtag': 3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2) + '@docusaurus/plugin-google-tag-manager': 3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2) + '@docusaurus/plugin-sitemap': 3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2) + '@docusaurus/theme-classic': 3.5.2(@types/react@18.3.9)(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2) + '@docusaurus/theme-common': 3.5.2(@docusaurus/plugin-content-docs@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2))(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2) + '@docusaurus/theme-search-algolia': 3.5.2(@algolia/client-search@4.24.0)(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@types/react@18.3.9)(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2) '@docusaurus/types': 3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) @@ -18535,15 +18417,15 @@ snapshots: transitivePeerDependencies: - supports-color - '@docusaurus/theme-classic@3.5.2(@types/react@18.3.9)(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16)': + '@docusaurus/theme-classic@3.5.2(@types/react@18.3.9)(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)': dependencies: - '@docusaurus/core': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) + '@docusaurus/core': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2) '@docusaurus/mdx-loader': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2) '@docusaurus/module-type-aliases': 3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@docusaurus/plugin-content-blog': 3.5.2(@docusaurus/plugin-content-docs@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) - '@docusaurus/plugin-content-docs': 3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) - '@docusaurus/plugin-content-pages': 3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) - '@docusaurus/theme-common': 3.5.2(@docusaurus/plugin-content-docs@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16))(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2) + '@docusaurus/plugin-content-blog': 3.5.2(@docusaurus/plugin-content-docs@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2) + '@docusaurus/plugin-content-docs': 3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2) + '@docusaurus/plugin-content-pages': 3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2) + '@docusaurus/theme-common': 3.5.2(@docusaurus/plugin-content-docs@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2))(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2) '@docusaurus/theme-translations': 3.5.2 '@docusaurus/types': 3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@docusaurus/utils': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.6.2) @@ -18583,11 +18465,11 @@ snapshots: - vue-template-compiler - webpack-cli - '@docusaurus/theme-common@3.5.2(@docusaurus/plugin-content-docs@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16))(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)': + '@docusaurus/theme-common@3.5.2(@docusaurus/plugin-content-docs@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2))(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)': dependencies: '@docusaurus/mdx-loader': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2) '@docusaurus/module-type-aliases': 3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@docusaurus/plugin-content-docs': 3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) + '@docusaurus/plugin-content-docs': 3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2) '@docusaurus/utils': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.6.2) '@docusaurus/utils-common': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) '@types/history': 4.7.11 @@ -18609,10 +18491,10 @@ snapshots: - uglify-js - webpack-cli - '@docusaurus/theme-live-codeblock@3.5.2(@docusaurus/plugin-content-docs@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16))(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16)': + '@docusaurus/theme-live-codeblock@3.5.2(@docusaurus/plugin-content-docs@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2))(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)': dependencies: - '@docusaurus/core': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) - '@docusaurus/theme-common': 3.5.2(@docusaurus/plugin-content-docs@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16))(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2) + '@docusaurus/core': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2) + '@docusaurus/theme-common': 3.5.2(@docusaurus/plugin-content-docs@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2))(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2) '@docusaurus/theme-translations': 3.5.2 '@docusaurus/utils-validation': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.6.2) '@philpl/buble': 0.19.7 @@ -18643,11 +18525,11 @@ snapshots: - vue-template-compiler - webpack-cli - '@docusaurus/theme-mermaid@3.5.2(@docusaurus/plugin-content-docs@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16)': + '@docusaurus/theme-mermaid@3.5.2(@docusaurus/plugin-content-docs@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)': dependencies: - '@docusaurus/core': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) + '@docusaurus/core': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2) '@docusaurus/module-type-aliases': 3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@docusaurus/theme-common': 3.5.2(@docusaurus/plugin-content-docs@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16))(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2) + '@docusaurus/theme-common': 3.5.2(@docusaurus/plugin-content-docs@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2))(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2) '@docusaurus/types': 3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@docusaurus/utils-validation': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.6.2) mermaid: 10.9.3 @@ -18674,13 +18556,13 @@ snapshots: - vue-template-compiler - webpack-cli - '@docusaurus/theme-search-algolia@3.5.2(@algolia/client-search@4.24.0)(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@types/react@18.3.9)(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16)': + '@docusaurus/theme-search-algolia@3.5.2(@algolia/client-search@4.24.0)(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@types/react@18.3.9)(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)': dependencies: '@docsearch/react': 3.6.1(@algolia/client-search@4.24.0)(@types/react@18.3.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@docusaurus/core': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) + '@docusaurus/core': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2) '@docusaurus/logger': 3.5.2 - '@docusaurus/plugin-content-docs': 3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16) - '@docusaurus/theme-common': 3.5.2(@docusaurus/plugin-content-docs@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(vue-template-compiler@2.7.16))(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2) + '@docusaurus/plugin-content-docs': 3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2) + '@docusaurus/theme-common': 3.5.2(@docusaurus/plugin-content-docs@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2))(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2) '@docusaurus/theme-translations': 3.5.2 '@docusaurus/utils': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.6.2) '@docusaurus/utils-validation': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.6.2) @@ -20144,7 +20026,7 @@ snapshots: jju: 1.4.0 js-yaml: 4.1.0 - '@mdn/browser-compat-data@5.5.29': {} + '@mdn/browser-compat-data@5.6.0': {} '@mdx-js/mdx@3.0.1': dependencies: @@ -20213,23 +20095,23 @@ snapshots: '@metamask/safe-event-emitter@3.1.1': {} - '@microsoft/api-extractor-model@7.28.13(@types/node@20.16.9)': + '@microsoft/api-extractor-model@7.30.1(@types/node@20.16.9)': dependencies: - '@microsoft/tsdoc': 0.14.2 - '@microsoft/tsdoc-config': 0.16.2 - '@rushstack/node-core-library': 4.0.2(@types/node@20.16.9) + '@microsoft/tsdoc': 0.15.1 + '@microsoft/tsdoc-config': 0.17.1 + '@rushstack/node-core-library': 5.10.1(@types/node@20.16.9) transitivePeerDependencies: - '@types/node' - '@microsoft/api-extractor@7.43.0(@types/node@20.16.9)': + '@microsoft/api-extractor@7.48.1(@types/node@20.16.9)': dependencies: - '@microsoft/api-extractor-model': 7.28.13(@types/node@20.16.9) - '@microsoft/tsdoc': 0.14.2 - '@microsoft/tsdoc-config': 0.16.2 - '@rushstack/node-core-library': 4.0.2(@types/node@20.16.9) - '@rushstack/rig-package': 0.5.2 - '@rushstack/terminal': 0.10.0(@types/node@20.16.9) - '@rushstack/ts-command-line': 4.19.1(@types/node@20.16.9) + '@microsoft/api-extractor-model': 7.30.1(@types/node@20.16.9) + '@microsoft/tsdoc': 0.15.1 + '@microsoft/tsdoc-config': 0.17.1 + '@rushstack/node-core-library': 5.10.1(@types/node@20.16.9) + '@rushstack/rig-package': 0.5.3 + '@rushstack/terminal': 0.14.4(@types/node@20.16.9) + '@rushstack/ts-command-line': 4.23.2(@types/node@20.16.9) lodash: 4.17.21 minimatch: 3.0.8 resolve: 1.22.8 @@ -20246,8 +20128,17 @@ snapshots: jju: 1.4.0 resolve: 1.19.0 + '@microsoft/tsdoc-config@0.17.1': + dependencies: + '@microsoft/tsdoc': 0.15.1 + ajv: 8.12.0 + jju: 1.4.0 + resolve: 1.22.8 + '@microsoft/tsdoc@0.14.2': {} + '@microsoft/tsdoc@0.15.1': {} + '@mswjs/interceptors@0.35.8': dependencies: '@open-draft/deferred-promise': 2.2.0 @@ -21665,32 +21556,34 @@ snapshots: '@rushstack/eslint-patch@1.10.4': {} - '@rushstack/node-core-library@4.0.2(@types/node@20.16.9)': + '@rushstack/node-core-library@5.10.1(@types/node@20.16.9)': dependencies: + ajv: 8.13.0 + ajv-draft-04: 1.0.0(ajv@8.13.0) + ajv-formats: 3.0.1 fs-extra: 7.0.1 import-lazy: 4.0.0 jju: 1.4.0 resolve: 1.22.8 semver: 7.5.4 - z-schema: 5.0.5 optionalDependencies: '@types/node': 20.16.9 - '@rushstack/rig-package@0.5.2': + '@rushstack/rig-package@0.5.3': dependencies: resolve: 1.22.8 strip-json-comments: 3.1.1 - '@rushstack/terminal@0.10.0(@types/node@20.16.9)': + '@rushstack/terminal@0.14.4(@types/node@20.16.9)': dependencies: - '@rushstack/node-core-library': 4.0.2(@types/node@20.16.9) + '@rushstack/node-core-library': 5.10.1(@types/node@20.16.9) supports-color: 8.1.1 optionalDependencies: '@types/node': 20.16.9 - '@rushstack/ts-command-line@4.19.1(@types/node@20.16.9)': + '@rushstack/ts-command-line@4.23.2(@types/node@20.16.9)': dependencies: - '@rushstack/terminal': 0.10.0(@types/node@20.16.9) + '@rushstack/terminal': 0.14.4(@types/node@20.16.9) '@types/argparse': 1.0.38 argparse: 1.0.10 string-argv: 0.3.2 @@ -21723,35 +21616,35 @@ snapshots: '@noble/hashes': 1.5.0 '@scure/base': 1.1.9 - '@sentry-internal/feedback@7.119.0': + '@sentry-internal/feedback@7.120.2': dependencies: - '@sentry/core': 7.119.0 - '@sentry/types': 7.119.0 - '@sentry/utils': 7.119.0 + '@sentry/core': 7.120.2 + '@sentry/types': 7.120.2 + '@sentry/utils': 7.120.2 - '@sentry-internal/replay-canvas@7.119.0': + '@sentry-internal/replay-canvas@7.120.2': dependencies: - '@sentry/core': 7.119.0 - '@sentry/replay': 7.119.0 - '@sentry/types': 7.119.0 - '@sentry/utils': 7.119.0 + '@sentry/core': 7.120.2 + '@sentry/replay': 7.120.2 + '@sentry/types': 7.120.2 + '@sentry/utils': 7.120.2 - '@sentry-internal/tracing@7.119.0': + '@sentry-internal/tracing@7.120.2': dependencies: - '@sentry/core': 7.119.0 - '@sentry/types': 7.119.0 - '@sentry/utils': 7.119.0 + '@sentry/core': 7.120.2 + '@sentry/types': 7.120.2 + '@sentry/utils': 7.120.2 - '@sentry/browser@7.119.0': + '@sentry/browser@7.120.2': dependencies: - '@sentry-internal/feedback': 7.119.0 - '@sentry-internal/replay-canvas': 7.119.0 - '@sentry-internal/tracing': 7.119.0 - '@sentry/core': 7.119.0 - '@sentry/integrations': 7.119.0 - '@sentry/replay': 7.119.0 - '@sentry/types': 7.119.0 - '@sentry/utils': 7.119.0 + '@sentry-internal/feedback': 7.120.2 + '@sentry-internal/replay-canvas': 7.120.2 + '@sentry-internal/tracing': 7.120.2 + '@sentry/core': 7.120.2 + '@sentry/integrations': 7.120.2 + '@sentry/replay': 7.120.2 + '@sentry/types': 7.120.2 + '@sentry/utils': 7.120.2 '@sentry/cli@1.77.3': dependencies: @@ -21778,17 +21671,22 @@ snapshots: '@sentry/types': 7.119.0 '@sentry/utils': 7.119.0 + '@sentry/core@7.120.2': + dependencies: + '@sentry/types': 7.120.2 + '@sentry/utils': 7.120.2 + '@sentry/hub@6.19.7': dependencies: '@sentry/types': 6.19.7 '@sentry/utils': 6.19.7 tslib: 1.14.1 - '@sentry/integrations@7.119.0': + '@sentry/integrations@7.120.2': dependencies: - '@sentry/core': 7.119.0 - '@sentry/types': 7.119.0 - '@sentry/utils': 7.119.0 + '@sentry/core': 7.120.2 + '@sentry/types': 7.120.2 + '@sentry/utils': 7.120.2 localforage: 1.10.0 '@sentry/minimal@6.19.7': @@ -21812,24 +21710,26 @@ snapshots: '@sentry/react@7.119.0(react@18.3.1)': dependencies: - '@sentry/browser': 7.119.0 + '@sentry/browser': 7.120.2 '@sentry/core': 7.119.0 '@sentry/types': 7.119.0 '@sentry/utils': 7.119.0 hoist-non-react-statics: 3.3.2 react: 18.3.1 - '@sentry/replay@7.119.0': + '@sentry/replay@7.120.2': dependencies: - '@sentry-internal/tracing': 7.119.0 - '@sentry/core': 7.119.0 - '@sentry/types': 7.119.0 - '@sentry/utils': 7.119.0 + '@sentry-internal/tracing': 7.120.2 + '@sentry/core': 7.120.2 + '@sentry/types': 7.120.2 + '@sentry/utils': 7.120.2 '@sentry/types@6.19.7': {} '@sentry/types@7.119.0': {} + '@sentry/types@7.120.2': {} + '@sentry/utils@6.19.7': dependencies: '@sentry/types': 6.19.7 @@ -21839,6 +21739,10 @@ snapshots: dependencies: '@sentry/types': 7.119.0 + '@sentry/utils@7.120.2': + dependencies: + '@sentry/types': 7.120.2 + '@sentry/webpack-plugin@1.21.0': dependencies: '@sentry/cli': 1.77.3 @@ -21901,7 +21805,7 @@ snapshots: '@size-limit/esbuild@11.1.5(size-limit@11.1.5)': dependencies: esbuild: 0.23.1 - nanoid: 5.0.7 + nanoid: 5.0.9 size-limit: 11.1.5 '@size-limit/file@11.1.5(size-limit@11.1.5)': @@ -23948,18 +23852,17 @@ snapshots: loupe: 3.1.1 tinyrainbow: 1.2.0 - '@volar/language-core@1.11.1': + '@volar/language-core@2.4.11': dependencies: - '@volar/source-map': 1.11.1 + '@volar/source-map': 2.4.11 - '@volar/source-map@1.11.1': - dependencies: - muggle-string: 0.3.1 + '@volar/source-map@2.4.11': {} - '@volar/typescript@1.11.1': + '@volar/typescript@2.4.11': dependencies: - '@volar/language-core': 1.11.1 + '@volar/language-core': 2.4.11 path-browserify: 1.0.1 + vscode-uri: 3.0.8 '@vue/compiler-core@3.5.9': dependencies: @@ -23974,17 +23877,21 @@ snapshots: '@vue/compiler-core': 3.5.9 '@vue/shared': 3.5.9 - '@vue/language-core@1.8.27(typescript@5.6.2)': + '@vue/compiler-vue2@2.7.16': + dependencies: + de-indent: 1.0.2 + he: 1.2.0 + + '@vue/language-core@2.1.6(typescript@5.6.2)': dependencies: - '@volar/language-core': 1.11.1 - '@volar/source-map': 1.11.1 + '@volar/language-core': 2.4.11 '@vue/compiler-dom': 3.5.9 + '@vue/compiler-vue2': 2.7.16 '@vue/shared': 3.5.9 computeds: 0.0.1 minimatch: 9.0.5 - muggle-string: 0.3.1 + muggle-string: 0.4.1 path-browserify: 1.0.1 - vue-template-compiler: 2.7.16 optionalDependencies: typescript: 5.6.2 @@ -24202,13 +24109,15 @@ snapshots: acorn@8.12.1: {} - addons-linter@6.28.0(body-parser@1.20.3)(node-fetch@3.3.1): + acorn@8.14.0: {} + + addons-linter@7.1.0(body-parser@1.20.3): dependencies: '@fluent/syntax': 0.19.0 - '@mdn/browser-compat-data': 5.5.29 + '@mdn/browser-compat-data': 5.6.0 addons-moz-compare: 1.3.0 - addons-scanner-utils: 9.10.1(body-parser@1.20.3)(node-fetch@3.3.1) - ajv: 8.13.0 + addons-scanner-utils: 9.11.0(body-parser@1.20.3) + ajv: 8.17.1 chalk: 4.1.2 cheerio: 1.0.0-rc.12 columnify: 1.6.0 @@ -24217,21 +24126,17 @@ snapshots: eslint: 8.57.1 eslint-plugin-no-unsanitized: 4.0.2(eslint@8.57.1) eslint-visitor-keys: 4.0.0 - espree: 10.0.1 + espree: 10.1.0 esprima: 4.0.1 fast-json-patch: 3.1.1 - glob: 10.4.1 image-size: 1.1.1 - is-mergeable-object: 1.1.1 jed: 1.1.1 json-merge-patch: 1.0.2 os-locale: 5.0.0 pino: 8.20.0 relaxed-json: 1.0.3 - semver: 7.6.2 - sha.js: 2.4.11 + semver: 7.6.3 source-map-support: 0.5.21 - tosource: 1.0.0 upath: 2.0.1 yargs: 17.7.2 yauzl: 2.10.0 @@ -24244,7 +24149,7 @@ snapshots: addons-moz-compare@1.3.0: {} - addons-scanner-utils@9.10.1(body-parser@1.20.3)(node-fetch@3.3.1): + addons-scanner-utils@9.11.0(body-parser@1.20.3): dependencies: '@types/yauzl': 2.10.3 common-tags: 1.8.2 @@ -24254,7 +24159,6 @@ snapshots: yauzl: 2.10.0 optionalDependencies: body-parser: 1.20.3 - node-fetch: 3.3.1 address@1.2.2: {} @@ -24279,10 +24183,18 @@ snapshots: clean-stack: 2.2.0 indent-string: 4.0.0 + ajv-draft-04@1.0.0(ajv@8.13.0): + optionalDependencies: + ajv: 8.13.0 + ajv-formats@2.1.1: dependencies: ajv: 8.17.1 + ajv-formats@3.0.1: + dependencies: + ajv: 8.17.1 + ajv-keywords@3.5.2(ajv@6.12.6): dependencies: ajv: 6.12.6 @@ -24493,18 +24405,12 @@ snapshots: asap@2.0.6: {} - asn1@0.2.6: - dependencies: - safer-buffer: 2.1.2 - asn1js@3.0.5: dependencies: pvtsutils: 1.3.5 pvutils: 1.1.3 tslib: 2.7.0 - assert-plus@1.0.0: {} - assert@2.1.0: dependencies: call-bind: 1.0.7 @@ -24533,6 +24439,11 @@ snapshots: atomic-sleep@1.0.0: {} + atomically@2.0.3: + dependencies: + stubborn-fs: 1.2.5 + when-exit: 2.1.3 + auto-bind@4.0.0: {} autoprefixer@10.4.20(postcss@8.4.47): @@ -24549,15 +24460,13 @@ snapshots: dependencies: possible-typed-array-names: 1.0.0 - aws-sign2@0.7.0: {} - - aws4@1.13.2: {} - axe-core@4.10.0: {} - axios@0.26.1: + axios@0.28.0: dependencies: follow-redirects: 1.15.9(debug@4.3.7) + form-data: 4.0.0 + proxy-from-env: 1.1.0 transitivePeerDependencies: - debug @@ -24718,10 +24627,6 @@ snapshots: batch@0.6.1: {} - bcrypt-pbkdf@1.0.2: - dependencies: - tweetnacl: 0.14.5 - bech32@2.0.0: {} better-opn@3.0.2: @@ -24742,7 +24647,7 @@ snapshots: binary-install@1.1.0: dependencies: - axios: 0.26.1 + axios: 0.28.0 rimraf: 3.0.2 tar: 6.2.1 transitivePeerDependencies: @@ -24804,6 +24709,17 @@ snapshots: widest-line: 4.0.1 wrap-ansi: 8.1.0 + boxen@8.0.1: + dependencies: + ansi-align: 3.0.1 + camelcase: 8.0.0 + chalk: 5.3.0 + cli-boxes: 3.0.0 + string-width: 7.2.0 + type-fest: 4.26.1 + widest-line: 5.0.0 + wrap-ansi: 9.0.0 + bplist-parser@0.2.0: dependencies: big-integer: 1.6.52 @@ -24848,8 +24764,6 @@ snapshots: buffer-crc32@0.2.13: {} - buffer-equal-constant-time@1.0.1: {} - buffer-from@1.1.2: {} buffer@5.7.1: @@ -24864,12 +24778,9 @@ snapshots: builtins@1.0.3: {} - bunyan@1.8.15: - optionalDependencies: - dtrace-provider: 0.8.8 - moment: 2.30.1 - mv: 2.1.1 - safe-json-stringify: 1.2.0 + bundle-name@3.0.0: + dependencies: + run-applescript: 5.0.0 busboy@1.6.0: dependencies: @@ -24906,11 +24817,6 @@ snapshots: normalize-url: 8.0.1 responselike: 3.0.0 - call-bind-apply-helpers@1.0.1: - dependencies: - es-errors: 1.3.0 - function-bind: 1.1.2 - call-bind@1.0.7: dependencies: es-define-property: 1.0.0 @@ -24919,13 +24825,6 @@ snapshots: get-intrinsic: 1.2.4 set-function-length: 1.2.2 - call-bind@1.0.8: - dependencies: - call-bind-apply-helpers: 1.0.1 - es-define-property: 1.0.0 - get-intrinsic: 1.2.6 - set-function-length: 1.2.2 - callsites@3.1.0: {} camel-case@4.1.2: @@ -24941,6 +24840,8 @@ snapshots: camelcase@7.0.1: {} + camelcase@8.0.0: {} + caniuse-api@3.0.0: dependencies: browserslist: 4.24.0 @@ -24961,8 +24862,6 @@ snapshots: ansicolors: 0.3.2 redeyed: 2.1.1 - caseless@0.12.0: {} - ccount@2.0.1: {} chai@5.1.1: @@ -25082,12 +24981,12 @@ snapshots: chromatic@11.10.4: {} - chrome-launcher@0.15.1: + chrome-launcher@1.1.2: dependencies: '@types/node': 20.16.9 escape-string-regexp: 4.0.0 is-wsl: 2.2.0 - lighthouse-logger: 1.4.2 + lighthouse-logger: 2.0.1 transitivePeerDependencies: - supports-color @@ -25296,6 +25195,8 @@ snapshots: commondir@1.0.1: {} + compare-versions@6.1.1: {} + component-emitter@1.3.1: {} compressible@2.0.18: @@ -25352,6 +25253,8 @@ snapshots: confbox@0.1.7: {} + confbox@0.1.8: {} + config-chain@1.1.13: dependencies: ini: 1.3.8 @@ -25365,6 +25268,13 @@ snapshots: write-file-atomic: 3.0.3 xdg-basedir: 5.1.0 + configstore@7.0.0: + dependencies: + atomically: 2.0.3 + dot-prop: 9.0.0 + graceful-fs: 4.2.11 + xdg-basedir: 5.1.0 + connect-history-api-fallback@2.0.0: {} consola@2.15.3: {} @@ -25427,12 +25337,8 @@ snapshots: core-js-pure@3.38.1: {} - core-js@3.29.0: {} - core-js@3.38.1: {} - core-util-is@1.0.2: {} - core-util-is@1.0.3: {} cors@2.8.5: @@ -25893,14 +25799,8 @@ snapshots: damerau-levenshtein@1.0.8: {} - dashdash@1.14.1: - dependencies: - assert-plus: 1.0.0 - dashify@2.0.0: {} - data-uri-to-buffer@4.0.1: {} - data-urls@5.0.0: dependencies: whatwg-mimetype: 4.0.0 @@ -26001,10 +25901,6 @@ snapshots: deep-object-diff@1.1.9: {} - deepcopy@2.1.0: - dependencies: - type-detect: 4.1.0 - deepmerge@2.2.1: {} deepmerge@4.3.1: {} @@ -26014,6 +25910,13 @@ snapshots: bplist-parser: 0.2.0 untildify: 4.0.0 + default-browser@4.0.0: + dependencies: + bundle-name: 3.0.0 + default-browser-id: 3.0.0 + execa: 7.2.0 + titleize: 3.0.0 + default-gateway@6.0.3: dependencies: execa: 5.1.1 @@ -26032,6 +25935,8 @@ snapshots: define-lazy-prop@2.0.0: {} + define-lazy-prop@3.0.0: {} + define-properties@1.2.1: dependencies: define-data-property: 1.1.4 @@ -26206,6 +26111,10 @@ snapshots: dependencies: is-obj: 2.0.0 + dot-prop@9.0.0: + dependencies: + type-fest: 4.26.1 + dotenv-expand@10.0.0: {} dotenv@16.4.5: {} @@ -26214,17 +26123,6 @@ snapshots: dset@3.1.4: {} - dtrace-provider@0.8.8: - dependencies: - nan: 2.20.0 - optional: true - - dunder-proto@1.0.0: - dependencies: - call-bind-apply-helpers: 1.0.1 - es-errors: 1.3.0 - gopd: 1.2.0 - duplexer@0.1.2: {} duplexify@3.7.1: @@ -26236,15 +26134,6 @@ snapshots: eastasianwidth@0.2.0: {} - ecc-jsbn@0.1.2: - dependencies: - jsbn: 0.1.1 - safer-buffer: 2.1.2 - - ecdsa-sig-formatter@1.0.11: - dependencies: - safe-buffer: 5.2.1 - ee-first@1.1.1: {} ejs@3.1.10: @@ -26354,8 +26243,6 @@ snapshots: dependencies: get-intrinsic: 1.2.4 - es-define-property@1.0.1: {} - es-errors@1.3.0: {} es-get-iterator@1.1.3: @@ -26413,8 +26300,6 @@ snapshots: es6-error@4.1.1: {} - es6-promisify@7.0.0: {} - esbuild-plugin-alias@0.2.1: {} esbuild-register@3.6.0(esbuild@0.18.20): @@ -26794,7 +26679,7 @@ snapshots: transitivePeerDependencies: - supports-color - espree@10.0.1: + espree@10.1.0: dependencies: acorn: 8.12.1 acorn-jsx: 5.3.2(acorn@8.12.1) @@ -26918,6 +26803,18 @@ snapshots: signal-exit: 3.0.7 strip-final-newline: 2.0.0 + execa@7.2.0: + dependencies: + cross-spawn: 7.0.5 + get-stream: 6.0.1 + human-signals: 4.3.1 + is-stream: 3.0.0 + merge-stream: 2.0.0 + npm-run-path: 5.3.0 + onetime: 6.0.0 + signal-exit: 3.0.7 + strip-final-newline: 3.0.0 + execa@8.0.1: dependencies: cross-spawn: 7.0.5 @@ -26961,7 +26858,7 @@ snapshots: methods: 1.1.2 on-finished: 2.4.1 parseurl: 1.3.3 - path-to-regexp: 0.1.10 + path-to-regexp: 0.1.12 proxy-addr: 2.0.7 qs: 6.13.0 range-parser: 1.2.1 @@ -27009,8 +26906,6 @@ snapshots: transitivePeerDependencies: - supports-color - extsprintf@1.3.0: {} - fast-decode-uri-component@1.0.1: {} fast-deep-equal@2.0.1: {} @@ -27097,11 +26992,6 @@ snapshots: dependencies: xml-js: 1.6.11 - fetch-blob@3.2.0: - dependencies: - node-domexception: 1.0.0 - web-streams-polyfill: 3.3.3 - fetch-retry@5.0.6: {} fflate@0.8.2: {} @@ -27189,13 +27079,13 @@ snapshots: locate-path: 7.2.0 path-exists: 5.0.0 - firefox-profile@4.3.2: + firefox-profile@4.7.0: dependencies: adm-zip: 0.5.16 - fs-extra: 9.0.1 - ini: 2.0.0 + fs-extra: 11.2.0 + ini: 4.1.3 minimist: 1.2.8 - xml2js: 0.5.0 + xml2js: 0.6.2 first-chunk-stream@3.0.0: {} @@ -27224,9 +27114,7 @@ snapshots: cross-spawn: 7.0.5 signal-exit: 4.1.0 - forever-agent@0.6.1: {} - - fork-ts-checker-webpack-plugin@6.5.3(eslint@8.57.1)(typescript@5.6.2)(vue-template-compiler@2.7.16)(webpack@5.95.0): + fork-ts-checker-webpack-plugin@6.5.3(eslint@8.57.1)(typescript@5.6.2)(webpack@5.95.0): dependencies: '@babel/code-frame': 7.24.7 '@types/json-schema': 7.0.15 @@ -27245,7 +27133,6 @@ snapshots: webpack: 5.95.0 optionalDependencies: eslint: 8.57.1 - vue-template-compiler: 2.7.16 fork-ts-checker-webpack-plugin@9.0.2(typescript@5.3.3)(webpack@5.94.0(@swc/core@1.7.28)): dependencies: @@ -27266,12 +27153,6 @@ snapshots: form-data-encoder@2.1.4: {} - form-data@2.3.3: - dependencies: - asynckit: 0.4.0 - combined-stream: 1.0.8 - mime-types: 2.1.35 - form-data@3.0.1: dependencies: asynckit: 0.4.0 @@ -27286,10 +27167,6 @@ snapshots: format@0.2.2: {} - formdata-polyfill@4.0.10: - dependencies: - fetch-blob: 3.2.0 - formidable@2.1.2: dependencies: dezalgo: 1.0.4 @@ -27333,12 +27210,6 @@ snapshots: jsonfile: 6.1.0 universalify: 2.0.1 - fs-extra@11.1.0: - dependencies: - graceful-fs: 4.2.11 - jsonfile: 6.1.0 - universalify: 2.0.1 - fs-extra@11.1.1: dependencies: graceful-fs: 4.2.11 @@ -27363,13 +27234,6 @@ snapshots: jsonfile: 4.0.0 universalify: 0.1.2 - fs-extra@9.0.1: - dependencies: - at-least-node: 1.0.0 - graceful-fs: 4.2.11 - jsonfile: 6.1.0 - universalify: 1.0.0 - fs-extra@9.1.0: dependencies: at-least-node: 1.0.0 @@ -27427,19 +27291,6 @@ snapshots: has-symbols: 1.0.3 hasown: 2.0.2 - get-intrinsic@1.2.6: - dependencies: - call-bind-apply-helpers: 1.0.1 - dunder-proto: 1.0.0 - es-define-property: 1.0.1 - es-errors: 1.3.0 - es-object-atoms: 1.0.0 - function-bind: 1.1.2 - gopd: 1.2.0 - has-symbols: 1.1.0 - hasown: 2.0.2 - math-intrinsics: 1.0.0 - get-nonce@1.0.1: {} get-npm-tarball-url@2.1.0: {} @@ -27468,10 +27319,6 @@ snapshots: dependencies: resolve-pkg-maps: 1.0.0 - getpass@0.1.7: - dependencies: - assert-plus: 1.0.0 - giget@1.2.3: dependencies: citty: 0.1.6 @@ -27514,14 +27361,6 @@ snapshots: minipass: 7.1.2 path-scurry: 1.11.1 - glob@10.4.1: - dependencies: - foreground-child: 3.3.0 - jackspeak: 3.4.3 - minimatch: 9.0.5 - minipass: 7.1.2 - path-scurry: 1.11.1 - glob@10.4.2: dependencies: foreground-child: 3.3.0 @@ -27540,15 +27379,6 @@ snapshots: package-json-from-dist: 1.0.1 path-scurry: 1.11.1 - glob@6.0.4: - dependencies: - inflight: 1.0.6 - inherits: 2.0.4 - minimatch: 3.1.2 - once: 1.4.0 - path-is-absolute: 1.0.1 - optional: true - glob@7.2.3: dependencies: fs.realpath: 1.0.0 @@ -27566,6 +27396,10 @@ snapshots: minimatch: 5.1.6 once: 1.4.0 + global-directory@4.0.1: + dependencies: + ini: 4.1.1 + global-dirs@3.0.1: dependencies: ini: 2.0.0 @@ -27629,8 +27463,6 @@ snapshots: dependencies: get-intrinsic: 1.2.4 - gopd@1.2.0: {} - got@12.6.1: dependencies: '@sindresorhus/is': 5.6.0 @@ -27783,13 +27615,6 @@ snapshots: webidl-conversions: 7.0.0 whatwg-mimetype: 3.0.0 - har-schema@2.0.0: {} - - har-validator@5.1.5: - dependencies: - ajv: 6.12.6 - har-schema: 2.0.0 - has-bigints@1.0.2: {} has-flag@3.0.0: {} @@ -27806,8 +27631,6 @@ snapshots: has-symbols@1.0.3: {} - has-symbols@1.1.0: {} - has-tostringtag@1.0.2: dependencies: has-symbols: 1.0.3 @@ -28162,12 +27985,6 @@ snapshots: transitivePeerDependencies: - debug - http-signature@1.2.0: - dependencies: - assert-plus: 1.0.0 - jsprim: 1.4.2 - sshpk: 1.18.0 - http2-wrapper@2.2.1: dependencies: quick-lru: 5.1.1 @@ -28200,6 +28017,8 @@ snapshots: human-signals@2.1.0: {} + human-signals@4.3.1: {} + human-signals@5.0.0: {} husky@9.1.6: {} @@ -28275,6 +28094,10 @@ snapshots: ini@2.0.0: {} + ini@4.1.1: {} + + ini@4.1.3: {} + inline-style-parser@0.1.1: {} inline-style-parser@0.2.4: {} @@ -28434,6 +28257,8 @@ snapshots: is-docker@2.2.1: {} + is-docker@3.0.0: {} + is-extendable@0.1.1: {} is-extglob@2.1.1: {} @@ -28466,11 +28291,22 @@ snapshots: is-hexadecimal@2.0.1: {} + is-in-ci@1.0.0: {} + + is-inside-container@1.0.0: + dependencies: + is-docker: 3.0.0 + is-installed-globally@0.4.0: dependencies: global-dirs: 3.0.1 is-path-inside: 3.0.3 + is-installed-globally@1.0.0: + dependencies: + global-directory: 4.0.1 + is-path-inside: 4.0.0 + is-interactive@1.0.0: {} is-lower-case@2.0.2: @@ -28479,8 +28315,6 @@ snapshots: is-map@2.0.3: {} - is-mergeable-object@1.1.1: {} - is-nan@1.3.2: dependencies: call-bind: 1.0.7 @@ -28506,6 +28340,8 @@ snapshots: is-path-inside@3.0.3: {} + is-path-inside@4.0.0: {} + is-plain-obj@3.0.0: {} is-plain-obj@4.1.0: {} @@ -28587,8 +28423,8 @@ snapshots: is-weakset@2.0.3: dependencies: - call-bind: 1.0.8 - get-intrinsic: 1.2.6 + call-bind: 1.0.7 + get-intrinsic: 1.2.4 is-windows@1.0.2: {} @@ -28614,8 +28450,6 @@ snapshots: dependencies: ws: 8.18.0 - isstream@0.1.2: {} - istanbul-lib-coverage@3.2.2: {} istanbul-lib-instrument@5.2.1: @@ -29026,7 +28860,7 @@ snapshots: '@sideway/formula': 3.0.1 '@sideway/pinpoint': 2.0.0 - jose@4.13.1: {} + jose@5.9.2: {} jose@5.9.3: {} @@ -29041,8 +28875,6 @@ snapshots: dependencies: argparse: 2.0.1 - jsbn@0.1.1: {} - jscodeshift@0.15.2(@babel/preset-env@7.25.4(@babel/core@7.25.2)): dependencies: '@babel/core': 7.25.2 @@ -29112,6 +28944,8 @@ snapshots: json-parse-even-better-errors@2.3.1: {} + json-parse-even-better-errors@3.0.2: {} + json-rpc-engine@6.1.0: dependencies: '@metamask/safe-event-emitter': 2.0.0 @@ -29129,12 +28963,8 @@ snapshots: json-schema-typed@7.0.3: {} - json-schema@0.4.0: {} - json-stable-stringify-without-jsonify@1.0.1: {} - json-stringify-safe@5.0.1: {} - json-to-pretty-yaml@1.2.2: dependencies: remedial: 1.0.8 @@ -29160,20 +28990,6 @@ snapshots: optionalDependencies: graceful-fs: 4.2.11 - jsonwebtoken@9.0.0: - dependencies: - jws: 3.2.2 - lodash: 4.17.21 - ms: 2.1.3 - semver: 7.6.3 - - jsprim@1.4.2: - dependencies: - assert-plus: 1.0.0 - extsprintf: 1.3.0 - json-schema: 0.4.0 - verror: 1.10.0 - jsx-ast-utils@3.3.5: dependencies: array-includes: 3.1.8 @@ -29188,17 +29004,6 @@ snapshots: readable-stream: 2.3.8 setimmediate: 1.0.5 - jwa@1.4.1: - dependencies: - buffer-equal-constant-time: 1.0.1 - ecdsa-sig-formatter: 1.0.11 - safe-buffer: 5.2.1 - - jws@3.2.2: - dependencies: - jwa: 1.4.1 - safe-buffer: 5.2.1 - katex@0.16.11: dependencies: commander: 8.3.0 @@ -29217,6 +29022,8 @@ snapshots: kolorist@1.8.0: {} + ky@1.7.3: {} + language-subtag-registry@0.3.23: {} language-tags@1.0.9: @@ -29227,6 +29034,10 @@ snapshots: dependencies: package-json: 8.1.1 + latest-version@9.0.0: + dependencies: + package-json: 10.0.1 + launch-editor@2.9.1: dependencies: picocolors: 1.1.0 @@ -29261,7 +29072,7 @@ snapshots: dependencies: immediate: 3.0.6 - lighthouse-logger@1.4.2: + lighthouse-logger@2.0.1: dependencies: debug: 2.6.9 marky: 1.2.5 @@ -29327,6 +29138,11 @@ snapshots: loader-utils@3.3.1: {} + local-pkg@0.5.1: + dependencies: + mlly: 1.7.3 + pkg-types: 1.2.1 + localforage@1.10.0: dependencies: lie: 3.1.1 @@ -29356,10 +29172,6 @@ snapshots: lodash.deburr@4.1.0: {} - lodash.get@4.4.2: {} - - lodash.isequal@4.5.0: {} - lodash.isnumber@3.0.3: {} lodash.memoize@4.1.2: {} @@ -29525,8 +29337,6 @@ snapshots: math-expression-evaluator@1.4.0: {} - math-intrinsics@1.0.0: {} - mdast-util-definitions@4.0.0: dependencies: unist-util-visit: 2.0.3 @@ -30357,6 +30167,13 @@ snapshots: pkg-types: 1.2.0 ufo: 1.5.4 + mlly@1.7.3: + dependencies: + acorn: 8.14.0 + pathe: 1.1.2 + pkg-types: 1.2.1 + ufo: 1.5.4 + modern-ahocorasick@1.0.1: {} moment@2.30.1: {} @@ -30391,7 +30208,7 @@ snapshots: optionalDependencies: typescript: 5.6.2 - muggle-string@0.3.1: {} + muggle-string@0.4.1: {} multer@1.4.4-lts.1: dependencies: @@ -30419,25 +30236,15 @@ snapshots: mute-stream@1.0.0: {} - mv@2.1.1: - dependencies: - mkdirp: 0.5.6 - ncp: 2.0.0 - rimraf: 2.4.5 - optional: true - mz@2.7.0: dependencies: any-promise: 1.3.0 object-assign: 4.1.1 thenify-all: 1.6.0 - nan@2.20.0: - optional: true - - nanoid@3.3.7: {} + nanoid@3.3.8: {} - nanoid@5.0.7: {} + nanoid@5.0.9: {} nanospinner@1.1.0: dependencies: @@ -30447,9 +30254,6 @@ snapshots: natural-orderby@2.0.3: {} - ncp@2.0.0: - optional: true - negotiator@0.6.3: {} neo-async@2.6.2: {} @@ -30494,8 +30298,6 @@ snapshots: dependencies: minimatch: 3.1.2 - node-domexception@1.0.0: {} - node-emoji@1.11.0: dependencies: lodash: 4.17.21 @@ -30513,12 +30315,6 @@ snapshots: dependencies: whatwg-url: 5.0.0 - node-fetch@3.3.1: - dependencies: - data-uri-to-buffer: 4.0.1 - fetch-blob: 3.2.0 - formdata-polyfill: 4.0.10 - node-forge@1.3.1: {} node-int64@0.4.0: {} @@ -30582,8 +30378,6 @@ snapshots: pkg-types: 1.2.0 ufo: 1.5.4 - oauth-sign@0.9.0: {} - object-assign@4.1.1: {} object-hash@3.0.0: {} @@ -30684,6 +30478,13 @@ snapshots: is-docker: 2.2.1 is-wsl: 2.2.0 + open@9.1.0: + dependencies: + default-browser: 4.0.0 + define-lazy-prop: 3.0.0 + is-inside-container: 1.0.0 + is-wsl: 2.2.0 + opener@1.5.2: {} optionator@0.9.4: @@ -30787,6 +30588,13 @@ snapshots: package-json-from-dist@1.0.1: {} + package-json@10.0.1: + dependencies: + ky: 1.7.3 + registry-auth-token: 5.0.2 + registry-url: 6.0.1 + semver: 7.6.3 + package-json@8.1.1: dependencies: got: 12.6.1 @@ -30849,12 +30657,13 @@ snapshots: json-parse-even-better-errors: 2.3.1 lines-and-columns: 1.2.4 - parse-json@6.0.2: + parse-json@7.1.1: dependencies: '@babel/code-frame': 7.24.7 error-ex: 1.3.2 - json-parse-even-better-errors: 2.3.1 + json-parse-even-better-errors: 3.0.2 lines-and-columns: 2.0.4 + type-fest: 3.13.1 parse-numeric-range@1.3.0: {} @@ -30919,7 +30728,7 @@ snapshots: lru-cache: 10.4.3 minipass: 7.1.2 - path-to-regexp@0.1.10: {} + path-to-regexp@0.1.12: {} path-to-regexp@1.9.0: dependencies: @@ -30947,8 +30756,6 @@ snapshots: pend@1.2.0: {} - performance-now@2.1.0: {} - periscopic@3.1.0: dependencies: '@types/estree': 1.0.6 @@ -30978,6 +30785,8 @@ snapshots: pino-std-serializers@6.2.2: {} + pino-std-serializers@7.0.0: {} + pino@8.20.0: dependencies: atomic-sleep: 1.0.0 @@ -30992,6 +30801,20 @@ snapshots: sonic-boom: 3.8.1 thread-stream: 2.7.0 + pino@9.4.0: + dependencies: + atomic-sleep: 1.0.0 + fast-redact: 3.5.0 + on-exit-leak-free: 2.1.2 + pino-abstract-transport: 1.2.0 + pino-std-serializers: 7.0.0 + process-warning: 4.0.0 + quick-format-unescaped: 4.0.4 + real-require: 0.2.0 + safe-stable-stringify: 2.5.0 + sonic-boom: 4.2.0 + thread-stream: 3.1.0 + pirates@4.0.6: {} pkce-challenge@2.2.0: {} @@ -31018,6 +30841,12 @@ snapshots: mlly: 1.7.1 pathe: 1.1.2 + pkg-types@1.2.1: + dependencies: + confbox: 0.1.8 + mlly: 1.7.3 + pathe: 1.1.2 + pkg-up@3.1.0: dependencies: find-up: 3.0.0 @@ -31551,13 +31380,13 @@ snapshots: postcss@8.4.31: dependencies: - nanoid: 3.3.7 + nanoid: 3.3.8 picocolors: 1.1.0 source-map-js: 1.2.1 postcss@8.4.47: dependencies: - nanoid: 3.3.7 + nanoid: 3.3.8 picocolors: 1.1.0 source-map-js: 1.2.1 @@ -31612,6 +31441,8 @@ snapshots: process-warning@3.0.0: {} + process-warning@4.0.0: {} + process@0.11.10: {} progress@2.0.3: {} @@ -31719,8 +31550,6 @@ snapshots: dependencies: side-channel: 1.0.6 - qs@6.5.3: {} - querystringify@2.2.0: {} queue-microtask@1.2.3: {} @@ -31773,7 +31602,7 @@ snapshots: react: 18.3.1 tween-functions: 1.2.0 - react-dev-utils@12.0.1(eslint@8.57.1)(typescript@5.6.2)(vue-template-compiler@2.7.16)(webpack@5.95.0): + react-dev-utils@12.0.1(eslint@8.57.1)(typescript@5.6.2)(webpack@5.95.0): dependencies: '@babel/code-frame': 7.24.7 address: 1.2.2 @@ -31784,7 +31613,7 @@ snapshots: escape-string-regexp: 4.0.0 filesize: 8.0.7 find-up: 5.0.0 - fork-ts-checker-webpack-plugin: 6.5.3(eslint@8.57.1)(typescript@5.6.2)(vue-template-compiler@2.7.16)(webpack@5.95.0) + fork-ts-checker-webpack-plugin: 6.5.3(eslint@8.57.1)(typescript@5.6.2)(webpack@5.95.0) global-modules: 2.0.0 globby: 11.1.0 gzip-size: 6.0.0 @@ -32204,8 +32033,6 @@ snapshots: regenerate@1.4.2: {} - regenerator-runtime@0.13.11: {} - regenerator-runtime@0.14.1: {} regenerator-transform@0.15.2: @@ -32405,29 +32232,6 @@ snapshots: repeat-string@1.6.1: {} - request@2.88.2: - dependencies: - aws-sign2: 0.7.0 - aws4: 1.13.2 - caseless: 0.12.0 - combined-stream: 1.0.8 - extend: 3.0.2 - forever-agent: 0.6.1 - form-data: 2.3.3 - har-validator: 5.1.5 - http-signature: 1.2.0 - is-typedarray: 1.0.0 - isstream: 0.1.2 - json-stringify-safe: 5.0.1 - mime-types: 2.1.35 - oauth-sign: 0.9.0 - performance-now: 2.1.0 - qs: 6.5.3 - safe-buffer: 5.2.1 - tough-cookie: 2.5.0 - tunnel-agent: 0.6.0 - uuid: 3.4.0 - require-directory@2.1.1: {} require-from-string@2.0.2: {} @@ -32493,11 +32297,6 @@ snapshots: rfdc@1.4.1: {} - rimraf@2.4.5: - dependencies: - glob: 6.0.4 - optional: true - rimraf@2.6.3: dependencies: glob: 7.2.3 @@ -32553,6 +32352,10 @@ snapshots: postcss: 8.4.47 strip-json-comments: 3.1.1 + run-applescript@5.0.0: + dependencies: + execa: 5.1.1 + run-async@2.4.1: {} run-async@3.0.0: {} @@ -32582,9 +32385,6 @@ snapshots: safe-buffer@5.2.1: {} - safe-json-stringify@1.2.0: - optional: true - safe-regex-test@1.0.3: dependencies: call-bind: 1.0.7 @@ -32664,8 +32464,6 @@ snapshots: dependencies: lru-cache: 6.0.0 - semver@7.6.2: {} - semver@7.6.3: {} send@0.19.0: @@ -32758,11 +32556,6 @@ snapshots: setprototypeof@1.2.0: {} - sha.js@2.4.11: - dependencies: - inherits: 2.0.4 - safe-buffer: 5.2.1 - shallow-clone@3.0.1: dependencies: kind-of: 6.0.3 @@ -32805,19 +32598,6 @@ snapshots: siginfo@2.0.0: {} - sign-addon@5.3.0: - dependencies: - common-tags: 1.8.2 - core-js: 3.29.0 - deepcopy: 2.1.0 - es6-error: 4.1.1 - es6-promisify: 7.0.0 - jsonwebtoken: 9.0.0 - mz: 2.7.0 - request: 2.88.2 - source-map-support: 0.5.21 - stream-to-promise: 3.0.0 - signal-exit@3.0.7: {} signal-exit@4.1.0: {} @@ -32894,6 +32674,10 @@ snapshots: dependencies: atomic-sleep: 1.0.0 + sonic-boom@4.2.0: + dependencies: + atomic-sleep: 1.0.0 + sort-css-media-queries@2.2.0: {} source-map-js@1.2.1: {} @@ -32985,18 +32769,6 @@ snapshots: srcset@4.0.0: {} - sshpk@1.18.0: - dependencies: - asn1: 0.2.6 - assert-plus: 1.0.0 - bcrypt-pbkdf: 1.0.2 - dashdash: 1.14.1 - ecc-jsbn: 0.1.2 - getpass: 0.1.7 - jsbn: 0.1.1 - safer-buffer: 2.1.2 - tweetnacl: 0.14.5 - stack-utils@2.0.6: dependencies: escape-string-regexp: 2.0.0 @@ -33065,16 +32837,6 @@ snapshots: stream-shift@1.0.3: {} - stream-to-array@2.3.0: - dependencies: - any-promise: 1.3.0 - - stream-to-promise@3.0.0: - dependencies: - any-promise: 1.3.0 - end-of-stream: 1.4.4 - stream-to-array: 2.3.0 - streamsearch@1.1.0: {} strict-event-emitter@0.5.1: {} @@ -33214,7 +32976,9 @@ snapshots: strip-json-comments@3.1.1: {} - strip-json-comments@5.0.0: {} + strip-json-comments@5.0.1: {} + + stubborn-fs@1.2.5: {} style-to-js@1.1.16: dependencies: @@ -33511,6 +33275,10 @@ snapshots: dependencies: real-require: 0.2.0 + thread-stream@3.1.0: + dependencies: + real-require: 0.2.0 + throttle-debounce@5.0.2: {} through2@2.0.5: @@ -33549,14 +33317,12 @@ snapshots: dependencies: tslib: 2.7.0 + titleize@3.0.0: {} + tmp@0.0.33: dependencies: os-tmpdir: 1.0.2 - tmp@0.2.1: - dependencies: - rimraf: 3.0.2 - tmp@0.2.3: {} tmpl@1.0.5: {} @@ -33582,15 +33348,8 @@ snapshots: toposort@2.0.2: {} - tosource@1.0.0: {} - totalist@3.0.1: {} - tough-cookie@2.5.0: - dependencies: - psl: 1.9.0 - punycode: 2.3.1 - tough-cookie@4.1.4: dependencies: psl: 1.9.0 @@ -33796,8 +33555,6 @@ snapshots: tween-functions@1.2.0: {} - tweetnacl@0.14.5: {} - tweetnacl@1.0.3: {} type-check@0.4.0: @@ -33806,8 +33563,6 @@ snapshots: type-detect@4.0.8: {} - type-detect@4.1.0: {} - type-fest@0.16.0: {} type-fest@0.20.2: {} @@ -33822,6 +33577,8 @@ snapshots: type-fest@2.19.0: {} + type-fest@3.13.1: {} + type-fest@4.26.1: {} type-is@1.6.18: @@ -34049,8 +33806,6 @@ snapshots: universalify@0.2.0: {} - universalify@1.0.0: {} - universalify@2.0.1: {} unixify@1.0.0: @@ -34093,6 +33848,19 @@ snapshots: semver-diff: 4.0.0 xdg-basedir: 5.1.0 + update-notifier@7.3.1: + dependencies: + boxen: 8.0.1 + chalk: 5.3.0 + configstore: 7.0.0 + is-in-ci: 1.0.0 + is-installed-globally: 1.0.0 + is-npm: 6.0.0 + latest-version: 9.0.0 + pupa: 3.1.0 + semver: 7.6.3 + xdg-basedir: 5.1.0 + upper-case-first@2.0.2: dependencies: tslib: 2.7.0 @@ -34187,8 +33955,6 @@ snapshots: uuid@10.0.0: {} - uuid@3.4.0: {} - uuid@8.3.2: {} uuid@9.0.1: {} @@ -34219,8 +33985,6 @@ snapshots: dependencies: builtins: 1.0.3 - validator@13.12.0: {} - value-equal@1.0.1: {} value-or-promise@1.0.12: {} @@ -34229,12 +33993,6 @@ snapshots: vary@1.1.2: {} - verror@1.10.0: - dependencies: - assert-plus: 1.0.0 - core-util-is: 1.0.2 - extsprintf: 1.3.0 - vfile-location@5.0.3: dependencies: '@types/unist': 3.0.3 @@ -34332,16 +34090,18 @@ snapshots: - supports-color - terser - vite-plugin-dts@3.9.1(@types/node@20.16.9)(rollup@4.22.4)(typescript@5.6.2)(vite@5.4.8(@types/node@20.16.9)(sass@1.79.3)(terser@5.34.0)): + vite-plugin-dts@4.3.0(@types/node@20.16.9)(rollup@4.22.4)(typescript@5.6.2)(vite@5.4.8(@types/node@20.16.9)(sass@1.79.3)(terser@5.34.0)): dependencies: - '@microsoft/api-extractor': 7.43.0(@types/node@20.16.9) + '@microsoft/api-extractor': 7.48.1(@types/node@20.16.9) '@rollup/pluginutils': 5.1.2(rollup@4.22.4) - '@vue/language-core': 1.8.27(typescript@5.6.2) + '@volar/typescript': 2.4.11 + '@vue/language-core': 2.1.6(typescript@5.6.2) + compare-versions: 6.1.1 debug: 4.3.7(supports-color@8.1.1) kolorist: 1.8.0 + local-pkg: 0.5.1 magic-string: 0.30.11 typescript: 5.6.2 - vue-tsc: 1.8.27(typescript@5.6.2) optionalDependencies: vite: 5.4.8(@types/node@20.16.9)(sass@1.79.3)(terser@5.34.0) transitivePeerDependencies: @@ -34477,22 +34237,12 @@ snapshots: - supports-color - terser + vscode-uri@3.0.8: {} + vue-parser@1.1.6: dependencies: parse5: 3.0.3 - vue-template-compiler@2.7.16: - dependencies: - de-indent: 1.0.2 - he: 1.2.0 - - vue-tsc@1.8.27(typescript@5.6.2): - dependencies: - '@volar/typescript': 1.11.1 - '@vue/language-core': 1.8.27(typescript@5.6.2) - semver: 7.6.3 - typescript: 5.6.2 - w3c-xmlserializer@5.0.0: dependencies: xml-name-validator: 5.0.0 @@ -34527,11 +34277,6 @@ snapshots: transitivePeerDependencies: - debug - watchpack@2.4.0: - dependencies: - glob-to-regexp: 0.4.1 - graceful-fs: 4.2.11 - watchpack@2.4.2: dependencies: glob-to-regexp: 0.4.1 @@ -34545,44 +34290,41 @@ snapshots: dependencies: defaults: 1.0.4 - web-ext@7.12.0(body-parser@1.20.3): + web-ext@8.3.0(body-parser@1.20.3): dependencies: - '@babel/runtime': 7.21.0 - '@devicefarmer/adbkit': 3.2.3 - addons-linter: 6.28.0(body-parser@1.20.3)(node-fetch@3.3.1) - bunyan: 1.8.15 - camelcase: 7.0.1 - chrome-launcher: 0.15.1 + '@babel/runtime': 7.25.6 + '@devicefarmer/adbkit': 3.2.6 + addons-linter: 7.1.0(body-parser@1.20.3) + camelcase: 8.0.0 + chrome-launcher: 1.1.2 debounce: 1.2.1 decamelize: 6.0.0 es6-error: 4.1.1 - firefox-profile: 4.3.2 - fs-extra: 11.1.0 + firefox-profile: 4.7.0 fx-runner: 1.4.0 - import-fresh: 3.3.0 - jose: 4.13.1 - mkdirp: 1.0.4 + https-proxy-agent: 7.0.5 + jose: 5.9.2 + jszip: 3.10.1 multimatch: 6.0.0 - mz: 2.7.0 - node-fetch: 3.3.1 node-notifier: 10.0.0 - open: 8.4.2 - parse-json: 6.0.2 + open: 9.1.0 + parse-json: 7.1.1 + pino: 9.4.0 promise-toolbox: 0.21.0 - sign-addon: 5.3.0 source-map-support: 0.5.21 strip-bom: 5.0.0 - strip-json-comments: 5.0.0 - tmp: 0.2.1 - update-notifier: 6.0.2 - watchpack: 2.4.0 + strip-json-comments: 5.0.1 + tmp: 0.2.3 + update-notifier: 7.3.1 + watchpack: 2.4.2 ws: 8.18.0 - yargs: 17.7.1 + yargs: 17.7.2 zip-dir: 2.0.0 transitivePeerDependencies: - body-parser - bufferutil - express + - node-fetch - safe-compare - supports-color - utf-8-validate @@ -35090,6 +34832,8 @@ snapshots: tr46: 0.0.3 webidl-conversions: 3.0.1 + when-exit@2.1.3: {} + when@3.7.7: {} which-boxed-primitive@1.0.2: @@ -35158,6 +34902,10 @@ snapshots: dependencies: string-width: 5.1.2 + widest-line@5.0.0: + dependencies: + string-width: 7.2.0 + wildcard@2.0.1: {} winreg@0.0.12: {} @@ -35220,7 +34968,7 @@ snapshots: xml-name-validator@5.0.0: {} - xml2js@0.5.0: + xml2js@0.6.2: dependencies: sax: 1.4.1 xmlbuilder: 11.0.1 @@ -35264,16 +35012,6 @@ snapshots: y18n: 4.0.3 yargs-parser: 18.1.3 - yargs@17.7.1: - dependencies: - cliui: 8.0.1 - escalade: 3.2.0 - get-caller-file: 2.0.5 - require-directory: 2.1.1 - string-width: 4.2.3 - y18n: 5.0.8 - yargs-parser: 21.1.1 - yargs@17.7.2: dependencies: cliui: 8.0.1 @@ -35304,14 +35042,6 @@ snapshots: toposort: 2.0.2 type-fest: 2.19.0 - z-schema@5.0.5: - dependencies: - lodash.get: 4.4.2 - lodash.isequal: 4.5.0 - validator: 13.12.0 - optionalDependencies: - commander: 9.5.0 - zip-dir@2.0.0: dependencies: async: 3.2.2 From 5e221d5d108ec3a752c7b63606cf7a0b6235de65 Mon Sep 17 00:00:00 2001 From: Thibault Martinez <thibault@iota.org> Date: Wed, 18 Dec 2024 12:12:09 +0100 Subject: [PATCH 80/97] chore(bin_version): don't concatenate GIT_REVISION if empty (#4535) --- crates/bin-version/src/lib.rs | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/crates/bin-version/src/lib.rs b/crates/bin-version/src/lib.rs index 7af360af7fe..76f534af1e1 100644 --- a/crates/bin-version/src/lib.rs +++ b/crates/bin-version/src/lib.rs @@ -12,11 +12,11 @@ pub mod _hidden { /// /// Defines two global `const`s: /// `GIT_REVISION`: The git revision as specified by the `GIT_REVISION` env -/// variable provided at compile time, or the current git revision as -/// discovered by running `git describe`. +/// variable provided at compile time, or the current git revision as discovered +/// by running `git describe`. /// /// `VERSION`: The value of the `CARGO_PKG_VERSION` environment variable -/// concatenated with the value of `GIT_REVISION`. +/// concatenated with the value of `GIT_REVISION` if it is not empty. /// /// Note: This macro must only be used from a binary, if used inside a library /// this will fail to compile. @@ -25,16 +25,19 @@ macro_rules! bin_version { () => { $crate::git_revision!(); - const VERSION: &str = - $crate::_hidden::concat!(env!("CARGO_PKG_VERSION"), "-", GIT_REVISION); + const VERSION: &str = if GIT_REVISION.is_empty() { + env!("CARGO_PKG_VERSION") + } else { + $crate::_hidden::concat!(env!("CARGO_PKG_VERSION"), "-", GIT_REVISION) + }; }; } /// Defines constant that holds the git revision at build time. /// /// `GIT_REVISION`: The git revision as specified by the `GIT_REVISION` env -/// variable provided at compile time, or the current git revision as -/// discovered by running `git describe`. +/// variable provided at compile time, or the current git revision as discovered +/// by running `git describe`. /// /// Note: This macro must only be used from a binary, if used inside a library /// this will fail to compile. From 33d49ebc7ea7a698e6cc0494560baf88c1aac954 Mon Sep 17 00:00:00 2001 From: Panteleymonchuk <panteleymonchuk@gmail.com> Date: Wed, 18 Dec 2024 14:17:34 +0200 Subject: [PATCH 81/97] feat(wallet-dashboard): add tx details state to the end of send visual asset flow (#4449) * feat(wallet-dashboard): implement SentSuccess view and update SendTokenDialog flow * feat(dashboard): enhance SendTokenDialog flow and improve transaction handling * feat(dashboard): rename SentSuccessView to TransactionDetailsView and update flow * fix(dashboard): improve error message for transaction info retrieval * feat(dashboard): add tx details state to the end of send visual asset flow * fix(dashboard): correct spelling of 'Receipt' in AssetDialog and constants * feat(dashboard): add loading state with spinner during transaction fetching * feat(dashboard): rename Receipt view to TransactionDetails and update related logic * feat(dashboard): implement transfer transaction mutation and refactor handling logic * refactor(explorer, core): move useRecognizedPackages from explorer to core. * feat(dashboard): integrate useRecognizedPackages for transaction details * fix(dashboard): correct import path for useTransferTransaction * refactor(dashboard): change dialog layout structure for assets * feat(dashboard): add refetch functionality to AssetDialog for updated asset data * refactor(dashboard): streamline AssetDialog component structure --------- Co-authored-by: cpl121 <100352899+cpl121@users.noreply.github.com> --- .../app/(protected)/assets/page.tsx | 8 +++- .../components/Dialogs/Assets/AssetDialog.tsx | 37 +++++++++++++++---- .../Assets/constants/AssetsDialogView.ts | 1 + .../Dialogs/Assets/views/DetailsView.tsx | 6 +-- .../Dialogs/Assets/views/SendView.tsx | 6 +-- 5 files changed, 42 insertions(+), 16 deletions(-) diff --git a/apps/wallet-dashboard/app/(protected)/assets/page.tsx b/apps/wallet-dashboard/app/(protected)/assets/page.tsx index ed96fe0a519..7007cc86c5c 100644 --- a/apps/wallet-dashboard/app/(protected)/assets/page.tsx +++ b/apps/wallet-dashboard/app/(protected)/assets/page.tsx @@ -29,7 +29,7 @@ export default function AssetsDashboardPage(): React.JSX.Element { const [selectedAsset, setSelectedAsset] = useState<IotaObjectData | null>(null); const [selectedCategory, setSelectedCategory] = useState<AssetCategory>(AssetCategory.Visual); const account = useCurrentAccount(); - const { data, isFetching, fetchNextPage, hasNextPage } = useGetOwnedObjects( + const { data, isFetching, fetchNextPage, hasNextPage, refetch } = useGetOwnedObjects( account?.address, undefined, OBJECTS_PER_REQ, @@ -79,7 +79,11 @@ export default function AssetsDashboardPage(): React.JSX.Element { fetchNextPage={fetchNextPage} /> {selectedAsset && ( - <AssetDialog onClose={() => setSelectedAsset(null)} asset={selectedAsset} /> + <AssetDialog + onClose={() => setSelectedAsset(null)} + asset={selectedAsset} + refetchAssets={refetch} + /> )} </div> </Panel> diff --git a/apps/wallet-dashboard/components/Dialogs/Assets/AssetDialog.tsx b/apps/wallet-dashboard/components/Dialogs/Assets/AssetDialog.tsx index ec3d8d38d11..c71390a33aa 100644 --- a/apps/wallet-dashboard/components/Dialogs/Assets/AssetDialog.tsx +++ b/apps/wallet-dashboard/components/Dialogs/Assets/AssetDialog.tsx @@ -4,17 +4,20 @@ import React, { useState } from 'react'; import { Dialog } from '@iota/apps-ui-kit'; import { FormikProvider, useFormik } from 'formik'; -import { useCurrentAccount } from '@iota/dapp-kit'; +import { useIotaClient, useCurrentAccount } from '@iota/dapp-kit'; import { createNftSendValidationSchema } from '@iota/core'; import { DetailsView, SendView } from './views'; import { IotaObjectData } from '@iota/iota-sdk/client'; import { AssetsDialogView } from './constants'; import { useCreateSendAssetTransaction, useNotifications } from '@/hooks'; import { NotificationType } from '@/stores/notificationStore'; +import { TransactionDetailsView } from '../SendToken'; +import { DialogLayout } from '../layout'; interface AssetsDialogProps { onClose: () => void; asset: IotaObjectData; + refetchAssets: () => void; } interface FormValues { @@ -25,12 +28,14 @@ const INITIAL_VALUES: FormValues = { to: '', }; -export function AssetDialog({ onClose, asset }: AssetsDialogProps): JSX.Element { +export function AssetDialog({ onClose, asset, refetchAssets }: AssetsDialogProps): JSX.Element { const [view, setView] = useState<AssetsDialogView>(AssetsDialogView.Details); const account = useCurrentAccount(); + const [digest, setDigest] = useState<string>(''); const activeAddress = account?.address ?? ''; const objectId = asset?.objectId ?? ''; const { addNotification } = useNotifications(); + const iotaClient = useIotaClient(); const validationSchema = createNftSendValidationSchema(activeAddress, objectId); const { mutation: sendAsset } = useCreateSendAssetTransaction(objectId); @@ -44,10 +49,16 @@ export function AssetDialog({ onClose, asset }: AssetsDialogProps): JSX.Element async function onSubmit(values: FormValues) { try { - await sendAsset.mutateAsync(values.to); + const executed = await sendAsset.mutateAsync(values.to); + + const tx = await iotaClient.waitForTransaction({ + digest: executed.digest, + }); + + setDigest(tx.digest); + refetchAssets(); addNotification('Transfer transaction successful', NotificationType.Success); - onClose(); - setView(AssetsDialogView.Details); + setView(AssetsDialogView.TransactionDetails); } catch { addNotification('Transfer transaction failed', NotificationType.Error); } @@ -66,16 +77,26 @@ export function AssetDialog({ onClose, asset }: AssetsDialogProps): JSX.Element } return ( <Dialog open onOpenChange={onOpenChange}> - <FormikProvider value={formik}> + <DialogLayout> <> {view === AssetsDialogView.Details && ( <DetailsView asset={asset} onClose={onOpenChange} onSend={onDetailsSend} /> )} {view === AssetsDialogView.Send && ( - <SendView asset={asset} onClose={onOpenChange} onBack={onSendViewBack} /> + <FormikProvider value={formik}> + <SendView + asset={asset} + onClose={onOpenChange} + onBack={onSendViewBack} + /> + </FormikProvider> )} + + {view === AssetsDialogView.TransactionDetails && !!digest ? ( + <TransactionDetailsView digest={digest} onClose={onOpenChange} /> + ) : null} </> - </FormikProvider> + </DialogLayout> </Dialog> ); } diff --git a/apps/wallet-dashboard/components/Dialogs/Assets/constants/AssetsDialogView.ts b/apps/wallet-dashboard/components/Dialogs/Assets/constants/AssetsDialogView.ts index 88cb34c15b1..242da33c2c3 100644 --- a/apps/wallet-dashboard/components/Dialogs/Assets/constants/AssetsDialogView.ts +++ b/apps/wallet-dashboard/components/Dialogs/Assets/constants/AssetsDialogView.ts @@ -4,4 +4,5 @@ export enum AssetsDialogView { Details = 'Details', Send = 'Send', + TransactionDetails = 'TransactionDetails', } diff --git a/apps/wallet-dashboard/components/Dialogs/Assets/views/DetailsView.tsx b/apps/wallet-dashboard/components/Dialogs/Assets/views/DetailsView.tsx index 3929ba0062f..8520d62a484 100644 --- a/apps/wallet-dashboard/components/Dialogs/Assets/views/DetailsView.tsx +++ b/apps/wallet-dashboard/components/Dialogs/Assets/views/DetailsView.tsx @@ -13,7 +13,7 @@ import { } from '@iota/apps-ui-kit'; import Link from 'next/link'; import { formatAddress } from '@iota/iota-sdk/utils'; -import { DialogLayout, DialogLayoutBody, DialogLayoutFooter } from '../../layout'; +import { DialogLayoutBody, DialogLayoutFooter } from '../../layout'; import { IotaObjectData } from '@iota/iota-sdk/client'; import { ExplorerLink } from '@/components/ExplorerLink'; import { useCurrentAccount } from '@iota/dapp-kit'; @@ -55,7 +55,7 @@ export function DetailsView({ onClose, asset, onSend }: DetailsViewProps) { } return ( - <DialogLayout> + <> <Header title="Asset" onClose={onClose} titleCentered /> <DialogLayoutBody> <div className="flex w-full flex-col items-center justify-center gap-xs"> @@ -195,6 +195,6 @@ export function DetailsView({ onClose, asset, onSend }: DetailsViewProps) { )} </div> </DialogLayoutFooter> - </DialogLayout> + </> ); } diff --git a/apps/wallet-dashboard/components/Dialogs/Assets/views/SendView.tsx b/apps/wallet-dashboard/components/Dialogs/Assets/views/SendView.tsx index b5757582c7b..3d0350478ac 100644 --- a/apps/wallet-dashboard/components/Dialogs/Assets/views/SendView.tsx +++ b/apps/wallet-dashboard/components/Dialogs/Assets/views/SendView.tsx @@ -4,7 +4,7 @@ import React from 'react'; import { AddressInput, useNftDetails } from '@iota/core'; import { useFormikContext } from 'formik'; -import { DialogLayout, DialogLayoutFooter, DialogLayoutBody } from '../../layout'; +import { DialogLayoutFooter, DialogLayoutBody } from '../../layout'; import { Button, ButtonHtmlType, @@ -33,7 +33,7 @@ export function SendView({ asset, onClose, onBack }: SendViewProps) { const { nftName, nftImageUrl } = useNftDetails(objectId, senderAddress); return ( - <DialogLayout> + <> <Header title="Send asset" onClose={onClose} titleCentered onBack={onBack} /> <DialogLayoutBody> <div className="flex w-full flex-col items-center justify-center gap-xs"> @@ -65,6 +65,6 @@ export function SendView({ asset, onClose, onBack }: SendViewProps) { onClick={submitForm} /> </DialogLayoutFooter> - </DialogLayout> + </> ); } From 699790c2e2d93faf512281138f88067cc51c72f2 Mon Sep 17 00:00:00 2001 From: Bran <52735957+brancoder@users.noreply.github.com> Date: Wed, 18 Dec 2024 13:35:29 +0100 Subject: [PATCH 82/97] refactor(wallet-dashboard): improve staking dialog (#4476) * feat(dashboard): add unstake timelocked objects view * refactor: improve function * feat: add more unstaking information and rename constant * refactor: imports * fix: imports * fix: remove duplication collapsible * refactor: include both single stake and grouped in a unstake hook * refactor: unify usntake panel * fix: go back correctly to previous screen in staking * refactor: cleanup * refactor: remove popups * refactor: remove popups * revert "refactor: remove popups" * refactor: remove only unnecessary popups * refactor: divide hooks and move deeper inside components * fix: resolve re rendering issue * feat: remove redundant code * fix: add enter amount dialog component * fix: update conditionally showing the stake dialog * fix(tooling-dashboard): improve stake wizard (#4454) * fix: improve stake wizzard * fix: add set view helper function * fix: add check for stake details --------- Co-authored-by: evavirseda <evirseda@boxfish.studio> * refactor: imports / exports * feat: add wait for transaction and refresh * feat: improve dialogs * feat(dashboard): minor fixes * fix: query key for timelocked staking * fix: revert constants changes * fix: disable stake button if no available amount for staking * fix: add infoMessage var * fix: revert pnpm lock changes --------- Co-authored-by: JCNoguera <88061365+VmMad@users.noreply.github.com> Co-authored-by: evavirseda <evirseda@boxfish.studio> Co-authored-by: cpl121 <100352899+cpl121@users.noreply.github.com> Co-authored-by: cpl121 <cpeon@boxfish.studio> --- .../Staking/views/EnterAmountDialogLayout.tsx | 166 +++++++++++++++++ .../Dialogs/Staking/views/EnterAmountView.tsx | 167 +++--------------- .../views/EnterTimelockedAmountView.tsx | 156 +++------------- .../components/Dialogs/Staking/views/index.ts | 1 + 4 files changed, 219 insertions(+), 271 deletions(-) create mode 100644 apps/wallet-dashboard/components/Dialogs/Staking/views/EnterAmountDialogLayout.tsx diff --git a/apps/wallet-dashboard/components/Dialogs/Staking/views/EnterAmountDialogLayout.tsx b/apps/wallet-dashboard/components/Dialogs/Staking/views/EnterAmountDialogLayout.tsx new file mode 100644 index 00000000000..9ec233b1838 --- /dev/null +++ b/apps/wallet-dashboard/components/Dialogs/Staking/views/EnterAmountDialogLayout.tsx @@ -0,0 +1,166 @@ +// Copyright (c) 2024 IOTA Stiftung +// SPDX-License-Identifier: Apache-2.0 + +import React from 'react'; +import { useFormatCoin, useStakeTxnInfo } from '@iota/core'; +import { IOTA_TYPE_ARG } from '@iota/iota-sdk/utils'; +import { + Button, + ButtonType, + KeyValueInfo, + Panel, + Divider, + Input, + InputType, + Header, + InfoBoxType, + InfoBoxStyle, + InfoBox, +} from '@iota/apps-ui-kit'; +import { Field, type FieldProps, useFormikContext } from 'formik'; +import { Exclamation, Loader } from '@iota/ui-icons'; +import { useIotaClientQuery } from '@iota/dapp-kit'; + +import { Validator } from './Validator'; +import { StakedInfo } from './StakedInfo'; +import { DialogLayout, DialogLayoutBody, DialogLayoutFooter } from '../../layout'; + +export interface FormValues { + amount: string; +} + +interface EnterAmountDialogLayoutProps { + selectedValidator: string; + senderAddress: string; + caption: string; + showInfo: boolean; + infoMessage: string; + isLoading: boolean; + onBack: () => void; + handleClose: () => void; + handleStake: () => void; + isStakeDisabled?: boolean; + gasBudget?: string | number | null; +} + +function EnterAmountDialogLayout({ + selectedValidator, + gasBudget, + senderAddress, + caption, + showInfo, + infoMessage, + isLoading, + isStakeDisabled, + onBack, + handleClose, + handleStake, +}: EnterAmountDialogLayoutProps): JSX.Element { + const { data: system } = useIotaClientQuery('getLatestIotaSystemState'); + const { values, errors } = useFormikContext<FormValues>(); + const amount = values.amount; + + const [gas, symbol] = useFormatCoin(gasBudget ?? 0, IOTA_TYPE_ARG); + + const { stakedRewardsStartEpoch, timeBeforeStakeRewardsRedeemableAgoDisplay } = useStakeTxnInfo( + system?.epoch, + ); + + return ( + <DialogLayout> + <Header title="Enter amount" onClose={handleClose} onBack={onBack} titleCentered /> + <DialogLayoutBody> + <div className="flex w-full flex-col justify-between"> + <div> + <div className="mb-md"> + <Validator address={selectedValidator} isSelected showAction={false} /> + </div> + <StakedInfo + validatorAddress={selectedValidator} + accountAddress={senderAddress} + /> + <div className="my-md w-full"> + <Field name="amount"> + {({ + field: { onChange, ...field }, + form: { setFieldValue }, + meta, + }: FieldProps<FormValues>) => { + return ( + <Input + {...field} + onValueChange={({ value }) => { + setFieldValue('amount', value, true); + }} + type={InputType.NumericFormat} + label="Amount" + value={amount} + suffix={` ${symbol}`} + placeholder="Enter amount to stake" + errorMessage={ + values.amount && meta.error ? meta.error : undefined + } + caption={caption} + /> + ); + }} + </Field> + {showInfo ? ( + <div className="mt-md"> + <InfoBox + type={InfoBoxType.Error} + supportingText={infoMessage} + style={InfoBoxStyle.Elevated} + icon={<Exclamation />} + /> + </div> + ) : null} + </div> + + <Panel hasBorder> + <div className="flex flex-col gap-y-sm p-md"> + <KeyValueInfo + keyText="Staking Rewards Start" + value={stakedRewardsStartEpoch} + fullwidth + /> + <KeyValueInfo + keyText="Redeem Rewards" + value={timeBeforeStakeRewardsRedeemableAgoDisplay} + fullwidth + /> + <Divider /> + <KeyValueInfo + keyText="Gas fee" + value={gas || '--'} + supportingLabel={symbol} + fullwidth + /> + </div> + </Panel> + </div> + </div> + </DialogLayoutBody> + <DialogLayoutFooter> + <div className="flex w-full justify-between gap-sm"> + <Button fullWidth type={ButtonType.Secondary} onClick={onBack} text="Back" /> + <Button + fullWidth + type={ButtonType.Primary} + disabled={!amount || !!errors?.amount || isLoading || isStakeDisabled} + onClick={handleStake} + text="Stake" + icon={ + isLoading ? ( + <Loader className="animate-spin" data-testid="loading-indicator" /> + ) : null + } + iconAfterText + /> + </div> + </DialogLayoutFooter> + </DialogLayout> + ); +} + +export default EnterAmountDialogLayout; diff --git a/apps/wallet-dashboard/components/Dialogs/Staking/views/EnterAmountView.tsx b/apps/wallet-dashboard/components/Dialogs/Staking/views/EnterAmountView.tsx index a2c7f61d0db..b90de664794 100644 --- a/apps/wallet-dashboard/components/Dialogs/Staking/views/EnterAmountView.tsx +++ b/apps/wallet-dashboard/components/Dialogs/Staking/views/EnterAmountView.tsx @@ -2,37 +2,13 @@ // SPDX-License-Identifier: Apache-2.0 import React from 'react'; -import { - useFormatCoin, - useBalance, - CoinFormat, - parseAmount, - useCoinMetadata, - useStakeTxnInfo, -} from '@iota/core'; +import { useFormatCoin, useBalance, CoinFormat, parseAmount, useCoinMetadata } from '@iota/core'; import { IOTA_TYPE_ARG } from '@iota/iota-sdk/utils'; -import { - Button, - ButtonType, - KeyValueInfo, - Panel, - Divider, - Input, - InputType, - Header, - InfoBoxType, - InfoBoxStyle, - InfoBox, -} from '@iota/apps-ui-kit'; -import { Field, type FieldProps, useFormikContext } from 'formik'; -import { Exclamation } from '@iota/ui-icons'; -import { useIotaClientQuery, useSignAndExecuteTransaction } from '@iota/dapp-kit'; - -import { Validator } from './Validator'; -import { StakedInfo } from './StakedInfo'; -import { DialogLayout, DialogLayoutBody, DialogLayoutFooter } from '../../layout'; +import { useFormikContext } from 'formik'; +import { useSignAndExecuteTransaction } from '@iota/dapp-kit'; import { useNewStakeTransaction, useNotifications } from '@/hooks'; import { NotificationType } from '@/stores/notificationStore'; +import EnterAmountDialogLayout from './EnterAmountDialogLayout'; export interface FormValues { amount: string; @@ -49,36 +25,31 @@ interface EnterAmountViewProps { } function EnterAmountView({ - selectedValidator: selectedValidatorAddress, + selectedValidator, onBack, handleClose, amountWithoutDecimals, senderAddress, onSuccess, }: EnterAmountViewProps): JSX.Element { + const { addNotification } = useNotifications(); + const { mutateAsync: signAndExecuteTransaction } = useSignAndExecuteTransaction(); + const { values, resetForm } = useFormikContext<FormValues>(); + const coinType = IOTA_TYPE_ARG; const { data: metadata } = useCoinMetadata(coinType); const decimals = metadata?.decimals ?? 0; - const { addNotification } = useNotifications(); - - const { values, errors, resetForm } = useFormikContext<FormValues>(); - const amount = values.amount; + const { data: iotaBalance } = useBalance(senderAddress); + const coinBalance = BigInt(iotaBalance?.totalBalance || 0); const { data: newStakeData, isLoading: isTransactionLoading } = useNewStakeTransaction( - selectedValidatorAddress, + selectedValidator, amountWithoutDecimals, senderAddress, ); - const { data: system } = useIotaClientQuery('getLatestIotaSystemState'); - const { data: iotaBalance } = useBalance(senderAddress!); - const coinBalance = BigInt(iotaBalance?.totalBalance || 0); - const { mutateAsync: signAndExecuteTransaction } = useSignAndExecuteTransaction(); - const gasBudgetBigInt = BigInt(newStakeData?.gasBudget ?? 0); - const [gas, symbol] = useFormatCoin(newStakeData?.gasBudget, IOTA_TYPE_ARG); - const maxTokenBalance = coinBalance - gasBudgetBigInt; const [maxTokenFormatted, maxTokenFormattedSymbol] = useFormatCoin( maxTokenBalance, @@ -86,14 +57,9 @@ function EnterAmountView({ CoinFormat.FULL, ); - const caption = isTransactionLoading - ? '--' - : `${maxTokenFormatted} ${maxTokenFormattedSymbol} Available`; - - const { stakedRewardsStartEpoch, timeBeforeStakeRewardsRedeemableAgoDisplay } = useStakeTxnInfo( - system?.epoch, - ); - + const caption = `${maxTokenFormatted} ${maxTokenFormattedSymbol} Available`; + const infoMessage = + 'You have selected an amount that will leave you with insufficient funds to pay for gas fees for unstaking or any other transactions.'; const hasEnoughRemaingBalance = maxTokenBalance > parseAmount(values.amount, decimals) + BigInt(2) * gasBudgetBigInt; @@ -120,97 +86,18 @@ function EnterAmountView({ } return ( - <DialogLayout> - <Header title="Enter amount" onClose={handleClose} onBack={onBack} titleCentered /> - <DialogLayoutBody> - <div className="flex w-full flex-col justify-between"> - <div> - <div className="mb-md"> - <Validator - address={selectedValidatorAddress} - isSelected - showAction={false} - /> - </div> - <StakedInfo - validatorAddress={selectedValidatorAddress} - accountAddress={senderAddress!} - /> - <div className="my-md w-full"> - <Field name="amount"> - {({ - field: { onChange, ...field }, - form: { setFieldValue }, - meta, - }: FieldProps<FormValues>) => { - return ( - <Input - {...field} - onValueChange={({ value }) => { - setFieldValue('amount', value, true); - }} - type={InputType.NumericFormat} - label="Amount" - value={amount} - suffix={` ${symbol}`} - placeholder="Enter amount to stake" - errorMessage={ - values.amount && meta.error ? meta.error : undefined - } - caption={coinBalance ? caption : ''} - /> - ); - }} - </Field> - {!hasEnoughRemaingBalance ? ( - <div className="mt-md"> - <InfoBox - type={InfoBoxType.Error} - supportingText="You have selected an amount that will leave you with insufficient funds to pay for gas fees for unstaking or any other transactions." - style={InfoBoxStyle.Elevated} - icon={<Exclamation />} - /> - </div> - ) : null} - </div> - - <Panel hasBorder> - <div className="flex flex-col gap-y-sm p-md"> - <KeyValueInfo - keyText="Staking Rewards Start" - value={stakedRewardsStartEpoch} - fullwidth - /> - <KeyValueInfo - keyText="Redeem Rewards" - value={timeBeforeStakeRewardsRedeemableAgoDisplay} - fullwidth - /> - <Divider /> - <KeyValueInfo - keyText="Gas fee" - value={gas || '--'} - supportingLabel={symbol} - fullwidth - /> - </div> - </Panel> - </div> - </div> - </DialogLayoutBody> - <DialogLayoutFooter> - <div className="flex w-full justify-between gap-sm"> - <Button fullWidth type={ButtonType.Secondary} onClick={onBack} text="Back" /> - <Button - fullWidth - type={ButtonType.Primary} - onClick={handleStake} - disabled={!amount || !!errors?.amount} - text="Stake" - /> - </div> - </DialogLayoutFooter> - </DialogLayout> + <EnterAmountDialogLayout + selectedValidator={selectedValidator} + gasBudget={newStakeData?.gasBudget} + senderAddress={senderAddress} + caption={caption} + showInfo={!hasEnoughRemaingBalance} + infoMessage={infoMessage} + isLoading={isTransactionLoading} + onBack={onBack} + handleClose={handleClose} + handleStake={handleStake} + /> ); } diff --git a/apps/wallet-dashboard/components/Dialogs/Staking/views/EnterTimelockedAmountView.tsx b/apps/wallet-dashboard/components/Dialogs/Staking/views/EnterTimelockedAmountView.tsx index af365e15f30..b21a6ad3bd1 100644 --- a/apps/wallet-dashboard/components/Dialogs/Staking/views/EnterTimelockedAmountView.tsx +++ b/apps/wallet-dashboard/components/Dialogs/Staking/views/EnterTimelockedAmountView.tsx @@ -5,31 +5,13 @@ import React, { useEffect, useState } from 'react'; import { useFormatCoin, CoinFormat, - useStakeTxnInfo, GroupedTimelockObject, useGetAllOwnedObjects, TIMELOCK_IOTA_TYPE, } from '@iota/core'; import { IOTA_TYPE_ARG } from '@iota/iota-sdk/utils'; -import { - Button, - ButtonType, - KeyValueInfo, - Panel, - Divider, - Input, - InputType, - Header, - InfoBoxType, - InfoBoxStyle, - InfoBox, -} from '@iota/apps-ui-kit'; -import { Field, type FieldProps, useFormikContext } from 'formik'; -import { Exclamation, Loader } from '@iota/ui-icons'; -import { useIotaClientQuery, useSignAndExecuteTransaction } from '@iota/dapp-kit'; -import { Validator } from './Validator'; -import { StakedInfo } from './StakedInfo'; -import { DialogLayout, DialogLayoutBody, DialogLayoutFooter } from '../../layout'; +import { useFormikContext } from 'formik'; +import { useSignAndExecuteTransaction } from '@iota/dapp-kit'; import { useGetCurrentEpochStartTimestamp, useNewStakeTimelockedTransaction, @@ -37,6 +19,7 @@ import { } from '@/hooks'; import { NotificationType } from '@/stores/notificationStore'; import { prepareObjectsForTimelockedStakingTransaction } from '@/lib/utils'; +import EnterAmountDialogLayout from './EnterAmountDialogLayout'; export interface FormValues { amount: string; @@ -63,15 +46,18 @@ function EnterTimelockedAmountView({ }: EnterTimelockedAmountViewProps): JSX.Element { const { addNotification } = useNotifications(); const { mutateAsync: signAndExecuteTransaction } = useSignAndExecuteTransaction(); + const { resetForm } = useFormikContext<FormValues>(); + + const { data: currentEpochMs } = useGetCurrentEpochStartTimestamp(); + const { data: timelockedObjects } = useGetAllOwnedObjects(senderAddress, { + StructType: TIMELOCK_IOTA_TYPE, + }); const [groupedTimelockObjects, setGroupedTimelockObjects] = useState<GroupedTimelockObject[]>( [], ); + const { data: newStakeData, isLoading: isTransactionLoading } = useNewStakeTimelockedTransaction(selectedValidator, senderAddress, groupedTimelockObjects); - const { data: currentEpochMs } = useGetCurrentEpochStartTimestamp(); - const { data: timelockedObjects } = useGetAllOwnedObjects(senderAddress, { - StructType: TIMELOCK_IOTA_TYPE, - }); useEffect(() => { if (timelockedObjects && currentEpochMs) { @@ -84,13 +70,8 @@ function EnterTimelockedAmountView({ } }, [timelockedObjects, currentEpochMs, amountWithoutDecimals]); - const { values, errors, resetForm } = useFormikContext<FormValues>(); - const amount = values.amount; const hasGroupedTimelockObjects = groupedTimelockObjects.length > 0; - const { data: system } = useIotaClientQuery('getLatestIotaSystemState'); - const [gas, symbol] = useFormatCoin(newStakeData?.gasBudget ?? 0, IOTA_TYPE_ARG); - const [maxTokenFormatted, maxTokenFormattedSymbol] = useFormatCoin( maxStakableTimelockedAmount, IOTA_TYPE_ARG, @@ -98,10 +79,8 @@ function EnterTimelockedAmountView({ ); const caption = `${maxTokenFormatted} ${maxTokenFormattedSymbol} Available`; - - const { stakedRewardsStartEpoch, timeBeforeStakeRewardsRedeemableAgoDisplay } = useStakeTxnInfo( - system?.epoch, - ); + const infoMessage = + 'It is not possible to combine timelocked objects to stake the entered amount. Please try a different amount.'; function handleStake(): void { if (groupedTimelockObjects.length === 0) { @@ -130,104 +109,19 @@ function EnterTimelockedAmountView({ } return ( - <DialogLayout> - <Header title="Enter amount" onClose={handleClose} onBack={onBack} titleCentered /> - <DialogLayoutBody> - <div className="flex w-full flex-col justify-between"> - <div> - <div className="mb-md"> - <Validator address={selectedValidator} isSelected showAction={false} /> - </div> - <StakedInfo - validatorAddress={selectedValidator} - accountAddress={senderAddress!} - /> - <div className="my-md w-full"> - <Field name="amount"> - {({ - field: { onChange, ...field }, - form: { setFieldValue }, - meta, - }: FieldProps<FormValues>) => { - return ( - <Input - {...field} - onValueChange={({ value }) => { - setFieldValue('amount', value, true); - }} - type={InputType.NumericFormat} - label="Amount" - value={amount} - suffix={` ${symbol}`} - placeholder="Enter amount to stake" - errorMessage={ - values.amount && meta.error ? meta.error : undefined - } - caption={caption} - /> - ); - }} - </Field> - {!hasGroupedTimelockObjects && !isTransactionLoading ? ( - <div className="mt-md"> - <InfoBox - type={InfoBoxType.Error} - supportingText="It is not possible to combine timelocked objects to stake the entered amount. Please try a different amount." - style={InfoBoxStyle.Elevated} - icon={<Exclamation />} - /> - </div> - ) : null} - </div> - - <Panel hasBorder> - <div className="flex flex-col gap-y-sm p-md"> - <KeyValueInfo - keyText="Staking Rewards Start" - value={stakedRewardsStartEpoch} - fullwidth - /> - <KeyValueInfo - keyText="Redeem Rewards" - value={timeBeforeStakeRewardsRedeemableAgoDisplay} - fullwidth - /> - <Divider /> - <KeyValueInfo - keyText="Gas fee" - value={gas || '--'} - supportingLabel={symbol} - fullwidth - /> - </div> - </Panel> - </div> - </div> - </DialogLayoutBody> - <DialogLayoutFooter> - <div className="flex w-full justify-between gap-sm"> - <Button fullWidth type={ButtonType.Secondary} onClick={onBack} text="Back" /> - <Button - fullWidth - type={ButtonType.Primary} - disabled={ - !amount || - !!errors?.amount || - isTransactionLoading || - !hasGroupedTimelockObjects - } - onClick={handleStake} - text="Stake" - icon={ - isTransactionLoading ? ( - <Loader className="animate-spin" data-testid="loading-indicator" /> - ) : null - } - iconAfterText - /> - </div> - </DialogLayoutFooter> - </DialogLayout> + <EnterAmountDialogLayout + selectedValidator={selectedValidator} + gasBudget={newStakeData?.gasBudget} + senderAddress={senderAddress} + caption={caption} + showInfo={!hasGroupedTimelockObjects} + infoMessage={infoMessage} + isLoading={isTransactionLoading} + isStakeDisabled={!hasGroupedTimelockObjects} + onBack={onBack} + handleClose={handleClose} + handleStake={handleStake} + /> ); } diff --git a/apps/wallet-dashboard/components/Dialogs/Staking/views/index.ts b/apps/wallet-dashboard/components/Dialogs/Staking/views/index.ts index 685926f46f6..5a0ffed2be6 100644 --- a/apps/wallet-dashboard/components/Dialogs/Staking/views/index.ts +++ b/apps/wallet-dashboard/components/Dialogs/Staking/views/index.ts @@ -3,5 +3,6 @@ export { default as EnterAmountView } from './EnterAmountView'; export { default as EnterTimelockedAmountView } from './EnterTimelockedAmountView'; +export { default as EnterAmountDialogLayout } from './EnterAmountDialogLayout'; export { default as SelectValidatorView } from './SelectValidatorView'; export * from './DetailsView'; From a849c3b55471885758d1aadf1c0a48ac4cd7be9b Mon Sep 17 00:00:00 2001 From: Bran <52735957+brancoder@users.noreply.github.com> Date: Wed, 18 Dec 2024 14:47:05 +0100 Subject: [PATCH 83/97] fix(wallet-dashboard): clear queries on network change (#4548) --- apps/wallet-dashboard/providers/AppProviders.tsx | 1 + 1 file changed, 1 insertion(+) diff --git a/apps/wallet-dashboard/providers/AppProviders.tsx b/apps/wallet-dashboard/providers/AppProviders.tsx index 46d69758c94..26be321a43b 100644 --- a/apps/wallet-dashboard/providers/AppProviders.tsx +++ b/apps/wallet-dashboard/providers/AppProviders.tsx @@ -21,6 +21,7 @@ export function AppProviders({ children }: React.PropsWithChildren) { const defaultNetwork = getDefaultNetwork(); function handleNetworkChange() { queryClient.resetQueries(); + queryClient.clear(); } return ( <GrowthBookProvider growthbook={growthbook}> From ce871c5fd428ec6a8414cb9b63cbd39d04330043 Mon Sep 17 00:00:00 2001 From: Thibault Martinez <thibault@iota.org> Date: Wed, 18 Dec 2024 16:03:46 +0100 Subject: [PATCH 84/97] docs(ledger): manual installation for deprecated devices (#4506) * docs(ledger): manual installation for deprecated devices * Update docs/content/about-iota/iota-wallet/how-to/integrate-ledger.mdx Co-authored-by: Lucas Tortora <85233773+lucas-tortora@users.noreply.github.com> * for deprecated devices such as Ledger Nano S mention * Update docs/content/about-iota/iota-wallet/how-to/integrate-ledger.mdx Co-authored-by: Lucas Tortora <85233773+lucas-tortora@users.noreply.github.com> --------- Co-authored-by: Lucas Tortora <85233773+lucas-tortora@users.noreply.github.com> --- .../iota-wallet/how-to/integrate-ledger.mdx | 24 ++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/docs/content/about-iota/iota-wallet/how-to/integrate-ledger.mdx b/docs/content/about-iota/iota-wallet/how-to/integrate-ledger.mdx index 093140c0f72..735c8d02253 100644 --- a/docs/content/about-iota/iota-wallet/how-to/integrate-ledger.mdx +++ b/docs/content/about-iota/iota-wallet/how-to/integrate-ledger.mdx @@ -17,7 +17,10 @@ Before connecting your Ledger device to IOTA Wallet, ensure the following: ## Install the IOTA Rebased App on Your Ledger Device -To use IOTA Wallet with Ledger, install the IOTA Rebased app on your device through Ledger Live. +To use IOTA Wallet with Ledger, install the IOTA Rebased app on your device through Ledger Live or manually. +Ledger Live is preferred, but you need to install the app manually for deprecated devices like the Ledger Nano S. + +### Ledger Live (preferred) 1. Unlock your Ledger device. 2. Open Ledger Live and navigate to **My Ledger** in the left panel. @@ -26,6 +29,25 @@ To use IOTA Wallet with Ledger, install the IOTA Rebased app on your device thro 5. Click **Install** to download the IOTA Rebased app to your device. 6. Your device will show the installation progress. +### Manually (for deprecated devices such as Ledger Nano S) + +:::warning + +Make sure you have enough space left for an additional app on your device. + +::: + +1. Go to the latest release on https://github.com/iotaledger/ledger-app-iota/releases. +2. Download the archive matching your device, e.g. `nanos.tar.gz` for the Ledger Nano S. +3. Verify that the checksum (`shasum -a 256 nanos.tar.gz`) matches the one from the release. +4. Extract the archive `tar -xvzf nanos.tar.gz`. +5. Move to the app folder `cd nanos`. +6. Follow the steps on https://github.com/LedgerHQ/ledgerctl to install `ledgerctl`. +7. Install the app on your device `ledgerctl install -f app_nanos.json`. +8. Accept `Allow unsafe manager` on your device. +9. Accept `Perform installation` on your device. +10. Enter your pin on your device. + ## Import Accounts from Your Ledger Device To import accounts from your Ledger into IOTA Wallet: From 1ee46c36466dfbd7ae697ef821cfbe67abc85eec Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Wed, 18 Dec 2024 17:00:05 +0100 Subject: [PATCH 85/97] Version Packages (#4533) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Begoña Alvarez <balvarez@boxfish.studio> --- .changeset/nice-crabs-wink.md | 5 ----- sdk/create-dapp/CHANGELOG.md | 7 +++++++ sdk/create-dapp/package.json | 2 +- 3 files changed, 8 insertions(+), 6 deletions(-) delete mode 100644 .changeset/nice-crabs-wink.md diff --git a/.changeset/nice-crabs-wink.md b/.changeset/nice-crabs-wink.md deleted file mode 100644 index 63aac17cb26..00000000000 --- a/.changeset/nice-crabs-wink.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@iota/create-dapp': minor ---- - -Update some outdated eslint dependencies of the `@iota/create-dapp` templates, to their eslint v9-compatible versions diff --git a/sdk/create-dapp/CHANGELOG.md b/sdk/create-dapp/CHANGELOG.md index d04a319a617..567b062afe9 100644 --- a/sdk/create-dapp/CHANGELOG.md +++ b/sdk/create-dapp/CHANGELOG.md @@ -1,5 +1,12 @@ # @iota/create-dapp +## 0.3.0 + +### Minor Changes + +- 8c3a220: Update some outdated eslint dependencies of the `@iota/create-dapp` templates, to their + eslint v9-compatible versions + ## 0.2.2 ### Patch Changes diff --git a/sdk/create-dapp/package.json b/sdk/create-dapp/package.json index 29361e97cce..b709ffd341d 100644 --- a/sdk/create-dapp/package.json +++ b/sdk/create-dapp/package.json @@ -3,7 +3,7 @@ "author": "IOTA Foundation <info@iota.org>", "description": "A CLI for creating new IOTA dApps", "homepage": "https://docs.iota.org/references/ts-sdk/typescript/", - "version": "0.2.2", + "version": "0.3.0", "license": "Apache-2.0", "files": [ "CHANGELOG.md", From c5ea33a527c0366d513dde99b211dfa00906e4f7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bego=C3=B1a=20=C3=81lvarez=20de=20la=20Cruz?= <balvarez@boxfish.studio> Date: Wed, 18 Dec 2024 17:27:31 +0100 Subject: [PATCH 86/97] chore(wallet): bump to v0.4.0 (#4552) --- apps/wallet/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/wallet/package.json b/apps/wallet/package.json index c7df5bf5895..59ad3cd44ec 100644 --- a/apps/wallet/package.json +++ b/apps/wallet/package.json @@ -1,6 +1,6 @@ { "name": "iota-wallet", - "version": "0.3.1", + "version": "0.4.0", "private": true, "description": "A wallet for IOTA", "main": "./dist/ui.js", From 00429a8a8dd7ca8d02eed4169afdf3ccc8d46f20 Mon Sep 17 00:00:00 2001 From: DaughterOfMars <chloedaughterofmars@gmail.com> Date: Wed, 18 Dec 2024 11:38:41 -0500 Subject: [PATCH 87/97] chore(CI): Fix cargo deny issues (#4500) * chore(CI): Fix cargo deny issues * fix errors * dprint * use passkey 0.4 * revert split crates * more clear test impls --- Cargo.lock | 290 ++++++++++++++++-- Cargo.toml | 6 +- .../iota-e2e-tests/tests/passkey_e2e_tests.rs | 21 +- .../unit_tests/passkey_authenticator_test.rs | 25 +- deny.toml | 3 +- 5 files changed, 302 insertions(+), 43 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index c0b1c6e29bf..550aa462be0 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -803,7 +803,7 @@ dependencies = [ "proc-macro2 1.0.86", "quote 1.0.37", "syn 1.0.109", - "synstructure", + "synstructure 0.12.6", ] [[package]] @@ -5500,6 +5500,124 @@ dependencies = [ "cc", ] +[[package]] +name = "icu_collections" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db2fa452206ebee18c4b5c2274dbf1de17008e874b4dc4f0aea9d01ca79e4526" +dependencies = [ + "displaydoc", + "yoke", + "zerofrom", + "zerovec", +] + +[[package]] +name = "icu_locid" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13acbb8371917fc971be86fc8057c41a64b521c184808a698c02acc242dbf637" +dependencies = [ + "displaydoc", + "litemap", + "tinystr", + "writeable", + "zerovec", +] + +[[package]] +name = "icu_locid_transform" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "01d11ac35de8e40fdeda00d9e1e9d92525f3f9d887cdd7aa81d727596788b54e" +dependencies = [ + "displaydoc", + "icu_locid", + "icu_locid_transform_data", + "icu_provider", + "tinystr", + "zerovec", +] + +[[package]] +name = "icu_locid_transform_data" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fdc8ff3388f852bede6b579ad4e978ab004f139284d7b28715f773507b946f6e" + +[[package]] +name = "icu_normalizer" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19ce3e0da2ec68599d193c93d088142efd7f9c5d6fc9b803774855747dc6a84f" +dependencies = [ + "displaydoc", + "icu_collections", + "icu_normalizer_data", + "icu_properties", + "icu_provider", + "smallvec", + "utf16_iter", + "utf8_iter", + "write16", + "zerovec", +] + +[[package]] +name = "icu_normalizer_data" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8cafbf7aa791e9b22bec55a167906f9e1215fd475cd22adfcf660e03e989516" + +[[package]] +name = "icu_properties" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93d6020766cfc6302c15dbbc9c8778c37e62c14427cb7f6e601d849e092aeef5" +dependencies = [ + "displaydoc", + "icu_collections", + "icu_locid_transform", + "icu_properties_data", + "icu_provider", + "tinystr", + "zerovec", +] + +[[package]] +name = "icu_properties_data" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67a8effbc3dd3e4ba1afa8ad918d5684b8868b3b26500753effea8d2eed19569" + +[[package]] +name = "icu_provider" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ed421c8a8ef78d3e2dbc98a973be2f3770cb42b606e3ab18d6237c4dfde68d9" +dependencies = [ + "displaydoc", + "icu_locid", + "icu_provider_macros", + "stable_deref_trait", + "tinystr", + "writeable", + "yoke", + "zerofrom", + "zerovec", +] + +[[package]] +name = "icu_provider_macros" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ec89e9337638ecdc08744df490b221a7399bf8d164eb52a665454e60e075ad6" +dependencies = [ + "proc-macro2 1.0.86", + "quote 1.0.37", + "syn 2.0.77", +] + [[package]] name = "ident_case" version = "1.0.1" @@ -5508,12 +5626,23 @@ checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" [[package]] name = "idna" -version = "0.5.0" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "634d9b1461af396cad843f47fdba5597a4f9e6ddd4bfb6ff5d85028c25cb12f6" +checksum = "686f825264d630750a544639377bae737628043f20d38bbc029e8f29ea968a7e" dependencies = [ - "unicode-bidi", - "unicode-normalization", + "idna_adapter", + "smallvec", + "utf8_iter", +] + +[[package]] +name = "idna_adapter" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "daca1df1c957320b2cf139ac61e7bd64fed304c5040df000a745aa1de3b4ef71" +dependencies = [ + "icu_normalizer", + "icu_properties", ] [[package]] @@ -8275,7 +8404,7 @@ version = "0.8.0-alpha" dependencies = [ "proc-macro2 1.0.86", "syn 1.0.109", - "synstructure", + "synstructure 0.12.6", ] [[package]] @@ -8876,7 +9005,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4979f22fdb869068da03c9f7528f8297c6fd2606bc3a4affe42e6a823fdb8da4" dependencies = [ "cfg-if", - "windows-targets 0.52.6", + "windows-targets 0.48.5", ] [[package]] @@ -8972,6 +9101,12 @@ version = "0.4.14" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "78b3ae25bc7c8c38cec158d1f2757ee79e9b3740fbc7ccf0e59e4b08d793fa89" +[[package]] +name = "litemap" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ee93343901ab17bd981295f2cf0026d4ad018c7c31ba84549a4ddbb47a45104" + [[package]] name = "lock_api" version = "0.4.12" @@ -10066,7 +10201,7 @@ dependencies = [ "proc-macro2 1.0.86", "quote 1.0.37", "syn 1.0.109", - "synstructure", + "synstructure 0.12.6", ] [[package]] @@ -11040,9 +11175,9 @@ dependencies = [ [[package]] name = "passkey-authenticator" -version = "0.2.0" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4017d27e98940a98358b43a3fe19cb3d7b7c821c3b35634d8087230e92445579" +checksum = "f9b065ce31354bcf23a333003c77f0d71f00eb95761b3390a069546e078a7a5b" dependencies = [ "async-trait", "coset", @@ -11054,9 +11189,9 @@ dependencies = [ [[package]] name = "passkey-client" -version = "0.2.0" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f14d42b14749cc7927add34a9932b3b3cc5349a633384850baa67183061439dd" +checksum = "5080bfafe23d139ae8be8b907453aee0b8af3ca7cf25d1f8d7bfcf7b079d3412" dependencies = [ "ciborium", "coset", @@ -11072,14 +11207,16 @@ dependencies = [ [[package]] name = "passkey-types" -version = "0.2.0" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "499cff8432e71c5f8784d9645aac0f9fca604d67f59b68a606170b5e229c6538" +checksum = "77144664f6aac5f629d7efa815f5098a054beeeca6ccafee5ec453fd2b0c53f9" dependencies = [ "bitflags 2.6.0", "ciborium", "coset", "data-encoding", + "getrandom 0.2.15", + "hmac", "indexmap 2.5.0", "rand 0.8.5", "serde", @@ -11087,6 +11224,7 @@ dependencies = [ "sha2 0.10.8", "strum 0.25.0", "typeshare", + "zeroize", ] [[package]] @@ -14337,6 +14475,17 @@ dependencies = [ "unicode-xid 0.2.6", ] +[[package]] +name = "synstructure" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8af7666ab7b6390ab78131fb5b0fce11d6b7a6951602017c35fa82800708971" +dependencies = [ + "proc-macro2 1.0.86", + "quote 1.0.37", + "syn 2.0.77", +] + [[package]] name = "sysinfo" version = "0.31.4" @@ -14710,6 +14859,16 @@ dependencies = [ "crunchy", ] +[[package]] +name = "tinystr" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9117f5d4db391c1cf6927e7bea3db74b9a1c1add8f7eda9ffd5364f40f57b82f" +dependencies = [ + "displaydoc", + "zerovec", +] + [[package]] name = "tinytemplate" version = "1.2.1" @@ -15338,7 +15497,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "97fee6b57c6a41524a810daee9286c02d7752c4253064d0b05472833a438f675" dependencies = [ "cfg-if", - "rand 0.8.5", + "rand 0.7.3", "static_assertions", ] @@ -15466,12 +15625,6 @@ dependencies = [ "version_check", ] -[[package]] -name = "unicode-bidi" -version = "0.3.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08f95100a766bf4f8f28f90d77e0a5461bbdb219042e7679bebe79004fed8d75" - [[package]] name = "unicode-ident" version = "1.0.13" @@ -15563,9 +15716,9 @@ dependencies = [ [[package]] name = "url" -version = "2.5.2" +version = "2.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22784dbdf76fdde8af1aeda5622b546b422b6fc585325248a2bf9f5e41e94d6c" +checksum = "32f8b686cadd1473f4bd0117a5d28d36b1ade384ea9b5069a1c40aefed7fda60" dependencies = [ "form_urlencoded", "idna", @@ -15585,6 +15738,18 @@ version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9" +[[package]] +name = "utf16_iter" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8232dd3cdaed5356e0f716d285e4b40b932ac434100fe9b7e0e8e935b9e6246" + +[[package]] +name = "utf8_iter" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" + [[package]] name = "utf8parse" version = "0.2.2" @@ -16218,6 +16383,18 @@ dependencies = [ "windows-sys 0.48.0", ] +[[package]] +name = "write16" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d1890f4022759daae28ed4fe62859b1236caebfc61ede2f63ed4e695f3f6d936" + +[[package]] +name = "writeable" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e9df38ee2d2c3c5948ea468a8406ff0db0b29ae1ffde1bcf20ef305bcc95c51" + [[package]] name = "ws_stream_wasm" version = "0.7.4" @@ -16328,6 +16505,30 @@ dependencies = [ "time", ] +[[package]] +name = "yoke" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "120e6aef9aa629e3d4f52dc8cc43a015c7724194c97dfaf45180d2daf2b77f40" +dependencies = [ + "serde", + "stable_deref_trait", + "yoke-derive", + "zerofrom", +] + +[[package]] +name = "yoke-derive" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2380878cad4ac9aac1e2435f3eb4020e8374b5f13c296cb75b4620ff8e229154" +dependencies = [ + "proc-macro2 1.0.86", + "quote 1.0.37", + "syn 2.0.77", + "synstructure 0.13.1", +] + [[package]] name = "yup-oauth2" version = "8.3.2" @@ -16376,6 +16577,27 @@ dependencies = [ "syn 2.0.77", ] +[[package]] +name = "zerofrom" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cff3ee08c995dee1859d998dea82f7374f2826091dd9cd47def953cae446cd2e" +dependencies = [ + "zerofrom-derive", +] + +[[package]] +name = "zerofrom-derive" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "595eed982f7d355beb85837f651fa22e90b3c044842dc7f2c2842c086f295808" +dependencies = [ + "proc-macro2 1.0.86", + "quote 1.0.37", + "syn 2.0.77", + "synstructure 0.13.1", +] + [[package]] name = "zeroize" version = "1.8.1" @@ -16397,6 +16619,28 @@ dependencies = [ "syn 2.0.77", ] +[[package]] +name = "zerovec" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa2b893d79df23bfb12d5461018d408ea19dfafe76c2c7ef6d4eba614f8ff079" +dependencies = [ + "yoke", + "zerofrom", + "zerovec-derive", +] + +[[package]] +name = "zerovec-derive" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6eafa6dfb17584ea3e2bd6e76e0cc15ad7af12b09abdd1ca55961bed9b1063c6" +dependencies = [ + "proc-macro2 1.0.86", + "quote 1.0.37", + "syn 2.0.77", +] + [[package]] name = "zip" version = "0.6.6" diff --git a/Cargo.toml b/Cargo.toml index 277ac3a5492..9dbfc1385f2 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -284,9 +284,9 @@ object_store = { version = "0.10", features = ["aws", "gcp", "azure", "http"] } once_cell = "1.18.0" p256 = { version = "0.13.2", features = ["ecdsa"] } parking_lot = "0.12.1" -passkey-authenticator = { version = "0.2.0" } -passkey-client = { version = "0.2.0" } -passkey-types = { version = "0.2.0" } +passkey-authenticator = "0.4.0" +passkey-client = "0.4.0" +passkey-types = "0.4.0" pretty_assertions = "1.3.0" proc-macro2 = "1.0.47" prometheus = "0.13.3" diff --git a/crates/iota-e2e-tests/tests/passkey_e2e_tests.rs b/crates/iota-e2e-tests/tests/passkey_e2e_tests.rs index 0f7a1cf583a..82c9c4a9d91 100644 --- a/crates/iota-e2e-tests/tests/passkey_e2e_tests.rs +++ b/crates/iota-e2e-tests/tests/passkey_e2e_tests.rs @@ -17,11 +17,11 @@ use iota_types::{ transaction::{Transaction, TransactionData}, }; use p256::pkcs8::DecodePublicKey; -use passkey_authenticator::{Authenticator, UserValidationMethod}; +use passkey_authenticator::{Authenticator, UserCheck, UserValidationMethod}; use passkey_client::Client; use passkey_types::{ Bytes, Passkey, - ctap2::Aaguid, + ctap2::{Aaguid, Ctap2Error}, rand::random_vec, webauthn::{ AttestationConveyancePreference, CredentialCreationOptions, CredentialRequestOptions, @@ -35,14 +35,21 @@ use test_cluster::{TestCluster, TestClusterBuilder}; use url::Url; struct MyUserValidationMethod {} + #[async_trait::async_trait] impl UserValidationMethod for MyUserValidationMethod { - async fn check_user_presence(&self) -> bool { - true - } + type PasskeyItem = Passkey; - async fn check_user_verification(&self) -> bool { - true + async fn check_user<'a>( + &self, + _credential: Option<&'a Self::PasskeyItem>, + _presence: bool, + _verification: bool, + ) -> Result<UserCheck, Ctap2Error> { + Ok(UserCheck { + presence: true, + verification: true, + }) } fn is_verification_enabled(&self) -> Option<bool> { diff --git a/crates/iota-types/src/unit_tests/passkey_authenticator_test.rs b/crates/iota-types/src/unit_tests/passkey_authenticator_test.rs index 5d4f451ebe6..41645f17c22 100644 --- a/crates/iota-types/src/unit_tests/passkey_authenticator_test.rs +++ b/crates/iota-types/src/unit_tests/passkey_authenticator_test.rs @@ -11,11 +11,11 @@ use fastcrypto::{ traits::ToFromBytes, }; use p256::pkcs8::DecodePublicKey; -use passkey_authenticator::{Authenticator, UserValidationMethod}; +use passkey_authenticator::{Authenticator, UserCheck, UserValidationMethod}; use passkey_client::Client; use passkey_types::{ Bytes, Passkey, - ctap2::Aaguid, + ctap2::{Aaguid, Ctap2Error}, rand::random_vec, webauthn::{ AttestationConveyancePreference, CredentialCreationOptions, CredentialRequestOptions, @@ -41,15 +41,10 @@ use crate::{ /// Helper struct to initialize passkey client. pub struct MyUserValidationMethod {} + #[async_trait::async_trait] impl UserValidationMethod for MyUserValidationMethod { - async fn check_user_presence(&self) -> bool { - true - } - - async fn check_user_verification(&self) -> bool { - true - } + type PasskeyItem = Passkey; fn is_verification_enabled(&self) -> Option<bool> { Some(true) @@ -58,6 +53,18 @@ impl UserValidationMethod for MyUserValidationMethod { fn is_presence_enabled(&self) -> bool { true } + + async fn check_user<'a>( + &self, + _credential: Option<&'a Self::PasskeyItem>, + _presence: bool, + _verification: bool, + ) -> Result<UserCheck, Ctap2Error> { + Ok(UserCheck { + presence: true, + verification: true, + }) + } } /// Response with fields from passkey authentication. diff --git a/deny.toml b/deny.toml index 73541741be8..04e8c2cb6f6 100644 --- a/deny.toml +++ b/deny.toml @@ -88,6 +88,7 @@ allow = [ "BSL-1.0", "Unicode-DFS-2016", "OpenSSL", + "Unicode-3.0", # "Apache-2.0 WITH LLVM-exception", ] # The confidence threshold for detecting a license from license text. @@ -98,7 +99,7 @@ confidence-threshold = 0.8 # Allow 1 or more licenses on a per-crate basis, so that particular licenses # aren't accepted for every possible crate as with the normal allow list exceptions = [ - { allow = ["GPL-2.0"], name = "mysqlclient-src" }, + # Each entry is the crate and version constraint, and its specific allow # list From 455641d98e9524b9f013685965209db25f164320 Mon Sep 17 00:00:00 2001 From: Marc Espin <mespinsanz@gmail.com> Date: Wed, 18 Dec 2024 17:49:06 +0100 Subject: [PATCH 88/97] feat(wallet-dashboard): Improve release process (#4537) * feat(dashboard): Embed git rev into settings panel * refactor(wallet-dashboard): Update CI * typo * fix: Add missing isStaging: false to preview deploys of the explorer * fmt * also embed the rev in the welcome page --- .github/workflows/_vercel_deploy.yml | 8 +++--- .../apps_wallet_dashboard_deploy.yml | 16 ++++++++++- apps/wallet-dashboard/app/page.tsx | 4 ++- .../settings/views/SettingsListView.tsx | 27 ++++++++++--------- apps/wallet-dashboard/next.config.mjs | 6 +++++ 5 files changed, 44 insertions(+), 17 deletions(-) diff --git a/.github/workflows/_vercel_deploy.yml b/.github/workflows/_vercel_deploy.yml index d85f6664fff..ffdb8fda37f 100644 --- a/.github/workflows/_vercel_deploy.yml +++ b/.github/workflows/_vercel_deploy.yml @@ -68,14 +68,16 @@ jobs: secrets: inherit with: isProd: false + isStaging: false - wallet-dashboard-prod: - name: Vercel Wallet Dashboard Production + wallet-dashboard-staging: + name: Vercel Wallet Dashboard Staging if: github.ref_name == 'develop' uses: ./.github/workflows/apps_wallet_dashboard_deploy.yml secrets: inherit with: - isProd: true + isProd: false + isStaging: true apps-backend-preview: name: Vercel apps-backend Preview diff --git a/.github/workflows/apps_wallet_dashboard_deploy.yml b/.github/workflows/apps_wallet_dashboard_deploy.yml index d3ae3f5f284..f533776b7bb 100644 --- a/.github/workflows/apps_wallet_dashboard_deploy.yml +++ b/.github/workflows/apps_wallet_dashboard_deploy.yml @@ -3,14 +3,25 @@ name: Deploy for Wallet Dashboard env: VERCEL_ORG_ID: ${{ secrets.VERCEL_ORG_ID }} VERCEL_PROJECT_ID: ${{ secrets.WALLET_DASHBOARD_VERCEL_PROJECT_ID }} + WALLET_DASHBOARD_VERCEL_PROJECT_STAGING_URL: ${{ secrets.WALLET_DASHBOARD_VERCEL_PROJECT_STAGING_URL }} on: workflow_dispatch: + inputs: + isProd: + type: boolean + required: true + isStaging: + type: boolean + required: true workflow_call: inputs: isProd: type: boolean required: true + isStaging: + type: boolean + required: true jobs: deploy: @@ -64,8 +75,11 @@ jobs: id: deploy_url if: ${{ inputs.isProd == false }} run: echo "DEPLOY_URL=$(cat vercel_output.txt | awk 'END{print}')" >> $GITHUB_OUTPUT + - name: Alias Staging deploy + if: ${{ inputs.isStaging }} + run: vercel alias ${{ steps.deploy_url.outputs.DEPLOY_URL }} $WALLET_DASHBOARD_VERCEL_PROJECT_STAGING_URL --token=${{ secrets.VERCEL_TOKEN }} --scope=${{ secrets.VERCEL_SCOPE }} - name: Comment on pull request - if: ${{ inputs.isProd == false }} + if: ${{ inputs.isProd == false && inputs.isStaging == false }} uses: actions/github-script@60a0d83039c74a4aee543508d2ffcb1c3799cdea # v7.0.1 with: github-token: ${{ secrets.GITHUB_TOKEN }} diff --git a/apps/wallet-dashboard/app/page.tsx b/apps/wallet-dashboard/app/page.tsx index e3036bf38c2..3392c231d31 100644 --- a/apps/wallet-dashboard/app/page.tsx +++ b/apps/wallet-dashboard/app/page.tsx @@ -63,8 +63,10 @@ function HomeDashboardPage(): JSX.Element { <ConnectButton connectText="Connect" /> </div> </div> - <div className="text-body-lg text-neutral-60"> + <div className="text-center text-body-lg text-neutral-60"> © IOTA Foundation {CURRENT_YEAR} + <br /> + {process.env.NEXT_PUBLIC_DASHBOARD_REV} </div> </div> </> diff --git a/apps/wallet-dashboard/components/Dialogs/settings/views/SettingsListView.tsx b/apps/wallet-dashboard/components/Dialogs/settings/views/SettingsListView.tsx index d5d619b3186..5ed55017ab9 100644 --- a/apps/wallet-dashboard/components/Dialogs/settings/views/SettingsListView.tsx +++ b/apps/wallet-dashboard/components/Dialogs/settings/views/SettingsListView.tsx @@ -41,18 +41,21 @@ export function SettingsListView({ handleClose, setView }: SettingsListViewProps <DialogLayout> <Header title="Settings" onClose={handleClose} onBack={handleClose} titleCentered /> <DialogLayoutBody> - <div className="flex w-full flex-col gap-md"> - {MENU_ITEMS.map((item, index) => ( - <Card key={index} type={CardType.Default} onClick={item.onClick}> - <CardImage type={ImageType.BgSolid}> - <div className="flex h-10 w-10 items-center justify-center rounded-full text-neutral-10 dark:text-neutral-92 [&_svg]:h-5 [&_svg]:w-5"> - <span className="text-2xl">{item.icon}</span> - </div> - </CardImage> - <CardBody title={item.title} subtitle={item.subtitle} /> - <CardAction type={CardActionType.Link} /> - </Card> - ))} + <div className="flex h-full flex-col content-stretch"> + <div className="flex h-full w-full flex-col gap-md"> + {MENU_ITEMS.map((item, index) => ( + <Card key={index} type={CardType.Default} onClick={item.onClick}> + <CardImage type={ImageType.BgSolid}> + <div className="flex h-10 w-10 items-center justify-center rounded-full text-neutral-10 dark:text-neutral-92 [&_svg]:h-5 [&_svg]:w-5"> + <span className="text-2xl">{item.icon}</span> + </div> + </CardImage> + <CardBody title={item.title} subtitle={item.subtitle} /> + <CardAction type={CardActionType.Link} /> + </Card> + ))} + </div> + <p className="text-center">{process.env.NEXT_PUBLIC_DASHBOARD_REV}</p> </div> </DialogLayoutBody> </DialogLayout> diff --git a/apps/wallet-dashboard/next.config.mjs b/apps/wallet-dashboard/next.config.mjs index a7417e613fd..533cbcccda9 100644 --- a/apps/wallet-dashboard/next.config.mjs +++ b/apps/wallet-dashboard/next.config.mjs @@ -1,6 +1,9 @@ // Copyright (c) 2024 IOTA Stiftung // SPDX-License-Identifier: Apache-2.0 +import { execSync } from 'child_process'; +const NEXT_PUBLIC_DASHBOARD_REV = execSync('git rev-parse HEAD').toString().trim().toString(); + /** @type {import('next').NextConfig} */ const nextConfig = { async redirects() { @@ -16,6 +19,9 @@ const nextConfig = { // Remove this domain when fetching data domains: ['d315pvdvxi2gex.cloudfront.net'], }, + env: { + NEXT_PUBLIC_DASHBOARD_REV, + }, }; export default nextConfig; From 9fb666548ad7c15371525cbd13e1793772adff5f Mon Sep 17 00:00:00 2001 From: evavirseda <evirseda@boxfish.studio> Date: Wed, 18 Dec 2024 17:59:01 +0100 Subject: [PATCH 89/97] fix(explorer): fix selected network style (#4550) --- .../src/components/network/NetworkSelector.tsx | 3 ++- .../src/lib/components/atoms/list-item/ListItem.tsx | 10 +++++++++- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/apps/explorer/src/components/network/NetworkSelector.tsx b/apps/explorer/src/components/network/NetworkSelector.tsx index 34da8635f62..deb20e35e9b 100644 --- a/apps/explorer/src/components/network/NetworkSelector.tsx +++ b/apps/explorer/src/components/network/NetworkSelector.tsx @@ -99,11 +99,12 @@ export function NetworkSelector(): JSX.Element { key={idx} onClick={() => handleNetworkSwitch(network.id)} hideBottomBorder + isHighlighted={network === selectedNetwork} > <div className="flex items-center gap-2"> <CheckmarkFilled className={cx('flex-shrink-0', { - 'text-success': network === selectedNetwork, + 'text-primary-30': network === selectedNetwork, 'text-gray-45': network !== selectedNetwork, })} /> diff --git a/apps/ui-kit/src/lib/components/atoms/list-item/ListItem.tsx b/apps/ui-kit/src/lib/components/atoms/list-item/ListItem.tsx index 2a5806cf08f..9f6475a674b 100644 --- a/apps/ui-kit/src/lib/components/atoms/list-item/ListItem.tsx +++ b/apps/ui-kit/src/lib/components/atoms/list-item/ListItem.tsx @@ -23,6 +23,10 @@ export interface ListItemProps { * The list item is disabled or not. */ isDisabled?: boolean; + /** + * The list item is highlighted. + */ + isHighlighted?: boolean; } export function ListItem({ @@ -31,6 +35,7 @@ export function ListItem({ onClick, isDisabled, children, + isHighlighted, }: PropsWithChildren<ListItemProps>): React.JSX.Element { function handleKeyDown(event: React.KeyboardEvent<HTMLDivElement>) { if ((event.key === 'Enter' || event.key === ' ') && !isDisabled && onClick) { @@ -63,7 +68,10 @@ export function ListItem({ className={cx( 'relative flex flex-row items-center justify-between px-md py-sm text-neutral-10 dark:text-neutral-92', !isDisabled && onClick ? 'cursor-pointer' : 'cursor-default', - { 'state-layer': !isDisabled }, + { + 'bg-shader-primary-dark-16 dark:bg-shader-inverted-dark-16': isHighlighted, + 'state-layer': !isDisabled, + }, )} > {children} From 5380fc3e0e6a825ebdad70ffebb75867f0ec9ff0 Mon Sep 17 00:00:00 2001 From: Marc Espin <mespinsanz@gmail.com> Date: Thu, 19 Dec 2024 10:17:06 +0100 Subject: [PATCH 90/97] refactor(wallet-dashboard): clean up settings (#4540) * refactor(wallet-dashboard): Clean up settings * fmt --------- Co-authored-by: evavirseda <evirseda@boxfish.studio> --- .../Dialogs/settings/SettingsDialog.tsx | 14 +++++----- .../settings/views/NetworkSelectorView.tsx | 26 +++++++++---------- .../settings/views/SettingsListView.tsx | 7 +++-- 3 files changed, 21 insertions(+), 26 deletions(-) diff --git a/apps/wallet-dashboard/components/Dialogs/settings/SettingsDialog.tsx b/apps/wallet-dashboard/components/Dialogs/settings/SettingsDialog.tsx index 2c87b522af2..447c3e3a4e9 100644 --- a/apps/wallet-dashboard/components/Dialogs/settings/SettingsDialog.tsx +++ b/apps/wallet-dashboard/components/Dialogs/settings/SettingsDialog.tsx @@ -25,14 +25,12 @@ export function SettingsDialog({ return ( <Dialog open={isOpen} onOpenChange={() => handleClose()}> - <> - {view === SettingsDialogView.SelectSetting && ( - <SettingsListView handleClose={handleClose} setView={setView} /> - )} - {view === SettingsDialogView.NetworkSettings && ( - <NetworkSelectorView handleClose={handleClose} onBack={onBack} /> - )} - </> + {view === SettingsDialogView.SelectSetting && ( + <SettingsListView handleClose={handleClose} setView={setView} /> + )} + {view === SettingsDialogView.NetworkSettings && ( + <NetworkSelectorView handleClose={handleClose} onBack={onBack} /> + )} </Dialog> ); } diff --git a/apps/wallet-dashboard/components/Dialogs/settings/views/NetworkSelectorView.tsx b/apps/wallet-dashboard/components/Dialogs/settings/views/NetworkSelectorView.tsx index cc9b573a9a9..9eb2d3a80d4 100644 --- a/apps/wallet-dashboard/components/Dialogs/settings/views/NetworkSelectorView.tsx +++ b/apps/wallet-dashboard/components/Dialogs/settings/views/NetworkSelectorView.tsx @@ -19,6 +19,8 @@ export function NetworkSelectorView({ }: NetworkSelectorViewProps): JSX.Element { const clientContext = useIotaClientContext(); const activeNetwork = clientContext.network; + // Dashboard doesn't support RPCs yet + const networks = clientContext.networks as Record<string, NetworkConfiguration>; async function handleNetworkChange(network: NetworkConfiguration) { if (activeNetwork === network.id) { @@ -27,25 +29,21 @@ export function NetworkSelectorView({ clientContext.selectNetwork(network.id); toast.success(`Switched to ${network.name}`); } + return ( <DialogLayout> <Header title="Network" onClose={handleClose} onBack={onBack} titleCentered /> <DialogLayoutBody> <div className="flex w-full flex-col gap-md"> - {Object.keys(clientContext.networks).map((network) => { - const networkConfig = clientContext.networks[ - network - ] as NetworkConfiguration; - return ( - <div className="px-md" key={networkConfig.id}> - <RadioButton - label={networkConfig.name} - isChecked={activeNetwork === networkConfig.id} - onChange={() => handleNetworkChange(networkConfig)} - /> - </div> - ); - })} + {Object.values(networks).map((network) => ( + <div className="px-md" key={network.id}> + <RadioButton + label={network.name} + isChecked={activeNetwork === network.id} + onChange={() => handleNetworkChange(network)} + /> + </div> + ))} </div> </DialogLayoutBody> </DialogLayout> diff --git a/apps/wallet-dashboard/components/Dialogs/settings/views/SettingsListView.tsx b/apps/wallet-dashboard/components/Dialogs/settings/views/SettingsListView.tsx index 5ed55017ab9..7e9d484de73 100644 --- a/apps/wallet-dashboard/components/Dialogs/settings/views/SettingsListView.tsx +++ b/apps/wallet-dashboard/components/Dialogs/settings/views/SettingsListView.tsx @@ -26,17 +26,16 @@ interface SettingsListViewProps { export function SettingsListView({ handleClose, setView }: SettingsListViewProps): JSX.Element { const { network } = useIotaClientContext(); const { name: networkName } = getNetwork(network); - function onSelectSettingClick(view: SettingsDialogView): void { - setView(view); - } + const MENU_ITEMS = [ { title: 'Network', subtitle: networkName, icon: <Globe />, - onClick: () => onSelectSettingClick(SettingsDialogView.NetworkSettings), + onClick: () => setView(SettingsDialogView.NetworkSettings), }, ]; + return ( <DialogLayout> <Header title="Settings" onClose={handleClose} onBack={handleClose} titleCentered /> From 2e1eb073606a94ec3300ae8a7ed9f90a23bd9c29 Mon Sep 17 00:00:00 2001 From: Dr-Electron <dr-electr0n@protonmail.com> Date: Thu, 19 Dec 2024 11:33:35 +0100 Subject: [PATCH 91/97] fix: fix broken links (#4439) --- crates/iota-json-rpc-types/src/iota_object.rs | 1 - crates/iota-move-build/src/lib.rs | 4 +++- crates/iota-open-rpc/spec/openrpc.json | 2 +- sdk/typescript/src/client/types/generated.ts | 2 +- 4 files changed, 5 insertions(+), 4 deletions(-) diff --git a/crates/iota-json-rpc-types/src/iota_object.rs b/crates/iota-json-rpc-types/src/iota_object.rs index 45d1eaff03d..8a7947d2b67 100644 --- a/crates/iota-json-rpc-types/src/iota_object.rs +++ b/crates/iota-json-rpc-types/src/iota_object.rs @@ -209,7 +209,6 @@ pub struct IotaObjectData { /// The Display metadata for frontend UI rendering, default to be None /// unless IotaObjectDataOptions.showContent is set to true This can also /// be None if the struct type does not have Display defined - /// See more details in <https://forums.iota.io/t/nft-object-display-proposal/4872> #[serde(skip_serializing_if = "Option::is_none")] pub display: Option<DisplayFieldsResponse>, /// Move object content or package content, default to be None unless diff --git a/crates/iota-move-build/src/lib.rs b/crates/iota-move-build/src/lib.rs index 260c2ce2ef8..309885fcbf1 100644 --- a/crates/iota-move-build/src/lib.rs +++ b/crates/iota-move-build/src/lib.rs @@ -204,7 +204,9 @@ pub fn decorate_warnings(warning_diags: Diagnostics, files: Option<&MappedFiles> report_warnings(f, warning_diags); } if any_linter_warnings { - eprintln!("Please report feedback on the linter warnings at https://forums.iota.io\n"); + eprintln!( + "Please report feedback on the linter warnings at https://github.com/iotaledger/iota/issues\n" + ); } if filtered_diags_num > 0 { eprintln!( diff --git a/crates/iota-open-rpc/spec/openrpc.json b/crates/iota-open-rpc/spec/openrpc.json index 5a54a311381..95f08307724 100644 --- a/crates/iota-open-rpc/spec/openrpc.json +++ b/crates/iota-open-rpc/spec/openrpc.json @@ -9700,7 +9700,7 @@ ] }, "display": { - "description": "The Display metadata for frontend UI rendering, default to be None unless IotaObjectDataOptions.showContent is set to true This can also be None if the struct type does not have Display defined See more details in <https://forums.iota.io/t/nft-object-display-proposal/4872>", + "description": "The Display metadata for frontend UI rendering, default to be None unless IotaObjectDataOptions.showContent is set to true This can also be None if the struct type does not have Display defined", "anyOf": [ { "$ref": "#/components/schemas/DisplayFieldsResponse" diff --git a/sdk/typescript/src/client/types/generated.ts b/sdk/typescript/src/client/types/generated.ts index 113119521fe..26c4f5a9d2f 100644 --- a/sdk/typescript/src/client/types/generated.ts +++ b/sdk/typescript/src/client/types/generated.ts @@ -1020,7 +1020,7 @@ export interface IotaObjectData { /** * The Display metadata for frontend UI rendering, default to be None unless * IotaObjectDataOptions.showContent is set to true This can also be None if the struct type does not - * have Display defined See more details in <https://forums.iota.io/t/nft-object-display-proposal/4872> + * have Display defined */ display?: DisplayFieldsResponse | null; objectId: string; From f5f3354870e205ea39c37eba150a4473ad010149 Mon Sep 17 00:00:00 2001 From: evavirseda <evirseda@boxfish.studio> Date: Thu, 19 Dec 2024 12:02:24 +0100 Subject: [PATCH 92/97] fix(explorer): fix incorrect unit in homepage reference gas price (#4561) --- apps/explorer/src/components/home-metrics/OnTheNetwork.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/explorer/src/components/home-metrics/OnTheNetwork.tsx b/apps/explorer/src/components/home-metrics/OnTheNetwork.tsx index d98dc4b126f..35bd6468232 100644 --- a/apps/explorer/src/components/home-metrics/OnTheNetwork.tsx +++ b/apps/explorer/src/components/home-metrics/OnTheNetwork.tsx @@ -98,7 +98,7 @@ export function OnTheNetwork(): JSX.Element { size={LabelTextSize.Large} label="Reference Gas Price" text={gasPriceFormatted ?? '-'} - supportingLabel={gasPriceFormatted !== null ? 'IOTA' : undefined} + supportingLabel={gasPriceFormatted !== null ? 'nano' : undefined} tooltipPosition={TooltipPosition.Top} tooltipText="The reference gas price in the current epoch." /> From 1bd64f9e18b7a1d1badef1ab4869699e27aa6160 Mon Sep 17 00:00:00 2001 From: vivekjain23 <165671934+vivekjain23@users.noreply.github.com> Date: Thu, 19 Dec 2024 19:02:20 +0530 Subject: [PATCH 93/97] fix(docs): Fix feedback form UI (#4549) * Fix feedback form UI --- docs/site/src/components/FeedbackForm/index.tsx | 2 -- docs/site/src/components/FeedbackForm/styles.css | 12 +++++++++++- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/docs/site/src/components/FeedbackForm/index.tsx b/docs/site/src/components/FeedbackForm/index.tsx index 8613ffdf7a3..5dcf5af6d40 100644 --- a/docs/site/src/components/FeedbackForm/index.tsx +++ b/docs/site/src/components/FeedbackForm/index.tsx @@ -20,7 +20,6 @@ const FeedbackForm = () => { return ( <div className="feedback-container"> - <div className="divider"></div> <div className={clsx("h3", "feedback-header")}>Feedback Form</div> <form onSubmit={handleSubmit}> <div className="form-group"> @@ -54,7 +53,6 @@ const FeedbackForm = () => { Submit Feedback </button> </form> - <div className="divider"></div> </div> ); }; diff --git a/docs/site/src/components/FeedbackForm/styles.css b/docs/site/src/components/FeedbackForm/styles.css index 4e742a9afb3..4aafcee2f8e 100644 --- a/docs/site/src/components/FeedbackForm/styles.css +++ b/docs/site/src/components/FeedbackForm/styles.css @@ -1,5 +1,15 @@ .feedback-container { - /* margin: 20px; */ + background-color: #0000001a; + padding-top: 0.25rem; + padding-left: 2rem; + padding-right: 2rem; + padding-bottom: 1.25rem; + margin-top: 1rem; + border-radius: 0.5rem; +} + +[data-theme="dark"] .feedback-container { + background-color: #1e1e1e; } .feedback-header { From 12eacd99d66f112742cbbc3faa1abc2e520972c4 Mon Sep 17 00:00:00 2001 From: DaughterOfMars <chloedaughterofmars@gmail.com> Date: Thu, 19 Dec 2024 09:41:18 -0500 Subject: [PATCH 94/97] fix(CI): Fix move tests workflow and add additional tests that use examples (#4429) * fix(CI): Fix move tests workflow and add additional tests that use examples * dprint * run all framework tests * rename example mods to move_tests * revert iota-framework-tests changes --------- Co-authored-by: Thibault Martinez <thibault@iota.org> --- .github/workflows/_move_tests.yml | 22 +- .../unit_tests/authority_aggregator_tests.rs | 478 +++++------ .../src/unit_tests/execution_driver_tests.rs | 747 +++++++++--------- crates/iota-json-rpc-tests/tests/read_api.rs | 172 ++-- .../tests/transaction_builder_api.rs | 86 +- crates/iota-json/src/tests.rs | 164 ++-- .../unit_tests/balance_changing_tx_tests.rs | 174 ++-- 7 files changed, 949 insertions(+), 894 deletions(-) diff --git a/.github/workflows/_move_tests.yml b/.github/workflows/_move_tests.yml index a98c7ad8f3f..54c8b002f08 100644 --- a/.github/workflows/_move_tests.yml +++ b/.github/workflows/_move_tests.yml @@ -26,4 +26,24 @@ jobs: tool: nextest - name: Run move tests run: | - cargo nextest run -p iota-framework-tests -- unit_tests:: + cargo nextest run -E + 'package(iota-framework-tests) + or (package(iota-core) and test(quorum_driver::)) + or package(iota-benchmark) + or test(move_tests::)' + + move-simtest: + timeout-minutes: 10 + runs-on: [self-hosted] + steps: + - uses: actions/checkout@eef61447b9ff4aafe5dcd4e0bbf5d482be7e7871 # v4.2.1 + - uses: taiki-e/install-action@375e0c7f08a66b8c2ba7e7eef31a6f91043a81b0 # v2.44.38 + with: + tool: nextest + - name: Run move tests + run: | + scripts/simtest/cargo-simtest simtest --profile ci -E + 'package(iota-framework-tests) + or (package(iota-core) and test(quorum_driver::)) + or package(iota-benchmark) + or test(move_tests::)' diff --git a/crates/iota-core/src/unit_tests/authority_aggregator_tests.rs b/crates/iota-core/src/unit_tests/authority_aggregator_tests.rs index f0ec7181006..ac734a40e8f 100644 --- a/crates/iota-core/src/unit_tests/authority_aggregator_tests.rs +++ b/crates/iota-core/src/unit_tests/authority_aggregator_tests.rs @@ -345,254 +345,262 @@ fn effects_with_tx(digest: TransactionDigest) -> TransactionEffects { effects } -/// The intent of this is to test whether client side timeouts -/// have any impact on the server execution. Turns out because -/// we spawn a tokio task on the server, client timing out and -/// terminating the connection does not stop server from completing -/// execution on its side -#[sim_test(config = "constant_latency_ms(1)")] -async fn test_quorum_map_and_reduce_timeout() { - let build_config = BuildConfig::new_for_testing(); - let mut path = PathBuf::from(env!("CARGO_MANIFEST_DIR")); - path.extend(["src", "unit_tests", "data", "object_basics"]); - let client_ip = make_socket_addr(); - let modules: Vec<_> = build_config - .build(&path) - .unwrap() - .get_modules() - .cloned() - .collect(); - let pkg = Object::new_package_for_testing( - &modules, - TransactionDigest::genesis_marker(), - BuiltInFramework::genesis_move_packages(), - ) - .unwrap(); - let (addr1, key1): (_, AccountKeyPair) = get_key_pair(); - let gas_object1 = Object::with_owner_for_testing(addr1); - let genesis_objects = vec![pkg.clone(), gas_object1.clone()]; - let (mut authorities, _, genesis, _) = init_local_authorities(4, genesis_objects).await; - let rgp = reference_gas_price(&authorities); - let pkg = genesis.object(pkg.id()).unwrap(); - let gas_object1 = genesis.object(gas_object1.id()).unwrap(); - let gas_ref_1 = gas_object1.compute_object_reference(); - let tx = create_object_move_transaction(addr1, &key1, addr1, 100, pkg.id(), gas_ref_1, rgp); - let certified_tx = authorities - .process_transaction(tx.clone(), Some(client_ip)) - .await; - assert!(certified_tx.is_ok()); - let certificate = certified_tx.unwrap().into_cert_for_testing(); - // Send request with a very small timeout to trigger timeout error - authorities.timeouts.pre_quorum_timeout = Duration::from_nanos(0); - authorities.timeouts.post_quorum_timeout = Duration::from_nanos(0); - let request = HandleCertificateRequestV1 { - certificate: certificate.clone(), - include_events: true, - include_input_objects: false, - include_output_objects: false, - include_auxiliary_data: false, - }; - let certified_effects = authorities - .process_certificate(request, Some(client_ip)) - .await; - // Ensure it is an error - assert!(certified_effects.is_err()); - assert!(matches!( - certified_effects, - Err(AggregatorProcessCertificateError::RetryableExecuteCertificate { .. }) - )); - tokio::time::sleep(tokio::time::Duration::from_secs(10)).await; - let tx_info = TransactionInfoRequest { - transaction_digest: *tx.digest(), - }; - for (_, client) in authorities.authority_clients.iter() { - let resp = client - .handle_transaction_info_request(tx_info.clone()) +mod move_tests { + use super::*; + + /// The intent of this is to test whether client side timeouts + /// have any impact on the server execution. Turns out because + /// we spawn a tokio task on the server, client timing out and + /// terminating the connection does not stop server from completing + /// execution on its side + #[sim_test(config = "constant_latency_ms(1)")] + async fn test_quorum_map_and_reduce_timeout() { + let build_config = BuildConfig::new_for_testing(); + let mut path = PathBuf::from(env!("CARGO_MANIFEST_DIR")); + path.extend(["src", "unit_tests", "data", "object_basics"]); + let client_ip = make_socket_addr(); + let modules: Vec<_> = build_config + .build(&path) + .unwrap() + .get_modules() + .cloned() + .collect(); + let pkg = Object::new_package_for_testing( + &modules, + TransactionDigest::genesis_marker(), + BuiltInFramework::genesis_move_packages(), + ) + .unwrap(); + let (addr1, key1): (_, AccountKeyPair) = get_key_pair(); + let gas_object1 = Object::with_owner_for_testing(addr1); + let genesis_objects = vec![pkg.clone(), gas_object1.clone()]; + let (mut authorities, _, genesis, _) = init_local_authorities(4, genesis_objects).await; + let rgp = reference_gas_price(&authorities); + let pkg = genesis.object(pkg.id()).unwrap(); + let gas_object1 = genesis.object(gas_object1.id()).unwrap(); + let gas_ref_1 = gas_object1.compute_object_reference(); + let tx = create_object_move_transaction(addr1, &key1, addr1, 100, pkg.id(), gas_ref_1, rgp); + let certified_tx = authorities + .process_transaction(tx.clone(), Some(client_ip)) .await; - // Server should return a signed effect even though previous calls - // failed due to timeout - assert!(resp.is_ok()); - assert!(resp.unwrap().is_executed()); + assert!(certified_tx.is_ok()); + let certificate = certified_tx.unwrap().into_cert_for_testing(); + // Send request with a very small timeout to trigger timeout error + authorities.timeouts.pre_quorum_timeout = Duration::from_nanos(0); + authorities.timeouts.post_quorum_timeout = Duration::from_nanos(0); + let request = HandleCertificateRequestV1 { + certificate: certificate.clone(), + include_events: true, + include_input_objects: false, + include_output_objects: false, + include_auxiliary_data: false, + }; + let certified_effects = authorities + .process_certificate(request, Some(client_ip)) + .await; + // Ensure it is an error + assert!(certified_effects.is_err()); + assert!(matches!( + certified_effects, + Err(AggregatorProcessCertificateError::RetryableExecuteCertificate { .. }) + )); + tokio::time::sleep(tokio::time::Duration::from_secs(10)).await; + let tx_info = TransactionInfoRequest { + transaction_digest: *tx.digest(), + }; + for (_, client) in authorities.authority_clients.iter() { + let resp = client + .handle_transaction_info_request(tx_info.clone()) + .await; + // Server should return a signed effect even though previous calls + // failed due to timeout + assert!(resp.is_ok()); + assert!(resp.unwrap().is_executed()); + } } -} -#[sim_test] -async fn test_map_reducer() { - let (authorities, _, _, _) = init_local_authorities(4, vec![]).await; - - // Test: mapper errors do not get propagated up, reducer works - let res = quorum_map_then_reduce_with_timeout::<_, _, _, _, _, (), _, _, _>( - authorities.committee.clone(), - authorities.authority_clients.clone(), - 0usize, - |_name, _client| { - Box::pin(async move { - let res: Result<usize, IotaError> = Err(IotaError::TooManyIncorrectAuthorities { - errors: vec![], - action: "".to_string(), - }); - res - }) - }, - |mut accumulated_state, _authority_name, _authority_weight, result| { - Box::pin(async move { - assert!(matches!( - result, - Err(IotaError::TooManyIncorrectAuthorities { .. }) - )); - accumulated_state += 1; - ReduceOutput::Continue(accumulated_state) - }) - }, - Duration::from_millis(1000), - ) - .await - .unwrap_err(); - assert_eq!(4, res); - - // Test: early end - let res = quorum_map_then_reduce_with_timeout( - authorities.committee.clone(), - authorities.authority_clients.clone(), - 0usize, - |_name, _client| Box::pin(async move { Ok::<(), anyhow::Error>(()) }), - |mut accumulated_state, _authority_name, _authority_weight, _result| { - Box::pin(async move { - if accumulated_state > 2 { - ReduceOutput::Success(accumulated_state) - } else { + #[sim_test] + async fn test_map_reducer() { + let (authorities, _, _, _) = init_local_authorities(4, vec![]).await; + + // Test: mapper errors do not get propagated up, reducer works + let res = quorum_map_then_reduce_with_timeout::<_, _, _, _, _, (), _, _, _>( + authorities.committee.clone(), + authorities.authority_clients.clone(), + 0usize, + |_name, _client| { + Box::pin(async move { + let res: Result<usize, IotaError> = + Err(IotaError::TooManyIncorrectAuthorities { + errors: vec![], + action: "".to_string(), + }); + res + }) + }, + |mut accumulated_state, _authority_name, _authority_weight, result| { + Box::pin(async move { + assert!(matches!( + result, + Err(IotaError::TooManyIncorrectAuthorities { .. }) + )); accumulated_state += 1; ReduceOutput::Continue(accumulated_state) - } - }) - }, - Duration::from_millis(1000), - ) - .await - .unwrap(); - assert_eq!(3, res.0); - - // Test: Global timeout works - let res = quorum_map_then_reduce_with_timeout::<_, _, _, _, _, (), _, _, _>( - authorities.committee.clone(), - authorities.authority_clients.clone(), - 0usize, - |_name, _client| { - Box::pin(async move { - // 10 mins - tokio::time::sleep(Duration::from_secs(10 * 60)).await; - Ok::<(), anyhow::Error>(()) - }) - }, - |_accumulated_state, _authority_name, _authority_weight, _result| { - Box::pin(async move { ReduceOutput::Continue(0) }) - }, - Duration::from_millis(10), - ) - .await - .unwrap_err(); - assert_eq!(0, res); - - // Test: Local timeout works - let bad_auth = *authorities.committee.sample(); - let res = quorum_map_then_reduce_with_timeout::<_, _, _, _, _, (), _, _, _>( - authorities.committee.clone(), - authorities.authority_clients.clone(), - HashSet::new(), - |_name, _client| { - Box::pin(async move { - // 10 mins - if _name == bad_auth { + }) + }, + Duration::from_millis(1000), + ) + .await + .unwrap_err(); + assert_eq!(4, res); + + // Test: early end + let res = quorum_map_then_reduce_with_timeout( + authorities.committee.clone(), + authorities.authority_clients.clone(), + 0usize, + |_name, _client| Box::pin(async move { Ok::<(), anyhow::Error>(()) }), + |mut accumulated_state, _authority_name, _authority_weight, _result| { + Box::pin(async move { + if accumulated_state > 2 { + ReduceOutput::Success(accumulated_state) + } else { + accumulated_state += 1; + ReduceOutput::Continue(accumulated_state) + } + }) + }, + Duration::from_millis(1000), + ) + .await + .unwrap(); + assert_eq!(3, res.0); + + // Test: Global timeout works + let res = quorum_map_then_reduce_with_timeout::<_, _, _, _, _, (), _, _, _>( + authorities.committee.clone(), + authorities.authority_clients.clone(), + 0usize, + |_name, _client| { + Box::pin(async move { + // 10 mins tokio::time::sleep(Duration::from_secs(10 * 60)).await; - } - Ok::<(), anyhow::Error>(()) - }) - }, - |mut accumulated_state, authority_name, _authority_weight, _result| { - Box::pin(async move { - accumulated_state.insert(authority_name); - if accumulated_state.len() <= 3 { - ReduceOutput::Continue(accumulated_state) - } else { - ReduceOutput::ContinueWithTimeout(accumulated_state, Duration::from_millis(10)) - } - }) - }, - // large delay - Duration::from_millis(10 * 60), - ) - .await; - assert_eq!(res.as_ref().unwrap_err().len(), 3); - assert!(!res.as_ref().unwrap_err().contains(&bad_auth)); -} + Ok::<(), anyhow::Error>(()) + }) + }, + |_accumulated_state, _authority_name, _authority_weight, _result| { + Box::pin(async move { ReduceOutput::Continue(0) }) + }, + Duration::from_millis(10), + ) + .await + .unwrap_err(); + assert_eq!(0, res); + + // Test: Local timeout works + let bad_auth = *authorities.committee.sample(); + let res = quorum_map_then_reduce_with_timeout::<_, _, _, _, _, (), _, _, _>( + authorities.committee.clone(), + authorities.authority_clients.clone(), + HashSet::new(), + |_name, _client| { + Box::pin(async move { + // 10 mins + if _name == bad_auth { + tokio::time::sleep(Duration::from_secs(10 * 60)).await; + } + Ok::<(), anyhow::Error>(()) + }) + }, + |mut accumulated_state, authority_name, _authority_weight, _result| { + Box::pin(async move { + accumulated_state.insert(authority_name); + if accumulated_state.len() <= 3 { + ReduceOutput::Continue(accumulated_state) + } else { + ReduceOutput::ContinueWithTimeout( + accumulated_state, + Duration::from_millis(10), + ) + } + }) + }, + // large delay + Duration::from_millis(10 * 60), + ) + .await; + assert_eq!(res.as_ref().unwrap_err().len(), 3); + assert!(!res.as_ref().unwrap_err().contains(&bad_auth)); + } -#[sim_test] -async fn test_process_transaction_fault_success() { - // This test exercises the 4 different possible failing case when one authority - // is faulty. A transaction is sent to all authories, however one of them - // will error out either before or after processing the transaction. - // A cert should still be created, and sent out to all authorities again. This - // time a different authority errors out either before or after processing - // the cert. - for i in 0..4 { - let mut config_before_process_transaction = LocalAuthorityClientFaultConfig::default(); - if i % 2 == 0 { - config_before_process_transaction.fail_before_handle_transaction = true; - } else { - config_before_process_transaction.fail_after_handle_transaction = true; - } - let mut config_before_process_certificate = LocalAuthorityClientFaultConfig::default(); - if i < 2 { - config_before_process_certificate.fail_before_handle_confirmation = true; - } else { - config_before_process_certificate.fail_after_handle_confirmation = true; + #[sim_test] + async fn test_process_transaction_fault_success() { + // This test exercises the 4 different possible failing case when one authority + // is faulty. A transaction is sent to all authories, however one of them + // will error out either before or after processing the transaction. + // A cert should still be created, and sent out to all authorities again. This + // time a different authority errors out either before or after processing + // the cert. + for i in 0..4 { + let mut config_before_process_transaction = LocalAuthorityClientFaultConfig::default(); + if i % 2 == 0 { + config_before_process_transaction.fail_before_handle_transaction = true; + } else { + config_before_process_transaction.fail_after_handle_transaction = true; + } + let mut config_before_process_certificate = LocalAuthorityClientFaultConfig::default(); + if i < 2 { + config_before_process_certificate.fail_before_handle_confirmation = true; + } else { + config_before_process_certificate.fail_after_handle_confirmation = true; + } + assert!( + execute_transaction_with_fault_configs( + &[(0, config_before_process_transaction)], + &[(1, config_before_process_certificate)], + ) + .await + ); } + } + + #[sim_test] + async fn test_process_transaction_fault_fail() { + // This test exercises the cases when there are 2 authorities faulty, + // and hence no quorum could be formed. This is tested on the + // process_transaction phase. + let fail_before_process_transaction_config = LocalAuthorityClientFaultConfig { + fail_before_handle_transaction: true, + ..Default::default() + }; assert!( - execute_transaction_with_fault_configs(&[(0, config_before_process_transaction)], &[( - 1, - config_before_process_certificate - )],) + !execute_transaction_with_fault_configs( + &[ + (0, fail_before_process_transaction_config), + (1, fail_before_process_transaction_config), + ], + &[], + ) .await ); } -} -#[sim_test] -async fn test_process_transaction_fault_fail() { - // This test exercises the cases when there are 2 authorities faulty, - // and hence no quorum could be formed. This is tested on the - // process_transaction phase. - let fail_before_process_transaction_config = LocalAuthorityClientFaultConfig { - fail_before_handle_transaction: true, - ..Default::default() - }; - assert!( - !execute_transaction_with_fault_configs( - &[ - (0, fail_before_process_transaction_config), - (1, fail_before_process_transaction_config), - ], - &[], - ) - .await - ); -} - -#[sim_test] -async fn test_process_certificate_fault_fail() { - // Similar to test_process_transaction_fault_fail but tested on the - // process_certificate phase. - let fail_before_process_certificate_config = LocalAuthorityClientFaultConfig { - fail_before_handle_confirmation: true, - ..Default::default() - }; - assert!( - !execute_transaction_with_fault_configs(&[], &[ - (0, fail_before_process_certificate_config), - (1, fail_before_process_certificate_config), - ],) - .await - ); + #[sim_test] + async fn test_process_certificate_fault_fail() { + // Similar to test_process_transaction_fault_fail but tested on the + // process_certificate phase. + let fail_before_process_certificate_config = LocalAuthorityClientFaultConfig { + fail_before_handle_confirmation: true, + ..Default::default() + }; + assert!( + !execute_transaction_with_fault_configs(&[], &[ + (0, fail_before_process_certificate_config), + (1, fail_before_process_certificate_config), + ],) + .await + ); + } } #[tokio::test(start_paused = true)] diff --git a/crates/iota-core/src/unit_tests/execution_driver_tests.rs b/crates/iota-core/src/unit_tests/execution_driver_tests.rs index 50363e411c1..e41d0583860 100644 --- a/crates/iota-core/src/unit_tests/execution_driver_tests.rs +++ b/crates/iota-core/src/unit_tests/execution_driver_tests.rs @@ -298,268 +298,300 @@ async fn execute_shared_on_first_three_authorities( (cert, effects) } -#[tokio::test(flavor = "current_thread", start_paused = true)] -async fn test_execution_with_dependencies() { - telemetry_subscribers::init_for_testing(); - - // ---- Initialize a network with three accounts, each with 10 gas objects. - - const NUM_ACCOUNTS: usize = 3; - let accounts: Vec<(_, AccountKeyPair)> = - (0..NUM_ACCOUNTS).map(|_| get_key_pair()).collect_vec(); - - const NUM_GAS_OBJECTS_PER_ACCOUNT: usize = 10; - let gas_objects = (0..NUM_ACCOUNTS) - .map(|i| { - (0..NUM_GAS_OBJECTS_PER_ACCOUNT) - .map(|_| Object::with_owner_for_testing(accounts[i].0)) - .collect_vec() - }) - .collect_vec(); - let all_gas_objects = gas_objects.clone().into_iter().flatten().collect_vec(); - - let (aggregator, authorities, _genesis, package) = - init_local_authorities(4, all_gas_objects.clone()).await; - let authority_clients: Vec<_> = authorities - .iter() - .map(|a| aggregator.authority_clients[&a.name].clone()) - .collect(); - let rgp = authorities - .first() - .unwrap() - .reference_gas_price_for_testing() - .unwrap(); - - // ---- Create an owned object and a shared counter. - - let mut executed_owned_certs = Vec::new(); - let mut executed_shared_certs = Vec::new(); - - // Initialize an object owned by 1st account. - let (addr1, key1): &(_, AccountKeyPair) = &accounts[0]; - let gas_ref = get_latest_ref(authority_clients[0].clone(), gas_objects[0][0].id()).await; - let tx1 = create_object_move_transaction(*addr1, key1, *addr1, 100, package, gas_ref, rgp); - let (cert, effects1) = - execute_owned_on_first_three_authorities(&authority_clients, &aggregator.committee, &tx1) - .await; - executed_owned_certs.push(cert); - let mut owned_object_ref = effects1.created()[0].0; - - // Initialize a shared counter, re-using gas_ref_0 so it has to execute after - // tx1. - let gas_ref = get_latest_ref(authority_clients[0].clone(), gas_objects[0][0].id()).await; - let tx2 = TestTransactionBuilder::new(*addr1, gas_ref, rgp) - .call_counter_create(package) - .build_and_sign(key1); - let (cert, effects2) = - execute_owned_on_first_three_authorities(&authority_clients, &aggregator.committee, &tx2) - .await; - executed_owned_certs.push(cert); - let (mut shared_counter_ref, owner) = effects2.created()[0]; - let shared_counter_initial_version = if let Owner::Shared { - initial_shared_version, - } = owner - { - // Because the gas object used has version 2, the initial lamport timestamp of - // the shared counter is 3. - assert_eq!(initial_shared_version.value(), 3); - initial_shared_version - } else { - panic!("Not a shared object! {:?} {:?}", shared_counter_ref, owner); - }; +mod move_tests { + use super::*; + + #[tokio::test(flavor = "current_thread", start_paused = true)] + async fn test_execution_with_dependencies() { + telemetry_subscribers::init_for_testing(); + + // ---- Initialize a network with three accounts, each with 10 gas objects. + + const NUM_ACCOUNTS: usize = 3; + let accounts: Vec<(_, AccountKeyPair)> = + (0..NUM_ACCOUNTS).map(|_| get_key_pair()).collect_vec(); + + const NUM_GAS_OBJECTS_PER_ACCOUNT: usize = 10; + let gas_objects = (0..NUM_ACCOUNTS) + .map(|i| { + (0..NUM_GAS_OBJECTS_PER_ACCOUNT) + .map(|_| Object::with_owner_for_testing(accounts[i].0)) + .collect_vec() + }) + .collect_vec(); + let all_gas_objects = gas_objects.clone().into_iter().flatten().collect_vec(); + + let (aggregator, authorities, _genesis, package) = + init_local_authorities(4, all_gas_objects.clone()).await; + let authority_clients: Vec<_> = authorities + .iter() + .map(|a| aggregator.authority_clients[&a.name].clone()) + .collect(); + let rgp = authorities + .first() + .unwrap() + .reference_gas_price_for_testing() + .unwrap(); - // ---- Execute transactions with dependencies on first 3 nodes in the - // dependency order. + // ---- Create an owned object and a shared counter. - // In each iteration, creates an owned and a shared transaction that depends on - // previous input and gas objects. - for i in 0..100 { - let source_index = i % NUM_ACCOUNTS; - let (source_addr, source_key) = &accounts[source_index]; + let mut executed_owned_certs = Vec::new(); + let mut executed_shared_certs = Vec::new(); - let gas_ref = get_latest_ref( - authority_clients[source_index].clone(), - gas_objects[source_index][i * 3 % NUM_GAS_OBJECTS_PER_ACCOUNT].id(), + // Initialize an object owned by 1st account. + let (addr1, key1): &(_, AccountKeyPair) = &accounts[0]; + let gas_ref = get_latest_ref(authority_clients[0].clone(), gas_objects[0][0].id()).await; + let tx1 = create_object_move_transaction(*addr1, key1, *addr1, 100, package, gas_ref, rgp); + let (cert, effects1) = execute_owned_on_first_three_authorities( + &authority_clients, + &aggregator.committee, + &tx1, ) .await; - let (dest_addr, _) = &accounts[(i + 1) % NUM_ACCOUNTS]; - let owned_tx = make_transfer_object_move_transaction( - *source_addr, - source_key, - *dest_addr, - owned_object_ref, - package, - gas_ref, - TEST_ONLY_GAS_UNIT_FOR_HEAVY_COMPUTATION_STORAGE, - rgp, - ); - let (cert, effects) = execute_owned_on_first_three_authorities( + executed_owned_certs.push(cert); + let mut owned_object_ref = effects1.created()[0].0; + + // Initialize a shared counter, re-using gas_ref_0 so it has to execute after + // tx1. + let gas_ref = get_latest_ref(authority_clients[0].clone(), gas_objects[0][0].id()).await; + let tx2 = TestTransactionBuilder::new(*addr1, gas_ref, rgp) + .call_counter_create(package) + .build_and_sign(key1); + let (cert, effects2) = execute_owned_on_first_three_authorities( &authority_clients, &aggregator.committee, - &owned_tx, + &tx2, ) .await; executed_owned_certs.push(cert); - owned_object_ref = effects.mutated_excluding_gas().first().unwrap().0; + let (mut shared_counter_ref, owner) = effects2.created()[0]; + let shared_counter_initial_version = if let Owner::Shared { + initial_shared_version, + } = owner + { + // Because the gas object used has version 2, the initial lamport timestamp of + // the shared counter is 3. + assert_eq!(initial_shared_version.value(), 3); + initial_shared_version + } else { + panic!("Not a shared object! {:?} {:?}", shared_counter_ref, owner); + }; - let gas_ref = get_latest_ref( - authority_clients[source_index].clone(), - gas_objects[source_index][i * 7 % NUM_GAS_OBJECTS_PER_ACCOUNT].id(), - ) - .await; - let shared_tx = TestTransactionBuilder::new(*source_addr, gas_ref, rgp) - .call_counter_increment( + // ---- Execute transactions with dependencies on first 3 nodes in the + // dependency order. + + // In each iteration, creates an owned and a shared transaction that depends on + // previous input and gas objects. + for i in 0..100 { + let source_index = i % NUM_ACCOUNTS; + let (source_addr, source_key) = &accounts[source_index]; + + let gas_ref = get_latest_ref( + authority_clients[source_index].clone(), + gas_objects[source_index][i * 3 % NUM_GAS_OBJECTS_PER_ACCOUNT].id(), + ) + .await; + let (dest_addr, _) = &accounts[(i + 1) % NUM_ACCOUNTS]; + let owned_tx = make_transfer_object_move_transaction( + *source_addr, + source_key, + *dest_addr, + owned_object_ref, package, - shared_counter_ref.0, - shared_counter_initial_version, + gas_ref, + TEST_ONLY_GAS_UNIT_FOR_HEAVY_COMPUTATION_STORAGE, + rgp, + ); + let (cert, effects) = execute_owned_on_first_three_authorities( + &authority_clients, + &aggregator.committee, + &owned_tx, ) - .build_and_sign(source_key); - let (cert, effects) = execute_shared_on_first_three_authorities( - &authority_clients, - &aggregator.committee, - &shared_tx, - ) - .await; - executed_shared_certs.push(cert); - shared_counter_ref = effects.mutated_excluding_gas().first().unwrap().0; - } + .await; + executed_owned_certs.push(cert); + owned_object_ref = effects.mutated_excluding_gas().first().unwrap().0; - // ---- Execute transactions in reverse dependency order on the last authority. + let gas_ref = get_latest_ref( + authority_clients[source_index].clone(), + gas_objects[source_index][i * 7 % NUM_GAS_OBJECTS_PER_ACCOUNT].id(), + ) + .await; + let shared_tx = TestTransactionBuilder::new(*source_addr, gas_ref, rgp) + .call_counter_increment( + package, + shared_counter_ref.0, + shared_counter_initial_version, + ) + .build_and_sign(source_key); + let (cert, effects) = execute_shared_on_first_three_authorities( + &authority_clients, + &aggregator.committee, + &shared_tx, + ) + .await; + executed_shared_certs.push(cert); + shared_counter_ref = effects.mutated_excluding_gas().first().unwrap().0; + } - // Sets shared object locks in the executed order. - for cert in executed_shared_certs.iter() { - send_consensus_no_execution(&authorities[3], cert).await; - } + // ---- Execute transactions in reverse dependency order on the last authority. - // Enqueue certs out of dependency order for executions. - for cert in executed_shared_certs.iter().rev() { - authorities[3].enqueue_certificates_for_execution( - vec![cert.clone()], - &authorities[3].epoch_store_for_testing(), - ); - } - for cert in executed_owned_certs.iter().rev() { - authorities[3].enqueue_certificates_for_execution( - vec![cert.clone()], - &authorities[3].epoch_store_for_testing(), - ); - } + // Sets shared object locks in the executed order. + for cert in executed_shared_certs.iter() { + send_consensus_no_execution(&authorities[3], cert).await; + } - // All certs should get executed eventually. - let digests: Vec<_> = executed_shared_certs - .iter() - .chain(executed_owned_certs.iter()) - .map(|cert| *cert.digest()) - .collect(); - authorities[3] - .get_transaction_cache_reader() - .notify_read_executed_effects(&digests) - .await - .unwrap(); -} + // Enqueue certs out of dependency order for executions. + for cert in executed_shared_certs.iter().rev() { + authorities[3].enqueue_certificates_for_execution( + vec![cert.clone()], + &authorities[3].epoch_store_for_testing(), + ); + } + for cert in executed_owned_certs.iter().rev() { + authorities[3].enqueue_certificates_for_execution( + vec![cert.clone()], + &authorities[3].epoch_store_for_testing(), + ); + } -fn make_socket_addr() -> std::net::SocketAddr { - SocketAddr::new(IpAddr::V4(Ipv4Addr::new(127, 0, 0, 1)), 0) -} + // All certs should get executed eventually. + let digests: Vec<_> = executed_shared_certs + .iter() + .chain(executed_owned_certs.iter()) + .map(|cert| *cert.digest()) + .collect(); + authorities[3] + .get_transaction_cache_reader() + .notify_read_executed_effects(&digests) + .await + .unwrap(); + } -async fn try_sign_on_first_three_authorities( - authority_clients: &[Arc<SafeClient<LocalAuthorityClient>>], - committee: &Committee, - txn: &Transaction, -) -> IotaResult<VerifiedCertificate> { - for client in authority_clients.iter().take(3) { - client - .handle_transaction(txn.clone(), Some(make_socket_addr())) - .await?; + fn make_socket_addr() -> std::net::SocketAddr { + SocketAddr::new(IpAddr::V4(Ipv4Addr::new(127, 0, 0, 1)), 0) } - extract_cert(authority_clients, committee, txn.digest()) - .await - .try_into_verified_for_testing(committee, &Default::default()) -} -#[tokio::test(flavor = "current_thread", start_paused = true)] -async fn test_per_object_overload() { - telemetry_subscribers::init_for_testing(); + async fn try_sign_on_first_three_authorities( + authority_clients: &[Arc<SafeClient<LocalAuthorityClient>>], + committee: &Committee, + txn: &Transaction, + ) -> IotaResult<VerifiedCertificate> { + for client in authority_clients.iter().take(3) { + client + .handle_transaction(txn.clone(), Some(make_socket_addr())) + .await?; + } + extract_cert(authority_clients, committee, txn.digest()) + .await + .try_into_verified_for_testing(committee, &Default::default()) + } - // Initialize a network with 1 account and 2000 gas objects. - let (addr, key): (_, AccountKeyPair) = get_key_pair(); - const NUM_GAS_OBJECTS_PER_ACCOUNT: usize = 2000; - let gas_objects = (0..NUM_GAS_OBJECTS_PER_ACCOUNT) - .map(|_| Object::with_owner_for_testing(addr)) - .collect_vec(); - let (aggregator, authorities, _genesis, package) = - init_local_authorities(4, gas_objects.clone()).await; - let rgp = authorities - .first() - .unwrap() - .reference_gas_price_for_testing() + #[tokio::test(flavor = "current_thread", start_paused = true)] + async fn test_per_object_overload() { + telemetry_subscribers::init_for_testing(); + + // Initialize a network with 1 account and 2000 gas objects. + let (addr, key): (_, AccountKeyPair) = get_key_pair(); + const NUM_GAS_OBJECTS_PER_ACCOUNT: usize = 2000; + let gas_objects = (0..NUM_GAS_OBJECTS_PER_ACCOUNT) + .map(|_| Object::with_owner_for_testing(addr)) + .collect_vec(); + let (aggregator, authorities, _genesis, package) = + init_local_authorities(4, gas_objects.clone()).await; + let rgp = authorities + .first() + .unwrap() + .reference_gas_price_for_testing() + .unwrap(); + let authority_clients: Vec<_> = authorities + .iter() + .map(|a| aggregator.authority_clients[&a.name].clone()) + .collect(); + + // Create a shared counter. + let gas_ref = get_latest_ref(authority_clients[0].clone(), gas_objects[0].id()).await; + let create_counter_txn = TestTransactionBuilder::new(addr, gas_ref, rgp) + .call_counter_create(package) + .build_and_sign(&key); + let create_counter_cert = try_sign_on_first_three_authorities( + &authority_clients, + &aggregator.committee, + &create_counter_txn, + ) + .await .unwrap(); - let authority_clients: Vec<_> = authorities - .iter() - .map(|a| aggregator.authority_clients[&a.name].clone()) - .collect(); - - // Create a shared counter. - let gas_ref = get_latest_ref(authority_clients[0].clone(), gas_objects[0].id()).await; - let create_counter_txn = TestTransactionBuilder::new(addr, gas_ref, rgp) - .call_counter_create(package) - .build_and_sign(&key); - let create_counter_cert = try_sign_on_first_three_authorities( - &authority_clients, - &aggregator.committee, - &create_counter_txn, - ) - .await - .unwrap(); - for authority in authorities.iter().take(3) { - send_consensus(authority, &create_counter_cert).await; - } - for authority in authorities.iter().take(3) { - authority + for authority in authorities.iter().take(3) { + send_consensus(authority, &create_counter_cert).await; + } + for authority in authorities.iter().take(3) { + authority + .get_transaction_cache_reader() + .notify_read_executed_effects(&[*create_counter_cert.digest()]) + .await + .unwrap() + .pop() + .unwrap(); + } + + // Signing and executing this transaction on the last authority should succeed. + authority_clients[3] + .handle_transaction(create_counter_txn.clone(), Some(make_socket_addr())) + .await + .unwrap(); + send_consensus(&authorities[3], &create_counter_cert).await; + let create_counter_effects = authorities[3] .get_transaction_cache_reader() .notify_read_executed_effects(&[*create_counter_cert.digest()]) .await .unwrap() .pop() .unwrap(); - } + let (shared_counter_ref, owner) = create_counter_effects.created()[0]; + let Owner::Shared { + initial_shared_version: shared_counter_initial_version, + } = owner + else { + panic!("Not a shared object! {:?} {:?}", shared_counter_ref, owner); + }; - // Signing and executing this transaction on the last authority should succeed. - authority_clients[3] - .handle_transaction(create_counter_txn.clone(), Some(make_socket_addr())) - .await - .unwrap(); - send_consensus(&authorities[3], &create_counter_cert).await; - let create_counter_effects = authorities[3] - .get_transaction_cache_reader() - .notify_read_executed_effects(&[*create_counter_cert.digest()]) - .await - .unwrap() - .pop() - .unwrap(); - let (shared_counter_ref, owner) = create_counter_effects.created()[0]; - let Owner::Shared { - initial_shared_version: shared_counter_initial_version, - } = owner - else { - panic!("Not a shared object! {:?} {:?}", shared_counter_ref, owner); - }; + // Stop execution on the last authority, to simulate having a backlog. + authorities[3].shutdown_execution_for_test(); + // Make sure execution driver has exited. + sleep(Duration::from_secs(1)).await; + + // Sign and try execute 1000 txns on the first three authorities. And enqueue + // them on the last authority. First shared counter txn has input object + // available on authority 3. So to overload authority 3, 1 more + // txn is needed. + let num_txns = authorities[3] + .overload_config() + .max_transaction_manager_per_object_queue_length + + 1; + for gas_object in gas_objects.iter().take(num_txns) { + let gas_ref = get_latest_ref(authority_clients[0].clone(), gas_object.id()).await; + let shared_txn = TestTransactionBuilder::new(addr, gas_ref, rgp) + .call_counter_increment( + package, + shared_counter_ref.0, + shared_counter_initial_version, + ) + .build_and_sign(&key); + let shared_cert = try_sign_on_first_three_authorities( + &authority_clients, + &aggregator.committee, + &shared_txn, + ) + .await + .unwrap(); + for authority in authorities.iter().take(3) { + send_consensus(authority, &shared_cert).await; + } + send_consensus(&authorities[3], &shared_cert).await; + } - // Stop execution on the last authority, to simulate having a backlog. - authorities[3].shutdown_execution_for_test(); - // Make sure execution driver has exited. - sleep(Duration::from_secs(1)).await; - - // Sign and try execute 1000 txns on the first three authorities. And enqueue - // them on the last authority. First shared counter txn has input object - // available on authority 3. So to overload authority 3, 1 more - // txn is needed. - let num_txns = authorities[3] - .overload_config() - .max_transaction_manager_per_object_queue_length - + 1; - for gas_object in gas_objects.iter().take(num_txns) { - let gas_ref = get_latest_ref(authority_clients[0].clone(), gas_object.id()).await; + // Trying to sign a new transaction would now fail. + let gas_ref = + get_latest_ref(authority_clients[0].clone(), gas_objects[num_txns].id()).await; let shared_txn = TestTransactionBuilder::new(addr, gas_ref, rgp) .call_counter_increment( package, @@ -567,125 +599,129 @@ async fn test_per_object_overload() { shared_counter_initial_version, ) .build_and_sign(&key); - let shared_cert = try_sign_on_first_three_authorities( + let res = authorities[3] + .transaction_manager() + .check_execution_overload(authorities[3].overload_config(), shared_txn.data()); + let message = format!("{res:?}"); + assert!( + message.contains("TooManyTransactionsPendingOnObject"), + "{}", + message + ); + } + + #[tokio::test] + async fn test_txn_age_overload() { + telemetry_subscribers::init_for_testing(); + + // Initialize a network with 1 account and 3 gas objects. + let (addr, key): (_, AccountKeyPair) = get_key_pair(); + let gas_objects = (0..3) + .map(|_| Object::with_owner_for_testing(addr)) + .collect_vec(); + let (aggregator, authorities, _genesis, package) = + init_local_authorities_with_overload_thresholds( + 4, + gas_objects.clone(), + AuthorityOverloadConfig { + max_txn_age_in_queue: Duration::from_secs(5), + ..Default::default() + }, + ) + .await; + let rgp = authorities + .first() + .unwrap() + .reference_gas_price_for_testing() + .unwrap(); + let authority_clients: Vec<_> = authorities + .iter() + .map(|a| aggregator.authority_clients[&a.name].clone()) + .collect(); + + // Create a shared counter. + let gas_ref = get_latest_ref(authority_clients[0].clone(), gas_objects[0].id()).await; + let create_counter_txn = TestTransactionBuilder::new(addr, gas_ref, rgp) + .call_counter_create(package) + .build_and_sign(&key); + let create_counter_cert = try_sign_on_first_three_authorities( &authority_clients, &aggregator.committee, - &shared_txn, + &create_counter_txn, ) .await .unwrap(); for authority in authorities.iter().take(3) { - send_consensus(authority, &shared_cert).await; + send_consensus(authority, &create_counter_cert).await; + } + for authority in authorities.iter().take(3) { + authority + .get_transaction_cache_reader() + .notify_read_executed_effects(&[*create_counter_cert.digest()]) + .await + .unwrap() + .pop() + .unwrap(); } - send_consensus(&authorities[3], &shared_cert).await; - } - - // Trying to sign a new transaction would now fail. - let gas_ref = get_latest_ref(authority_clients[0].clone(), gas_objects[num_txns].id()).await; - let shared_txn = TestTransactionBuilder::new(addr, gas_ref, rgp) - .call_counter_increment( - package, - shared_counter_ref.0, - shared_counter_initial_version, - ) - .build_and_sign(&key); - let res = authorities[3] - .transaction_manager() - .check_execution_overload(authorities[3].overload_config(), shared_txn.data()); - let message = format!("{res:?}"); - assert!( - message.contains("TooManyTransactionsPendingOnObject"), - "{}", - message - ); -} - -#[tokio::test] -async fn test_txn_age_overload() { - telemetry_subscribers::init_for_testing(); - // Initialize a network with 1 account and 3 gas objects. - let (addr, key): (_, AccountKeyPair) = get_key_pair(); - let gas_objects = (0..3) - .map(|_| Object::with_owner_for_testing(addr)) - .collect_vec(); - let (aggregator, authorities, _genesis, package) = - init_local_authorities_with_overload_thresholds( - 4, - gas_objects.clone(), - AuthorityOverloadConfig { - max_txn_age_in_queue: Duration::from_secs(5), - ..Default::default() - }, - ) - .await; - let rgp = authorities - .first() - .unwrap() - .reference_gas_price_for_testing() - .unwrap(); - let authority_clients: Vec<_> = authorities - .iter() - .map(|a| aggregator.authority_clients[&a.name].clone()) - .collect(); - - // Create a shared counter. - let gas_ref = get_latest_ref(authority_clients[0].clone(), gas_objects[0].id()).await; - let create_counter_txn = TestTransactionBuilder::new(addr, gas_ref, rgp) - .call_counter_create(package) - .build_and_sign(&key); - let create_counter_cert = try_sign_on_first_three_authorities( - &authority_clients, - &aggregator.committee, - &create_counter_txn, - ) - .await - .unwrap(); - for authority in authorities.iter().take(3) { - send_consensus(authority, &create_counter_cert).await; - } - for authority in authorities.iter().take(3) { - authority + // Signing and executing this transaction on the last authority should succeed. + authority_clients[3] + .handle_transaction(create_counter_txn.clone(), Some(make_socket_addr())) + .await + .unwrap(); + send_consensus(&authorities[3], &create_counter_cert).await; + let create_counter_effects = authorities[3] .get_transaction_cache_reader() .notify_read_executed_effects(&[*create_counter_cert.digest()]) .await .unwrap() .pop() .unwrap(); - } + let (shared_counter_ref, owner) = create_counter_effects.created()[0]; + let Owner::Shared { + initial_shared_version: shared_counter_initial_version, + } = owner + else { + panic!("Not a shared object! {:?} {:?}", shared_counter_ref, owner); + }; - // Signing and executing this transaction on the last authority should succeed. - authority_clients[3] - .handle_transaction(create_counter_txn.clone(), Some(make_socket_addr())) - .await - .unwrap(); - send_consensus(&authorities[3], &create_counter_cert).await; - let create_counter_effects = authorities[3] - .get_transaction_cache_reader() - .notify_read_executed_effects(&[*create_counter_cert.digest()]) - .await - .unwrap() - .pop() - .unwrap(); - let (shared_counter_ref, owner) = create_counter_effects.created()[0]; - let Owner::Shared { - initial_shared_version: shared_counter_initial_version, - } = owner - else { - panic!("Not a shared object! {:?} {:?}", shared_counter_ref, owner); - }; + // Stop execution on the last authority, to simulate having a backlog. + authorities[3].shutdown_execution_for_test(); + // Make sure execution driver has exited. + sleep(Duration::from_secs(1)).await; + + // Sign and try execute 2 txns on the first three authorities. And enqueue them + // on the last authority. First shared counter txn has input object + // available on authority 3. So to put a txn in the queue, we + // will need another txn. + for gas_object in gas_objects.iter().take(2) { + let gas_ref = get_latest_ref(authority_clients[0].clone(), gas_object.id()).await; + let shared_txn = TestTransactionBuilder::new(addr, gas_ref, rgp) + .call_counter_increment( + package, + shared_counter_ref.0, + shared_counter_initial_version, + ) + .build_and_sign(&key); + let shared_cert = try_sign_on_first_three_authorities( + &authority_clients, + &aggregator.committee, + &shared_txn, + ) + .await + .unwrap(); + for authority in authorities.iter().take(3) { + send_consensus(authority, &shared_cert).await; + } + send_consensus(&authorities[3], &shared_cert).await; + } + + // Sleep for 6 seconds to make sure the transaction is old enough since our + // threshold is 5. + tokio::time::sleep(Duration::from_secs(6)).await; - // Stop execution on the last authority, to simulate having a backlog. - authorities[3].shutdown_execution_for_test(); - // Make sure execution driver has exited. - sleep(Duration::from_secs(1)).await; - - // Sign and try execute 2 txns on the first three authorities. And enqueue them - // on the last authority. First shared counter txn has input object - // available on authority 3. So to put a txn in the queue, we - // will need another txn. - for gas_object in gas_objects.iter().take(2) { - let gas_ref = get_latest_ref(authority_clients[0].clone(), gas_object.id()).await; + // Trying to sign a new transaction would now fail. + let gas_ref = get_latest_ref(authority_clients[0].clone(), gas_objects[2].id()).await; let shared_txn = TestTransactionBuilder::new(addr, gas_ref, rgp) .call_counter_increment( package, @@ -693,41 +729,16 @@ async fn test_txn_age_overload() { shared_counter_initial_version, ) .build_and_sign(&key); - let shared_cert = try_sign_on_first_three_authorities( - &authority_clients, - &aggregator.committee, - &shared_txn, - ) - .await - .unwrap(); - for authority in authorities.iter().take(3) { - send_consensus(authority, &shared_cert).await; - } - send_consensus(&authorities[3], &shared_cert).await; + let res = authorities[3] + .transaction_manager() + .check_execution_overload(authorities[3].overload_config(), shared_txn.data()); + let message = format!("{res:?}"); + assert!( + message.contains("TooOldTransactionPendingOnObject"), + "{}", + message + ); } - - // Sleep for 6 seconds to make sure the transaction is old enough since our - // threshold is 5. - tokio::time::sleep(Duration::from_secs(6)).await; - - // Trying to sign a new transaction would now fail. - let gas_ref = get_latest_ref(authority_clients[0].clone(), gas_objects[2].id()).await; - let shared_txn = TestTransactionBuilder::new(addr, gas_ref, rgp) - .call_counter_increment( - package, - shared_counter_ref.0, - shared_counter_initial_version, - ) - .build_and_sign(&key); - let res = authorities[3] - .transaction_manager() - .check_execution_overload(authorities[3].overload_config(), shared_txn.data()); - let message = format!("{res:?}"); - assert!( - message.contains("TooOldTransactionPendingOnObject"), - "{}", - message - ); } // Tests that when validator is in load shedding mode, it can pushback txn diff --git a/crates/iota-json-rpc-tests/tests/read_api.rs b/crates/iota-json-rpc-tests/tests/read_api.rs index 8602e391c05..a38376ce97b 100644 --- a/crates/iota-json-rpc-tests/tests/read_api.rs +++ b/crates/iota-json-rpc-tests/tests/read_api.rs @@ -1487,104 +1487,108 @@ async fn try_get_past_object_version_not_found() { assert!(at_least_one_version_not_found) } -#[sim_test] -async fn try_get_past_object_deleted() { - let cluster = TestClusterBuilder::new().build().await; - let http_client = cluster.rpc_client(); - let address = cluster.get_address_0(); - - let objects = cluster - .get_owned_objects(address, Some(IotaObjectDataOptions::full_content())) - .await - .unwrap(); +mod move_tests { + use super::*; - assert_eq!(5, objects.len()); + #[sim_test] + async fn try_get_past_object_deleted() { + let cluster = TestClusterBuilder::new().build().await; + let http_client = cluster.rpc_client(); + let address = cluster.get_address_0(); - let tx_block_response = publish_move_package(&cluster).await; + let objects = cluster + .get_owned_objects(address, Some(IotaObjectDataOptions::full_content())) + .await + .unwrap(); - let package_id = tx_block_response - .object_changes - .unwrap() - .iter() - .filter_map(|obj_change| match obj_change { - ObjectChange::Published { package_id, .. } => Some(*package_id), - _ => None, - }) - .collect::<Vec<ObjectID>>()[0]; + assert_eq!(5, objects.len()); - let tx_block_response = cluster - .sign_and_execute_transaction( - &cluster - .test_transaction_builder() - .await - .move_call(package_id, "object_basics", "create", vec![ - 1u64.into(), - CallArg::Pure(address.to_vec()), - ]) - .build(), - ) - .await; + let tx_block_response = publish_move_package(&cluster).await; - let created_object_id = tx_block_response - .object_changes - .unwrap() - .iter() - .filter_map(|obj_change| match obj_change { - ObjectChange::Created { object_id, .. } => Some(*object_id), - _ => None, - }) - .collect::<Vec<ObjectID>>()[0]; + let package_id = tx_block_response + .object_changes + .unwrap() + .iter() + .filter_map(|obj_change| match obj_change { + ObjectChange::Published { package_id, .. } => Some(*package_id), + _ => None, + }) + .collect::<Vec<ObjectID>>()[0]; + + let tx_block_response = cluster + .sign_and_execute_transaction( + &cluster + .test_transaction_builder() + .await + .move_call(package_id, "object_basics", "create", vec![ + 1u64.into(), + CallArg::Pure(address.to_vec()), + ]) + .build(), + ) + .await; - let objects = cluster - .get_owned_objects(address, Some(IotaObjectDataOptions::full_content())) - .await - .unwrap(); + let created_object_id = tx_block_response + .object_changes + .unwrap() + .iter() + .filter_map(|obj_change| match obj_change { + ObjectChange::Created { object_id, .. } => Some(*object_id), + _ => None, + }) + .collect::<Vec<ObjectID>>()[0]; - let object_ids = objects - .iter() - .map(|a| a.object_id().unwrap()) - .collect::<Vec<ObjectID>>(); + let objects = cluster + .get_owned_objects(address, Some(IotaObjectDataOptions::full_content())) + .await + .unwrap(); - assert_eq!(7, objects.len()); - assert!(object_ids.contains(&created_object_id)); + let object_ids = objects + .iter() + .map(|a| a.object_id().unwrap()) + .collect::<Vec<ObjectID>>(); - let created_object = http_client - .get_object(created_object_id, None) - .await - .unwrap() - .data - .unwrap(); + assert_eq!(7, objects.len()); + assert!(object_ids.contains(&created_object_id)); - let arg = CallArg::Object(iota_types::transaction::ObjectArg::ImmOrOwnedObject(( - created_object.object_id, - created_object.version, - created_object.digest, - ))); + let created_object = http_client + .get_object(created_object_id, None) + .await + .unwrap() + .data + .unwrap(); - let tx_block_response = cluster - .sign_and_execute_transaction( - &cluster - .test_transaction_builder() - .await - .move_call(package_id, "object_basics", "delete", vec![arg]) - .build(), - ) - .await; + let arg = CallArg::Object(iota_types::transaction::ObjectArg::ImmOrOwnedObject(( + created_object.object_id, + created_object.version, + created_object.digest, + ))); + + let tx_block_response = cluster + .sign_and_execute_transaction( + &cluster + .test_transaction_builder() + .await + .move_call(package_id, "object_basics", "delete", vec![arg]) + .build(), + ) + .await; - assert_eq!( - tx_block_response.effects.as_ref().unwrap().deleted().len(), - 1 - ); + assert_eq!( + tx_block_response.effects.as_ref().unwrap().deleted().len(), + 1 + ); - let seq_num = SequenceNumber::from_u64(4); - let rpc_past_obj = http_client - .try_get_past_object(created_object_id, seq_num, None) - .await - .unwrap(); + let seq_num = SequenceNumber::from_u64(4); + let rpc_past_obj = http_client + .try_get_past_object(created_object_id, seq_num, None) + .await + .unwrap(); - assert!( - matches!(rpc_past_obj, IotaPastObjectResponse::ObjectDeleted(obj) if obj.object_id == created_object_id && obj.version == seq_num) - ); + assert!( + matches!(rpc_past_obj, IotaPastObjectResponse::ObjectDeleted(obj) if obj.object_id == created_object_id && obj.version == seq_num) + ); + } } #[sim_test] diff --git a/crates/iota-json-rpc-tests/tests/transaction_builder_api.rs b/crates/iota-json-rpc-tests/tests/transaction_builder_api.rs index cf7dc69998d..558a8cfa92d 100644 --- a/crates/iota-json-rpc-tests/tests/transaction_builder_api.rs +++ b/crates/iota-json-rpc-tests/tests/transaction_builder_api.rs @@ -298,49 +298,53 @@ async fn test_pay_all_iota() -> Result<(), anyhow::Error> { Ok(()) } -#[sim_test] -async fn test_publish() -> Result<(), anyhow::Error> { - let cluster = TestClusterBuilder::new().build().await; - let http_client = cluster.rpc_client(); - let address = cluster.get_address_0(); - - let objects = http_client - .get_owned_objects( - address, - Some(IotaObjectResponseQuery::new_with_options( - IotaObjectDataOptions::new() - .with_type() - .with_owner() - .with_previous_transaction(), - )), - None, - None, - ) - .await?; - let gas = objects.data.first().unwrap().object().unwrap(); - - let compiled_package = - BuildConfig::new_for_testing().build(Path::new("../../examples/move/basics"))?; - let compiled_modules_bytes = - compiled_package.get_package_base64(/* with_unpublished_deps */ false); - let dependencies = compiled_package.get_dependency_storage_package_ids(); - - let transaction_bytes: TransactionBlockBytes = http_client - .publish( - address, - compiled_modules_bytes, - dependencies, - Some(gas.object_id), - 100_000_000.into(), - ) - .await?; +mod move_tests { + use super::*; + + #[sim_test] + async fn test_publish() -> Result<(), anyhow::Error> { + let cluster = TestClusterBuilder::new().build().await; + let http_client = cluster.rpc_client(); + let address = cluster.get_address_0(); + + let objects = http_client + .get_owned_objects( + address, + Some(IotaObjectResponseQuery::new_with_options( + IotaObjectDataOptions::new() + .with_type() + .with_owner() + .with_previous_transaction(), + )), + None, + None, + ) + .await?; + let gas = objects.data.first().unwrap().object().unwrap(); + + let compiled_package = + BuildConfig::new_for_testing().build(Path::new("../../examples/move/basics"))?; + let compiled_modules_bytes = + compiled_package.get_package_base64(/* with_unpublished_deps */ false); + let dependencies = compiled_package.get_dependency_storage_package_ids(); + + let transaction_bytes: TransactionBlockBytes = http_client + .publish( + address, + compiled_modules_bytes, + dependencies, + Some(gas.object_id), + 100_000_000.into(), + ) + .await?; - let tx_response = execute_tx(&cluster, http_client, transaction_bytes) - .await - .unwrap(); + let tx_response = execute_tx(&cluster, http_client, transaction_bytes) + .await + .unwrap(); - matches!(tx_response, IotaTransactionBlockResponse {effects, ..} if effects.as_ref().unwrap().created().len() == 6); - Ok(()) + matches!(tx_response, IotaTransactionBlockResponse {effects, ..} if effects.as_ref().unwrap().created().len() == 6); + Ok(()) + } } #[sim_test] diff --git a/crates/iota-json/src/tests.rs b/crates/iota-json/src/tests.rs index 6a899b12ebd..b97880f0efa 100644 --- a/crates/iota-json/src/tests.rs +++ b/crates/iota-json/src/tests.rs @@ -423,91 +423,95 @@ fn test_basic_args_linter_pure_args_good() { } } -#[test] -fn test_basic_args_linter_top_level() { - let path = Path::new(env!("CARGO_MANIFEST_DIR")).join("../../examples/move/basics"); - let compiled_modules = BuildConfig::new_for_testing() - .build(&path) - .unwrap() - .into_modules(); - let example_package = Object::new_package_for_testing( - &compiled_modules, - TransactionDigest::genesis_marker(), - BuiltInFramework::genesis_move_packages(), - ) - .unwrap(); - let package = example_package.data.try_as_package().unwrap(); - - let module = Identifier::new("resolve_args").unwrap(); - let function = Identifier::new("foo").unwrap(); - - // Function signature: - // foo( - // _foo: &mut Foo, - // _bar: vector<Foo>, - // _name: vector<u8>, - // _index: u64, - // _flag: u8, - // _recipient: address, - // _ctx: &mut TxContext, - // ) - - let foo_id = ObjectID::random(); - let bar_id = ObjectID::random(); - let baz_id = ObjectID::random(); - let recipient_addr = IotaAddress::random_for_testing_only(); - - let foo = json!(foo_id.to_canonical_string(/* with_prefix */ true)); - let bar = json!([ - bar_id.to_canonical_string(/* with_prefix */ true), - baz_id.to_canonical_string(/* with_prefix */ true), - ]); - - let name = json!("Name"); - let index = json!("12345678"); - let flag = json!(89); - let recipient = json!(recipient_addr.to_string()); - - let args: Vec<_> = [ - foo.clone(), - bar.clone(), - name.clone(), - index.clone(), - flag, - recipient.clone(), - ] - .into_iter() - .map(|q| IotaJsonValue::new(q.clone()).unwrap()) - .collect(); - - let json_args: Vec<_> = - resolve_move_function_args(package, module.clone(), function.clone(), &[], args) +mod move_tests { + use super::*; + + #[test] + fn test_basic_args_linter_top_level() { + let path = Path::new(env!("CARGO_MANIFEST_DIR")).join("../../examples/move/basics"); + let compiled_modules = BuildConfig::new_for_testing() + .build(&path) .unwrap() - .into_iter() - .map(|(arg, _)| arg) - .collect(); - - use ResolvedCallArg as RCA; - fn pure<T: Serialize>(t: &T) -> RCA { - RCA::Pure(bcs::to_bytes(t).unwrap()) - } - - assert_eq!(json_args, vec![ - RCA::Object(foo_id), - RCA::ObjVec(vec![bar_id, baz_id]), - pure(&"Name"), - pure(&12345678u64), - pure(&89u8), - pure(&recipient_addr), - ],); - - // Flag is u8 so too large - let args: Vec<_> = [foo, bar, name, index, json!(10000u64), recipient] + .into_modules(); + let example_package = Object::new_package_for_testing( + &compiled_modules, + TransactionDigest::genesis_marker(), + BuiltInFramework::genesis_move_packages(), + ) + .unwrap(); + let package = example_package.data.try_as_package().unwrap(); + + let module = Identifier::new("resolve_args").unwrap(); + let function = Identifier::new("foo").unwrap(); + + // Function signature: + // foo( + // _foo: &mut Foo, + // _bar: vector<Foo>, + // _name: vector<u8>, + // _index: u64, + // _flag: u8, + // _recipient: address, + // _ctx: &mut TxContext, + // ) + + let foo_id = ObjectID::random(); + let bar_id = ObjectID::random(); + let baz_id = ObjectID::random(); + let recipient_addr = IotaAddress::random_for_testing_only(); + + let foo = json!(foo_id.to_canonical_string(/* with_prefix */ true)); + let bar = json!([ + bar_id.to_canonical_string(/* with_prefix */ true), + baz_id.to_canonical_string(/* with_prefix */ true), + ]); + + let name = json!("Name"); + let index = json!("12345678"); + let flag = json!(89); + let recipient = json!(recipient_addr.to_string()); + + let args: Vec<_> = [ + foo.clone(), + bar.clone(), + name.clone(), + index.clone(), + flag, + recipient.clone(), + ] .into_iter() .map(|q| IotaJsonValue::new(q.clone()).unwrap()) .collect(); - assert!(resolve_move_function_args(package, module, function, &[], args,).is_err()); + let json_args: Vec<_> = + resolve_move_function_args(package, module.clone(), function.clone(), &[], args) + .unwrap() + .into_iter() + .map(|(arg, _)| arg) + .collect(); + + use ResolvedCallArg as RCA; + fn pure<T: Serialize>(t: &T) -> RCA { + RCA::Pure(bcs::to_bytes(t).unwrap()) + } + + assert_eq!(json_args, vec![ + RCA::Object(foo_id), + RCA::ObjVec(vec![bar_id, baz_id]), + pure(&"Name"), + pure(&12345678u64), + pure(&89u8), + pure(&recipient_addr), + ],); + + // Flag is u8 so too large + let args: Vec<_> = [foo, bar, name, index, json!(10000u64), recipient] + .into_iter() + .map(|q| IotaJsonValue::new(q.clone()).unwrap()) + .collect(); + + assert!(resolve_move_function_args(package, module, function, &[], args,).is_err()); + } } #[test] diff --git a/crates/iota-rosetta/src/unit_tests/balance_changing_tx_tests.rs b/crates/iota-rosetta/src/unit_tests/balance_changing_tx_tests.rs index f6e3f1904f5..88c4cb16308 100644 --- a/crates/iota-rosetta/src/unit_tests/balance_changing_tx_tests.rs +++ b/crates/iota-rosetta/src/unit_tests/balance_changing_tx_tests.rs @@ -139,98 +139,102 @@ async fn test_transfer_object() { .await; } -#[tokio::test] -async fn test_publish_and_move_call() { - let network = TestClusterBuilder::new().build().await; - let client = network.wallet.get_client().await.unwrap(); - let keystore = network.wallet.config().keystore(); - let rgp = network.get_reference_gas_price().await; - - // Test publish - let addresses = network.get_addresses(); - let sender = get_random_address(&addresses, vec![]); - let mut path = PathBuf::from(env!("CARGO_MANIFEST_DIR")); - path.extend(["..", "..", "examples", "move", "coin"]); - let compiled_package = BuildConfig::new_for_testing().build(&path).unwrap(); - let compiled_modules_bytes = - compiled_package.get_package_bytes(/* with_unpublished_deps */ false); - let dependencies = compiled_package.get_dependency_storage_package_ids(); +mod move_tests { + use super::*; + + #[tokio::test] + async fn test_publish_and_move_call() { + let network = TestClusterBuilder::new().build().await; + let client = network.wallet.get_client().await.unwrap(); + let keystore = network.wallet.config().keystore(); + let rgp = network.get_reference_gas_price().await; + + // Test publish + let addresses = network.get_addresses(); + let sender = get_random_address(&addresses, vec![]); + let mut path = PathBuf::from(env!("CARGO_MANIFEST_DIR")); + path.extend(["..", "..", "examples", "move", "coin"]); + let compiled_package = BuildConfig::new_for_testing().build(&path).unwrap(); + let compiled_modules_bytes = + compiled_package.get_package_bytes(/* with_unpublished_deps */ false); + let dependencies = compiled_package.get_dependency_storage_package_ids(); + + let pt = { + let mut builder = ProgrammableTransactionBuilder::new(); + builder.publish_immutable(compiled_modules_bytes, dependencies); + builder.finish() + }; + let response = test_transaction( + &client, + keystore, + vec![], + sender, + pt, + vec![], + rgp * TEST_ONLY_GAS_UNIT_FOR_HEAVY_COMPUTATION_STORAGE, + rgp, + false, + ) + .await; + let object_changes = response.object_changes.unwrap(); - let pt = { - let mut builder = ProgrammableTransactionBuilder::new(); - builder.publish_immutable(compiled_modules_bytes, dependencies); - builder.finish() - }; - let response = test_transaction( - &client, - keystore, - vec![], - sender, - pt, - vec![], - rgp * TEST_ONLY_GAS_UNIT_FOR_HEAVY_COMPUTATION_STORAGE, - rgp, - false, - ) - .await; - let object_changes = response.object_changes.unwrap(); + // Test move call (reuse published module from above test) + let package = object_changes + .iter() + .find_map(|change| { + if let ObjectChange::Published { package_id, .. } = change { + Some(package_id) + } else { + None + } + }) + .unwrap(); - // Test move call (reuse published module from above test) - let package = object_changes - .iter() - .find_map(|change| { - if let ObjectChange::Published { package_id, .. } = change { - Some(package_id) - } else { - None + let treasury = find_module_object(&object_changes, |type_| { + if type_.name.as_str() != "TreasuryCap" { + return false; } - }) - .unwrap(); - let treasury = find_module_object(&object_changes, |type_| { - if type_.name.as_str() != "TreasuryCap" { - return false; - } + let Some(TypeTag::Struct(otw)) = type_.type_params.first() else { + return false; + }; - let Some(TypeTag::Struct(otw)) = type_.type_params.first() else { - return false; + otw.name.as_str() == "MY_COIN" + }); + + let treasury = treasury.clone().reference.to_object_ref(); + let recipient = *addresses.choose(&mut OsRng).unwrap(); + let pt = { + let mut builder = ProgrammableTransactionBuilder::new(); + builder + .move_call( + *package, + Identifier::from_str("my_coin").unwrap(), + Identifier::from_str("mint").unwrap(), + vec![], + vec![ + CallArg::Object(ObjectArg::ImmOrOwnedObject(treasury)), + CallArg::Pure(bcs::to_bytes(&10000u64).unwrap()), + CallArg::Pure(bcs::to_bytes(&recipient).unwrap()), + ], + ) + .unwrap(); + builder.finish() }; - otw.name.as_str() == "MY_COIN" - }); - - let treasury = treasury.clone().reference.to_object_ref(); - let recipient = *addresses.choose(&mut OsRng).unwrap(); - let pt = { - let mut builder = ProgrammableTransactionBuilder::new(); - builder - .move_call( - *package, - Identifier::from_str("my_coin").unwrap(), - Identifier::from_str("mint").unwrap(), - vec![], - vec![ - CallArg::Object(ObjectArg::ImmOrOwnedObject(treasury)), - CallArg::Pure(bcs::to_bytes(&10000u64).unwrap()), - CallArg::Pure(bcs::to_bytes(&recipient).unwrap()), - ], - ) - .unwrap(); - builder.finish() - }; - - test_transaction( - &client, - keystore, - vec![], - sender, - pt, - vec![], - rgp * TEST_ONLY_GAS_UNIT_FOR_GENERIC, - rgp, - false, - ) - .await; + test_transaction( + &client, + keystore, + vec![], + sender, + pt, + vec![], + rgp * TEST_ONLY_GAS_UNIT_FOR_GENERIC, + rgp, + false, + ) + .await; + } } #[tokio::test] From 855e5bce185669e4ba7777cb35f43f1fd05bca87 Mon Sep 17 00:00:00 2001 From: evavirseda <evirseda@boxfish.studio> Date: Thu, 19 Dec 2024 15:44:05 +0100 Subject: [PATCH 95/97] feat(wallet-dashboard): add tx details state to the end of migration flow (#4547) * feat: add tx details for migration * feat: add skeleton and remode debris * feat: redirect to home after migrate * fix height --- .../app/(protected)/migrations/page.tsx | 8 + .../components/Dialogs/MigrationDialog.tsx | 176 ------------------ .../components/Dialogs/index.ts | 2 +- .../Dialogs/migration/MigrationDialog.tsx | 88 +++++++++ .../Dialogs/migration/enums/index.ts | 4 + .../Dialogs/migration/enums/view.enums.ts | 7 + .../components/Dialogs/migration/index.ts | 6 + .../migration/views/ConfirmMigrationView.tsx | 169 +++++++++++++++++ .../Dialogs/migration/views/index.ts | 4 + .../migration/MigrationObjectLoading.tsx | 27 +++ .../migration/MigrationObjectsPanel.tsx | 30 +-- .../components/migration/index.ts | 1 + 12 files changed, 317 insertions(+), 205 deletions(-) delete mode 100644 apps/wallet-dashboard/components/Dialogs/MigrationDialog.tsx create mode 100644 apps/wallet-dashboard/components/Dialogs/migration/MigrationDialog.tsx create mode 100644 apps/wallet-dashboard/components/Dialogs/migration/enums/index.ts create mode 100644 apps/wallet-dashboard/components/Dialogs/migration/enums/view.enums.ts create mode 100644 apps/wallet-dashboard/components/Dialogs/migration/index.ts create mode 100644 apps/wallet-dashboard/components/Dialogs/migration/views/ConfirmMigrationView.tsx create mode 100644 apps/wallet-dashboard/components/Dialogs/migration/views/index.ts create mode 100644 apps/wallet-dashboard/components/migration/MigrationObjectLoading.tsx diff --git a/apps/wallet-dashboard/app/(protected)/migrations/page.tsx b/apps/wallet-dashboard/app/(protected)/migrations/page.tsx index b042465c49e..e2cd767e663 100644 --- a/apps/wallet-dashboard/app/(protected)/migrations/page.tsx +++ b/apps/wallet-dashboard/app/(protected)/migrations/page.tsx @@ -25,12 +25,14 @@ import { STARDUST_BASIC_OUTPUT_TYPE, STARDUST_NFT_OUTPUT_TYPE, useFormatCoin } f import { IOTA_TYPE_ARG } from '@iota/iota-sdk/utils'; import { StardustOutputMigrationStatus } from '@/lib/enums'; import { MigrationObjectsPanel, MigrationDialog } from '@/components'; +import { useRouter } from 'next/navigation'; function MigrationDashboardPage(): JSX.Element { const account = useCurrentAccount(); const address = account?.address || ''; const queryClient = useQueryClient(); const iotaClient = useIotaClient(); + const router = useRouter(); const [isMigrationDialogOpen, setIsMigrationDialogOpen] = useState(false); const [selectedStardustObjectsCategory, setSelectedStardustObjectsCategory] = useState< StardustOutputMigrationStatus | undefined @@ -139,6 +141,11 @@ function MigrationDashboardPage(): JSX.Element { setSelectedStardustObjectsCategory(undefined); } + function handleMigrationDialogClose() { + setIsMigrationDialogOpen(false); + router.push('/'); + } + return ( <div className="flex h-full w-full flex-wrap items-center justify-center space-y-4"> <div @@ -159,6 +166,7 @@ function MigrationDashboardPage(): JSX.Element { selectedStardustObjectsCategory === StardustOutputMigrationStatus.TimeLocked } + handleClose={handleMigrationDialogClose} /> )} <Panel> diff --git a/apps/wallet-dashboard/components/Dialogs/MigrationDialog.tsx b/apps/wallet-dashboard/components/Dialogs/MigrationDialog.tsx deleted file mode 100644 index f1f661c2db4..00000000000 --- a/apps/wallet-dashboard/components/Dialogs/MigrationDialog.tsx +++ /dev/null @@ -1,176 +0,0 @@ -// Copyright (c) 2024 IOTA Stiftung -// SPDX-License-Identifier: Apache-2.0 - -import React from 'react'; -import { VirtualList } from '@/components'; -import { useCurrentAccount, useSignAndExecuteTransaction } from '@iota/dapp-kit'; -import { IotaObjectData } from '@iota/iota-sdk/client'; -import { useMigrationTransaction } from '@/hooks/useMigrationTransaction'; -import { - Button, - Dialog, - Header, - InfoBox, - InfoBoxStyle, - InfoBoxType, - KeyValueInfo, - LoadingIndicator, - Panel, - Title, - TitleSize, -} from '@iota/apps-ui-kit'; -import { useGroupedMigrationObjectsByExpirationDate } from '@/hooks'; -import { Loader, Warning } from '@iota/ui-icons'; -import { DialogLayout, DialogLayoutBody, DialogLayoutFooter } from './layout'; -import { MigrationObjectDetailsCard } from '../migration/migration-object-details-card'; -import { Collapsible, useFormatCoin } from '@iota/core'; -import { IOTA_TYPE_ARG } from '@iota/iota-sdk/utils'; -import { summarizeMigratableObjectValues } from '@/lib/utils'; -import toast from 'react-hot-toast'; - -interface MigrationDialogProps { - basicOutputObjects: IotaObjectData[] | undefined; - nftOutputObjects: IotaObjectData[] | undefined; - onSuccess: (digest: string) => void; - setOpen: (bool: boolean) => void; - open: boolean; - isTimelocked: boolean; -} - -export function MigrationDialog({ - basicOutputObjects = [], - nftOutputObjects = [], - onSuccess, - open, - setOpen, - isTimelocked, -}: MigrationDialogProps): JSX.Element { - const account = useCurrentAccount(); - const { - data: migrateData, - isPending: isMigrationPending, - isError: isMigrationError, - } = useMigrationTransaction(account?.address || '', basicOutputObjects, nftOutputObjects); - - const { - data: resolvedObjects = [], - isLoading, - error: isGroupedMigrationError, - } = useGroupedMigrationObjectsByExpirationDate( - [...basicOutputObjects, ...nftOutputObjects], - isTimelocked, - ); - - const { mutateAsync: signAndExecuteTransaction, isPending: isSendingTransaction } = - useSignAndExecuteTransaction(); - const { totalNotOwnedStorageDepositReturnAmount } = summarizeMigratableObjectValues({ - basicOutputs: basicOutputObjects, - nftOutputs: nftOutputObjects, - address: account?.address || '', - }); - - const [gasFee, gasFeeSymbol] = useFormatCoin(migrateData?.gasBudget, IOTA_TYPE_ARG); - const [totalStorageDepositReturnAmountFormatted, totalStorageDepositReturnAmountSymbol] = - useFormatCoin(totalNotOwnedStorageDepositReturnAmount.toString(), IOTA_TYPE_ARG); - - async function handleMigrate(): Promise<void> { - if (!migrateData) return; - signAndExecuteTransaction( - { - transaction: migrateData.transaction, - }, - { - onSuccess: (tx) => { - onSuccess(tx.digest); - }, - }, - ) - .then(() => { - toast.success('Migration transaction has been sent'); - }) - .catch(() => { - toast.error('Migration transaction was not sent'); - }); - } - - return ( - <Dialog open={open} onOpenChange={setOpen}> - <DialogLayout> - <Header title="Confirmation" onClose={() => setOpen(false)} titleCentered /> - <DialogLayoutBody> - <div className="flex h-full flex-col gap-y-md overflow-y-auto"> - {isGroupedMigrationError && !isLoading && ( - <InfoBox - title="Error" - supportingText="Failed to load migration objects" - style={InfoBoxStyle.Elevated} - type={InfoBoxType.Error} - icon={<Warning />} - /> - )} - {isLoading ? ( - <LoadingIndicator text="Loading migration objects" /> - ) : ( - <> - <Collapsible - defaultOpen - render={() => ( - <Title size={TitleSize.Small} title="Assets to Migrate" /> - )} - > - <div className="h-[600px] pb-md--rs"> - <VirtualList - heightClassName="h-full" - overflowClassName="overflow-y-auto" - items={resolvedObjects} - estimateSize={() => 58} - render={(migrationObject) => ( - <MigrationObjectDetailsCard - migrationObject={migrationObject} - isTimelocked={isTimelocked} - /> - )} - /> - </div> - </Collapsible> - <Panel hasBorder> - <div className="flex flex-col gap-y-sm p-md"> - <KeyValueInfo - keyText="Legacy storage deposit" - value={totalStorageDepositReturnAmountFormatted || '-'} - supportingLabel={totalStorageDepositReturnAmountSymbol} - fullwidth - /> - <KeyValueInfo - keyText="Gas Fees" - value={gasFee || '-'} - supportingLabel={gasFeeSymbol} - fullwidth - /> - </div> - </Panel> - </> - )} - </div> - </DialogLayoutBody> - <DialogLayoutFooter> - <Button - text="Migrate" - disabled={isMigrationPending || isMigrationError || isSendingTransaction} - onClick={handleMigrate} - icon={ - isMigrationPending || isSendingTransaction ? ( - <Loader - className="h-4 w-4 animate-spin" - data-testid="loading-indicator" - /> - ) : null - } - iconAfterText - fullWidth - /> - </DialogLayoutFooter> - </DialogLayout> - </Dialog> - ); -} diff --git a/apps/wallet-dashboard/components/Dialogs/index.ts b/apps/wallet-dashboard/components/Dialogs/index.ts index db380d17927..1475376b5ec 100644 --- a/apps/wallet-dashboard/components/Dialogs/index.ts +++ b/apps/wallet-dashboard/components/Dialogs/index.ts @@ -7,4 +7,4 @@ export * from './Staking'; export * from './unstake'; export * from './vesting'; export * from './settings'; -export * from './MigrationDialog'; +export * from './migration'; diff --git a/apps/wallet-dashboard/components/Dialogs/migration/MigrationDialog.tsx b/apps/wallet-dashboard/components/Dialogs/migration/MigrationDialog.tsx new file mode 100644 index 00000000000..3fd91b0eb35 --- /dev/null +++ b/apps/wallet-dashboard/components/Dialogs/migration/MigrationDialog.tsx @@ -0,0 +1,88 @@ +// Copyright (c) 2024 IOTA Stiftung +// SPDX-License-Identifier: Apache-2.0 + +import React, { useState } from 'react'; +import { useCurrentAccount, useSignAndExecuteTransaction } from '@iota/dapp-kit'; +import { IotaObjectData } from '@iota/iota-sdk/client'; +import { useMigrationTransaction } from '@/hooks/useMigrationTransaction'; +import { Dialog } from '@iota/apps-ui-kit'; +import toast from 'react-hot-toast'; +import { TransactionDialogView } from '../TransactionDialog'; +import { MigrationDialogView } from './enums'; +import { ConfirmMigrationView } from './views'; + +interface MigrationDialogProps { + handleClose: () => void; + basicOutputObjects: IotaObjectData[] | undefined; + nftOutputObjects: IotaObjectData[] | undefined; + onSuccess: (digest: string) => void; + setOpen: (bool: boolean) => void; + open: boolean; + isTimelocked: boolean; +} + +export function MigrationDialog({ + handleClose, + basicOutputObjects = [], + nftOutputObjects = [], + onSuccess, + open, + setOpen, + isTimelocked, +}: MigrationDialogProps): JSX.Element { + const account = useCurrentAccount(); + const [txDigest, setTxDigest] = useState<string>(''); + const [view, setView] = useState<MigrationDialogView>(MigrationDialogView.Confirmation); + + const { + data: migrateData, + isPending: isMigrationPending, + isError: isMigrationError, + } = useMigrationTransaction(account?.address || '', basicOutputObjects, nftOutputObjects); + + const { mutateAsync: signAndExecuteTransaction, isPending: isSendingTransaction } = + useSignAndExecuteTransaction(); + + async function handleMigrate(): Promise<void> { + if (!migrateData) return; + signAndExecuteTransaction( + { + transaction: migrateData.transaction, + }, + { + onSuccess: (tx) => { + onSuccess(tx.digest); + setTxDigest(tx.digest); + setView(MigrationDialogView.TransactionDetails); + }, + }, + ) + .then(() => { + toast.success('Migration transaction has been sent'); + }) + .catch(() => { + toast.error('Migration transaction was not sent'); + }); + } + + return ( + <Dialog open={open} onOpenChange={setOpen}> + {view === MigrationDialogView.Confirmation && ( + <ConfirmMigrationView + basicOutputObjects={basicOutputObjects} + nftOutputObjects={nftOutputObjects} + onSuccess={handleMigrate} + setOpen={setOpen} + isTimelocked={isTimelocked} + migrateData={migrateData} + isMigrationPending={isMigrationPending} + isMigrationError={isMigrationError} + isSendingTransaction={isSendingTransaction} + /> + )} + {view === MigrationDialogView.TransactionDetails && ( + <TransactionDialogView txDigest={txDigest} onClose={handleClose} /> + )} + </Dialog> + ); +} diff --git a/apps/wallet-dashboard/components/Dialogs/migration/enums/index.ts b/apps/wallet-dashboard/components/Dialogs/migration/enums/index.ts new file mode 100644 index 00000000000..6f408e39b8c --- /dev/null +++ b/apps/wallet-dashboard/components/Dialogs/migration/enums/index.ts @@ -0,0 +1,4 @@ +// Copyright (c) 2024 IOTA Stiftung +// SPDX-License-Identifier: Apache-2.0 + +export * from './view.enums'; diff --git a/apps/wallet-dashboard/components/Dialogs/migration/enums/view.enums.ts b/apps/wallet-dashboard/components/Dialogs/migration/enums/view.enums.ts new file mode 100644 index 00000000000..5b16d31b836 --- /dev/null +++ b/apps/wallet-dashboard/components/Dialogs/migration/enums/view.enums.ts @@ -0,0 +1,7 @@ +// Copyright (c) 2024 IOTA Stiftung +// SPDX-License-Identifier: Apache-2.0 + +export enum MigrationDialogView { + Confirmation = 'Confirmation', + TransactionDetails = 'TransactionDetails', +} diff --git a/apps/wallet-dashboard/components/Dialogs/migration/index.ts b/apps/wallet-dashboard/components/Dialogs/migration/index.ts new file mode 100644 index 00000000000..41dd3ff2b30 --- /dev/null +++ b/apps/wallet-dashboard/components/Dialogs/migration/index.ts @@ -0,0 +1,6 @@ +// Copyright (c) 2024 IOTA Stiftung +// SPDX-License-Identifier: Apache-2.0 + +export * from './MigrationDialog'; + +export * from './views'; diff --git a/apps/wallet-dashboard/components/Dialogs/migration/views/ConfirmMigrationView.tsx b/apps/wallet-dashboard/components/Dialogs/migration/views/ConfirmMigrationView.tsx new file mode 100644 index 00000000000..7066a922187 --- /dev/null +++ b/apps/wallet-dashboard/components/Dialogs/migration/views/ConfirmMigrationView.tsx @@ -0,0 +1,169 @@ +// Copyright (c) 2024 IOTA Stiftung +// SPDX-License-Identifier: Apache-2.0 + +import React from 'react'; +import { MigrationObjectLoading, VirtualList } from '@/components'; +import { useCurrentAccount } from '@iota/dapp-kit'; +import { IotaObjectData } from '@iota/iota-sdk/client'; +import { + Button, + Header, + InfoBox, + InfoBoxStyle, + InfoBoxType, + KeyValueInfo, + Panel, + Skeleton, + Title, + TitleSize, +} from '@iota/apps-ui-kit'; +import { useGroupedMigrationObjectsByExpirationDate } from '@/hooks'; +import { Loader, Warning } from '@iota/ui-icons'; +import { Collapsible, useFormatCoin } from '@iota/core'; +import { IOTA_TYPE_ARG } from '@iota/iota-sdk/utils'; +import { summarizeMigratableObjectValues } from '@/lib/utils'; +import { MigrationObjectDetailsCard } from '@/components/migration/migration-object-details-card'; +import { DialogLayout, DialogLayoutBody, DialogLayoutFooter } from '../../layout'; +import { Transaction } from '@iota/iota-sdk/transactions'; + +interface ConfirmMigrationViewProps { + basicOutputObjects: IotaObjectData[] | undefined; + nftOutputObjects: IotaObjectData[] | undefined; + onSuccess: () => void; + setOpen: (bool: boolean) => void; + isTimelocked: boolean; + migrateData: + | { + transaction: Transaction; + gasBudget: string | number | null; + } + | undefined; + isMigrationPending: boolean; + isMigrationError: boolean; + isSendingTransaction: boolean; +} + +export function ConfirmMigrationView({ + basicOutputObjects = [], + nftOutputObjects = [], + onSuccess, + setOpen, + isTimelocked, + migrateData, + isMigrationPending, + isMigrationError, + isSendingTransaction, +}: ConfirmMigrationViewProps): JSX.Element { + const account = useCurrentAccount(); + + const { + data: resolvedObjects = [], + isLoading, + error: isGroupedMigrationError, + } = useGroupedMigrationObjectsByExpirationDate( + [...basicOutputObjects, ...nftOutputObjects], + isTimelocked, + ); + + const { totalNotOwnedStorageDepositReturnAmount } = summarizeMigratableObjectValues({ + basicOutputs: basicOutputObjects, + nftOutputs: nftOutputObjects, + address: account?.address || '', + }); + + const [gasFee, gasFeeSymbol] = useFormatCoin(migrateData?.gasBudget, IOTA_TYPE_ARG); + const [totalStorageDepositReturnAmountFormatted, totalStorageDepositReturnAmountSymbol] = + useFormatCoin(totalNotOwnedStorageDepositReturnAmount.toString(), IOTA_TYPE_ARG); + + return ( + <DialogLayout> + <Header title="Confirmation" onClose={() => setOpen(false)} titleCentered /> + <DialogLayoutBody> + <div className="flex h-full flex-col gap-y-md overflow-y-auto"> + {isGroupedMigrationError && !isLoading && ( + <InfoBox + title="Error" + supportingText="Failed to load migration objects" + style={InfoBoxStyle.Elevated} + type={InfoBoxType.Error} + icon={<Warning />} + /> + )} + {isLoading ? ( + <> + <Panel hasBorder> + <div className="flex flex-col gap-y-sm p-md"> + <Skeleton widthClass="w-40" heightClass="h-3.5" /> + <MigrationObjectLoading /> + </div> + </Panel> + <Panel hasBorder> + <div className="flex flex-col gap-y-md p-md"> + <Skeleton widthClass="w-full" heightClass="h-3.5" /> + <Skeleton widthClass="w-full" heightClass="h-3.5" /> + </div> + </Panel> + </> + ) : ( + <> + <Collapsible + defaultOpen + render={() => ( + <Title size={TitleSize.Small} title="Assets to Migrate" /> + )} + > + <div className="h-[500px] pb-md--rs xl:h-[600px]"> + <VirtualList + heightClassName="h-full" + overflowClassName="overflow-y-auto" + items={resolvedObjects} + estimateSize={() => 58} + render={(migrationObject) => ( + <MigrationObjectDetailsCard + migrationObject={migrationObject} + isTimelocked={isTimelocked} + /> + )} + /> + </div> + </Collapsible> + <Panel hasBorder> + <div className="flex flex-col gap-y-sm p-md"> + <KeyValueInfo + keyText="Legacy storage deposit" + value={totalStorageDepositReturnAmountFormatted || '-'} + supportingLabel={totalStorageDepositReturnAmountSymbol} + fullwidth + /> + <KeyValueInfo + keyText="Gas Fees" + value={gasFee || '-'} + supportingLabel={gasFeeSymbol} + fullwidth + /> + </div> + </Panel> + </> + )} + </div> + </DialogLayoutBody> + <DialogLayoutFooter> + <Button + text="Migrate" + disabled={isMigrationPending || isMigrationError || isSendingTransaction} + onClick={onSuccess} + icon={ + isMigrationPending || isSendingTransaction ? ( + <Loader + className="h-4 w-4 animate-spin" + data-testid="loading-indicator" + /> + ) : null + } + iconAfterText + fullWidth + /> + </DialogLayoutFooter> + </DialogLayout> + ); +} diff --git a/apps/wallet-dashboard/components/Dialogs/migration/views/index.ts b/apps/wallet-dashboard/components/Dialogs/migration/views/index.ts new file mode 100644 index 00000000000..b5a03528f1e --- /dev/null +++ b/apps/wallet-dashboard/components/Dialogs/migration/views/index.ts @@ -0,0 +1,4 @@ +// Copyright (c) 2024 IOTA Stiftung +// SPDX-License-Identifier: Apache-2.0 + +export * from './ConfirmMigrationView'; diff --git a/apps/wallet-dashboard/components/migration/MigrationObjectLoading.tsx b/apps/wallet-dashboard/components/migration/MigrationObjectLoading.tsx new file mode 100644 index 00000000000..297d1a8fa81 --- /dev/null +++ b/apps/wallet-dashboard/components/migration/MigrationObjectLoading.tsx @@ -0,0 +1,27 @@ +// Copyright (c) 2024 IOTA Stiftung +// SPDX-License-Identifier: Apache-2.0 + +import { Card, CardImage, ImageShape, Skeleton } from '@iota/apps-ui-kit'; + +export function MigrationObjectLoading() { + return ( + <div className="flex h-full max-h-full w-full flex-col overflow-hidden"> + {new Array(10).fill(0).map((_, index) => ( + <Card key={index}> + <CardImage shape={ImageShape.SquareRounded}> + <div className="h-10 w-10 animate-pulse bg-neutral-90 dark:bg-neutral-12" /> + <Skeleton widthClass="w-10" heightClass="h-10" isRounded={false} /> + </CardImage> + <div className="flex flex-col gap-y-xs"> + <Skeleton widthClass="w-40" heightClass="h-3.5" /> + <Skeleton widthClass="w-32" heightClass="h-3" hasSecondaryColors /> + </div> + <div className="ml-auto flex flex-col gap-y-xs"> + <Skeleton widthClass="w-20" heightClass="h-3.5" /> + <Skeleton widthClass="w-16" heightClass="h-3" hasSecondaryColors /> + </div> + </Card> + ))} + </div> + ); +} diff --git a/apps/wallet-dashboard/components/migration/MigrationObjectsPanel.tsx b/apps/wallet-dashboard/components/migration/MigrationObjectsPanel.tsx index 915cc56dda5..a3864b329cf 100644 --- a/apps/wallet-dashboard/components/migration/MigrationObjectsPanel.tsx +++ b/apps/wallet-dashboard/components/migration/MigrationObjectsPanel.tsx @@ -12,15 +12,11 @@ import { StardustOutputDetailsFilter } from '@/lib/enums'; import { Button, ButtonType, - Card, - CardImage, Chip, - ImageShape, InfoBox, InfoBoxStyle, InfoBoxType, Panel, - Skeleton, Title, } from '@iota/apps-ui-kit'; import type { IotaObjectData } from '@iota/iota-sdk/client'; @@ -30,6 +26,7 @@ import { useState } from 'react'; import { MigrationObjectDetailsCard } from './migration-object-details-card'; import VirtualList from '../VirtualList'; import { filterMigrationObjects } from '@/lib/utils'; +import { MigrationObjectLoading } from './MigrationObjectLoading'; const FILTERS = { migratable: STARDUST_MIGRATABLE_OBJECTS_FILTER_LIST, @@ -83,7 +80,7 @@ export function MigrationObjectsPanel({ </div> <div className="flex min-h-0 flex-col py-sm"> <div className="h-full flex-1 overflow-auto"> - {isLoading && <LoadingPanel />} + {isLoading && <MigrationObjectLoading />} {isErrored && !isLoading && ( <div className="flex h-full max-h-full w-full flex-col items-center"> <InfoBox @@ -116,26 +113,3 @@ export function MigrationObjectsPanel({ </div> ); } - -function LoadingPanel() { - return ( - <div className="flex h-full max-h-full w-full flex-col overflow-hidden"> - {new Array(10).fill(0).map((_, index) => ( - <Card key={index}> - <CardImage shape={ImageShape.SquareRounded}> - <div className="h-10 w-10 animate-pulse bg-neutral-90 dark:bg-neutral-12" /> - <Skeleton widthClass="w-10" heightClass="h-10" isRounded={false} /> - </CardImage> - <div className="flex flex-col gap-y-xs"> - <Skeleton widthClass="w-40" heightClass="h-3.5" /> - <Skeleton widthClass="w-32" heightClass="h-3" hasSecondaryColors /> - </div> - <div className="ml-auto flex flex-col gap-y-xs"> - <Skeleton widthClass="w-20" heightClass="h-3.5" /> - <Skeleton widthClass="w-16" heightClass="h-3" hasSecondaryColors /> - </div> - </Card> - ))} - </div> - ); -} diff --git a/apps/wallet-dashboard/components/migration/index.ts b/apps/wallet-dashboard/components/migration/index.ts index cf43709989c..2690e18d11b 100644 --- a/apps/wallet-dashboard/components/migration/index.ts +++ b/apps/wallet-dashboard/components/migration/index.ts @@ -2,3 +2,4 @@ // SPDX-License-Identifier: Apache-2.0 export * from './MigrationObjectsPanel'; +export * from './MigrationObjectLoading'; From bd7d2c97f76f2a5f8cab4df549ad1e5b82667d3b Mon Sep 17 00:00:00 2001 From: evavirseda <evirseda@boxfish.studio> Date: Thu, 19 Dec 2024 15:55:06 +0100 Subject: [PATCH 96/97] fix(wallet): darkmode in Review & send view (#4569) --- apps/wallet/src/ui/app/components/receipt-card/TxnAmount.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/wallet/src/ui/app/components/receipt-card/TxnAmount.tsx b/apps/wallet/src/ui/app/components/receipt-card/TxnAmount.tsx index 85d4ff481e0..cb17eab7d23 100644 --- a/apps/wallet/src/ui/app/components/receipt-card/TxnAmount.tsx +++ b/apps/wallet/src/ui/app/components/receipt-card/TxnAmount.tsx @@ -28,7 +28,7 @@ export function TxnAmount({ amount, coinType, subtitle, approximation }: TxnAmou return Number(amount) !== 0 ? ( <Card type={CardType.Filled}> <CardImage type={ImageType.BgSolid}> - <CoinIcon coinType={coinType} rounded size={ImageIconSize.Large} hasCoinWrapper /> + <CoinIcon coinType={coinType} rounded size={ImageIconSize.Small} /> </CardImage> <CardBody title={`${approximation ? '~' : ''}${formatAmount} ${symbol}`} From 78f337fda8dcf46d3fef0771764b175266c6fc3f Mon Sep 17 00:00:00 2001 From: Mirko Zichichi <miker83z@proton.me> Date: Fri, 20 Dec 2024 09:25:24 +0100 Subject: [PATCH 97/97] feat(iota-e2e-tests): Include object snapshot generation and address swap in migration test (#4389) * feat(iota-genesis-builder): add address swap map for swaping origin addresses to destination during the migration process * fix(iota-genesis-builder): relative path supporting, remove mut modifier * fix(iota-genesis-builder): address_swap_map become field of Migration struct, minor renaming refactoring * fix(iota-genesis-builder): add additional hashmap that track if address has been swapped at least once Create dedicated function to convert and swap addresses * fix(iota-genesis-builder): review's cmments fix * fix(iota-genesis-builder): anyhow error has been added instead of panic * cargo clippy * typo spell fix * fix(iota-genesis-builder): add comments to the public functions * fix(iota-genesis-builder): remove mut modificator, remove extra hashmap * fix(iota-types): parse first address from bech32 format, csv headers support * fix(iota-types): example of CSV file in comments above initialization function * Minor fix * refactor(iota-genesis-builder): move output processing out of main * feat(iota-genesis-builder): create a dedicated run migration function for iota snapshot * feat(iota-e2e-tests): include snapshot generation and address swap in migration test * Make some improvements to the address swap map usage (#4376) * Make some improvements to the address swap map usage * fix(iota-e2e-tests): update import * fix typo --------- Co-authored-by: Dkwcs <pavlo.botnar@gmail.com> Co-authored-by: DaughterOfMars <chloedaughterofmars@gmail.com> --- .../tests/full_node_migration_tests.rs | 71 +++++- .../tests/migration/address_swap.csv | 2 + .../migration/stardust_object_snapshot.bin | Bin 3827115 -> 0 bytes .../migration/test_hornet_full_snapshot.bin | Bin 0 -> 1654902 bytes crates/iota-genesis-builder/src/main.rs | 191 +--------------- .../src/stardust/migration/migration.rs | 15 ++ .../iota-genesis-builder/src/stardust/mod.rs | 1 + .../src/stardust/process_outputs.rs | 208 ++++++++++++++++++ 8 files changed, 298 insertions(+), 190 deletions(-) create mode 100644 crates/iota-e2e-tests/tests/migration/address_swap.csv delete mode 100644 crates/iota-e2e-tests/tests/migration/stardust_object_snapshot.bin create mode 100644 crates/iota-e2e-tests/tests/migration/test_hornet_full_snapshot.bin create mode 100644 crates/iota-genesis-builder/src/stardust/process_outputs.rs diff --git a/crates/iota-e2e-tests/tests/full_node_migration_tests.rs b/crates/iota-e2e-tests/tests/full_node_migration_tests.rs index e6c79e17779..c7f8c281b77 100644 --- a/crates/iota-e2e-tests/tests/full_node_migration_tests.rs +++ b/crates/iota-e2e-tests/tests/full_node_migration_tests.rs @@ -1,11 +1,24 @@ // Copyright (c) 2024 IOTA Stiftung // SPDX-License-Identifier: Apache-2.0 -use std::{path::PathBuf, str::FromStr}; +use std::{ + fs::File, + io::{BufWriter, Write}, + path::PathBuf, + str::FromStr, +}; use anyhow::anyhow; use bip32::DerivationPath; -use iota_genesis_builder::SnapshotSource; +use iota_genesis_builder::{ + SnapshotSource, + stardust::{ + migration::{Migration, MigrationTargetNetwork}, + parse::HornetSnapshotParser, + process_outputs::scale_amount_for_iota, + types::address_swap_map::AddressSwapMap, + }, +}; use iota_json_rpc_types::{ IotaObjectDataFilter, IotaObjectDataOptions, IotaObjectResponseQuery, IotaTransactionBlockResponse, IotaTransactionBlockResponseOptions, @@ -21,7 +34,7 @@ use iota_types::{ gas_coin::GAS, programmable_transaction_builder::ProgrammableTransactionBuilder, quorum_driver_types::ExecuteTransactionRequestType, - stardust::output::NftOutput, + stardust::{coin_type::CoinType, output::NftOutput}, transaction::{Argument, ObjectArg, Transaction, TransactionData}, }; use move_core_types::ident_str; @@ -29,7 +42,10 @@ use shared_crypto::intent::Intent; use tempfile::tempdir; use test_cluster::TestClusterBuilder; -const MIGRATION_DATA_PATH: &str = "tests/migration/stardust_object_snapshot.bin"; +const HORNET_SNAPSHOT_PATH: &str = "tests/migration/test_hornet_full_snapshot.bin"; +const ADDRESS_SWAP_MAP_PATH: &str = "tests/migration/address_swap.csv"; +const TEST_TARGET_NETWORK: &str = "alphanet-test"; +const MIGRATION_DATA_FILE_NAME: &str = "stardust_object_snapshot.bin"; /// Got from iota-genesis-builder/src/stardust/test_outputs/alias_ownership.rs const MAIN_ADDRESS_MNEMONIC: &str = "few hood high omit camp keep burger give happy iron evolve draft few dawn pulp jazz box dash load snake gown bag draft car"; @@ -39,26 +55,67 @@ const SPONSOR_ADDRESS_MNEMONIC: &str = "okay pottery arch air egg very cave cash #[sim_test] async fn test_full_node_load_migration_data() -> Result<(), anyhow::Error> { telemetry_subscribers::init_for_testing(); - let snapshot_source = SnapshotSource::Local(PathBuf::from_str(MIGRATION_DATA_PATH).unwrap()); + + // Setup the temporary dir and create the writer for the stardust object + // snapshot + let dir = tempdir()?; + let stardudst_object_snapshot_file_path = dir.path().join(MIGRATION_DATA_FILE_NAME); + let object_snapshot_writer = + BufWriter::new(File::create(&stardudst_object_snapshot_file_path)?); + + // Generate the stardust object snapshot + genesis_builder_snapshot_generation(object_snapshot_writer)?; + // Then load it + let snapshot_source = SnapshotSource::Local(stardudst_object_snapshot_file_path); + + // A new test cluster can be spawn with the stardust object snapshot let test_cluster = TestClusterBuilder::new() .with_migration_data(vec![snapshot_source]) .build() .await; + // Use a client to issue a test transaction let client = test_cluster.wallet.get_client().await.unwrap(); - let tx_response = address_unlock_condition(client).await?; - let IotaTransactionBlockResponse { confirmed_local_execution, errors, .. } = tx_response; + + // The transaction must be successful assert!(confirmed_local_execution.unwrap()); assert!(errors.is_empty()); Ok(()) } +fn genesis_builder_snapshot_generation( + object_snapshot_writer: impl Write, +) -> Result<(), anyhow::Error> { + let mut snapshot_parser = + HornetSnapshotParser::new::<false>(File::open(HORNET_SNAPSHOT_PATH)?)?; + let total_supply = scale_amount_for_iota(snapshot_parser.total_supply()?)?; + let target_network = MigrationTargetNetwork::from_str(TEST_TARGET_NETWORK)?; + let coin_type = CoinType::Iota; + let address_swap_map = AddressSwapMap::from_csv(ADDRESS_SWAP_MAP_PATH)?; + + // Migrate using the parser output stream + Migration::new( + snapshot_parser.target_milestone_timestamp(), + total_supply, + target_network, + coin_type, + address_swap_map, + )? + .run_for_iota( + snapshot_parser.target_milestone_timestamp(), + snapshot_parser.outputs(), + object_snapshot_writer, + )?; + + Ok(()) +} + async fn address_unlock_condition( iota_client: IotaClient, ) -> Result<IotaTransactionBlockResponse, anyhow::Error> { diff --git a/crates/iota-e2e-tests/tests/migration/address_swap.csv b/crates/iota-e2e-tests/tests/migration/address_swap.csv new file mode 100644 index 00000000000..7ece8894744 --- /dev/null +++ b/crates/iota-e2e-tests/tests/migration/address_swap.csv @@ -0,0 +1,2 @@ +Origin,Destination +iota1qp8h9augeh6tk3uvlxqfapuwv93atv63eqkpru029p6sgvr49eufyz7katr,0x4f72f788cdf4bb478cf9809e878e6163d5b351c82c11f1ea28750430752e7892 \ No newline at end of file diff --git a/crates/iota-e2e-tests/tests/migration/stardust_object_snapshot.bin b/crates/iota-e2e-tests/tests/migration/stardust_object_snapshot.bin deleted file mode 100644 index c7fa51debb701346cf0b63ed684fbfca4f847da2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3827115 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 uAUavv-RlVISdzs!^vF-My(f45h9<0P;0 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%0D*od{k1 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%0DZG~8asRFd>ufQm2DX;2&%X3=WhC^?5vZ$- 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 `2@m} zaz4U|KjgLf+dIS%>1>l9zy5Yj6qMAB7<apzcl0jKsdrv~XWpc|bKuibFV|e1>7SGF zHEIzv`{aTU&~sv>YWX^6r&_k()R@G(E&I!NrRYDU@B8XrN;ls32yT(!nh-)xUu!O+ z<sq%<E~&>xlY&DU7JJzuC7s@WkTHtCu!D!Sz}!W+7J79JsZ#{C6%n@waOKzF+G6P4 zXYW{tvK2N6A(g*HxDlQ|1wleUDO~G>lg`mGvyzlY@)*b(O;GX#4KAP)4r7X;8%5VQ zp$`2jTzlEJ;$o%j$nzm38|N*C?0U9af_mRLnUGqJ@l1bsFthDxY^EYVCnvWV2RDbg zAczYD6cjWw;{*zT__(+%1i+m9KyE=U4s#A}0S<HE*+pOw2bX|3h(nN<kKaO&4+!G0 z_$6Fx@%I=dKn@0u%ycDJFD74F7ESJX%^c;e4tCpgJX%WO*~YM3qd!guI3(Yk=J<PA zPo{)C3Qf!`d5l;&f??dVIh++!6043xo3yW<_`KZj{9v%siEAA;OE`{KAqN;8xUCz- zb}5Vw$V?f)npvyU!8Kfd&A(m#FaH1IU-Mtw<l+=G^IcYkexZ@fHv+4I)YnKKIusnJ zi{Rr%cN5+Tz5CG;1Nh4TVS%RE80c8|kek%^yM*|U_AM-~h38qF{`m}Tpv_s`z6sbG zWNU$>=WOQa2yzA>{yuOd;@|!dRzdn|a<R149X~rU7c_SL`O_eKOb==u0UZ%lQMY9P zqXzdrH6hh`84OL!7o-WIyt~Ui;U6lR3Xcva0_-{&Uwp<aU&|mjjfn&p0t{;oXSll_ zd25;;@peXiY1tdY#J;gXh9_(+>gWN<UOXs{xv;YIc(^T)X4=QBIZxi-vBFPG<F;>L ztwnn3x@k4wRwz%FPJK}T4?Sz_PaF7nmZE|P{MBVbPu<GFPjoca|1t3k@e~vO0bK7T z53+2g-VqbiJJlQ`ua$d$!bqQA?DiyphXNbCmBFf|6xw1{94nLmYC5tw<|k@_E-SIT z=GEQ{U7)~d>Qp4p&>=Lmo?@45+e9!kIn7+%B9EbAtZ>7;CUP|qsJ2|}aS|fpQkEn7 zNF)cGieW^m2~-jO!h289zsb>w+V$qynjAte-=vhMSweCOXT;jA3>c#=j?$+X`P79) zY#1oZe!S$Mo_|dU@f-pF9`BRE1rv{DaxbczUlUMLsb1Tq=JlNVXMpP)uSRr3PdNNF zMs!<c7tFqt>k>&d-4(?IS#@O==zdl9UGGNG5<c9&(*RdV+iY~<AwaJ?Mll(%>WA>c zKwh3Mozde+{8ljoF@o>#s?3+>F``j_$7`}9Ucn%|wQ<CXh`M1jlT<76qUQAFC^>1H zAnCH`Fkj=GfUNQD3uHd%LEx^ew$Km+K0S#~B*yG?5V1QGQ?KtxRMcaAd>qz*fDM2c zAs|^R*$l9H^)8evR!rnwa@qRqDcMnCV90n%^$LMCz|+-jLn-I7ngj29SdO%)jKc^) zd=zO4Rqw=zR`$o<`q@)>c$n>gHQGyE3HZJ7GneQg0CF>fvfsV>_wL4MP~dgV%08@e zF)%2Lzq3{><CgPf#2b3Js0al+-5=5OSt(Q1IDCH<AA+9H`P1S<zuDYumG38n`z~{B zbxBrkMMlgpHp6Exy9JO51NzvFt8P|s#)^PRy&*%D0j_!H54_K$8-ElOzaA~V9h5Ek zf$mxNqcT?2|GfrYoGpM;7!4Rtxzpt}v8)J{+xUyr0TNz@F#&voglOfL5R(JYEs1$o z!NPDGZsz7w&SE@f)bIzq!=W`5?2S<z22WuT?Hmuu?1e8n@S#`gcmmr#+*f_eFZguh z+oq98*Nl*)=&-Eego{H|^v>K3$N^&f29w%bRVK_IP~XfQ0NxtV1y694^eyGvuazXX zxb<}j8aSOd5JD2aEH!i%`29Jan(kl<NJV>CBx_;q$A=~V)=DEd34|Vw>k_c7Hht?A zS{n-t5YKRGL1JW!_$kq4OS@|@sk;z25wH-j_zmU)?-6=dfPtB>XZ@pf$sNJO8^-qK z`=S=WEgr*a6W(u3A`^YAjMrrMx9tcD%XWyt47&xI_fgy-kp^(y(|#TXc(mXUnc^Qd zHJ4WfWmwp$Y-iyrD*6EWxjQ~-sMhQ`QQw(jCMvKhgHh|{+oI#H2_dHNL+s{+zU#X- z*}e$4L3;R3bgO>leUryGNv#}#&J2$o|LqGxK+jW*mtQLzb;D61_MXTK&3|4hERK#G zExQ&?G<x4%XM%s>x)6dO=A|+dHz~lR4CytON6Wq<`*wQbD~9y=agJP?ZpRRPo{M-M z^okuk@(g=J$?m2aebuFZkATB5uR`F&;IGIJ?;K)>-#?6XO$agjiN1329s|y*h`ht> zrepd023k5v>Y#@Mp{FHYT)N`msxKEoEa)}Eh-d^pMncvrz}Qf4V!K%zK}S}YigjGm z&W&0Dw%va%aZL!Z?id92Y0&M$avz+w=7)9rCaM3HMW>F%x@T@H3+~{`WryDEqCd@L zhpwr<v#;01tDME%xr4|~B#HPKHhgUm9au;IIg)1314;D%k5#*jUHmt%kQ%FIbtuLl z8x?myla$UB#3{BE`en`fv&-$`>cr3jnwFCCO+q^73!e!S?3W0gyrq&Q+5NIdZuh4s zFlUcnw!BfK8RNDZl)UTae~S^7PY80LN086?d{?OLrZp`{cwD5SQLyejkZ=<&>1pGj zwH5K4PcLOArdIHq^Qt?kJ;B>`8h51X4tb3hrsO21a0fQi>TU##vP8e}8+n*?#RER` z-!0yiJ{y!qN%TRSx-&9D*-L}RKl6OC0j|1OHRPJ0-B<&#%F>1opJx#@MyYcwG)pLd zFimbae3rs114yA!&$o)51;CxH$szQ>S@($QW9;aB!aa8GG6B72?GTlZ6B$*X@Yrih zIUD=k*?^$BL^F4=wl}devp2H@IipIQy;1qw&j6&t5ALyQw{ejaE$}9Peux>VpSWGa zpZ&GQ^;^-<<Ee%f46uWny@j)<i5aIWkAs;DhOC;7s<ftoi3F!MkD7!Q%sKO&ABg~K zK-tTn++p~A=0uHx>e45VS!oX<(8)6-iW{{(1)s6${7C!W`^wVQ-bi1NtwTzEMNCB@ zDlLgfMkl39V@_t>eRBQWl!O6fA7W^)k$WEv3Ga?OMQK~AB-&GL1n{!OKlNfv_I$k# z^G{#uzkJE_n_S)v1_1duDkMYITGnt09_#VCgp)>=XfgxCeQH5l_h~VgGs8#n`5y)g zsZq>H%%3kZIj#6yRak%WuJ#Hhf46p0!e@{Wh3a#(K>o_2#N$Sd^QF5yIDcl9(!T;{ zlzrcLt|#gcfA6O-9A-#DLdIVG2W;N2|A*zBHG+xdk3*E+4jmDEwvV&(t#Kc}A#ld5 z!xy(E4_lUhO(#=~JAX>`7@^9Q&uyH!LRo#cxiE-`Lu2fkAJsf8lIfV=v>(d4TnU&u zM6v}X;S_krqZ(Z+b><3V!8-o~T)C+t2Y0s{45kPW+-6X$yRgQrn5z~!ZPL+*3qg~s z8rrvm@q370(QT5U>XQ{`((>-;)Z{`3Lr>n3Oww(y9;tp1YZ`RorGqEKX^dz5IZX`; zu<C_@O=^t3E`;duX17x_;m|$y4=pDgwQy$Y!4Og*<<4XH#BFjgcbH~$e9_zrJ@km` zWnEHQ6Pu`AyC!5Rr_+#;@)$<K<+qU{2K=f(pUA3fLI~`j*8x~@Rh2coQVo@rpArqn zazjIj%UO(I3?~d+v?`_Cm@k5=&_h%P#hKvLi@t8r(L|{1soBk#>5aT=2;XEcQu3yk zOnv9;H6a9EL?tg39Lal>J42YyIitPjxfG<=2ZttsBS%d>Vd@RVqvIE%iO|0lO74N* zr=_v_=EaN`rOZALDPu6=x+OdXgkFhl>g4ozp`!d7X@+0=WvnUCl}fB_yJvS3pTE`I z8+ztG@0t*oD<N<q5yX?eh3RN>(Ju!B^WjGCX_FOGx|>q-yXE5mwy*d1DoS~%;H<<C zP}e`mL2~5tzpw-Mr=Oi<HnZz;nOD$~$EWhNqjt$-DtBm$CPfKRVHc!dRqtNfd$|B> z*4#sWKb}VsZ!}a%YIcJQL$!)?u>6SeF_PtiN#RX=-+ro)T#1M&P4!iHuqq#~gzl`T zvdi1F*|Kr7jz+}#-G#MxW~%WeW7+JAuXumYT}M$T#L##azKU03<vaf1o>1WwE1}8_ zEEP`*RWny>cMyfP!#$8a1;_c<A(o)9|JyHJFMbJjaHentxwxJKY`_36@BY7G|3NkG zVXc$#!-@`x!P}Yr^-H2CPlR`arKhIh@ek`X?9e|rhFl3Y=(WcFiGuB4u(Y-S!wKDn z>jT^TPn97*ymW-PkVeVc;wqf+(0C?8Uz`3GOFK~9-*w|6;c)k!j(Gp@AXd<7>y|lr zSHO)3ssgglhD-ab97C_;2!*1gyAJ#AeUdZ?v8QnP+T_q%uy&u@w&0TK05X)YDdU6` zR0^$UkTgRetIT-@@hn9)_T%8EYQotZPyP?G^gpa5{;!-wZD){~i<`5jl$j#{X?J)l z<-4@J6eBjQLK3eF0ZWjaa(18OGsU~;^+Iawbyu#Lork+K2n@dR7gh9iHDzRFulz*{ zYZn~xe1C!b(jJa(Pf!{j%RK{HN!f}Kvy#wq3Bgcz7zLCJ@>F>+L#Z&I=!1d?t0dXg z`PPS@48lRn_4`7+&eude27Bas+ojA*hmn1cd`P&rBnzWB^5KJC##a5U;7mLeD{8`9 z7a$zzNKx@;!WZDk@jo~?Irz<lgj`(BoGsj3Tus~@EuGCQKqj_kK#;AFke0TDrnHWh zwuz3qoTh}djES;@q>M7m061gEEU8kob4`%BtHNV*MfzYOf=R8#`+-FT`RDZQYeI-e z_BNwK?|V)#g5B<L*{()B3L2>>4n|2RwavLNByE>F7lMBgGJ@U|u@_Ao00TH93y&R4 z7^3X00>QcGy0-dXpFKr#V|xT@Vz?%Rh!h^PFoGfPJc)QzmEuC@qxe++$pgjmE%MDJ zv`~aOWUKt53&?Qj)oa^!(G@*`Ez3r<x*z{iy6t9u=)gLs;dTg3q9q+hOfB4XA%ym_ zk%-hG$0?_X@w%DJqfL}&T|q4syJO!!SK8hbtjt8Lz9<uhUaD)=s%q0qocL)j;Z2)7 z;Ja#ZkGrA)fmn2&4(!zpY+JbyBn0#ulKyTl!^m1c_3nR7nYtCdO1$YOqQ&Qk!kQzz z_pn#oT6~+ldMz5^qVJ^kvw~7maRenBh!1s^b{!W~-uOy#XY5<@&sMoE`w15SE`e(f zx=WaxJ9r%Cgf4cW!e~jQB63K~-CVzYc?*aS?Zx|_gXR@6*m`XDERflcrna!01SYkq z!oD$iJdPW&@U(BUn!o7E1ib7?bg_OK?7Ky>0;XkK=skLtT`HPZkcf3BKr947@eszC zs!S2c$tA#N&MyGwG6#dsA@e{Mf`TA(-t)Ht+=7DU{5)r^muBX?U;&T?kdsFM2s%U6 zv)}@A0D;{6K+fOj!Za5?!dCT14;optf}NpfWOu`<7h1)vwa5H1H7vhUb4_NASwHJ| zaG#h?F~;<^2XM;pdB*}%OS1EH#B3IEYOp`iR;UhP%0*2N^h!zcHjHk_Woh+1FjpE| zvva}Mu}3bowQWmB(;yUYR&j-7an(Oq+y9u7$@U~<89;RzjB)LM@z{0XB}_3*gd@j| z<2Q-zFZ+Mkgk3T1uUzq0cP)mseXaF2(vk*wZ9{p!T0aN|?Qmvyv2aQ6qVfdi5uPj^ zl2QQ2v={Ee9LCY|Ra%<k=6EL0iP<zi0#sc2Ewk0WrLRgUPG*W@#<v4DbNz3ntu>*P zldD<ff|x3Ha{k$G;e@U$j_LI`VTT}LYi;HNbGeVB0M@UH?|LS@B!%&yq229|P^U~% z2<Rsqs>LkVRd9U8JO6t_D=!xJcSm0W-~h02zkAhL-S%V7_h~@N+&y8bKn88_P}=$c z%68jVjXW4aQiTv}T8N2SNTjCDt=#iN%eugfjD8L0g#rtshvy5tH_>K*TyL>&A0Et| z#(125XTEHrFi*-l&UfY_ClQxsdbRk2TWBiuaF?Q4BGhk1`*ZN))5{LV^P3KA6{-y# zps)hRP@lO*!@c^!F(fYfwr!!WXZ{_Y5tS*#Rsy;~nqrNIzNB5N<3-fiZ+gEvS0hOS zZ{yEn@c;B!G|jrfPDn)b`J%B0dij_a-?V9m?-d(r-lKDub)TNr<>%6}F7b@r9v$kn znbo&}7$G19)q2U6Ue?7e*wzz{V%wih@TH%SD%KdFwl@{W(5iSa9x|)9CSJ0on(pwi zR9x*qL1wRt{7KMa*XEl%53U;l9I+^X+Ye1YUdqoit^@!$&i|b==)XMpOmo9zF;@`U z@oOi<)eNx1BH2d<rUO4eZA`hdU%CuQoMC8Y6HCc}*k6qusQf;@q(l5f_9*^VUx3Yn z;Qg8~)a?FM-7ADv=yC5~1EJOWLqvB}<c6~IOiLZPYkt=3=m}Q=!?XO<gi#EW`59Z} zMTW!+n+bYQE)U;ud%$qg9qXaq;b=dcepuiVr_)p07$KkVAf-I!N%sFaF><-dy{tPJ z2V1^aa;mDr5{!i`wGe*_Cy!mDb>1Wh&lwJIEVvXS?v^?G9eNyEM+d~rNWr*~B2>Y) zRkTK1??R&a!Qy3<zY-XKRE!iYc%}+}3_`vinKBn%Q;kIy|KsQjUi_iQ<2<(z*LXLG zEgB5$f8@6Q&poe|M<y_sjJ0CQ&M$h^ZQ5>{qV(kK2%XMTFSED%Rp=;P8L^j6t&4S6 z!Oyzy79xGsEKQLk4YyRm>C8B{p1Q`rG6y;k?BXbbfCBuyU=9vW4lY5U1viMtoS#e3 z+=7FbgU`&Ip993l!69f4Hsc3#bDtrbgLt{PL1tWFa{+!3ke`>A2l$KUwflD-03>`p zkRsVOrp)7%+<x+H?0uRU_w(;+=EyA;4&TRzj>REJ2WX1(-rGAw+r5E4YBROp*!kn1 zQ)KCsXN85RBw=JXZ_Y}-GeOk8s2$g*gNG7^r?MpN+y?fYeI%iWcLA!8LZ`UoxPUD= z-QS1XtTx*-@U96V`b<5;loxC~UNrbkWvV8Ve7>1fo#N=gm1)z<-9EC^fFC_@5m193 zL|VESyKka?*;|K$G8w_+-SE_MY$QhQD%`d8_W_B66o?Qc1e7GxA5IHidMz&2vxhmL zPc`0~h30z+jHzL4LHEhfDmgq%-j%N8jv1IM^73#Ca0!4xTznufKaT(>pSc;(+~RDk z0v{O2Z^p~ZZN|;TaR$T1X<^PU$PMJ@=i=n$Fz4nuo4p`lCdkL}i)6C+yD|YtxeF|* z^oXOKB#orA@>&k+wRzB}TUeI)+h^zIU<xQfkPgt4OmoTPM;SN6mR(41v3??Xvl2sP zqfkc~AfryGyl-N01G77T`=T}kdeu?`a4(IE2tL`|6yYbVcJnO6>3SUTO6UOz$2_z4 zv3L758QNvN%n-y+Zg5kh2sso@SA40mfd#vQpbnWx65LZ^t6R+=G(~wa9Ta*+I@rp{ za7s^1NYH%}znQTzE|s{Nw%lsU9DA5!g^)HcbxqoftT*^}M?dP~+}y8{@0&DpwDA#M z9(uUiBqfqAR;#=`9<yCDa*_OkUN3M!O(0$g7X}6TBfQgo{Q3fdFy;bk@~+R0W#FZg zvHZ{1L^N$G<(xcOj-*Agx;>>RCkHn`%`;nRxX}1kgvtOf$^5U>UIeKK&ZX<s3b6i8 zC@q*#r8MV&FflW9Pf>#^H8uC=$md&1nlTKH>2;UB7rY%SoS>6sQOOjp&wbbal~LJ8 zNeY6%VJ5*^>HXon^ErYS2SC&6<xEq1XLD0`{;LTc&l7+eO<%vQ1EFGP^ah9AvDp<o z%j?!o^WVMt_wKeMFvfWHxsdNHfNs$8yIVWy%z?+tC9(J$fPCVE2-4*)x+S+rD=rZe zk@rhija<;{G5ymTxu8l28^m#Y!KQd8D#4lid&Oed@wrN}?>@!6amV2!4F9ku6+;k5 zbTM=RdPtxVtMFb=6~{LjJHF0^3j<i3@AEU-b(-3VPZQ(Un7nJd9!kIl^((gi7J&M( zdGf8vrt0K@j)Pr~Te=Ty_ny$Al1-Mp)5V><FpHoUf0KO4up^y(h`;Pj2UtQ0vZT`t zvKS94Y97$uXttCKd~!_)ag#Bx&~B7k*nWHOWg6ieR!5{HR}9k>hY+b$=EqdAbl{D? zi+l>Qy<o<fnt?)<Tm+&zHi!wqpc+m&bO$i_oimW)&7<iFP1a7e*x}_pl50W;3^BQB zL;4l(>b%GPyv1Kc!;#1P1$#wvMQFiowFb}iarn6}`dgr9pWg8{Xc-O%X-}cvnYj`C zF*6_$++W{W3gRYbGgI2bRfZrT{-Y4a{|-p84Guc_<_it&EVYtEa`L8;*w%;-$2aia zAz^DI;6CpbI|nJwPR}5-2$}&~-JlU4FWP4?t~tqD9nxtWF$<EnyXW>4pp#!YBUdw` zh}%p!H~tJBt(QMgH6j2tCYY#576ak&0mPQ>x3HybNJqO-;AE=p<q}PtnWRctn!K3a zswl$Y%zbEfoe}?ZZs`3Nd@~L!S64?DA$E2LN07Y>$c)X}f&Hww)z#XZ-P-P~+0}*J z(bmiyWaVIM0di(@w6}y)mDRp57-0ZGcX<uVEU?}DW3phDOJf*G67RCK)hdXAc3i4@ z-RTbh__O}f^kGA;qc_M{<S4RW^AbI@XsK6kEO{=fNv>?BuAdxO50frVT5*Aq<$7mU zcs!V@Dv$C`xUrG9lb$c&lnrgp@<w}|oQ-6c;UE9-zdg-=|35Sl&27k!7>K5BT3fQA zQUqn}n)69jryy&SAbScUcL`V|qg(;LLQhyg4)FC?T)<fQqE&9|HIo>L1TE3F&Bvj3 zR)G&FHx|q~z^`!(xh|a>7<JobZCi$vnY;<{H)z<S$oD$Nk9EHZE9M{*!_F@6HeVAi zV3Df2Ss?QD>xxeKjzPa%pz`Y*@uc{eLa+#gpOU4juNqdM7hC!h8&;qgZMES$X>EzM zd{z1Jgtev3*jW`Q2g^#W-!%`DAuyIS)^gRG3ca-cpVpiDD+P4!Nu3|902|Rj?Rk#A z+Y1PuBQz?E1+^p(8p)F)tB;Oal9XFbcrW7@f4lxS{{Msd-(PDn7k5kgOD%T){{1rz z=4!^~;B3im>tN}?YHjXd&uU@je2?wyIz%-&iZlHMfK`)&0o*wIi9*4}#qDga0jjnY zh~jT2+0Ja=ElR2KEm?ghk_SK1s8bN1c^z%A^{C!Hc;dI@_&S^%_nL?mDavj_?{u-o z$u~Y7XdLRRcZcfU<7QcStrL`f&nu9-N~S@tU*k_qru{=b>3`e3^<vBS7zM?Q_=gsc zcH_5)EZx2nY9w{im69TLs6+KJ_E%Z?OHQY-k*y-zH~oTL?Lw-js_6P0;I`^+Gk}I@ z#QbQGc=rh^4Bn8SC=bpC%~Z6qyRmKB<G7@V%;kcTIO})a;@|Gm{D2s<{c6WvX6Ec| zG=Re|WgO_{QV_;f4K+e7($Ydbg|?Q%-M6zwveWI)x9G1o+nELUKQS2@oOgAlf2Q4- zWN=A1Y{fyyHXjUG5miovBR?4dH-X0?_N>s2J{c=-RKbMrlIEcS?(@(AfgEohtgJXX zVqnzP3~-a!HH0;hTm(I!rzRp138<*W_mOxMdAp{MX%HS1y!K37ml3lisasuS3VU`< z2w^HEZSuw_Vm_sZj$MCPtqpTCCuLn{dcWcJQKvtho=0R&-i5E-aPRF?=mb5yyy}}_ zqcw-*Ufn-H+!gy;=TzBkQcyhV^D`IuV|U&)0rjx4<$Uw==Zrnt&+Y{_`+Gk}1GO#t zh@VaovCPUo0FcWj^1UraKNB^F(DP%&Ql?}8C<w|}DssfR1a4l9uX8_%Q{rT*gBpFF zu^7FD*p7g7F38Wusq}^ROEBe5T0Oi7)|g4~cu)-QeA5raqH>++Z+1(U-qL3p_aqFw zX1d&C(>JjGA?%!bW7hPOQ)EQj2Wk~L{!W+X7-04mC%%~|Z%d;Wil=fyK8&AWtx3t& z%^2#Zj);?El*gB;puhdW?_CYCg@dk4cONSw;wj;CPBrgW>`6}vW|*6?U8%uY^`z0T z@uL;$?N2H=uf&5Q2jk$DSDzjqk)^JDHv}e)KU|b3lF*!|i+rNvo+n&Vz5_u*KtF7E zS@kGw;~h8V?h@F7bkkJcmrgt70VdKWS7gi+4?uD^cMO%`dDyPkdXY(SI$c$``3JWa z@ji$Nh^$u<Pee3jMsf7+?u)m85X6sufq)}i()ycA0Y=ZYB5Hj$L%VlZzAZ$<PV`0$ zU#q3NH2$P*g5;{mapr57;(~L>Q@wHFlKADH*($N+^G8ahvB27%FCD9|%#lkNMJ2WA z)AS=#CVUNhJtP+H&Ig?jSCQ>>VC4XD5nl|#hhxJ)k97@x?n^f&wX^u&{}d6;N9eP= z;Z`dHv897VW6tHHYuO~BJ1S#TW*z#@Gqt`ZcmTkNO9~|0;PM7-%iY`)AGnm65<Phi zeI<P+A&Jus@++~==SqyY2ZmTm(p-y)3<vMzUCPY!*Ksrh4Hz|<dF}=NC-hXEqOdfz zb_h3smZ6$qv5lg$q7YjN=nBGOH$9~G<+8hhn{b(JliBqq&gC2@_QmLSWqjW)r(&lb z+6-KD`9p6C38%6XryQ)=jiAm@wufI$BW)hVY}9L5+zmGb%_|JQg`Ai1n;um~?dDOY zck{SR(F&~6y|yAEdk#$^_^JTWM(czqwv}^EfuKiaM;w?8r$!i$)P^`<B}bbldn+;| zsOuoN8=2d~6}RoWWG|bABh|ApZsHz9d4T%5I|)$w3zO2xXmmCs1rKhLM5v=Y%D5=% zf?n&Z4pG{xADN4KN#=RR-(kflsKfQAk-&xbDn({f#nUS-ugUIjXLshPz?RKg*zu4w zhSeE97P-}0_$A_0&sW1M%~emlgV6uN4B~kG97-cr2@l(;6D$oehbop5yJ!y<v_%MG z{G6NtF&6G&2g)Kx*MtzA1bd(0vj?<J(XHf-S9O;vY7?a6KOjhqwEgI)<G0Usxd}o# z6E#r8=QS8MLC>qKJpHs>A?h#6e!^Y0soQmfq4;2Ab6((CKgu;BMDMnWRt{4Va_cur z_wF4<V!-rBp3k@BFM`ase5+ZMu0{bu4<-?EqX2)Eq8lnUp`|tgF6s{f>-qbr@%pup zxM^;~7FQRI<Uf4%5V=M?`632NpNSGwP-#UO67VeER)&A;Mn481Vi?;pI`5T-&|($w zALoK!efTiqNFe`P!~35(-fgHT!+<=t#VdsH-qP$(y6E1Kwz;(4V6Y7Gc*Ze}tNj7q zIIlM+p7u)^n9H_hSiexKgN4(M*8Jliey+Cv)dAHk@f6>v>#)cZm8g*=n$^9{l9lNh z$z!K)k$SXYKiR|wkekL9k<Y&Tq4+p+EOf$Ls?M<D8vNgbdoVsE%IqvM%D+vke=OJe zbzMjRC)-wH`kD}8b_($hLpibdqn-gT4fx`o+q-WY7T>=WLdg=F7GR-ulvP!_aZZSI zhL{xS5JDoGZp**+7B2}<rdw)Q9MiclutHEx9Cj1PWbj_J3H_Q7VyVcbF0?C=4EN@f z7Fk+UY{>;sA*bHn;-omqh|&D+6(OMKr2It)u}nZ-DTY_h7pbnLrb(lea=*cqegob? zXY3pPVMjpRp%w<kMFbvtgt*ykpK1QIM{UA#E~AyCA6_sflFCH~BVNI4?&vUrCE}Xw zh-DT1u1BLNv?q=Y4A}21w};|Ek&LIXsEH}61lu`i0WcfG7me`H>zu?=@=d32mr{af z5v!zeE5YA$j6$w!r+h&sIc`wZC2>u_`D~W6SK)KGytNW?PnPOA9*=^WNAjJ!bh6n4 zngg_0*{?(s^oG6sX`<;j<0l(;IVo+X!Jo$Dr<iY-^c&pr+uy!lEk|q~q($@%)BoHE zgJArGv<{v-qCrPZm(=R{=jSJ)Qu%<~6RM)Uclvwl(H|orhgb#qw9jU;!<vmXg2NaK zPyeX#+DinKdyz_=JN8^E<+v+wi<d^Q!#ihZi-_#{!8OV|rbb-&fmLPfb|sE|p)@-w zJth?A_Q=Hnu#c|yy9;7u)OR}7#LPIzz`h%!%<EvBKeBHQ<fRql_{X%*?_GUO#O5x1 zr3keHnSH51%#LlL#bdQ>GNNi;Bir$bDm9j<rS^{Q%8PhM;<_}Hz-2?J=vmhKo~WY1 zvA-A#d!gD*{9;AfRiBZJl_$X(r3Lw#5MpmLUxw%wp-l3aif>JhC3cu_S~L;5m=6&x z!(yH1)2nz#%;3*B=$O`jjd;hso72-z=lN_)zC1Z{9kEy%=-R@2+(=l4!l0l#O#09= zMw4Om!lHxTj(~-E>7J3fEQe4RACmRaVRnn^7Pg-SViWN&(=rxMM&9+<5%)0JIXcQm zqpQJ{jc(4^{WsSVEEJ9UW0|Q@+_6fINIWXDH7{EK7Z>rKL1#yJ$7IreJvg-znhv5Q z>v@lf;>^&4lV<2t6rz5!{k<<FExP|GBmF-|>6sV&AtvSd_~VJmFbo^z^xKv7hJxG2 zZwLw{TCq!ibirKJ172dUx!fa&Bk1Twne0AoeIuk+W67A6JKHL;L0_Ng_z2xo_zb0o zms=1FJVWQ<<`)zInVX#f@qjJ(IXJjLT$~`zGq7<W2xQJ-2I2;TEzHb0`OUyQoaTI- zTtFT$(A=EkS6CQVC_QDw+mdA7iY6lKyFCW5q&}+!l02_tFoUGpY60|*=1;E4h9J>w zOIZNktzC>X^YYmtueE5l%j6-5j#l`&mteYYGUZE>e-Q?QUOlV*p_daz@kDD2Y=F_K zKQLC(qpOvf93MrNMmN>rV5=H}g!qp(#Q#ob)jjgQkotNmtef}&Y5fu+<{?ZlTphIG zg17XU9xv~i%AVI5$Y?n*crQ_uJ`{0b<jM_9S5tWvbNchMaY?~;UW1qK2Y`i4kUMR6 z+h;oC>XiRS-dDgywQhaS&@G+PAtBueijvY@iZH;?B@IeTcSwkIN~$0spoD}p64D_c zAl)D$-!SLG@y5CO-k0~x{Wx2HGn>8l>{{zt&&vP8%tJ(D6Z_z2c}22MGkH5PJ?9p~ zufMwA{m2$nm#2)2W3Qw%m&Uw6#p-_h0OdLP-0N5PNXi)LNjSZyDl|ay?RSsu?VC=N zG%Yce@*AD9H?E-%-PqAVp(}n!dNp+U*DrpmZU4ddzp#jsffkGo+}Cv7H5-{O9|ZSG z!YkH06sN0{w4_<pJ7*|ukwVS|{8?AZe=wPdPBZ2quO6B#fAame@-E;dLmNv=u%UyQ zjkTUN$O;SqqMJeU<e`57(T%|NhIVGQC;K5+?v#Hx(&{%b-n#aY@nu$pMC;8NEl@@2 zvwSTT(ka<cuU~&RKM;l)aY!}abyqe+aPys@+RLg^`<g8!#X(i-U8Y+}U0C|nT4X2H zs(`Uir2BZx^A9VxbvddmA~yZRD@DFg#)2<5M;_p^jdT7-7Z)CS?yFM3*T{sdQg!tp z;a*Xh*3+k``48{u>%Lf~(mMsN04Un+1$J&%ONAbIr38e73<pY;Td(45d|`A%;BaJf z`5(mI;gJP2SaaT!t7zINw2d#cv_x5dq@;~{T`|P<a9P!?VmRe&A~{WbVziK8h{Y)x zu=J!dBNYB7C9s{<!-$7kqiCnlgHVIUL}~N~EcQ>EfBhZ((@+0l11y6e7P7OKW2!!^ z-(DzUnx&%%IVP}^CN>`F2ui3KFicj6I4k*wU00vKM#;a09Mfn3h$vFY3p6r2DmSi@ zx@=MFmWalCgJX!67?(lc8`J|0f~*7Y!ALJ<2BB7QHX<f1VAWvR0ry`_jU-Z4q2~hY z*6zT)U@#lGAR|ICP)M@Yr7>GEA(|#quecBMl4szMJ?32|8l~6wvs|Cw@>zo#2(UvV zDduT$YUXdJzGjOV5^@Vow;+`9SzqEx>{q!D5^C|y&KHCb7W#4#*VIzh7lneeBzWwM zzq$rA#5q|mB3YOS6-#)Yb-ah2$^6&ocyD1hHrI~HdgZ-%*jK#{p$bn119Y2S=I+Qo zt=hhsf&rIU4I!w706Vn25?_v3Uy3(Z(=50(BH#)8SwUSQ#rUsSk9$XsY)syqUl{^S zlSnNbtg@d38Y$0EBo?SVa0$;eE31-h5VnXQrmnRpq&c+3GdP0QgTSsa4!c|H!^X%# zRn~=6mWH)8q+{zZ2dcB`6J8|LL+Jx(R2M`vJ#a=8=e)OrUBOGr|9Eywj^<;k1NO*L zzO@(C(IXeqgkAHJ6O6EZ*x~aiJ3XIUhwr4Of7kqcAk&gTF2rZ6@-g7kj0_kLL6qwJ zT5-d6L}bP^@O2L~I%+N>jCascld}kUc3x?;(GGAJccKoW5?yoJg|YL3kWN4N!Hatz zzm`(707e8PoXP2N%GG-k25rLxSgXHcT#ylwL-H0ottuf|KwcD-xg=I$lz#d1bdv8# zbZICV7C%2#iQgjBzdhC683!A;s%>6(k03MHbvxR*OX%Ajo+U0xX72gMVP9mjmWtBA zm*+-^^DMb&1X|><EyTp%_kPpKYV<fwJVQ$U+g`koTa(ddQ!OT%1<$Fs1&-`x&Eup6 zUSaWU53exP+=p0p1GNR&;vzA?qCjWl-ysWWGH-L=o6hdujZZ@EB#-nl_=a5Noy%66 zl>~^=MldTo4OjwG1X{y^KRfzo`#-Eb^toVog%;1W04%n}#bd{W^MKhr$@iZRiOctg z8Uo{9zLng$eJM@cU=Pacu**g0WZfF&Xl1e2DSOlr>Au4yRAP8@IQkU}d2PG4QrVE; zIr9368xmf@*a2`_C1h<;Aj)~Uyt1F}*a^Kik$Le@%&F`<!`PJhLV~A-MBu=Q`{N%R zYyX?-_~p-GX}OfKC9HB=*0&!&r?%JoK2;yr*yiRY?T{j^ihXX+3fq~k^dnbgYu}UP z#eo!_+M^qvieA3-;Kyog%&KyB{=VVE0XHZN#b$(^HMF2s=116Etw2SFcbPx+W)kkr z$E|v`RBIaw_TZ;xrhs23#1AgbI@LEO9F7rMV965WH~BLLneI8^ZDu#!4Yo;`){Kcx zr5_;iZI=>~y?Of}V?H9{mxt9pZy#53mPTMTv%MMrd|gZ6*DwAL-noDJ6Q=IE?lAws zl?`i!)&~V?G^=D=Uj!x53k-4K81l`~;ophdKDrbIMe;|H=YvsGdlvsai%>9Ka_g%U zUM+4UU^>Oj+$bp{nL;<#7{vhb-~}PXhu8P8>?Y`NUp6{)NbpWaeyIpwd3DQFd302d z{K4ZH;s{y4OAyxC&oda!fsMW+T3hzIe(LHjv(FQO>np+9>f>dMeWpb@%Gqy?8eAXy zTo6Khj4h0>h({vR>yhiYiK$T&GVw}_otg|Z3+LBl?dN?43<<jomp>605{4*W7GnoK z{p<=^OLSDgFdKO}B>y@ij>lxRo_vk;+zk9*y$X^vpd$iyIm?dVd-^Mzf)R_WQd7rp z*ZQbeCXo*D?-mJOr{qKGNOe8O5%J#?N1ma{Cozf;d)T^fhKxEXgr&rttL<@#aL8u3 zl!3Fk_(Xxz2>VQ+@h0v2J^_9F0h3Oi{p!?YsX`zI{IOc^HO4+7pmyH3)O!1NxYuTV z?8`-i{@Lsl*+o@to0IP=R8p086wdM0!IFn(;?t?Ro<4M4KCn)63AB12z=2fQBz9?u zk4Vr|v@ib*I1+YMY3BzV`A>??KWzBVT6p~*<wER`g%wHH+@T;s<B(Y`LB#V)G;l8h zP0GEH$$4RCsCB}_?ayqUeHsl3*Y6=H!9mRM^#N|+_<`DVG3dYE`>H`i4y*<1<hxo> z7+z<18*#VGUy^lm88kwJF}>x)3ZEJscz#F&=bg0N474~xv484oPnC_uyW}y%{{aC% zmAq4#2rZzqm_Yk(1?Q<6oI-S+@ktyv0L8g~g!ayi-Z#@vE!*S8ZPoTp0l{1O_NOEU z`Ye7=ZDN_-Su@ayw3$#_)Nqo<4Yck_drS1RK@9sP-kB3%g6U@MPmliD*$miPgCUo` zXnufWrJGsetxswg7qPq)j(g0h>c1N@>**i8Guy^lkrO-XZw5Pn(Z5E2GfNc7iSjh5 zEzvMGsw7h;9EvqL-l<@YImH{}LJ7pZatjpmzX6u%-;je*qq(&`4_x`SHX=awgFZ1d zIWrBRWYGw!(1VAc)rjYTp;Z@S{<Oq+gx|j&6Oxfj=`=`zK}r<Tqx!A5udD`B;TqfK z(}BpKN2O4AJnV1|mM)9pmoxAZ5c#u~(89gj6pDNzA^Nskb4BFKu4v|)zzaeMOq~L3 zTvpVgJS-}T$5)zZ1eitwpE-;!ceb~?i%9OY(qZO7>(*dr6<M;FXtQ#2Ap5Ak*Q;q_ z3fQ?7@N)jPuQX7_?l`HUiR*$8f}AdG(i+k0=>E6#@5Vit%Afl-782FHE|n&IxE5YZ zjJ>4i2K5y)zR*a7jh`Tna{RXMEZi4RD`Q<o|DL?(ZKOQjHKx#J`wT$?k=2C@LI_HQ zZUrvR$FwiM@z*(`y7a;g4~<ydn5K*{q$bfctFjeIHiMd{L*;%j3Q*~_z5X&mE!S4% z^-k>}<6#hL(sINOqZ0>{%@~+k|MU6f{hw!mO4IV%Qt!P_xnpiJmpZIez!8l^j|W)i zkQ|mcW6Ka(hEh&dQ*doz-IA5n^DT+daZ~fIS&aC1ltJaC?Kk=WSBQfVWKUI70C323 z7t-Y_6RU^aChD@PPR1?S8wk#i8Hm!-1q#~BrezUV4|ccKE(lxR%10wJ7?FC3&)?tx zFNKVPouIZ1dRskgA|xhG-^wk3U=4t#{lQK?<lnm<R5Qs#cJ*7t&~5TLcfIij*L%KQ zGFUqzmf?e=br*yXV#C$k&#pcKWX<1A>2@NsDVMzA7AdxcaVsZ3)wT&#DI9AJRb60* z2BM5(7uFn0zxS0>fjB54+}@D3L!9^;J>K`U^&~m6Ch1=%#P9JHOLZHP!Xf<}1H-G= zgL7Ldbn{=PbEWM@qro#xl<R*+IUT(Kn};)UfpaWbv6%4u#6gYDV#Q>**%g^fc^z6p zakOInzkczvf&Q;o&Qmxw0xdP2-!<br@b@ONv<4N;g)R%}ys`CzFEwv7Bz2o*`*`|% zJ1X`B$AI)a>wGkU-sE!CMpv6fwypJVCf|>xy<R5xo!%?($#>It*PGa|TD+wjnG2g< z`SkQAyl%0PyiSIS%zZ~-^UQE=q?C#I>Crzs8#uOD^Z&wX{x5P*THf_^=IriXxFgUM z?EU5y+-f~{8=qm#feH3T@)hOryc5@s;Mdn!JMwVyS@$pyj(0ZeZ*t1&#-QD8*G&4B zILnhx2V}c5z_=+E$_c(!CBZGfTzo$X?Jk_QNJp;A)Qr(vXZmyFPMF4kEzPuA@ZU3$ zAU%?uwqM$~R?}zVxvGUUI`%NV^Fxo>`+ZN42eca*?C|{F#A!HYm$N^oyOSd3Wa{xM z;47g`td@P9Rp^2oQ4$UD1tEl0JAU#K96E#0KK;GbN7pcq5U{mG;N2SK-_|x9cQKzS zlX+AFFsg6=)09crjtG|zw(pAB&{0(wm<>OyQwtyDb~ayOWB0&gX-duzAvy~>!7df& zFBNn;K@&Y$BrSarki@2B73+^0(|Uta4&x@gX3Gw`alGd+C-&{KzafGw%|Q0umn9h) zc3O|>-`E9>(dRGFAJ2bc#kg+wc`hUWO|=ydkRf+IP*Ay)fa^QOu{{M#AzF3nyYYNE zi^!YRw^iZN`hH!U{Gjsqwg(nfZm*P1to84wMH$nDQA$29H9n*cvQ2+vKloO3(?Ck^ z<RS1}0;L)@^Y90xZmmYd*Z}cUoztYMB;PNPo3<O-?H2y}#ZS)mZ<c>izG!V3L^wPd z_CPKZ*C1GFHoT{1wI7a0%4Xjh%N4(rbFB2_bmy2v^*%Cte?I5Us}u{t`yb+$c1`%w z%J56t%QHgh`4h<PFG#z2%b?XYTb%9(8$GE7Ma~4NpIpA?3+BuKBM~NhvV<`DrckMA zpiThTrO!~zQ~7Gy^jNaA5eWE$$7;tIR~{fN1do13NY%Qbt9kX@m=3mbJ3Rkp;qAC! zZ~uH0;VfCSM#h`&mNfFqes`!wD-U<uO>?%=PVx!&p9_-1sKtn+YU6v3j+>u%-J^XY z@_oe)uUC8!8d+?6@U%<m(G2SaNhq^?8obz-%Se5TGwaxx^!@h{dVAG?d6w6}X{9$; z9Nj3V{Ke~_{z)wc1Q>-*W;l&B4K^C@_St+)Ggj_5Hz3a$C=|B12G_vii9)(Ddu}7* zUy9*mPpxrYd^WXP_oLtB6^$`;5U5j@4viNEOL};Xe6l=eG2BK%plw?(O5K0={niJ1 z@NH)EafV^?^|^3?&?1+`*QMw9tiR2`h&NB>;j`S`+m^+Ih5eJE3nE@l=AoWkS?i`> ztI(8~dR0p#O)%dNVLkJ3(#iHL4R22RRB6O4B#{>5IE_II_J2E*wFa-pt9tT2pbL;b zA%bkW;hq4Y>X-CMauJQZ%c6>}y<>*u1j0tY&lqK#+oQl%kQED8d9P#(?eBSllvOnS zDtdav86{Z}zM-y~x@UZ{tV?f6gSw4iSCW-OtyR?a7GR%mL&gkzWR0`zuYGM`O#Q(! z$urTb`mO&1q=8e~{?RuqGh;1_oBS6To>UhTwUMe>?CZOJx$nI`*Y7>x)ZNvlg>85S zIR?A*v%d!9m}Qv;YqHj}E1+$6+wOwft-@B<U)12nJsSw1nvj+r$(1HgqlIF>!OkS} zEL3f8fNNSpCQA&R2!B79A>1uWf}w8zPUZu%wZ`i11rbeENVis!0$BL87(x(aWEZ&S z2-vKL_m-vZNj%_aPI6D^?kK{74CQ^;VV6#)P*xG^nWwauBg$zm46RM658V*C)Y%_L zs3oh}e4F-y5aR8l0%?qqMWYu+$dQJ|tXh~Q0mBdO2amgVt+7X3X^t$nz=HOEk>0k4 z5zx3?y`EMFcUW`ZU76KrIBdS+38zbe8S!u{3$2sX;T#ATgb?o)4`K#K@YZ^wzf*r{ z&QFWoHOPQZD6E{ZhD%)(Q?1NEs)kliz|McVY+AMMCQAA^j~L55-{5(*sLNduFJBx6 zR~z=~I<}3x3qpu-m$rq)iVv>}ZMK?q6`zw(uyoNNn@9=MVpxx7loFdBAP7Ml)4&d6 zW42WPYLxNvqK$lky^P`$PIiU6esHsCH@LpPCA=<lCF$G<ah~z6c%bD@KDgkRE+SCB z+uTbPV4v7WX&cGq`ho3Ekd$PG$o^@(D-FEY&HC-hOS&$USkqiQpGN_bF9e(hQt{(% zeDW@ceEhqL2YeSA2u$vY$RsLOMS3R^@kEOHQ(;T8ir-|RvML@fG5*i?Z@n}!{SRVT zKRE2Z88b=t$jP8IRbL*{^y=HztntrVD*9O43;%8sZk_)0nE=DrGQ?9`YD?umpvA@P zGm#IK(cnJ1dwVB?giBq}o#tFoiJ|^WJsU>{TSo_Us1c<IT?d}DkNI~C9KuPfZG_v3 zYBvF=s8mXp-%QM2kSRE&z?H{PqN1|jUb43rSBgwWU3lMLy`Io?`iR#<Z4UbHzZo*z zeDSe?d6~_Faa)c^y7{ieQ3)6>JgW<mLG;^_c0@b8yiQ6TuTEs)pDj>`=WE@EffkZ^ zHHxQoxn3>h+}IbU)|VA9IJx@9a!!c5<zpSry0wSN9vjS}3dX)Xst-j&rI)8>^Q)j~ zZm>)0naZ}iRz-8g>&on%hpFgh?73kF%#jlnIF)|rZ>3uz&Xp$(K=x*ar#yM<<d6S= zCr??(!wO+;iIa=HjRbAM>v1+?{FCy2Wq14v(v<AEB-@aj_*0%l8^y<brJSz2r664v z3EV-Jwz*dBsu?xI(%7t*|H-=jlqG@jN4PR5f?1cXaFmGo4GM0O!RfNC77K47`F{68 zRf>6Y8an^&2R}Rd*E#riNn(ZAINLjWJ<xD@F5>z2_;DE_N;J0_wrVkEF6JZkPN5+t z<Y?&Ce}=30>lZ(L`ak-HrOj-Gk8)jkexy3@ogvAC=kW*I5t!LBhGM>!52)ISQ4jIY z@}^-|Q~cM+o3<i)kr_F~Q!hL1^Ll5)k&1#NFfC+@zJ(xlnX%H&cvLBKcOJ%Z3CF7r z#zUU39sBxssjdksszix)ALHdd^mQd?@!ql#6hFri@n4jj^0PjXC&?-1KWSYFe4A$Q zpd72X16N$!R4~TFy0)j+>SmlsMI~0-%LkRm`oI3_evo9;nj7I*8zcO^u~%#TaW!(L zY4I^HeQXD|T+IyJbO`)EK->Hy33j?2rjm>{%f+0xFVxDDshNEg*IHpjKVMncR*a_8 zLE9?3{@R&|4Li&3Pc*SH3~kJ;^{hbFAQP}1x)|gS`QO%o$hDuHf|>RP^Yo-BK9z6W zdNz=A=N=Y6wecFJP}3$Qy7L)e>Zux#2ehKI_zE7?OH{^GiCXaGa@a-u5RzKAdUf*3 zz|$btmWp&j^+rtMV_(JZ;w5^_bw^tGRlzRW`L-eNaSb{b2gIKLP0Iy(xJhkbKItY3 z`^u$QQgWljzv2=~kE%=H)hImoXKXR#XgKn&R0<#mGbb>WnvDh6nu_z}c1UkhS^u`t z0lLxH#*WGXZ0}%ZZ34m3Jv}=B_#fC9r>y%&-!NtAt48UA4_<t<DG9q_8QaG&Kjm?A zb~^&sOW9Zf@i>m7?&a_(6o)bmISfWQMjoAuBX1iQ(w~;GJoKTCycE-Q(^Wty=lZ&O zZnqmcD$%bCwm%}k-?pEpjhqCuVkIGcc3Gu$`QFo(6xSCjmnYNf(srKh;+YhL57+AG zpDMQa?FZVmPfS!e@|U{&9*NJgk;gt^Ah;9bh!WLCN7nU2tcy?^(-z35pBE&Fy@c3G zSUVxAsEr#G%0ART?c4jfKKagW*_TH@+s|w8faw2%hySDL^nZ`>kJ8TJM)mz#CgNh- zR~FJ|J|D;h*<@CH0=qwHl-a>0H=RkEGmL*LAz_8BFP9DO)s_{qmXZsEPEF318nn4j zkRW`?1gtK}a0nP0aC7j3xHyc#+y)?S4qmVz1nD2dWxxpn2?}r-ad8@P3vz*ZKwu*Q zE&%~UV=xylp8*d)7YCQ1ks+^;5Ja2^3CSy{oniccFHg!hrl*UxyJ>lUlFnd4JItHx z7J{^R=mYps_#!Lsb7NuH+R4iBQ<hcOiAfLBWI6(ftY}4Ruy|WsYRLJj_re6YanH)Z zU^hLUUpd$hN|I`y{pz-p65h@4O<n3GZyeAQ5Op(I$1Z6;dpoN2Ui;5ilFqv_+{4OX zEN<=wnj7Z)q}S(we%Fyu!vXhD3en*K_Hu8L!rfC@W_!iH-(FoWnEy464cU}7kvR@e znl5+ai@V$mA1)m~KdZhuo%a7&AcH%}f8Y7D!tY-nKJdts#(mb)w=CaqeiqJleIyV} z@Kj-|#%ELXjZnv=NiU1xnZP(rGGw%Jzc~=4CU4XAFt1*32YV*?<u$!<WlYB5`K#tO z+1cWMF)Vj0cOBQ<W%eoE^^|6s;#R;z%IfEg7*36c51&cj)#ql3+^iXbdeyx$En(E` z$*abfpp@$p6=ndzaUbE^Vxl0HVp__MUfWm3i{D2IdVif?e&@k|y#`a&%^O|hcKz#q z01*i$h3-Vir8~ZDW6?98P2}7in%G>hMe~p}@gcXp4?DMHgKau?&01w<w9l%B9a4g} zuzlaRL`uc&>P8+!9>+Py3qpuTW?s1O{q0)6D?QxkQhu{XZgchNtx>%PnJXWhNvWQ3 zn1}<Rgn%6?>8LC^U!yKo8VP+WhE0jWhLA$_fO!ptkyPkF>w5=ss|!Miuq+dLtZg>C ziI)2m{akMnT9?Q}+YGm>l}sK)U1i^2e;7Y-5;)n1ooK2}RiV0!Br%RLT#UGo`7(;X z7ULQ9lq&X&5v?0-($|U$LWpp@MWiHQvDWcHE8XoR5y8-=g{eJG6mPmfV-D%?rwiEG z-=X<xw)e+il<z54%hx_L)wEeyqZjM=#Z$T?S?lqY593Z{45J?c;1|x%s)Vgd9=R4~ zUfY)Z>JHjdyUn5-FN&qcoTT$x^@wg03|&=DtqW=(gNi2D5h4_ch=x{l7nw(fw`2N< z4$-^#nQOwT#C1!uH_HpmLGc%4M8t9NmlQa<;ISPI%1v4xKV#MAp>I}iXbqpZQY|2# z!4aOB2+dc6T?Qx1<lS$gh$ZAzleZmGl~N^+hS~-OymZ0OIp-cCd2n42EO)E;G<ZG) zs=&-N^F6EHQLFk-bT`TG`})%Mi=~LNDID!T_~ZbcBVgA7r|SlfleL0Uvr`t+lSDF4 z*&w@+af~e)tJ_xr;g@Yk&$A*3<D7%Jna9l(rMVQjuZNkLuvqWuEF<SAP`-(_5PjK> zr#I_)YA3!K<e3ioIIZ=XICqd82Y_P~lYPYfk{Us*;piH9esJ=svi(1_6R9Q%fh%() z99OFy8we@yf_a{q#kf87y@NYS8MxnO^7(>@lDs8m`iFi}J6cP~o*vn?68ELaKGI<I z*(4XQjHTI-0E~HlgTRCxh5&-h2pRp@cB}`5q~4YMy=~5V#LH}(820^hVs0<;lhMwN z5a;jdcm|T>uzp<18^|Peo%6|qG^)xl_JGf?EYnb%z$k9HryT6oSFF+OUrQuwXCkc| zU7p$x77N~~dYU+!LXl<LQ?>ISa`4Y8_0R3a!B#7I7RZ&LRJGd3KI5+QWt(Hi7w;C5 zGfoZpi-k!XmVGlXc)7>W$q;sy>mln+hVAhT^m@x^F*#9TLKy*_ysTp#nMx74W1lLK zuNQ<6RhkL5DMycxgxm9nuYjrqJPHf*V(e!JhgVr{x$}<H5k~YwQ&nM?nvr&$-916; zRgul!D+$4)?ckJhTx2G-D*Tnz*Io$&R7e+u5H%yH(t!e~63o+s{SD0US{C<jGx)xF z&blH0{XkDHdY|0-8Z-<CyHwThaIGIdR8x5P9k0!=>*{rU61pYwQBr5Z-X<(!YZmQ1 zQ&s<U(U{d6p*Q0$#C%U=l3hP-sfF}6zz<F<$XCFzQc(x0tE!SUPaYzdigi-22XKk= z2|HF-dVh=)d~>_={-NTLETZA5NCp7!4}Uev>XosX6Q7^EQeH7O_a@n)k#YB#JS~!K z0%p(B1>vdp77ffC>34hKZnd_IM_nf6$XpL-8K(Emehe3{SlJo5K;;GneS#g#aQiFI zH@BZy2%7-uTHFyE+zO9x9BP%okCxU)U!D&fB)K4j7+hS|!PDBbZBDx75m$1s>m8_r zTxS+th3c~3`zVX~tX2tjl^K6pt<rfZY=6u40JvF=qI8(M&zMon2*x!j;Z8d}Q0H_h z!`j(hIaF95a6ePnkSjfcb1fCV33v@eB1)xH`ymAsUgn!g5aRJAUKdg1KkX|6krF^4 z$I1UQdGSXpf069xQ37Ax`Q<2I$&S2S_Q%>u^A>1dDCO&Ui9==UIJh66IB63?v!7vC zX%~3Nd*wEV&-RfP>9{T8Ue%SP^fu<M{448l+Os_JQmN-AM$RKc<TS3RYBgHAPbBoN zhkp#Nyl5zFuwjE0d7A&a;CA5{!dJgimQz#1E4b-+6Ql9IC+^`K3cnlsy+tY-&omA5 zSVn2NZU-OmkBrJsz{lG;SN#mtxDmPj1A66$9(}Px@3bcHY^Gl-%2(@idlP{FCfs(b zgX;#<MW#sDEPlgJ0<JB(j0}AAt-l#$qznJLbZCnDB!9A+;2u4D@9LEWReE(5Vgg-L zZ&BH3W)Cqdox3aYuOh{Ocz1d}^QG1sZ7$5wh!H7=8+@Ttl73U%9<D2ZmDdlbKgU-G z!`=f{2S>SLvNM#Ao@O$<#(6!N;b+`a%TivmM;0Q3@`}C3)?bSUYI-d!5WuJbv`fBD zPayf-6y0%+E3XmpIOgPu?lXGI@FUpyTM_ns#JL!Rutp+%p+j%{P0&Y#jWmOEqI1bY zCe=nG`dfmZ7<>RB;`;J6C1^4>?2=`a-;~JTYS(+3`%2e*RCJ-90JzKZJyzpz>doZ6 zh4|Hk3qlCI#qoSVW{rW80567gKCM^;Nv_0^gZ@$OEq(f>(XG?;o&BCku{?;Z1=@1_ zFBVQnVwsSTy#vV3$kE<G&(YSz4rBz@vjiD{Ero<s)o!YYtE;N%sVhmT+!UA4le>9K zLJpv4w-?yCT`d)Q;FS^(4l*1lRc^hCv+;$|5rM;z%_aJR5Q5OG_ioqC6x(k09=@0_ zn+Uy<O+!Z=8Wv>^yRRnY-6Dx%NT9vvU>70@Sw?VsEHk>!^nQFc_!{u4oijg^RlB~G z=rk!|jo$N?3qlBDDJQ}u;zEQ+qz<hS1eF}ATMniB2Y9GoC~?x8CdL?rrl_GoL)bMs zz?DORmyOmV!+e-94`O9nEOpRtqG-q%@yRtsOq~<Ec|izqxm=u5artIAqgK5@H9O@4 zSF~%SK89lOC7Q_IHvI}(JhjeH{3_Uuh&@#a?ezSoEHvzNCdS`#JmvL29gj;WCSC;< zw!WmH(YqjoAm{7F(JdcR_I}Ll9@sYmlzM8PdN{II&f8CKT;kV`;!pk+3UXnp6$_($ zhMI#CtD@yGQxjSAU8Oi70~V6xgN!SrqCWJvn`i^_Pkx;czh|~uGc};nJ748z#gtk2 z$bvOEcY94$e2%iS9w<8T8hfvU>TV0Y@QHQ2L-ID#is50f%hp|H1GgC~B)OvmCWUAo zYc(;udmeW#2#UHj%R~FLjyEJcC^2fw*5pByO*J#IcvF-zNL=yimh+GGtC?hA96FBY zoN9mA+NtDzlWy5~1=(tq|AUiCt4wvv4R4qEk*o`1#8_Xw&o=ud>M2X*7V-r1)5Dq^ z4-7>6;PlwsSE?2Y4vyFYm1WT32)hXALuHoy^#15~_**Qc*9AUhXkU)zy!u(}YNy2@ z%LHji_pcAfKk`1EZii(Gsx_Ay^@n+j7nV#!rI^$Wlt{j@4wi{ycUq(;nx_d6`$gXq zdqS;A*i{b^@3+#%ndo2-RxBoT(C>X#6DE%IxNirHG;#{slM}umfjn#BULSZHjj4$? zBA+fRX2+;9o4Rmg6pDheJ9&i3k8Ygh1i%g|`cKOVfN5yk`W6in*E21x!-^|wt8?Oy zZQfXH_NC%R+k`o?hiPKbnMSy!LXj?Emx5{!24^a`%-zZ~Z)FJP;w<5O*`l6m7xhF- zE3)Ic@Ewl}BAR4(?~=RluafI^QHftGE>c-smeCQG0J@@vI~!zFr~>@nq(KP*JC&`x zeo`N0`tDWFV5edwROB(zN|`a5SgaK)EPH|-b^Y@!c88(I(OLlzPp82$OGMs`Ki`1& z+&mEz-}K$!qBc^b57L+QtJsWDyHH#**v%1|vhs)4SMFib6d=$<<;2ma+#63|%1ij< zoh!IUC7k*{01^E`cUEq$8WPJDSjOC7c*4?a(j#EGri9XF#6039zX>F}m3Ay3O?EPe z|26O$tqmFNCsH}-Msj*AZ!oyLUq&TN!Z||llo)HI`|gxdUTNO-0@_ppc2LYtsvO(2 z_zMUGwi#nc0a9@NnGa>-!vkBw_GeZWZj+&25V;6GRBe){W!%M@f;Wouwpv><EdSj6 zr2DR^Bd5Hj)eY0A86b2x!p^z#7qKQSCX`#+c{n_`&Enr}6D1HlUtZT{z294_dcc5T z^3^}@fNlxKZB`g)S@*Z^apMSm$ktFNT%7Tlupgk6WmVCPgnNjWd%xj=jEMWVw`w)Z zt#^oC9-2(O^iSE`lvg}R_U+J)=(A9qU^`RUVCQA~i>Pc5ZURGg4O~b1E<YW{nsP;# zeT+<ltxu|PTl5>p^UING2529kBLa5qL_?62aKX%o+STxKfm^_V15RJ6!hq=s71nme zsE=QE$j)s<oJXd?X-Z2x(E4Fg!=8P{vgoI{g1yn4<n7ObZ8l6R(Z+Md{^OPg*H2Ro zOs6J4b@lNMx!kkEqHEipGVG2cnRZY#AAHqnpmUr$ed=?7M8Re#I0-=_yiN6PsIGEx z1pp7hTD{T@tVr6&wn&pB)JH$tzjrjr@PC0r0ZUESi(s$;A5!1fWio+-cQ=ICQm0eS z&zv4>=|jO+lj(vUZ@p3&r!_0E#59+ecNp_+e7VW!LPWH0_iTAgmPoX(SYkn0l!*Bp z`S+YlOROJ_k7}r?RxjZqI~rmrJ`cl~eQNVP^17^dK<XNA1mKi~4_POvv&l)u!#e1$ za<aak-G7V6<ZfGID_#>aG><RpbIQU$X3d;#`}^;|gCO`56Ki0}!Ldo~MP`A#<rE=0 zzH4%dTU%ze>Q#6%2Sx`g%Vm-Q2`$&+Q6X<>zs{lvMh#OoKn3EL8sQUb*WJ?0iOi0R z=)y;LRu?2f-+I7h%YMCmZX66-H&O!5^P6_cmZb%USp-ijzRIRIQMV1ZM`gFHR8W+3 z#Yj(y;zM(Hi9MSWV3U+E#DnNQm!$M;pr+);TuP??v+l3=vk}(^n24TdcJfS)pCcju z4rz?=2c$7IJ21%J(au#2WD7)|6Fj^w<{IAiUGF1+je5FhX|=BS#!(?r$<1cmvcnF* z8M4Re(5JG_SlD&BlVnIf%i3_5W}z?>%2_JW&pbrWwZ(|w)b<?knUi)G`O(C2oP4uR zyAVNgaaQoklX86c`-xe*vROgN=k|=}Io&_7&R^n2^YeKnkhAh(nzZhrciHvGCd4;G zVd$cLCXWu(Peo<K817tN`n>iXvCq0llx7EQ*mWB(@xN2tDvWWZjK2KnR2%|3)p%(8 zp9MUs<(8Nz<9{D{dAV_Jx3`e-`;)A7fAh!SA0SnKcIdgiG1v~zW+xV8c=a9zyl?Dg z3Y+ldDg+?Ina!mxgmS@sILm8iZ9rgGuJIRfE42uXv-)vlI1<9uMR*-f%-{#j@Mzl( z8;9|Lvu^8gyCl|#qn}Jzu!{sL?Bg$f+^i;)%O?uxz3N|4R;w<ayxS&(Phv70PC)+Y zf{cg(!SaSjlH@w+s@;ZWu{_7cdM`B>vzygNH#C)^$63w-P=PgNFhT|Tiv*xP5~%iG zm&^2@9_!zqSn<Js>nt<fS>jgp)PQfe$IW&@Zb2Jb(g!=l2Qz}My1TT1`Nw{lA&7A$ zO_EJava$>;#`IXMo(tEP&#yWdwsXXA0=oRC@rknOZhoW}50_=_aoVchrf7^&<jSFx z=`QEZ`V&GOt*}D{dfLDN)P~nJa@oQLkYsNZ3(h8KSZa;OKSp+B3jjAT{<>)TA?`7z zIM$4^+se%PAl3XeozeHZ!~##dr^<L`Z4YiXi*e~AhI62tXkg~|#l?1*6JkgM2xBDh zx4q#q0(zQK)8vd-lQy1k9nbyx#ZUE=Kl+AghQudL48%FBoY3KXAKA;nN5x|WNK+e! z2)fg?J9xE{jnDJtSTRo~D3@S57|F%%uxm>la^#5heRP}Ce$D-=oNgbVSo05k!w#>X zl65;z02Ua5ggVsEIdr{d)W3AtyW=m^R9!JA56VmqHYI;sr;mg{^6bnqI2n&8i@o(s zXe|A9<82bUFmwIsI9$#*;XUYWJT`A<Br8D=@bYE&c?>zhypT_@0f<Y0kAuV5*uaR> zm{)+08)V39U|_%x=H)Ts;{<UF8VP{-1UQWhj14&;$MJFSa0-G1e+LOQ`t6bcV27F! zZ`$5rhN5D)I0xAWbL#f}a$&wfNgSTxu1Df{#TR5iY<~iEOtC#=ijCdpp|jSRuarL4 z5A|-I()9GiN*DB2LJdfV!Uw{x07ac7HRmv6K{L@X|K0)Ibt>9mt!ZTA5{pXVnH15q zN|Oshh~3*c{8w`v1@NRT2hsdGMxE<F7t^=0Yi%qi^XxG+*U@|(hhlW4F-9iC#>D_9 ztCxSkB{$OAB5}p_x$ZZS<j>}o^S6>vV+o3KzP|OjAcQ!`Rs7cMNz-{nc$2+F7)dsD zU^>VEPRk@W_hE$6<4=K3JaWG^_pHLnfDIwK%yLIDB1UG&%<YFtuVA|gGv5kHEV(~s z|NQk12M3bOFB1Z2{WUA&#ioNWD7siEF~l8FUiW$cQ2VOu4%XU>Fn1}=Q{N2mL?-8; zq+eb_hosaZq5%QekcM&ak~a|ifVhb9zy=`lFkA;5N;aZCk{^->nlCaUMj)~k01plg z4jm2yjtuTH9668>fCvZaI*S2>;I<<`Kao#9;epUkIOr$*$tNNT8~_Ow8Gww0d~ydk z0LV6Md~`^aBV+>{94-nf5CDG(8=~gG<6~Wde3IZm))9#CfIticVob;<A}Ja=0GR-Y z00f}H!y&>WqF^8*A|N6mBIBYEz@Y$;QIG*Bkb6S{q5#klPd=b)2q$Z(Kok^oxRW(_ z$Oq&PAY>CNWCehX3V=M&$v@~pkdwecjzI-Ljz$H*BSY8WAzOjyz>^;!LDmpY)=>a( zr~pLx-;aeH0}r_(<d=vi9|$KuM}lrZ{_PJq=#Jn1075oF?&IWyXmCL2jUt?Q-F^i5 z|IrO64|V_<fgC^(H{6e#fAG#>K%I7fI}9EIjg6#e>tJSMjsC+isA?`^Hr5Vc7YBHC zJ4<Ack&zwP-X6gaa^b&o0A4bLc>Nr}dWMd6c3^8mS9BvsD=Sw$V>7U&5h2(b0^Dy1 zhO{McF|%^C(zAE8wY7A`Hny{|(gWEWnwjYtxI$q45zMU391yI`tR0|pzctty!P>?e zjAR47D?D3A14~GcBYRVj9azuCz#MGoaOrQ`9PB{W_Qqg4GRU=U9Ia0-^|!~;vvIZt z+u56%*&^A4t&PBTD5uAwIk@N<{_W8m?JR#b2L7fH{L$Cx5c#A15N1I*c`7tG+<$6y zz<~xw_HQ~Jpuyb~H8eI9<mU$oa&rlQzy^YRU}H{hFhs-QGy?G(@(T*`3G#6BaB=b) z@EHk$4M7}+5Ri0Zupke=0jD81Hy1wu4u}Q4ML1Rg00uHTfD;Weu7D86MMeV(05MQ7 zP%%-FP8%vfHo>6**>F$=;L%ahQP6<`2pC8h2pEW1h?q!cM+qRJBVZy4Kp0j4866P= z9vL13G7hldaDW1kfeRVXkjFjYs-L~tljz&OTYmOx&&-^EcM{0H)5z-|9d;J@{G$W@ zw*6Ee{iDO+e|E#a{Se#jk4|v9|MWcYzbwiB{TU&9VQF>QpnG4doK;5tkm`E0f=Tn4 zoXlgQ8k2brfbN}Cx76p3vcQ-C<Bn}Uh1@OxPKF~*^gA4_`_n$f_A%<+we=y=ao)-0 zk<r<|PKYz6WVFF3Nw?s{C3nk<eILwB(BH4-T0cDaOh5}jcH4DSe8{W#{>p+2(ck z2r`3Rx1*iAgudP3S>lpp=ALgH_C+RZsVEJ6`Rf<|85_Wq3yA033*X|BkI52@6s2$l z)F6nbe2WwZ9W<zL$;%WBob@(=o$dYqWp5Kr8`AA7tt)^zN~7oGQlnuEE0baKxAaW_ zT44;A#sKqIP6JG~%BnH?B@62YPWvxR*7%MdkR!iX_F~0Z*+*;}kZIO9V;*3A_z)ie z5NVZTTdlbBo;<i8F-i0_WwI_s2lL|+_xZ{G=^(55|3M3@vors}3QXCOF43xMn7Y0E zm1Om+takX@Yy`7bzWz1yv!iu4FlyFY%U`-egY2-2?OLcSaJmg16~DK`sb5oZDd6Sb z5qUySUGeE1vTEPQ;PMM1AGmjkhN>}QbSl5NZ?A`^kd{6XH@(EtFyPEHU}qQp1;w=B z1=JM*yWo*!2g8eKxL4Uorp~ch;w@MOf&HtTI-CA<2__7eB5N<obS)VE#n~iLmJOG? z6iFQ|usf?3jkC^IS!1c7sWbF&?+hRdb~(v^8bB6o^(JATEDO1e(B+pd>=Mp*=fx5D zutqoy(zO76G;7LX8)rTtX+F11h|UNDEQ~+RCxq>G0viOcVC-<F&Rg5uKx=5V>Ke?! zFvEWNZZ)PiVNxN@K3wHacb}7Olr~iDM{wd~<3KgDf^@}Wx3xCmFm-USwHIP%x3L9V z+k-)DW;W~)_zwp&Lw4vf_UyKnAVaXJjU~ilWP|(wUO`grw^<9=9)wLhEBaFS-eYNi z$OBh3*J^69&S=t|^}}nfm0M|h=O~6@<e3MQ2&|zJQ7i^5(;MmCKdMU+!7)Ryk+Q3- zo~2<aA+|U*?9NDFZzH=xEWH?dsEdBx-((svuuEptC#Omo5Sz-I9*FBJCBwl1GUgTl z8*>P9@^ga0f&%<tLr8xv9$sU9PGciO4nZ)t5ho{~AO{bhF%LgKmw|wR0hou2i^~9H z%qhTU@VjUJtbNyfjIBJUuEQt&D!E~qfg*IFj>kcZ+;<B>@ChL-6y4_s`|&S%PI-dU zK`O$S?J-b{g4VhYlTLw?;RzFlAjjCUu%w>*39p<Z&vD3oBiG^WGq@dCN0zu;DH`pv zeRrsCfi_2)oI->3(Ci#}4u*-2HkxtRV}kcS&B&C0FR>{cQmnRbB2ojqESypBp{@wq zn{p>Bfcjiv7o4@;ce{V-<wSE6oR{vhr$N*$myTu@N<vggI*k;Yy^ZP%LJ0jlqip#x zRmVuu=Vm_b@mQigAHPv3ZDHUh0q&Z4rdGbe`~p>mVVAC;gXKR}fBTARZGl5j8Cw+? zr6sWU@FVGWax7ntZw*7F7laU?xMFUH8&|qAuohaKtKe3`!d+u)qPtsY*ts<g{kzV3 z+g7T8VU+s&C-%05rD!rkcb#%!=e^`txQ>cl9uZAFsbm*+m)uci@kP4IvQ`3d5i2yM z4R(dgSb-}+QC-#!mUhjB?V&AeJ+I)ZHx<!7WS90#enV2bD0aF9%dH$QyyMv`p*-`l z_a%4=K0P-WMI`I(Cr^BNJDg~p*Yp@VNAx6%#KA@xRy3ze<BTk&&=YahV<scxdV?&b z``IE-O#&D~mE{^>bU{Ru6_8b2u6UiWMys)@Ql@i7zKD-6x7(Lnd;^5+j236xZE6l3 z5wOEg7Bjtc39h0x{jtyhi;kUJpT(zSj`yXZq;b!9UenY0-Mt`$urHT@AKFMxOu-jK zq%9PUa^0NEKYrgi|5h%@M#H>Ide#(b1MS0ZvMyoOkQ&`6zAa=Ry5@Rc6Vtlo9!Zp1 zB9E+J0dfF%`}|Pq|EmCSZ62`izcZC7lvwIF-+o538vIHy;QF^Jfj!xpjcJb#f)h&? zK~6q}^-*HgAomM=btC6#=__gO#e&xeffjYW??#?!09Ek!*oL=WdCm<;EFc=@cqixE zONr;2wJj!b;%`vjy>~%)_(5I4#wH`3;Eu(h<LB@=G7^6-qEgrR5u*0j{0*;IZST`M zK(V8=7!Y6t<tCf2Qc89Vuglsc2OOb)8Ky-w)Y*YUs^crkeza(#RB%xUu`NM?C{}x8 z1Y6#bCW_ldOd#w^Jc?_e)jeYOgz#LKEzeD8j1IuF3L_-qSm~8l!;X0Jqz@+Y0}GPM zu8CrzL`begkPJIJsZa2qUq2~qx4&z7aS9P02DEuNBNsTwk`;>y&rclG=qy%DhMQfH zxs=zTB@{<1)_-NzDP(0{NJWv0I}`rXE8@ywnINPToL2s#!JHgH4OM7d7x>eo;DK=P zKRpTnT&A#ie+Pl_@%=!$@@Y-??>Wj3?I#2?00{zUh|7u`l^29DL+-1qWupZRI$6Ve zvF_{WWyqo*+7-Q@_pz2zF<3=Qdo#BQE#qZ;p^*q1z0b6;_T!5MMl97B<+nFXDC^&C zRor;08oN`{{0LvvR=n!m2ytHR8lZd#aa274+QgVRe?1ni(x!R+Oe;`J4Xah!GQx<F zoY$p(KS1Px@oDVPn3vgzC;kQ=$1P=!AQ3f^x=Wv3>~k{xsoI_Dk}+$4$m9UVAK}WN z2xeWj!cijTHz>GC2B*umS}eSU<on$VRVn7p&-TB1^{yRqZ)Zsv=l1qs>&t&CyscrK zg@tBbfx$u$#@M&Wc3r)5R_X|nY>=MWK|@vIw+IEmf?fNUzepNFnlBo;t~*jYUM=ef zze?Jkv8eJzy%}1pfg*quZBeb)!aM-#;(}ebGi{K&>)U|UTU&w&X!oqkcSVd0Hh6TZ z^?2u*g(p6+GF^}nk@f{A_L5s$3fEYDpk!Q`kvV?}$^)V~%~%b1h7tQ`3px(Y&{_=G z)u?su60j)gQ5_V$O?S}|$<w#G15#3x%cA$Pz|2qTXx+IWgeWfmq_a$b#A1@^5!Hjh zgZ|Y06Iw;*lG-xAIzjQ9PM0fb9#DXB*wp~YMG76iB0=#(RqJ?uuT+qFa3B-EgUjwN zqLF)ysr?4$xe?;LXV?^=O<fa~NzbaTSK*exFtTR%Bb|FBv^C||CPdy#aZp8wpU$vR zIicTLtXvLF9t1GTiQUl@>fcc(e%`pR8WhtTPGx)6gcSgMgsFW4*uPPtIJk$(YA}Kx z?+^i>bI36$DpJ()`9t^Ia{^r&{h#eu`u1t@0?x7x{%gyTvqD5_6y)%%OS<wP<YH|c z?sfbKo6fQxOO7*h5_a8@&d;3uA=9vzI*BmiW7g|yobshSO<}fIxZ{%_ZO@Slt4!ax zny7WkV}LBbZzWBoAyyq-8#$J<05I3sjqqMHQPRSXZ+Zww^#gu=9Q|<dfv5?#V_YYf zaK4ux7qstO5xHDSFpY;cc6Y?3#W9Dw?(?HvdkCumgx%-lRs)^*HMFMLwQ?<(Q5LjE z`dI}fZByu!cB(%c|N6yG&i3z?|EwDl5D}V^j-={fXJ%~zIKdA8cMBY{0mu>rNjXQp z_1iZPnTAvv|NHC6lJ!NscQh-i%fU*d(=W8k4D2Sp2e;^WwVuV#Pcw<_Z9a~!Idk^y z#pU+&vblcm!IRASFrxcmRX+xCl;wkDiVPPQCx}OYlgAiR*(L~yr5kgA1$m7PArW%0 z5id8`Pyocs!3hF$8gTLo8u0LO@pBo0jllvSLw;V60EeN#@A31q%C_=DR+NQj=xnh_ zv@|{Qp~rBWHacJo*-Vn%NmBD%oc~VLELEGS;ioY!D^DB_OvU}s-}7O8#n0vrTut#8 zF-m+`$f1HVzA|!R*TfyE)ndzDS~KU`S=W2#(X&uIs5EIs0baqi*t#q;IQJt-<8Ke^ zk$ia@Nljlp<R9U<md5o=r@t>%*0ixaQ=5qRqPTXJjhVDu!HF6^YO~T2{Zy`8-`$Si ze{q|fKn>`nNJp$REqDe6a)Vvuq(Q47WGl>`Wi6Y!8ZaU584!f$d%pscOqcbAf9dT3 zjB^wXu#6>cD27uM`XbgE7WF$ffryyZr=NdhViv@HIU%Fj{UR|?oj4iBz5DXlbkU?T zRlB_nWk*)5><QJaQOYbWThcI;iA5Xb9bzsBAvW*Sidx(q_nY7geXvw_bB_1cZb^2Z zPGtT8y&7$>rRmYEF%%2{cB$yXItW5pp_z>f_4;-x$Vl%m$FjBe^)Qc)G`^0rT@cH> zAcWWn3A}SyC_WowFN;2iR_Px7D(&jsp0d6Woa@qnzVByk*I;J@{%LL3{$;k=k-dz3 zFb@SW+;Zg+vV<4D6P!Jz&sAQDJ)4jUohR8Rli4|Do8|L8>;BAf|8jU7%V2Fb2VnLX zF~e=M{&_)U58Fq9Yf<OObbnVv_y=W*KxFsa##oEY=qVwW5<QR!k1i{RAHXS_!%ikS zq3WwhgW8!wb?VWivb{7CFP`wYAi^@>rhl{rP(Gm+iE{n@<E@=xQ#GK;0${U9UC`;- z7+Y3cL%PUkye?~Z`7|>h>6qPcW3kZhJ@UW)jK8bEwwFV~IINzUb0y!XT_@6_Z`0n& zqxb}9Ez#mvde}58M<snj|73>!i*)9(rE2mwJeVcdWQ&ELsW#f*xbxW1)P1|6JTsH{ zkvP}Pe(mngNpkK!>>LVXpGf!dnCBl>ZtHSXSww95iC2nzp^ODzZjL;_Wg9;~hr)jt znEv0}A{ft)$|HK>iKFh!CL>%mwaFXp^p0N{?;xF+$n*eUV4Mw|Gh4)#&M1CdkcpZ& zx4*fJynUr|_Rjs?@;ZN+YYS@I1H%<E9EJuQ#zqEw0>(xhg8ZBUf{?OPFpr=S2M?Da zp8%gRNWjRz&`5w&kRNPhWMpW_3F)P11O{>QgCQ*%4LJ;dw?)o!c_lWx-^q%_Y0MEb z!AI{Gesh^q9;BF-jH*d3SV=Fn^ZbuS<JHx9tEj6nL1XT3r4T1vi~3(2Iw**m3cj4$ z<(}oOIkSd$e02$JXr3Epe0&`IdCBJ~VkggP1ucym_d#`1xCPq4uV4IRZ2!9j?(f9i zkA>Sn<Q^*YWExaPR0FBQmF#yhU2Y=g#r7mLy0$&$yp|$ctCx%+h0R8Gu6mCAmS9H< z%S)1q>I&j2+Is5zauVvYa**Qq-<AZREgP_Cpj$48MNs-iK@dvPWsvK2Gg~!cS<&l~ zE2@Su#Y8$pq9Km2_QiA`n0SwXJKr`FGYoZN^>6szpi{TVx+*9G4R!*X<y)-jrf6~_ za`bz@WdK5q2VJ%X?54z{F%lS&3%&OM|8!ITaFdWb0-l}?Qtf|wi|6)6&)ZMuVar`e zmikdyonHMVt9Ms_*{E$~iD|V1rF<8r)VdaC`zh0)(D3KG6Qd?}(M|{HW?o|FK(=?d zwGd{-Y^c0C>408&$_2o8p@G2Uo`_7MVpXJfA`wrds6Q39B&+yM7AmXa;S%HjfYJ#0 z&CiZLw-*P~Aeb$8Jt6AKC_>VBb-2*CvKjm~#idHP#Lqc_&hna*K1v+9dlXOu2zG$B zc<rBN%lKp`?qwoy-o6#LG3wM7Fsb3AJ8!VBHWicgpQ#5tjJBXSZD$vp%E;Q3Iuq5I zw*g|`Qm6b)@?G4CKd+zi7J!zb_}M!$ZCg+5jDRPJatBVYN(ER+>FaNk2GnT-o(f(N zF1S{N<A%fGg=#b!Lo!c~6o$)7gQ6#+qjE_70&o8SV*yM14Yb!X?6Uo<pA@SsG6$eI zl_?ZR_yDnOyN($v?>nhH)mPqH_$<S7j)eF(GXu+zI}*p5yxeC@?;MYH*J+Wu`0~lw z1irW<qIeU|c;T}t{8YT=0d0jDZ<FP<h0$n~ob_@8_nEU64UFEpF{)x<I~#Xf{W} zNRUJq@I?t%%Gt*;oMGAn&_LQ=wThpxFII=Ffq4o90mS)OAr|W$O)s8Y_PVWxq|)dm z<vS9i-C;U}j*OvepH0yI8O-A3cK!{T1!P7zJ^TN~i~w7~CaY}jJ{fkX^um_N_3~@b z=d^pQ{(+t;JS^Qy5jIL-(F713G$$5z(S6V2=Wjecy#)jBxm?pnGX6aM?MssDvA|~h z%d8lO$q3<dWN8?>*lZO<;e3g{et?_DeUbECgGRxI%ZF&xOGWNUUCl6g#EK~`F$L80 zfL+sye&h5lP-3M>`-&h-M}^D!lK9?42(x0-18<`W%HFiib0frgqFBcRZ8Z-ZuRrn- z9#sfGyk88*`kcZj!I>${duzNe@maGX<LM+8Z`AX)f>~3BLdU&$uV+hY$e-SFN#e%z zvhRD$Flq8rQFWpq-uYZ8cA#2zl}?HPjgQ)U-*0fYujo@OA4t!+@6k5j<j?lM8lbEB z|3S6XhZi0xZCO@Llv3UfOZdK5VJ@q^Hjt9;u>YMlyyDa8n{&La)+~uPTUNYn|BCK@ z@bDdtAshWzyxoIi^GqgU<_Bl0<>|^Fe*ays1b8FAn5sOLfY}fV*Ov)MB1_UJBFvb! z-w4#NzP(yMg>{bn_Rl4{wgyG3U3FY&k}tJ097c{>wRR}$8H4)DmvQ!1h<jC`F}8Db zV0G8v--ZLt>b*0J?%fAc&L~{p>1MWhkd9MaG*&8zDs*no3ftMntS}pCG_e@C+reG+ zeyzJC%8TV&+ibSAD0A()U&>PyCv8Hg8V$Pw{lG)sE4Mj(wvV(($88b!s;(rZw=s9+ zUs;FKp5>93O1&V2u*0-x5sGySx=9BXr^=s{xAA8TQ?w)>dx?x5sK5Hn#Y|upitY@% z_M$0MM70$mH~R6VSKwPBuQ<)zF$-iXsS`pjFG55ME|@w;Li|TX>u~r+uGSzc2)x^G zz;3?*$02LlfoyHTc0eTHPs8v?zx@#Iw)k0Dy11=No(sNF!EVi>EjE$awnc5-yDF^e zkMBd;X!7xysNhZn)%+_mMUQuleA<X>SsyUQhq}4Sy58RW*sh`&%Bd;CbOhvgY~jNR zu-{NiTyre)^kU+r!wSMqV1nli;}-#w*FC+UuP)%=F;k?K>Uh$;J9U5RaEgt|h_dS4 z7b<=3HxC_>_D^2jM7%G>EsTesJ)*oLVp2(iiMBlU^tB|b>oX%GB6pF$00n($FK-e% zswq0(*z8><6E?u63-(Y=*a8V+$RLMsYo6n)gQc<=5kM?B(Qp4e>Lz=lH+XrCkS8@7 zA5oWsPszeO^+EMe_$oDY_`|MdVwW?GEjSA4^_SWM>O{kr-J}Gmk0{fE#$MecQSx6b zHa$l|{PzrhN!!Se*<>uYHZvAoW>oHQ-J#k^>Y-Dc85mG?718vQ!27MdqZ|*v9})Z3 z>&gSlg;I6JrKMov<NcZEa7iRH#=Kti@<58rE1v0w-o5KtQCG@uS(_W`Ej-I({`f8k z;h06>n!eaMzC2iRaVDOXRkV&d+I8fGx3h`a1q;KHo%X&H==ffQ>wW4nXMO%)*9-Pf z>+=V*XwAJFawNA)@xD382wv9_V7DlI|L7AuVxYg`T3x{F>sp3quAbkcHMwsn9Lo<R z*IdlV^Wxm1u$<x$p9b=-O=kBk5ljZB%kYA^jUlk;f;@r-+??FThWtD{5cqR$FfWK( zfXkTA0Ay$=D8K{e;^5}s6%Y{MgQS>2Fwq704M31%Ai(MWB3dKa2KI<$H0-^%XGQZA zR}70p+9vV-Vo|ACVuSTtO5pJY84&pm8yZKXAx7`Jc<3MMr$}hiH{92L|9vZl3VYgl zXZj3{1a|F&{xmd_f0dMAThBsCkiDB&!B&bZouim|1Lc`Z0AF6XNZPD`hXkYUiCKD% zHXS~&;^_k>OoM|(o8m&oDHT2~|6TVbWpszoSA{9pu2x(Srt2({Hh&nB8TvS=6;uA< zW2V^z#Y^EY_}1NTB)4R0y*z_AfSnZn6X6a1dvpnL+iv1M?Rw%{Z;4A2cAd8*AA4Z} zzwt=e%+?$x9Tnxyo#?}lcUv3AtSqC-5E)qSu|B_gH+>FBY#4{bi1M!YiP<6taDIFN zsA(MXY{`4=X_N!G;v&56aA!kW?RCU@Lf#HWlncVcgReL;SajBBXX-Ywn}CEN*y>+I zn^8&#DQD4U+tL$lA6<%q>cg<(VHW>Ai%>9Ka_g%UUM+4UU^>Oj+$bp{nL;<#7{vhb z;I9+nhwPsr_4scdW09nGcUi=TzAQ#k)RqEQfGwz`)pL)c$v>@E6y`%+b??x6jvGvw z(;Q_RpMN>>VjFkfsVL*2fj1T1LtlL-b)L%j-$j-FFum&i|6}hv;G#&neP@Q8a}FXo zOHN9XAUS7A0}Mg(3`mlsC{abpNRp_CWF#mcK?FfS1(YmNkRT`mg2)?Y7k2NxyI0?L z=WV|q-);RhHQhDSU3KbIojT!vc4{P*w3T{qk${uA*Ih)seIGm>*`6vC=4u>Sp%ooE zk~$8xwk%$wETOv^@fcCpFZyu4l;<jM94@rIZ_D>UI;fO|UP%~43FAxO5|~sGGOxcP zv{6<pp_Oa{#`tX4n%yyu-{yDa*E{%cwVS`+01`CTYuRn(bWiScKTd%ZyNc`~EF;I( z-1}KU!vS6b@?}(@BMcPa{1*Q`Fi^ZUFI{KWW9Igya!-6_E+5IqqGmRXzaA`i#oAi$ zD}uX|o#-A)6$%^%iW{Gkxqzq;&Sk?cn<vkBBEO!Eto)#UMGb5K-@jA)Oyrnw#IEEL zRcG{E<y~2`$Y?~pm)cF}j=((vN;%29e)n<rjsVMm^ZEPt04(zcr9Yrwg;qh@$e4_D z-ek#j?qt5LO3c8u%puAdz8-&+G#WVXihnR^^uHuX{?DB+GuDIm@bIAYyM|&$EgvrP z_XbbsGBhdIojub;Fw`9HakQ`=ZRfpl^?fgAmN$xk5nC58XJsXZhQ59k)Sb_KvZJKl zTp(6M+TKxE(&51KQb<}tSQzSPCoU=~CVr6kOj1fj#NHkz>EHkpa}++nPZhJ15)%=% zw}T1UIY`(!N()KA{$e|yo1VsWu06cxf-~DK=GC3PtMgO%<XKb?-Vs<me7WgNeLQ9+ zZxYdf%KpOJR;6E|wB%)U*Cw7T%>8hKy%78?*o$~@CjRr2cL!dN+rY(yhCR7LRV6~g zLKI20|AxA`lqQ<5l<h>%E3X>I#UCRNUL6-gn7sA44~sH$TUilH^@7iPJ6Aqd;ccf~ zy%px`q(1jFx|IPHXP$#|JrOB!0sv<nhfTxErm%@4rXk)lwa1PXUV1+ubyY>qjiG6I zfj2tkxDa9psyg$-xbB+Md+XVJ{;%&?sb14Pec;)X&t6g3Ye9Qc^D4>#4><d=LSuD9 z%X|J!-plDyaw{?B#^cr8Z=4?%>K8OSv<4*odagOJH${$6*Yr|aF~bczftxf{w+S)A zx-m%JbNAwz1SdBU9d2#@H^tfirZ_vUDb9Yz13%enAF{~bRr?>NICDgXjYv2k)0Rmf z<JzU{#U-IgnMN8a3Uw4h8Z0F2B&8fg?S&o0q($u{VB*LGuHufuBEk|#G<gR*aYq;w z$P{Nk>)Ag6WBq0C{j6(`v`l~b?LRL5Z;CTuQ=ECTKoK{;@0mUIXCzxEUE8Z4d}?Vo z)t#=0%XboPDuF4b{^dOdl3d%sp-LIb@<dnAzOnpxk7H^pMNnM3KQVmjY~0{=54>?- zwO#jPBHIWX*?;Sc`uOJ2y$sI`dX@m3I-+w7TdJ?m>SXqp_|PAPnA~F-1W3q4Ux>*c z{QuV_AXTK^XX@6Al3#V6JQtC1|LOGDAQ58vW|vL54dZkj#zG>`kz0YDU~@V!(*8f_ zRsf)Xhxb`cVn|8MM%jn0sC`ji9i9i!DhCFewRw?571`Kmo+GOaaQk2MS!Mp35B|6c zC`V{~HYRL3k9}2lr#YP?QzC!aJ}lr;6)gURfyslSQj9fPPB?0f0M0z7>BQt$6Y1;s zo`rN~FaKGI2K$Jp^Wa%a-%w^A0tp$nW3onQzb;C+a3{A5B&bfr+VxDia7-iQVnKEr z49vJ8BK70Qe;PPQ*?$lJX>VPU!X)?f3wsqoWcAM677SorktN}`{J3p3*j{WynmG}S z>DWl--3E>$=*GIlqnQ_C*=CJrr|a{5Z6!YJG>A!b5|?g}jrm~)9}|wyjmGa8sVKjS zi18@16dYqBWXipIUPB2yuYJb9v?!03j_wr-A__Q9){GBE9B*AKEeu>aFREUgnlh0T zF?6X4xb=B>sQ<!@*@a_52*Zk7Bl_YIneU_VEYGZaCP}NgS~UtvQ(szM72^SY<SxsI zLAg)>ht-8M{Ua!JFW_#|+vMS;?+@(52Pq04i;_{mm7Z%n!C>J!CWJ74PTDLHPwe4$ zsg3#jigt5~y{<B@v$EtxoNl9Uo6NSsc_#P=QxkAzv<pI<Zi&*%=P1g|<cKThzdh23 zdJ}c3rNvtW?+T^)1Qi+y@h_Rt{@;Xlcw2_-4bDdj-7mpkzKPrR@!^lOh0<kJ3ephj zA=xKHwg>)Llf=Cl2`8)<_%<YmW;$zOcBZe#>foN|1b%dRSZWqTgKuzJ@t=&{JV`@W zJou7{##OslZq@5-&bKF--&@Q`SB=rwbwEn~&W%O^6Ff2edO_LlSdV0PKXvLQ#c4KQ zvA$TTc^coM?m}+`YE}nMDRI$IXoHP%0h7urcMLo79AqHxl4i<{sOQ(WXI2)}8Ss9Y z5MXbwJ}8aK`K)g0w|4!~M%OVfeq7VT`4OGhl0rQ{Wn^%uX#*cYmv|t=JOV`>?%>{K zTp~b*8DZgrL8K5;2@F+v%&TB>tQ2r77-twV3&Cx~vc=BCK99eRjYYVJ?T)O44<UdM zLKq;75GF7+2n&J?Jt71n!`d-XXPkpG1{igQpw1WvXDnO@2pbOvgoBN9@HXT~<Q6a) zB>~du9C-l(p}@rhgD^-)kvcyNN@5b^nT`xu#-yPDg9$NdiI8V3dVB&94iy*^48q5N zU}0e45@KOtVqs(9kmFK8a6ve@I3Qf)yJ3TIK?GO_CsYaZpo9m;#U+3olrWGd<OeYF z((%>#AHn447>emwh$>_2dil6`dJq`FVNirGJU|KRg=gfi<mur9^Y_6phP&ZF9nh!$ z|IdSr)DiCKZiB*?wXqBEfgvzmJY0M*-CaC<Fg##>m>!-UFl<lM8&Y`r+PNX);SkPH zIPCYRIFjG5`M{wb2uB#40S@y(q5|2&Y}{c!PzR_F)W*}#0|rMpyLe$EU>?ZiwYZ0M z@qPSl?0;{jFWl{CeDcR$`7cX{Z1k5mkr$DiLHeH?kB<z}#)l{>AiWo)#Gp_iAqR0W z5iyvgu&|i0gQK*xy|_3`QUs~_7k5MkABaMc0SXfKj?$vi_R{ta5~3o~(h?GqqENg4 zs^~|8^dkR(32^YiQeZ+{LOdco>_mkql-3=234#w6B*T-!AiyKQB>+od5@Hi#5@Hc! z5n&(IlENauB*K=$Ccu`$A;2QUz(KM#0R}OI3@nA@R?vT$E&lVc`dN4WuL0mMM+#}+ z;XuOp<thFzf9TH_0afk<I0?(=xjt>2zR}ZL#$_*qr!wBQo-?~8`&f>E%r>-ca$ggb z%|MUn$t`5t0dQ`xrJhN$7ML00n58;(vXK5{L|eYO)yjTPdgYHGUSkK!V?v0a5g&P( zjR1X0jbY^x`seOHh8FkJ`!yr(g|;TRrD-4SplCxoQh_1FKemHHJ4%{&3}sdD`o$MT zE(x!PRiSltodq`szD{yE)H~+V!uSjip)7)FC;GiY=Wg0j5LBu2k+azkoJdon{{Cn` z#5pxaf%_1O{0O@4&s_W;%l`q&qT4E3zoU!vdIv+yrFwdeakczQP8j`;BDhmu!oCEH zmZNP1qpRZ%&9Z^sv8(gF<HKLeVZPG$m~h{BnDc|<&Xss%aODqZ&vhJO5}pj+WJ8z> zC=}PG=75TeUn|M5b0z60gEA)!+<t8TIErvbb`lsYbnyQ_cGq8gYIEZIK3<c-Meiuf zbFUMw`qcV{)}!qviezu?6MKp$RMFOHfMQ~JU(dq9&-=c$ZQ%bSS2kg$(@W=e^qvXk zw6o(=LJt<2BLpVkg7*F~1SWI>{{(s8jCp#)fL*`&Om-<lvF?b>wX)Z$qQ>MmGWjgC z^RDL}viwTgtM&3Pj{}mZjHZOXPR@GS3+L}VxILii$E|aV&%oz!WP&AZ??tPUE@5?2 zH%=(%nv+Mzoq9Jgb>&r3OXm5_>W>kB0!I8<RkRJ=zY25oz8y~yqT{BUgm~v9s*psZ zY{^hKTF~@G;M6XN$E}F|ph0L1bL?R^Vd=aStb_-i*!ujWe0sHINgxHTkH?W&ojZR^ zS`lq+1(r=Sz+O}Z)ELyY9btL9<9o?Eq^e6Hr-rjjuM*jm;2HbR>Gq(+B!y8vfW#!~ z?1t2{+#{*2HyP5U;+NF|5cnP768{U+?;F4J4uhD`MhJ8*GKWh*I@tTJ7U3A=?Bpf* zqv}^*2Ynfez8Ng9J!KQR;z|d4iqCn-t8RNAH5hfsRA`1;KE8769yXDiQsq(Nm!NmK z@r7BSc<hi@k&DdKfY#&nCd?HhTL}!Pa#-{gjWgu;rc9($4LR!EpT6k-+5O&Vd@AJ6 zp&zCT*kOFPHar3!VgdT(=~lM+LU&)-sYtHqES`3`c(T<uTMGZG9C6ez2F}amg155L zSKibF`bg>o70QipNN!~Rv+Nu#$JIOQ=_31cXdA}B5+XmZiC@)+TY{^qg$&ERfrMP? z<Bk1=`sQb+78)@)bM){c@1mUh*TB{QrL8rl%P!o_T`*0vFSh;$kz-+tF`L41EOV_p zGn1u|Q|EL{2+`s==}y#a2($J{f4?Em{K0<lSsFh5)0UIL>q;xiaqq7wKSkxY1kPSE zBkW*mx87#?#`A5CqyE4JJEp?Hk~6NSA+3C&xb*9@$Al1V_-m(f8b#OaSW>f3Bs-0^ zND^}wbEpqq?J@XVU`7=6-WmtxWda<=@&lc^WP-1@wDLuQ$stY<`Gq3FbD`h9dJtU$ z5vQmnEgus?v_IEb77A_eZ+Nk2StF1Xz{+ukGs;WF>Eb}3{L45jFHtfnfL%gyPxKfB z)j#_v$g$Q?P=Bk{F^r@-j3#`SLY{w&80sH*ObF4vl|nBD`u1&fpM3a-BP-#Ua?ePw zSmX62=XTD7-k~E;M70eBKr-jQi6`RF{Oy^n^G0uS{C`|NgL(SYr^=L&nyd-t{1e{> zlefR)t}8C17Hi<7ruOSyAA_)j@5E-0H9aaM$(H2iXaBBmuP$ase$unO{Vf_f;{P9; zx~li^jzj({4bM5{4|80PYRBf9GJV>(H}7k+VSA+#^)LN~m*(Ci(=_f+E0L~|88H3D zD0ZL~V`xf8yA~qAax%);&=CCXnzG!FqTMW7kn4)jrB|Ql{YVDE(csdttnDx1)$ZG9 z>^vZ?>eF9rP7eyc)==NW(W9S<8G`$2;(x7qepfhPK}sa+WPi9#)q&M#8@N%d!<W$U z=uwZO#QH}?Zhsn@ZTS7=F-;nUH>D~I`U*6>Xd}d5=uJAn-m_$+h&wS)axx!9j5WG6 zyEd7s1#{5PI*4V5*<9p~JlwDTvCI5VrC-!+{#p5gxah>??BnBwkU4eA&(BZL#nT5W z=m~c^<>u++Dd2*%e+oE2;jV(ndf2+>Saej4z!2SYATU0%#G;Ns_#&}J35=X!EWh0p zMDBcfDW6e~)+RL1P*L&*3{seAbA>sZGJhJtym9HhSKQ=Hv~?n|8>l(Cw^^hT<qbY2 zFc*6Uh?#QZ6U!S;2B3uV^V9E@7>=T&f%Ap^$D*Urt2bSYdnxaa&z)<&yJ9ee$XGJz z{IsT~-|@h8#6@!Mjq9N<rjRm9-K}j}`ev5>vv#Y7NWM_Xw`a1=!Iumr1hw{}pB(bW zPr2q#dec1O{!^Z}7!56Q&uYqJ`XzDF<lL2d&|N*HiM9G|^UEi+4PEs1*jMA?fvnT| zo1EYGck?kE6WZl`N4d3oUX5OpR<ssmI_xo0PRbL?tFB$&vk2sFU#@r@7WqAv!qeho zfr(GFyChBbQIF}lwHdi_XHFMSD3lPA597LajqaIzIIU5HOAnd(xY72f9{X8UwDlOU z%)TX}8$I4VFZRaLGIjF3%k6caITQYqXJjtpT$;2~Eyk5zeu>(W0B5BBUQ$!!PIjdS z?#vvnd@8}wx3huwMdY{mr(iiRr}sOhzfOpw&`ECZtscEbN#4Fsrk7v6BEBb|d*>zt zS8Aa}KLe2`Mxl<_;lKj@Oqu!X4?i4(fA<$qSB2e3E0s5SBObK9=Ic5%R2g6bXUGh1 z;I-<R_SK+lgLs+*I+WMF87Jm#<g^2Tt3vEDW?+)W=o(Mg_-xE+FhAT+lE=N<)?HzW zp8APR`SasJ2skcbvwPc;`fJatOQd7ePP}cQP7gC_nxPE0lET=7w)_)KWN?uq2*5mv zWmkj}uP`_9=eUZR+{B<B5P<f|mQvOT?7te>^K@!@cuWXE9A*5?FRDA{w!U0gv5!ca z{j>P&uhjigip{r8!YwBjRt#uS&fcl3$^Zq8=AWbEOX<OJyjFcznqbp!VXmhZ9$?WN z61IjtbJu*5^q3HW#Q6tE*Gku<3%)#Yzulx>cxb%e3&N+s_XJVu1olhq>v>3gz!AVD zRG7*-QBP}gA*=flmX_(lyHD?p-^t68yc|fTHq$iiP-i<PgdjJk6VF<CB~(H=OjrnQ zAenm<HU{&UH?#A1Y!#7+i#OmNMyd0G+vGw(`4{izemsZOlz1)gh3CvVD>HeB19mI@ zTi%akVt0#=2_YD4L<}QBEo2ZY%*t*%FLE+?7Ou0a8n?$i4Pvz^jHG2~<3nW@0}fa3 z+J&e-3sBBd%!~?qTJ_*Sz6>Y1byhVic{?I0B>j{6F(CxYhX`$xa$iX=wOMJ0HxD&f zhOAGqmD<bXi*0-_bZ^&dzSV|O`)tz}0%U2V@Q*sz`uQH^;JLG_HxoR;l-Yhc=jv6v z7MPs79pIZK$Al1KZkk`JVLM9`nFMyl^VkMg&W5hJgwDf4M0SbK5{t2vU0p;?O~4tr zyzce&OY_14Hg5a%%6vaBwj`p;EBc{r_zDig^V+JY%40$Zd7AkF-77Xu;`;Qu7UmPp zq9gZYN3B0F*=7`<FM74SVBzD3a)JO3M(pJ#6`!6B%eRNkcl|A7@7cPahw2$=<#U9& z5*6R+>HLZ|LZI81Cj>6PMRt;-p8vj4Z!?7i@5{>=p0_=Mr#<^#5JYQE=ocLBS*PAB zPS8G^(VRHliKr}g#*2LG|5&@E!fUHW&=<!h;eZiP$N!D`2>FEtGutctEF{k`go4IP zc`|+ONk2ZhF>vN);cT*%f2_rKv~?Vy`VjcJ&bRLZ>ls!MS<>S>1cnPQj3Q1YWz9S+ z?74mUv{=zmkSB1_w*O#|CxA8;xJLdgCh=}hO<J#D3-Ki;$>I-}T*GFKv%DU*@2(7b zg<)tVp%z!*;?H*l6gfA>a|v49ZYyaioT1i`vbdMOZ=q2qtF?c*UUmm<9Pt-66%V-H z$@2v=)|_*#qSxQ(=|#1+j%d0qG-;@r3!ir=?sq$2@jshGygZzQ4$UE+UN8>?42m>~ zoI?0OeO&BMxwu1}V2D#*Zcuxev!@#}SWFQ41q`Gq1T|HFz`^DCak=X5(mN@cm+q%_ zfVh=OUfn!*g4L}41a;9$)BlC<*dIzbxN(6N#6x?{{OaUXgK2U|Mj_Xn!}}A)7wBFL z({pVtglz=R8Xr7Ar>m<zy~&hgl_Q^txFUdYx?w>sIv+tP@w9sG(s~#c+BzE8smH{= z#ET9Q7jOG*oW0=oru%?ZZa<FYjSCi}(r>^dEb-A1RVdvLODb_1FiN;3Mg_`8oZ?h8 z*96MgAnl)J;?q?Wn)^&wWIt{y<TXX1jSzo1;-S0apD!R3*ts>rXs!h-TW(l&$%fjo z4_(<}8YMktcra4XIN}@lic}ph_n#e>*ZWH0Q04}H$o*koRVKyg&It;w{SzP2)>dE# z9jt75ME3I6lKa-iaapzlMHIYZ@3I^~&l*#<{JwhgA0?~<ZV&ShCaeQ;y@S*BV}M_? z!$wQeRd)($Z)jDJ6h6Mw70~+`ztTOCbwRLS2^E<S+^+uJ-lq1&@1);36(wy)Uo@4g z8Tmfej%|7vt+RsVe%kdM8ad+El9eb@bw>U;T`8b=_8xPJ|9w5NGj(+?Pb_l0PdtC^ z%jsEigsFZg>axHQCY_;+!P4~wg0fq+ACi0@=1r9=M(cE+O<pO&5RC=(U0}=>y;Y%s z!7s1b8?MBfH8OA}3g6D!q2syO)nIXEG`11Q!FCC&;q1qf4C~7g;q701ii|hm9+&3& zb(9+3cFsASEIryV1D7M?-(<raF}fk+o}g^So4xDtjPd-%>jk`xAFi{3WV#o-<m!Tt z3~#_WtN)uA-l8>|k~!v6nz|XhiTrM8V`P}gop<Mo5I&!~?2>vywV#H>3S|KWPWUR) zO?=6=c7{xeqrW?G+~?($)|$JI_Z5bh)e61tq<K#slc_1%*C9Jrg5|?T<0l24mJOFj z>wB-TYd)S_|H$D`!P%2@V?GwO?~5P&o&by#{INf;ijw52m9a_F^zC(4X^w!kjxLKh zLK5b(9(?Y1=uFxL<Qj1^z?I7IO-D>-y|>z0#Ar;Ut9(Rbkh!afnu&A_R6c%zB@kr+ z1<vr+T@%`*p6+_a3C#XH7^^j~WM6*QtPEqcs^vE0ho~XCW5N;fDr$=*FJ;Dyz&Z>W zRPp6Is;2W-XZjfD9sTMV6F^7s1;Al8{bTS2!0wf@#j-&%6H}?`r`fi>rCR+6KTqDW zq3(ZaeS$6IRuGPts*Wa#BWQEF?gBG4DHd?9hc+^cGuWy0D!o-8g_m8amDW{&tl9CJ zH^{aUp^YQ{a)VyL@2v4G%J!)+uYP!;`cBP@7nys~Uz!F96qmwP28PkRL0{&YPU`UV z?8Z!Svo*wAWOL&Rz4QM2i9XXUc^NDjGkmnQ71%*nFuKhtJjmWqas$^eE2_(j{7O+@ z`TAQy8Q)TBrY^xF-*VtgD*u>oIk1Fy;L@k!2f3~vIrfz-JKI?!)Ml5Yi7;?CLipL< zJH~O`1@2T-UP0h21D8ug{XxQ<d!_{Eg*vyVE|($_jQbi}V%3tvGatp@F8Fnh_>+>h zf(rgHf(i4Tj>%G1E+y%imVmnWu;jaxSNq_c<mqhh-)JF%4))hVmuR#<B<B|pP4ul} zsN_4WG#K#|O1eTnmdUF2F`gj!^@ktK6aU=-q^Bgj+Vhj}+zDP{*r#EZ3+_XDW<gEX z)_3pQ4kQ}85ntO;=%Nh;*epT2-N}~hWI;MqyO`R;u{CdWhBiLL8xD?lxEQ^qbq0NA z31HdrQQ(-1W=maKF>8I>SsNZfdbi{=bwa}IpKqB6>{gojr#(?ddBI4v&cp+=80&0P zF24Qzm|CltCh`^kwc6@NW97`v7c!J|PQy2-n5NOj5u|~?g=1kUy176RM~Fb`@a{X= z*J{=(8#b317Mo07=fhv+7u09HjM+Fr8DN_z5jD?3(%P+Y;;u2Rh0FU>XP>WOL2dSP zm)B3kv-8yY9-s>Uc7VB4&#|O`Fd*MB>`@8LZ@d2K1g2V&Q_CuN!GmI)*>4|hO+g}G zIs|w?-H~XAjxI1a2Q1ZtGX#mn`QIM@^ZbmHj&D4s&bl=T&z~s>h>(h*%Fy}p<nm{Q zCYhc|r&oOTN4ms=aKwWH0e^M*jdh}bXyRIAZ8$@nd@7B_*7;_^u2H$k^AVClmKqL@ z638S*5-^ysn1}>2^P;FQOhVKiDlRE4B_=8*1r-*TwikmrirU#ri8zXg2_b7h?d_4@ zl5`Ljv6B$}BR`|VZ;u3l136bKY_zq$F1Zupe|{ZEH_&KtJ1=pKUzkHATj3;^E!ybt zm-5}~*~j%yeS3XAEoD=$3B|I{V>QHYW(*k?X)<qip6)n!Ni-T@$f7fSQUzazn%13h zba7t9%q_3LkuOn9>6%~m;9UyMMq^v?kqE&yp1wX_zCL(5jy}4m68L9>4uW|QQ--Oo zYorJ|%-U%PA2@dd>X-UxMySFe*h$KIi6z<rr%6;y;!T@ni{mGyLoW@y%Q*ydQ!lGk z7QbsQ)9&ui)jTUG;2p21!}r6Dvl={oh!b|usUA0*Lo8uDJZ9ee2Bdel?vh)^Yl(YW zKX|ukZzs+nErhn7_!qekt+37qtLMR?3LjN}vVs|AJg-;SRhmOb_)cigEdGHF;hky2 zE-EZ)w%_Kwgz=|Rms2hhYnqDF$6fhm<FYXJ;bV`}B6Cse(0%vJSnxT{w^sK*eOY3V z+3u?<3Y!hLWPh5bKYM9}rHXf%yG;h@&ikKFT}-qRPEF3|dj>P4rK@M$^KL9jExM4L zqhOt|u-1ooB^^y&hh2++&*81G<)(e)dRw!;nJ|?R{i>(gB<+#cg+K_~Dk6AKL)bxB zN)!pPY6p{$61PK6O30~76bZj-Ck7Lha6qE5!eDmDleC1ikfWHSu&9WL156w$4igs^ z5|I>=7XM@F+BlF6kq21vl0LTV$AlBtp$0zH+PG$SbUV!3ZQ1d|N4fFU)Q8|`qyvyz zvkw(qvHtEaH`-#Lr#_n6A>e}*Cr^k7^$4e3sh#>>vK<NyL7DM@)0#CUoA?$yI#teo zK1=DMb4X3(4z*{Z8RDsX+=3R(9adVj5#le`kTr5y`{_>!^$lEBQZkx3`tNYpcKCcM zp|&bmjb#$3#TAWf2%o-Z3}H+{>%6?V{rhA(NRmhD)mh^EZ@qf4{rwkj?V_!%Ajq$o zEI(bI=WJLJH>E1Hnwem{@0^6)5JM5JSG!|vrJ^E3MRLTezq1X91-@?amd#kc^*ng_ z8n=-aMQTC7ZPw&GMtjT6m&NmEszHcpXS;-9=hfky+$*fM*pk#@Y}OvKEO%Dyx2~v~ z-?m3%8-Zl3joV5x&Cpw6;E$%W7e6<Vd-3xo^ECP|Ut^s6>OSAM!2F>Y<>Omt080W! z-v6`}LazPd1r4Ym=#3J-mWzo@rov5@xNn!{jc7lB<LZwIA-<KkT$QaG8Fif+dC+OZ z1Rjgym3>GdH=X;0>FbC4y|g<`_fS5*z*)*@&(aM)IseX+WKLXHwX5RNCAzt-DzPN3 z%jy>>_^Z#V91lVuaH>)i<M_+zCRU5BYM)u*`o2?54z={}cJWIr^%);HN-znW>&`!x zU=rQV)*WC3{#^Dsd^jl|t&wQU9W@t2>qmFa3(c!}nMHCfusnEpD9684yPk$&&tZwx zm3Nnqtv2^=<}%yqamKB!Qq^%!VI9P8(hpMpd1)lZHgG>OqES?3qFS;mo^iQtZu3<M z_mA}awQCoWV27dSV8v$x`9H1wvtRQF3syuv`j~+%B1mVqu5}mUvl7)^stAXie7JSL zUWP|PmmQY)SXFV*j+VIcBPvZfaDFR{%mfKl_qNIrYdeD05Du-WirQgwqUwc4MzfF? zFY{K9$=pL;f=As&t$uHpKG!l3GltCFzLoA~`%05%3FlKkLHc)<&xKHG(9Vdj0IkN# zaD@+6aC*H&F5IXcQk=Z-lzWixqFV}4gd#n7H!#qd3kg862tgA>9l66$?7TXZ8uR^x zLd^$UwR<?kPFB3Mk~$5wSE4S^bfd%~;H(l%g!4U^vah8+()^(Byxmh(=V4YVyFCGE zfB9DB<&&pxjtNK5Wl`89sN-V{b;o<k#T)DI*pAaVE1mr~mMSm4wnCuBl*5MN2;fk2 zLQ4$0TOrSua2V3!CT?`i<(}zNpd&O!v}?TP^)Ol8L>nQ{y&8ug7(bqU{T$<3#gZ%C zet|y;m=o{JsX`~=Ro?R<S~#Imhl{at;`&Ri3hT{TZwsNB23tPogx)LAv7$F#;DD0N zzSluVi}7LMZ~y*>Bm>)b4CbS`eU0B>_MKSJARF$baH>+IODl95%7QSnl4+r>;{dg& zAQ-nq%e31Rb5>}gDIF>demvW2ch|e)(lHqOnlNss{wN13uC@d~X)^vja-brZ%!A=w zT(%jzrZSn`v2W}>il?~Ko~G-Q!w4^}wGnuEv-zMP4}f#{(JVHoV%W#966n<ek8o68 zH)DDCvWJY`;)?32y+u#G2fxk{e^{CkyxY$^yuggt+RSVN?hUUnWYAnXV;`I9gImaG zEphuXO9752ieFRIhi&LSHpidjc>M0#P2W#BBKIu@-ehY!w>`=;r=k77c=+G4|L-?| zv@|35?C$FCImwUl`DYvPbVZQ**3B0TtIl<^B(zFHbbHiZU#CGKGXb~HE?<^wxM90+ zjm8z3X0Z`7gF-QPv2fmKv}NQ6N0D^Q!mp2lpAzC<vI?TrE^%m(QAWrM1PE=sY2Nt! ztTp&`3Ui&}Gl8}S%wkr9JvJVNM~nyQCgUVCl5$_<Soxc*4_-S3J{8thkyx0aB&oVi zfM7g%jukx0VZ2vK6{l!XdP+%lyiJfTt2@Rx+b^_JIGu3(vV#p8yADX{R9<b7=@~oJ zF@JKYktBB6wB5?S>}1*`MRI#&gjv~+kdrc)5=r}Q;AXN>O#+EFE8-kFj%-5DGM#l9 zoyUV0o-jL{iyQ3h@?mm6CWO%OzMfkxF~`944a&*ntQ|R2l#}~PTE>xKVoD?df$@}e zXZ*L=!g{h?V6>+YO`GCxB3dJz&sDer%B{Z3X3k%5`*8LSULw`Q!ky;J$Al0L;J|a6 zjMG%++<kOkPblT}@LMjH2hG;t;LWT=b+8>FPy5HP1LWTRk0DQ^dz%o5G`8i=G+4jx z8xC$B^-9sp<tXP+%+JxO4RMGdeIGt~xJ_uAeSJD6#5kYi9CbV>VsX|Pr=N+!YCGAL zXtVchg{Iw~R-<18o(0j%u{st$&MfYPv3Llu&~}Y{a(s5;MR!#A&CXLrO9PM5IC}r3 zrSN}lWq!A|_}zKLt67QCo?yS4=PKDH2eP4{hhmA67(cjj=p>IUS4UQ6gio4_SztI% zfx+hhAtR-r3_-u=_e!HP&D8M`6vST}G#sQHg<#T-_7YMKP)Q*>M=?=hF$qy*!O>1k zL|RH*SXk0tLQGiL0cnVaI*5u%i-}4Ki8{hWB%wmW(xQ@oVP#&L4K9A(;|A{2@hz$K zAg~g@^{u1KgdnmoB^JEDcItSEB!^BX$_QTw?G~Fp?O6&r4aQ8O?1wytg7;km=@q`^ z60I&1(;SE-W0sX~dQIUYrV;}myzO6`6FmQ5`@9x(@`eE6RhPxDi{MW7t&4*9V!1?Z zD{7wMTIo&D6X6<4OR;ZT(vyat9YY^PG_bqeAeurJ;hR!*lBY+X)kI;vW4U9lRe<N2 zbD=mEp4ZfVWHk}Ge+MAH!GFwZ0xTiIGvgVzoFXVYFJp{~8JzCl=Udw6Hh$kFZ}1}| zBc{V&KlltvVdiX>2oUC|edO>=i7!v>XGiVkm$r<duP^zJdVjCu*c`sZ<hnW`h{j1B zNFn{|)%KetZu{nVk}+ppU@FxnbthMqqYDxu*t>$vulqZ*(J~)wezt*&Fc@&W`vsa- zC)>Ru&DT@wzqX{jH4)3J`z$Ejq4vb9oX=<@1Uk{HQ^1H=rHjw6i809~FF*QGFUJ=U zcwy$c?6k?KQYzM&jIg8JsI;zYpNAD;&MO}^wk&WeWeT%b)t?8+?%LD0i1E+iFaIHr zfGM{HxK9V1C&}a8oiD!Q$6l)u61B9p9i2I~qAnX>iSe`hfhIU-&~Fq(XSW3*;`>$~ zsX3dyHd^s;s$BAWsxiludEsd>PE|Hf0}GqZp%iCTfNKle22pVvKvgYfbkizGXPG9{ zJ!|J#<LkOhp)U`6?a-6v@biED`-if3V7*LtXbVrkZiFDk=O#wsuF#Nz?8E2tulwf8 zsjOJh=U)r#)SF=4anf+7#`2xp9jlXFU8G4R8aRA|CskhDJ@YM*FTg+U$#1?iz!{AK z1Do3*Hw}i)75Z&qZ^(@|dDr#YlvWO3`hE}hMQ<@WQ!V^U^7Q{B)l!moefJmg4~mLc zeUq7o!?91l4XBOGXQ|8hhNJsEZu~%wvlM0l5g4y_5()%-J)IC1-#=irka~ry>RGYO zOYUZM6|fMFA>TbsHiBzxoHrxy<`>hAf3T28w3Oq&rM)}#Cb0*NljXttVCXpd9EBWs zAd&(_FZJevk`zBH^@0X34ymv|55O3W{cfULVKyN<d%%2X^zXYUeNK_##^na#n)6xQ z52upujwe$M@$f92R={x6erV%?wzdMxuPMR%?-+wV1cIDAXsUx1+H6<8osovu%~uh} zq|aKmMqL!sLTPWjZcp9;MtjriQZ!0<b7Y3$0^(g27ir)b-m|f3W!__m@`kTMLf9I| zgb<nT5+WByJgrXPQmSI&a5rZTlARNJeyiY-i`|!v$L-}i`!*<@Ja8s5hDpxP%R4&l za;<~j;+&XF6fKE7->2AMVb1*^NLmXzCr%(`)(2!IO$k5P>@G?{T|kd*i*n5FK%^I% z`ptKX=-g_|)|OA}p&WsL^FPsVD$_pOZIe+{V|8IvVWEWzyeal0(Pa01)1>u6%4#aw zI0Bu**Bvn8fl#ZHph9MnccF{Ff6#TSG)s$RjgA~9<*Y`dqRiKa(pMf_Dz;Nv#0{VO z+G`x@C#orgK3&=JI3sp#FPe9iAO9hAfpsA8VDQiMV?Vnudii1+`sG$&XY~@?owJ%o z-@H}8;7{}=$!=+j4L#)#C)NY>172rloDO^Y{3>b;1DA9o6Bg!eKPj9Uq|$2EfIVMQ zw;2CDp-t;)h)(uYO}2gauaDtBnRy?shnCncuRpJTJm9_?9g_d{x~E_uzk_CAC273) z<v~z|hGNx$m_W^L8xvGv{dTA7Bp+x*O2v<fgY1!Uf9jCebt!?zJB0tz!>dzPB^6js zy}=S>Pd)$siMcYt;)xo6Z@v%qQB?O|QGzg;j8U)p%w_q4bM5CKVS#2E@{D^mzKt$l z6tN!5iB-&dE-Ni#{QAQWn)2TrfZCXAU<LL1lN+yxqxT8t`P&qRF>aSB4+WiM-Q?Ki z8p_AL#<YX-Gyu-2{>is8_lL`4&Q6*Hn|jGIc6@Z1-*UO=6)tm-f5sowPCq7usQn6I z8^ag7$QKo367rrv<7HMW><PZsQ?_Y5G4>HXQmMLX6d{COWC4Wzc}btI`0l{%cFHe& zRdQ0(x#o<wh56@|_+PpX@lDXj_8k*KJf`lusFU2ycS)4LkoRN1Ai{8H>T2_*!Y0+c z{2jXK)aR#D@R01h4V+eT9r{3-qzxmjaV;?C0*%Z5L-re^Uso4Y;+jJs1)4j@B)I~j zk*#d^{Q_@_{Xn1zG}1*sYSknSGMUcZ$n;gT{!H2eX~7TFo(H(8NvTnyd*=PK&m~W6 z5`900s`X@=C2_qTzgW#V`Z^M0fd*|Hfo?--2%=fI=U!8o8SC4qt_>Y!V|9XDG6aoT zxH7hI2T|yp-=UD#TXOm~=j)T4SkmFx6MM-Mgb{-QJ)sr`*$D>b0cMH^a3`n(%)xbC z2e;C;b_WuoU~5Bt3WKQcrb8}W<#vakzxM-*sKelf->UztHrhH4SoyAb9;XgV@Pu6$ z-}2x``KsL*9d?g2hSs?}QhP?f=25-8%?~K~4!Ehrm*2<nU1)>vn}JQ1)6%*Iw-oyJ zDT*##31H$2|KcgFj5b32RVXN;gVtJ{YmIbOjl=AA;iT@Z-pQweje7DcC!-i9{B9ih z1))<_G~jRpWE05DQzb*V{WUAr6~toQ-^Db|zb((aW~e(phPJi>JLp~n2be{F4G5y? zIPKX{MNhOcXA@f)J08Dw;bk44HtrF8B5?jC=z~xE)28C(L+|a>`iQv4pv3Y%3XtUv zPF-v<+!_X+zt#0fIu{hyksop$X)o7>Z$-V_cziDITUb`)4XFKKm3}8b+4@IrUrZri zLI2ywWE8xP9+-NyCv?^DMaU_$5E@C-rS2x9P2J|*3L)-t88d%y<yjO`9dLekKh|;v zs7_s<70A=W&wj}Ia76M^efpL2-2@Ss_i0at@f{aJ<P+i0Ux|91xoBYKW$shu!HC1g z#j;O!ey_Xf+B;IO=I=tN@EqXe`i=`t?U&NYBdu&8;-mp&0d-<w>(?$(oA4x4N`3){ zQ~x?4{=|+Wmd#RE>nXYkAAug9pLkvxB6(-;<+U5e<e;L<EY59*@&$+ifotpTDl0-4 zsh-llh}m2M9-Dca8Dkwipz^wSuto0IAO4$U@waEB2n9U=NBSM*g#d+=^e^DN9AE$+ z9D0b66mtFO!I%}Lu|O7yK5o8Ka6|s?d@z2Xa3DW?qV}+f_NRBqbwY_E-Yqyornz`d z`BF5?ER!~RknX;JtG4u{;z&_8@(o{*$T>ET(l8;cUi5CAQ$U*ru5gX<1K(TIWzQc{ zqOmLf16tIfyViB^&wvCZ+^|SKlh3*ga^8NHw-=;#J(&2eq^nIsAdIrOBBk35)fDhg zYhi#P7(cBA0vA!0J6PKmRoV#WPCUmLn|t4>_Tsz~u14C#O)dXy5mmJH2e9k)%#(y} zgAoBak$Pidg^)RMii_V`X4LYo%hRyZmEpyJt~TYMCJ5m2j6Q0aw8fpW<PVLxSgMDI zGe%#hF~*umyuw0^p!#ZTi#{O{SVDZ@y`_BxpX5$Y!541!c&EoQw_9dzb>(Rjc<Wm5 zWRD2l$V)@HBLTPH<eRkou7Fj>R6nWildYGnviI)A;9!^)tXz2R5_X7)+cDvYPh9UQ zuY0X*>apgeMJRUrntlwrQvtUh#e00>uBtQW$Q=o|#83a2I})%Qv93jxDvC!E(r)L{ zG+cxD>{=+HZ|4SjdD(L80f9^Jwjl`%YH9)wUxK*JBiBBuPj|v;_HGBm8%*i=I97x) zNuqk-?9O&9f9x^gh>h&hR`^%3%%U$UTjB10?KWQ;`o-UEhhaU?PPzRU&%eDy0)@B& zTxu9)uWKb_nA24e9?jtq435F9aZy=RcOTxWaazB8O=a`AM96LuQJLH-NDF;<$*_W0 z`?Ca#Z#VhWM8Qp*{#yydPpgh{^Z*y*{SW5o0n+^cz4QU2*S*Eef|Y0D__TUK@23gJ zF04dlgEF-E&4#LuvQ`0S{{Q#LT7~$LK6s95?}q(sw_DSVep;Nz0xjmx9Hff$w3&z2 zB}$HxL;#nq1AR#%{@CC8Ko~C9DAq8ovMMg=E1!J(QRni+iHuj<{xQ!27T$yV4>y0H zHYdLC<24yv^p3JT_d4OKPpxlgJ=$)fNcPq~v8Q<Am~3KvNO)4K?)v&JbP`#VHPO;F z-&``tX?CLDx;EBYUb1#;jf;pJ73N7B+5r%9z?tAVt<|WDk|t(Tr_736d2tuaM+O9> zRlTy<^}arycRU`Ff)AO8C82m04l&C`&A1FRAtkjv>_7*aUFbB2#%%Qtt5=`%1%Ok- zD>;*pKx!NBCdmx)S-=C|xK3vZbydaDC*K!q;9$RMiAF;F8X}`w*N*+G!gi{wZx9;+ z+Tn%8&xa!dzVb`qUdC*>53*w+arE@{aDWHc_}EK(`$_wesOlQ)C>xmD7%55Xn@XF4 z4mCI|KIAgRxI_EpK9!@CX<25)PqtviyUOear|o>H^j(T<LH{6d!LPM_xS3+=8s_N% zdN-Ll<6awvXP#8O>&}vsL1L~0h5DZ!9>w(i(Z-YZc{79E)OM^F;EaQKC%PvPN{bfR zwmB(7En^I7fgs_9WTo4Y%gG{$^Zhxj6QJiDoL}U##wG-A4i9LJJS;{deE}3ee7NN6 zSd0~AZ2jV&B|Nm7%7ccr=Jns;wr|FB9o@;E$-xxeK&1;KbqoP$#=GP9V68y9rZz4Q zcWCL$to(b|S>*vfU!A0`*Pg10s*%Tp5Ms%Ved61)mJhlnm>%xR;z(5Tc3&WWXU%&4 ze!yKHsXC4}s{<T+01*Z>(!t9iSQ+MOYMePd{yPfHmE81L!EcvU#@a^chC{uM3n8AU zEpn3*h<P$smd*D#q(tB;t!6b*ML3S1e=Bm*$hq)K4l0TaxJ|06VOy6_kK+7h@a-!% zi?1l{%GJJ>8CiT0l+mjfF(V-L>xB4|Bq+i3#JZnj$lXMoQr2@F`~hPw8j%~u>MGbQ zc#5Fh?!AOuu<C)q;Cztzv$ruYqxS^or}3}8$PG(%eAC=r4HG>f2-W;biOwDJ|3?8W zKC&q}lGjqpKgbD@8YJ3m$??T}EqZmY!hiQE#O8(T{eu9Km_-O8sba<^*##EC**N)e zw0nW)UXbkTfD5*%MR-5R!QP8;FXjF5xpU2TR}6*_8A~RepVrj$J07@>xJb^uas73= z9T4KbJAm}X^f`N@{xRe{jlhlivR2I4>U)-D`+3z{pUeaCyFR^K9NSLg9Yd+xfI|+S zx}+l!Z_oNAWypO|WR60e*30cK3z5s<cb1i*v3~K6Unj($7)Vo;>-mGqA9wsf{g+8I zH9sZpbGMY?_qZlvGdj4G*K(g=zltIm+gFuo!P2BFod$1=&flI&oL(2gUdrRAbYE?j z=%yKx`1ObXcO&579-yN@_Y6s<>eKQl8}Sk)8TEpx@E2L(rxrT*FbSmHhe_H}`+6Rt z96^EGP)}u@sHe5Lkk$PNOUrcO-KY1)@8o4kUJfKvn`xSMsIwgtLKyPe7}yN@OBa{n z4i+aZU!LnPE2ZJV$G0dekfAJ0K0?fKPEXHAipO9tq5r`lEF=k)kwN%C;SRnC9~)mU zCpgprX5$96gSpAb7#b-WC>t9Z*%<4cGf-4kvC&dItD*(^#}ISS?SE+DV^o$?JDE{L zVBc?sqw2q3<Eu=zLRW{Q>UxpIMWChdP=E3@GE2BC<=XT+xx(Svot+ma9T%lQF*=&@ z9+``$)l&`_;kN@^-k6<?DkglQo%2|{J#c21GP%-pq5EFp1WRF2_4~=evDP2)6W(YW zo#^hAKp$ht_X#)UrDhxZ1@yL^I0{Yp7n}v&4EZly+Z)GW_do0u^~O}ww@>mk5HYTg z1wOG;8gO<!82Ujp3?T^fyAyTS;;>JUe}5IdCJ;V5ZZ@+kfMX&)cAcaA@n+jKExx!b zd2F=FCrx-9UC`EPz|O5EpZH0`*1Qq$=!A>DkL7l`Qoy`V_c}Fi)#Iw?R8g<da>7y3 zd%&4^HJzCJY9f98-m{R-?Bzcz(O@4Dbsjux=^M(-Lm(k@Oia8!7V+J7&osPVrCFwl zTv03cH-%Jq*ekomSghfwv!u}<B~sl!eLn}7x%D4QqzWuY*w)&Q@W8XvX7I!1R+G%l z-`VjPIm}d1ObFpUYL&;hCv)W$iX+OUnE-<EUS(4WS>*LM6>S?dtR4O)mR5tO8WFwx z{?R?6RkB-wI>%&cf=aR05S=o39M@H0aM#SI*zYS>HYvS`6Dd54m6kI$CxS5@rBBi$ zdU6XGj-VUs5|3tHh-I5Ko}I4G_qCPyu+tzW(MepoK{n=x8GK9#aiItgt50}HgwPyc zH!WDA_x%zDbK)*YQTfIOo$4K75Ygy3Y8M6^7|uTynuu-*CmrnLo**__ERN%<%dWD* zSjRF^nO+e5OpSIR(VWOU-?QXU#PROvO&w}m>UGALH|TpKujcw%qKna1!_xgiM__<e zUBDkA4tP}LqIE)VYy+-PbYUxoUN;Euq^u@Y!Heiok3kdJpvs@!hfmF9Ab$@1vBl^N z%T59N_)kBgiiFUKzp}s8p=)~jrS}GNg%z#1vUDj9qvzY8!=8K2pVNA|%+*vkHBM-` zamj3|Gd1$m6OiFecD{R+OD*(&>baV?y0M8`x*1d7=!v&Dw)cLNCU1YVktesXz%&7$ z7%u<W{Yi74G4yxae@di9pycV|p$+wbI>F#z9PXt~=6VLrHf|5LSzOb=Qlf<SI~yzF zk-SefZpNzINBkFi#XYc3;7WMq)t(pKk6oLprhZ%@do)x1mc!wi%e4>nQDri0@>%@a zPOMsp88frS9?z975<kX(3i3LQ*dh(qZ=VqX<-hyKf``IS1`rKVdllVkPm`(q<~&Z4 z$^Aq<q5W0WKAmGyZv{S?b^wbG)W_u_jK#>)73RSreDFH-iYy+#UGza+bo7L?_`nc8 zE*?%u`TX$LLE!%vJqe_NBs9fS;B8!=Y~`Zz3E}aI$dLN+xhul(5y`!cV*mOaf3BPm zlt~yk^lGhmnf)3%+^cv-J>}L_(kF)o^C){n;Feep!3oZYb>U;OpoInV-b38#FrR8z zy1xw<=dM~5_O+~j_-T5&x0-MDc6syW0xA>)xPYKpr<;QwcdY6fJ}au0oX5!Z{cdS@ zl`v@#o>X~B&M#K`*9q|_wc@o^MU~ugPiE%a;PZ^G42?}~pRT^7r7AOtz#bB)&9-f2 zet96#f*yUcm@b+%r_+-uef^kL!o2U?sw93`FSNozo0Xo&3VlG_=!!r%#39%7iKB8f zow#MI!5L+<m$ggOxS8}Uyt&$WD|<SckLapOot^%pgXtchb{~#G;B`JBinbVR8bp}= zG&;pi;X`@`71?zdX>QlilEBb0xr<Y!^z!6dq=>S_8Q;fs;ct_ro77)=@9OSpVxcpU z;Qvo1iulRl`1CLAbK;IHk!t?<FQ^E$wdJAd{t3qC@ggpfADAdIq9iY9%u5l^73pP# z*U#eOXor-mSSiOzvqT3|OL)eDS<gzO&hT|nPJO7HH7l}65!SZwc3H_a$yp7W&+IE> z`1K)tM2){G0IHl$F2N=9ZpP!Zw;oD2cqU7m`kKHy6LfN?Yxttc4@?!%<+TeaA9>(} z<MRp)<c^6pQC#D<^ZN7lrtDJRwMgPS`)n?q6<Z;aM;~s-Uq!U~q>9xMSEYRA%}Zj6 zB{j6pD(J<uWxi5eb^@d3x-z-J0ZGvael}ao;vhT6MW;dKy0|s)<#}Sf@C3=Nh_RYG zJ<(nB83Sk=bbsB}urHHuIQCn;K2Dn4=;XD*w6<%yD93&;_TkF*L%~cmw>4k4g=Js5 zXfb>gv-Iq+sa4P`cR`xKR+k$1`a)2!yC>S(3amaRkJ;zpw+mQr!BoEANl$5Vi4RLo zd{G?heXtQukC~kp|3p^+g+3AWq#7V}_}<H4LjAFzZ(>B63my5q+#xlJ$)JUEhSfJt z!8S3nmyZb{3K$a3Inwp3t1S@u6?rkyO_TWbaizGd>^ey}&uL7Vi8cD6ycyIs5CG|8 zwhUFw?-pn9v7Taga{OKxs%<;HKdz#i#t$v&tYl?HpWp&4N0bQY-OsJ~234ofQ`seh z&a_cHnItS5-{Ew)I5MXc4Z1U8fy$>197vYSNO4~lwXnujfme3!@2G3lSocp!2;OiC zjCf=cTYUZNG2w_((sr4^Sk`gMK6jBo-s=R<WF3MBlRoQS5@gb$%Dh)@LOF@r&;e(d zKAX?|MLB(&`eP6$co8qciPIp$VKkzmZNTVLo71@~$0WAjr`(Xja@y)NIQ-m|?(3IR z?Xg}LN8uSsHL%>Lx4rv4A+@D>2E`G;0oZqBtZH}ijC9~CZ-3g9i{Mq|ychiF^nHKX zKEexhn_MEtgd?gf_`mY%`@F&TsZ6`9yW{m)sX;@*js9KlJ>&RCxeG_3yH8yo0%SZv zTj(y>r)AEkw}IQ1WcStAYckIs*Uo7}^D<+cnVO&4Vq?<XKiEni9N+_;S0V0Q#w7wA z5C{t&3?hY)N?@qUV_pT5W2Jyw!8pT^9tds$mM!*G>=67bI9P;HIPM?{2tI@WLI`1i zFhZEX)F3Pf5>uEEjMR%^qRu!6XACgv3_+bS4$fG(5D+#V4hRPu=im*<kj~g(Qc404 zga~;70wKr61A{O~NRfI03`$}W<e82PS;nNH0D}oJX^D_$EP8wb5Dpa>6AZ$~fM8)@ z;SyqDVPaup;gI7}L2yAhxHuqO<hx;maX|!F2Paes^Pq$W#>FLo9F#DSC*%h(@)91h z0K&loAsck?4^;{IBM@XAJP@)r9tZ;mRmMPG1rvY|zJQG^VI7olK@dC;7RDcSk##VT zPegtb>)?cW@O5m|1)SeLKu|Y+`v68>LcYhr58^|>s29aN(4YQUiAwz^g{n5p2kHRz zfhs}0{(RX84uc|m;Q`3Ygs9rTSHsZOF~ZjM@^SI>Aox=qJR^T4PY)lMzYm5n+zkin z-~fjq5SaGJ2mc2zbP{{y@A|-O?0w;In1_7;frGERdw`9j3(U=d8s>pijM~F&+@bz1 z?!N9e2wyKRw*XQ{xTm`f6k+e;Vq+J8RGVVDc)0jry1RJzpj5pcFh5KWPY)QjC+e*z zynOB4T<mQS&QLha#?$Ts%-)CO_iH|Is0YFk24_G%8|l!0@TlLLW#j4R0fQr)UA(Xn zFb@Y99QUv;zK_3+{qIflg}eQX2T%;~_oqV^`MVm(!Gd|vDtrj}e^Dh1;X@ey8%;7k zL{ULZ!ok5oSPClTAS5O(EH3JR%%%esgF+n~g(ZcAU?O%xQc}Vaj`qURc9QlmahRQ` zBvb+>W+x^IgG!2vh#^fN#Hd$<2uOhlaR@-d_(;A2BL^-HK3ED&h)ak^gok~outr{j z;DZIp@T4#Z@Ca}Tz*3lm*o2sbSj1RF*hjUbum~`Tu%(a#Rtkpzix2|`gAmCF#1JyD z6q0d&n=B4S)z5nNcOCrS_1sYi#@|&q(hL4wh2O6q>el|Q+L4m}?<)L${V*}l-&Mo- z*;x4Pi==^n_XCIb4}S-JdJSNu{kFl+Z?ks7v=iD-=jxJGb9_5bJFVsK-dS%E+*bce z(u_h<6lHw{4qyA<)Q`KphPadfG#*t59m^n%eo;MN-k-bxGXCsKz^>~qhIODMoh!O_ zCz5+;-EHc#gt+XKtY}SQ@!HGk4PPeeN!9}G>)<{Av)5Ot-dz8fceOe3VtjC+<9*Jr z)th`nm~owFpLRGL6S44lt#cZq{3&wHLFdxZvnF&dQOP5pOl{=e2u>G(HTYBUx3&*} z6Ssl$sS&zFqx~T{zkq0>ZyiG=-(jV}h^J7}75cGER<)1u1OeIzfleE^sZS@b=aZ)y zZiaXdGpI!?O4KS<s-((!;<iH01-D6Lc^#U-8~R_6QD>Z|x*ID7v%G<Q_GQcsL^pwe z!l$!FCA<W6VMlW+7>7(Bi8NhEvDhLg_%WwMHG=W{Rw6^>NV~l(V<|J+J3mMF7lj#U z?2W$xUh)~xeJ;Anw9P^E7;X!nT2<2It;?$)!u?G4>ZLhuNhKR|>HT&FbFWa++{pAa zt#21=s-y(yIa<`|BcGasGNe(f0Qjf1P{2z+s|5n@>ey5=*X>;$b7y1=Cd3iLb!oqS zOZIXo2KToNX{|F;XzLGPmzoj$K2vzBT)G7hVN$4QpFVEZ_0?vo;`|Mx8_V0qVn=KW z-0tlkV^d%WF`f2g9VZlAIegVTlFYQVXqhAIyjfj;ylv)alhk7Wk)!?7xbiIINI%Yw z_P`S2yVLiMb+-i%F^N;d#R*%N`Yv}5bE^^fpJPkUZz1u+eR}b?gyX=eTHoyTJra2* zO8LBV#?wb&R-CbqdD?U5Y09<@g$~x4y<>tw?z8_z4E_;Uo6N{Xa)7+$VqjCyW1GCX zaZ(9gFQz@?b_K`!F;ol?aF}ps^sn5&!8I)<`J~q>NZc69$yAm_w)dn{l%UqpZS%h3 z@mM2#aa%5THIGgAdf$5j)fUyMPHcmyc{p8@kDn`KNSFJeHtj2mvUdZA;9R<@7Q(KG z_j(`l*&XuEG@MZMx&x-&$9#+EE+IZjCFWy72>cf}#fsnNs$F}{KIGHQ8@ut2@UBAb z8(g{4eX9_2%A+*`IN+s!EEo&WHNuxbEN}B%vcp3aPwlX*Smmk~?L<=DyI89(&GB)@ zV8x^K<z~+K07b?9W9iF*B?KW>_&VFt%ZMRIFkIvIlOgLG4gHPX!pefB_rkKbJ|CIm zfU^Sqdzj;ViF+@$E>bhGE>8JL1y%Wuc+kk*NNs)?^G&%e42PD1_NL}<S)AUzjmic_ zd{t<yZfJSWzsY+!T}o~x#@u+kn){9O!$SRnW{1{*q|0bqBhb0sPXYT<<3-v>zE^}t z;Im$o(s=mhvdVN)(9_5Wd28x{vr83+`~B)MW8N~=jMAaI%!)Goyb9pYd8_?}aSzJ6 z7@ypEzN>k(-v|9PO~ua=Q}p8Ma2)A?f4$p|)X&_$tQPIJWu%)vzc|gaXroj4;a%Zb zD_+xQehR`(>cgfF%7c4dQM-BU;tK-w6Gl}gjJDNhx65w_>fR&Hc|OC?7yj7PPmnk3 z*B|~z^Z&X8q(h-ECr?K`S^MN*C%#Ftt=3FC2LFDHHo{@@Q|*TPBrNkNv8B|^JV0rW z{yh>~`bux88NuI87P8V^C{kiKXbSoa&DQqVak>2{zz^i!bmZ9y+;Z}dd3FN3uAhFj z6d8D1V}_<&^lftiNUi$)SW*I*T@2FhZ1+x$L2cIA9OZbHgL6F*nB}BQz~tQMda1gM zox-O8Z&M<V=hk$$jMBt3uRg$ugl*hG+th^4<>U_7*Gec2mXt&@Lm(2cRX6`K8E;jq zJ92t{b>%%4A?{$+;c}uUE_g*aImLsJ`;|_wN8L-O-i>AwTdyI-LBC-S?ZJ0PvnY7Q z_<9m}YC!ApdK2b~k*x#<R5>jAipCl8ds8OTsfHYN?oVIz|Li`)T;j;Tu%sNl#orVF zoz=aEHiaAqiY+sn?DR>7UNBPBVAx6an(~iFJI=4(z|^a$eFHEYq;Vs`zVjuhe*(#L za9L5$8SWQ;k`}V+QWnO~*Oc0LKcH<413Q_7tgOluP7kN~6HTg7%bZ^`lTH7k9{1(G zVecf*<o$(snglvjR55UvT(QfTfk_&pYdl^5hrRcJiy~XvhiAw+BU!R!7;;hs$vGoI zgaL+}BqvECIg21j4w3{UgJcjv0YwBwksL)NDoK!U7#Hr|`|hs$-FM!d{jvYn-_X<D z(=&bQoH})?o_cD0E>axG>EbEO=Fn&AAUREWuG!>K&lwR!z_rD|7=!xv9xAk~DPum9 zSeX+BX%g~J2uF}-Xy|xOJ$i_vQvb_5dhpIF&IGzgPU5AJMy)=S$>iutdtEr}>7qcY zSH2J*b@fexE>q!&X4hpiAAJ7wHsgx@!!8X%0&nLJ(JNhhx36Qhzvq4CR6cd8N`cRF zMe=}P$ZIZ7F2?Q)TWHT~7lPLr7yOv|ty8HIXvakMvl!TacAm!V!zJh~&zf>i_D}HQ zsk-Uv@@}QcHTJ1h;ixZHNUA@x^m#Lt4~mYbRqYVhmEl&^4(OiBn{}nw^I$ExUsy+R z{@M4->erj?)sd)Wy7<yCIX}RbYET&iPf23ImabL;ZnpP-f`FVu!f1gaAT!X6uy)Z< zaSqWOpg2i*ARvj35s-xcLO>G#KLjKk5s;_czfyAA@&Y<ae=QpFKRekUp(FoVWaQ7r z$*E@j?VXch^xJ2lDijNe;6EQ83UCF$V2_r9U=Ya60t^-bi<%3H2!Sj`1qFnJEJgVF z%mg52U~{lApP+y_zaX!GrGOyV+{{A2%)*RcR8&v|BnX21PuL>>3VVbCAO8*Zs3Y48 z!v_8_?D6EP{{ef10-Jvgd;HI5`Oj|kv*!GNaLC{6DFi+z9qEj~A>A`dbq-#7SH(k6 zCi*6Ywt|3zb2L{+rrL4DJ=2me5KUdWqY5K8MjXp@E)`|q?EQ?UeMk03!*O>CK-Aml z&i7Z0-`)VPAVpmcIV1LaR$4O;?TnSd%hJzmj;rP*E>Cd|j505keU%=b3LDZqWsXA} zSm>X@9Os_nk`sT6RU&%=pa6mhg}o^EG6FrFchtVexDEM+B$KUIJ&s^{)a+-^8q->@ zGOse{)8JKlQ_nnJl8DH6B@t?`nfKcWM1|Xk_^qsL_na1{$1SY(SZi6#nQM>>uLf<2 zt1AO;zc6&lkX1N$TqO#g8R%ja&m3%OzjlLqVuQr0E|NM>+q_v8yHHQG9CVX~oDvUi z&x%+#%A=3#3eUeL&BT0(h{9tg&f~4EmjPYNW3QINy=*sVI%rywf(mWe-Km!Y$%ygE z`suhzv?$B$(}rXzDeTwT++n)+Hu8c6+w+`>*cZmL@MArNW>#5vJAxgcSvIi59aOpF z^c^H<uGb%KNF*np`jM6M<HP7zUBJ%HP+})E;7@OW_Tz&{iZal|upgU@du2wP=+`F- zl_Ymxb`z}##|*GhqI)oI6<M<ROuF@xAEVOQh>S1g+pbZFhCW0Vs^Sm16R%Lyl6{`l zowQqZj;Nd!xHJ4{k$BWltxqDBQ@>uhB560HX0h6iInJUiF?2A{>x}f_s$~4j3yeN= zspH#QDB<KBBOx7&r6lyD!U2`vG`9amXB<9WpN^P5{0~9URGS8l@B|MlCp<1__xAzR zAAUu%QI4P|bN#%{#)YGrEn~I=OL18TUQa=cAO^U$#z4Isu7))s{qZ-y@`+WLOTA01 z<)CTlGtj6R75(!g0vVl(^46DXKCh9^p6)Rk0BFW)6Sb9EP#;8;_|#(c+2`5QrH~iI z!N%R&=5#5fFRQAkYoK_V+QsT#6D~<z-X$46n1^IO)`)+uieN2@PYNeD+zjmrX4GTZ zI>i(7{|{9W;Lrd3KfVuiUHW&@h4ma=mrV_?^U!Zr-%NXqKYK$vnG(VYO4L_j>|D4? zeXI)?9SQ)6y|-0nj`YUXSwGD9$d<A&mRKS+um*crfn`;Iuh(&!#n1EE)?fFjT&K~r zZisv>?Y^(%w3XU>r4RRO795)nf!uWNP1-qW4h(uK_)~R6eWY5WxMR-(zPrqph=CN} z@{&J2bzvfoWd&|7%%62(#2QxJEPcp0prA6w>Ds#1uR|fcoW9+_t^*a9`S9ze1dOMM zbHoL^{~3sL_h+oD_HBV{w{-mUZP=pa1#n{)++8WWxPtH=>QBd1k5=`7U_fWY)gF;? zkz6!(q0~rX!3f_cK+g+GDMC8n-;oT*;p@kYMJ7EXs_8|ha`mR3aN9XTTuR^9QITAw z=~{hTNM?Q)Q18T^+i!mntP3OeKpb16vurf)`B-x&%HDmvsGj*}%B;AIX?KpE&-ykw z_$lu<oE1S#nn}0apg-L9mEWKUV>FrS489~4SK=X7cyZFevOw|~c>rugAP#X(zT3-~ zY-LFBrvBr-e&(G8or~o0{x@8J@fIEtJ1Q6V&xjxf)9$tnJmt9m8L6Fqf>oN_Kmb5F zW`sGGIJCfg1ubbee})DFI?L^Xo@XKmA}Hoe%R0@3JxDWIN+y0q-cS7AHw7Kx-e(eM z7wpqwi_Z#}<SluoBryMOB#HN7c7LA&xAwxFz)LM=JV~#n`ZuDb$*H<HV6{a>I%ne% zvv3Ku4S#6}$o>>LE6bExGcuenc7f=6W(@<;6W6=`X={pSWJHYnybR&Tet~u93iisq zw61b4UgYpb*3*I!IxtE`4sKCzoHwi-yyO@Mg1G6_g#$-B$T`s5+Zj!K2ASjdn=0b# zL%ro6wzeA%s&?s|5kXAH9HC|9*^KYq_Y1NJH@0JHJPa(l&v&t&X(p}1=DNa^BngaK z8FA+8r~vBC`TH8hBh3|;=QHz6i(l^FC_r5wVIzB#Hy|)Mentc_dtRTkYGBzabdlNf z(-mBHP{k{w@DIVEj&rHsSn!4bD&5I2p9<pG8i@-jJZRbJX@T=CZnkV#(`F*N64Tcx z>V0@iA-(7e3}-|T%W72bKDn#jzz>-ZkvzgntRfO#Va~zEKvi`qMW1@yUiEGaR!?Ry z;}U{A<^BU7-?w!w<)qhe_yyC)<KKB9<t-xiKw@3D@TCtnCK=oW0dJg}zx#4=-_E7U zmakS!dI$DB{x2yw6(|JgAQntWp9=RrZJfZ|KC?&y+7Hu8xTyh6({Vg6?~+ht969tS zNmK|dS#Qw6n0b%g0zeJ>E**Q;jG2-N$%i;Z?=bA1jUDPOiYpajP$JDPf9V2125A1} zKls_zaBDckx+FF&OH^ubrm-+V>F9AUU-jO2JIKCj`AB|Icctd(CdX-lqqTR+eZ*Kf z|BM7j56pd6rnh<6atib>y<dKbuPwTcq9)!H4)GDGKesU|Fi3`PjNl5}h3ZKIjO!N( zrI`o&lE&QzZgtk?G#yF4TTyu6d_VQZ<k=Vz9ypHl7!T=kCfHu0sXg~KPf?GoKL661 z-2KtKfD5r6&S~y-k<@4gVn)P2BXZ<H{BriLz9rdoXoWw0DJa<=84K^?O&hTJn=ubt zxtf<#!M4N4#B;mk0Z$QBbDme_2CqC47%QYNoI7~jG}<;SeyvT@;##C3WM1)Y*%;hL z1l%WA4@%kSMCC7c!$LDKSa(w;nAmZy=3HKMx5}Q$D8GiRdosBSH7#FYdLXUu-;uI6 zV<_&gMOQt<uFPUvST^=Oe11awWWEFnlL`qA%r_NdT6Up#3}H764Vp@S3(D?>%;nwA z!q|8G_sR8VSHrF05IVVfFs$YVG8xZk^BC&KYjj1MZ@uZgF=>Gv6Oys_s1Zkb>9ZC& zY{7)M9-J>v!I9FBZW&sWBZ|H4xisHj@8WIP<{!9@Hk)HGNpMC4!PwE;o<o8DIePX! z&<*(1{7GNIgB9eqCQ(y`q@XKyr*3A%EtvipZe|a*P6vivEfk^14l<?Oaa654c*@tf zspD0RsOfGB$%Hi6zNm!x`w^E-;h_!s!bq}&Lh79R0WC}(X*kbMIVCo{CuVo{^O7PJ z=AR!C|4M`RVD~joG@w3I?d&ivDMd|Dr(GEC1+`UN3@puUaJtNOqHO`q-!hBM88qZ= z8YXqyz)o%y6omA_VOh}<$R6*x3W4wg=fE@9)YpT3;`t~(K(p}!4|2ov7W8m&3WCZw z>v&7X5^Wz<Rhg5=6UN_bmyYRHw|!pyK`61|$i*g{+2*Ys!Ohzpl+v;uX{VFP$<FWo z{ntvZa=|-O{CNn5XLQC~WOEZCP13jh52Q)EUa=+ap>9d;e_mX_`(?kJ_#2=fj!}2V zo16!ytl*kyBFYld!NLmOBq|wl&bjzk2GbMFO{gxcV+lWq7kQVGr4z$elKEVX2D2F^ z06okXwk~IWnBa<gH>~o$tORJT>l-{FP+fF5H6^d{TBpw(Q{eoNV#xedP^m11r-&{b z8xMi_2M<t-=DkDq>Q@{AQOmq#Lt#r=WO>Lkk4eA^GKmy>#iyQp#IfxDg`RxGV|Y&3 zqUAh9GJM;ks}yfe#Ac^=h=|OW1*384@$>sNzb|pv+VTC-i!aWK7z{(~Qrcq5MaB-U z;|S{#ULNQhs@Qp4+QZin5eH1TN>&!Y+r>_<hMwa3ZEu>su4spXNRg;oXSs$<M0*R4 zy%_P0cM1me5S5priVc3uTWgfbS~h(*XFQqo4IA4haY<x*)iM*uV*r%vT_1kG7rB7D zQk&8*03#l6WSM%rk;kGA^wcZ$CoataGh$Rf@v*C4K}#lmn7%q@N5ydj@M$&peDtmv zZ5{K;838nV$TH-gPZu-8ZmEgL<u7w@Ctfl1<Br#Thf70a|J8}$G@Su))u#U$=?ot7 zWdrPAMTQzKM`7@s=iYlVqd0-bIoo)F1y`5a<jUhIoZf(AWb`iLLU{%J>L#J~8lN$G z`dULaw{Vb+wHhY`1PiAw2R!a-d3RPugqEhIU3e4i?SLo5fgLyIE`Aq(ejrR}hlx3( zuST|^dm2GPTyXoJ5kd0MzTsIlUxi|<9&}k_)iyeb@J0z$p;eY&D_T(u4z}OD9`O`d z1-#L^+X#vvZGcN<@Vk&xTh@KDZOLqo%9vuuzOF9GMz{GR6)5kY5tM<4Zmc2k=diB& z(eb2F8kwPdkLTC#^11ooWsF;oO$?R*0-xsl#~=fC2PdVA5aae$ci9Oa_|haFy%(4n z77I2Xsn+b}B-~hLbw>fYb9<eUdS4!fSqC4SrBrj>$kjR`QN_PLV4LLVDhwP~+%HPm zz+<tF^T~n*w-HCp<qCo1sd>#`$+PXf5Xr||!CTd%o8^*_rmr90|LCHTKO7BCL@t|* z23qo_Sddoyj1y{?qcx8zvU*}d^QxcDJ-SZyB;uU{O*SKf*?<EcYWH;_b$>#qN{ya~ zeKwza@uegMj;`wyr6G1lz18hAB8Y1(Kv&0n9JA6Vl;@Q|D?2l8{E2r;1}p5Ng6Xus zzozpT8i4UjAr2CFcNi0;DPc{ijjeA*VVKyFUc|0$C^8U~ome`~H;?ZKH$nVH5@-g{ z!=!QRmY;4<WF?hnnFL7$R^9^chH~?L#@ZTHG*w<Ys6`1}tff--f6^snfV!4Hgfl++ zlCS1Po7CGrE%j*Lt4eH#|52xy%-YS(*;R~(2fB*lc5<<T{dIP<LROR00pgoG+1o>F zZ9xlznLu*`Apjt@jjO9W#0B;ah;0FJHFvRrmFPPDW|dAiYocon=kz(X-tN<XiFtb< z1wqE2OXrj~<n2##g=5=bL4U1@le?R<yBnsOrJFiz@8`LOC^k-RU=&4l9jVh?!>b+^ z7m%(Z0Ug=1uG+5ik290&=@6+AUCvE0x0%d$B#u1s>6Opk_VSD!1l{(`JhFW>Ij3tz z)s{#HNz>i1kokDiY9HG6KQ`cD1p0RXfMl18RovSMKac&}Ldktkrg|m+@K5Wz5gF5; z6)(kCoe?Gj4?Fvt;@z#b%?xr1JvIz1Med5cuSSWkjH^3!F2zdjG_>L_!^}FwtvC(w zLZ><uS+rY9-6CqZ8zC4y;jg~ErTk8VcMEjTIZ6q)Zi(0soTK;$%o~<fp6ai*a4d-Y zOL`I^PQeBkH?Cb0@8e=-D-yf)3Wm@^9A<HqQP%$>yVq6zt`Y6}cY6Y<wU}}t5i3)5 zMYyYk2|j9PL=essk4vx5Dmnzd_npT(_;?-}nVSeRlt#S_yKel|cpCw0!Zs|Lk2t8@ zRb|z0jx5)48A?$Y5*{QoXI>w_$5wQ2Ca6$!hwfrl?imq;i+l1w$H&)s`|jbzhKsF> zmT8rDIO6mkyno4x8`+CNAkt6+qm)2gHlUv-M@i0b;uDfBj%o>!nOp<vL|)DXY0d$= zHyjg`QD>y=iH9eHQ#CUy`{lcfq#xHoPVV<!s=iP^&t=1BO0vto(tOHx)1U=GP(9s$ z2HTB?=lk3Ktqc*Fpq9p3<@%J5{iS_0rh;{v18=(y_>%IA_Lx5Xs4$JNl$#5TT)SVc z^Am~<73k@n`#2js;X1;o%%ycT9?6fm@J8nuQBB^G&)K61C)FO5@C#6FtKFHYQ|!T| zL+{g0&K0^sY_4!yof9SqfWRt(xB~Qgh&%6Z`e+|4bfxj%Pv{lFuW6E@_#U_1qCv}G z&enfM1QF4yxzr;`k7@Dc8<5*g-!fU|!Yiib$KNkSjxU9;zQ$N$y$7r5=zQZtB4V6j z!4LVp0K69tuVNd4dUvOT%U$p2zHI4;Qb-QUsEbc5I3t26jzXa^16Yh3iHTjaRnx)E zDBGG9B{stf9<kDSVHI#Mx_be}h=w>nJz9?mTRo{8gKg7eO<@Cxn$gsYN&QotoBJv} zHxo2cZO(`w9`e5IlU9JBjG@oA-qwFz;>JynV!d~X<rS}QgkP?1(Ol>`nE8sh5s}^r z0vaG2TX<~|04NGJ%0=hy>)Gp%r`$z%=MIB(vYrt^l&?6+8otQj_Sz`zZHto(jrq1j zpCze%<MUUR>z)lyvqPxUU^scikyBB8cqSNeekqD^PIqpmG2h)(XmS6sfKV@9`4_?u zo+vlrCJ6YWg4+w(HUoLSsrtUjmrFFEyi3}k05ZR(p}C(cPsr9ce&Y0TD@3Uc7hK#n z9K3TUQIM)!3e#nEBH47NG$Jx?_HO8vQ=iYt&hP&H7my2j$(=RwdB=~5!xz7iBv)Ns z>MMFMLHD4rW@>WeL+AJS33#%4A=0njUYLH7nNb5`aqEJ_+w&BQ;f-v}Y{Tn91n-O! zyoZubSwP}P4(=dka{XtpfOtG3a7-$^fo3^+v8v6x(Z(Z^u3@|80Y!L2b~YxV4WXCj z&5N)A2jYA~=3(z<AG)*EZ(6Fh4VY2~4EcGD-8g7q-hSstW4AiN{pVH5ufV8pA2VHi zC)z#1OC0H_uApr*tB)BTg<hdJq|xK#4+Q`{Px}GuXUJ3Jzdl{?ay#Wd`T$LQu-O56 zV^AS?Oa6U8f&q$6&42afqc_PgUCGF}xHNWbrXNk9mUQAi75A)EGAA3->TLw<+J!X3 zl*N%ZkD0(1wK)romEyT=Tq<$X(bj1ksgcOcJUl9gc&k7E<-e<YemQ~2(jgx28TW-Y z0&SCf>`ZnOtwKYQ3E$jS&d?O?S1gfmG8y`RQRkmX4+-52Y!7xchoE2i@%R5%v;(SL zVOuWHV|=*vd-;lyw9zVKyv`-^*De6_02Q8ieFN&(te9*o4c4W_u%##BiUD`(mqu;H zxN@u&&^G}lWCFq>h;QAf$E7mnstm1G9KkswBVzJxJ9l-ghXsbFO1J15WZtWLc;khi zBh5-dI7S&DE8Lc>4;KDMTrpr8oP~arOG6^dWZx-!6Z@+h9QDgD?M@&)8F(u@(A@qS zj)M3*;Z0|6Fk)gZa3uOUp)nJoiPuMaEl)h`1HXDB<Xmd{IQSTEdazF`l7)<{@VTGZ zlplyg1Hd<#rYx|2J$A2VUKM0n4BY4A(&*x<NXHZ-id|fk1HWGxR2`F5vsVl)FKDgO zr9PugH}{(QjRrbnhP!8=oBhFd@qDnC!wMLUcTfp9D@-+T+;l+EeS8V0;>lasqNqi_ zDBgI}0&M5N_hjwu-r!C2wgv-@X#<VIgI--;r@j;MZ6Wub0`sHstMcOST{_kD7^SCo z{(RH@$`qIvx<jiEe#FOH$6#y(6il~qml*eCdf~*<+>>s{NPcPx{AJ1T@XSlO5A;~Z zm|1+1xA25Kb!=3eJ5V4joj%oHeUI$G`df;VUB}7u;nLX=xs@DsF%clA5ZByPC=6G( z#j571`E+kT(U$5<{OKeF?6UsY2fVst*Otg+y++Ge9z;w1rvKZyfFo0qR_nf3BiA^{ zz8U`P{MRfJhci|t$73TU*qhiV%3!(Ee7|sLDh~xnQ+MAb4RpVocPw3!1Asd=4pZB7 z_wW!zTh(o|VryN$>C4O2Mn;rgRO{Yivn7SvBq30_;ItyWa#oNBoAMQFR+^O$mq^-! zX810s^<`NkOrZ30y>B|=Il!>m%`!fO2?BB9y{2V7YGxDLm@f{U7z{U#LPzW3*~pj6 zqAwZ<tC{&lH~x7|b~-M9X9uCC{bp2c7SG$48=|Wu@m`mmh^q`+CVf6UD%!V~*ErWF zhC!RP17lG~T+V6Li|1{bWWJ=T*+CIrpL$+RB6&4xYOHBHiYw?+tagIVh#<Z~R^(6w zb2Q!v+c?ONGhAx5Dj-?z_RLqYR6f|qy>d^etO~{-hB&fMiHs>(ASS8`p{hJ(5t+MB zM{&`BBt3Di2BgC;h10m~j0j?v&;t9@bs3uBZMFbPOjR@2Y%wkH5(5j3)kk$eRAPLc z9UjbwZmpk$ps12chlzeaf6UX@*OXQhkqCs!Cp_@Ob5oE$FZE8+$AVDcD2Tt4Y5xs# zE7i!pjik)r02@yMZ4g)-hYBG&82YG!6GVLt{n$QD2nZj3Fv=`+xQUERK@@oVQq8iX z!4O88V!FHw)#jxH;0|Ag8Y!bReyng>*1Iy#k@i}q3+wgC4{o;8_nS=B;=--z;9(*j zyY-GYZBHN?S;n1Gq6($eEA%Gw3Li$>kX55Ctv(2}G8DZiIxV{Xz3zUAB{Nf^i<JG1 zNhY%igP0(yD<}#w(Z0xI$Yl;eCuw=dH|;Zy(0uxgAm%Amq+cVY(zrstpB3_;B_GE0 zR^Zl6{zq_Y34|i+JaPS1)2lPFGNdAxRs_<V@~`QDhG+DjZ50DLnd;K9PivX$%cCQR zIqIKL%iI%hJo$-oV%=Aqj{Ae2?jzyNIId2*R|2J4NV#Gtk)=+VqYxJ({>zx7eghuv z=t+*2v+j7|HUmVD_hZk+xBDGbagkYd8KrYP@fZ&&_Kt__f1tlXC+Ke{XNaRK1k7#Y z#N+A)cC#_(v2g%fL0oy9?ZM^{YbSdPhzs{Gu<+yiK;ho34^>1X0Uo{B8Jq4=Jm}zR z-lB>&t8osl_28AOmU0SbWb~gW0KUE@(KbH1A64W&OfKLRE4Rz!_fX=JJJFZ!8c~HA z_e%)oi!NVP@Mn_396CbUbU+%t8id0iV}W9}oNpNM48%bqeIAa2_#4gTo@_74SDCDW z3z9k9wv#z*jNg59wU{KTB<VN3Hm2CMcRZJ0%`srCBB){5)ht$50*}odiK2T2-JeRB z$)tW_u}et@EMO7e)T92Spxjd)m^IhWuw`<zJRjLm-ybAG%~ow7eMXy3Kp|Crg{3Lw zC?Lu7i5cYe>H=Y?cX*U|LW=5MHZSLK(|H?bpyBv_DX5%zfEnFyrEj(umfm={PTG+7 z8~{YS-VZ#w*s#UASfAEe?_z_eua{r@s@Ymvu0d9(`q7FQaacASn+}07Y)`>Xe6b`` zqwaf&dgo}bf1~e^m%8O{gY9{MOO-%q+IDKnBW_IvKU4l+{!&lj*-FKUQ4&1GYuwQp zbtGQSI8R>`MYY|b&ksv|NoaQxt^@otQZ+rrh}2ZhyLUAVFU_OZ`1B#G1`3+(1d&~h z?>kanc;@S6BQgg=ry(v?Gjocpr9SHNFp0uv<eqpIk69y|aPEqBG4#4JRIJF-sWUPh zC5$i3(aC3a27<n|s2XPlAg9{Av)#Ld#PMjP7dNk9m&Q>XmgR!D!l~bpdfyH;o%g?e zw6?fzY|=j?cIDDrIl~E8r<k~{IjsACUJ$<;juIiZu{$X`_}rhN1X*A=2c|;y#$oT* zTUdTw_}4$op1Ah`Zo}$5{Hrv(%(zW1rY_T~(#q@&d5v!{HVI!17+^fC`tx7@!^r#n zS44UoJ*6g=ZQjgm#nX;FPT}ds9>1GS7Hlk&e)sZ>+;SYV8Qr-ic32D>ad?&yNTTAC zdeMuI#Ft212RA)+kRmvucJve?T(M`KQSPh!c|rWD7bp(!J^Z5TR+X`s(4wcO`i_ND z-;gVlA|o&x>C*&xCV8E{KTKe)XfzAT;u$Dx`^|dR8XWc4MOy=QNaUv~ojlyJSWV$q zsq}AED9uype96vDjEcL-Cg%nz?kGlX-+f``I#M{&nA0O;J)?ST)zpnKR<+pEo7gw( zlHmq%17EU*d>T%5CLI!8w!hpg&<eyb8=Ub-p%@Hw(@(ayn-!4RPkyB|tP1#$imBNX z)9>=<<@WnS=f|190n6Hnb4bQhm16)!^FvebL=r9q3*}J6)ygS6@PTm_Z!K>RuMh8W z(=qRC7N<NXd?4N42M`J>@hMQSoEnHHv#!aOiZ+UPk^ziyKV&S`)7Hcrnf?06Aq2ci zso=H|<FQHlky~&fTv!W^O@~N>Q1eRxs`97thdEkD)14v~ogG5)Ynd%%^m-+F!tyLA zr-U+y!$<!!2xUBVicvwq<0Uq!T!U!iYc(&DpIS$@%x^YA`YN+mDmMpTr<TJO=7_`3 z5R=q39Ubn|WPaK+G)o-|UXrSm(we^zov7<kB3@kwKfX42c#2OPyS|<}71nr094IF3 zaygbX<-4JcS{(WBqGBB+0D?-?P6{W+hLVbBBFg4f(*P2O?2$PBJ*gL4=1x3^VAs8` zgSC@HVkZg^Xz{e`z+O({i`rcaJC&`e;^9U1bn6#+q+HS<-jrB|(qAzq|LoE;qC<3J zqlpIP_T58t(g%lZFSl_nMEOOu-CvjgaulRHD&Z`rrVOJ?MjQo?RKbOffR^)uRA#a- zq~A&sxK!M#7gd);S~p`iczmf7enAezy7u*K*S>~ej31rP4axQ|{3`#R{X?N<&&Bgp zjXDPxzH_v%aFoE76NszIhq+U{C9$<O<4=muuQfCnR6&TP=+#RuB_81oQv7mOQUyGX zj90S5?{&nnps0T3#~_wnGhD$)Vtu2;OHp>N+o8z%aLy7IF-2U8@I^xuvHa+~uB8rB zmrQiDXVgjDeXj@E$KH26PIg|B&O0Nj$xTeCle1AMKkR0VK)UTF25%#}+gP+_*c_2K zep~+ouheE4STQ)nu@|WAl6-u-*>p~&ge>e8XJ~y*i>^$@_H!{33afXqq%<>UL=b^< zAfmo;GokwQcbQmElSIGs0wI2Va&I_j6g(e(#>Kc2od*MRAkNc~%^*S?BXg0u^%KBU z;Bk!5_1NCSH`A+A4AWApjVey?%wobZcd~IbaR56)V^S{I($F`mKlXv>gl}tIJ|#HX zl!aPXvIk?c7C`9jvV`KtA2Z;0w!5=oB0D&`A*-tCoE97}0(!;>04aqnl#G$}x#{Eh zNeh=38mP}xvSu|aBvtjzJ1HpNV3-pd&*{)|KM093ZV4Y@LKAyQYr)$v&TL5SIQ!_A zg%gnVZGWIM-o)C<r_Va;M>bBat$gHfCf{A%YTHVQ)y~VuB2@LJQ-g-nJRo#BPIeGS zI?(aYp_HO?{Bh6?cF@wvh0YD)>Sp6;1&ynn+#LXfKXekFhN8A-(p<4-m|ZbNUuzWC z5JAVJU3%Mgog$X>L8BmY<^;`&p-BC-KFeBBiC3<d*d{T;oILp&)`5Ow(o-_c2NfJ> zyizBI;_=@lebZZ<bokxKAm8zFwhXr-(I)yY!x!To%q1IpMHwEzad7{gVp+M7(%B0s zENtDJ!TjC>(QJ633xjhTxGfePpWe-T0gu<;Iaf9fSkKA$X#2&4CsYLi1gx7A?d&e_ z3`K`d%H9A;1Fv3&_&d|Tu$<z&74=F9RlzX(yQ9Dr)=%-(wnke(Rf;p(ba|pB7BS82 zJ#1n(g~`CNg7YH0s|3%kMpN76gK{kikDE?pSa6e7l$|z^?26M>Qmi(c%b?BL=!N9{ znRvH{r4#l*qSrJQ3r9R}kTCR0$~~|}&}KB6?kFcHM~?g9U^@mN!LjKO>AEP&Td@~J zuNa*&s@%>^>;!Jc8|C`Z1O#~)$S~YXs9E<*8G(@!x7(E=h=-*mON)*gO?DjTT{-Gf zUR8o{3r;cpls3Vv1)~q+{r&ngB8ajJ*hY)9^a^rSms{|iUa#Ljpnko`7>_|hOKbE( z{Vs-w!8sV~1mY00;ok&V6hXmX4)rO=ol$ohS?=dNXMa(`vW{dhC!i{ybw&hHPNv3V zPU|yw4(%R){WJ9}aAZ<vft=6x%@v~F9;4#ZvX+R$kpE?6EfKpAuWpd{`%)&iEH2<@ zXHv(DeYM2jpz-QwBdIWd=}f1Gk7o9eV5$jmG=c^gBw1WS6&-*|q14r{YkYydufEZ` zT>&L?b*edH@TQ!R5m75Z(qy<us+Kk1XD0iY>z%#?#{paXXZ35%2X~+A`brj|U4>Dw zBCc*xr*jTL^IAh*V(_Y-3)(${i>|K^Qfbw{G<6A}3b@b1vk(p<C+oINpnqe(-N(w9 zw0s4@1_s|}wz6V}h1riDWuk?TJ~8$G7yz3i5a-^$R_#SJ(<>PNfemLP$sz|WjWI^4 zp#IHlEaS%l!zttdIF5+Fldb+#+G1NRY6x;iFZkNxO@dt>-r#4+4GQ5_x8856)I2;k zI28h`oRmyF9x%J*#e%Z0^=iobD?JMK3kDm<YwBn<%mW|SH9lzyX4hBkx)T(JTYMiI zawB-z*v9A8xq2*;9PweeHQldpq9@V5r$EnVD_2<__qMQpyJsLOoXuxMw{@t9Q)UuX z`+1SOqy^_BTm07xvwzzM0zt?B|Lxdsy!kcQ)YZd^<pgZ%>FEgtn!15ue8cumR!&?t z=1z`W7GM`UZs>Jr>hg5Q?88Xv@&F(fbdOFEMmh|{*0F}r{W!@DT_`hupBbE)0<<ef z5lI=(6^pUQj2VmFot+3PEp<f_rdokpBO-Qc9I)o<8}woMVEj#t4RYnm9ZsET;Vo6U z30j=n`*)Lf;_<*8$FZAT#Bs&xE9;^v*Lmp(S3Ql%dTbeLEABqop+9tSujclp{r*(z zGa`tWn!b}ra+1XBe6D6nn#_sbc}}f4R94>CAHTi-&E(xFiwfe{$>GPM@*AW1-wyqE z=mj7u*wx&|22I<|<=EGCY|;JE_8XiR{^gewN0}>7bo@U$i%bQEehOBMd6HdSX(UUP zKzsf9$5U_LiMDg~e6u#t<`72GUnP7Ls+n1Bb7lHc7*gwKB#k)b;!HlWk}w1e;kOj! zvk>7E1Y3dx1O<d45K&<ezX${*0um8|n2GQSh>BR43xGjp{ARp@W&(n|W}>{jmVyv- zFho>L4C>Mo6N9=Kzx<*RfnYD%(9rI<oQ;D7d5CzhYaNyNP@`?@3QBt5mpX=X@FY$^ zq>1u2F+Lj$G{YeABJw#&MKm{Rc(9<6#Q>HlwurYc?zPi=L&Ob;e@4Ec=j3bJ72d}J zbnIz~AKDiUFEJeisI4&7Xl>Xsp$&lIHEQc$!;E&s#R_y=u#c?$z+QLoXKq#$_FrUu z?kQ||Nm0a5w`X0ti+%BoOcAR%!OvsJB$&aa_b9spZlq;@x3zreEm>uCYZ70)m2$Ts z=Nc>(8gYUU!g2?jOiZv#m@$S5Lu3juNwwap`+?4VA<N`Mmz;WaMg;MtO-p*P5V;xa z9TOe72-QsiOC$S7K9M@yz(a+Z8!vj9aEoB8C)3L+2+F{<=dd#1;s>DzYd<q-?q&=7 zdL^uCQSp`nP|M}$etkC|+ywEfCBO;B$I)}Uv$Ma6e<p@{N^y5l*NJvI$Oe}+Pry&J zG#GD8!v1(x{<ZZE&HVb`q>7c8lYOH$avt2cyx4=0)MT%T!JWVPmfX;C>tjx06*&>y zp7rkqNZmm}=}Mj4#9*=H_+0SD5id!THB*SO#H=B?VStX5?0BW9Yb;BX@g-xQXuHa1 zQ0U2f%&<?7OW&Wb%-gLJqW0D|0{#q*1;?gCpef;n{a#Bge#4AS<<`v*XMD2M0#W&# zMRtBFMfJjaGK6;Iamu&xp?z|<w_rCDYGnbPLH~=57bFZ86NBbCx>&fox|z5;Te*NO zASU);Gl;#In6{3TmW-~pj)|^@yq1)Vtci-$6<HO4WJ}HCjw#M<_TV%TiO-P+y5lvh zudT}-Xcn|tbb8+nJ|lvlN`(yRmALTMPnx7)x@s)5U7`w5FziV9UUuJLlG^pu|A#pI z$3MgW=S5?ggVxs?GprwSblJI4ba7StUUTF+OH=#3V*DKuJ&^W!As9yRkthv<f_0sD z(1g?5m~F9J6P0Sn9h8liN6<|KJ`xb+HB6E(?U}=EMEuqa=0)@2L#B8=gKBGUqS6-Y z9*?J)#n!9E)>h9rX~WCW?r@&L9t;|d_-<z8L|+VwH<Fd<b;X>x$QBa1N1?_<Rc-iO z9d6HxP+yZ5-R{HYgIXlCCjsC{57tbK+N@`vZXruvcTUcHM}K(vG_eM8@i6!$)*Sbc zKiUwP;p9cH5scToyi47Rixbj9+3tj$ID{mU?kaCi=Ou#O)q9$DinuHT_@$lxkr0m0 zAyg2o3Zygc3W5;_v@hMmJXSna*DDJInO2|Q8>;Tk#Er2|m<7Ussfb(AeWhrNcevme z>9uu@-OOj!0Zrxb9-CUCfTNDI%XNRFwKJlc*ak=z#~tITx39=1zOPX#A_<d50f-zR ztNYsN)5)9cmLy$+<@~W$>LG}CPoh5etIF2-=y2a<8_H#~=D>Rs%-{X(w5M>iCk9{c zPM;A$aDmUi(dkgSRGJV!`Jnh=&~S+YxTL~mwKJNw>yn_xDIE^t2oV1nbU0o-E~Yp- zINzDuzSHXMu758V6+<>yj%%S5{Ja~vYN&l$G6iv%`F}>q6fZuZ_d`$12tIsYRCth> zdqB`iFnV5s3s0Qy<ExK>te}PnDJ7Wu6>*bw-J0P{;hX`5hFJMf6S<JVOZin{tiTuG zN()s6N;YGYGoqS=M7H-|7Tw;?GR?(}MAN+0v0K}T{lM?Ks;Vq$D#+|Kd7(GtD}vTc ze_`^%e}$R&-$&?LBT9EZh(~8U5NIE*s!UCpd;e%N*UH%#KQJSLFX$21|BTRiNfOfH zllMDcmJ7?A14J)LdX+ydAR6UN$tW$rI4mJnGJ}YSg3T<2EzJ4NM9f7kz(V{2<{%3Z zGd?q3QBhH0h=2vy3}nd%<`WVY1_@e#EJZ+~79yhjd?LJNAU=!Vh|uv`N4jPBbQkN| zRTQn-lV1|yo6&z^8SpLXmbCA%*6RNclIg#-^(txDigaz1B(H2BjDbWBcj0Tl!3#O0 zr*hqEeb)DRZzxPjlE9n@hy$9A3ZUMczpqg|(p+(QJ~Pj>_~rhM0@U>pHnK-~0|Jxd zaMMiiOnpcJddW%Eq!knmaW`MU*D<~{7wjdjLVhj3rHGhg5rZ?I>LmApw0vB+ny0ah zs><*k*ClQ}0+er5=)FX@(sH#Q>0#Hs`&aJ)B3s<P(^#YxHWzi?yXqd=rB4bNm)LQg z4@h-6+c-O>@P2k)zl3N6{uv{PU46-;>&EcT^D|1P&s!o#8qsm$7cG~!uM54dQvc%g z{l+OQ6mg7y{|s2Dmuma={JZe?bCXvT>)kEN21}3Z7ujbDF-7AxEtd~{yrP>+U}W2) zb+?ld<Dd8OY3o9Y(|RNSz;g%fi^O>AjfNK{<yG(e4vH|IzbJ`=n<7E%h)~~Rk++!M zqv$QxdAnjSR$!{>#F{TDXRSqG@!d|}dY$}&3oK)qJmBd)#0Wy!ipH}x%-wT}j$rmM zzx$yQ(|dmFkt^5S1J1Ky3yImE5kXwjcx9})qD}aXCU~tgQQKZU67z7?nUnL~M<wUc zFMU%uy#X-9I^rBd1^ntJq4pY|F?#x1LpHZ?kd3t(Cj<lwr!EIP?rM352RA{$y*!^6 zxF>CP_Ua9qO%%UqeFn}Ug4*k|dN$UM3!!3<_A=T}X4g{pFon?YHCpE<pB4F5quTO3 z1nWOcRH1$AF>f3uq<Vcay8`1K9ym9te|<(1IgEN=@-c0O@%euCyA?MVCx@pa92QM~ zML_}m%+IcdTf-q%mDp6K$UL#T>!|DbRL%c;;n6vZ9$8g2#;>=rZxJdqP@XcIBCb5& zU&d_u8xf`qpqDomB*?~&DM%!cl<JMx<boGT<#)E^#!D@VWF!Pn1fe|z_ylY4sMDG~ z+g-Wq(ehy+_qgZR`WgWSWNXPC?A0go*8c&bAUlCTLqq>C^z-rGUuboK_~uUb_7HP7 z8z)B-N3a6~0K~R|0iR*-fY=rgS92E|=i~FxZ@x;CTlA>rjuZzQzo~~YsUbEoq~qZm z*OwA$i>3^{?>zr>Ck1->0m+N<D$u;G73~fv$PD`HqqqvH94A$QbL&erbZx(&8UeuL zrP~9H9O_TlP|b#l1q2X4nd6b=E~DHA5}~F5JAvr$kou7@3Q$eaZln2Q-9ksj2}gGT z5F=qBVI$!nQ6W(y(E!f@P>}#g04T^Dh=c-rML&K;2EtyEV6Vu>uc#PE05nW=06H4_ z@h>2RCU64@NU)(059k3TBq9t<AOIPk0LqVsOoE3GeWf6T?xT<q1A#aw<hamRR7xyt z06HlU1qi@GMnXkK#lS&DML|VFMJK`_MZy4}W1s^tpuY_bhylPxJ$`}hp&ajF0x>YK zk&gF}p)b%kK<FV%=neoK699dn<A1P=pf^E+UV{mMUX2MrMu+VqLyrQnfyW;}gYKao z?_&UvFafB@|GE}>4Knl_p`S!OenC0@I2!B#`j0nAuoFMt0HKGVzvK9ZSV%zF4@Ei7 zga36h{JCEx#;Zcyz!qRPur%2D*N1gnAYfN_7jNic9N5*rTy~rxkERamTiCz422;mN z+R4!k;^l^{>tc@%wy<!4xVoa4L%;anQu6W5q4#xzn3%h}xIi4uy|FFa9UQz(ENvk6 z7Uv+2&;)mL2sC})%f`Xo!Nk?w+1cKkz|zIZ!32f}HZk*troW@uING?OIM_hb^^a5b z9U-15j!upcG$+`vB6fB+v$rufakU1!Kuny>Y@q`M|CeKKE?`GjONa{<^t+whp*8YM z9DaE$6DLnch>NSWjWe1n#1YD2jd5}<mYbIeH0c2LXznidKN|xlGs*A#JsBdubNaZ$ zpd3FH7823_qy)f1qWS|y04yXaNkMb4Fs~rQQrO(WLYU72Y{6?T#K$Yd3lang37A<5 z@`3n-_#qY`=y^e5u&}wHxf#D8pRk#rIn+O51_l9;fOxQ<h{PoVz(L0b@M1y76%g8S z(XoIcKpYGlOk7N~6XF5rAtWpyHzB47GBzeQ1~yOx1qTfW1qT%m6&LOFDiKs{6kIeB zXonR+$413LMn}ehjsrX-LZAqA;Qmk+$Gz%jEqemg{=KIAS<{~KBmUkEemQ=Eefz!3 zPM6NVcfl{mkE4Bmv?2fO2mkmmfzKb^1OOoLIk^w=pVs7me8=N^;+TP5p@YcD-ObtE z4g1RR8+F+Je^pKLDbOp}K-&mI<*qk67aGqw_j@T8$S-aVuQLSq4<1l_Y8*K+)Gj=c zo1Ujh=!vc`xplpoCLq>#DfB~^Hx3C(NBpyWo4%7@4rDxEUi^g0z&U^*H!LkxWzVCw zT7-*|xkHgMtla>RE_!090S9h6S^xCvpWRJ?1NWFi<y7==YiYz9b`iBK_MGH(;{i4E zk`KChD2VgRQW^zhiP`Bji`cX327^qhk4N1u;>ypcaol-YSJ!VTw6QG3>P1Gj>r%Y( zL77bQb-C=4rX(5r84*Mjo`az{MPwgMiQcy9Ofruae=TOZZ};prKh6igVp?lP^7F9N zEyTqmhAnfpz^M(F`aX+t^w)c>f0Egmh+<do_6@SAr+t;Z2}eQvo5AoqHVF{D;l>h| z6a7WPn&L()=VYl+Xu(H0pj;)y<%xlDTBI`uz9n>qw{Y<`5p=uZ0r9cIms8hOlhHCT z5!BJtlQo294E~}^=)6*&Dcpi6C{`OV@4ZouTx<)x^Qk+Ar}3*R&kp_V`1b&oT+ER2 z25b7zz?39=S>X+=*Z9Dww?tNPB@evBmKrJH`0W2xECz|h!W+5{IM&xNbLWRSg?`lq z?CcD20iyj}XQTc2Ad;dC)Z+fJ$#@lpRL8Y`)H3zFk=(tZk@C>=dAf&=+PJT|Kc@Dp z6q93A@=?C!jW2lFZ#+c>Ad}?vE-L1ryvsJb+CF`W1X4y8qd=l7a%+T^lLD3#E)8pQ zzVSUTU;4dy{#1!YSw&?ny(bfHP4^oMGe@tI*^1BOd@5MFeEFVrNgejXc4MyOc)O1o zOUfc_6ZMZD^gq^J{~Pc+9})4!Xc}+s_;cb_B94`1T{pZOu3~v47l-Hk^NRR}|F_Rt zhEJjYq#RqLa)NtZg+x~1a~Q)&?Fy!YnmdZ!GxZKQKWlAnj7S6i+|6=(t7|Ex@8m!G zu5OhhEu_<GDvz>U5Ke~Mvm$naEdPx4H1?ocIpzg9p}u{K?j2%-zK8%pGJmzgj8WF_ z1TO;l5zHb#jGTYHl5D^h@1ihyle>2Xaer*o1F;|~&^(9Ep>Hqk84*OyI6HTGB>qMJ zzVvh4<Oyp@eV=0Da%B1mzFFP>!Zl3iF*E=}PGG1CA;_D3cNi0;DPc{ijjeA*VVKyF zUc|0$C^8U~ome`~H;?alMg&nO_nn4X`FSi}OtYg8DEi!Habm~;bNIs69mAr?1ZIp- znteQ|uGvMLH@kVS!l7*CgSC}1_O?c{m>CB}#$GN9rDQNO(I(c2YT6kQ#FOiX=c5UR zF05y=*&s7K6K4Q_Zv-;SX|ksl#Gb=jI89tDq8mwqnmPzbg!#)7*ZvO4Tqmo2Ij^U5 zOlj3)0~B1h-S|8B?(T9dRxkQIk7;s{4MY>)yNL?6w*k8n8k7i(5nOKy0QwRauTR{4 zEoERX*OOzDuHK4-tP`gNoc%;Fss5bBc({o*Y;Lu|Ic>-HD(&+q%Xs;l9&Rqlhi9Z0 zzhE0JwiX?!m6>pM_(+5nscC10gI?mqsk0c}p>|~^Td#T?rcMyI0?mH*tTC<iD)TCH zJ`G-_H}%ZpC5ec9R}!K2nt8vCKzP>3KxAIsi}&fD0S`Z+U(b6Xf2Um%NmSk5@|){{ zV|FU=tNf(XItwllY=T8x`KpUI=T%n2J%si2r+M@X?btDv4BiiOiOM-=GHHBmTChAL zBVq_+*%<vk6^-pn6-ITGQvCU8LTr&Ho}<zRip%z__Mq6jRG3c&ap_zflh+O;Q7dQ~ zCl%eYG_qt5N1u<31R6sg@y`39`SYEXxc#W+CSFvLgVbRHj$miKz=mpta?Ue`Ij4s& zFFhI0P4wCd*o0+<BW^?_DSWPd=T59j={r#pUV6VqToM-}PVRFY#XC<A-3j3ZxQz&S zLgKoBULT65r<3G!><KYtt706})Cc$8bU-EtvDFW-C^aPIPkh12ALm}k_%LN=QP^Ki zvCllGuXi<6JgwCEdl$bt7M1#y<0b9!2F$}7<Z()%);7$&qI?;}^X>(*>>QEOzM5%e z)YZN1t+i8M@S%Irv!7o5v%4KB$ce(=5e#padnV9p>Kc-WO2k2EP*-l|TF`gtp7OQO z{4NFNmMx0qi>NXu&78fe|DeJv9letMa~ux7c~nj)R_8e>$vVc%D*i(Gn1w$Y`M8~( z?iL6F<=VdcfB7QiLCer{r$KdNK>4yb_UPrWh8Rrcew3WiD?dAr{lPgNdb9tF7CiPy zA*)%so%*mGz2<d26HS@`z7nEb<1=w7k&-Ukf}!T0H!yM?E$J-nj-L&V9-xB9hAm{A zy=fOh;-99M^VX##l~{?6ZeKNP6gIPKTR0;`V_vKBfl1HCu{+C9_Ok+~ANI^vU{|v* z1SSodaXu`5Ywfi`h=vAj*j>a?KbBeMY{%$vJf0!KMZevETN|e-m&aWqOSC{SEL4}n z91S<kh*<a3ULr&G`aG{KN?()R)k0t#?;_eq+RO3vv-0-c$}Z6gLosA9_Y~r?a38Hm zJdQP83MI3<)QsDLl1?m@`|-ho&REC$@63gwkxOSp5C@JS%k=@T1Mg(6I;*XSCMLKF z5pxz&^b(d2ZEnYeVTi5_zyyJ~#rVO)+Cm4yTm3H9=YwQ;?pV6_K4yO&win+HlyJ71 z+AoKrApTA<jPK~3sv}8bVfLHue62NE1}m3~A25E(HF=e`bnEu*(Bl~cmFS6){GvdX zBE~#TPEVLh2IHrXEh79Qn}eNY0%q&$z+&=`fow(jw|1z|)H8|ZF{c3b>PO*DJQP`m z$yvnRm*LoS2wVYrqvq(L(J>_A(3i?rD_yyNe{Y<F*qkgaO?&6b@EBqJDasFV$ZbTT z{2aYW8z=O1cF6Q=e0;Wz3MaOcgkE-D!Fg7p-k20CMW_pBQzA5-#JO~F2%{3O4IP=H z^}@&Obd`ko*ti)izv3<#iH$ST=_qbdGGD)?_KE4Om!Yn~?IVJFPYOO~S{J)J$$i)F z3oa77^$Mmq5m#4hl~LCJBfHmC{;m=2`geN*skNALArUK6bw#+Vgb6-sXG9P*d5*o4 zkBG<ywdlZ>u1zM3>cJGnof3t3q}Y?HuG!@KtwpdZLWnC|O@4*qU9-`s6aKuQy4<r$ zKR=53ooa!*D#41j#GEx(WZ@`?e?uVr8aN3=ck7sUd-0gn6#v_+uc2byP4)At;Jl1T zYnrxpQ#2Hc;?u0f6L>)p(EGv+S%`Uu`Vz=FytJU2ev>z98JqBxU=0>W$c@Ovi|Xjc zc}>hJ8lhu8&oSzh!V?R_3{;~dFkc;-fzg2rIVW&Cpah;tlQ);6`sg!L3_VCg*YyC_ zPzLX(c6fD`xuTpBJ%76@LI|~vy+KWcdaQ*5b%C4Kt9wL9tI|G+i8G2rognXg@$C?f zhKKqSn8(W$#OW4Pv%IG*!MqD1^h@g{VV!S3w7;;Pf75*aRz;(#p%M!r9J@3kEeqbD znYDDV1tpRem&9$p?MKXC`#cqkS>?*x@o$PF=buK=mzGFV5EH8U%cAJ;cJugq3(4G5 zNBiIy$6XX^qV#?VrRu}*a??tLYNZPGoq~r1CtjXBdy;grDsnUJkiu;=aXG%U`B%-+ zeHlf5+tzCv@;hwD=F9O0{CdmyoD;(%^W3+0BNsjer=t!CtkyF!`0(#F-H)}y8aZ*M z{kZ&RSO57Qd<xHH^%mdP=b*l42#{+aeLJ^#X=QXVDQLANzqUbMqjcD<^5l^K!lXii z1M^MAn3i4W9Yfd+LxZN$--5EcA#-`RvoQA0NXXs$;&<1D=22QSLTpYV=}r50wSiBj z)CD!f4<GMSG;h?K78BROVq}OTv_ZQb4r-CAAN}z7H4Sm!gL=iI*XPz#TQZ5?KC2_B zL}K{!z2HZ$`u$f#QapJ}>x($c$40LAm(5LUUrm%D;XHc6@gk}8Lpd<WuH)utRSyUj znn7HWv5br4qOl95MiL7~_&x!8UQkLA(gFXDWH=6AKV~d4=@}7(%(n4Y9`tN=h|PM) zqe}7lWJAm*zc`mKx@#t}(x~x)Z+m`_fFiEaK?Wr7hWR9KhOca={$sR-hYcU&5AJlS zwEL@NP1k0b_ni?zs3p$V7gwNJ@8R_Lpnuz7xgmeCEbcwBrp>7F8m({NDH|)|1o0QL zvHn+num3%dilD5s>;sYg-5|+mbddlykzALZJXRahF|>wZrv)K`ywerQ39{GKThGE~ zPB<Kep~9l(UPz6{%&^Cf$M7^c(vc8GU(n!`62G8;pfI$+0hB*Q#1d>NBEl;G5-|q} z^NR>u@`>_`fcb>^EQP^P+7uyCUO@{pkdT>(g@BMHM2H`nYXs*14IUN0wRHJ6H>Ky^ zu6c+l-n1=wI%QeCVTjq&LKR+AM3s0(IM2Kd*_JNil53^#LrQte%hBYm>W~j>=bUTW zYl;P=L%UDO=Mcwv_Lq^*!Qa$1;tvvz?;0e08ysuKu*nlFF&DH8G@6_^tdGqh&|5gM z3x%uzR3ocvam`0-sdZmuJ-_%)Kt8p-0*hJOOm1Wvq@Gw8CoA-m_y6-RWPs*h2b1TW z8`ul(L}E79k))W}e#;12*c3m^rf?>owhTI=y#P0r{##IXZ{rL!9N#Yml`{`8qx-G& z&Gy358xPk>8}gn*6Fsl@AOB1^1~NSb6jJ3^SejCf0+LLhm_c5zE)a%#hewGgq^Ry? z^K!!NSrO|Y0PD!LxZs7~M7g{w!gn`v+coIB#p=@~*<1H~IzD1{o)+ps9P80vSf~e) z9s+YumcTlD?#Bif6BwOh@VVSn7pix(R$f2Y5J>DJxSJij5CyZW5l1GzJeXHaf`8js zSFd#@af3mW*?axzGs9>c{PPw4SgfOGq;!?H6;_-Bu}@$O=kw??JRkB7!sqXsbO&B6 zrM9ftRd0e=E7BtgpsHpUaX5SQneV;<hu%4@Z<F7BIw&;{8X<nr#7{`<BHg3Zj7-OJ zMpToXM&sPU#88Y)e<R?=?f7RE1OtNK)SKOLUUNEPFy)_8MXm#{Bgkj=mr+Ij=6q<E z^Yvq~vV~Tb4Z9r$9d$p6M7mZ|G}nrK!Zj_)OS5pE51BnRTulqo2-gpYXmKLdjlVS0 z&E$2vzX1&b&Bhy>xX(zZv(GG3axn;I1k~OnBWTrhE0~s(tg%0*RTs05=}#6MPj-g_ z2JAtc8je~)@wuxsw$Ao!d@fQP$m!xK%;wN%>L58yd9K;yQO_9>gk#-S0D2e^`jX75 z<Y#mdWw5g?hxQ_H*08Cx(W_3{nV(Pu!C_Gh+I}tH#_nZq=Jm$~jR~EWf%r9nWI^AE zFLQpt1AF<L5ka`5ZEmA3gKoCv*}R=^3@k0Pir4b!V5DYjcg!_sa5<$;M%;StFQZQW zO*QO=8<grU@aYN4WeZ_dEV2iysuU>%TT+A>E~X+GLp5+#!z3bEZ}c@Ed6iDqZo7?% zd613G3*c*g>b@H@p2|$$bPH~s4xWJL`#^86=i}Ji_B+dw?ROGI9vAV{^*3%za37^= z=2?u9qS2l#T)pVdx$rlQ2k*(XUJWKs_|l)yf9Iq1{&+wZ>V#?viOz9r!Zsk%5a1Bl zFu;$l6vu_}C_cuj2rKC3ffepX;p9r^NMWfPt<Iy#pPiR@BU=oA7%pO0bUrz5@y?vL z3To<d(Q9=k(n75ZDb8o$QlvRHV7jyeb_2lvF!F!Im4|Ol)^jhY<9Wnnlqv0D?Oz+V zf6ggM-?iN#dP#-sJ_9-2`Y>Vz;oq?P1-D|S`U0hw6?a{8f_>Z~N;@_<uKJ!JuUI>~ zM&9-!tWH<ET^WKHw%s}1EJp(#yT2aZrV|%c*GiClc|=_3cgvfGBWTM>R0eK>fVU&; zDbPD`Q|#gO_{8AvZr8uIE$hst)zF~4^CrYdO!OY@zteo8P^Rvx<2)E!vUJvx^!2Yv zAn8td-+KMwlMfUCZOTXT3wKZTiI8bggdD*q)ZTL~6O!r%L=n+Eqr=m;Ufu1;FxswJ z4mk<>0?m<&%7H(-`e*0aoSM9$U;Tffdl2M<Z@EamZlAG|C_Pm`xH4bLl=U@6%EoXq z$zK%xlW(qg)^GUWqlj(au<_;v5~Z}0iZqFT%+?mLU!@>^k<a*<e<M9c$;^V^oL9sW zBn0I#hnS1<3GhQeU_oA9h&e<MYz8efY-uS7b-MEki3)-(EJdNUi1|f9!VoiIGcX^& znW*J&_~7YpZZo<Xa7mWb-^&J+lnhCWF|piLlL2H*XxV??{SJUzk4LQPi3*e`unp=f z*nKdmT9VM26qQ3Th7wy!tmODz<_7K)$u*B{3~2Y;MO?i69Fu9JZ{_v3`_=RufcGM@ zo;1vab-IK1-Z;mIa5e4YoDo69v>z~awsHE05tcbI`T^cth<l}J5cv{_c~kOvNfeO= zW>^la$nCvV83d)M>r!Mr_?EkLHPyW2`W})59b=^aG`eMlUBkuMOv&s9D>w?`ztT+q zH_SfXaneb7f#f*b-_i%OfmAcXn-u7unL9fl^S-WpS6SA4jEaxLCYwQ5r9(II(tpW) z3F|z*153meWX9_^IrY0Yi&3+I@}du%80Bwt-Mf~X-zTC)?zf%WNFpE?P}`(T6+#W{ zhGWwq(lecGjCbJ6c+}t*_~bd;CC!lBtZMEpwTQK0Bg+(D*+Va2)fHG_1jLnW`M#b# zOv)28$Camnl~u-2_FlNIG3}O7A9e^zF*$u8#~BesZb)LUVobVsE1p1v|8TZe-fGX0 zCuiJ+x2cjuYv<_O&vRA6d{c;9iL1miqF!M;K;Pc)e>vp<(YTwF9pDdW4k-|z`er2T zI&ww?QRJm`AuW-UI6u)%|HX2SVv{x{h7?_Bof-Q0s`_1t_7#p2m~RSk*?*Wj#aj|v zYcu|&`21Q!gFzL9Sc+b~{~vo_0T$)D?LRYgNJ~p7okMpc-Q6(2(B0h#7_<l?B@!y3 zfP{dAlu}9v3J9o_A|VZe|6$I7z0d#dz1{cRxqHsTz8}x?%@;3Uto5$<TWh^*{T8{5 zSVACJdGo#J8DT`_P7zC)vk$k9ApYd7jfcdBHYJI7UvM6=V!u7#<OK9k&`^aBP5H`c z#mEV(l__Fc4{xRspt8O^AU7sW;8hu2C!#40TC-*|ek##^?u;;^T87PZUAIPAGW9{z zg=$NIS(e7tKCJzfM{fCiez*(C2{F}hg%f#kfnTVlNott{&XZl?th@y3_$Hcs`?7S) zpy5}E&)d?4&*Blr2t?buVS)8y1(eQu9#z=tQ$-rQJFK@g$2XU|WG|~z^41#CEuEOU z^A&L-1vYqvY6Wu(BG6m!U8DQGpI+q_#dQCO*Ko}hj`eqJ?gER6m)f|vKIfMy#88{= zq*KMc>#&iauAsRz?r-P%viQ!4se9ZQ0QgyJgb@z8CR5j!*mG`?^+wBBBoYz1?hLk{ zjL0oRtPgx+77VM^1v1IYIdNdr*hOCcDqj58gp>g{9~ZB#vfk_6tFNAb8oy~`4;59v zn*NTiXLUvx@dDrUm3&PH_VQr1j*oLT<3j5^2uw3Tb%R3qWdV`cB0<p+d?-Pl+f1%m zu=nFk=eM#Z%XHt*;YxiuMmL#<ru=G{CWhir7Rk;CBYJ(O04@ESCa#1YHU!*QDPK^> zcy?4HS<zH97{Zw!S~aq&z^k?(FS7L(&rEMfPrp{E48yYBR}9w`p&>t=9+k#!smOqZ zclX-P2qOkWBx?nq=c9QoQZX<QisVb&*}FsZBPQ?qi?()PJX9Ff4FK12kO#x_z(O*i zX_}vk<9pJ$@`brj%c=H2i|7Frye$cr#5WVIf1VM)%7GaMlX=G|NDI_vCbm|nLVev| zIL+tKJqw+oB`IrKwgOzi4W>N)Kpk+(Fl|oV#c6X%l~a=zCsh$PDZTf@M5SIr?MGCD z#QvYZ`SI2MXaW5vc`!yE;c}3-kEGbPIp9=yEeSlK*)Gq&A|0loInm!P=6>wK;K17? z#J4%;DA&!co#rK6UuX8D>t>@ddrf?J$U90GVxXkR(;lnZk-+V8X7xQ|$RhV`>!N^J zCP$J7dLdx*?6Z=!vS#1fwLU#LtLowCGiz>u0iXjG=V7Da*2HxIgB(6%(&p{Jy>Q3_ z38@-**^)~Zd|o|2G9lng_v>j;K!di{s;--ul0L;sJNVD{;a>^R9{%&meyOOfr_l_m ze5+e{a@18DPo+iT7ziWu%z?}&dLy8ne(G(J<0SRVSRXJ$(AL}FSz<1OKHvD8-=A5W zBgUQn^Edw^;W<8s)ZC?mx40L1`R$g<aXuBaU@^|>PU$vog*9@th%tv@96j_HbZ~-e zc*rXUC+C2V52|Y}xG6fyZsHX*?EE1I{G$3gWyXE}r;H4-W(Z`&zcrHm&oecI4LFNm zT+lIe*LXR#*xjAtHb#3X<!RkGZ^*K)W8K@_(^;YuFj4Oy&`3h(Qu}>VM+xg!)f#0N z5+rN8ZhTcph@zlWkYb2b;S&}Rgw=V0O%n0g3h)XD3EJ^PZD7@Rpu#pnHbNpif>2u_ z9y?w>5gu!ZwUDhaAFq%N)JA|$Pz1IoA_D!5S)v>M^>y5(kMeH!Tr+%0AYEhXwK08{ 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 wP1P4bTg(>XxHV<2s~Uy=60h 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%0AAwn1t9oj0&ItO z2E(Lope<M_FfM~Mqn_9o3gukEK|v-)@Rsr_#PlLZAq~sMMz3j{;yI5imYho?c@FZY zXj*C%xytS@S8Msp1sLOgDV*8eTqQFEpBQ&YO*C3fjvnwtV(%p$lM1I7dED>4E|6#| z_J5J|1KzSJg@99jE((<nC$o;{-C$pM=f`rd04X4Jvr+|7iN=k@+ZJ8#<<<7GbT~oq zIIF6L__jV%#IO*>*L6=fVo{>PEtvRN#kcb+U3GhvGD8ZrnJ;>egtA#0twlK$)O2MZ zWvusiKTwQ)_l(pBXd4KmRy+jl+rqFIR`%yK+heAR6-^JeCIx<`G|?7KqNf*PiG#QN zuAs|V{5AMpLoiM8Gb^39gU{<!rIzcZeOq6haUpp*?}s%x;ixXl)bYeyUt?K7N3^Se zW*^ZNPkC_6D2w|%D$>D#qE8r?n-b$ZYb#Znpi}&gXav#zF_qls_({N~dCHUz(Zj(G z$@GC$4xb5~7(yyIA6sTL4iF=NVM+QFJ?cAG=qR@u^6F#SjeSw7eQ}<hU_5>_iLB>( zN5<)fJk-b3dIB!@jHqHy$ufMQMbdACFr#KDYG~VYs_mf6)@qRy;nG|mCT$4EgT~Wu zU&bS4aZPVWh!>m1A5e;DJ3D=S@@j4B)n|kjtuNVJcSIwYDUOzfv>s+{Q{v`4emTc0 z4J#gvLKHvAg%aKRmgZ2LD2w8{0dz2(7eukI&nu<gcJR(s7=q;RsmS;9FL?&|@eoxU z-boJ8SgUUQ8_=^~bAlnvVMs(z#ZIf4!8Y5d=Mg39T-P2nqNA}RNd_-LCB6cKf)8}M zau@y@Gb}^c)IZVc(C`7?&8;EQF>9Q6Ee36SkH;=NAZd8%orPu^GYhze=YX+nya0_l z?%}mWTiy2zb=`SFqwhXz1ucD+L@gW3Vy!G>|I}M+^Ny$^C*IIetmxWa6>LbmfhgQJ z5xM~Svlj2DhJDh^&f0fizFoQA5fEU9gWrV;K_dt``-71F-A1wSBj1eRNIip*Dutd$ zXg^mTI6*Qv(YeOn5kc@i*~GFgMpsk&dD8G@aPuTpxQy83Yi}-m`moLjGsP`09_Z*v z|3qFq5N63k_;?vDT`?!LX;My#jCf@HcOp;2UqZcW)@<tgkizlfmVgO#74ScefC;qG zB>%zj)?8%A{)MDCo208+Lt+IR3R(kzm!p{@Yxjbt6+3G9n&2OFg2>{d_exTKQ)+YY zMuhWhH#DOL9fn%D9&>%8!8d7y6#9;sCPC6(!nrVngWb=H+3XIINShGMxRKoa72*bZ zTkmMF!2;iAU61wx9hSDH?Yl1Qk0+0OLY>Rx;b125>m(=1<B``%ksYx1RCI;!h#({$ ze=GZZlnI-fxh`t6VFW%fVN^V0IcdU{wNEZz!iG!G@$fo`0UeS)$UI~~6D(^rbXMeE za`nh?F4ukZrx}+?!gme{-YJ_BKobP8aekU15}$NP`ynN{vQ#ftttb(j4IbmlYjhmn zqiHq~$Zg)f!THTawS3$mt}5Zm8+tK^Xw2nNz_UDgKOr7<t9$fm<k^))`sD&R?HDCp z-|gC0&!wb%)NQ@$x(DAvM9-w54Ut6@&lEqryUivh840vS0j<53UXjTQJt9XkeC6Fn z*__PDm-tk88Kx=9L=ykUkKOVt)v9mEm+Nr|I^O@R_wVad-l|b<Q05XLzjh;>X;|WW zp6h_g)>=L9`O_Ebt_b2d<R^1I9&ebBiS=|xJ|OrVVz;2tK<LX7#*sBo&B4#fW!E7# z=*$ELW=-S8*)dVZ>XD{?@`T@#z-s};`TOCqD$d2+RW&<66U09%riCb~rybC2x7Q2@ zy!s*_Pu$!Py|8M|qm6{1GHyy^M0BOIKrE)cS8ZeR;84KH?4pCf$y$tHBZOLC6@nKO zi+MOus-ndYwBHI^?bldU!lPofSZ}j`&Sn?u;$cpURq=G4!xR%kVdu?*O8J(Uj_XYa zIs`9<Ylv9;b|L17nBYcKoDBdo(<Mu+UiAGEk!i1?{r;;vA_(m$oo3SP(p7``$Q`;i z<i7ZM)=&Pe$&ws2Q_=;R_ZSKeh_6vTpd0;;(K|C&%_cSVGzXGVLNM{?g!6~s@2Y;< zi~5Jk({Z^nKobP8D4lM)m*hiC{K%kQyTl+iwnXxp>ncY>dP_)DMnMLef8=?lb<ua@ zBt%eUVHLo2&R1aRWt8Nh3RMUe?y<qIdz(qUWOjY<*yyT$czsb2mleGu(6IGEeHomR zEPdqsriz0WpR!E?Ke$x`ER7RrO95KrU`~~6|B=Ezm3<-0u;ipBpZM@oN7-gNpJ{a6 z*{kx;V5#Gp*QEcT!`YaP7Y}4$GfD>1e$uxZ#jX`6zo2KMi!^Z$s8J0oj@bL-g7{6+ z*Ctzjer;1TjN>&|8GK8_XY29Oc%edL^ZSw)2#r{Ltz&)uFWrT%h$sK`^~b;bUw_W! ztSL}tR&3woF6c>Z3PbyRnV|(wc{ushY#C`(r|8ico5Uu1TSc)n?KSKTbRG5s5!|bN z(nL^gpYLt|2<#eGVs!tSV$D8!iW=EAE#(eO&WZmbNPCFK1p{N4C0QJ9Pxl$u4%g5k zL%T>T(geY)+$;q|Zm=sz`>GbNVSSWOdQ5>ccVx54tCOWyU>%<WnL27wO~KLI;{XMd z2Fh8|Z2|e6V&@&4gE4H+$yyJyTg%j|o^)s?&5hoXJ?vXn(4*RDm=0~CLch=8u}UWg zcqEwXsU}=S^?4VWJwydJ{rYqT9mjR?rZ&7-j?%z01F7+KD+g>9YuIW_%kC^h1zi3P z8OMJEL;D*`7AXPu0rJi05q)-5Q$^+et7m+naI=0CZ|TOM#XeDv+?;!0f00l(sy<>s ztbT*bM{h{6B2~&eA^k%mZqamL<BMaDz!p*tNNX?<QyLUM<$K=rorU1hY1F6$(Y%+= zw|2Lu{vRcg_joNMzf82=5p{ggQ`awBNxDYhyLobd4hf?KkirpK;p}G8Ov*zM9>8EC z47jE-0-ZWeNFlIwXd`FgQD!3Al*|6)l5HF@Zz47n3m@ru???o^p>C+|zy!f1y%p9| zmvgO1gc^f={Nh7E^_U^b5dJr*%7IqHZ))7I_L$>WzQ)K07ajj8$1cyr$8f>VBUEIV z;CH!W0@5l^GsfG&^|*fPk6gIX>$B|2&Kb(D70vA<5pe5{zWsqHFcO-PgG^u*ZE{Dp zWcngnn97gD{7C93Dnm_ZG8tsZA8)7Yc+}psW06^gSIiuN!(1-QA?OBNX~1G;(z2De zfxTu+-q_n@^6mL_LgFaMkVxAuYYoc?OfLtN?q*j0Y#f|F3n^C?-|{T<sKFEHnBk-% ztXJ?q$s)T4`d#ByxvoKQg`^`Og8Y>GGsOE7zkQTt!K@kufjvyC_mQ^@^9}9Ar|~lz zleeXJL?eozHc(Y3sgQ7~5pAbo-Xjc)cH-sCKj<|I`WfiGhI@;>0wKfopM|{we%YeL z_1i&<eQjd)JvSR}4ta$YG4zd2wTJ4i85^Qg+P5Ur;$;JVW2R5mzN^-EK&6nyW%xhz zDYv+9JW<?((q2@4jXk<H)_~1qwqK|o@-dd%=;&6mUWo<}Y8}KA1dqQn;3X_0rWkcG zw)&8tc1Lz+T^=5|ix>gzX-Q(@i%&)?+Ug|aw31Zl4sc;f&oU_MzF$aPN2Q?Kox0ew z2~TNfzfjI$(UaxllLd6-YG|)t^rcjud(fyD0&{%Oe-xGe@28)qQ#;r~agKSFy*&Ps z=RlffHnTR7+%i;XcUDkdBRXY$ORjd)A>t6yoYomxIUJwO4GEcQEHwyg&9?#F$)AaS zPfVVWC5law(~yaiotd41ft8ulkdxg|&q$BSSkI76kCmO7iGkCAjnjz9$iPsalT+W= z@Ny(NJEO6o9=o2gJ{t?0p%I(WuhY*B|K`L1GSG(!oZ0N+eZ|9y)Y;8{PLSFU+X=P_ zMXC2;B9c_z1DZkr)0OiG>9?X2k4l(-1g4O9sHR~~HEy_WYUr_>VK+k1yiclk6T6x1 zK4Y%s(S`_wOX8>fx?#+i(CJYXi;nOKVp@09srP0Tz;1JwzxD0@$NgUkOw<l6T4L{+ zZjw-xJtHCf(szRGbD@j**0lH2$diXSCz?Q8G0-NqK8gGF$r<mDbF%z|xFq>E>1vaD zi3dpXc%EVok4`oS+v<#Sjq(Par}6o0poVFb8MC`**2a-`j+JnLc*f?q^~IqMhAb4% z*#OW4@&9ym-OwgTge;JvwD(GqWUJt6noZLSc5gxH>0G>A`$-agkGj?gmH5F|5$fu9 zZnf_Wd##bj^3iJezCD*!c=Xk1xa5BHTdLa)23S=?EpC5XJsoIgsA%{MKmBb923zK2 zgm(~;VSOp8kulJI3TXG#67{mhs_BN)`Xd540|`l<;$e)F$f6gH;OI~Saj+!fLlM91 zDbRs#D%SWKB6XL7a4dM6keVUWFa%yM=PxKvw2hxr7I20x0Z|bD(XsS@GbcA>$rP?M zy5rHL5~JiU$_qDoqrTkMRfnZb%{D@B?%?pNWN9`Z>PhlX23W}Q6}o!e79)dkh@rsx zb@zOHudLPjgARanT-69a8Kyrfqnc|RM1pO$qGQnuI3YA&Xx+(1n8&+7Te^Q(|6Wx* ze0?B=&*&SyXHktG?B%ht^RB@&H9La>Ec1){;gzZZvHty}h67W^t!H=GGgU-W6PiCn zZ|fTZ{)f2tBH1q(9uI{A?YDwfU-$b`np^R(J$+Q<yNd)Ay;`?<Fj^0{2V)`V7YE+4 z-gYpDG*yF$T;WgaU<Romp2PH-7#=!UR%rB(Do;l(@hWLpJ4#x>6Z-vFTlScEaw~{J z{fT_gAlm;Tf`AWj%uzNqEbDXD^in@!{Q{jANR_lblKs8b-~UUNI4O1`&2`ZibUhv; zMzIp_YB_l-xR)>;2De?5!Jj`2J5UvW?tn1!9{*Sxh^FaZOvz6B>2(GNr-y%{#G>4` z==bQO*OVN=Tj4rEp0@~JTB3gqer`PPLcnv(Cz7#Bsb-z*BX~bje-in`ebs2t)D+QR z4RX(n4tBb?!vP2y@w32t)4a-^_})Y9IXSXmxf_pzlh_FsF}B3*lx*Y{RvBZIymJjh z_B1w5tbIM0;tUe#|Bt=50IO=<*2h_Nr=);%cXz6EH%NyxNP`Fn(jllwN_PkdlG4&C zt<v2M()?we183iR_qp49&N_Sj9`=7eKCA_EI@g-t`;GC9Z;W@0!Jk|Z%pI<f5S;V> zcgYsL+3=(Rf+?vAWM0`~SJX^@r|&M=w-ABeiGny)=j$hL3(~hrj&0+QLHN0Pg0Ym* zj$!_Nv}UNd+HH>%OI(Y~LW+p*2b;?e!s@*sGi6RdN5BQIlBbV%U39Dsc=$9fr=3f) zg+F^ep${%RRYgMFzx$XB`KF-@_~Jf)jfO74Or|+9{ryi7ndd_kyMjZpQ>bhFrjoMk zY2+Gc`zS+W@d_D%lysKdgh=qLwx~fH!BM@oPSy^s1zllnTm2s)Yjzb72Qo|hr_Nwi z4M3>m!5Hlb7DSLiTrN{}Sx6vE3Qrg~wfAqPwcCC=fLk;6N!Owb@1=}Cu){6*$TcFh zWz~(-42N{S@jOBsAzEq^Wi*54g;`3O^(Ia3(YK_ZXRyjp8UC|^#u#6k*H}3nu-a~L zh>y^+))q){HDmEhhbqOL>49qm_<Bv5zShU87tC!@Q--PR`?Q}r+aLBw8@kC>ptPW$ zNO5oCmPmxEUgHp>lJ*E`x1^_lmy)8=<VNon)9Gi_)U|N4h-j9G^f(|R*(co^Ogl3A zsYhobFhxXFQ&LXJipdYo$2y0HeRNHWSr<HEz1XZl1_VeQ%E7wPy2*~yOpF-c9(24! zc{kni0c!e{1HwDOGMT(O3ixY>^3!Y+-l19bH>WFRugDaL+MhMD+gm=(R;LS7Bu#v} zxNz;#1K3x@TsU0N?(mx%o9(N~3k7iDH;dRD&p5T3M;jZGXaA-m_8(mevJnHXd1Gly zH8uZbpTQLa5=U2Cl-r{9eq&xwNtv#0N)Xq!?J`rpIB@F(J`Tay`JtT48TuKOD7V4) z&bnerRp%PH(7M84`3)Ewek+Mv0)$h)T;DpjZqiEJ$VNWpAh8)if9rbh%<*e`xzasT z#T)Yme8Is#&Ab71=-MmT?O2-KHB*sAy3}sIR2}A%M0Gy`3!*D>z0gBQJQ>AnJ>rP$ z^5v7|hfICjyfv@HFipV*iXt8;^QO1}s&EBTXp0*?0%hX=x++IGa6XjS{X;CQ;F=`7 zARUVR8MYcjJwxL(>TmSO&;RpBSKpEu?5Q!~7L1&L6SEJu5ART383hSJjI*egsM7NO z`-((gY+rXFFe?vyg>Pn(?p5LGTPAgt!^mnZk8Mq>jR^~)^$fkm(Uj3>l_Ccj5TINI zn*qU|*+x~;^h|r2#7`L?!D)6fZGJ=AP~HrYl2#=?_d2_tzT+gG>y`40?f2wi_UdO= zB;#9AX4Y)bNl+OGJ~WJ_blptfm~%{Nc-{;`8w^D}ZliqByO6p}o9_koVErz95ENh6 zT~A*CL3i#ez#m=xN9Ut@-338ki4VNXrY~30Zi&o3tJPK`Mqy%eaL(*!sr*@T-T=xu zk$^F+;`+m7AT1YsRYd0>zZ|wr(5<ZA6@6Hs1C{1{_Q=Q|IeOS3`h%yCYbfYapTG=+ zKq-~M8uq}qJmWLp#5-XR+jLlE0T!!6aND1wS*33H(cmit_}Ab^2M7FcPN97m*76<! z(}R6BR%xxaOA`Q%Dqi?mYbA^7Svv(v4lrF|8=wcKI!o5{kF^-tS>SwCI`lua&;}le z1%6nP@{<H8J6tAIw6K9p`-4{^Ubnb5P4Q=$BjPwk$c+x!TQnd65ZCdf9&LXmBJ-r1 zMsD{8vVy_48O>x@&=0Uy+<<TEs(Z1!hYY2wTs6tTnLRD+UEN&!6%}Ma{9a5txWJqU zbGXxGsO6l{u*>rvYnIn5v1!#j?=jKWPj(xCG!hWTq}d<%dk9V3<A`K`B4wiIWluzX zhB$O!*?F${z*z0UurA1+6}*$Kuz3{el=>6Sz~{kvndVIXbfu3>np!+M-{d~N*GPZ9 zyrGN-<}{TI34HpPZaA}mvQ%EAL)Ybn?g|HY?RqbtZP>X~tts?d0z?tFcp>fAlY8z& zgH%Q?l#?tf=y&(R*U3@15!hlhC?b_<z5*-gfKLrWLS(q4rmafA)V&Ev@3foSAtT20 zGJ$O(7^Pdq;7HB;bs(VN7;A9X@Cj*O_$MsgtsS@DHcCKY;>qVY6m8*=#T&5|y<u}+ zwf(p{Xo9Pt`PU8_)ziXR9;JrwIBdioH1(5YSF0X2Mm$ZNp}Qd;{_XmI{`1$r=0B3# zf<FbUq4+#M$aQ{lH!`!(CK9lpH1J}8Y6a~`pnK+Nfq@8gw(-?R{%Hl!K)=<lzvMyF ztvw63Fon0sPYeq&L5mY)zXWJETr5&QvW>gmtL&7cV|Kf<AxdRhLS;_`!pFc3Mnyr( zjwh%<6@H%8@x31S>qzwV@Bj1l9~{u1=cbhlq$Y<?DkL_FTj+MrTXwg`9`tBnKBtV@ zz2Dnk_5RmU`=1~5U;hHm{N~_JxuR4N=W3h!Jw6=AlK7^o5bDbJ^f5>?er29bGN}-< zEpLHR4!-^>SlRe4_vlFP0TybVENKyEjCj<9W**^Jc(CT1w!<xw-4-Ac?6pxhI*R!h zM#Yy6tF%ARmM!E9upHf6jyD>B&Qx@#69fh&!B;s>9}Phz7YRb=e$5k+5Nvj6_@>T# z3O-vno_hM4kCBN$M~eF$W9uCtcp#|8=3w?T!?$_8F4|@R_B$uW=3veDoRZY}Y{r$U zpE3mqfM$ehvWe_AW=oY>q;w!a;*+7eH}Iu5CTyp=>Qh<tf3wDL&7GX=9r>7<f6^bB z>>M5gU+rxlL&-l>1)v$*SzDVLJ6YJ->f0LHm_h)MEF2x3O&x&00gy~g9gQ6<?61!M z{N#JSqL{gR7>023F$h-JQIlE4+pmY%#kyucT4cj+I9q^llKxA)(tkhQ0b}%|!&;QB zMPYz>37szzO{OWSRWeuPL^T;&Q-d=t!p#DClkN~a)VLm)H!I%ce3;hqTr~tS2wrY& zX`9Ouk1OHTarUw_E2{~&5hpjBsSz(Lmnj#op$QKc7mpF^&&&ok79%zuLryMEHdZbp zUNd$sUKSG*BSSVe7BgcuV-{{sHeMFq-${4)qar3C!~vXv^C@ceH_a$g_hQ~<?yZ=O za#LqmVZ1_n!O~pG-KIEI@22!j02n3&U*BQlz^`)!&a@S~W^(mC287-No^IctoK;dD ze)S}>+MHwp84#d!kg5dFo~wD=N3BD%Wqt9QHlU6Q-4$*$ec}^saj}fEBumfZ=Ei%q zuM@<U?%WNA>!e{#G=_~oL3?{_sBj<KO%C}ht58*ty1;K2cy?bL_mH5ey!beW;0@?L z?}rab2~7K9V#vxWsw<>CZb=EJ;5E!=#XixvE6W7KJ3454f;EsIp>z2STAh=n9D-Jh zZdFm{-`L@Ys?)A05j9Z~yI(omwUamGgNu17`9Bp_@qN?j{o(3!=UWWn)od^?s2wd? zra@JCtyC}k_+I1Zy$az(l{W`PtuO9~*x$b;-7|xay1y^29J?8%1umJtMmd50+VJdn zHd1p`U_PH&?73#8Wp4>E2n;@Im5U0?KKY$xXl(nmao9i!$f0yknV5*6w(z65jb*93 z2q05T;B}*%d^?i!?@*sBsYYhsqdGW(!x9uem7c(`jZ)l@ZDX>3C@%waqi9ONC4h(H zCYnjL<6TS4dDrMculT44x<ip)1+Rh#<hBu=R<&Rg%IyFm1nG^!;1`sq5%!<?>LCj0 zT=ez)zG#T(ju3Z}j`!`L`7AF%0I5~rbE0Y)K69@R+!Wj6jYZV6Ek6`AG1}qKuF>aQ zq7#@LV5GezK%fib<RhKz_X}iZ>EIK4*s}=r_9Yf4(B*QW({1g%y;Td;Z|#rYdk;>R zLkJOzWP;mp)~fu@F=MsU5~P*Nx#d$njbLN-RQTbtSJMcjWI)y@_=rNpOC)}pcKz1$ zo!C49rsK8aG#gK$mqWfULMLkq>uNCE5{V#3v82p>wUA)WmfL9}BKQg;&X4TVGiYTq zS+`=2+K+C44`RSI0(=z?FSb*Lu$jZ>8PgRJlMBfTzj2pW#rx@WA-#ak#Uu5h2O$vu z(zg0Pldc&;ews%pBCJb=_n7g_=~Bl;OqE$QL_KEE6=UV$01VMpx+W_7>vOl`GD@XA z>;Q-U1MX8C{=;mx?tTBvBFnlZ{w2V4Us><G%jUYHC9P)Vz$z?GNg|CVkG8-{=$5di zt857fhYpN8;Sfre%QnsVWu&h86Wk^F7h5uUp45Z16L?>-1600p7qypva0f20G$rbB z;IVV8)Z|$`M$X@NIAAnxDZAx!avuoBQ<7H9euh&S91SV|bs+w+?FgalJ{o>aQ_+dE zRQr_X3zaTHa~tI8%U+sq$_)`%_)`W@mBP|jieJ#}lPI!9CI;J&g?7Ar1;x0b=QDdz zy`2>mnRMFqKjRe+!K^F_jYrlTp7xTKQFjeCpr)9&rxb-drB^%liYu?Y2)}lKbxENc zZ50cFRrXtx^wuLyO<@j2K$Om<v_up&^f12vG5;oi(mXys13a?;borCNnFTC*5dMiQ zFt+^`g%xj~L&N8tp7nl*lnlkel>G3mW8}!A511GYv8?HH|Gih^)9H>fx82H*nNOl3 z5GwhOWul&*QK_@ab^iJ+`0a<ER(j0MU=zfTNba8%k*h2vb3vM|>TE@avC<11ls0q< zdT3rv9i_S=Ik7JN#O#l{mfuB|8?gb092alYPp9jq^p;~bV}Jd_|7aqDbqeyz%};)% z=aW*17!{EHX7pjA173K%wGV07%_k%8#rRF!8hncAuMxKn;VT(8D1PJRFOeg>ho>8g zq~66-UsPGHTHw6B>`l=+{p@Z&u!I`;0x7mf9#7CdOt!W_`sl8E8%2q^b+^*r!$EjR zp`K*-W2fepNQ8i2M=;Ff7<v3U?)-LYG&w-J1*%jb#{ixRO)D<9{wQOX2nYoDLW_L% z_h@D)kot+H@^SgaBs}?JPbF2k+dG6{sjTB8a+hui5TZt9M$i+*^-K?)HMnPdT)f`2 z#w_Z-McIv8+K9@>rQw?<1r{9TX_^C5z9XhAJe15U{ktfhu}g-Gv@4}f1}(%*Y2SRa z&0&%k#6@oj5c1Vp$z707rO5(g&PiYON1VULgBxO)3N(7q!5y4pd;<jd@*V#oKq#<5 z3Qf}XqYmCj$RJH|JM9kHM>QaRffY;4|A>+0m74|6Jg`k0_*7HUG;VE0sPNDo$qlHs zNNSfk9g85Qq6R*=@<JHIko;*7O2q$5J6}~dre|+@D4T14WQ=Z84zgUbLSW2CCP-xl zi>I0>N?h%HrNbPap9OZhkY9-HW$vP+-6M2IP8DqvW{FrtxTD@|17JnTu-lO2L0IpX zUv-)ug*e-Cx0_~6PAPn8k#lgct^=~6`yHNwZHUIE->DQz{~nB3_X6J*vZ(U=4XD-C z=j1r@PzjMj8&@{$f1@F=T+<Nj>`iSQO%0hW?3f*$44o{DnJsJ#ADcQd+glqNo0{8M zo0vK<{hgoiH(MAmi28XV`fFB;dH(wVVlIhjZF0J^4a`qYWO<pwb91lXg6vtr8qEkX zEdUIx$ac`l5zH*TK=|Cg$&0PS&C#S~WThqc9fGm4Kywnf%Lkv!5XLCIwbqw)k%x47 zJ1?+lbiAS0d|~7hv0qV@oVGMI#w`Kj@psoaScp^2R?)T6^i&Gll1PGrPG+u?Cp_F2 z8?YWXVWmn(^Ca+WwErSuB?|!286juK1p_~0q$<-Ln4ZpV@4;TPiJkqlO}Q?5b7kfs zpiKw9Y!w<UHOB?lP>T>=v|;q*EV)Z0a_7y2Eko2;5yjcyK}?WI1jw1EA(npT5-3%1 zOD@eN_&mm*Cg}?TWh1o_tn!$Oywa?r*UZz$EU+Hg5UE`>D4lQLFusdzXwl@~)nH!C z+^_qbAgS^4+Ft>XpG|O3L2K4Lh(|6>obC<_ia!J-JTkn@7`DNfIwV!R&XW7vfB2)T ze|_M7<E?Ss&b2RPpp&Ez{obt+!SW(6W0+ZCKXgjX?+I$*eeLV$7sOwqb9IQv4*%k} zde1z4C)UogNWABZ+0Dqzrrzq*+w7;s^;kFUVZm4Z^iOLK3rYf&Mu^w@WLqgDg4cEd zI_NO$S(5tM_kF%P!fxBb(D^`cO<s$R*4Q~BoC8;ZtbNd7d?H=d$70o_I|Ut6+?k@8 z+&mRJ*P;Ufs4(sE_^Tv7hj=I3&h7ii(iO>@&Ys`beSS%dGGwAfjM^YY9!g{3QCWww z3bb>;w=dB~4VZ3}qE@NRcM2|JsxpOd3;J?8N^n7h>c?`{G)D02%IOB;-+%MF#&xJG zdHqB4sZ7=G39TI~Xu@Q)N8V;Z$;+&cZ=Ut3^<CWwgvNCe2Sn%*d>OwQqO`(~(lf%i za16(I>uD)C9IX!qwommz_N)+)|E1I(j<}tLt(>9lPut%?)xp%z(b>UW+|V8X_cm?y zP<@VbboCCr*4c5Xx-X>Uh>W6$&DnIvX}v&o@(l;~r|AVeNJ7Gj>I^tBG~Vy+R?2&# zRt~U^5Iu~f730-6W%%&2TnqxsDa;6Q`a9MfrEE8aIc30v0-OOCr3-S~JL!{3(hOmc zJtJt<Ow79xj|DIFhx-Aj4t<ML9r?C;g+(tskh_c33`8nDuGI`TQ)O$0I-;RiCo@%I z%~}+xb!(n=#8~Inbi=HV<1Fvrhv_GQyHmH!6as=QU5Z_ACbRD_CIPO8DAL#H46f>V zHdAdz0z{M+v_%=nM&nlzCnJ!&b5R{xw7sJLnQTL4Jw%aUrbMgE$YJs#q)pqW{dW+L zgH2KOpBZm@RxP9)>g}0)cQU8-m12V#mf8nq2*fmq(nl`sPzv@atS5nC?7SCAxua2~ z+x<`923meO)d&3G0pT-(GccT{%v=3x3yF}yUtl7|PK-XNmLKY}ZKxid^78vkp5*j= zUKKEl7<^98=}ZUyDl%#x>UkZ{WF!mb?C@i{$jJ(fN`It!$+nmOho)yY)A;w_{6>{t z$8%c&A!!k38U(XDb^Q9KaEA~0Ne2?m>gu$;WWHpi+9>dDT&s}Zzva)r0st&m|NiOu zzn}Q6K6Z3@OnvR_aCLS4>F97W1SVcs+dZ~pv@o`_Wi&B#uwwdo9jt-`$yFK#q=Ezl z0P*KL5-DKz1prCa+?3>RCz*bJiK07mcA-{vf}POM67`6LCvxzrwH?$di+#IozxZ;G zbAoI(gKC#?U0vQIB-5n!HD&KH;cE_<>4Z;Y(IWib8udw8&(>mNA_WaJuXWg*-!sHM zwVog?AL8*%8`=Q-#~dD7rP8*q-lv6!-Zwb;4FbOi3B-Y)E{+{pv2ogHbjaeGZz4<& z$7TgNnFsrEO+thf;xNbt4ZL2XY+V4K5$-@8XONLO8>WT4crpSe!TkMLif;o9JO<9@ zQFDN+WR;`kWo$4N5;(xGkF=rk3~}3gL}%nNX9FvH9!o3#io;e_+(FMvXX};#QF=77 zDmEe3E)*IyAy|@I?U{dc9HvfX@6L;3#6(-_wu1o+dj$me+B+ATr5=W>(^t=8qQLoA zqI`U*^e~+%?*Zl_{t#DrDrFc5f%uo)?f-uM7V<OQhXj55VrY?t@C<VfDUUK*NnF!* zbOlEl&T~Dy;%_X8YX#*PQmNbU9Wg<+%imhjBG~G)WAfV9^&f=>0acGqh^;<5NwXMp zn{b+NaIqR1o0)NN{LIbbWid2i;bAj2W#?uyWZ^V6<S^!9W8voh*~W&I(}dl`gqzLy zXUiI1ZbNQUUc-OnZ|(nGi2*{|^WW4J3f@KQ6f8iw_<_P)TeP)7MV(bb&14_<>^%&) zarh4r{#wKF(q8guKF1QIiY4OuR(wiJr05s>4uUuwGDio4{3`6R!|hchsFV6lpz*<^ z_#3P5^y_tx>U+Mui*o2xii}^X2OxEpvekW$OI-`w_1=5`+~r*wRmscFkEi3+Pq0;L z-;jcE=)h^$b*QAD2#JwU?vQyRwfH$61<DPhPGc*z@9_|n-L0Y>`_RS$OnnpiP9ODi zRsrl;{*8l`h5P3${TYmLFmZNt(s#Ch>|khOs&8#*WNOXFr=lvVd|ypPRbNd}LRs|w z1ASRhu?Mmc_Z>u*bR7s3-%!H`ouI>|Kaa_QJY)YM5`@gwjSvBa4Kg79Ti=@N$^_wn zkdA(nXIx6vZ=dbPs;0-#dRY5^xZ}R}%*|-a;lNiS@{iVkpfm#h@G2+(B-9^X1p#1s zgUEHbi=pAQ*gykig}z$;1H(I6kHFvCk2rYs2jUvY#sj?8Mvp7ZBN95Ok0&VeTe56X zq?jQ--Z>o2>yANl7v5tl_E<*ez@BX2EAP$h(eBwCIikY2oJ`-ewFP@=yLzlLuQus} zPdb)5j7V}zfauH5bvHG@5F=;|MBNR$*gPkr>zK#3b==Nr*{Bszk@Qz!0Op{9FEpaw zhSij?>!EVC*c{KE5Y^6uR#tN#|KjCpt>Qg0W7_Up0>qc)=SZ?8iZwlWhFcs)&Lxee zj32UEr>pQKnwrVeITaBCQ?GQ^QU5!^x8PCLYWT@nr)kR?amIOi$B;rK<RO|faArkT zl>&1~A}N)(q`hy*Xq3%<K2B4`JZtCDEFiGdQBuuh`1yT(SMNoWV)=SE>UT51dYUP4 z;b7`2>rnPS@&`51RAj4=vm+iXYN$DE#0u)g3=`5MFRaGc-CH6N)0RB<vQ^lytQbwL zl3u`?!kx_Hzdf=i=tS}ps;|K@sG*exbD!lH*6A+K_8!G&q7>_98*nz8+ygGk?b0=E z!q457zGXCm42a)2rLK1zwjnE!j?pD^`fn{vUr^Oft$y!Xrp<XOIN)w+5Sxu~apkWA zrGMW^FeZgNAhvi(hy`8wjs6cI`jCU{FF7S{rwx$$omROZd{$&5Lq`i^eLH6-duJyk zv8!JcfbRiUc>iw)B=nV+3|dM-^&eebk^muV%KkA<Dy(1Awvj{MFCoax^dZkQrXD=s zbpPruww!Y9JZfgSz|+cVMd9(JdRILdm0IR~u;i@Nz~|}h#*=`AdV2H80JkFJ6@boS zf%vgX83Tm`HX;}4^CSO}!@<JYH(ZALu7fZ3xu*W;e1=HUyPvnbWi?tu)~y1&V8rE) zitYVc-k~BFDh%$*KUI9|lzHiYz;7&2oF~f&H0{6_mg@`WU+b17f@vJ2*q!lj9a3TS z7>&2(9y>#iXq=YuxFzk;Lk`b8`ZuEJm}^L)CEaBd!cdSAC8q4;4H$<nt7@$5w%7R; zfvKY`ok?KI_WFxtyZm?`#8TBsbTo+l)z6hg!hlV&xJ~v6KE_#NYB%hrz>SR!z8dp? zqK*A8dG!7>o}^I7G&pQxSdY$H96wm7Z&0>acvQ3#++0t0t(i=WoIhT9lCWK8jso$@ z!)vUf3JYU|^4R$w69}vnxtIjhzsk*yAO&pB<P=(Vn7ChN6A*?Sb08;L8FZsV5s#cs zyrw{3gpdW<x(L<{dnlZ>iO@iBfH+1x=?95dNbfJ|w8@?nz)>B{L4<K+@xz<vmw<VD zV%<$u@(S`}Cak&Zn~eKysQE!do2=Tq0Ti*1sn8;8p+E)%D1-9}fKbvf?QbuH<azSz zBf_y?e@!mW-0{_xn|xKbFu%$8*6rFj5hj9EUz5?&qmD2TC2#yJ%+Ap`B#vbB#l~`S zu`r9?>L12Q=MMK6fMfyxiGttb3+=mk#oV90FpfyWPJ@P+j~_5?={;vfe)&h|Q)4>r zg5EOuJv%m(`puh-2h>ivmGe8R8<YC{FCcscEtke48tyL-#Hy}bJ=kyKqCYv^{|*Tp z$=%`bIBS7&RhjbzxfxN2WZN-b-dX%8N0+~H$T7k#siYFhNXy{>$(<GU>=Dw%>Whh2 z)g_C*c3YF`4DshY4U}=y0Vncc?pQwg>}X_eoWxx1fPU$43;)TsC{AhFkJ>F;8=dmP zaVd9@$t!pjC(j5v0k#6~Zq;zq3?YrmB<<&}hGvX_(j><K!Gy2L_8v<wfYb``wfR1J zZ8RR0mdQO4O%yVusjAAJZFGmCcMVD@v1dfnHpvlWK!8GVUWGod4wX<|PtKaH^-h;w z%Z$8x&&2T&(U5h7`UPa-iI)&mZJn?6rm8r8Hab6|C;TVjg|!J7dwu|9Ws(mQAihHF z-lx%8rtAIm)lL6s#|E;I_*F(zzJ=t9!l4I`LYj0i<)fycBTb!ktP^~|j$2ly4J~co zO&s#?AwdX|P~q`1-eaFxY<~T8PqY-qF?s06gA;KRtoP)dE@EjjAfjcB7S4(p1is89 zKv0PK+C9E#lr&jVeBNhvs%Ldj54s`;pg{W?oESjpgL_ZyyX-8W_B?Y<ss~IX8G1>y z9v-&P<81GnY@B#q!%f7RG%*f!XWX)Osz+0Rmg#iugz3XMgThN^;bjwsK$0t%|91S_ zOXR8L#Wd)bNbqVa*;Ae&p$)&h-HJgwUL0YqcJt<R@9`<s(B&X|Smw$bGY{R&D;7Ln z=s(TO11}JYv)b(P4PT%c<HHG?o+uAyetr@B=>96V1&*KOGxOAjUSBm}Tn2oMJo^V> zti%z<b_DGwsG)5O9Wpd1<ngaBJLjI(*m%mERDw)d{;tue<)P}$GTz}7q3$R8K$Yd9 zfi3p<iIBpyVtjg{>0Oa45eK2s_{>(CAIl-)Oo%%Uotui3cAbpteSI$^UlhPQtc;1J z??3yjMj=cY(eaio@xu#=Vz@O`8R6YM)toO$nWISO-8<z${H*FcJJ=aNdJ^i<a-Zud z45}t`+Pqq1gJPfiK)NQqmk0pavw~N^OwQfM!>!oZF0s>n1qpR}qI~z{s_GRL4IZ$C z89L49%m?5A`EKCLl1yx30cb(#nz-$uL*Qrbyyu-yP`B2ch>3=CW(qWIqPZnNJa#?J zmbUg|2w71SryQxQ_^@`V9|@aM@OXV(d(6)|C1NoY$WZ}b1bVeUz4Q*6zpk2k-R!F! zGG0pe?bZ(MFl031qHaW*F>{as0V>+;wKbRo2(>j;F8)Z+^2M}Y+N+na0MB6VY1~VK z7ZJ2lxFu{2m)B;K6<~nXvLEjF0{~@_{Zt^KRiX&JJGE$mZ+V2LzQEb&O2+^X!0W&W zIY5sp2l-HL;EP)J2a{#o9g&3V%?pQL3TQ6kGqwXPqfP(le8kyW?9bbQ-g*Ls(fN-p zhW!qLtktDpg|@Yr79UJTOESlX$cY1qBuR?ChTiKB*Ms*}Tl?h*YY+EEMZ^Zom!4J( zn6V4X3d}ZE*hq|WELG@hEB0yt<LY}AVI3{IMriV2U{*bAeCwktSxaA{wldXCEDCAf zl7xa#C&17^+c^2|w=A7=O?URw(T9ZQLtWt)j!cpgY+H3cqiug{Rt~-(&^uF~C&p8( z@18zr(yWGEET~+GJbT?N+u$XiJo7QxxC>-L4c=wWwE@e(x<)SZeVfbD9UoWuFJTo9 zg*na<Ne8t47Y`nqpU;~CmpSlNQ4!FF=F136Z(eRRa7coK?I3)^)HT>o_x)RQ^;`R8 z@$_2)L?C|LJx4VEk5MuCI`y)jjV!!yD^r~Nd@A#wJ*!X+F+Yap13J*bx3iirHDHJ` zTVJu0%XgGkh-YP%f8-B2pCZh5QI8|UN1gENK>Q<>IyAUw;|xB%C#gl(U*qhvg?yi} z$Wwo{6xFXGQM%FGYS$_h;x6if<Q<4FZ^ck?E8cz{V|#&jB5v6Hl(tareitD1{l>3< zIB=QzUw%OTzZ8LbQ>eK}irv1;rR4kJ`GJlO&F4mUT}>f^aFj3f@tQPO5vbCak0rf7 zqN9CVW8jFZ;r*~EC$RJ=R-C(8g(^wgjnN+PP28472EjIeCuz#8?a3f|bq8k7fU>pY z<rl;!T=JuEARIa{a+yOja?i)#nF6979y~Ow+@(&L<y*mH-@s?9S+B6nAXVx&$cq6A z5ctB`o~n*QwKDfl?!8EsmOLr9cuf&I8bW14+nG8U(W^W6<dy)DgC(v4okOo7AV)}J ze}?|$leYC_P4A4!kAuQ+rFV@aE(1NlY8v3<?nVzGK-WZVN!QbMtxFDJ*^=^Dl@EmY zu%x`opI}=+v%Mui6nx6p(DC-We=rdvCh4@)w!pmLu>0gwe(EltrRm$F8(snUd_;d5 zui&4u`$LNZr<U*udabRkLg2SJMn(xNv7{sXvMAyvi_SARMjzH+c<t|ty4)jcdtE8F z(<39yk2EHHpbby)-jjeKY#q3j0{r1sKz9EhT?GMHQAJhO1a#-GEtx)4tFL{=teDJe z&9H<UhCGm|ZWP6LOD1M%BuXGPs-vc)?#axkBV@XXOvdqtzM?zS;XlN~hPf5f50`+< zBk*YmX9g#;G4E>U!J$JEeqIITD3QKPtZYv|cOv@ddv?6{ZwV0fs>_5X7N$qt+g|G< z`jW<`JQO2c2Vx1f2ZHGW37jNF{wu(Sg=6LZU?P><=k)dS(wVyNzjE#6JJaD<V|z%) zzSR8H5AJSTMQPB7TLMHo(L0sT;<+z+dfGO;zpp9K*o?}t#a>LL;aI?GdXm%Jr3wJn zPy}BOvisfWLKT%YO{E{s=1Y-x^k{bj5R_LZE;J3ca{)YB{I>*%&fs1d!l1ryBUzTA zU3lM0oIh~|lrFPGCS=Y|o=3AEQFs5XQ7;6?CYaKk{~A^3L%ZZVIwoQzxj36GI~3;7 z>doKrxh4{eVRBbZA(x-Kv0xl90Mneor<w$&VQE7k(t-n%^cF>n{JHb09p1wjXEXac zd|CjEhS}T_iTL7k&qDdA6R>1I<oITpr01iw#yL)FFB+~6ZYGk&o$F#}NBvXcIp7KT z{x!<1g${cP4UUF#;C=(JBQ!+@@M~vNn>iQRv_EoT+v(57u@BJX00u(9m-z3Nr`;b! z^e9PpLY=xA28(4u4)+O-w=_4jLx2s=;OH%>+Zj6Yq42@nqIcxCa`A2cvsG9WWuFKL zVjEAwt?%OBzS-O?)<K`jUV}#>{=~%^{NA!Fug=wRKXe?QuC)ZG{KI+CK>Q>Q7qWup z;k56`rtLsJN42?2@|Cx2DwI#M+??n#;9bF}9pe|e4C(0S`6`4sa04{x65d&o0R15g zB5`qcheR|h<e6bQDk|s@Z^Kcl1BYYjN_HfA&}ns0grcq^M=GJ?1J3YL_)+Xgp#iLh z6Ic%V?4&(9j&O)<w!&iY0_#4aOwv~uTQ=ZDH9n%G$ita+xKy>M#49u<E`9OQ|D)%~ z>^-&l3gAHg{Ri~W0$yd;i!F@yg1QB<_xed~gNpl3o|WO#nM5Pi`Ewv#-~OdZ^zWDP zK%{uRDyA%7iC(+%dE>ikf1OFdq1smtp#cmw#z0p+$Q%0H^%Qdqo$+5UEH=08C7kq- zccJ}eYEPs2wuU@lv|h_ttfSRHn#GWfgO}aZkb{krjl<N4hn2<1#FW>V!}MpzWljzg z79&$G4jwKuE>2DpUUm+4Qxi5;R(3Wv6CQ4EZcbAcw%;k^@kb0r5aRG(D(4~nrg9zt z&N+@XSuEG}Z0l_|x2n`a$Az$h-Y07XNW%NgZ1D&T<7j4f&bB5F?)rvij*mH<EYTh+ zsL9_~*3uV!s3O6kDh+WRbdCjt&V;K7z8^?XOvCmIiO1w52^Uy6u%79_C|CYc9bQ(( z-!ktx@`y3eXLlP@qANl-{h`tK9M;+vLhYH2ALvD~st?+M6CdE?(|K1pQ~*aF_wkNR zRp(_Ryb_`jIeTy18-3DbDxoci|M8{%+n4+~(*f6ag8=*s;pX2&GL}8<D2E={pRhIy zaOh^~VdNWrOyuy5!H&V=mt%kS?k18k#d4N)61cmC&|qGVGR+kbkyg&@>kf@z!@AIs z^@BnLWN?CtEpXj~+#?J|2Q8ncMr}E`YE?RW{iJo%H)DjA#r_Gt(oDk|fyVVCIzQ0* z60Ls>t=6>9MnjzQ#Sy-d^u=?PYPKgzYpvnNB-dK&YV?1t?%AKoyai(nBMd>-n22)H z-7k=9`wd{COrJHv9+eeCC@A9q&nc+3qqzQX8Q4S+e0`7RAHN*7P0+2Z-W7dVpaYfW zeD=u5A31v1A^L--kZY*iug~6ph)x({<BVW+24#WFOKfOWw%O@Qi)l#X1^fbN>|`^a zvy>EnjOdQ5MQMx!=Gj7mV(###BH@Lkbc5W!lP8%l+rzZD#pyj9Qxm`b;a7M2-wtqg zzY0T(<K3Y1X>yW)b8d06pSaW)(_?8rVetR(_4QV|m5)I#RynZ30Qk1PuzEo(wW1Yc z<JE&iSY25aQkR1`+i|r?Sfd@~=p~S3w*&|*=K&EGpBTk3%Y`WGhPPA?o<8(0BcR26 z_j-%>xx)waHGL1DdvqJ12PS9G+j|pIe)Ev4hV3*BX+uBcyrp1sIJaoSS{>7PjRZHB zZwV0CjRdOecdcrasSgJly9F)Y?9;Wmx(bC)_q-5ikD4@iZrBghi{PudL1&0i#o7#$ zu#EZ%)d6r+GW{)%qzWk;(6FTgSwdy;?Un$6OBbsmP0{$w2~mHOdOcZl^SF7i`eB3~ zizxPB6p#H)@j>v>h5p3igW$9j2pk^=%wP`98xA<pUlKjq`VO(@kzPGrQ0=tA;~i}; zVpcT{TqD5egAh>ii-3dIc#pQF*u;cd8%jk~l!S5qshu6E!p!<G7j$jNK)I2A8b(z4 z^;8xKrHg7q#~*`E?bGHLTRz6Ry@=!>*t*oA)@vJ=s}H8*GEY_M{xac4D+Yw<^FBI^ z&ulPsG$lbOuod?Su8j+Thr|4Y=G-YGoI2-tIAw9oVRL{ieVAW5Io?}Rby_ov-?Xdv zqf2jz4x!M`A=f>=uV$3R|GXaw<#FI4-DX<Q^LMV7_}wRO(If}Lae=9)mCB~k;BlW7 zuM1U27%T_iS_ytasfA9&5=~plT2%es`0au+n>XaPtg1}uxHWrqj`ikHZZA+Gt@ULs zyM#-WdUxMOxd|J#X-0lhU<7l6gkE0&veNj|V-6IV<<<;38n2I{Zy}Z?RLUZlO%I`x z*MD6iezV(P=Gd;bjJ7C(9pey13YKsPZI~SXD6BmuUN-m&1Aha8ju^A-N_@2ppSjlu zZi?;k#v<z3mLCe580~Oq*XVOD(FsfrFw*||hhHm$fAac!2~1(!iP34DDY|azJHr9Y z0A`=&k~dk2;@l5+kQ@m~CCILB1;PX-M`1>Hmi@u{{oR(PX9F?Bm7*<-&DGF(WXk8{ zv?Aq%AbVD@vYo^DqzklCo#<uR(9qb2MZzbw*d{x~$Y2vgx}w5_axQK<Zi$>R#e+xn z{53jmg$btsq>>f|^-tw=cr+hvHGCHMkefJvukNF<N?vTr7JP%t-_`)|#j*y^`^wqI z*zdHp&)GRK&T|s>5zpG4G{hX~W68q^oP#c<54;i~J*%dKuYuu?pl!!QQb`Sg+|8|_ zLvHQPDAnSS#yE1r5d>dZ$v=%F2wosG(@x1oG?lW(j4cS7Wf=(1gT#H%s`XAGC7KEC zJgs8GS{8u}An<YGVB7R*E3lo&ENiNjxV41J#^MCtbWbzvp2#vki&BiUxFu_ZW?#r> zfh-l*&9}s>2T8f%PX5yGHG@qFb4s$_MRfRAPF>0X>(hZxH5uT{Me8xnjZn^GGm~Z! zkiKZn(9+$w?2i9%@sv)@<PHdd_?H56|CwrBVMe7kOH&;=fJ6n?^Tmn;q~_CCjU+h4 zE5?c6k?88+ucEv2R1q|A!wVKUQSsRdfkF4C%+GsTgC>6zGblR+?wrH`)&xFViMIAB zl7$w-ORK|tJzT&l)l1C?dU;`A$I{h11;U{Nr+2^{?`cTy@f|Drwxs(A!Xzv#*e_ua zC6Ekg(HR7(AU&o9U&{fNiGi@}EAZGkX?F>H<`Ul3oY>M8550Vy$wGJtXP>aHJNm?M z9Wqq-#VrBC4iB;?@_2$Syc;gEa6jOYFJ8y;C)NXb%+Yu|e@G3<X^}fX$ECUE8!!R! z7m2CZ*FWi0y62JKglh>ST2Z{GvWW|C5*4f8i=j<d;oQpd_&xxblmb4j{#^!%t63K{ z1)nk**{(=_hfls{*zyyxiA30NdxsOz|ABb&o4u}s61Awc?fu~bJrV;x$tO6rcfPb0 z;ui-{XuV!q9{!ett4R!u%fHHFO^FxfQ^oV<7D>MMPW%}p8LK2D_TBsYCb$lZpT}>B zI66^39Zw7wdnxhGv7{?chs|B_0jFouSjgpx#BweFGz;X20FYD)zG7R;s%8E-tu^u_ zcd-b$lSLCSMWfsGYe}|t<Q+{DEzBWq2@q~%HklIX8Ke7HkLA6U-J`1bwxLEIysq=q zQG@g9f`sQ??*aM%!AG+`EBKgggW=chU{3t}KJ#lc=k{v4&cNfy27r+L<LQ(4AOzyS zux|coze=z7!mq|Ci=b7#R_uAEeFD~erNTd_l$Pi`xEpm(uXE*wtOOM3pY9=&Fi&wg zCR;qcpi8(AI>Xv`wFvD8JE$2vbu19j_?hjn5Nxl}*3hld{kp_Chr?q`ngTPIu-?t0 zwQ$)LiFT}I-2>q>g3}uE@oyg;qeD~NCmw3GB|cY5^Rl!Z;A$d)Qhm@3<vUY+a;XoT zY~W*6+?}G@T|bfkEYvjogp&%I2&?f8?b!^usgHR-1Y}&}OOOEpDo)V#97_U(z0ei% zA&z?CvP&W{2VWiSZhuEnt2Q5ky+D)n?%Pz%>ww7wY(TqspE+TEUJ*8CSM_G9KZV9o zB#m29kqP_zPL)qLzEJ?PQUeTNTDd@Ka`>b|Vxzc)Zuh)pcWdlHj|S#*%BbD@z5P}1 z|LA;Rz~#=*TmB1_E+{xv9-0fPEvM(!`8|~Zrygp2Y;a$R+Fn;UU?X!(1?3vtNZNG+ zNSd%vbw222($!^^8Gm1wo(37EI8mE*gE02XzQ<A;k!U72Pxl9JejVuFEb^fP`yL_V z!mD~Tur2!=M-m5v2<hveS}7TF*<0O0sjnIOf01_NVUcQ@m{xnNY?${^&swlNO$zp^ ztyt>oyk(sx9IBh{#WvQ@0ZXHSubg&k;-*|X?YCC=`$t=cLNDkZQsq1==g)N$>_fK1 zKcr^+^;z%-(+RvTt!NL#RJkv_fjz_dYig*|E&&e~8>NXdI2e8~$+p;1H;|o7!2f)J zBm2_X4DjqiA!YRQj@e|twYNQ>b}!aF6MVO5X}u(tfba&pFzck=_qG7h{`y2_Ja2{q zDG&eY<}`(uH(g&S&YlQ0u>fU{P55-c{RSY934COMIaU)5qn+kQgLb1SW=cbrMnqY| z1p-$5kWKX7@B};aw*-hZcTf5%r^v@e`{(bU7JS!i$cpeG<hV@E+FMC<9}$f`v@Alp zk_hnaKa^aG7q+2#NGU(J77wReQ^|(<?o~!Z%+5)hVnK_LSl<#LO1K>-);e3i!iBuS zpVmrRacFUiDv{zNqst}m2=OCm2yVIybO(TsVi^XDOGYko2*)AK**$Yk0rUKQu6yj} z10n0Xb?eJ?!MCIdNm!Z7{W^>Cl~;Kc!NXy}ZfUTKmYq&-Oe{D3C~Q{m4)`oDK>#@j z4OWF<B7^*CGyw1}*5&jNpXx>+j`g0VDZlkk@<+#VuhDe1kdVEouyivQgbyG(0TRl< z7YO`xTx3(YK5qV42I)}oEuRrR{=4HeY61~oO3YovVY&EQqME7==eX8~N=wdR93b4$ z!%Z42Ih*B?G_*ve%RS#Up{Bebj0gItz(=vfAMfA{CSDFDpI4iot;%pV;95GV=HO~a zeZP+}?h5_vmH_do#^z)0qv%@d^yhWlXgJgXkGEd-QtaU}1Ywz_i($HjeaZt`P2ek^ z<Ka=?4Ea)dL?X-e2kgGkMBS6hUj6qUzIvYJz<2iMfzE9JUe#2;_bJbS06{7u#s_vl zIjx2+$^F9%tV_zch%o#Mquv{<34Dw7pJp|IlIz+G2y0sQS89eJ4K12u;;qCoWDw(Z zG2kXMMH`lGKe;1ddhNS;yP6+&COnTPIZRHRof7c^2^lV~)l_tMq*><lqd|_y^)3{k zY@RXO)ZW$H)SI6*spftGP@otXw6?>O?s~b!B5`hbO?Cy4t%^+k;njb1H=ces;(x)x zbNy}q*(+Fcf10&VmThN5vR?7}7~Vr>!MiMBWE3YHByNUHF61nS&f)X>0%mgTCiw%e z6*@N!_U2)gim%5UaUT&Lz6f5QF3&;P#E9~cza`qgLojj6Zb4xfDjGZS^IH$q5y#eb zLAY&}Md&T=$^Q160{ifCTwv;S0M-KgVI7{O&Wk_R9rh>HRN~gK-x+6QYQPR4IFWys z4C<|ryb>-D@>9?3q1hUdVJn2NK9gK-ejGC*Ws4JI=yRjTb*~VmInTZ&ldgw^5h2E` z5JgeuoH#w+?IIwL|J)ogZ@c~|w6eWhrm_xY6}TG$pY5lO8Zg}`MXges?-X3dRAma^ z7WCzGl;DC0)sN+@X^h~O05KAZL7HrcPszkL*b<4@G38)_)*c#aqFfSJE#wJ(zyG;@ zDX`Xx$anfE@VGAJ>0h^&mv@_S?W~H@xZ&a+IpnU7%ixL(zJIW+B!WwKOMsYqbq94{ zrMU1TmVXLEzGQ;Kw=P5d;crs4Fne>^{j})4KJ38t5PU!kL1pNb;PzOe3UK4qIJ*~N zbw`9|@jbuGvOuqT{<QtJ1W{)RvQC~Sm?jd`;&?Z9JN4Xiaf`yMH90TT4m{YojJ%=F zlT=}(fkz@hN1ca)W6C#f$s(R+$$fal&ZnE9#M90o`tIQtWrgl6L}pI0;!Ozfx-tk& z*gC^oy*10P@tuT@sY8YhG9}+tzU90+X@6y<r&EAJ{vQYd{xbvi`tM*hWH+DtAdY@f zz3d9hrS5mZxHqI<a+th3^If1Or2Iv>)lDe_@KF#!SIXde!2j7RSb^B`)-`}z7|QEx zNN>P~t?fX|WdEQ{nCXFyCa#1IUv2+{+zIH|TVBQnQxdyOo^t8kODJ8&URl65$`9e1 zBx60@7zEmW51G$b>=g5F$x^n1;X3A5cjxe7*84p;(k9HzKn>K5L33dN%LackUNpRy zGJorN0X{CMNNrhl<21t|oo_sk&_;-s+C&-6pm|}IQf9qLlY8_n35SLQl-uAL9+$IE zKC9j{#_s5kllxJb5NhIMntb?<tLd&imeDzo;qQ}f4W{~S%pUEY&5<K2jLXUNO<P;A zm$s|ND)VZSKKP_#sl$jQzb+B~poxT|zsPThtw(v-{u0eKCHa;A(eaC8mvYXGfb*}e zE_50q92%b~t~6M-!kZrQZ2=5%%Kol56HYyTO&?QhE=9hsOJ><8#67ts9QknCyY`TN zV|&=ye0gl=Qw6jGa)hY%>O9=J5iC(5Va&y|$B=M8N8<>5UPUeVJIRb(MU4<8TydKR zTWmh<Urz5iiLtz8Y?8NyXT2pMz;Jqe&XYR$*qP8*f@k~&c67|iYwI}5C>NOKaG4eG zC6UTBe=E5QK0iAoM21Uh+NuOh-J5{)PP@4sGGa_G6WAt#QMy$Oj?}zg7sr2QAzc3* zoR&g3^Gx8A7KZwor`w|>z52eYB_^oP?j(-*J3c}Q^fA(b@UKe&20Xy$eJF37GJv0X z#NZv`@?H@EZk(V}dYtSH>IMm_Bldxs0qDxIgPJGl5zgJEB*QVI7kRLf^936owY~lg zu5e+#oXBXa&sYwx{<W)}$N-+$qUjhzEj?Ps&&Uy8Wg2Q&saW$_`(5!=v2ZH(>xuI7 z^;c`B75F@T%&r)NAXwpC+Wk5rTd3!ef66k{A?%a0YMjVT)mt)qB?vx#g)^)tgxbw| zq$c-`K3MlNT<;qX%6;Z<+~~RNH>GL7NBjG0l%@%nc2M6b+owh2x>r2sotjQ%^Y+A7 zowV*`AXYqb;^S;(u&6YUTLZq{Zsl9rv)S`n_=<e*2Ws%RwE84Axe<MO4NFYq$Ove4 z^>2wpC@mSvW@C>t(V}!ggymX3tX@VF+SnqvW2mhbIo|$JB-W4u$TkC?KKFiKT<7im zoHt0%jo$#)Y;opnHNpLoXE)|U#%rgkmjWOI;-@}0w6-vG)VFhXvUheu621CG0r(zp zW##>E2PCwGos%K7l!B@##C0u9#c);YbSmqaeZ&6h_pu@v@2o>b-93`Jp9*vCj<dct zM!VMM;x0TZa(yDm7ja`LjGT{$HQL-L6ips~^tR2+$wudqxhB#>a2ezTKSW=HX~(IZ z6j9K^3=U%+8=CR^65aSt=df(`mLx=m8)yw8#kdZ4=29ED)>9aek|v8YZ>YbM_~xBD zTx|B<jXK2(s2sqTiy<4ycli+?-XB4=yI8N3mvm$}{Z2QV!y_1zXRpm2cUVC-C&5ap z2sfxRcHP+#FdO$$z@X1$5}f^t*Xof7VLnmSEMK=EbVJStUqa+xgPa|1w1vDmUBtEv zfqGZQa^F{AY{hzraaNg1-k^ABqcBAgAutu#w+?)qU^V>Ytkbk*jX2{xy<<or67mqu z891{dt4e{nB$1TL$G1cx%v3g^S5#`6)Z9N7wx9>BqWcgcA%EG<aOv0=DScNL+t*zP zbd=_h48H+SgkvV@UKO6cWl~o;jI74;*w(b#n6MyP&(K>OO&N_=De_waghd1Q%;MmO zh+;b>0+y=5xNd3@7UG9rPh&_{aJkxPmr=FqfbGG+=b5RAf3Lhk7YOfCCZGSn7l3Zx zdr4FI#6>yLKxuDzQJUkH0AZP;F9Q{ZoJEm$lx;J5H!5C0#aW4*U^%WD;U)e$uf5<q z3m_1&oA<#a5&E6gtCOU%omD=cRXu4=gAo$eUmno7u+Z9#o01wV(%cdtY@Wv$3#TIZ zI8(3>9#E+x8m<+P_C7HcQG^`OyQ8LdL(T?YZ__`GoDE6_q)NEsr!%khGH1b`joC4w zb~e4%4Ze%x`}gDw&Sgsxi9L$NfjGFb&?#vy*c27qh454JJ^5$&Nu8$XCO)nzLep|4 zyLM_s8vl0tFpK+@x3Z7@nf>7kR8&<B>&yG<aXo{!>W$u^hPV?iK-a+?6eDp(V!1k0 z!ky2_^VL<9P>1IZifvvPZW2g3?S#ARVy`f9E(UQcU+-r`k9v7i`{MFYxxQD_s*c-a zVhuDNOva95c2JGwlq8z|rnWys^JDt6iI0iY1ZIM?IqeP)8}uS%%a7`?-ae7LcP@JG z;VltPj~p1z`eM}~|2G9>WJB-Hok;TL*yuYWJxd1lU%v7Ua^a8#ra6Ldx$3pZ{*L_e z+uU7C$FWjsbPoYKvCz1pC*zLA)dwsru+p~#2(J_|xM}90hUmAA%sEjHvt`yKB30a@ z`D84m<4XO7j%p7NuBPV^_;QKHX9<q5=$1Sy_jOsStX}T=->(#0z4ykHur=}+lWF3% z>@6dsb*BQD2^}PZQ;Qzf1bi3681;V$?bQ-i$<mMVD98MzM=~&w06x3H(bP0u-fclF z-Ljo3gpIX`^+TIlvO`q7re<V!v4D=(Es=;+l)M<xmm%D+HKsK}r5G??YC}2}EvY=z zdtbz-J)&>wfPs&4@YkpV7M@Cwzopx2Om<dW^jJxkiRTMnXEC9F(3d9<tOFilR^_z6 zbO%xnru%xp)M!_M+h?p1j~>>!fn49CpYkPpO;Kb;fV)INU4wSNT=Q*-5~V7eB9F?M z`Wl%qqx&-;lrWqp5c--lRW)#zf0j`aylFiRKA-rX*n0Y3s_yvjw_SUiwtA>O$2q!s z2VU#!xK!O2QgTE_QN-qKy5qE7pgQ@6TzPFwI)-N%oWt5nh79sTlXJtH0%+KtSwiRP z#V#w4%o^E>a!T`Z8M2ug{%otpWy;RZX~J!4$jZUO!^vxAY{qNE&dJ5Y#=^$IW5UH@ z#L2?J!ewG+Y|3KHYi49*#%^q6$ZPgHZP(s>e>BQ)W}jrx4^Jpl=5Qb{RAX&Fqh8#n z!C*<;`?%+pED_nL<sU7d+frvOY{7r$>&Oiw>(+>hI>TR9(ybV88Iqhg*8&<%;Nxi) zF{(>^-+3>^XC$)a{zL=CwoMN|N;Qr{#y=k}&~!fmgh2dD0`Z?IcN(6b>7KhyNfB3f zS;2c;&#D0XrpnA<)YQ_o*baNbGWM$6>Ff`lFu!`a-oOv_i5-JGfXEtsv$gJu`?La5 z-!fC=Jpdgf>YeFi7#o=W_llvq)&{tK47S?Ry<Fj1S2Zg5zOD$up#x)qukhmBSq_$b zOANngQk<$hi?kWEslHcOT}&RhFb&Z*!;#A*9>6M_iYTAJl&#VA(YsD6-b&yxfTHag zOp`~!rSPd{5!Cn6##e+(K_mFL1c+*=Swkf2Ih9LgL92((<*J#Fb476;$gS|;RL~7G z`xftn+{L`wfq}12lh{C}jq<){jQWS(Rwi|L^CNYfwIMi{q<mxm0X#Nm<ShZBX&?JF zMa?JT$_dHX&WP!Zv{#<~Ox6$Los9Z1gM1oq$c^Bmxc)`Rjja%S8DzCtu!O6N27&rm zQOekzO5ZmEwv&|KCVw+<z46?V#G=N5C#dwNd2YcQ@BWf<q=D6^`*Hl$)&*U#Q_gAh zJ9`#rJ4i1%pReqro6FixuD~4__!7x_4zcMK^+}Ek>r>sd1#=8+bPN?$Wiu#!tWfe2 zy4w#xrkX%SZoDSLc!YoHb}i4lSIW9X_6qlfE%!%5A*g06ow)aAO_fxz)N0qxW9HhU zP@#k}YnBxA>XkR=mz|K*cLnES8t5%{iw*9~kzd>UKbMGKB{$l>toM3kN=vKx<Wd<u z^+zh^qexj!JH7m|Lt`UON?sNa4jST5i|g<FAq06dr+<Mxbp3o!!-o|OqN5^NB`@ip z1QOZ$px!kaiSiRQH5TjFSVH_rem!7x^j$fN1V=~{ZHA-gKU()rO{HB_aitlXqE(Uv z3%%Ta4ixYJ7@7_;x-yctQ0>8Xeq8k3CSUZV=r)i0SsC^_&q*>F-F4xGpI86Ur63zI z@XGt8yZ+M`1j=l5o|W<*v5`<pqdNWw;~dUdSlp`!Xf`+biqqTu$>34EpvzbM`z-jU zFW_XAN1zU^9~@@xEa2NlP*KIUPPE%BxxRmfP|nxrG3&*Mm~%|A1}w*^Nd*n268Kc) zj7R%=>==9lnd)jdD|5b+j>F_KjLI63ke*oCPnv#RBL0zW6LCjcfm-F&_mbzx0ZtFX z`{R)Jg|w!TwcozMEj)#K4G^({5s<zD?5~kq5J9{s6H;F7|1@z0sj8eRwt(m9M)j-m ze#Lgvq4BY|Fh?1)M8F^!_{wSU+25o2Ss}BZXeu9<UrfT2KlW5omAkz|2$sq^J|cJN z*Jr^$mBYWE0IN9O>v;Mor*i1z^#y{Ih?Gz{M5eKfTOdoHPX{5Q>2sDF2PpW&@lSJr zf+B!^y`(1qB1me5C{CL87sAhuU*{>QIy`ZUSBn{qX(K?LdRidfbG@buivyUPKP6&f zmtiyhWERuwv@8E;kf{9jWq(1Q$i9^2X7&I!ap=qebHuDThJu_ejUEW@vTyStym)K% zOLtHs$)oLIr@oP%|IzuDw<2F}S&^g&QWEBN(Kd7$GOcIi1|IE++ss?l4^Z{a9m5r- z{j(S<EqhCVOA7e<a=WOo?33SFhQ_u}8;1>)fE-Hql!=K5Y70M_+gO&mi*QSn33)H^ z9JaiA^kZuqcIB>ZXgWybbwx~6cAE2)^s;Kf?R9=dAVCa#se4LwMRH<Y`ia>ebuGV( zEH`2U4mmE~sGm;PP3bMiY{r5N2v8~$l?W<b2GY<&Qe6DJ;T|GfE4f~wO?$DF<4^C- z8a2^3Z#Gnv&bxyYY`(>jWOmPIwOcS?u~Nd3Cxc@=i2BvqtRgsXbji;*Bn$XY6#O1v zXy45%=Kk!3aYPz+8Z^Xw{D5go?>Q^-Eh!clK^+|Wv#%ro@v*I6fMk?f0e9rcB;GmU z2LKFpICdii`kKB6kb3~W?4!5$CZzo4Ay*CCX&Taoe#m)C!RByo(T24;rtumHZvG#- z3;)L4<Y4u1x5dM4W@>kRX&6UqTJ_vR^*ck-6eh=FgpjfO_2L83qsl=(lpFY>mi@tG z8Fxn{;d=AJ;g<rMi};M~0Ly4okjVpBcYhIL)M~x2QxV;_T4K?>qH9+R<I^iwv>!ed zYGDnpQ6<fp55T$dUL1k1=tW`^3qT7>*TiiP9Rfdd=RNOyg1WWlL`*cCGgF{x(=B1H zMm!*&Rqb2+>iKHB7#1GKaO6DA6=gRV>#fxfug?uF;_VbDIlzbjOKw6Wc(&oz^pCX| z*;(LxRXX%Pwa^A0hy{LFlJb)TC_7vxRJ8mbnlb!F93PZrudME4iHwvcH3zJT`zHQ> z?0pAV6x*`y1ZIYuGm?WykQ^mv$&v&VVSpj$Bp^vd1wj~+AS$2)L89a+2uM(p1OX8N zL4rsS5CKKrFnh!H-h1}edmeAk`Pi@L`+9m-ujyXhwN|ZKRex0>s7hMWi_&=HO1$#3 zHY|!BGbipb=WbbH9~W)iR-eohDYxl@H6lDB$MDzGolo-sqK~<a=KuO|{Nd(W<Yf5k zTcl@4C7+(=2gW#``AlhIAUz>lekpPJM(cTt_+u2@hkNtAtNqmm`Y$Pt@DyF`U9{jX za9e~25SDk%b2Hi-`t;n5ca3f_+A8|DBt=yR$cL3L9;Z1If1&*V4X_8q-P>}2(ONa3 z>DfiRAV<fD6>HXx$(YC0$;0ajt<xEV@k6Q+f$I#AH2)97eIT|E{?nz!Tr_#abs^RB z(Op_~8oilci+_i`0*yo&`-9GnEWdB=SK891UQNBxoZ{og3y<QF07On)y^Bkt<;SEA z_p<jvFd4WyB3zjG_nJd1&*bu3p%=Q)#?^z#3*qTy?_!J6T<%{T06cuT`(LFBkJbi) z%%?6F;U=wmbT12bZFBp`){6`cnW+zoeDQE!-g{?<7>aRc^7WNF3m5Sgf*mQzG@(xy zq90m`V8cYPm&w@YyC*7sz02-3?5{SAu9NM-jpBm19~=SGCEpob@>T&FB}<DXgiDrl zR?C)K{?yw~a?thy%(;_OE6|M8of~!~dM~1*((yPTfad*|QsG3+(9;fNJY@>Xhen9Q za-Q7>o9jk9nsRYS3IN(5I9Pm3CeNvO%oi&;2X88#vAZBW{6%D6TB-QTi#?Z%cQOIW z%F;U<wF_ExHAUcSWYBDk(>gpPq1)#O0H$$D;Np84ex6$ICQ8Qh2;p4&c>lXs&XJBX zhHpN%o%!`w@dF!mKTjaQKa^ph_0oEA^HGn!ZAu$5YjW2bf1PI0pOyO`mR2d+`x?TL z_)9Wj70CltaRS?q474wOiXUDll~~Li=0mE68&cmx&*Yc`Sv*=c!&S}D@40NH@p{qO zlhV)yyUfX{Egk<1wOq57SNyN{g1_QQd*?99nF3~}>VZ!KLJ2O4oNaUMx+G;-Ya8|; zAelk>Jumw!zFsOKGjxIg%w_ZW8zV^l2O+kik@8;(g5o_J@mugjgL`kuWezsh>zr7& z?7ZJUdyX?@53$9-Ii!4|ti`Xg#rlN{;Yc<~h0Iul_8Fcb#6TVg^2u>vp}%nM&<hYx zFo7FB?@rd2#8Si8adK`dUH++CEmoD4N2CwOwVD+1#;$n7&S{6cR}PM1u`FJ5$F3Bt z>FjbFFI{#MA`wT2b;aE5ip|)mcd7c>hm-6pHCffMO*SD!Wg%3Tzmm!Fydi}9`X3@8 z{*(G}3UR=zh7fzbhL80x%1lMRDGOA*G$p@Hjl8k*{?1bTULR%^P740c@me}3jPRpy z-`e9Qf$aXXvi<l}oc=u$wrW>^w_JqoL`gl;aCTekUTvhU3E{ukp8DNMv>>>9xGTM5 z?GRrb22qF6sZ?)w;u^|t=dzS3hi;1osE5RzRgT&^$5P%EqC2a*84M3XYoRd*?Rj#` z$UCcoubAyzs-llwQ2F(3O4kHq&qn8{IZdiNEYwGY5NTJxhptqMpMG<Jnr{PeR+Whf zfb<(^IbIssb1b5i&LWqr0>h5`&<o-G_41X&Z)*DK$zEhvp5E=JT)ADJN;cF{LHroR z^6P~7K|akE$%hif65UC|DRm<T5F|!4mg+EZn&59;wzL?Y#SbwYbv?T$tT4<nT`_j; zb>e<bA$|?<rv44*;w7xP8>2H=X~wc<XL)}8=6hHBs|}-KQLU!OIO7xRID^i5i>0)s zGqkuVK5JK>B5qB5)+ap9eULW^b3W4ljJ!$FO`N#>7xn06Br<S_ix_JvO)r@g^{t+w zy)&Y^XuR;<cP)4oy->iMsXsw&v3$gvOpEr?+ehJfcgjx55n#utEXL5F0-+kd75iT- z7yoKB?485th-lI_BR<nx;O{`3iFYL|lFV%E*z5kLP@U&Sou}8^<$YW7MbRn@%mp-2 za=VsKg7vO6%%$OS7@bWZOH_C&#r=ZVa@$X#*OWIjj|gjOwnI+GA&5@RTosl&HM~mx zaQES~^kY4?@iwXLk{glj6(xS?v>uqtcJFAYE#UuZr?A6=<ms}WZ=Q(QXXzAn=E`?1 zF#Z0a8;7aX`?sXs|9hviEI(?V0X)w^q*wplXs>}xKnYu<8$a$&esX(e|5t~I12yx$ zmdZ1_^@+>)D-ml7|Fg~#>Yxwq(q6?B)@~|}0#H{RAGaIoa1k*H0dYYqYhiv%F(GRa z34SqQYat0MaRlmH7%t4uZz+iKI<pkx7vkrK+gQV`B*d-6;ix(`mZETRi9ejqtbgYt zz$#n!tGCWLZiP4cBn${RlKPBLv8{P6!wQd)-+2)HsN)a^#9yf7Gm_t43iUF|YwMYc z4)F}*e5C2;oc89ry5#YXZ0A_gf{AQgy<Mz5{LIDt;Wmy4Cn6OcLv1BJ6LT?Bc@+(1 zO~AflE*Tizu_4*%%s7=ioFkfU>QmaKQMD1Y)BbQnT5<RC5Gj>pWf%^B%Hy_m`oddc z{O5O^HL4~J43el@&ImtM&d||a1+JhWHo(>i&TMlI0ChBb1miVk5mvQuRnJgAuZg#X zmhI#lJ+6TN(Ww8{NYpC^?qBWyg=!wNyuLT}Nh<pZ`qILS386t_k8E4l?tZg5^__#i zA@*X-mgIrU{U&WThNArcGhFVY2fO1_Bk}spByQ<;5veM3jjgPLUSa#Dy^5gc+O$4l z5i}o+mVPi7SMPkOFX_8>5#*Z__@5H2??Y2qZ>ncizM6_=ozF6z00$o;kHO^f{GE2a zMC&Wp`&En{VFKqyRu=${l8YBFUQII{v~hZb2MAqp*kkpZzBkw~6y^V%Tn(vBf_eDy zvAB%hjGal#<l(1cxOQF}3kt%E1hU{GLWpUA)x4Cmpb7j~E~U#kZRNh<SKA#BW1>h< z%k|g%&l(wcAEWivn3H}qqgf#eC%(ZpwmW+!oDsT-_tS%e0Cizm!gOEHiFpnl6++w! zJApm^HQ=&M`NBJ~8|^r|CrL;b)Uy2F)r(To6Iujj7@^%{F&7`lfuF-ELE@t-S&^{} zVad!^g?e~@IN#H!?t(a1$W7i-91%i%>c^ew&at(=v3ObQB4Y@?+GK3@oqJ%_Ky{w> z6?NRr<DI`{Jir_}N!qtg9^XETMDWY|cIrGG-P;3~C)Z-TpI269ahWzW^&SyI>@>EV zp3kLIVS?NmI#a~%Bq=Oc!18phEnem|;#*<|w#3ISv>5_(Qq#Bm@`uhOS2{iH7%nUE z#oKtd*Kj?*zJ+WA%DCB1Y!@CHA&C7U=m^;mbZG2@K-V{c(chhiwq&I(M`m-CZD{Jn zRe&_l6W^)QTR<M#en=^Hc)f*tlE5x9gIqs8q*~~Hm91a1I<`Q$VV-yFyP~!Na`ajN z_|sZoAPD@^S^!}E)mQF@uW{w^d`hDvfLQIaT0Y&}ey%E2LXgB(<*~zDAYo8=iGk6* z#IiC}qPed~?wxl<iqZ9~K#b7J+Y36dNut-EXR7jz-=Z}Jn3EzQmKm+}p#n4F%yTP` zt~U+6Y3#Op|EiARN>R0zsrqq}L+qG)Mkg@J;}Yd7_1oqWgGcoaro{v^_ciW0DUHiO z<a|6r0nB<KkjMDhYAz&wui7C(p8R4I6EZ@m@i)HS?M(;Ly%Srdfi1E(HPs08KOT8p zP<Lq0iqSP>4AoiFbC=`oO-xH@b@En<?+TWG)VY!tE}w7wfo4kWZhG`gBwAv|T#%{{ zy&0wCL|4rWjh?)V`@|x_?zhs~VH$-`#8A|U%Q<X!XoNT{7wLUPND459dO>NxQInG9 zq|euTa+&$a(v387yTrU0@E1AuSIs^9n5UAyOP8*}%hiSm^sSo&1_!ao-ivgNUb&4w z*6_;Gp(}8&YyY+Z!PZyft8?_OPe(HNl_W!@7u2w&xd`08Q5f<x@I0L${Mq?y>4a6N zOC3H+5wqQx$)H&3@)K#5oDxN3tV8`3?J-$iBdUoK-W;(=4hCo6<M$>pobb@2tPuI- zIQ=-XRmR(s8cG;x2aTR5{62XS@2v#%>@eM-bz{sDf~T}>i(<)T7$#_95TfI|fUwpS zh7>$D;Pp{@&QCRekjox(($zmBmwgO>d+k!s{qRrscaRl5CJH_G*PB3ejkv~ddAh}6 zp{~9OMv`dfTg>^y6kXv@xWe#+C*4uVC<aV9zzgq|E+jAK-F^9b$JO>p!4Vk|60QNK zGD+`eDLZ{6dZzwP>ie8X<z>(4g~$;H?Z=_-sA*_kq9G%g3l)5K)_{G;vBXr*k;6yD zXL8a=Oi<sx)Gu~*<W;Z3l(EC15#q3CSkstOvY$oRJd4@B1iFA<USf1iX*DxGQAKlB zX>~JHjQ`R81Z$qFdn)Nxh20pB*J~x;yT&$(IfQ)CAUZEUGUS|kzuEru3IKLDn2n=< zo&Dn25XWY>%*a}Jneo`G&aafgyB6e6>|VSaJkL$_)%4I_3IOzPS;zk0M4*dN#jEgO zAU`u;%APRc7oAdi^>K?J$1^3|vALD%_d0reVtM+=?x*Q*!IrAjVVSWt>56lo)-qM} zsVU;r$EmJmf58P-zt1NO%o4wG&p>2B<{fEb-R(=XGZ%`J-0V28jA{dqh$C!_K3hNz z#Hr|%VaJP5iRT8+md~&)*)B}#+>Y04#xioHrfcR#r`p0?bfIew;XS5+^o1K!%51mG z1_v@FIY=+0ma&kwcqRs=ET2BaK8(qQvw_&B@$!fpAyT|&oC&<};L}%)Urq;}_bE*~ z)`KYCI>;~8drulefp-74{8ESRwh?1or@yQ;`rypn=Se_ANBWQ}t9)IPo2SJV+4LIZ z2JQAatfx$O)SP!Twe(lB-N*DElowg;Lu8yZ7m?p6T=CBs!1otL0PEJ~Z%!(@>)MId zj+$!|xdXFYckQ|}D0mh51(Kp!4lnWdVNW(eF{Wa&Q870=S`2nx`bo#t=Ua{B3e}8? zz09Rmb_1xy?7xa*1tA-P+077mvcK#`^k6A&cl6dhON*tqJng(16E<%9lMPUeLR6&d zeQhp|O*8CiA6`{ouZ7~*%jwS$(-~LOu(w@)2;hYJ&(CTfk-=;srO^YWh;DB27e5BA zwIX-)(ekpl(}Pu;B3EgwnK+B?-XKQ3jZMs@#)7^3ekpjz@BWjaTO$kK@~kcol4aKl zk&t;PwyD>FnT{V3LLgSvR{RM&i7BPTkBz>rKUt~G^Q>Ivt@=&2qH6^j?!NZo(`Z6q zj;p3lP}NsP$_|jLErQ#S$9<;G*@vGjYLtXk6hLrq<V_qALfEjV5%dW@7`F_&meVj# z;wt|&kVLo{N6k*HFq&&obl)d!vv*uE2gPQAZv6ijn*hHUTvF203+`d<?dfIi?Plu% zw?>#d!7UL^l9Kuc@_I^!`Ud8Px~h8eO3LP%@(L*EkB-Ne@UHb*)u^qI)a%i3tHIJU z?K~u(K5%+t@q3^2jXNTQaF<S?s7=9wSHxG~%#Uf8rw%r8<4ISsMay`GAH&H$@P@-& zfYraz8}2`8(Grk#Yt1g9dZ$b||G^HSZS3Skjr+af0L4>FNP286^1Ve1T%CZ~`ePo8 z+LJhOQmwJ4->Tr$xba;NJ50#p9wbNf1DkI?*0j2;rQKwpb~zo}^b5b4hJ2Tj=Lv_o zwHp+KIU$GGhyM!-kMak{cmodv+|%2`PZ910g!MAv-DAPw#IaQUx|r1x-|a8$Q0Pg+ zV&>NCAmSvwwse4f^A>YLcsu?9$TJkvR5sN31CYlQ6A175V$laDR-=A8V|a-Ymj?*g zy{6LG=vVW;okFb{P(emM03lYWsoG+kD>c+vShzvGyE#=1x<fN%BND={b%@W7$#p_t zV>lIsR#c3DL`s8Q1OZmg(<jLxmmgIM^FS8Qoeev1qQsmD{%>@m#3UiYA+G&*w;X(* ziJMkEUUGS<NMrB*Ve;I~*aS;PeDyRWRXhzE9fUcMdgMne|3vlCl@lFf(>G25c|0zP zop63(;Vd^vOIc@L-1h4u;t%JYnB=4iGeaffC%|`>pJF3*K1L95+RR~>mgjm14jkv! z++RNcj!*kUF3w8o=?DsCfZvr<SB<DgKvPND#R^_!XG<9A|N71Mml}WejY(I9m^8Vq zuWACMo<4vo&eoWB+W|DMO=K8t*4K=X>``?GzV=5#t^vb(8dWSZKRFh1OI2ZosZ6PD z<E(#z3qcx3Uzlo&OX-vyVA1yy|L$#^F%OK5ZS_x9RI|2d?;57QbW*PfUe?)?DUF)j zd5!bz%|3wqx9WefKO+4l_YOy(W|R96vhX4u|0ctwxCgyDH$y=_w_I*inNMwPUV7)X zm)3m~bN<7J7un}8sEIy>(SiHu3Vk85aMa7dB&zOty$1$fyEi6N4KgUwHlHToL`fGv z(&R<^7-4Q6?YVhsp;MC{^0c3Ab@FQKfWCnLP>PG#@HgV<rxP0fNk?QvJi6a>!zG4) zTJ%#O;RmL|tv9DrFOCVyW0~Kp>#c?^F%?~%N5{RxoUX(zr>9qf3*omOcd=XY+d1I{ zK@~2c+2)ZeFuJzN((sZaLWnY)_Iz?az7^h6T~EU6&i8(;x>EA;s(qRGt)-rcl7eC* z@^SJ#)>Ng3NW{z%T_KZmO(|uQ^1~$#;5<&4Er(v1^=R1R<^hA{W?R)OM`ej#79!58 z`MgKz!X*3FDc`lv=Q>Zat`3IJ!nJP9#<N;j)SggB&k@8nLCKgQM3TV7i-7hn-9UM^ zk2Z@i=OwW|AH8<<+BVtCzO%10pZ@xY_(8I)(3d=~#k%Pm&nM^?FZYS|GUM*CSdAiz zn?c;u-qaxnlI1@m9%xLZjW;yU!3v+C*bNL6KgOKO`mW1UJ3jeR<9waIZ#FU_tQ5o9 zc^8h!kymhtP*7dtEn)?=tV$wNl;s+F&Mr!S*pSP368`JG;HQ$pf0Cl6L9I7Wp4>$i zg7>cc<p;Vhg0BrF0wR9YfeuZC%c|jfiW;j?7p=i?!pj%F+PZ$vmx`|9^=s~``*73s z-crD;V@rj=?DT-!q>j-#SmrFZZ9ZSne!U&v=N<9z)}`#behSY5AOG^J1I9c}9FYx7 z=dVQgPz9CIoGuj}7FvTlh3%ZIk4$ZUK)r9X0`AG?+1U4wE#RS;2Lu-gAO;bOf>mU( zt^!FRNx&u`Yy{K^!p?$NK(9iBaIe51_~9^T02v4uga^V0(SeSE=z){~2ndB{#RsAs z5wXyF*xnutMDIc9J$P>q!3F`KI4}SV3fpS|3Cgn)NKB50!U>=XKp;|V93TKpM2s5# zU~)nt)SiX}b&N$t1_a_`Q4^r{5L#S30E_~N1q9%NK@czm8y^C}f<PfKQfvwkHUNeV z17M@t1_fdR@F06T^bywH5e^U=8xOR11V-&pKY*wr9Mk~-h66x7(B21K33U+=styhS zRT~EYhM|was8S#vaPJRL)DdLw7#je>0YJci)J4?+qwa|MCuDDjwfA=@x&Zdu4-opq zZ$E&jB2+u}E{F>Pq8o~}r!xC7pyZD_G%bV|+#2o$N9oXhEdD{YhL6^`{ay{MrELJ! zar3fwb;0|g4vvAZqN|G+!q*FI=-~u|TU&b|JUy|jP&fWB+B+gEl*-NvVQ%H^;el|m z^24+Cc6RnNx3Nb!SyLihP(dQC5a!NsUwdb7XLC<)H#a9gVjB-vXLGoxmA$>Wr5`GU zB$mC4y%(0Vy^9xm4d{Znh~?tyf`GcBTSeyPZRuohW$tMQ_duAtS~?)Cyoi1;^YVbZ zc-kO5=ur1YdFSrk>i5SocfII>@bI*=cY}H&T&xiu*!y*Hy?o8Bet$G?52v4vfuFFK z{UP#a)li)UYwxLWL8Sj9tfl}ii0&_<YT|<A<%FzIsXb9CJ*|aNSw1Z##4K&Zt>FkE zacfH(D-l#SPa!c85di@q8!KxoOKU;6jg6Qk9ByePCM0MnE-oQ%gTlEIqMHcf6$jwM z@Bjk1sBr~EbzB%OP#lPljgLcs1Kkhai7Eo&0#B0Qh=cKP@UZcK;#l}ld@OtjA%p;W zP)i(wheZGtM|D_n7#;*43<Kk%#sMLS1SpOgxTpb*dfdHU^|Lp-2dn<8?Pss{VEX^7 zi=fW!1L*&(+5r^!&no<0zMuK&&#Hlc*5Kd%NbLV-7uY|)f1M-Z3mMajXQ}A#v8I3f zQc=PAbzpampy2A`(PR(5@Qr?I#;Qh^?J=}8g1O8EAPw_JTY{Re+uM|n`xTpglfF0O z;54gn2Pc7|AbYzZ^p~g9za}l}EJpPf?b7SFP9pQg2!ci;ZKPG2WY#K=D=iv$FjiMf zq-V`g$7ozdXD-N*AHIj`gcvZS%GH<EJe}a#;0jF<msz}FVmMaD*>6{neI~2Hy2&r` zs1RaUpxs;>zcav@uIXtDaXZgrnGR9U*XGgyjxl^V2_PLyXdT1e!FMj^tz=1*S4L%E zzgk$EmYr~%RvO^;)=uo`b5%)Dxqd`O#9Jdmt8&DGDE@712dv&&ae3cI5!erAVWpQv z;g?8X%5_i&qrHDH7vGh7vz_&ptts)V%K79@_AfIAQq;&GcMl-a+9%?RrquQkA;d%* z+0s>wtjR3mh&L^g*Q1aQg_jjNSVOLdCwyE3gdKPXV=i#PKf^mXW=f!e&m=o5Nmr=> z3mLJ&5?SvQAmmWYFQHY!!q4ZO+|yZrb|k`Fpxwz-#%gMFhtwAp5Y4l5!^;zf!?Myu zT?4l$jWy1;o@PBFBVwvmx6bE8-q!a;R=AxzE`QDmbL#c-35Otf@tN<yFtxs$RA@JC z%sD0&f0U_-wwSv{<tSZ8P>*$&O#Z=q_Kd;k)7RhGA4=T#U*vT8nb?F;sp(^&evR(2 z`&zQ?jTX0wZsl0Dye%JN(rSwXoZA8@2>yTg*-xkkf?2|y;HbqpOyRe0;GPEhuQm`W zMVuEL>$Hx6{6SQ$2f&z5G`aS$MP3m+@%UThV=UQQ`j&TJ3%Ub?y6wa%N3gIHhZE8H zZPeC1F_iJ%>)h0-(W@-gkC@NhxL|h4{cIp`_ay$bEpGc0RR@L6!}OWKBz$EzA=XNc zeMCwrM^WZ_Bdq|z@mxXfET_fe<VMeIXR#)(ZEK@h6XxunZv!`9O}$~VGyKdwyRl5; zz9LUqTK1)W*~R%>MZufXeup+k{Hxp~NbsaqKglawzK_w|EzACvbMQEErtQx+`!jE7 z79;ET*1Cu3sIRa_ZL%J=P_1`oP;B+C0#qT^YFVM7*iu|6D-X2n9&~8W`XA+}g#>?G zj*MB(|5UI1EMI2O=_+%ID=GkY=*`JbDXR7v%6qEx<kW%Qnk34LSA?k>C&t|5aGal3 z#s!KRWOdb7nb8AsfrDi}vvVgF8HVXnA)%aK#+<`+`SWkjk`%NJOj5749+4OaNa)>= z{7e_gmSZ3X(+n#Ff7yU%`<-_t!`@BrI&ZN%9x%@2C8Y$+to#2Nj1x)h%W##QEy=?A zUD^BI!R2KT`7-%enp2*06GnH^{lOE`@mgq?0?aYa2XwR{Q+MvwZo6<555&Z0@gLiO zx!w6_HslWf2#S;qJ49xJ!5Ium=3esY>36Smwi`v=_tox7Oy+O-t3R>*JZ6>9X|bSr z5H108tDL_vT*7~lffPx9y4%>E>lLU%z&6O+qIW>ax~`8)#tF-%*N<}}Xnv2Yb3PQI zoz>vhrv{~F108EX`R{A*ZY=sN)TMp>Jhh$w99UWZXuN&BdWLm}v|y=lH^*Akt~{Cc zMpF7lQqyF&&|xCk|E*W|e;?QPF{hL7YR?S4%Sh@op6^#~w`qg&&7()jBWDu(R%*o_ z@0(x%`!*I&Br~}Jbrl`~eNQ)6YgN!yqgU?$&PWj?cWX-J;Ir%sbxQ$3aZxKVaT`G^ z8-%EUwJ5?`LIPnWviDP5NJ7F&Oc=p02)7ck5l2{C3ZNqVB19!btOafOEiHw_ECv3E z>%0ED{Q{`W^H@cg+WZZaETv{S+)GK5=oUWq$3-W~NKvgA)h6#F!b{jj?}<U#z16{k z-MHnP$4P;2?JZvJ9Is~@E9yya&pbc_Vvd*mGthuY&S!B>i4q|dj~Hqe@c<o7ET?Kt zyHuM~YY)hsSTpOk)8iXJgU~P+@q^RE(DVJpNc$TSM1#a>*;>1Jtlmp^mf?iSa=Py# z`bm$-h~PF<dET+rnCTL9jk$A(Z(XfbkoO^5%jx*MQ+SeH5ysB!1ZaaFb#N<&KxiFd z_PPUE>$3C)H}u}_K7-pTJZy7tr#FcF%rmwkSk(9HggCH5b0T@prm?Ic5-SE%Hs-&( z^^Ukn9aoB)vIQqy*&a-!IMvv}l4iHJ_EYG~a@Jc9NHQwvZary)ZMSJexiA3pNzKCt z(qdDHAb<Vldsq9b4U>8^B(FVbRN^HfRdN#3XR~raL?7OM(^;DsXqFWOc4pG_9r(|t z!){_|)$z~ppG69P5}{-B+TI+_EAgWW6?B<zl5s{f#toTWeXc-xOA9&2<c|)4i@D+W zqCEJ?=@dsPTOeCoAf(AZe^>UaaS?d5^l99&+3;61hc+S(BVql%e~La*?%wBBPdf?) z(PhdrMavP#D6>0iXCGIK%qRddjS7qRQKt*jfsficoq#>s-uaa-cxEE8TdhS#c-OO& zB7wUrd~-hnRLBQ~_^wJK%{_ZL@W&tL1hj}UF63*M-Zw7~p}u(cGvA@T35+5Ukm`$C zaIWO>XF?Cxt7u;+`6rC(1Y>o-T%!eCOJWYAI)Eu-&fIr+Fy+5u(0k`F%B1y}9A<$W zBV>gMS}VxYPW*Gpjo-l2bv$8@`d;Yih>72_>_TfKFvq0Nf46J+u0tHEHc<JdVg1c( zqmw6g3|+egKJ;jrzHYkz<%o<3eS5yggDZ>AQofm-Ajqv>W7B#%ezwOuC%2F!O{IJ{ zUCHtb+LZ-!iS@d8*GBo<xjjwG!a9+Gp9Lk0tmH@H%DL(5Uzq5Y4NDvmLYzn3dJe~X zX_OzN!=zKI%W;3!V&j7w(;&82K*{h9vz$%!8?*u3LRK>lGs;q_GgqQv*k=ogmUWv> z64pm@&=;kW?9{aj;Z@o=ZRE=TIw5`#Ug0SSuKG=3x=-hYwbM<-!{~IXl7&oEUd@jN z-r<*=v=FvgMz8CSKfnnqtg>Ui7Lt_Uq%8Icx1R_YIYeq3^C;U_a;}>8*Kht)zW8q` zR}M8S-2POrghU7=_9zQB_-91>6pr6f_OTXW=1wyR3>^7Rz9F9yyr-99d3HWMwd>O` ztFd`(???O_TkC46V|hmU&BAfY8Iw6iz&fs#{s!dnrF^fG;@ml>y<w?0pHYy-MXw*9 z45_t%FdpKo!=!H2T}=1lP)3Agw7%MPK<cN#x)<|r`WK!l(E#gXEx7u9tFrXa)<MiU zw_id&U?2OkYbQAw#!TN+LyY6W*+Z6Q>i+neE@693Am<Swgr_9gZ3ZQ;H?k6BEbCx~ z$C>euUI*#Cvp)YSn#0=m^vZDpQnWrqylD!FAx;+fUUMnjN6g50lF#^|BNz6Z$?E}L z2^F_gHr>y)Gd4$r5Z>77y2%9H7H-@|Qi=TJkpTm%UN0^{Bf=-6Stq=1AXn>#_c#p( z9k)a3u27T;5-|~6r$A+CZ78IQ;4Wlk?0o4~ZZrS=b>7P(LI}UpJw%A|I<r?-W`ps^ zU>P~X9KBiUaZ_DI?Z7df<O2;M=8)+B5Dj4rU)8Zo!i_bXnPU19eN-Ct>Ya+u!^ioe zW^B&NU%DHTcgF~gM8}-Jus7m@#p0?&%>0t-#4hMmKl9=^^eg%K0tp#LQD|q{;UP#c zyZ(!5`o2(@Wj3K)F8Q)hAmura8<#U3mET9z3Z3nU8JC>tYm{hA73Oko+->3qnt;u$ zeb<NqG+CbtC8qBfIT?>7CBnQ<UPm+?-ei3kx}kklP7)9q8=l`)BLIFWd=?j>FrfHO zHStZa5DV)k*bAGNeZB|5Zq9XRD~Uxy2B_cIjlFOb+iB#se6L(UGCqJKeQ}3B7OgP; zO;QH_EG*8?&W~}xG7g-bjtECjU23X!!EHW0*GZGe7cRn_&_`g%uHT`5{^Yf(+p#;t z(M!x2j+VJ0kbd$;EVSlB{TB0WtCAjCinK7s^oTd*7ie^^%@^7o5klM_mhU+pjTBF9 zs+_;v$0n=)cvt`{q<-_cd_=}IHG|^qU30Y5kGV|bbmJVWAGftzWSR!uML4kN$(|;h z_%_Lk2(jx0fNnpHIU<C}+77wk6YrkX^4`BE(Sar9xoZTpjDXjy^W|KA^oTgWK7%M) z+mAVymZo^9*xd$p2fQb7>Sff<8fG5`Vdlc~#H1Nj<J5CoR)<E2!;XNQ3Pk2<a7gnV zqvM%#?Upr?JR@)6o5#p9(s3$>yGuY${_DQVe-~NZ(b1n+r1G8p;w?(5@_<?fePq&| z1OssLDF`g_?t$(Dc$T)P8aTxuKna%?dG^#F$4~QC9w11f-n{e^A(A!G4LbgsdFN;6 zcRfmlQI|Yw%)P*XjJDkE!bjlwhC8wRYNAiAUj{oASU9CVf92dh3Tf;PHAH8Qz?@Fh zO*u+{A==87wtbs0vh96`1}6b)O8oBgsY|ua0UFy?ht`!bD<u}vX{F^oIAb02+&D06 zmy<M}2iY<wl0(VR*dF<AIjy*1V-C$zFt=`+wv8EdxnovUvnsEWe-8Y>``dZTtN4k7 z9*HFZG8ZEcFM{V`1(@HL6m^ls?-&st0!qPhH$`E6PiV&<7?%d|r#qc?u6G}_m99Xl zWS!Y#7nE5|1L<w_fv5DL0R!J-Ytl5*DAdC3@hTNsc!-UkdmgY92F@Yn6J;%al`YmU zTnI<9Nh)N<BDBx&3?T;cIFL_{NO*2!MeNp^&c*Eu!*{XFcdr?J<2uJ=*8N?78t;t= zzO)Eqa@4aKwB(1ml?$}Z{6r;%7mGt}%^5KhnX=*AQVE?CJgeK9e1WmLx9yJzbEq_( za!s3a?P)jz2#wRHhyegy2x=r=kmE?#7jKidaY{}wqt%R<12vOsVuLl}%;^XMl4s$( zC+17NES@nmJ$N1Z&<>LJUh#inFgX}xe{z6PTW;kui3cYivgZ07+iFi9_<qY7!r`qI zW0rg3L=bm7^?mF)&SZ2JcFYkXG+)RUAi%M67VjK?`{rb5p=Z2dPyN$KwOg0(RUqTC z4sk?a-gvan;gyh$3rwvPpv(s?`K|Q}9Pct4<{U15Fe}Zu=DkRJf23&7c(g1yO6Lyd z!G3eRsXR3=($|a8GS$Pm%&hb?GjqAy{ZgQ%Ve4B{Wr4iYaQSH@QNrgB@i!lgs~bb= zE}Axr-Igjlv{!fd6I{2<N{;epy34)NwI_7B;_TXouO}0aFA0Upo*~6uH|2Z~thqOw zs&vTjuu`U<t~>sPC%dY|>8>_;9mQ)NL{GTP+qFcwf`cI!EaHaKRmLe_5LOCn=&b8% zzjx+?<cWE~hwff4bXO+)5A9W8R_N+pAv4G}4!Cf(^u<b9CVfFgp!V|w`)lc5I&M}s zXFnVSiNKuDb$CG{elSFj@U?$nWTm;aNh_{5%~R(QFw6E`l_RC!cf^TRv^rvcg#|!5 zXS>zveD0vXF#x$ESHpPEjG>b&u_$nMd|)!ddDh~H^n%x!h5|x}qB`~xVX}_VSIHj) zo~S`1KCEvsrCA%CjYw`gm4r@;jJYIRpWt~)M9tva^(+4A4pjEL1#HoypO@y8qZ)!h zSsL3%B*_-?4OlaYpF>4S-|Ruo+3m1~TYLi)6&1(=-K|eA*3Me{M%6t+19UJ4S@ZXA zXa>dTy;9A-_yxKyGxo&2s@uG<WF+8Q4)*izM@L1$H4ED9gYHf~La5D;J<?pRY43u4 z5};Q|D84KFdDDRXAh;#wY)5}%a7#=AJ-!gqoY7sc5S`B!&dAQ7v3$=!R>OEwExWeb zLEW@@`hYcIE*|;c#+v@68~7&sWmEDe4Ih?#msreKorb)K5}kYGll{7OS_ayjllJ79 zL(JDMBB%&usAOEOSuWiLetj$6?g_pv=acaqkBV8-#bER65t$Fa#fiTbnxVa#yW|11 zBZO5o`7==F-7BdlhnqOk8MhroY{DF<<)0C;DHgOA&vNF4C}B~M7acRzMaj|vktZ5; z^-zG&DWf<S&`LnkAUe`C=3rj+X?je@pvq(TBZZK;jFMQfdi-4G34P)zYgT{OJKL2< zV?@M4Euz`2?fKqDA)cpX&A3??s((Kty6vqbSV{HbN<o0#7M3I$U4*&(%G0G5Jh3(( z=Uuh(Jk@nl1o*ViUj<F4%L;yPpp=n3e&>h~0=9Btq3Y|ozAF&=inpY%`o(U(U`k5^ z)08jJ3z6JXJV>vEIse0dMtY@Kf}n6727B?k>8#cfrtxA%vX4EvhM|h#=`lIqg{WKp zf5fH(Rm#6UIIM_Gv4j)}Bim$ogpbFmEJx!@)VrT~_}VU;eO(F@(2qCRJ@7okTz-zf z&GQVSx};bVkIufKSpCPqnYD}xaM#^euiJ`J16)JzN!_=sdomh6aRG)#X8?qkk}v}W z&eN{Ch4<NlTK3_|TS2xU*|~@Ks=-^IT?noL2$R$jKOT`ef+6VQDae9D_;;l0`4cMm zml2_ox{<syFD--HYs<4whC5KbKx+{&w|J$;pXtPs?i2q&^_{jouCuht#kf#<^DU^Q zYe>1PuCf1!5Q5D#j{nN>)qA*0Uvef{cHP~0vy@qd4E0nz*4VlXW)2Xjn3J0R83@!^ z;b#>aFDMX{yfKjG5bvt5+S8L?=_HX(@iB2Y^D6;v&a+H-sA*~wb7_{F=4qIOeeX5l zC8$o(_UPYyy7TSv*Zhxf^ZW4{&b_)Xc|=Bp$k6z7U|tb5d&HEAgx%SlR!OJiRW07g z2g{ojO$FZ$d~z`-zWy_Oa$}W7AU(>jZpKf_yc@N9q7wlUnjGMi^N^I<3BSg|EqZ{- z##}&|zYUX(S*c0A__o@qV40XK0S5~Bm7I|^oMGMx_lH*7Sb7_GJ2DTD4Vc5U9v-sc z4+~tZ?sciE&k9`DakXl)Hg{V))1r*X25Zd92p_bI<VM}!Uq1bPS<es4B)y-(LpSy; zRY9;oGZ(csEXnih)+BR9&KDZe)1;*aAIhl2_1E@|jL)41<GYt1){#Rh*yQ}a;`PQC z=A3Qa1V_!m*F-+PJ4lcOSd6x24CCa=F<S6hUaJ21fOiTN^G1)XzDX*AH)}Me=ZH)Z z7r>R~#@o@SqHJf}rFd6|1)pB7^T@fzCeqi8Gtt799(F7RowopUzR@&qIz%EE<|0|A z4X58#XL?(R&TiKTi?$OMu9LjEh!yzjg!o}Vz+ahR2kxo|o$e<w(qG^$eK3=7)o4!n z!T?96WDgI^-#;KQ%N9N1cae7n%qOTFeWXA3EQfmJMiNQWap4UvY~ZxE5*{ojF~=7F zA&bdi#<z-Bg1t$)JBqSj>fF}Rt)#_CI+-4NL9J+j&Qt~vy5fM&UV%Amz&W`ZQkw+x z@Z)1~8NC@hla|TDPsMQUyfzjTgck{94==;fzcRqZ28R!153`Hztb)Nbq#;+O%Rac6 z^kJu*zN_j%w<;aGr~EoZ1DwxSoVDBMoEpdrOupd}szG~!xiJs~>9@XlP5jHp&clA4 z_55qC+#jWwL>b10x%Eaq;JqUKQEPgm^&OruWi*$nwp6B>#Kl_2WR-k=lFvNoIRJAJ zW27daCvE^9L|jk3Fe6`dRqRoXM<K-OAz!FR-Fx6rl=Gnx;;{WoOk=|pDwKO&H^lUl zI#rpyQW;-giuypzyBcS4vnzV_`rN);61h}k>#t7FMaHU>usT}6$2}QN+vmtUsXRY* zEBQWU^FdbuMr4=%=4>MB1R+`_owgt3h<lc?b4l%HAmM#6NAntg1o@-KNiU2K@ulFR z@QmiJ-d=9rUO3t|UOMQb|5eccedy#JU~DwBadqfakG+@gRN@f)Y^RN4p8`dMJGPC# zjkaPcV*ia;>8`R;T)LZS?-%7@IXIdFH(;huHv@AOFeXruowI8F<BcRr;Zy)O@951$ zaC#f|WA!l3sgsO!li8Na)7;LseU%DgU?I``*?AQ&f0BR0+vW$E0=XrshPYlh`*A`V z6wH0c@4>Puv85SP;2>jnX?t5o<C_*z=DmO`8jti!>2|?pyxp3>*X$)XjhTkKI!S0v zuc+|t%)9F59U|TEE#aQ1M2o*s4o_k4$G<_ly+-eCL9vN0;&#=iw<$s|)O_3K*LXKl zwk|Kc<!RF2)aEt4QnpXJ4`<qYs&J?_zhZwV%IYJ-J)!cJyr&r6|0%Ylt4cxk{co2; zr6b!v_|tDh7yTdSL@jb6REQTK?UeOz<#bF)Bck|*2PUt)OniFp+(y}lBNE9vHnl=h zTj3=4yzoLWuBShrpQ<_0Bc31%&CS_<vn2I*a}2Y;!O}1X!dd<jM5^`tITax5Qokau zroEBmJ-HaBsI7n*1L|2|RP~|tV9ZLz52i()?Ba7Y)A-(3dm_h*Pr}a5LG5<-xW82? zQ?(&Sl|%Pqw6hxKg6#X~^RKg#&tXxxJ$M7Xt_m8+2+&B14sW};Ikh-<nhxiP5F+#L zkU{Pjo9!4wgA?Xu3q$6av!Ri|thbKr+Il0{$m9)&BD6vobHJ1{KE>}>z+KGjEv?0a z8BQFUk)dl<iGX)g>IgC{IVPtgLWr!lHpu#-zS%mcVg<LXs=VVGWrNO5$UTZD&sbX~ zxZPB=HPBvzm>UuDSsb5&>lsAoES0+zhvbMoimp^j=*WRqEV)c-q?-s1jSz<!TjEme z<HrLhp{p9=O$uG0Y9R%qxbzp7W2afAUHG3_EvwwzpICJiZF55i2jDdB^<Q|5y!`0n z!C^y;RoWDO)_JALQkVDV%Ky#8%F0lf+d^mJ7EJu$ddh9hEuZpIab8;Xr>AMJH<|$M z9+4n`vDKkNPlC@P^x_FveC?TE7mhl3lZ;Us(EAvBn4L?1G-v8{kpT7jHaQ;~-A27W z3}i~}+MwXpHD}r?Xt?idDxG8Dd=9Q_pqa@Y;z;o5PG|e)U+=nLSiKbWiqpN1af%aJ zBp=`Bv88>!DQ|B&o)9DfTe$S#RNDVYC%_roc*1SK)8=Dpjfou<c5ykj@2!+P9O8&^ zdmO*&0s?jG{l4|H?_Y1`&#r{gMe*~SP5jhFoc^7KA^B}|xZ`CYjz=?Jkl`cZs)elQ z`FuZ-K+%ihM#q9g%=DK6oBJC#jks&xkrKeJRuPoPoKeX*`AC^`hGsyt;y!!S5h28Y zt~k=$j{odf2=&ADwr}+Vh4J{gZCr0CtzYY2m|{LiUx_(u^5Lbg{9!dY>}4RFW3sC` zmCrqR!$;7$&IF5zmEdxsuseR_37!MQ+uvuh!K^GkIUBe%GZ=PWBs@fT^gO>rHHX+D z($H$n9!J5v=JX!{_w0-lFcib}Zwt70n39Kn?97|9P?l41abC}GdFfW;3vYi8O4z9k zNt~naXlF|_Ep}Z0vL{Vkswa<p%JOz_kTI>w_lCTM>V>e>;+-0PD!Mmmr@pwOHLv^p zyi<mhO{NPgF$M7IyYi*aB?^2RCUCKSgFvzCatK!TBa-qv_G82dfS~=@7_FpIaLsJR z81hs7MW64*CCdR>dPGY^Ig(diVmK=560361JeTiTq2@vT%8@PM+vPYaVG$oEDsl*x zNMil9kH`$MR(b_|VqvKTneJin#!P8`)Y>rFB<RfK6o5+4|HI^gmptZdn17>}JO<sz zV!z&jRUjX-<%kw)2T8qs8g_mRp@D7U6$xC8uOpl<I<Q`0Zk_(OS+D-1GHb>Gms&2L z4WfP5K0npTtfl?E(kM*$8A1D9@V0!L6tU%AxPsXi^q=~vLEyoqA~x?e8{bbfA5VQ8 z#wzEzw0f2XNg)ihDUd2p_Bh^YA+(6B(Aofxr|Os%emiwf)J5(j43YW%(3r`;GW^AX zY4M8%LOXlPUp97>ULT%g@UFeR$jq0ZU;Wh~G)!i1>N!NipUju}Poz7R*rS0LrE2ZZ z-Pj41gUqxA+HZt}n3@qb9+4nWaaiE{Pc=keoV(a%4{y~}5K?XIO_P5?O=w$jOvIw( z!ht%6KlcuX!b$&a>Ku$pw{cjv6<y0WYCiJ>^}|aV;lb*wR_AUm3q!M2Pq*~0_k{Zh zYogO@rE?<hVP>(}ZU1l-Kj!rmorC9a>2YFzDK3S`+ePkgJd0~S^YcU14{h{gmJk#~ zf@8~S49k{^GT%dnha-hFt3Q4lpwBi*{}cs&joZkwJ%%O(=Hk<VG|V4u32MG>Z&N<* zS8Vo8`reF#)2zZBoCJ!3?CpjlB3#EE8(b*ywT>dG{0z70jMv=kaKrmD8hr+GRY4c3 z^3cX^XW9lG#n_kw3q$KYDN`)T%&3g!xu+H$sW52Av4oQ^`g^%XUpLp>a+_1kI3gp0 zUOL3;Lbi&*)v=hI*{|7}p^E`m0D(Ss?_@0>;#Ey!U!&hfCr_E^>AHm()>OAu<XrIa zjh(Fq-iGciNlR{;ds`2V)5?Xildj?pYNZ?zLNFrlnhi8@8)H|ukHm`dz3;QXd@Rn& zQnC0spozcyi<|#!7&;ah=G<F0<1OFBKFAUqOGHKRF*Yy|dT2?`*1Z5ebGPf2u}iAw z5g`N<wM%Vi@P$U~!OOLE7m}5LJ9NwU%8k{l8SZPgHx3_2P3>8mshAlN{}8E(&DEgh zLx^sO!fhje1_9X`x;`C_XB#Oa3alP%dP;<wj}p$K?emzMBV;NceAZlJhzh^-!JhVm zWnD<}TlVikj`|b$`fq!CHYbnBh~U7bqzvO=52;X;Ae9Q^tn(x}r~i%4Bx73Et!d}v zRIxeK06j-w4z;SOz&^c9dTs+I8G0V5eLZ|aP*u?K*~9Lwp*Fjf_WKmSObB4yakUy{ zv$b%w(z@^@^-~-4bat_qx1N{ciS_C&GvtlzDNFY@Ad!u$w~MuhpSg{%fIq*N+a2ut z#}@EV0W=`EKmaj_SQM-xi**%93P}Ps0bwJcX%Kcj!~%K`dJcCJ3c=rjI-_dgg7852 zAUe=75Iv9*0099&0DK?-2*N_|VS9Tp5WNSX_u#!f1RDf^;=lkfC~U7aq$r#fkc1o$ zrIJ7ufIwu}I6wfHh!|yT0Fx6Eq4qQ+sADWDG9VBii<$tnhtT5U0bmqBEFb_E41$0m z*!U0#76b}`kz!MTumLb^7yuj9HYgAqfCt&zp^vckj&Ok3*m$75BQR=*`T;~0;h+ux zFdP8tf%ZP=N~nu~P<3zssM<IHFbsVRMwJ5bfO~&{qK+VY$JhW64gdoFqb{lr7<EU~ zKOuWNti8WO(FL&Iet^&?e)|DL6`|U(cR^eb5ZzELMOS+lyuF<k+y!on@SyzRSPS6= zw}yMc72$3_78`gV;GW(deyC!6bnV}(5vk}HYAflPn5!5InDQIwLUr7{>|I^(eyERQ z;H&8B;)U?_0vmcb!Qj@`9tclQEGyLg@%MJ-&cC&S$O?52FNC?3w}%J9#mW!Q+S}O~ z)qm^}PS%tN7aLa(D+H>puf4Okv$?0Yo12s0fA3_(HXg3d=5S9ddwX+BKQDwQmc5I; z7nZZVix=1haS_YK)dc}{MYoX5&D+um1rGGIgL@#%T`e6DR$fHEmw9=>T|8|N9(1U7 zpnCD%ZGV4UbJvS52oFy?dpD>j!o?clfxTZB*UQ)3>i5U=_Hg>yI6)7RKi};Sqd%*G z>O{o<{ozsM1>l0@<t)Ydg)BwHtc7g^#1R4#sJ!>Wa7$}`xVV+IC|p#;($ZQ&gx?Y_ zAS@vwASfb^ss|So6ow<j#RRQw5MoxSsOyC2`-6DJ0r)UHfB*nBm;k7L3Bv`71M#u( zaR_jrP3j-f$>dN)AY9-{5*%?b9u6Kh9#9+$ABvBK4<UpQKo4q(L-4Q&pyH@rDh|Vg z;DcePVT}hS1d#y6QKR*La*O}ot$y}8_q+oBYWvyyJg_|e)kRR}_Hn#_R_y>n`)3t? zFW-0E`m<`_pEdZmKN9=@*#-8`?_cNe91}3Bq2Tmp&f_aAxK3ewljoU|;lecZ3)7iL z5+FBKoS5>L-RYLNeQ2SlD#7s~>e(@XV~K?7k|MYuCbeMA@HODzmcSLJ{Ogl%^>|<C z#14J<O!v!k?O&4?brzEVkvN`D8{uRduYsr1Mw~Wb?92B`c*PvS4<yFlx@*&DjPu(n z0ntISF_(jTR0B`6*^DrqhCL16wMhGuq;~C~Lmh*)YSdtRhZp@}dQBXjgTSRY-d*qO z^aHNcXG_o9^DnN@J568SNt*i%6Jt~y)z(+s$HEOde=a5qlPWh05C-tbo;5sOEiGxs z^xn#r#+&bE6#gC{6us>;fc@Y9^ZO5w`3tj%Gp!xOH(Tj$1XR<ikEvw_*n)d)1hFUA zLe>I>iVv~t{+F5mM_B|2yLZCV4I(iTSomQ3RhB2yUHf+*M{hUu<+$%WEUHj>>v90z z+JCehU>v_KL=m*<)_miE%(odLe&?~a*wHMi$l58{bJx%1eCf(t1y6jNa5g$abD4}s zX?SFAh~7tjE;m$T!BdGFGFSZj`~lRew)Sa}IsNQniOvbgjGObdN<Yg!p3SlR1h#&h zDUL#15-mR_ZMc`c4}!_S)e+&sB(T>UT6rdy-wM6Zg(z8t2_=1a*}K@Hc+mdUQG)A! zlMnGt{s+Ycj}wc>XD3Z*Vtr90S!LkgKd)ll-vf4P;BS3?|BQ3H>z<)a$0p8D^J~(2 zby?sSu!?zZz2Z`p>%_W(qwvsWx5*+naJrV#sw9s8%kw68LvYJUksFh>GCmC!BUi7A zI2Ao&RXoI3he2a;oD8|hD=#iv!LfNR9hg_J*4G!}V_M6G%C^1w8i>q}1Fth;o1kRO zOk{`Wb#@?KamJ})4UzSQB5|bqC;&V?#m2%|k7G~e_Sf*F*jJJgwg1CBkK<H#1h*zH zgubD-*_^JY9$qv`(Tt09%70oH>dK5%s6BuTU=Ei1w?PIDJtjh&rup?#*KjUAHtJ|R z@7j)E3wRNCLaUo!@!JQDkHupA`!gwa#)I#&^vpJ2cks8RHf*OwQq+W(&6&GgrVTt2 zVaz@IJR2ZJAu7`KzBU)frWy9M53j1P*Fy2@<@9HW>5Qvs*xN3@&Y6A~5ZbSTRTILz zHL&_3s0l8X2TbFo^AA20jAv^K?7;tA+t|#KK)W|*bB~|@CI=~^uO2_`m8P4fyfgfK za4^ISQ7rI202(BCcrF%)?gJWUcHRq_o>|*gPbuAG*Y%zIM3ql|y|Qz_0J6|R*i&Pl z4gx--mZzY6@ET(U(_@s^N1L!B9i1B9*a`<FU3fxDJAWX#0PWsQqUKf9<`UBobRKcy zgt7as9`XGz_eswqHAP%6<PC3FS&Fbr@c&yBvHWb8BVz4_yvdlVO6YvEP0F2nUL)D$ zOo-CsGctr+oLC7J=q|C;_AdJk7CHE$fj`O4;FEK=&)SML2Y-zMTbVfaZC3xfQtjZu z{^a1WDH0TCTRmBO+?--dZxOmk&!_A3c_%_7Zf!`CIY(w?K0RiiBGCEarjeFb^V6i? zA!;%)<)cmOvelg(tO>!&m!*ipF6_4#_%qi;z#lRu>OViL{p(cQZ@`~@V|0b&;5&Ku z$=Ft`YyFL5i(5Roej5~AZMVg$BK<V<$nVd|CBxa!Zd;g(uOD1k{3JN|vPAd=-%}P) zo0-XPAMW_=imxV>WX5}q$4DI&LL@+KtbskJI*iO5eBz%#Q=u~)D_gkd@hvjRmmH}N zd|xo<QF?g3FMl=?_RBFkBAmS7=f})9+Zb+1em~KOM|`6t<Lvr!<)egznVjs^`Gc%` zn2Vlzcv<(rFt`u(d;$BaUB>(ycA4s{AgZk%{RG3&+~u{`TOaO9-#pOYItcl=+q+pF z=seYhjLw|aRXFeu=Zw2X=bG~<<$Yw3D6!sEUmiKUtIiM>&Cc)v-=v22Y~zf8d;9eL z>+d5nprcnhq<O`|7D-|UR5^?zEnAPjR3za9GV}G{@9l_LDOLzw#&Gc0Lg6-_R<Re% zr`!l4BNcGX@}f9%`)@BMY-{!@8zi+}JR*chW05aoj?$QwfREiz8*E#ca|if}83YMH zBt=hd733Cwx<Q9wP=-QZmb2b^K$1~Ock4+bY`aY(%7p=#Pih`MkQSRl1o`WP_(5jR z^mL{=r&|0vF?lnK%;o~VdrnA=;{BeAQH5*<R>s^$2AF;9o`@(F_+E1<+(*pFc#_Zf zp(7XeoXP6}UI`VqR5snuwKF!qe)GQ`)_{M38NLUMdnAyaA}?t`9V{l7#&}OL5X2&& z2BM%-TDPY1m}z-~x+d^vsWtx_sF=#m%gfDEl8+Ci$T{iiVT=BDbFl?$s~7-@tX!R( zP*yaQ`On-1?u-Bc@$5Z4y%8ShUqC!-gr}8<J=*w&x^vfEP@e|NeEQPz3qmULl0`8k zwy@5xo5x(g&wM$t_3iLN=pVlHoVPXi{T5EfDaLAbz%F2Ci%HzQh-|Uxxjb~CE&rSR zzVs~Xn6L)zYGT2;aQ%X4czI5m9T9lu3D2VDn#|Ks2?+B(O@Tj)Wb@yoXQ#g@?hR(` z3x&YrtDeiP!rSE|f+0$l)w}IhmxdL{?PEgipUc{A9YoQ^9J=M75k)tya0^%HdJaVj zxBLX2ObDy6)PTv>SC>VaQqajQW30z+WR^Q<&vDEtD*61|1DcVq^m*sfxSN)jp}Q_0 zw)CeB--ggI58ofeWjZuAi`fxTYq@YMiFY-$!L~iMJ2ab(K6m*l+o?xa@3~!x=KDr? zU~$7-r1ihe;)Yp5G(XyTF8D~m_Kw1b!I`*|r{b>0-{<xk?LN7LmjSrOG)J8E9gUL5 z9BWdn7kx1`@oY7}&OE{UL$F%sJ>$gVePcdl9HV{L!E;ncWJI)l!R{F^;Db(plgxTm z81mag)rKn~WoMr3q>YnOW>M2MbE7pZn9G=b%^|$U6p+4fV@jFrcG=)SrX&aHh14<@ z(iYFepp@k!l1ehJ<0Xh*7-s*XVZ-C$J)-NQPdYawk@)<kPj<KD??gXgD!Mw4P6B~B zPb#;Zo?Zzqgx`AH#cs)O=Y$soRk(y^n@6s|=-Mhv!%L3Hi0FduFy~%MW$F~6A7?2c zFB<1F7G`D6?XDncN@cksw|VKE7dnR-=AfwEvcf(t+PbYinI}?i(*<ipctnojuc<qq z<^e<>a~sV+Dum!`=2K5*X=Yfitg<edT0G5SDV6$O^-@Oy&mhOR>_Pk#%mo$wXT(p5 z>*39-IM*vs+*N2xA}~Un=~9z{Trp4&(hr+x`1G>e&7IW?4bH}#Q}*8&5cBYGO3lEy zSI;hdEefs&mdOMqa%lw*X<#chS6(X>x(#uit^@Y&FN5nF-u6m~4Lvy?Nu2^~7^we} z`Z>Ey;0d=-O{NeDg+A}WGPv$*YOWQFuBv_2xM2g_)r*FPggNwjT9gdf=QZy`pzr=N z7<k5bzzF!W+CMu#LNY7){{oJKNleL5Zi+J{>E#r}{pj*6=zLt!caatU*=Vk(U*^)% zip~$0wDF_EXJc*}R`QUWHS?g=O*oDnzD*3vxSW&&`X=;6E*xL56DJyccs5hat`H{V zQV3G%t`dZwPMt~)cy8`M^_n(G?3g;G5rM@V6H<*nofS<844VG(^<OlBo-M%WZb!Y1 z?s)$|sz;6n-_Wx~y^qVqXldh!Ov6(G+&z{RJl6uP6OBkup3WfQ<`{lhKgw76B=sBX z@QZ!8(Pr<sVh&1UivhT>j>nhquJu~gsI8FH>(Owl!O}DBJS3k!aC&3$d!O`;J48bK zCm{vr$T-v0o3nfh8?7?9Q6c`XDY)6hoN5iL;BQ?bF2A&g6eNi4Sys{vC<w<&JN8uE z*(7`PL@2$DRO>Y0UYKbabqSD*u89XvRd@uT-CVn#p#Zsb+XuoO2C8~u^NvkC*lyqu zUmYg7`l{9Ddporf1BP3tbM!ZFK5#efA95;+GFc9cP{|V2JAk}nj;sG|koUvZ<+lRk zcA7e@w6<M|I-7Djwvwqp(#TBy{CKvPs#n$xJ=Jser5N|sPyOdkDt${#o5YV;Nq9QO zp*q|xcVBhtVSwG)h0MSMDQ2oBuqUVZ8+#j8^ds^2@9?6p({5@_^29sObop@4;M_To zVmNK)XMjJe{j>9zo?ov;-TH_LGVvhY%@Et}N6!iJ!-rf>XfEY?6EDdG@Qd=0W>JyY zHtYIvNuw1zm~$>LC&JOs#RHsEs&$vUK_P^N-SnJMCuEs2;DWiaEk6B?qrrRPK|{l* z6L8l#t5#{onX9qzG_&b0-p!yW8Dt=uV3rTE$R(>lubwt(voVxr6?!3@zh1s__)See zJ=u%w%G103lq<LEQ^|%pDu^G0SdIuGup0<8B{)nB*H<QC+{aQXh54iu@bhm**I#0@ zU996;IZi-|cDK<bsM|9=V?dDk8;#wEw~W05jK?#EYz8nnPmSFx3cL%=ViB?Jtf0QB zI1TjS57S!>+MfUnzq)@MU->`ey#-iQ>()3vGjvOrNF&|SAV{cypp<kE-6bF;UD6E_ zf`SN0Ntb}M0@8@2ASr@?H2-1Ff#d)F?zx_Ozxlp74|nUcXS4S^d(U3$UF%)Fu4Tz| zSsL&>>#J<soaJ#E%C%MSOD`lZ?43PZ002NWdSn$~>^jN3%~H&u$N@n@>HWp-yyuft z&vVPCr-mk)kE15-e|3GU$-M5OadpC)aVohOdr?vZPs0hLA<x&~C`U@&H^cUd!S3`j zGaVJBZfFoN?!wPpZ>g%l<vx5=)aiixW?jkk<u(3o(G+^>%Gp*F<$;mViVMO_xN{yo zUv$z+A7duVzL6M%nToJvXqBp{j<#;!;_FA96#jPM(kUX~7l()3uE$hK=tN^tTXT<J zL#%u>StPD!nsswup2IWxZn8Pd5CO|-vJYc<B4_r3f~9zb5UB*COr8-<e*MlBNx+6T zVokw|p?CF+mlV|wrEQ37Eey(SJ`fBjRn9agLgka8=#APHSkV!F&VI&AfCRg2jKXeO zIN8hx3;C%J=qhEsf>*xnhCG>ByDb`3if|@OLcZ{;p)iElsd9#(VB&P14Q&(4`{`|~ zwRyQTVTVo^C&4k2qYTlU_A=>APw*wN5DcZ$7y5@#BF?i=B3nDKjU(8A-Q1SL(Fu}7 zXT)J{4Jk_C$YEz?U<5X^wSr{Xv;Q7r^c!G+ZDtNesnI`zZw7309=rt)*-V%!fBl3s zXkxN?MZKV91!nIGS1VGi-~;Kk_Qs%Zw75RlHHdY@t;2p*?4{rCA69fm>9NO|(UM#_ z%}3vbUt7XKldSIs$yK7=Yl192m9F1bq<&0>F)O}(_{g}DvOjb4f*?Zj;T>lVfoG2$ zmR`P$@p&n7FK5|S_ihGH1U?6=q`i+og5f(Tzg%1-gp(AkeQefvta!=y)?npC<JQEu z8avaGs_lEO<=#7*<IPz=V1@`-@=N7d$@RtS1zQfX<PWF?8p<VG34m%d@=98Rq1^H# z0aeXs{4&#{mAghW+^KyO$0FwK6)%U9yC<7I0i3uh5tKUp^EJP*h2QpbSGb4_M6bPl z<BsMgpYRgkC0MUlwt*c*8*hg^HBNm5Gf2RfH%Rv%)rvptli-L6R^A+BWRtZ(iUy%* za9lZ*Mrd8SLqba053PeB&^!mH+NEh<ROm-6OEr}&8C+ysW@gm*xs}b!+@d$fhWjk$ z)GaOuB5tkT+VU@EbrGfJl`i^$pN7ERM<wu)$9YjmS*E1<h3mXx4>UXue%3jnjGCky zjN?hok>n`?QLDGy9MRi=1+Ese)AifTV*rW^f{5Fn)AvA*1QD|<(KwGqlnT~gFzfg@ zHMzZ8ODPRR|7Pcp6Afk30N$@~V$v*uKP<z+bWb{7r(aX&K?Y`BnVbJe#z?Nvi#>5= zh-CPJAVL9&H<y^Wh-HR+M{3>LV+C`k)qu0I-H)r=1jYZle-v>nDYSJA{9;hTRuSFf zWj}sn>iqOMR2azW@PMDmx?A5`e1?puPOrEfhKTqZ`CMYvN$Vbwbvha&(P`|P?;Rv& zU}E!ynWxe&$@*xdb*G<-^%;pD)CJH)(?5Bfkco#spOM(U!<{dCYpcky8GSJdQs~J; zPsw7d#?UbvXk7Wez%!tOoZz96Y1J28YXz1)j;UZ6f)0*8msl-Yz)^>-gc@l^JfF_E z!=0(vI#EfI!P_>e9BC4>!^Qh2de96b_?armrx-R@_Z3>jnuqMKF(6XlzlmcyoS_B# znDqfb$!{Vr2qJVuo=2iMq!440(Ey~2tXWHCBgIG!yfN~WzAD8tYo3<|ho9Z^zoRsG ztf@tBQ}~w^F26wUu5dCNq&l1Z8&~DQ)|?3AyZ~x3b$osvXox5L(g3s`YP=l@1*=SB zXw9MrbUpP+G8t&>E(h~avKz>46Ubi>iZCPA4{^|-e?v^;j+7sQwu<;{<6D0^>EnJO zR!2de#=e2%B4}(0{9H2l1QoR>NBb1%D|?!T$sc_eB}yce<{83cR9*6g%PPKK5JZ@> zrEzLH>&gho$7*HCwn}7^KjQDsc99{&>eJ|TMve;cFN3B5z^^CQ%4Kna3WjTh#DQ$D zXhE%;LQyHw;*Guc*F=|h#IqYN%3|$Ux7u-_?D`%_;(A0;>~wBXEa07(2i;n*P7vRS zFXe7B^8}PN!LMt<jE4eWlo8GM#9`|t?s@#%Bz9I=R9NOihg56B6Mfg(E(k?<UIn1% zO_Jn3L%jMZ!e;L{uG=$kh%H+}1&~^O(~zS$U!D!B3&U@*?tLu0(j!lS^k#r=b0(l| zP?^hpB*lh*^zc%|n`t@s#0!FmM`<<dGqDQgnqeb2)$%Ed&$PAyw>jI<@xa%nSrR0w z8nBk3o;LVdhcvMRr{CPZs$BolDWsge8jRW=+<!1ac1(fo$9dR1O7_<g@kd^EtnbWf zCj;<X7mrSAF!I=O`bXQIQqH)``Z-Cuk2gX4XXZoz{nf_`sHOUq`yelIeLW%$1gzdj z<ENyhyKN6#?O)<w6uuZl@5iyeSi=&RQGeaCBDqOkk=XLeJ6%~iZQowHB?;8#@kQtY z1;2zr1qYD$J^sCbUYyn>>F<k7w+b^FBW`wo`YI%V|IA9_-zX4|fRddw`Ow!%?PYuK zT!fFKKV!bUn{~!SkgU+vRXQ!24Da)D8~pADCYE5U^Ku*fni4W{((-?l+lURmR&xXC z(;88&Vrl%oM!cfJ<R&v1Z9J+5wYur^!TKif+pp>X|7MH+>y!9r3-&)bhNaaV67mo> zp%FR~9RiL}(>UCbdXwD2>iytdSR@~b$JV-Yz4RHK7z)bwZeXf~T~Gh`v2>=dNif}C zjN7J~9shk-&a|L^%=r%m+QbN#0oNjoDg7Cl^VC*c*1uM-K4qJ`)yA!aU*9Ye!uITA zWbd!8^I0qPU9^yggnVymWtH1@fmB&N>3t+uXc>kX@}8Zf3AbrwQ7*0b5##7UZDH^; zO6DrYy`%jmf-6bi*B$rC>78Hm>#W)n@v+rg&+Sr^?Wg{hbNFFwvae+Ak9!N{$x8>m z0-{2y)Sznp+8f#+R?P<~<W>=9Q}_Yq2e-7z>l2UEtWg^*ls<YB(r5cBHrTo9I)A^c z@OkTO3ZGW%_}AMX70k%QXiT2hKFRL@Q`xXlk#vr)o4lp$>JEMs*};*!GFS^Uh{4yx z^xPSBotmp=6*FPA_=y^V);z}kmUo5EHSMI<!=;-Q)4mpi&=yqi%VFS>x97SEGC=q5 z4rcfLq#te(6t&)X&saND6Fh%=r10YfK}1t7USDpu>X?j6F~G$`+fl{qOMYe~6P=th z-%F{b1WwSf2$YAw4-tzh<pD%(wF*?^_?P)JBvSDt;yd)}sn$0X9KmVkW`GNVh~^qn zrKD6~X-<KHUi_`w-aU@@ndw*sDX+MB?f;Oj?9<OrJZ*`vi+YC-P9=LiR2;?X<)rp0 z{WD~5?N^w`(j|?AG8i*;WlcuB*O{}wAc%Nty`pzWx4SHX&D9lE2`*iYlG8akx|x|N zX-j^bS9V_itM7>@oSL%zchvui?ctN^ZXUADi{Z9WQ1VJVp=5d-OGZU-&8}Cis=YeL zuJMo)YI%WQWyLm&hE|UhydWJt(6vi$xNcRvJ{y4^L~2Y41pMEDkBBY^MGRjx%h*w~ zV7R9RP$<-2m}>R;M$@JjA}wrAs(bbIoU6IOXQ=ZVehPp3G;w`p*!4kzTWbjIQCD5& zw9JFqUo{D#R1_kihrXP?D2Uh`I3|f!m_SOeK}BBB2omVLGIklk6w}M1ZTEn2C)k3x z8%hzkwjALUr%!>o(1R%YL13Bqn5-kFr>x3Gy-0L-64d%`MEYG_(*Vp6amgLYz{=df z5lP~75BR;s0^l()_EVF9Z=wsf-2H20;eLC1=8F?wmU~Q>uH-fkzp#E1_N&xwsIdOa z1aL@aFc88oM*)BiA8*&KA^NB;+<o3zlu3#?%6X(7^->Qrbym5P5Q&HuX7GToI6wPf zIoP*p;pLJA>eMUjaH{0e)PNO~OJOHT&-}%~x1y97$Dk7verqNOkmHi|bonMyLtJ2X zm+jmJ%@sT^W8`MC5$0uF-mLr!f`~cCZVf)xCO?Vg0Y_EMp$1ms=;#5HXX{qOfQK>B zHLg|9l%Syn@UzN2jCxA{>Botg(2PGdMQ_a|GzZ3B{0vR|lEAyz9W|beFhj&YDO+h1 zyW9}+N<pDXP+EF+Z8CmF@9Vn~1hi{L5||c>SDmw)PPKFxhLV$@y0;OptVjEHj%yDp zv(?`jTT*0fVMvXpw5;2gFnRaa-}NUu^w*TsH{YaH(lAa|zkD^$G4UXy>1J!=o{#3h zOLk(WIx|iHK4NOz11L(*^DOYkT&3w21<}=8BcU6b1}lX`zY(1i{p$}uh04F$;92%L z_UmDN$B2L-+2Ka4$kfL`XG7t>M?TK3gyu53v)$RMsFWE$pn4PhdMKB^?`ljZen@yH z^HGTFN_+nl$hG?3-F0Of;ajStUz`7<J_50O(-Stl7JP+^q8U{8)b}m9UT(j^u8zC4 zJc{PFRXv@QSX&K6nO4LEkQ7nd@aewk7oaFw3m(DK6G^qZRHUUvWjUeK6EK_wf2U}) z1BZxr3(ntrsWAkQ6D-S~-e=mj$-A6_q!ej(zq57hG#YJ7>yhsE?i5yM=Hwb6&FF}Y z^o{Jzk0^zg!pRkR`i<`ZX>q7HO;*2!@8B{G^y+3i^4_CzjKzAqv3EH|sO7^Kbr^yU zj?rjw2tT42^KXNkS40MM-+fs#>Bj%)N-cPWr1bfHC+&=&b2SToOUD19n)NrD!*QrG zeee9c-gA$d-lT4P!)o9|*qrB}@K#@2Co0H|aQt)*-+S#$>CwM36DeNaFYoJH*f%g~ z>aaFLUQo>L9Yen-53D6Ou_mW+(_qR7Mpg0qN-I|@0^nJ<PkK?14!LLG1#w2kq0uue zm8}nV;@Q`B=B;Q?GrR7FTt)b}HI!c~!ZSKsB@$-?bw<L^ig^#$;c;6W{f~Vv1(J}+ z2uCB@9w`!Gdi>+eZ>jR+Z*N@?W`gE*JP@|GM}?Y~TJVh}8R1Bfdvwh@;*nlbbGHhn z2SEO90#p%zpGyiqm(+!lnVJ$fU+-kWgg#>^pei<_O<L*B^%C5HvT#9C`s2_$+;R#> zbj?L9XYk}tq)Bbj4T)&(F>~ZlC&szceiQE`@rDNSMGYOs!Y8GlWVeGh!Bq3oaOF}` z5B-k?6%mpsFM9`Il(9?54|$RO3qlbXOq}lNea;k96%wS1PH%_kNNjtBQDSpwYnz$N zc7K>fx@SNs0)Ev-9Kqmh1=sl-*%loPq1;@rxJuhqGaRB*)YYSUibb@%E(jv18YuBU zTew{HV9lKyqLN)z9c~OKK*Q!^&cBS0AfaAG-=YJxV!}_(kxc=vdLgB0+`7e($>h2( zex;O=49Rn3ReGXjoOI0F?t&nKg+LRlr-c3KEV3OoZbPyK;5kZ&5VA;92{@%tp0?!N z_Y1!Q0skGo-#8XailkVK#QQWfcun6Fegq%iP)*mpp72Q^brF+&#o*F=A09a8p$sDA z=#~(_v%nVNC#iLIdxhT<5%yf@5jp2Pi^|c%4oVnO#D66D1Cb0Ijm*uFm7N?;yYZe@ zKmJ!62*uFA%D~15jB?|*Paw*x1FYSufG{Eob7hRK@F-_t)<LReoK8Lok~q(B))BAs ze#ECnjML3Ajw83>v$M-?lIM$#63Hh38eiGcNF<pQ8m;%Pc*B$AvIZt5hMdMG0)_$t z*8~i?__&Pu1h4UM8X6f07zuLnU*j?4HZtbr<^&sXnivW4@bPkS2?+A?8w(gg&hztw zg@hnYhlPahD5x0!_DBG5dih1JOy&sQj1a4~cinvh@mt$Ek0LFRtZqx%<^4z(gCQQ^ zsS0yhfgb5)=-1X65hnP@AqU9GNCsU0N|t<iyi9zOt=ujU(oq%yl3n<z5w7`~eZdsk z={ld(uGS#obI#u(wrBK~<wtY~v?dxD!Mz}e5ZI~kB&w>f`%Jv7{Q_UC*U&)y0iWEe z77N=mc850>O{*;VaPGl{_T$BOvG41%UW7P2N+0?jy~0Jm?b<;iAsphyd3$RTcEJ#^ zjLu91#tFWC#mHD*Q+hJXzU>(ESS)3{NVp!Co9?Ck(>F39=gm1A$H_tM7Hktr%JSpi zkLYDy>au=ilD53M)kTRZ9o(t&J7a)+0PQLhj~$MgHiXTLOtw@N!~*$9Tg0vRW}Mp0 z;*AVwbANT6hvmlO|BcAZ|A?W32#nnz?WN3(^lS|+Anm5~Ow7Sn#whn44D9T{4nSn! zFIhbDZ(ju6mO8IsBNZof&)(0K#&fQ{xJkQ8ax*kyevo6aXb6cE(HXR#a^=*N0~R0y zB|kA*#*)g+eepS0enu)Z%*e|n>Bh%^A;~mKKVZ4ZgO9DmM#jD}1-dBeawfJ<s?+3H zxZ~3{Gp`tjkELA@(!XitOCAa8BgLdp0Tkr~nmaKmU&(oIZqNAEtZIC+GYS32F0|_# z{4&ruJ&5moNyvGIHQBp?Af02pR-?l7oZr%5`IV?l?`291m>~kz1xdZ)WW_Oq3d27{ zkuRVanb_=PK9hcA;#ozr?M`{uTmBo`neT}0hOAeC(7OXF1?!4xb+E8sbuphWiDJHv z95CPG@jKQt>i>5FTOr?3GRv85?&xl5e*g0Mq^jF7P?7G#fR!zYY<J{3=glJnm;ny1 z&hR*SijRe)`UW}jb|s%PL$L<8X~&hF=SA_$tmfL<bF$8>r@${`?7yRWN}Q?zoo*{a zZ(HDQISTK0rlo@bqM##dy=wg;wktG(Zd63I%+NA6@Dt~Tz%jR5D+NW0g%=4N`!*k_ zfI?WpeyH6Fam1MIB-@8&R`K6yIn=nf$4nsalh#N^fB74*LHoLsXUNncgL?F_zy7ec z-|2E#kT%O1@xkzI=WZ{at(n*nS#EU@WBiPRVA0bJw1mbHVA_J7Q>g2;YuZ~j-l|lC z6sVT650+JSOIB7>UX!=t2VM|nqG71whd&5<QWHa2_4+#H+W<vP^Ga!CawI9VW5bOH zfYfnK=p6RRwt|x#*L*y`H=T$}Hh`_)(0Y`p@)per2OoQcsk?uLT3G($?F)hk?a8)1 z6nu8YHCaw>zCz(Bl6ygj{0~&i#rQEh^J`kCMPu(k&4=&{ae7Kl<};W2q;}tixp*)# z_8I5p9TdCNRh<!ggH=%2b^i;32(#-qEk5O^E(2o&*M@>3>OO)I?*JtdlZ_8+oJ=vc z%#J>rKvPGOzDmWx$Fm`#i71p4p53zeM&BVF1-bKb9DDabAM?lYmYM{+MagU!BI57F z)xB=*3^*|>5S83r1fqLfUfpvWm7g=YJfY~x>R)zA|CFnruo4a7@N=_YJxK1i{N#H3 zhHX-3fr&Ectvem=M-C?nprXLqhf<As|ImSFNr)KCUl%%7uP!qrdSKj<-r~1@+zms} z!PC$bNH<ddOqoQLO(@{&PBNJoT7f4P+p)-TC<Rf;+GLa~u=EBxL}1>9pD*J0Tjn4k z$K%gz*>}-13TX<*`75eZ{It3;{1IP}Q2Vg_bwnVb%u}#|W7IoBbsnXH7mSB~97rbf zxS%}ZRb$0_OQp^gdv4=Ai{fRB3oUNH!I!yPsPpA&w#a-C{%+6|ZbnWr1*XXiN2M_5 znPKuw5&6^4zy34-^cKHg0R2a#_CGfeV-_D(MD`_;L~DJ1g2-xSoA>eEqr|mOJ!F%U z*<Jul%yZzKWeq#Vg^#j*#dtq;BEl*)75wu3G~h)UxQEeFklDDBH?rPVmea_P)5O@2 zPr$^OQ;;8G{N=i42<8<u=H%rz;uGLAF%U2|G%^<8666OP8yg!LaTyqcjll*y{9sN_ zP9sjEKMcfMziWU%?WwV>N@ZKirJ0Y+qt2s>Eu}!W`wra9f?-108}zQ&FvJ5q={9;! zZWQZ5h=FT*kv6)(9&r)Y?I%JdTrCn33*}cmfA}nZ0YFP1z^^&0hJmMBW6;+d-vyJ< zb!{qkM2!tMcr|PFu6<z^nf$=UbU_f2sBAXCVbsvDPN6(V;N;})eslvr*e$5N2$Q~K z9OL-B1_k_7JJ{8r_$6n8Cq<+!^wO&3^_L(L#+Akt(xhA0shdzcZ)J!+^l90VKSA|W zQHQQ%qZI*g%9b<Me<DLZi{e05vCiB4jM9$5Bng={?xnX&`Ycw%4Rb`8Q3R~bb#1`7 zCrnuPUv2cu2tIr0JL5+qWOK*bNRfX*m9qgHEDuOHv)2U~7D=zV=X@eTx>>Hulc^^K z%I~uCL3F&TWW0LWwK(Z)1_AjA`L4a2uYG}L(t`5l14h+{K7Gl9N11QIpR)rpQ1@-l zO1=ZTj8X@FIr>+3Ym>1Xhdla!!?+L6DWCqL?;6<n+mTo&rh%@p=DH(EY8H8vj;|Uq zMc~^IM|Ix%2hhst@GIE;Ls?oQD?g2ehJ()3<nX!o9sSvpPtuCXtOf-gr8G2pFq`u5 zHMC|(&L9>xN6x>B^5$%;LJitJrnor~7*_LQG5W^kdv2)lqw!Ep5PnqyowVkJKL*fL z=TmEi>gqhSzwZe=VaNPzir&$1)8a;t<^@4SvG$?Z-KH-TSZ+aK6A8D4)N@D(yIp51 zW(SUdV9Qwn8QtqpBNhC539PKXr6cx>KaNWxyVPwfVoiR6@Ip(XvJtl{BBTik4|qWk zQJH1W`AHFTBQW*K9(E1rBZ*DYK-&C3f1W~Z2nT^$(woLPC?eqJdT2}gdZ&YFybV=q zcYR09pIL?>&$B}Kg{x>UrUmKFRc@Fe;-95|#We{ft=juF(Zu6^7@o_zgyT)jVtWNs zm#TklG+=PxR8WCs`WH2bf%FU8aH;-sz$=<n3V$6u&sdUY3EPjcz&AR+a(#l?yTX?Z zzY)H@`uxD$rwiL|W!W}T@_w}}lG=v;bh+GhX7ctd##d>fP|GO%CLPM`@k8$;x2%Sd zgt3*wmqw3<@SoT6;Nm+-w#(KbP+k4&i1;H9FRqRJ&J@!9`lnayaM+tT)A#Rv_No)< zP$QBfW2@G+i0w<rBZ8{rWPFd^jrHdlttV-Jm|WsoBpYcfahM(y3jM61VYrm>H|;hQ z*Q0bYUJ`kY^)A_ugdW0^^^)q#m0x3BmKibl!XNf!o{64=y&MeJS1j;{<|;^jXb{|a z;Dh|cdPm&2%3sctgoXH28-{Mcy55s0BN1<Kr50EUA0?A~Jd+hKoas<o!ZF73!K^#w zndk`_{i~sW9bLaa{7*mNnYkFZ@i}bFzojClV<}Q~ie*E3p=`ZXRNB&o=!fErt*u7Y z)QKFlpe6iD+3OR{#p|-o4by)n<e+{|M(y8{qoK2Q(vwnp{E%7Im;h#o_=jx%vslN+ zz_`sRhWy(=K$(lOF~glVm0O74@Px&7UmT(L_HVu^<#;`!7#1h5m^QOVhW&$n_vpAN zVRu>YI-aH`q8gBLtQcya0{(IoG@JidqX0mj3c#1D6_T&fO16{4)0I!tBP7falR^7_ zQ$=HM8Md@w1`qf$^lcI8cImF}<RYGrvqTlbUA~=(!8cy<bolt8NYCv(ca2jMf^+TR zSALvvepeb;Gc9@4A`yrN*$m!`77@H=JLw-kvNdfe{OgGLiJ|ZMrx7dx$}`+3WbdKS z3EXe_V&k0+vb`fqA&BEH6x_tidH3@vCy_M6!2wm)XT=K*v1mHD4_MAV;p{96Crfz2 zTSHG5p#9e$j(~zr7rT5zNulae{Zi}NN0q(?<G>x&F<!9`xZG?(4|GB2*4;CbV2nGa zxX!-P<wu%Pl`cWfn2Ub&G|_bEEnob7!K;2R7;gVBn8tsC(Mef#pCGRM<8pd(%?wQa zDV7Ya2|0D^OSzSHiN$`N`bL6Sa;Gq=T~@nHuV?Xi%eonr#{ML5v?7X$WVtY0M1x<! z&?CJ1ufyn%hsUEf?_3$1^^avVlWoNgeCi?km0ILZH;bpm56(OLlIIQZ0Ke*M{MR3T z`YQiw`_G&L|2sj3@n~c{%Bhk=5#%_|n;2-^@r#_2A72WU5O9>vl{ZIYpZec=_3Ij! zhwdaaXqDpRGtun=r(%_+Qoky$WL)0TXDb*7E`?7AuxXYz&|B3K3cX4%WgJxfbXSyV z!yM_e=-Ra%PZ)v@jwYOV%oPka{`&P*#9RWKnH$xkJba^@G5p_yY^P=h1+V#@M+U(! z$PjjsK|c`?&W}Oq<;cM61%asQr1SU(Qlv|DHt{;Gl1y!1I`uj9k7{*iPN%!VF2T~s zW-XC?K5<Y#YhY!0y{gocoh~5)Qq!>rLW<c7G7E?@?!_(RWSwj(ONS*4Rg*qW4Y*lq zA%8eqWgcFLx$S!O$qcmrG-HWcGJGNl9LkHLeq5!PifR*cb|gW@4l_fJSi(M@VaJ#h zM7}>tenAjHd^@D*Q;XxmXDTe&WktJWsW;Vxl9^w^a8OBNFaQ}%H2a^R0!Nc&VLW^g z0g}_p-{Y1a?`W64>Q=0CDEef<!s^S7RJ1t4!sq*qzJDDNKanG4B_&adP1fp7%>!%P zjRXT0&tnI*k;{y_A1IiI8*KnSZ8=_#Ar?$UhabW3wrX#N@A;$$MHm<jmEG%L#obtD zbVlTKW_OMG>kt1|YuV{Fc<Mv(R3Fzm@EPfpZ|)U-&}ii5Pz}~U*u|4NdViVB)cJ{H z@U$)pH0c9=m0VsbR3%_+>yup1Wl!)j1zlgv#k}dgw{3$J2*6If6~78YMEpn52LDTf z1<O{49mv@~FS~8lCJ0ZZ+$mb=16Ku`z{}fO8HH3*r-B9dvm9#y@?;UI=HZOOmh$)1 zO~z@W;%E*Wlh3eg+lo1WM(?zx@`zPV28JBwL!+4uKOOm2-pI5RMdj+A$iioXoh2OB zUbqxsJcnt&y{#n5E~oM!<#VPMg^x`cFZ(__uRdVIe05m5d1eYx2=cWXt5w5J4v*IU zo|}#hR{U<KX?QaDg@fSuQ)}q^KZp;Q6L9$IZCRLg&-;z%R-XZ2?uqLW{pjLk1tSf8 zgk<_bzq;NdRa9|Gu2A(Basac52W#kg#q%D41KBWv))*j%Ly?9UD~h(rFIAmi3wmBs z_0tdNoB>Z&o_mqf$L&YZhT&$530`WOTCFa}SLL^JqXAW41Mw}+fOq!BXMg{{pMTWS zhFq(9$Acmp$%a}S_1H8I{gLOPDb_~r)N1ok?n@_1m15WxAcrsO6dfc;88#J?lRp%v znb=8{!<Os$kjP#!+`RPKsx44bJjs9#0|JfRJgOl$#YB1+6*qW$KN1Yqbrse}Hd&ZC zTuya65!g&D&53oIiWGs_42CZvq*qRaqO$m&G=8#(BWS0=N3T^`dDYHAOKBFp5-n}9 z$lfOjb-=){X6@+F&K;M-ONR^+{Q4ie8j5eJIM?0@YbXp+SVOWFw!C>k5OHf)WS;{P zS}J5*>!jD6HF|Pv+Fr+fMOYIVcN@@@tpCWM4;q&OKSVGapjC6VAf+y1*I_#VcT1+n zlc}mPa)C|jTA&gJ^YOoqh@V7Cd4+x%>{(UEq&zMKg+1)|SV$&B+o|oh9`p&ww^WEW zdFu-GoU+X3SY-aRMtTd3h8Wp$5^Fh~<slS3-la=;*;P{{i+e_Y{o$u~`xo0kSawfq z$)9eIf${Q&^M}Q(BK<R|06Ga@Thrq=w~W8sebj4mpli9^*!L?Z0CXYvrB~tiI<3F* zJplVLMpkMSoOq0_(FtOk`};^I9=<qm6KYy+p>4<{B!XR#5PaE_{QQ^OionQk>03i7 zWyJUGAKxE8zV@u1I0R2y_TI2_-y^-U(-_=c_$gWnEU|4B6+I?=8_N=muEfN<4lh<G z<cP%wili6si4!yb^@;ftRVYlWC)Sl+l^u2wll$!Ocw90Y0X<ZUt*^@Ke#}^X&Y27X z=++6j*VcLIaT|H4M>U!3r&~E5rU-o|+^93(eZG706#w;yLnrya*uhoNQYtM!dN7r? zD^P#fgGTQEy|dH)c}#cao);HbU4e?YqoULe8pR5~0xXuQ3S92PM@5|uxNp{#Twh+} z-xf`wr>>lBMNu9Y39W!3BK}T_ma<-Vq?r=La2_SRu1I5NaIo}I-Ii1QU2-=<ZqdWJ zQ$=euV7Y1T+e?Gu<!c<KRy>20^prK<e)!$s*<T3z+{Jwrh<ki&=XtP1tZ?c5B6{lP zBlDEC_cpepMowMtlpj4Kf?a?Gd^wq#x+#^j5r&BLEAkc8%a^|KzNtB&l6~bvFPu(p z;M;K?i48yJ>3>HgcDw<8HzutzA!)=lp!Ci}pG-xAwchszmi;H49RVL{a-!-K*`Uk> zev#PkeSw(wCLZqbV#zJG<uEgPy_QG-EZ$TukKh3BAY}X-R-2!e6vG*&n7rCRfh%3A zt8Y|x#PhYg(|Hz*{I9Q6ccc$>HXXHX*q-wL|Bg=D@n%n`EL{e)7&dZ2VUD%;Z2ggG z0t{zV(idZ$zYO8@oEL0?U%5fp6>Rxw7T65orCW`Ra9L-!oM?`!ic_@>p)>A$PueC; z^Xqs0pnr5<UH)_yNZADz;3CeJ`P(!;@+UX(qzMmBC(J60er>wp8z{Z=Z{&IZ^l*pp zqs-+Z&uPCvW6I5d9LDD!9weIpd@onk+e-0ug8+Z#`?9AGe`~&KVOF{Mkc+L67%wgF zwR64scL}6gG2W5|+f~U`gbTWuy5z=p)A49^e|fIUFTo9}JCRdbDcFAaU{@gR`O-Cn z)5Y{lOWlq6L9rMHBQsOtfyVx>wCed`5?Q(jWzs`}<YIb2CDM?VR;*_a@GV<I*6$^l zXHX(z9M|bnmJzn2WBcj<fEnmuZFh5zcYSB8{+ZE3xwV&DbU<h#bA4RJuug2916A8q z^`52jnaqokVdC@X#eK;L_J_LpI;;Eib4MagS*GKd*p4RylNpVt6X^F12;@BdfA;5} zek#nSIw<3`sBfoWmZeSiga@bW08_OMPI88<ai?~u@4^gd@RdN^YfNtFG`wl$tMrLu zK<i_D<w_6k*0gtzJ&>IwXU%ZE=P3f!rQnx`Y!oy$SK!Q4xoL8z@tyu<?++fXAMFpT z=y%3EC@jBDvR@EHgvxjJHr;!XWzYQxq^X`-#@Omv?=sRX-Jq+AnYtUjn;)kQwYkBs zbDCJ?({1_hSHgoIE}N4r8`k+GP0}BGSt?IsDo^(H?*1E{X#bSxe!K9`f}Z0OLm74^ zW7#_9mc;0$n_06xgXt_ps>s}viyAMz=%qUSCJcLC)JO4oWnU+4B?)r9uLek^Q-6Oi zmwqX4x4(BI(RxUU<bq7Pl*?Xto6UVXE#2A=Uai~TDrgn%wi(QGH^_3Lw6ROADo~$< zioNjbMvi2d-B$0*wID#f_$@!Ed1RvLz1jS5-4(xA)ps;yuU?Q+f$>>L>@37-pLQl3 zD%)pV$NLEwhr5JzqRZLpEviw$?=#iPK0$*x;Fpq{+1Xj0(r};tD}4?Hc8S~N*_uVM zkQ_$>zNYedj}0HB3qldE-t7uc-P%@(mZ)S}i}&BzS-upf!(!QbYbjm$dopHb!~7<6 zJ>-0m8U+y|fOe2%^8a|_;^a3F5^{7ha4>dubkcLSGj)I@sq0x87=o>Ygp^ezl%!OZ zRrFNv-c*v1lGc-#xB=<GZB|e}QnJX1tsHx=@wzGHo7V4@*VB~awqLdR6NuYM{To4v zzj50?-^10sSDLJvShElQkZddFB|vWG9v<0A!p*j-L4gw<W*2$2%IxI}=z0i0^Io(1 z%dqc{9a+|&QP%<{rM!be@cry7vB-7UN&?Gn4`ITLB4906LxKS+c^tg0s2sb$O?r@S zi1FXyx>P?&ym5PMU)pE0V2tHVuI9vy=-tRW>?$@LAH}iQ`(eGAJoRqh*>~%9=KR|0 z<B31!&i}Zz`D-hC70B&i9}ECr`MPR+-zy7+BPB5T3-3Wpe-CHx+iSa0x`dcn;W{b^ zSI(Oq!mn^X{F@!dH|4Il74RV3Ui#2-@+I9!it?t$zPY!u&b8?<z*FwqnMbr^tKZ0| z6IF>V1D^>L;QQGOV4{a*vqtlFK+IO@zd6x<ISQH{@vBh)pu}OqCkwoAI>yLN<Y&9v zZw2nW#wa$%i(%vAv#+Nv_&1tABA`4aPZk=yA9u%kmoDEZZ`>R`eLs$<LMV|GwJp%_ zvcnLLiLJAZv4fkQsfDGHv6B;yjH0T7l#+(tO<6ffDHRpKnV!lR|B+@-e3?T2PUvUD z!A{KU$?cx)-nXgw^&$#B2@1(MOnq25U6+2n!Hg@xm#*gb#FQMGP+z6vHuzF<NwG~e zm$H!GbUEtCYpCns-!+S#146T=;a9O?o3t^?n!zK~^}9B+q5GUQviwmJlR^xyjf$j$ zu9w#O1wq7OCEC@BC8-Wzc^p-SXpX^~M!CgLtVd)Pb`PFsHv`U{vB7oaa4PKwJ7?^# zs0*$F(|W+8GT$K`_rg5J^~H?Nq1^uR@4ZL$T+83E)Oe3k?09empn<3G)8$Ypdz2nl zzg=dh|5o#?I=b1!2dCVJ_|XCWb=C=N16OyLQN%wrAnbHBPgq+;mm@K->9Q5GYG=&@ zNsJP38BtsNQ_Pn*PjL%F1A<*I$$-Wik{gXAWl1{^zRSe>U;z(#rENdg9i$!==FY?H zT>&6WBU^JDJ!=CS15>aAktF1gJHH*PIDictogLgH4eWp@^+h@_%mn5Ny)+T2AEQLy zU+%t<C3x-GyJ;6s0oixhrsp|YXG;!M0?3a;zbz${tERyJ;e6hSe<CjiLDM$QVJBh| zXCyy5;8$slFnmWirr9K5l{m%?ub8>MjjJuUuV|xoSv*K<B)QXtHP2w{HDq{hB!S;j z^M7b0`5OfqBw%+RABgG=&)zg?1@Y%xZrMegv;mxaFUB8p-0v!}KJ|^v21+W69;$HE zzKkVk!Mk#d^yH~V49m{lj8RhQdZTClK!RwnSbXf4?&U$IgV$yu$I=b`5u#|tarldC z;Dv4w?A%JQR^rlu2^8p^Pwb_(MK*7+F%aHO-@WGl{9xhP+Ef!I7J0<5>6sD-<X%U; zjwNGWhKH8Z9IqbkT#3HIvWCiF_X=lwimTQ5d{qNx7IPB=$;4<(p4UFf?*LQTuu+k8 zj<1`%rR?eseiYfkk-IWj`>X52hVT0!x4dAATmog+<sJSf%GT|>1LguXV_ue5uq&#Z z?6)Vh+^@b?VLY#g4nKRue@8v^1ZskpX%X6crYPGxjXB9oC|HMOyt5p8`}^N-d+UDZ z&Wu<HgIeg|S9Nr`FT0EYCqPG4tzkB1gGP|v?OR)?W;iC!l~+CJjH70MeO>&+Po6;S zJy6yrQ<&QElGs}}vF4G`(962^K~KR?Lka;jg8fZ{Gng8ul&sfPvph*H-&O6?s^Y<T z5Q3Jv8oABr!pUSi0jAbpfL&*Dxaxliw0yuxyAnqWU(^Lj?e?38C!bZlyl{61-3eX4 zN(xBqKAd$rZE~^;zw%}8uk*UtDBNvx$ze)KCij*LaR~c_`CZofHY*_Fvfammzdj32 z(fY48c&Z%<ye^DRahG-M9ku!9)AKc!h>b|@cvRi4R#{CMFq}f)RmP!$c7}wX+JW6- z^VBH5S8>wxb5<Mq0HR=2IE|w!PTXzx&-=S!tYH@f5qw<}DWo`weolalBFD%#!6v@< zH+<dQYMlw?VnLZZd3$s#P=h)A_#y)>+wPVw53bOMXKJcMOLM-HjzhF^Y)bc|KpyzH z_RSXr5hA9{(+xQuhgc5sQR*I@=14QESyxW@bSD_n=CddJ&pSiHk2U>wbcRe22@@pF z7IdgBmJmcxdQgn)l<miqd3Ydlh%E;ys3wUbjwL<K<k;=---c5{cGxPSd%Wz&Z%mz^ zK8FeeSsfnmGg)`*TZ_+-5!LAxx5JPk{!WUUOv2IR<?-!L3#e_qv2<dYw|>lBSDR2E zmVTKSyUFQ#s<;{HenB90y?-6&Ui*`tT-R%T2t}$9bv#*HJtu-dO$%jUK~x*{s|R5V zEF&ej?{^ePYl!`h?UU{{-P#Uj8c5yq{_CLoNyw6q8Q)!E9G3<%3$kk|(y@t`9K=PY zveWj9U#DXc_;#jI!LYU$0!rkY__6DrnVgki7h<n+(%WUcqdeaYto)DI>%-DJo|2p! zX3p&Uj0wu`oygx&2!6$>IHpCTi)UmeOv^nnlw73<WVM&s6Z%7=`&Uu}<l27(Bh}{a z;u)64O6qsKZf3!38yT8Qw3qZID~g4b8Q6l1&SCUlVjWUXILHDy9!9XYQFfN}-6xLC zs}v7MOSo*b$2^n$jx7_BXA8<?;MdwF^})+;&jeprhG(M=uYCV}ecJM~)F6wqLVV{3 zTbVeSpuau~eleZks}X3F8#pA{tWl$x9;yh<p6CK|CxeF6-091dtliP}a_szZqM-#G z;TOWs68OV198CA5<8}Hqbsl73)|I*Wk7SJG3cc79SB6N2F9;&^oXwxm#1ngcz0|%C zMguZviMW}=rfpv_RIWh&)n=O$cbgST5%5EV$TTujDBx*GP`d7d#H#@Q{2GTMB%@po zUx&JR;7GVN%n<R<91#f?Env-CyrhXsHlSteK^x!e`J^cN(R(X3QZ6P+PNzW-uyjOR z)+>^i05l7AziANQ#UAlPCB*Kn&VL<}r}u6n0*C$IaA*I5`eD)H_0(m1x+y2va5Bxx zNbtVoj#shSj^`-S_h%ZF<yNq2QO%=P;YK=JWxmAP-Qm)4n$@qCACny_#1QI<4_V^T zE-*ky3S+s_+kVzg<n*ThX9d+@0g1C8-U3Xp;Yke_$(OUX`~H5jiLAzl^Fc@Yu@zsT z_xsUznVsLyKv9Rze>HM(k2?wVcyHLR=F+piUYE<Y)sn)m8RKVF!)8uFaJm8CsqoSc zz6kQK=aHT)=kJWVyxKCq(_g@NoRae`&>|juR>KtN+9cKR%hA8O+hO(Nql;z>_VDTL zn3-6buJ`t}*z8<cG9FH)44C_oB7ck4K{Pn%JS`u7LG!Rn%l~cC{OKN+b3GN9;4#Tf zs?tyrdzgns{kZhuQ`&ok)>LZ4V$-EzKJ94iXLH?G)#lPBbr#G0*BEqd*?h&E_uke$ z@m%2Mapz_zWoWZM|GB^y?+LkqS_=h|d&=dkbT<jn`KTZ51`O{E6wb!+8R$J2@ZaK_ z`qlMA><>~GZ4P^0%>>?+6z8)m&+ezHkrjBTG46)hTe}^EVlvc#l6+pR>@Is_3dAK0 zhd@`@RVzE64u5h0R|9I$HJ$jRDB$yj3DGvGAfH}FZqHz{<N_D0=YC0`Y2+wugE!Dd z9PmpzRF_jllB;l4;V*4_oKa&EXd&!8^+x@J$X<DX=zdS~zv0jL6ZoH>hASeXI;1;6 zof3J?EMpHXS$_=mpebcLk0}c&U6Re)9<90S#w-dgKLkInu7`uB`~m}@B~@!L9!kiA zh}zsmspzv#<e{slZi-0}3NyJCzM5Qozbl&-0h<O@urPxWI?k7NshRYVY2R6#o5v>% zs>ybZhn!HC0{keV&7z^zBLy!=M-O!Ek{hmD6|c`mpa+o}Qvw11ci<zU3xbG*5*NYG zHXov!Pe@-rvXc{h1Gc+#tDqW`>sf~Vus!Fz5eNJ%+5cyaIN(bWS)o1ruD%F@6Kn4; zt1gp{ERL#Z6u+r39sHtWDC+|}UnAfbd;qgG0+{f0c}H#T+Q>2is>b17nVK)?*09`N zaqGkB&VxpgnvApfG~lUW^f_wQ<rNHwrxytw2)G2g#D^er9Welihm;6x2BM6CdO)bp zko1uQkiF3TP>?W#QLF*@AaoE02oppOx(uQK5&@7v01yBZ2mpc*p?j3mJpvHA2SN7; zr+Xw+5C9ns1%QH#a{3E!A)(p8O9U7I5EkSF2!w}<1_U7BT!I*r5eTqxAbV0=$T1=@ zJ`jkBNP-2~BaxwF08j{lh(G{30tg8K2^A9w2@wey2?Y<85QGXqK}7+eLVg=E5EX!d zbh?8cA)X$g0Z~ygK&M9tkR9X?AmkJp<N$zz27tWK=|AWo$W1_yF=znDXfyx<3iKEO zau$dIJpBSP<Ou2X7!?3Q10W&%F%~ig0rEu1H<3<vh^JpihMqwA?GF(2!f$^7A*Ud} z<Mf8;ARzRIBA!MbV*C_-_;V=Y9k7#uv4N8TBoy)I(?3NhVnV<9`!Iw%3M$Boc24HD zHW)vRK~r&+w6$>pyE-ALI#{6?7#ll)9UT#kAP@fk1wrB%K_VZWz<Nf`4h~=&BR33V zXKQOWJri@Vl`#?6#>Cda2n-3BbTzkjw$^iWwzIQxyJX^EYprMCXk>1#XXxexc0@F{ zF?T|=Hn(wt8sKff4-jo^ZNSL3&|igb=WJ+YZlvdEX5awUvo*8;8#&?pe$L6kz{b%8 z>_85AHYB|N^ijXRmY(ec8?b|;nYkUZBiP0m?0|YU7Tw8J&*=A8b9S)$6%CvVO#l4g zj70wVRY+_WItcOft<XVuxOd#B6bziqUBFZ-ww7QUDo%6|Ihh2N&2Q(Npywa}qk@3M z$=t>i9V8*n#lz1lV8qAGX#nOlHss;~^Kf6|H8L{d=H(OMz9ztDY|LxI$<N2h!^eFM z@?m7eFKEnbU}9h>z|CdA%VPqG4a0{1L=c+*022iRz=aN>D<EXzqM!o>fS9P5Xjo{- z#lQPIAg4g+Kz3X-0R#**3{(uD03s$bCL$&hHWC){`6vM-3`8ts0my_EK*2!5L_k5n zgwO#t2p1>-AzTPSLtgiER{aXHXHJ$s1KqDcd+tp7vm5+={>;AfXT#3b%|9FP`}s4A z*`EzV_|*^o?TeS(|Lg{5*U#?r_lt-;Lz#O*nM-1xZ{WZVhn4j9iCi{#rY8{9Y9)sI z%Qyc6qZ`L()`JqnI>!!A;jXm-7bG1|{6`H$A{6C*->$1Z)Xrk7L>B!CH-EKS#INf7 zT@Zn=Ld$Yoy^oFh{U<T=vb2JiCwDTymY<i}L|^SZS!SQ#^)~Q=#+cmNa*T#d7&sUW z8WPl;pH*-a(`ltkx|n&r4%#QOjZ=4QvJPLACr+igAc^}46(@-&w1q^to*xQdPao$M z@2!-%n4nPQMOyYE&&NxgdmZ5ylm1`gb?mjf=kKpr)3gQlCkuF(Hf(+Dwce~+=c2^_ z;H9nXCZo_aH35W$?!wP#fG3ZNAQz)Yj^&Z`#ej`zsmw|L?Um-I<G#6ONE!2z5*LIu zeY}$?et)_1DdXq$lJHCr8nTi`*V~8WC}hm6T+++BX3xK8Ld|IKLxhZSODAWK#KMke zj9+BFpX7m9<p-hhrLKo*@9+B0u?budM6Buet@+X#jXlx6se;JO;SnxKsg@xlv){nk zC=W{3CLwQOftu0aS3x1rBDhx*khu~%Cry`JJ~Wsk#DJ%pUQUD8>KN~pvVI$8h=8SY zL^)yI52)|)k>*jAF|%ygn|Ng@#Sxr$2_9pw$PH+zUd*3KH*ING1lM&O03!Z0UwGP3 zTtt-_HSE3x*2dtwy@{r<)Bah|EAV+}%5ygnO|;UvtS2@iSL~g3K;|OC4zm4W4N=rr z6_`N+zUGr}7IP(hadhz%=t<vnTI2R}_xvn0nmRvyFwd5bj%{(BSL}iID9l8845z~K zL>V<nHyFp0nj^_m1fo`NxjCY@0SjC$W~b}7na2PWFhc|^r{u$gAB9ooiPgg`LQI;< z-)V0~-7T^0BPIP}ev;Z6YKQE7HYIDv*J8}R(}gMBJR&|gW|5LY1xNKS#Zc}$%)28f z>*$?L$uk|}?C<~g^N+R&QP$7xY8AITDMAO4QpIa1pXglaVUB<0`DJQwCdB%SKFlBn z->JLX)0-RCkw!HB61o1(ys-g>GNG$X$2&Kb9y+!0ik_zTzN%1(8-Dd8?4-lFu0$Bw zl6CB3hqcdl$}wWmro^6f%{{EO_K@4Jx*&)+K-V?a=v_7CrL%memoj=BMI%lXBk=OD zIy}~MV5Hb}0~Z+@)dar^O@$^|JCD^^YG(1UPy(v3UPs=O$!5=&##<mA<g3V{4~H2d zeu`>3)4kh(i73;r>dm-Ro9n4It+c@+gPE2NEiYysu0G~h<iZP~{3UJwMOFLf9BoGz z)2n7qPIit$92^fGJYYAsbuwVLbui_yvNg43Glv+|*o+MvEZHIBkQHxIDafb*L5ep4 zKy=6v)on*dXRrehL&XeC_1i^uh{j5#(6m+d6!Eb?T4L;!#5&#wx9q0gkWN=ZZ3WYr znRsWI0THfjB@ylZeKUJXCAnphmd6k0ROr!+ku*sX-ICe`-FwU$#*@O|E<l4N&D7&! z;G@VRx9c%g5<1aX)YjbN*AOcoO%{pknP%PGm*?<|zMBlYhSP9HM2EfY`+gKL7O|IK zPkdslN_DTP${0T4v`%`RMoSlNhi`ZU6;0sR!;!<i!=oi?Seb1xgQa<W9r?s&c~AMX z>ZA`T^=Q@*Iu*<);wQFpW`VOwMCTe&7uqzudo-Fdb&??*y4xp$;XXCxx<716nalL! zR6_WfBiPxPa-MMnTRX6gBiI1K6*wRz)|||ZILxgfB@!Gt?5qroz-G2q5Cc3r<O>K8 zZt$C=0c`K+G#;2Y51o2mVNLfgdQNc5rD_YG#ilRjX?r-T=@<;(6&;e~pl9psWasRJ zreNZv2t5Lx<}CiJ4TN~g;}CBvsz^Y*R=;h^iI=Qfj!I%!?2)k2##25VU}57+<ocs( z8&w?RG2L~4btZ-_cq|YC#z%^tRIN*CNU>6UXLL-;E_jqjh8?z^cIjm8=Lg@lYEiLb zd@`FqDPDkyH->82`SD2Yi?D1iDj8^Qd8-9xkbp1w;hA>6)1C0ZwWn7Pr#K9fRU>V? zJOGI`C}`#xcA>p>-n|@t<oAEpy&S%XAhpG<zyl!kKjKeVSmJ#6T<X62+EoAhOGx<b z52y~L@;V~jpnS0JiD&|R79>S}pV2oYEXdAHw0iD+^pQNZuc9gg-EI~%G->wTX}KV} zaw1tx*~zDLZPf3(qwI1gqu(}AXNdPAG5dM4b)F#-fX)j-!!LUOzoQ^@BBdzbm?dA5 z+Gf#bovs;kE38>kyShvP@k?!hE$jrLC?&=*XcQFu5{p299G9%8%Qul4;sUd~Z09y; zuHbnYBR7+cFfZfsX63_djevFS6t6^D&Q{+^HH*8e8S=fpioVAPD0fBOgFRT18%Y$z z0VroHrXYrm^6RBdIh`kd2kKR8HU}XZCZYOFJtC~i4fjuQZ=9`|z+aXX{KIeo`OdFK z!w_(=6Ej+XiFCqwOawu%6-vOUv{$1hubS&f+1?W&D@;T|{jhg)`wVJ!<k9J+xxyQ} zcKyh+o?i6T8MKe*aNZ!?MZoP6ly-<chnn>#fi=;keSF!yvASDT{fRG3Ol9_(S6nzE z0UQfOr1R&Q2>b5_NP)i^{j2L<Oz*MI-Rdv{F?^TJtJskgjr+&U!v0xa2So8kEbd3S ztjZfPTiNYjNn2Ek^^jGdb)(_eZCL&W{pWQ&tsN90Uu~d5Q1CSOO>V=tx$pNz+ReUo zWD&v)5fCO}U}bLL_`6VzA#wW0|3Iw1n|SrLIenbV$BrwP-hWFti8K+~&kV|}!d9GL zeJ@G%fS+nNrtj3MftDYDt1&mR81vj#7yFe{w5c90g-{tmvbO+VM4K?-m$T^(2t;H< zXts{(G2+gWTcCF!!w`~Vp#0GPJ~4cwrn;^?9%i6`@0{e241K@p?O&w3_|Z;ELAqQd zR1i-=Ct<b9)&F{&-u78T@ZG*C$vilTa{m>r$P>99eJ?kk@s*b#55*PvdjGI-2i)|0 zS7+|i*MR)zEYVF@*h-)#OZeH2<s)d3ZZI99?CkgSPFsWT#%E=EdjabFpYf6(Xz@D^ z!HgpQiEZHtFp(>ekte0x`<+h4o86m@6E0mMmnG>LUy#0uxbsG=;ncPX^uA_?_O6^! zqR_t#rLm{(UB{Dq%R)>`+`0Bn-FLrDyZ?jnf%we$0MYKDmdMl3-)#&)93xvRD@dRq zB&t!*#=sg30AiR!jgZj4fEdPLM<WMwXnY~$$qENd$FI@#tbA^7271#9MnC0P&6y#T zwbQD*vOch^-~=<+z?WNatq1{hyI=RJJ;>0fDpQrMBp^{Lj4DuJ;Bau9l`mhs^z0ZF zf{0zl618Oba0|(LzV5l{x0?lZdU4Ln-nV+5sK;OZ@X4i|;p2xOghgVQAp(}ZIpsud z4O5Qk*$r^2uz<A6NMidU8>L2oln&s>s^EC{faIC5M)umXTX@z7xdc(l)P6=Xa5ju& z+peBRvU}d8f;cQx`F!<)9Q;bcf*~YMYk(j?>|*CuE}KN2!*pb&z_p^eSKNqnvUjuY zvT7&a4MQ!^8#5H%?9@H|q5nXQ{}WSSP+{QXn{19&wI%mk5GTVMHZ_M(bB4r@(Add5 z-#HXm!0cV&OMZgFB_eZU4;;*n!vggL8z!Y*hukzITr0uUUm6b*WlJI{WP?U)z_EN+ z@LEXpdmAS!hqi+5@b>k-*Pz->Mf4BP%KD}bkyT*l=!LbGshKGKov<*L8{=}Eb6}PI z>m08YiXk1MsTRu1)YbP;sa(%U(6DgF&o+oPw+i9?fksa&-*U?RT*aJ$qmMZP+gwH; zY|cp#Xq`L)HF*Q5=1J`p{Y;NF$@7c(TOoz-sKXC}2RZhn+1GU+abZTnY<B)b=j$_@ z^X<gjV|t{^jZxI}wWEQN&g+@nFEj@SGUUu!DzY_*NnWazPd&wu)!*_>z7t+)j-Vk9 z%6ZP=>Qg@Z0;v>?FnX>70)U%B77jgL5B&)R!^*E<38)r}D!fL}Y_KaQV{FhfDB_3N ztH77gl%@v+kvKv>533T|)LgzI#_jZ)zR}}mmEmoc$I;INQ8y%3ksyeMV==1M$DPX$ zk+@RBGA0@-p5tWjGqTbh-ZQ$*Yluf}+uAw;GerCoVaz5`FUUtzB%4NTIEC<|8I=&~ zce@<hauFwiCV{P7`o%&RbN5?ma#dU<hUI0+fs2CDe3(lLy<;Y(+pGjyqj;Hl*8j%4 zo(KFhCK|63b-e*7*PAW(ZINm;k6ID0&-J!0Tc(U5eqL2&Oq!E^e5x-3f)}W8n!9Bw zvs6hm&8InTw0}b~&^vj$x<MI5$5iQj31)zX?~FISPLb$to+D2qqVYgmRM{=4Mk=lX z)irMmk?L7UeII8;cJir+y$j&|ng}1sj%7;wP#ozMMfKEer;NK9(nq6RLqk3~;9{<M z4`eTHE0`eymXh7WM6*wq%lZAjy9)R2Q8NsT8)bKP`?T7UgiG8(KdC{LIa^jzeA@4d zcP`r)?_TOMrxl%78BiVM*l#IQ<&?d5y_<XKbSj>1z%k*cQW@>_Wp_THC&cbDQH(-D zA^o*)Z$BmFRu%N5i9IvJLB{@SC=4NXE&-nEsHYnw#>8%dmFvo_^-rv{6y%<IxvYLO zPd$P8TIu<0SQdSHkPN(EY=4g!6J%<y7y;m#+n1pF1iCn#2{EF{rys<F0`9MI5PnE> zmV+4(;Y<I4h>4q>c5@yM(tEmc!6e%?yD<;Gqoy}>C&`#f76M$u>++!v4EWK%yL)2` zC{k(o=JN+XkhjD>HP~0Z*DER=^Ek{y?RuXNJ1GjjhzR*wH5L|OaDb7iS!ppFSmT5L z^p!BRSHLtu|2Gv2Jw|edKxnWJ{6gcUdM=4oR@F9_l^%XB!`#qi+6+WfTK;sbuK(=? zP(VZYf>1=XoV(E$xfT<dKcoJ4L{es4imscMCCkWSx&E1&Uy#ir-7}yR0lyNxj$m-M zg6sT^Y>N(tP;RbQT&3-*84l4Y>grKF#Uff>Fhs=Ps32)#MtomhgZUk6o)^^DGPmtM zP(3rrJ48ceIq56Nw8DsnE=BD!MCPTXs~l`Q>pag)YB~e*^BxuT0zbJLe$-#+MFR4b zeV}(QI8dJ>?jL92A0p<lnmcIXoA<Z^0EhGW+WNr^bpN1|on?SN1}462_YNOYt9GC? zzcEA-+ZeY-)EIGH3U#HuC9dZl2LhjdUWm-46{HTL`blv`4ZM(Wj?uvxzyA0)PqcQ* zm;Is3C-9e}pncSSH3|T%Wb3aH$8$;f+7TiWN_u}wN4ja)aF0J;sITa8ede$!%-{iE z=K2cQ5!+;<Zewa(aclPg^+Sccp`p5cW^n0K^s7IfQk~a7hoAlO|E&HwETvqCxA~QU z`8}2UL#!JqNam|omt^%O6EvStS;nOKPvQq{@|=meTZS=fCNEU*vuSC@aXP$niiy4u zBu_@kL}?gs@h7MVor#3NwjK2xdV1D&n-$k>^hOE}ZVerTOo}+}xWTPWzMHZUXJRf; zAjt{+m!p4mw|aSh){EwCE|rKScfPt*-n&w>zAo7riOBO|O!f0*NI{|XaRf_(os5DU zIt1Lit}m~q{eSGe1zeQd);~TobSMo<BcgN;U4o>f2uKP84BaItAkrZSNJ&Y9G}4VA z-H3`x3y4UE5-R^;&Vl3azQ?QgzH`sqKj(e?_{_sId!E>9@3mKa*ILNY=p?c(tlw#% z=A|%_?!Wx%624=xZ<V0RCD57?vv#d$%c);xI>5LmUZ?oLFU5AbawflG_KV&Up&}At zIn^t(=f85xPju@@*Z99QB>$I&<fNt{`Pm#eVy!>;Jendu`1*gFhQ!E(R}cy|GT{~g z^Ko%PjCnbExp?_`!JK?Xg8WbjFSilcn2(bSD#*(#0Oscw;5Xso7ZBj(g_!U_1O)`a z$V@}>vz|SQtNBsa{j6(`t&%^w!0+de?D;=xcD#c9sKM{&kA%=4HTy44LxNoKu`%*V zd+wCd0LMby!G4lF;Ulq>fHs*ar{FHGF^06B<MOF%z#B+1lKwr)r^dB<i##!Mdr9v< zgGGKGm6G&rw+^?&@COaPr$u%ib7ujGZ*<^+miVS#@yL;FEZ*b|q>yr5@n;({vKb|< zk~??6!N(qMcFV6)Gc+%3`<G>#A5GHZ^T<rY8TV|R$C6FR_*~d4rU=KE*EC)!nwm6z zy;asrdM-C-bn8+s`gM3l4dew{w%DiP*RNJ*MER^}I-<vGi#R?1@{mSltF9G{26mZq zK^P$rp->&IB-i5FtJ$A3^1gb#YzLZG@O^nB$fe7V(5&-r#&X+(UXj8heG2FK);BDu zUQscq5ueoInFf7WtqW>V%rn%GWX<Gt9JcS59?>i&6+pI?rSf(*``MEE&5~5tfz)yQ zFUij))TDc_QX{M<kjtcBOZyiWEM9-E_K=&E<_2J(+@d=oOE^a?tF4QEon|(o((3f# z0=R>`A*uM(K&zK0to^y(m6a%18pNUrSG=I~IMDJ!=OkS?C+Z0y#5f+ew9@jMrd#6r z!Bkn*S1lZTU(xG(Zy#K4@2Be!Jg)kVykg^jkE-u+Ga^sh(%Dd3CW=^H<!_$4qrcWM z+NC|689dqnJm-UIAD{(>`*x9+<i#ydXE2CLFGYV`^I|O;5$Bu|nFHgUEBvUA0XC%1 zUlE*;8L?pZMQpWLtgkmG#5p3hj9>5bZtqqC23L%!EXMPM%hi_srEswYd2w^D*EqN6 zi5E~w?9<2417$%Y86FC8;Xxf?JMWek<SDQaMhHaXw_yI}h398SN*Dq0w9hFyT|KIn zKiFzH%TtctkD`nv;O~2Pv}8t4q~XqMaLQWT2(y0B%HY*7FCp$DciupNrgETKeCXSe zVD(d@;;{*`rrrJiPh0=Y1ZmLKdpHS?bvOj}G~&XFuE(tl<T)4K_TTNg>1t=d>wwWJ z|53Nxy-%4f{_}<NyFo{toY5b+hKJ>u{%M=?N=!j^k{ZMC1X#yag~RHba{%3H%26i+ zfU5PrGyuTGS=Z3z_d;qa+&md5GZkm5UtbAEPa){!FMOGuEvR`7VZDJ|*<@W}(jO&Q z*uKQ@tu0>r;HpXLS2SH3jcNAG4)Gg$+x7$ImPiJ0UN*<W164Jo#R$D%(Q&->+-fG7 zv#abLdF*3wEyH<#y%R!+1FOaRrL4AZ^{OwAk$swYx40fX_l#57alDvS`|jD6>dP)H zScgI)@<Oqo4-AN!L?5?lsG(I4)NiHD4BpezL2a=WDJvMHQr#Rs8H9*G4UWz9*z1k7 zq!qMI_k3!QvJ$x9<mch{jY*-r?vBH8Avoj_;_p!iE}lSP)&+lgBFm;@Xsd{}(ahA9 zq366xf(4{xc~Po>U?+2i3Le^lylk;T_B4#s=Wzz9CiBUJC1pK?<M-v%`8&JB&@Wgg zgg<_NLS_VI!xcXxw*?b-`5>$33nDjlLi&bL3DzXJGa^Kic{*r|{Xf8QC&*Kq>~jYO z1(~7lTTwUrg}&&5KXS`3^Sp0;?TbOtQB@Z71c8M3FT$O~vvShmr&${be<=2(zy8?Z zrlj>-R3RxaWTETEgy&t}L)?h~tt!ESJaiHCu@v)m<&$SpHBa6HI?H7O-f}FTqbx%Q zqK}&qD}zIGSr^l3EC}Bl_3TfZuRSIZNNOw`3@f~4gs`qdw0!Lq&)S(sSuQ46Og(p5 zyhBxf&9pGGz`!brm?8i#5Oc)nNb+m?BHp3pCBD+%w=q~U_;US@l@Jy4EptYSsYi<b zLrKTJ2VlZC^Jijh?58{K%C#~Vv{m>F4#n4Y*vW`dU}5m+3TzyS*T0F1KWqJ8+i@wt zcsBJ1>2pg7%cEtFcG8;jTSM(W6!7aRcI~~<sT$C4J?go(p$hcP8lRZwX>=bxM!lZ6 z?m8t>W?GjYxMOrzDS+V^8vy{;o`2g1Tn;y(@ndAp)%@tXx>B>0&h}2Oom-8lp+zK^ zE$i+5fuDWPNl7R8?<pL|{wl_J5q*+aRA1ZRHfh^;hF!J&?@NXfXy2zatAl2t`y<C@ zO2Aug*BcM|Lu)ZPgR@&uRC@qebfO9*S>3^JZC_}L-bN(Lz;w2-fm+)cTVblh4isSr zKTp(zVFa;;z=}U$NdETu^Iv?I+Udx~nhuP={G2XX8Lb8EvsTB*Ut*Vrl7C9vq-~9h z++<tS?+%6GW1>oUgg^4Yo9H)!I2$CYM#pNOQxWxKSIHkdCtZ8kkV5pTs}jEybne&Z z(RZUj+FFVd%mdbE;z&2IZB&dg^SlvxId2x_A^Rk5h$4+)Q?H82;WQSjO5ax8q`nt) zd(nb?(Wu@#euCkfm({f?+-nnq13S~de)Hd$!VmX<7PJztqGtmFE<RD$oq0N{R+Pu- zS@CTLh4-Svr>hL#?)UW^UJQXDiO^*4{f^)VeG|-MV||m)^Y3V_7~hI`8xrE!$d-9; z&Jkhnid2m@{#tRYLNuybPK=BfWHW3hGTT{8jYlwv(aotRC}MLh$Q7&z7aK8^_>km@ z>$k{xi+lggI|@su(Xxy9w?vpFLmw79j5(FmZgX;?UpXO!P-p!lWBwI|I<k9`hr9n_ zv5?ygpWHpi1}2jcmumh}xv5LUaJU!pjJ%^@G|#z2)yFUDi^b<sG7KLN>^Wqit-W9( zE6L~sPo5NwR+IbI?eJilAU<;U+A{<hAi^pROQo16QmFT-I#J(#UQk@nh6DI7y=6gC z*$oSl{$@RT!21~gj8L@L;x?H!CIy8HET#;n+3qZeEny>UM*IW#`7mVia0>&*>vZIv zm5$s=3Dw4P+)w~%T?0GeUbnHxM+s*~3nxu!HDmcQUXgT>+*Fh)x6@Ik`9`>6<xV3} ztb-EGR|y&!_>v3!X)8GR`Dd*Fz|HQkGiEX|PMPvuESF02g5OMuqP}H)=G<wp@!p&3 z65@hd5iOJ_0OR!;pOrp{>KI&?s$;YNxRH;iN@~w-Xo<n#u}t?GrSwR){Hm0=`;J)T z%&g)yV2%ilTy<n}`0HN5ETTc9d80cF$-fcia1SJY!NcJ%6k*^rcma2^G}q%9AI--C z<+3z`3hy&FleRg2_C0~p8$Q@|5O2sv?m}l!i5|QtgLOLQ)KC_Ae2WuZ7>%K>>hoE) z^skw>8|^R!m->icuf2o33~yfwDspTHe0v?usqad0JTP_XtYz*F+>K}kirJe@?G+(x zS|gVbhB>p@fwXswh6D+QCII)Mnp#Ipao(L_Qhjr(V$I6E^Zcn?!b3tJubPfEi<veX z4=0AtwJwADHm1OB$-pP?<$dLVYK{kqRc+h|BLt%P2~1ao=<MyvR}}e_D5v<gUh_WB zI-uuz#eKpp?cnU*J&b`PeiC(nt^&IH=rNnisN<Ve?P85&5<sxT`fcN6r;fx6QqN%o z_-z9cWm=#4Y0&D=B2}BuOCDzZ{ZH@|<Xf1IOd>MzMjN9QAF{q>dGvH<p`8hKVc=o7 zaLaoQ>os<5>HIJr8a!oM;L7x3zI`~6c3(7y33^r5pycT)48a<RkBDhnl_cmfaGn}+ ze@yUMH5Rpjj_o?n?ggw5d}R-_xyZ|NCN4EgKmGOL_nnGoS}nukU@4i4b89drLEe(5 zeAvDr+r(#Y*-oiF4IOo1uHrYJUS$e+E|f7?<HIatya6X+{z6%Kh?VL@N!BUqT)d|Y zh%2^>2)NY|pf(N|Zx(hi{_YOX2Ra5%`Ob^is_q8AtYO=1$B=V%*?!VmcQo#``ah?A z?*Gh&Q??W$kHhv9!b>mBEESt?Rz#At2e|NEVLsryTF-&pk}nJ$sNs16b2B*Mf#f?% z)2t6{=KEY(=CKlg_I+XDr7!=90gp`khy`_^?*q?if;|@7kPsDOBDKm-oPx<Mv`Ki{ zp<`2Tk8zs<E$<@!54U;5L;v^$A<9tYq?lUxby;XuR%Ws)6AZfO^pS?cm{0g}_8HMt zgB_Z+C1F)O*ll-^SEKl9W3iHCk3mvSg}&w6OAAj)fS<tMqBZxY8Ygco#I3~tIv4w+ z`~Lh0nE=}O+Yl*<K-~O@cC06KJ82GiO*!Wy<aRT}l>oPOPaQluE-8RK`w22i3LI&Q z?ZEiJh1#jcpyY2Kn)I~qDzxD9&LwrJI0!xbJn7~bODAz;eEoCM!p{D8WRaM_oeBxr zLLvLS!aVZI5E>GYLfS?`$4pm!h2=dT$dv+NqZ!d6A&dgSjh-twZS$MoMtBTkJi*wH z>MsJCzTJJVz<5#d$$r7n(zses^fhoM%!yVeR^T8zQX4HOoBlkR3wX&L!egM$_VkEC zz#jeJtL<I*VeJ$l9yR1w#^o|S%uohRxiP0Vy*E91N{$>qK#<AXlApHz+0_c?i(bQS z{hwG#kuN$P2{2Oe;kO61=v!aD3=NBNsF|a#lCY3UWTp<mh&T0mko*;N=$tG;xl7^) zeRjd0k*vQr=t(D&(CsPg2dii6tcP;D2pdF!O-d+Ytx%KRQ!94hfp9i+4AtRldE6UJ zvEB@mrMJc!5jIGXt3ZaQXpf;kiV1D(T=H1lUrn~p!w&Qm6h?dX^i<?i<*&zy9gv5@ z{0kF1AX6HQp)BT~D%*LJ8%dSX&3{?p@&GgGYx0D~E#8K!^c(Mwamf)czC1vVH2C+x zCCA4;!E%^%2z7Z3?Fy2!v(tQIp}Bc(!g}*QZtQSgx|%?&Q6Jo7jl6Iwy>I4C-&F8@ z<VLE-nzqK?XtFbX)v)X5S{zW)dDD{i`Gl~hWPdxY($>2e=3wX+rYPA=W1<X!{JgF8 zsc1nv)d>IN0)h(*BuEM{{L2am{)r10CX1wu4A#bx-t+~ZX`ULlzl3G;v?|JzPd%%z zp<15`@c92H(qIJ2(rW1a)q?c~>9zu~7uNoC33iG1M0~=g*Arx6Wlm4XXwK#VadXI6 zRlngnuTTDV^3nT763pm~QOgVSk)>lpftWOpKEtzUB2U|Y(%;>bLUx-(DfMo!+sBTf zNswF3Rn^sNw!(56XIEM{PY5AOy-U;D&)hB8@&wGkzr|rA8z{}&-Wzuw<b)z$Kr-FD z#F7X1T_DdljP?2Prr74{j28(WkJ|9y-C_c4dAH6p62igmobp=}4kv^Vg9o}w_xzu} z;le3tIf%5RywuzuS2&@i#>cNTU;j}iHGDo49*Kp#1kQ_t8D+$H{`wl4jWbc}=L8wt z*V?;u?&0E57x!W_j+&nkLJSR5>K9##^>0f_iZ0Gci~&5z=?Y()b{#V^Qm?cLq;(zc zgU2l+PvVIg!9uNzT)oo7)UzZvLS#!PU{yIB;?0>Fl|Rlshi7|22r&}5j|YB}w5ZJP zdI5~BT^u@?8@f2ob|+i!>cF|-&iGH3#lIDx?@mEdMS-iXC39;ieRK@Z+Dl$!SYJ>K z_1UbB0nEI+0wqGdM2on*v&hwo-)=vrzFI@r$|$UMt~BzR9wQ{imcAJ6y1Cd}Ys-rM z<A@mK<+k{nM8r&;r&yR?NQfplMLb_xW=q{krhVVN>q&lY_DDe{^Yj|8`2ieJhdiKx ziskuKu81;f15tMaW(o@KMhsc~d8=G?X<#UArhA|X0$J0)Wnu%OL7a>&EYPnxJ6hP9 z!3xCv^X*TZDhH2?*>O{oHsmrtG>_hRC4HsjCYh~0UN|=<o>%3&`FAKbw$3O@%Ie1j zFP!41rN4Qja&8mZa<vYQVlD~v5l;t;5ce;linjXVg@Uh`nnDC2rrc0YV+g09u_-rL z00M>z8grTm@Ip=a!MtFI5hp)C7e61ApOe#60LsJ7DZpvU4>jV0@<3t#g@j=D6cU2n z^eCGda3+rc%~7=7A*I%O7+k(7bMtPeSv@bAS7Kq&oyZ)va0Jo;nP#Hd7A!)Bd675W z_c%a}L?7H%WQ~|8`9sn#mQ$Yg^_<Wm;^%<}#2~NyweD^0wpSrg^(h?P8EpUVbnkf6 z=S@B3P#zj~h{86p;t3(d9Ea`f;9G0?Tc#vmw?pq;!%1x94_SMEI%Gl<?_N2Zy=bxp z+-Yd<FovW$<ObcfixYH;-8J6N)IAvYgRv5q?r$@?ax&SCLFo+V8BYiyHce@TA6`70 z%265nTJlYO9^<T66Z;DR_HwTH!5n&;<E%T#n-PCm)*a*uP21FlU1tJi^Cp030phIL zA`?6%Qs=hj*}`NmG}W(J9cN8P-dg?l$eJGic_;3k1+GXzu-3v7+B#I?oy`oPfda>X zzgd2`cq>J9fz|{(o*Q{H0?jC+y}^fTUVv_4EibU;)mU@C`P|ETYTx1-C7ml5Pe_WB z_`RKYX%)*er6Anyid}NYpz~cWO$v^!IcXH)HhF$>J9i*n@DwMVe%mp~@#!?iYPw`q za+I9cO}Xr9?o|=EM`{<X<<x9*Z$XhP@!XjcvPSG<T?`fAQ*{nPOE15)b0hJc2I~Em z>ate#C{_zA6k+^+ZyvbK4|y=z5tPgurDT1Ur$zYB)Va796ZM9NW((b=;GAPo|9ZQV z=7bR9AX-G$W8LUuWH^rXhEOLn^j-Kf&~?lqLl!{-+!Q&^oX^y7yfX6gkrDOG%$D;h zOx(yo<&u|-U4QG^9XP4!qyOG$M}6u+rqZty;t#;+LqZ&qgvYml8dojLwHWSFWTxyE zCFVLYen7LB6Go>EIYNy97PJg~S!wawP&jXo7cnI}=L*)*ZH<WB&z_CdcMH||^6NMM z=UN^N0)j*(<{^>PzQY^tFN9BK&iDoLVOZ@=C{fj}rvk@b-6U_r_tXM6+&lzx>==qG zB1v}sd`((AEiZ}X9LISx(=XX~lniGM#-&vrvO)?vpPV~qfG|QJ0=au=B|qG*JtSVv zUUyJqn(8FHx=1*dx$ru=!*5PAMQWYH=>z=?+0i)bUc?pl6W(>49o+rOMK&aSdVRBQ z-Z48hV)dTJj7viF_nyN{|1ZUDWuZ2`{p;D*vj8afn0WXQ_9gOySB--t<c5L&RXuTp z9>4aG&f`X)7>W+5UhkAox2sSt8~WbDnrv64aDL+C-qNX~o``;{_lot4eTv~ACZ$5T z<F>L`owfb6X34;HR!i!Bv%c?p;%B)0U+;<UI0K8X@&dKo9)Isp$ws|~z3%m|w^f~j z6E_5`Lfar%?nfo30V;o0;b%k)$Ri}y?S~xwZKq}KunNS+n>ObIo`!u4#+h><X*P~| zJg%-db_|yr=PaeqO!!i<kWI{i{!XN;1lSjiLC)KJv%_)pIpxyAZ{r(=U$nj7<fR8? zV$yOrP{U9AoJOb@p~!1@BY*Uhu@NtWAm<TW4)%keHT`vR9o_v$pGf7U+|1O^yK`&M zG(Sc8jxmq&S{W@0SzhPZc-PJ<^<JAPexSDy9%YZbQrXifG&N@oEK_<a(G;&QjIK^; zjEalm^^L@mYAIZAm#04=gaBt1J#<?VoPfHPS8Md*+p?LrgiSqtF*3@(ysRgItLn}y z3U}Th4@GW(hjr~S4nS9`&f!uB2@fh}OE-;*_bRE!4FfGRT&j>0LI}S2wDyPIKBv8_ ziqXRMNrF5)i3C?1d))Dv(HI;*eK@wvA<v!p_pr=8yc9EngYTHG!lCFB+B8K;j~(0_ z8F?pvW!dWLf)GuAsuA`uT>U+h+LeYJ^*0n<l@Q8|rd@}k7_<p|vCHL4TM#%sp~lvu z68UOz8*xZ<<jUL9J@-e^BJI4*otg4Xz!>z-G$`}4Wp_UH>E3l|ctvnrseXq%8%apI zzpPR{atR?<egD(GX+8VCwdte6VGY*siqgSB^oyw<u7k9i7WbP;?~lN-rN{$;rHXNQ z#%om++I_B&7W}#ul2S>C!K7Y8yu4ED9shzB9f51azva#Z5u3Q%LToII4eX38p~lVz zrWR0Z6O8MQ5PN&5BM|-P$%@c_`yohP>eyi^^-ycGu{+fxlG<KBx^~Xhxwx2FWbn?z zbd&2Q=OMyr4-O*+3LA$E-w*TO(*Zchw+i5MV5J8srG=6!W%<+6m)#T&0~V2Ggm5G_ zS_dvBUpfzAMi*hF7cN#%nS6g0lj^EL`@*kx-FNzd5sydy`|>sOgadCG^Y|;!F<+Eu zjzX7xG9f|?L95OqJqGY#^~{{@ho}*eed5?B*B5$nvnOb?bIPYCUyQYUi#REmv4>97 z+`)+!U0qRz%;uaapI;AEGSXH|o!w{DHol?%u)*zOsuvupggir@Vua8^#aT>$EcM=! z8)brYFJEL3_i{Vxp_zC-Fn3z#`nN`bOIz*A@;>)mo0%$kI%-D!%+^6>{=S-&gH}fz z30JZq)dFwdp?30ZEp>#1BW#u}Llyf`;km*${FOBczPdd)eyESn(0Q}``pti&>->Hm z(UDaNz=uI@{0g7h#J!Y~uPuGeDG!SYBKYVSRgkMa9z*6w{^e+-dt76kmN@sJQ5C;7 zV%bY@#{$<1(mK4BVSTS&(8ot@@s9@w?j)+s2Q#{8JVza%S-3**x}V6bOycarY_pds zAnJ1jia+~arQS9QcDesVv=lO}Z^0sx=HtcED}kW%f%9UgETfoFqo_A{A#Xdd7j2!1 zj`J?l#-BzK%Ixovcllv(dXMgVt-UMmpvUbW`&jg+9X}6hl<&)%a;=y|ONz#yDP)6d zjL6F}dpc-2II`c?+1jzapyyu4>R<(^ZbJooIIC=M@(a4UA;S0xa>cU9MnC=Qr*2=D zwoSBRAHAtge_okQqQbdnsQE<~r2*=3B~;|a9sgyOP?1ZBxM#pvEe<jcx`$>Rs$ba& zR*W_aZ_Gyk8Di@4y1KRGhQr9<emdj@!IdnD)rK1`1dv&Y)}LxXO(K#=|ByYe{`Tpc zZwxttA^(Dq_s2r@=SQIbCiytN1#A~J6@8|F;WcGC23Ce~uSnR1kQufEn!qy(gSLnA zvEo6Sb*dS7a13g5A5<Qh=|!aURyKBz?Pl}iu&~PkFM!US%y#w7N!Hh}3X@2AN(<zk zNS6teFx~s?CF|MBmtucHm`U-(_&e6NZerRv4F!UM;9gz|fkg`cjI^)oGScKeQ@KLE zL%+qBAPvO5LND$0f!XakPwR_oRj+r!4=b=_{DPOJDsxY*5JcWmJ|TptJU>A%#1C>L z@(kn~4fec5D0sKrzEMWL$oM(>HJh>O##4)M7!2}qhwGdUn0hLI@mfQ^b8tC(4HUB@ zXlVZx`8TT5zMNlLM#+Dj5Z`Hx)g04`rjk-4{<`%v4vAW2dF6M<`*I9ZxmTKQQ(EN% zT3^2AI^;OnbXtYoO#r7nI|^o?pDn>sfVS|9F^$_xXCGf;HSF~M^_%}W|N7%BQvD;( zl;V6$)*@u51s=G4#@5i%CcE<><pyqZa6^my3d2r3_U9cq;sAN5G)@mPrT4L!S*Ioj z)={K0O_pobnX>t<AdAJKG6R$}I0z#IVqJUf@r*$YF}e4>dp<hZFLJZ-e$y1ZN&lij zNn^(uCzkw3U)%0^J#4q?fKQW>b<r}1xrTIpFcvUO^@?IJ_=6tR3yGs)0<3tY5*n?j zk~F<be)==R&ev~6u{(<f;)FUnsG2~U*T<PKU_ba-Q-t*xa;2dzf|Sc1Os>j(J}(wr z83T*CLYuzoRM1M?{5Y?3-Rjygpb~jz+rI~(^5I~O&dNTK$b+X6U(d57qMJXUcg0}8 zBk@VhjI8q+W_^&xnPfN*X|^gv5{@r#RUcb6<J!PoV}&=%Hcq4(wwUGC)*Y$1SI=B( zRdRlSuo;19!;ja)p+XUM!PeLMSZR>fKnl#5`(pkDCVXGWdbstB>oHy)@sS&hNjG;< zDPq~f?V;?rOeMJiR|#rad(AJCDwywu%^sS~;Tv#Dtw4U_#a@-{a!DKW#@Duu)luob z>x6e1A~&S^2WyJHg9yNW@Uzwk>p0}Hl4;$K4|bo-1Vw-vFliD5X?>HsERqC@s<lyX zU(${EdYp$DdASt+vOLVlCB%$r^GliLrkqH*`|+)e{^n(OI2Y>XXGn0&4(g*1uyQ-^ zyPtv$%N^v|d{p?oN1vWyL3e4UH@G#(aG$5HIHD@RUACaHS!YnGRULsd;@{G6|MvlH z4I*dOtdp0bE>C3<EY0Pgf3zJYVWBe_?Inou@piiKqvL?KBVe7=!`ah0>RF@W4_<HJ zVi=xjfQFqi=fYPKDlmvn3%K$!=ZcXDk1>~kDJP$?pb6AikQ>Yc<%IBZaY2otybvR9 zu%M|auYd`di%*ajVqz)?=7;hKa>C--_>CakJVt`1e+0C_YeT?B05IWPQGMoI6rq2W zk)0{C7@2cnV63XWH>q5l!BSDAS3bh%fM}L}>)~nys!sI0=Q#_DmngC?xqUDxy>xmq zY1#0%rLTUGAU<O0jC8=#VnuZ6&4#$KI}#hM_+UC^zAN#jqft1n-3MpM;Qaiz-7hAt z1CTQFX$?&^bEJ5cs=wtW@x0J>y*f(8cP;!@aNH2O;$?(&8gjYFUTp}26`{t5Q>#+W zTx0T0`wztA&>ucXQ^@31@H$glVt}p=2Yn&WkE|%kFuO{q`w2tHM-QkR7&OH#%Wc$_ z)4%(w!+fnXjpSqyA_4zNi}k~aYmK+XwyfprYxm60Wl(r31w6&tzTs!n`t{6x1%G%H zU@q;8LsTu$p7VdPadGlPgoK=&A&w?4PR<4{_GXR{6R3eT#0Y9FBy>$(LQP8Jn!168 zs;ruXl(d1Ogru}0;8H_*?b9jNPs~0E0%FS{+8X2KjL*#rv#(|~nY6ga_?!?z5JlB> zI^@4`WVFjOERB9P>w7VL^z?_U?Zo{h@RZnv<I*c7x9M|`Lx{ge>6HYM0e0hjeAbr* zi;G^-W2|4zx`{p?qz%c?DQd=^zib+0N!9}oPzHckkc2g&!kzC$6&)5>B>P6*8P!`> zZL3uzx-$WK*7r)fufF*?0%yd(CE)yLAT9|Mm6R3Fee-zfOK`R?>lyewG_Dk}UNo7x z+c^iWmI*&J;g_Z}&df)wB%p<}3f%ID1<!oUdpzWhn=x@en&@hc#w4%{wUGxL$4WKI z*;v=rX6=io9&g3sS57#?ed<6gIA{QYU57*uc>-l;xp}SYRXc^KO~ad>O9TNMPUl1x zcVDKy66Pq1B00v(rDB93iL3uT@Nx;%XZkZTR+ojU%ph&ApJ57cGt8r`itM%fE_`m! zY%n^8Dj-kJ`FlVW5*W<M%;`R(4ds*D1g8t2q<lurs&7lS;qvc|S<u@bJ}#(*JjX1; z3Tgop*e)+6L+-mwTra<Odn#!J?GBOPgK#eYQ?XIw>1TA?VB!OO10L#$*_dgRA8}w= zRnV}30DKTWABv1Psy~nrEe_ZM#CQ$r1z~2P8KV26dtv)xpy38#*Z_z?*dQDbE{Fm| z38Dg$0?<G(AR;ah00g1J_ZWwJ6d-&Lg6~ld_h^_P06G>100SN4@CgV2uygptH~`Qo z*a;Ab5EBasK*7U@d4f=gPvgP%X9-}(sANPyATH{eQ?NZ6IW`Ueg9L~Q1Yo0p&`{7Y zanaCF(a_N_2r)@Om;ek+3;-tV+0cQQ035W#9sCIO@CXZtiHQR`JVJr(V1EE%r?6lL z01PYu?1c{h!5hIY0)n-{0>D~h0Z=gD$0)F~Kpf!V571#pXots`01y@c4dsuvur?^L zJHmd6cDO@5{5d-O1jcWFfZ$*J_6HDl3icd_7sLhu;SY*>+0Mci=WwS4v4xmH9ZA1C zR)RW1Od!sX%MknTPpdmZAx<ui?y%Fi@YcUKJIrT;u43<OVP}i;T^lTQx65|6&QLdJ z6b(mf42X$|Bh<+W)fje9+{2xL&2M+cGlpH)8ERnc;^+vqHFn1_aj~&+{|&233bi%0 zb2Ns++PYcTxY!stx!BuVyW^WW+SwSubM+V)xjRFhP%UgNoKbBoV99k36YSVRZ=%}T z*+S9n;7>(l?_y*PL%}+kLmZ*MV`1@rKj-WSv2`+qI#R&yZRY~3<Y{2@`)e84-L!=| zI+<J8qdP%uO`wjLM{Tj4-3*L>e>E3J>z~bm->1NjK8~iykG_Wu7SzMH!Uho%D7n)r zL!2#Kp|t9DR#017PHYebxdg54Z|9uh=U^R13+obRSOz0(ki;b}BYqxE0X|MX6Fwsz z6CQ3ZK>>cSpdi07EQt^&*vJ%O%*kb94COK57c>!o@InOyO~7DY6K)8^gx8ph2MUAq zorXUmh)n>1i-7~+!iLQ&AZ*}bU;_n!xR|(Dr?AjVemDQXPJyt2>;zZ>C^%R+m^eTI zR9tjiR9v*vXs6JRTM3}ypq@e(fDKpy3>-9E6buwx*gQB5A^-}&CN6A39}*EZs(#k9 zM>eM)b=}Xp_Sh5rqYM0g{wPN8N6n5=k3VYg`}w1g%O5pE`Pl>i_Cx&ds>S@-rSNYZ zT?Yk$Lgs&ye9qMwq5x2$@>H!W5NlU;Xq40?k)DExsJhMKX6W3iK9tXOgH6kJTA3sJ zzurr@Fdp<WZ<RJlZP$#)vU8`{m!NJ9xN8^hxE))*e0g?wOP-yt#h}glx}0Eo&Q3qm z%W>_(eFSzLGUapbSnGNg`RpBW(wL|W?;+f^G}}|3ixdJYziIa9@!Ya+`oam<F_Gtw zYqxBC=8-@csBZw`#djxguLgUs2Y8TbGQ|?}ZvyWkuJRKA^#3e8-!Feaj5BJ*+BmsI z)IsvPPlZ9wncgq&Gb=kKR~c11@g$FoG2)rRmIo6@cLM<v3s+MYK|C214P_}cZ36)* zc}*D&L70f~+ZGQ@(7d~(wjglt^oy$tX|Y*t7M<fbu^+@t-=JtdYo|dob`(CFLL%?H zkj^6YMEQZC_H6J*o)n$6uUf@akAgVO4M}ty_{D(HJw|Z{i!8ve#wIFKjiB}2{I`iM z!a@(QcpMf8@1J%6{EvtFhlhkc5%B10Fq!G-5l_g_)}gy-O#f;5b9(^(MS9OZHy0cM z87Y2x@h^lKtCoqTB{RFA!xVly$O~T7#w32k##j6lP|EjkWqXy|yK`ut##xdxmaRqE z7LzOPgb+fX;%?`KfJBHkcQ-6$KqZ>JNkngwTw6D9+!xaBv4fzg8yHB2qUI}C$Kq@o zo)OPskM%MGi7({f%HG-CwmlU9I2|V!vvfiTVeIjW7P{F?4V|BrP~$ig#)IAA>S8JR zXjf;F)=RzIo`*mH$%Me9=~cU3)3(UYuvVK@6WL<wjaTkXc6XmhoOSFp#O>AzA%yLk zs`!lZ+b>vmi|SF9ls~8K49sc*uhs?HdD&M;UX4&=d<|c9Igtiz1pzW$)6y4Z(Hf%z zGP>>Ft)HVN^fEzjA%DfZNB~aDJ0XOy*VsO%wqIpm{XV|2BtUsji;waWNEL(AoVN=X zv>ao27cvO1Zay{87Ykb+k>GS<hG5ljwW1|1oUT9Z2;3>1dh?LB1}6vDys8T-y<qVM zVT3>=q%jegV6T0Nv@IyI+;u52#xF1xI+KZJO#D)P%*Hm?I5Ypzk>k33{p>#7EkeC} z+VN3mdmLi3W$&Zt2ToeJafY%wnzGmZE;YfrUND%e11Qt<&1-8*!j<M+$AfC6^*#l0 zVVqI%Z5_<>MIPj=_m+P4z4`mAB_~bJalQJ<+0Gu2XQHBWt4UuB%YOYs%eepKOHBK2 zVx|TMxfvJHLrr)Gd2XVj6*;f-5?I3rpbZ<)==Hm}JYgoNMvIv`!Cjmz#FwcNHinT3 zB}lkQw)l8qr!bLn-55%Rf53Pp^Zg~Z-D0)P+libD{zE&NGgR;l+sG>bCS*^;IDH;x zkZLlYOjuIZLpXk4PMyEAOAP&jbwc>#_a}r9cZwPEPK&ood<v20W?VL(Q6}$WHFPfG z@G!UUotlqWpnjhRUtW<{4rBGR7ok#jHyI%7_VdfwiWZte$(Qca-rMz<S3mO}c&`S5 zg!s1%Gyi*JnDf&)=l)toL%jW=?Es;+x~e%PNJesqIaO1$Av)^W$45pyz>$^CDdA4B z01gGo@~j8_*m>t9nvc)$6cl`1Kvw5UckyZctgi5bjk%z_ussw8^@7<fIZaKCOt@fZ zFg_lLF|U!45kHg{Y{JI{;W@Nb@(FO67?~P#!rJk1g1H1Cf`1^xj#HiQCSz|)cs+gX z*o1dZ`(sbcB#-!ztIOHTV6er=YSqCG0_lKED^EaS-}FV!rqZt(MrJk3ba#Y3pEH_H zY}$z?dxr4s*d3#;k(Vp-FGF1;cZmo}TuPVhI{*4fo$@ETyrkL*A}ZhAgN3bi+0UOv z&E`{4dA86G*J|WdOiH|&zm_FfQFSi^^X13QS@9{WS*Z~g7v-3)VLO><nSUWk;j#Ig zF(H<iVmLYV;;jvk1|&m*%|=mLu$&^FB>D3L7E?B(g(<O7KlVdOuglLubtG#`oJu`J zZQ`H}VkVi>Vd+4n9=gpszQ$cVjKJymZ?VPy5S}DC^-)qyKjj+%GM=$Kq8k3sx*`vP zF^xPp0@?%{AEO-FtMQ}1lAPKZo{^Tll8rua?W*SU7&<FT4ok9*sEGgu>K35&b{;hU z;Qaj{!vRb0YXGN*&uQ!<xZQ`@b%SMP(nS%+$q<ckZ3iY~cN=fkWh!Mlaf?XQuv@-$ z-FSSUpxZLL$*{<jWHorCE2O<06<K9yt&b9sd_sCvZ-g6D9e?35cOH*Hxqh6X=3xRX z_y#QSzHP>%8iyrX<x<xBAUsE`PtQMf0p%0A!<Smph!yptxCNjEb%p&;TmS58ku|HI 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⁢Q_SWugndF<?(ov)*Jb_?` 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%0AIjB6(w*0BBulaFSPX!-w3z}1ZYDE0$NjoNXYTW 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'rZ!$==YZ)?(2@1$J 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 ^)t6b|r2CX?Wm>TnsBCRStE6?R#<vGw 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�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 ?w3*>F-ZtFyN0!eT=Y3 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≦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�~*p!$30d*zaqWmIQihekPymeteqr=+cQ!q8t{@1FQJl zy)DL|%TWBJ=aT6W^gG>U=z9<A(J7=x!eKF8^wii43%A6f0!+@Xw(LOX^uAbN#?5|a zyJv*Tny>E32*S9=QRAegbLW33pOJyxINaae{Mm6=%<@+7SNcLWxctQV5IIi&Yax8E z8_BAvNZQPZxQAEEHkS_z#j_}$?x>I_WuPcO<RUo#!Nwj)CXPdecT1#NXj{93gl<Wu zNaScw!NcQ`NgfjFevGwUj6vhBDhCCZA(yZ8yicE(J{0{9bC<qMfP40p24OTS!&ec8 z9;*@hFZiK-*TkfRW)}G#eBjej442o%<UnA654mab5emr%XvL`hRNEWiw`B>k?bCfd z&mq&Is3lZ`ZW^l>Ofwms(VuZTW0)}3d<V(gX@B(|$NCLHaE8(#DG|?uRJ~5PFpH97 zL!N#$?$Qr1uqge0{-}s~-ia@ds13nOMI96kV#!U0(3D1F{S<M6S$GHhicOA|EE0Qa z(*!t%*nA(Cm$Nq-?peTG6Nz|zJ4fOzMM=ALa&Jg}2Je#PQc|$%t%sI*?wfi<*&Yea zjdP%~XSb)6F_4jnwig?69dw`D5JV3)_XVEZ7N^efs<@l$#@~lxiMLO~c1;M8J(s_i zLMBCV$AyrxBeO6vns1v@7Osp(m*1GcB8;(v@<t9igrofQW*Us_EbxBHoqBce>4Ns| z1(hyJ`AY(o9L|#~--C}3;O?V&2|RvF=}v)cS?z)_!YxF<I;q@yPa?gKj>ei88vA=> zSL~(Jxr9Iq7!l@I)!Tnv`?P06FEUn1u#$N<1n=w)M#}~q2#+1)cmhp$Xu|*P4ztg5 zogaSux$EY4Rz7`sBBd`>w;dv;wrcr+y&Y#@{is#lpPKimT*AY<I8T-l1b+!RXpFw_ zyQ|%@M6k_+lshv4Z9~ee9-~RNcg9Z8BATaVJg&*aspIO2ERz`1s=$;R^gd4%?N$hx zi`8*SpV3f9#H;YPcwbeQDBh@p(CDwfNOegkyY*~dX5Bu@i{{!d<sVqK4fXFiklvgu zjF605v=KZ=ygdQx@=AjbhY)<yjHf(Tlo9!E{D{pm+X99ZuDx|S=?#nF6VmmOiGEJ- zfl)(tOZ?H+0aj)9Lt$usv)@z)mo6VeaNS*asuha6sfGu≷rx-k@Q4kn7==jp99j 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 Z_JhyudbO>P#|6Ck;uZyI@Gmp(e*i7*=J5ak diff --git a/crates/iota-e2e-tests/tests/migration/test_hornet_full_snapshot.bin b/crates/iota-e2e-tests/tests/migration/test_hornet_full_snapshot.bin new file mode 100644 index 0000000000000000000000000000000000000000..bac42b911176e8e12b2d40d054996c3918e23153 GIT binary patch literal 1654902 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∾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 Owhiv~)87nzY4CsIje@`c literal 0 HcmV?d00001 diff --git a/crates/iota-genesis-builder/src/main.rs b/crates/iota-genesis-builder/src/main.rs index e0adc0db630..3c79fdc329b 100644 --- a/crates/iota-genesis-builder/src/main.rs +++ b/crates/iota-genesis-builder/src/main.rs @@ -4,26 +4,20 @@ //! Creating a stardust objects snapshot out of a Hornet snapshot. //! TIP that defines the Hornet snapshot file format: //! https://github.com/iotaledger/tips/blob/main/tips/TIP-0035/tip-0035.md -use std::{collections::BTreeMap, fs::File, io::BufWriter}; +use std::{fs::File, io::BufWriter}; -use anyhow::{Result, anyhow}; +use anyhow::Result; use clap::{Parser, Subcommand}; use iota_genesis_builder::{ OBJECT_SNAPSHOT_FILE_PATH, stardust::{ migration::{Migration, MigrationTargetNetwork}, parse::HornetSnapshotParser, - types::{address_swap_map::AddressSwapMap, output_header::OutputHeader}, + process_outputs::scale_amount_for_iota, + types::address_swap_map::AddressSwapMap, }, }; -use iota_sdk::types::block::{ - address::Address, - output::{ - AliasOutputBuilder, BasicOutputBuilder, FoundryOutputBuilder, NftOutputBuilder, Output, - unlock_condition::{AddressUnlockCondition, StorageDepositReturnUnlockCondition}, - }, -}; -use iota_types::{stardust::coin_type::CoinType, timelock::timelock::is_vested_reward}; +use iota_types::stardust::coin_type::CoinType; use tracing::Level; use tracing_subscriber::FmtSubscriber; @@ -104,182 +98,13 @@ fn main() -> Result<()> { match coin_type { CoinType::Iota => { - struct MergingIterator<I> { - unlocked_address_balances: BTreeMap<Address, OutputHeaderWithBalance>, - snapshot_timestamp_s: u32, - outputs: I, - } - - impl<I> MergingIterator<I> { - fn new(snapshot_timestamp_s: u32, outputs: I) -> Self { - Self { - unlocked_address_balances: Default::default(), - snapshot_timestamp_s, - outputs, - } - } - } - - impl<I: Iterator<Item = Result<(OutputHeader, Output)>>> Iterator for MergingIterator<I> { - type Item = I::Item; - - fn next(&mut self) -> Option<Self::Item> { - // First process all the outputs, building the unlocked_address_balances map as - // we go. - for res in self.outputs.by_ref() { - if let Ok((header, output)) = res { - fn mergeable_address( - header: &OutputHeader, - output: &Output, - snapshot_timestamp_s: u32, - ) -> Option<Address> { - // ignore all non-basic outputs and non vesting outputs - if !output.is_basic() - || !is_vested_reward(header.output_id(), output.as_basic()) - { - return None; - } - - if let Some(unlock_conditions) = output.unlock_conditions() { - // check if vesting unlock period is already done - if unlock_conditions.is_time_locked(snapshot_timestamp_s) { - return None; - } - unlock_conditions.address().map(|uc| *uc.address()) - } else { - None - } - } - - if let Some(address) = - mergeable_address(&header, &output, self.snapshot_timestamp_s) - { - // collect the unlocked vesting balances - self.unlocked_address_balances - .entry(address) - .and_modify(|x| x.balance += output.amount()) - .or_insert(OutputHeaderWithBalance { - output_header: header, - balance: output.amount(), - }); - continue; - } else { - return Some(Ok((header, output))); - } - } else { - return Some(res); - } - } - - // Now that we are out - self.unlocked_address_balances.pop_first().map( - |(address, output_header_with_balance)| { - // create a new basic output which holds the aggregated balance from - // unlocked vesting outputs for this address - let basic = BasicOutputBuilder::new_with_amount( - output_header_with_balance.balance, - ) - .add_unlock_condition(AddressUnlockCondition::new(address)) - .finish() - .expect("should be able to create a basic output"); - - Ok((output_header_with_balance.output_header, basic.into())) - }, - ) - } - } - - let merged_outputs = MergingIterator::new( + migration.run_for_iota( snapshot_parser.target_milestone_timestamp(), snapshot_parser.outputs(), - ) - .map(|res| { - let (header, mut output) = res?; - scale_output_amount_for_iota(&mut output)?; - - Ok::<_, anyhow::Error>((header, output)) - }); - itertools::process_results(merged_outputs, |outputs| { - migration.run(outputs, object_snapshot_writer) - })??; + object_snapshot_writer, + )?; } } Ok(()) } - -struct OutputHeaderWithBalance { - output_header: OutputHeader, - balance: u64, -} - -fn scale_output_amount_for_iota(output: &mut Output) -> Result<()> { - *output = match output { - Output::Basic(ref basic_output) => { - // Update amount - let mut builder = BasicOutputBuilder::from(basic_output) - .with_amount(scale_amount_for_iota(basic_output.amount())?); - - // Update amount in potential storage deposit return unlock condition - if let Some(sdr_uc) = basic_output - .unlock_conditions() - .get(StorageDepositReturnUnlockCondition::KIND) - { - let sdr_uc = sdr_uc.as_storage_deposit_return(); - builder = builder.replace_unlock_condition( - StorageDepositReturnUnlockCondition::new( - sdr_uc.return_address(), - scale_amount_for_iota(sdr_uc.amount())?, - u64::MAX, - ) - .unwrap(), - ); - }; - - Output::from(builder.finish()?) - } - Output::Alias(ref alias_output) => Output::from( - AliasOutputBuilder::from(alias_output) - .with_amount(scale_amount_for_iota(alias_output.amount())?) - .finish()?, - ), - Output::Foundry(ref foundry_output) => Output::from( - FoundryOutputBuilder::from(foundry_output) - .with_amount(scale_amount_for_iota(foundry_output.amount())?) - .finish()?, - ), - Output::Nft(ref nft_output) => { - // Update amount - let mut builder = NftOutputBuilder::from(nft_output) - .with_amount(scale_amount_for_iota(nft_output.amount())?); - - // Update amount in potential storage deposit return unlock condition - if let Some(sdr_uc) = nft_output - .unlock_conditions() - .get(StorageDepositReturnUnlockCondition::KIND) - { - let sdr_uc = sdr_uc.as_storage_deposit_return(); - builder = builder.replace_unlock_condition( - StorageDepositReturnUnlockCondition::new( - sdr_uc.return_address(), - scale_amount_for_iota(sdr_uc.amount())?, - u64::MAX, - ) - .unwrap(), - ); - }; - - Output::from(builder.finish()?) - } - Output::Treasury(_) => return Ok(()), - }; - Ok(()) -} - -fn scale_amount_for_iota(amount: u64) -> Result<u64> { - const IOTA_MULTIPLIER: u64 = 1000; - - amount - .checked_mul(IOTA_MULTIPLIER) - .ok_or_else(|| anyhow!("overflow multiplying amount {amount} by {IOTA_MULTIPLIER}")) -} diff --git a/crates/iota-genesis-builder/src/stardust/migration/migration.rs b/crates/iota-genesis-builder/src/stardust/migration/migration.rs index 96ef8c7fd2a..a1e0d49dd6f 100644 --- a/crates/iota-genesis-builder/src/stardust/migration/migration.rs +++ b/crates/iota-genesis-builder/src/stardust/migration/migration.rs @@ -32,6 +32,7 @@ use crate::stardust::{ verification::{created_objects::CreatedObjects, verify_outputs}, }, native_token::package_data::NativeTokenPackageData, + process_outputs::get_merged_outputs_for_iota, types::{address_swap_map::AddressSwapMap, output_header::OutputHeader}, }; @@ -163,6 +164,20 @@ impl Migration { Ok(()) } + /// Run all stages of the migration coming from a Hornet snapshot with IOTA + /// coin type. + pub fn run_for_iota<'a>( + self, + target_milestone_timestamp: u32, + outputs: impl Iterator<Item = Result<(OutputHeader, Output)>> + 'a, + writer: impl Write, + ) -> Result<()> { + itertools::process_results( + get_merged_outputs_for_iota(target_milestone_timestamp, outputs), + |outputs| self.run(outputs, writer), + )? + } + /// The migration objects. /// /// The system packages and underlying `init` objects diff --git a/crates/iota-genesis-builder/src/stardust/mod.rs b/crates/iota-genesis-builder/src/stardust/mod.rs index 56a24edab30..b4e832eea96 100644 --- a/crates/iota-genesis-builder/src/stardust/mod.rs +++ b/crates/iota-genesis-builder/src/stardust/mod.rs @@ -8,6 +8,7 @@ pub mod migration; pub mod native_token; pub mod parse; +pub mod process_outputs; #[cfg(feature = "test-outputs")] pub mod test_outputs; pub mod types; diff --git a/crates/iota-genesis-builder/src/stardust/process_outputs.rs b/crates/iota-genesis-builder/src/stardust/process_outputs.rs new file mode 100644 index 00000000000..bb4c93b7ad0 --- /dev/null +++ b/crates/iota-genesis-builder/src/stardust/process_outputs.rs @@ -0,0 +1,208 @@ +// Copyright (c) 2024 IOTA Stiftung +// SPDX-License-Identifier: Apache-2.0 + +use std::collections::BTreeMap; + +use anyhow::{Result, anyhow}; +use iota_sdk::types::block::{ + address::Address, + output::{ + AliasOutputBuilder, BasicOutputBuilder, FoundryOutputBuilder, NftOutputBuilder, Output, + unlock_condition::{AddressUnlockCondition, StorageDepositReturnUnlockCondition}, + }, +}; +use iota_types::timelock::timelock::is_vested_reward; + +use super::types::output_header::OutputHeader; + +/// Take an `amount` and scale it by a multiplier defined for the IOTA token. +pub fn scale_amount_for_iota(amount: u64) -> Result<u64> { + const IOTA_MULTIPLIER: u64 = 1000; + + amount + .checked_mul(IOTA_MULTIPLIER) + .ok_or_else(|| anyhow!("overflow multiplying amount {amount} by {IOTA_MULTIPLIER}")) +} + +/// Processes and merges outputs from a Hornet snapshot considering balances as +/// IOTA tokens. +/// +/// This function uses the `MergingIterator` to filter and aggregate vesting +/// balances and then scales the output amounts. +pub fn get_merged_outputs_for_iota<'a>( + target_milestone_timestamp: u32, + outputs: impl Iterator<Item = Result<(OutputHeader, Output)>> + 'a, +) -> impl Iterator<Item = Result<(OutputHeader, Output), anyhow::Error>> + 'a { + MergingIterator::new(target_milestone_timestamp, outputs).map(|res| { + let (header, mut output) = res?; + // Scale the output amount according to IOTA token multiplier + scale_output_amount_for_iota(&mut output)?; + Ok((header, output)) + }) +} + +struct OutputHeaderWithBalance { + output_header: OutputHeader, + balance: u64, +} + +/// An iterator that processes outputs, aggregates balances for eligible +/// addresses, and generates new "basic" outputs for unlocked vesting rewards. +/// +/// `MergingIterator` filters outputs based on conditions: +/// - Must be "basic" outputs. +/// - Must represent vesting rewards that are timelocked relative to a snapshot +/// timestamp. +/// +/// Eligible balances are aggregated into a map, and once all inputs are +/// processed, the iterator produces new outputs consolidating these balances. +/// +/// Non-eligible outputs are returned as-is. +struct MergingIterator<I> { + /// Stores aggregated balances for eligible addresses. + unlocked_address_balances: BTreeMap<Address, OutputHeaderWithBalance>, + /// Timestamp used to evaluate timelock conditions. + snapshot_timestamp_s: u32, + /// Iterator over `(OutputHeader, Output)` pairs. + outputs: I, +} + +impl<I> MergingIterator<I> { + fn new(snapshot_timestamp_s: u32, outputs: I) -> Self { + Self { + unlocked_address_balances: Default::default(), + snapshot_timestamp_s, + outputs, + } + } +} + +impl<I: Iterator<Item = Result<(OutputHeader, Output)>>> Iterator for MergingIterator<I> { + type Item = I::Item; + + fn next(&mut self) -> Option<Self::Item> { + // First process all the outputs, building the unlocked_address_balances map as + // we go. + for res in self.outputs.by_ref() { + if let Ok((header, output)) = res { + fn mergeable_address( + header: &OutputHeader, + output: &Output, + snapshot_timestamp_s: u32, + ) -> Option<Address> { + // ignore all non-basic outputs and non vesting outputs + if !output.is_basic() + || !is_vested_reward(header.output_id(), output.as_basic()) + { + return None; + } + + if let Some(unlock_conditions) = output.unlock_conditions() { + // check if vesting unlock period is already done + if unlock_conditions.is_time_locked(snapshot_timestamp_s) { + return None; + } + unlock_conditions.address().map(|uc| *uc.address()) + } else { + None + } + } + + if let Some(address) = + mergeable_address(&header, &output, self.snapshot_timestamp_s) + { + // collect the unlocked vesting balances + self.unlocked_address_balances + .entry(address) + .and_modify(|x| x.balance += output.amount()) + .or_insert(OutputHeaderWithBalance { + output_header: header, + balance: output.amount(), + }); + continue; + } else { + return Some(Ok((header, output))); + } + } else { + return Some(res); + } + } + + // Now that we are out + self.unlocked_address_balances + .pop_first() + .map(|(address, output_header_with_balance)| { + // create a new basic output which holds the aggregated balance from + // unlocked vesting outputs for this address + let basic = BasicOutputBuilder::new_with_amount(output_header_with_balance.balance) + .add_unlock_condition(AddressUnlockCondition::new(address)) + .finish() + .expect("should be able to create a basic output"); + + Ok((output_header_with_balance.output_header, basic.into())) + }) + } +} + +fn scale_output_amount_for_iota(output: &mut Output) -> Result<()> { + *output = match output { + Output::Basic(ref basic_output) => { + // Update amount + let mut builder = BasicOutputBuilder::from(basic_output) + .with_amount(scale_amount_for_iota(basic_output.amount())?); + + // Update amount in potential storage deposit return unlock condition + if let Some(sdr_uc) = basic_output + .unlock_conditions() + .get(StorageDepositReturnUnlockCondition::KIND) + { + let sdr_uc = sdr_uc.as_storage_deposit_return(); + builder = builder.replace_unlock_condition( + StorageDepositReturnUnlockCondition::new( + sdr_uc.return_address(), + scale_amount_for_iota(sdr_uc.amount())?, + u64::MAX, + ) + .unwrap(), + ); + }; + + Output::from(builder.finish()?) + } + Output::Alias(ref alias_output) => Output::from( + AliasOutputBuilder::from(alias_output) + .with_amount(scale_amount_for_iota(alias_output.amount())?) + .finish()?, + ), + Output::Foundry(ref foundry_output) => Output::from( + FoundryOutputBuilder::from(foundry_output) + .with_amount(scale_amount_for_iota(foundry_output.amount())?) + .finish()?, + ), + Output::Nft(ref nft_output) => { + // Update amount + let mut builder = NftOutputBuilder::from(nft_output) + .with_amount(scale_amount_for_iota(nft_output.amount())?); + + // Update amount in potential storage deposit return unlock condition + if let Some(sdr_uc) = nft_output + .unlock_conditions() + .get(StorageDepositReturnUnlockCondition::KIND) + { + let sdr_uc = sdr_uc.as_storage_deposit_return(); + builder = builder.replace_unlock_condition( + StorageDepositReturnUnlockCondition::new( + sdr_uc.return_address(), + scale_amount_for_iota(sdr_uc.amount())?, + u64::MAX, + ) + .unwrap(), + ); + }; + + Output::from(builder.finish()?) + } + Output::Treasury(_) => return Ok(()), + }; + Ok(()) +}