diff --git a/.github/workflows/check-code.yml b/.github/workflows/check-code.yml index 3250b9ff1e..921d85c284 100644 --- a/.github/workflows/check-code.yml +++ b/.github/workflows/check-code.yml @@ -132,7 +132,13 @@ jobs: env: working-dir: ./integration-tests/chopsticks CI: true - PEREGRINE_WASM_OVERRIDE: ../../target/debug/wbuild/peregrine-runtime/peregrine_runtime.wasm + SPIRITNET_BLOCK_NUMBER: 7850499 + HYDRATION_BLOCK_NUMBER: 5235787 + POLKADOT_BLOCK_NUMBER: 21010819 + ASSETHUB_BLOCK_NUMBER: 7934113 + SPIRITNET_WASM_OVERRIDE: ../../target/wasm32-unknown-unknown/debug/wbuild/spiritnet-runtime/spiritnet_runtime.wasm + PEREGRINE_WASM_OVERRIDE: ../../target/wasm32-unknown-unknown/debug/wbuild/peregrine-runtime/peregrine_runtime.wasm + defaults: run: working-directory: ${{ env.working-dir }} @@ -148,6 +154,18 @@ jobs: with: tool-cache: true + - name: Set up Cargo cache + uses: actions/cache@v4 + with: + # These paths are mounted inside the Docker container. + # We cannot mount the `.cargo/bin` folder since the container already contains binaries, and overriding with an empty one breaks compilation. + path: | + ~/.cargo/registry/index + ~/.cargo/registry/cache + ~/.cargo/git/db + key: ${{ github.job }}-${{ github.ref }}-${{ matrix.features }}-${{ hashFiles('**/Cargo.lock') }} + save-always: true + - name: Setup environment uses: actions/setup-node@v4 with: @@ -162,23 +180,11 @@ jobs: - name: Check lints run: yarn lint - - name: Set up Cargo cache - uses: actions/cache@v4 - with: - # Not executed in a container, so we cache the local paths as on the GH worker. - path: | - ${HOME}/.cargo/bin/ - ${HOME}/.cargo/registry/index/ - ${HOME}/.cargo/registry/cache/ - ${HOME}/.cargo/git/db/ - key: ${{ github.job }}-${{ github.ref }}-${{ hashFiles('**/Cargo.lock') }} - save-always: true - - - name: Build Peregrine runtime - run: cargo build -p peregrine-runtime + - name: Build runtime wasms + run: cargo build -p peregrine-runtime -p spiritnet-runtime --no-default-features --target wasm32-unknown-unknown - name: Run Chopsticks tests - run: yarn test:CI + run: yarn test cargo-test: name: Run Cargo tests diff --git a/.gitignore b/.gitignore index 8ca54a67b6..5ba7f662a0 100644 --- a/.gitignore +++ b/.gitignore @@ -26,3 +26,6 @@ runtimes/spiritnet/src/xcm_tests/e2e/out chopsticks/**/db.sqlite* chopsticks/**/extra.yaml chopsticks/**/.tmp.yaml +**/preview + +integration-tests/**/db diff --git a/integration-tests/chopsticks/.env-example b/integration-tests/chopsticks/.env-example index 9645115064..231c5e424b 100644 --- a/integration-tests/chopsticks/.env-example +++ b/integration-tests/chopsticks/.env-example @@ -1,6 +1,38 @@ -HYDRADX_WS= -HYDRADX_PORT= -POLKADOT_WS= -POLKADOT_PORT= +# These env variables are mandatory for the tests to work. + +# The Spiritnet block number to be used in the tests +SPIRITNET_BLOCK_NUMBER= +# The Hydration block number to be used in the tests +HYDRATION_BLOCK_NUMBER= +# The Polkadot block number to be used in the tests +POLKADOT_BLOCK_NUMBER= +# Directory path to the new WASM blob +SPIRITNET_WASM_OVERRIDE= +# The AssetHub block number to be used in the tests +ASSETHUB_BLOCK_NUMBER= + + +# Optional env variables +HYDRATION_TEST_WS= +HYDRATION_TEST_PORT= + +HYDRATION_WS= +HYDRATION_PORT= + +ASSETHUB_WSS= +ASSETHUB_MAIN_PORT= + +ASSETHUB_TEST_WSS= +ASSETHUB_TEST_PORT= + SPIRITNET_WS= SPIRITNET_PORT= + +PEREGRINE_WS= +PEREGRINE_PORT= + +POLKADOT_WS= +POLKADOT_PORT= + +PASEO_WS= +PASEO_PORT= diff --git a/integration-tests/chopsticks/README.md b/integration-tests/chopsticks/README.md new file mode 100644 index 0000000000..0f435c21b6 --- /dev/null +++ b/integration-tests/chopsticks/README.md @@ -0,0 +1,148 @@ +# e2e Chopsticks tests + +This project is a set of end-to-end tests for the KILT protocol against other parachains. +Other functionalities such as a creation of DID can be easily added. + +## Getting Started + +These instructions will allow you to run the tests on your local machine for development and testing purposes. + +### Prerequisites + +- Node.js v20.11.0 (as specified in the [`.nvmrc`](https://github.com/nvm-sh/nvm)). With `nvm use` the right node version will be installed. +- npm (comes with Node.js) + +### Installing + +To install the node modules call: + +```sh +yarn +``` + +### Running the tests + +In the package.json a script is provided. + +By calling the command below, the test will be executed: + +```sh +yarn test +``` + +Please make sure an appropriate env is set. + +### Env + +The project uses environment variables for configuration. +You can find an example in the `.env-example` file. Copy this file to +.env and fill in the appropriate values. +Explanation for the values are in the `.env-example` file provided. + +## Code Style + +This project uses Prettier and ESLint for code formatting and linting. +The configuration for these tools can be found in the `.prettierrc` and `.eslintrc.json` files respectively. + +To check your code for style issues, run: + +```sh +yarn lint +``` + +To automatically fix style issues, run: + +```sh +yarn lint:fix +``` + +## Adding a new test case + +To add a new test case, you need to insert a new object into the list of test cases. +For example, if you want to add a new instance of `LimitedReserveTestConfiguration`, you would insert it into the `testPairsLimitedReserveTransfers` list. + +The tests are configuration-driven, meaning they can be easily customized for different scenarios. +The test framework doesn't make assumptions about which parachain is sending which coin to which destination over which relay chain. +Fundamental events such as the moving of coins or the creation of a new account should be emitted during the test. + +The test cases live in the tests folder and use mocks from the network directory. +The network directory contains helper functions to set the blockchain state and provides an abstraction over the chopsticks functionalities, such as creating a network. + +For Adding a new test case scenario, a template folder is provided. + +## Debugging Existence Tests + +Each test case should have a unique ID. To execute a specific test case, run: + +```sh +yarn test -t "REGULAR_EXPRESSION" +``` + +## UI + +Vitest supports a UI to manage the test cases. To spin up the UI, call: + +```sh +yarn ui +``` + +## CLI + +The project provides a CLI to interact with the test framework. +To execute the cli run: + +```sh +yarn cli [COMMAND] +``` + +Below are the available commands and their descriptions: + +`spinUp` + +Spins up the network using the definition in `./src/command/network.ts`. +The network configuration can be adjusted as needed. +A detailed step-by-step explanation of how to modify the network to a specific state is provided in the `network.ts` file. + +```sh +yarn cli spinUp +``` + +`scheduleTx` + +Executes a transaction on the network, creating a new Chopsticks instance. + +```sh +yarn cli scheduleTx endpoint rawTx [options] +``` + +- endpoint: The endpoint of the network. +- rawTx: The raw transaction to execute. +- --origin: The origin of the transaction (default: Root). +- --port: The RPC port (default: 8888). + +`stateTransition` + +Shows the state transition of the network based on the latest block. +The command creates a preview folder containing an HTML file, which can be opened in a browser to inspect the state transition. + +```sh +yarn cli stateTransition endpoint [option] +``` + +- endpoint: The endpoint of the network. +- --block: The block to do the state transition + + +## Recommended VS Code Extensions + +- [ESLint](https://marketplace.visualstudio.com/items?itemName=dbaeumer.vscode-eslint): Integrates ESLint into VS Code, a tool for identifying and reporting on patterns in JavaScript. +- [Prettier - Code formatter](https://marketplace.visualstudio.com/items?itemName=esbenp.prettier-vscode): An opinionated code formatter that supports many languages. +- [TypeScript Hero](https://marketplace.visualstudio.com/items?itemName=rbbit.typescript-hero): Provides additional features for TypeScript development, such as import management and code navigation. +- [Live Server](https://marketplace.visualstudio.com/items?itemName=ritwickdey.LiveServer): Renders HTML files, useful for state transition HTML. +- [GitLens](https://marketplace.visualstudio.com/items?itemName=eamodio.gitlens): Supercharges the built-in Git capabilities of VS Code. + +## Built With + +[TypeScript](https://www.typescriptlang.org/) +[Chopsticks](https://github.com/AcalaNetwork/chopsticks) +[Polkadot API](https://github.com/polkadot-js/api) diff --git a/integration-tests/chopsticks/package.json b/integration-tests/chopsticks/package.json index 759e6f2495..2b80f4d825 100644 --- a/integration-tests/chopsticks/package.json +++ b/integration-tests/chopsticks/package.json @@ -8,12 +8,13 @@ "author": "[\"KILT \"]", "license": "MIT", "devDependencies": { - "@acala-network/chopsticks": "0.12.2", - "@acala-network/chopsticks-testing": "0.12.2", - "@polkadot/api": "^10.11.2", + "@acala-network/chopsticks": "1.0.1", + "@acala-network/chopsticks-testing": "1.0.1", + "@polkadot/api": "^14.3.1", "@types/node": "^20.11.30", "@typescript-eslint/eslint-plugin": "^7.7.0", "@typescript-eslint/parser": "^7.7.0", + "@vitest/ui": "2.1.8", "eslint": "^8.0.1", "eslint-config-airbnb": "^19.0.4", "eslint-config-prettier": "^9.1.0", @@ -24,17 +25,21 @@ "eslint-plugin-prettier": "^5.1.3", "eslint-plugin-promise": "^6.0.0", "prettier": "^3.2.5", - "ts-node": "^10.9.2", - "tsx": "^4.7.1", + "tsx": "^4.19.2", "typescript": "*", - "vitest": "^1.4.0" + "vitest": "^2.1.8" }, "scripts": { "ts-check": "tsc --noEmit", "lint": "eslint src && prettier --check src", "lint:fix": "eslint --fix src && prettier --write src", "clean": "rm -rf ./db", - "test": "LOG_LEVEL=error vitest", - "test:CI": "vitest --retry 3 --no-file-parallelism" + "test": "LOG_LEVEL=error vitest --config ./src/vitest.config.ts", + "ui": "vitest --ui --config ./src/vitest.config.ts", + "cli": "tsx ./src/cli.ts" + }, + "dependencies": { + "commander": "^13.1.0", + "execa": "^9.5.2" } } diff --git a/integration-tests/chopsticks/src/cli.ts b/integration-tests/chopsticks/src/cli.ts new file mode 100644 index 0000000000..7b2bb9c33f --- /dev/null +++ b/integration-tests/chopsticks/src/cli.ts @@ -0,0 +1,50 @@ +import { Command } from 'commander' + +import { createTestNetwork, scheduleTxCommand, stateTransition } from './command/index.js' + +const program = new Command() + +program.name('chopsticks utils').description('CLI to mange some chopsticks instances').version('0.0.1') + +program + .command('spinUp') + .description('Spin up the network') + .action(async () => { + await createTestNetwork() + }) + +program + .command('scheduleTx') + .description('Executes a transaction on the network') + .argument('', 'The endpoint of the network') + .argument('', 'The raw transaction to execute') + .option( + '--origin, ', + 'The origin of the transaction Either "Root" or "Signed""', + (value) => { + if (value !== 'Root' && value !== 'Signed') { + throw new Error('Invalid origin. Must be either "Root" or "Signed"') + } + return value + }, + 'Root' + ) + .option('--port ', 'The RPC port', '8888') + .action(async (endpoint, rawTx, options) => { + const { origin, port } = options + + await scheduleTxCommand(endpoint, rawTx, origin, +port) + }) + +program + .command('stateTransition') + .description('Shows the state transition of the network by the latest block') + .argument('', 'The endpoint of the network') + .option('--block', 'The block number to do the state transition', 'undefined') + .action(async (endpoint, options) => { + const { block } = options + const blockNumber = block === 'undefined' ? undefined : +block + await stateTransition(endpoint, blockNumber) + }) + +program.parse() diff --git a/integration-tests/chopsticks/src/command/index.ts b/integration-tests/chopsticks/src/command/index.ts new file mode 100644 index 0000000000..37128c69f6 --- /dev/null +++ b/integration-tests/chopsticks/src/command/index.ts @@ -0,0 +1,5 @@ +import { createTestNetwork } from './network.js' +import { scheduleTxCommand } from './scheduleTx.js' +import { stateTransition } from './stateTransition.js' + +export { createTestNetwork, scheduleTxCommand, stateTransition } diff --git a/integration-tests/chopsticks/src/command/network.ts b/integration-tests/chopsticks/src/command/network.ts new file mode 100644 index 0000000000..2c29f9857c --- /dev/null +++ b/integration-tests/chopsticks/src/command/network.ts @@ -0,0 +1,24 @@ +import { mainChains } from '../network/index.js' +import { setStorage, setupNetwork } from '../network/utils.js' + +export async function createTestNetwork() { + const relayConfig = mainChains.polkadot.getConfig({}) + + // 1. Create the network specific state + const kiltStorage = mainChains.kilt.storage.assignNativeTokensToAccounts([ + '4pF5Y2Eo6doQHPLQj5AkndZwtomVB8ab2sRftRS2D9JDdELr', + ]) + + // 2. Create the network specific config + const kiltConfig = mainChains.kilt.getConfig({}) + + // 2. Add the different parachainContexts here. The order of parachainContexts and parachainStorage should match. + const parachainOptions = [kiltConfig] + const parachainStorage = [kiltStorage] + + const { relayChainContext, parachainContexts } = await setupNetwork(relayConfig, parachainOptions) + + await Promise.all(parachainStorage.map((storage, index) => setStorage(parachainContexts[index], storage))) + + await Promise.all([...parachainContexts, relayChainContext].map((context) => context.pause())) +} diff --git a/integration-tests/chopsticks/src/command/scheduleTx.ts b/integration-tests/chopsticks/src/command/scheduleTx.ts new file mode 100644 index 0000000000..28a800d63c --- /dev/null +++ b/integration-tests/chopsticks/src/command/scheduleTx.ts @@ -0,0 +1,14 @@ +import { createBlock, scheduleTx } from '../network/utils.js' +import { setupContext } from '@acala-network/chopsticks-testing' + +type Origin = 'Root' | 'Signed' + +export async function scheduleTxCommand(endpoint: string, rawTx: string, origin: Origin, port: number) { + const context = await setupContext({ endpoint, port }) + + await scheduleTx(context, rawTx, undefined, origin) + await createBlock(context) + + console.log('Transaction scheduled') + await context.pause() +} diff --git a/integration-tests/chopsticks/src/command/stateTransition.ts b/integration-tests/chopsticks/src/command/stateTransition.ts new file mode 100644 index 0000000000..6cefc13849 --- /dev/null +++ b/integration-tests/chopsticks/src/command/stateTransition.ts @@ -0,0 +1,17 @@ +import { execa } from 'execa' + +export async function stateTransition(endpoint: string, blockNumber?: number) { + const options = ['chopsticks', 'run-block', `--endpoint=${endpoint}`, '--html', '--open'] + + if (blockNumber) { + options.push(`--block=${blockNumber}`) + } + + await execa('yarn', options) + .then(({ stdout }) => { + console.log(stdout) + }) + .catch((error) => { + console.error('Error:', error) + }) +} diff --git a/integration-tests/chopsticks/src/helper/api.ts b/integration-tests/chopsticks/src/helper/api.ts new file mode 100644 index 0000000000..0d33250f0c --- /dev/null +++ b/integration-tests/chopsticks/src/helper/api.ts @@ -0,0 +1,371 @@ +/* eslint-disable @typescript-eslint/no-explicit-any */ +import type { ApiPromise } from '@polkadot/api' +import type { AccountData } from '@polkadot/types/interfaces' + +export const xtokens = { + parachainV2: (paraId: number) => (acc: any) => ({ + V1: { + parents: 1, + interior: { + X2: [ + { Parachain: paraId }, + { + AccountId32: { + network: 'Any', + id: acc, + }, + }, + ], + }, + }, + }), + parachainV3: (paraId: number) => (acc: any) => ({ + V3: { + parents: 1, + interior: { + X2: [ + { Parachain: paraId }, + { + AccountId32: { + id: acc, + }, + }, + ], + }, + }, + }), + transfer: + (token: any, dest: (dest: any) => any, weight: any = 'Unlimited') => + ({ api }: { api: ApiPromise }, acc: any, amount: any) => + api.tx.xTokens.transfer(token, amount, dest(acc), weight), +} + +export const balances = { + transferAllowDeath: ({ api }: { api: ApiPromise }, dest: string, amount: string) => + api.tx.balances.transferAllowDeath(dest, amount), +} + +export const switchPallet = { + switchV3: + () => + ({ api }: { api: ApiPromise }, acc: any, amount: string) => + api.tx.assetSwitchPool1.switch(amount, { + V3: { + parents: 0, + interior: { + X1: { + AccountId32: { + id: acc, + }, + }, + }, + }, + }), + switchV4: + () => + ({ api }: { api: ApiPromise }, acc: any, amount: string) => + api.tx.assetSwitchPool1.switch(amount, { + V4: { + parents: 0, + interior: { + X1: [ + { + AccountId32: { + id: acc, + }, + }, + ], + }, + }, + }), + resume: + () => + ({ api }: { api: ApiPromise }) => + api.tx.assetSwitchPool1.resumeSwitchPair(), + pause: + () => + ({ api }: { api: ApiPromise }) => + api.tx.assetSwitchPool1.pauseSwitchPair(), +} + +export const xcmPallet = { + parachainV2: (parents: number, paraId: number) => ({ + V2: { + parents, + interior: { + X1: { Parachain: paraId }, + }, + }, + }), + parachainV3: (parents: number, paraId: any) => ({ + V3: { + parents, + interior: { + X1: { Parachain: paraId }, + }, + }, + }), + parachainV4: (parents: number, paraId: any) => ({ + V4: { + parents, + interior: { X1: [{ Parachain: paraId }] }, + }, + }), + limitedTeleportAssets: + (token: any, amount: any, dest: any) => + ({ api }: { api: ApiPromise }, acc: any) => + (api.tx.xcmPallet || api.tx.polkadotXcm).limitedTeleportAssets( + dest, + { + V3: { + parents: 0, + interior: { + X1: { + AccountId32: { + id: acc, + }, + }, + }, + }, + }, + { + V3: [ + { + id: token, + fun: { Fungible: amount }, + }, + ], + }, + 0, + 'Unlimited' + ), + limitedReserveTransferAssetsV2: + (token: any, dest: any) => + ({ api }: { api: ApiPromise }, acc: any, amount: any) => + (api.tx.xcmPallet || api.tx.polkadotXcm).limitedReserveTransferAssets( + dest, + { + V2: { + parents: 0, + interior: { + X1: { + AccountId32: { + network: 'Any', + id: acc, + }, + }, + }, + }, + }, + { + V2: [ + { + id: token, + fun: { Fungible: amount }, + }, + ], + }, + 0, + 'Unlimited' + ), + limitedReserveTransferAssetsV3: + (token: any, dest: any) => + ({ api }: { api: ApiPromise }, acc: any, amount: any) => + (api.tx.xcmPallet || api.tx.polkadotXcm).limitedReserveTransferAssets( + dest, + { + V3: { + parents: 0, + interior: { + X1: { + AccountId32: { + id: acc, + }, + }, + }, + }, + }, + { + V3: [ + { + id: token, + fun: { Fungible: amount }, + }, + ], + }, + 0, + 'Unlimited' + ), + limitedReserveTransferAssetsV4: + (token: any, dest: any) => + ({ api }: { api: ApiPromise }, acc: any, amount: any) => + (api.tx.xcmPallet || api.tx.polkadotXcm).limitedReserveTransferAssets( + dest, + { + V4: { + parents: 0, + interior: { + X1: [ + { + AccountId32: { + id: acc, + }, + }, + ], + }, + }, + }, + { + V4: [ + { + id: token, + fun: { Fungible: amount }, + }, + ], + }, + 0, + 'Unlimited' + ), + transferAssetsV3: + (dest: any, token: any) => + ({ api }: { api: ApiPromise }, acc: any, amount: any) => + api.tx.polkadotXcm.transferAssets( + dest, + { + V3: { + parents: 0, + interior: { + X1: { + AccountId32: { + id: acc, + }, + }, + }, + }, + }, + { + V3: [ + { + id: token, + fun: { Fungible: amount }, + }, + ], + }, + 0, + 'Unlimited' + ), + transferAssetsV4: + (dest: any, token: any) => + ({ api }: { api: ApiPromise }, acc: any, amount: any) => + api.tx.polkadotXcm.transferAssets( + dest, + { + V4: { + parents: 0, + interior: { + X1: [ + { + AccountId32: { + id: acc, + }, + }, + ], + }, + }, + }, + { + V4: [ + { + id: token, + fun: { Fungible: amount }, + }, + ], + }, + 0, + 'Unlimited' + ), + transferAssetsUsingTypeAndThenV4: + (dest: any, token: any, xcmMessage: any) => + ({ api }: { api: ApiPromise }, balanceToTransfer: string) => + api.tx.polkadotXcm.transferAssetsUsingTypeAndThen( + dest, + { + V4: [ + { + id: token, + fun: { Fungible: balanceToTransfer }, + }, + ], + }, + 'LocalReserve', + { V4: token }, + 'LocalReserve', + xcmMessage, + 'Unlimited' + ), + transferAssetsUsingTypeAndThenV3: + (dest: any, token: any, xcmMessage: any) => + ({ api }: { api: ApiPromise }, balanceToTransfer: string) => + api.tx.polkadotXcm.transferAssetsUsingTypeAndThen( + dest, + { + V3: [ + { + id: token, + fun: { Fungible: balanceToTransfer }, + }, + ], + }, + 'LocalReserve', + { V3: token }, + 'LocalReserve', + xcmMessage, + 'Unlimited' + ), + send: + (destination: object) => + ({ api }: { api: ApiPromise }, xcmMessage: object) => + (api.tx.xcmPallet || api.tx.polkadotXcm).send(destination, xcmMessage), +} + +/** + * Different pallets to submit tx + */ +export const tx = { + xtokens, + xcmPallet, + switchPallet, + balances, +} + +/** + * Query functions for different chains. + * Native tokens are fetched via the system pallet, while other tokens are fetched via the tokens or assets pallet. + * + */ +export const query = { + balances: async ({ api }: { api: ApiPromise }, address: string) => + (await api.query.system.account(address)).data.free.toBigInt(), + foreignAssets: + (assetId: any) => + async ({ api }: { api: ApiPromise }, address: string) => { + const accountInfo: any = await api.query.foreignAssets.account(assetId, address) + if (accountInfo.isNone) { + return 0n + } + return accountInfo.unwrap().balance.toBigInt() + }, + fungibles: + (assetId: any) => + async ({ api }: { api: ApiPromise }, address: string) => { + const accountInfo: any = await api.query.fungibles.account(assetId, address) + if (accountInfo.isNone) { + return 0n + } + return accountInfo.unwrap().balance.toBigInt() + }, + tokens: + (token: any) => + async ({ api }: { api: ApiPromise }, address: string) => + (await api.query.tokens.accounts(address, token)).free.toBigInt(), +} diff --git a/integration-tests/chopsticks/src/helper/utils.ts b/integration-tests/chopsticks/src/helper/utils.ts new file mode 100644 index 0000000000..e2fbdc666d --- /dev/null +++ b/integration-tests/chopsticks/src/helper/utils.ts @@ -0,0 +1,114 @@ +import { ApiPromise, SubmittableResult } from '@polkadot/api' +import { Keyring } from '@polkadot/keyring' +import { u8aToHex } from '@polkadot/util' +import { decodeAddress } from '@polkadot/util-crypto' + +import type { SubmittableExtrinsic } from '@polkadot/api/types' +import type { KeyringPair } from '@polkadot/keyring/types' +import type { Codec } from '@polkadot/types/types' +import type { ExpectStatic } from 'vitest' +import { EventRecord } from '@polkadot/types/interfaces' + +/** + * Keyring instance to generate key pairs with 38 ss58Format encoding. + */ +const keyring = new Keyring({ type: 'ed25519', ss58Format: 38 }) + +/** + * Key pairs for Alice, Bob, and Charlie used for testing. + */ +export const keysAlice = keyring.addFromUri('//alice', undefined) +export const keysBob = keyring.addFromUri('//bob', undefined) +export const keysCharlie = keyring.addFromUri('//charlie', undefined) + +/** + * Converts a given value to a Number + */ +export function toNumber(value: string | undefined): number | undefined { + if (value === undefined) { + return undefined + } + return Number(value) +} + +/** + * Converts a given address to its hexadecimal representation. + * + * @param addr - The address to be converted. It should be a string representation of an address. + */ +export function hexAddress(addr: string) { + return u8aToHex(decodeAddress(addr)) +} + +/** + * Validates if the received balance is within the expected range considering a certain precision. + * + * @param previousBalance - The balance before the operation. + * @param receivedBalance - The balance after the operation. + * @param deltaBalance - The expected change in balance. + * @param expect - The assertion function from the testing library. + * @param precision - The precision of the balance validation. It must be a value between 0 and 100. + * + * The function calculates the expected balance by adding the deltaBalance to the previousBalance. + * It then calculates the lower and upper bounds of the expected balance considering the precision. + * The received balance is then checked if it falls within the range of the lower and upper bounds. + * + * If the precision is not between 0 and 100, the function throws an error. + * + * @throws {Error} If the precision is not between 0 and 100. + */ +export function validateBalanceWithPrecision( + previousBalance: bigint, + receivedBalance: bigint, + deltaBalance: bigint, + expect: ExpectStatic, + precision: bigint +) { + if (precision < 0n || precision > 100n) { + throw new Error('Precision must be between 0 and 100') + } + + const allowedError = 100n - precision + const expectedBalance = previousBalance + deltaBalance + + const lowerBound = expectedBalance - (expectedBalance * allowedError) / 100n + const upperBound = expectedBalance + (expectedBalance * allowedError) / 100n + + expect(receivedBalance).toBeGreaterThanOrEqual(lowerBound) + expect(receivedBalance).toBeLessThanOrEqual(upperBound) +} + +/** + * Fetches the paid fees for the executed XCM message. Is only working on the sender chain. + */ +export async function getPaidXcmFees(api: ApiPromise, eventRecords: Codec[]): Promise { + const polkadotFees = eventRecords.find((eventRecord) => + api.events.polkadotXcm.FeesPaid.is((eventRecord as EventRecord).event) + ) + if (!polkadotFees) { + throw new Error('FeesPaid event not found') + } + + // eslint-disable-next-line @typescript-eslint/no-explicit-any + return (polkadotFees as any).event.data.fees[0].fun.asFungible.toBigInt() +} + +/** + * Calculates the transaction fees for a given transaction. + */ +export async function calculateTxFees( + tx: SubmittableExtrinsic<'promise', SubmittableResult>, + account: KeyringPair +): Promise { + const paymentInfo = await tx.paymentInfo(account) + return paymentInfo.partialFee.toBigInt() +} + +// Constants for the balances +export const KILT = BigInt(1e15) +export const DOT = BigInt(1e10) +export const HDX = BigInt(1e12) + +export const initialBalanceKILT = 100n * KILT +export const initialBalanceDOT = 100n * DOT +export const initialBalanceHDX = 100n * HDX diff --git a/integration-tests/chopsticks/src/network/assetHub.ts b/integration-tests/chopsticks/src/network/assetHub.ts deleted file mode 100644 index cbc3f08911..0000000000 --- a/integration-tests/chopsticks/src/network/assetHub.ts +++ /dev/null @@ -1,131 +0,0 @@ -import { setupContext, SetupOption } from '@acala-network/chopsticks-testing' - -import type { Config } from './types.js' -import { initialBalanceDOT, toNumber } from '../utils.js' - -/// Options used to create the Spiritnet context -export const getSetupOptions = ({ - blockNumber = undefined, - wasmOverride = undefined, -}: { - blockNumber?: number - wasmOverride?: string -}) => - ({ - endpoint: process.env.ASSETHUB_WSS || 'wss://asset-hub-polkadot-rpc.dwellir.com', - db: './db/assethub.db.sqlite', - port: toNumber(process.env.ASSETHUB_PORT) || 9003, - wasmOverride, - blockNumber, - }) as SetupOption - -/// AssetHub has no own coin. Teleported dots are used as the native token. -export function assignDotTokensToAccountsAsStorage(addr: string[], balance: bigint = initialBalanceDOT) { - return { - System: { - Account: addr.map((address) => [[address], { providers: 1, data: { free: balance.toString() } }]), - }, - } -} - -export function createForeignAsset(manager: string, assetId = eKiltLocation) { - return { - foreignAssets: { - asset: [ - [ - [assetId], - { - owner: manager, - issuer: manager, - admin: manager, - freezer: manager, - // Just make it big enough - supply: '10000000000000000000000000000', - deposit: 0, - minBalance: 0, - isSufficient: false, - accounts: 0, - sufficients: 0, - approvals: 0, - status: 'Live', - }, - ], - ], - }, - } -} - -/// Assigns KSM to an account -export function assignKSMtoAccounts(addr: string[], balance: bigint = initialBalanceDOT) { - return { - foreignAssets: { - account: addr.map((addr) => [ - [KSMAssetLocation, addr], - { - balance: balance, - status: 'Liquid', - reason: 'Consumer', - extra: null, - }, - ]), - }, - } -} - -/// Assigns the foreign asset to the accounts. -/// Does not check if supply is matching the sum of the account balances. -export function assignForeignAssetToAccounts(accountInfo: [string, bigint][], assetId = eKiltLocation) { - return { - foreignAssets: { - account: accountInfo.map(([account, balance]) => [ - [assetId, account], - { - balance: balance, - status: 'Liquid', - reason: 'Consumer', - extra: null, - }, - ]), - }, - } -} - -/// AssetHub ParaId -export const paraId = 1000 - -export const KSMAssetLocation = { - parents: 2, - interior: { - X1: { - GlobalConsensus: 'Kusama', - }, - }, -} - -// Sibling Sovereign Account -export const sovereignAccountOnSiblingChains = '4qXPdpimHh8TR24RSk994yVzxx4TLfvKj5i1qH5puvWmfAqy' - -/// Native token in AssetHub -export const nativeTokenLocation = { parents: 1, interior: 'Here' } - -export const eKiltLocation = { - parents: 2, - interior: { - X2: [ - { - GlobalConsensus: { Ethereum: { chainId: 11155111 } }, - }, - { - AccountKey20: { - network: null, - key: '0x06012c8cf97bead5deae237070f9587f8e7a266d', - }, - }, - ], - }, -} - -export async function getContext(): Promise { - const options = getSetupOptions({}) - return setupContext(options) -} diff --git a/integration-tests/chopsticks/src/network/assethub/index.ts b/integration-tests/chopsticks/src/network/assethub/index.ts new file mode 100644 index 0000000000..81874364bb --- /dev/null +++ b/integration-tests/chopsticks/src/network/assethub/index.ts @@ -0,0 +1,16 @@ +import { Chains } from '../types.js' +import * as Main from './main_network.js' +import * as Test from './test_network.js' + +export const chains: Chains = { + main: { + storage: Main.storage, + getConfig: Main.getSetupOptions, + chainInfo: Main.parachainInfo, + }, + test: { + storage: Test.storage, + getConfig: Test.getSetupOptions, + chainInfo: Test.parachainInfo, + }, +} diff --git a/integration-tests/chopsticks/src/network/assethub/main_network.ts b/integration-tests/chopsticks/src/network/assethub/main_network.ts new file mode 100644 index 0000000000..4c4f72535d --- /dev/null +++ b/integration-tests/chopsticks/src/network/assethub/main_network.ts @@ -0,0 +1,126 @@ +import type { SetupOption } from '@acala-network/chopsticks-testing' + +import { initialBalanceDOT, toNumber } from '../../helper/utils.js' +import { SetupConfigParameters } from '../types.js' + +export const getSetupOptions = ({ blockNumber = undefined, wasmOverride = undefined }: SetupConfigParameters) => { + const random = (Math.random() + 1).toString(36).substring(7) + return { + endpoint: process.env.ASSETHUB_WSS || 'wss://asset-hub-polkadot-rpc.dwellir.com', + db: `./db/assethub-main_${random}.db.sqlite`, + port: toNumber(process.env.ASSETHUB_MAIN_PORT), + wasmOverride, + blockNumber, + } as SetupOption +} + +export const storage = { + /// AssetHub has no own coin. Teleported dots are used as the native token. + assignNativeTokensToAccountsAsStorage(addr: string[], balance: bigint = initialBalanceDOT) { + return { + System: { + Account: addr.map((address) => [[address], { providers: 1, data: { free: balance.toString() } }]), + }, + } + }, + + /// Creates the foreign asset with the given manager as owner, issuer, admin, and freezer. + createForeignAsset(manager: string, assetId = parachainInfo.eKiltLocation) { + return { + foreignAssets: { + asset: [ + [ + [assetId], + { + owner: manager, + issuer: manager, + admin: manager, + freezer: manager, + // Just make it big enough + supply: '10000000000000000000000000000', + deposit: 0, + minBalance: 0, + isSufficient: false, + accounts: 0, + sufficients: 0, + approvals: 0, + status: 'Live', + }, + ], + ], + }, + } + }, + + /// Assigns KSM to an account + assignKSMtoAccounts(addr: string[], balance: bigint = initialBalanceDOT) { + return { + foreignAssets: { + account: addr.map((addr) => [ + [parachainInfo.KSMAssetLocation, addr], + { + balance: balance, + status: 'Liquid', + reason: 'Consumer', + extra: null, + }, + ]), + }, + } + }, + + /// Assigns the foreign asset to the accounts. + /// Does not check if supply is matching the sum of the account balances. + assignForeignAssetToAccounts(accountInfo: [string, bigint][], assetId = parachainInfo.eKiltLocation) { + return { + foreignAssets: { + account: accountInfo.map(([account, balance]) => [ + [assetId, account], + { + balance: balance, + status: 'Liquid', + reason: 'Consumer', + extra: null, + }, + ]), + }, + } + }, +} + +export const parachainInfo = { + /// AssetHub ParaId + paraId: 1000, + KSMAssetLocation: { + parents: 2, + interior: { + X1: { + GlobalConsensus: 'Kusama', + }, + }, + }, + + // Sibling Sovereign Account + sovereignAccountOnSiblingChains: '4qXPdpimHh8TR24RSk994yVzxx4TLfvKj5i1qH5puvWmfAqy', + + /// Native token in AssetHub + nativeTokenLocation: { parents: 1, interior: 'Here' }, + + /// Production eKILT location + eKiltLocation: { + parents: 2, + interior: { + X2: [ + { + GlobalConsensus: { Ethereum: { chainId: 1 } }, + }, + { + AccountKey20: { + network: null, + key: '0x5d3d01fd6d2ad1169b17918eb4f153c6616288eb', + }, + }, + ], + }, + }, +} diff --git a/integration-tests/chopsticks/src/network/assethub/test_network.ts b/integration-tests/chopsticks/src/network/assethub/test_network.ts new file mode 100644 index 0000000000..eaae3e74bd --- /dev/null +++ b/integration-tests/chopsticks/src/network/assethub/test_network.ts @@ -0,0 +1,126 @@ +import type { SetupOption } from '@acala-network/chopsticks-testing' + +import { initialBalanceDOT, toNumber } from '../../helper/utils.js' +import { SetupConfigParameters } from '../types.js' + +export const getSetupOptions = ({ blockNumber = undefined, wasmOverride = undefined }: SetupConfigParameters) => { + const random = (Math.random() + 1).toString(36).substring(7) + return { + endpoint: process.env.ASSETHUB_TEST_WSS || 'wss://asset-hub-paseo.dotters.network', + db: `./db/assethub-test_${random}.db.sqlite`, + port: toNumber(process.env.ASSETHUB_TEST_PORT), + wasmOverride, + blockNumber, + } as SetupOption +} + +export const storage = { + /// AssetHub has no own coin. Teleported relay tokens are used as the native token. + assignNativeTokensToAccountsAsStorage(addr: string[], balance: bigint = initialBalanceDOT) { + return { + System: { + Account: addr.map((address) => [[address], { providers: 1, data: { free: balance.toString() } }]), + }, + } + }, + + /// Creates the foreign asset with the given manager as owner, issuer, admin, and freezer. + createForeignAsset(manager: string, assetId = parachainInfo.eKiltLocation) { + return { + foreignAssets: { + asset: [ + [ + [assetId], + { + owner: manager, + issuer: manager, + admin: manager, + freezer: manager, + // Just make it big enough + supply: '10000000000000000000000000000', + deposit: 0, + minBalance: 0, + isSufficient: false, + accounts: 0, + sufficients: 0, + approvals: 0, + status: 'Live', + }, + ], + ], + }, + } + }, + + /// Assigns KSM to an account + assignKSMtoAccounts(addr: string[], balance: bigint = initialBalanceDOT) { + return { + foreignAssets: { + account: addr.map((addr) => [ + [parachainInfo.KSMAssetLocation, addr], + { + balance: balance, + status: 'Liquid', + reason: 'Consumer', + extra: null, + }, + ]), + }, + } + }, + + /// Assigns the foreign asset to the accounts. + /// Does not check if supply is matching the sum of the account balances. + assignForeignAssetToAccounts(accountInfo: [string, bigint][], assetId = parachainInfo.eKiltLocation) { + return { + foreignAssets: { + account: accountInfo.map(([account, balance]) => [ + [assetId, account], + { + balance: balance, + status: 'Liquid', + reason: 'Consumer', + extra: null, + }, + ]), + }, + } + }, +} + +export const parachainInfo = { + /// AssetHub ParaId + paraId: 1000, + KSMAssetLocation: { + parents: 2, + interior: { + X1: { + GlobalConsensus: 'Kusama', + }, + }, + }, + + // Sibling Sovereign Account + sovereignAccountOnSiblingChains: '4qXPdpimHh8TR24RSk994yVzxx4TLfvKj5i1qH5puvWmfAqy', + + /// Native token in AssetHub + nativeTokenLocation: { parents: 1, interior: 'Here' }, + + /// ePILT location on Sepolia + eKiltLocation: { + parents: 2, + interior: { + X2: [ + { + GlobalConsensus: { Ethereum: { chainId: 11155111 } }, + }, + { + AccountKey20: { + network: null, + key: '0x99e743964c036bc28931fb564817db428aa7f752', + }, + }, + ], + }, + }, +} diff --git a/integration-tests/chopsticks/src/network/basilisk.ts b/integration-tests/chopsticks/src/network/basilisk.ts deleted file mode 100644 index d5bd1583c2..0000000000 --- a/integration-tests/chopsticks/src/network/basilisk.ts +++ /dev/null @@ -1,58 +0,0 @@ -import { setupContext, SetupOption } from '@acala-network/chopsticks-testing' -import type { Config } from './types.js' -import { initialBalanceDOT, initialBalanceHDX, initialBalanceKILT, toNumber } from '../utils.js' - -/// Options used to create the HydraDx context -export const options: SetupOption = { - endpoint: process.env.BASILISK_WS || ['wss://basilisk-rococo-rpc.play.hydration.cloud'], - db: './db/basilisk.db.sqlite', - port: toNumber(process.env.HYDRADX_PORT) || 9005, -} - -// On Basilisk, there is only KSM. We use that currency and treat it as ROC, since the location is {parents: 1, interior: Here} -export const dotTokenId = 5 - -export const eKILTTokenId = 90 - -/// Assigns the native tokens to an accounts -export function assignNativeTokensToAccounts(addr: string[], balance: bigint = initialBalanceHDX) { - return { - System: { - Account: addr.map((address) => [[address], { providers: 1, data: { free: balance } }]), - }, - } -} - -/// Assigns ROCs tokens to an accounts -export function assignRocTokensToAccounts(addr: string[], balance: bigint = initialBalanceDOT) { - return { - Tokens: { - Accounts: addr.map((address) => [[address, dotTokenId], { free: balance }]), - }, - } -} - -export function createRemoteAsset( - addr: string[], - assetLocation: Record, - balance: bigint = initialBalanceKILT -) { - return { - assetRegistry: { - assetIds: [[['eKILT'], 90]], - assetLocations: [[[90], assetLocation]], - assetMetadataMap: [[[90], { symbol: 'eKILT', decimals: 15 }]], - }, - - tokens: { - accounts: addr.map((acc) => [[acc, 90], { free: balance }]), - }, - } -} - -/// Basilisk ParaId -export const paraId = 2090 - -export async function getContext(): Promise { - return setupContext(options) -} diff --git a/integration-tests/chopsticks/src/network/hydraDx.ts b/integration-tests/chopsticks/src/network/hydraDx.ts deleted file mode 100644 index 97e39d8011..0000000000 --- a/integration-tests/chopsticks/src/network/hydraDx.ts +++ /dev/null @@ -1,48 +0,0 @@ -import { setupContext, SetupOption } from '@acala-network/chopsticks-testing' -import type { Config } from './types.js' -import { initialBalanceHDX, initialBalanceKILT, toNumber } from '../utils.js' - -/// Options used to create the HydraDx context -export const options: SetupOption = { - endpoint: process.env.HYDRADX_WS || ['wss://hydradx-rpc.dwellir.com', 'wss://rpc.hydradx.cloud'], - db: './db/hydradx.db.sqlite', - port: toNumber(process.env.HYDRADX_PORT) || 9001, -} - -export const kiltTokenId = 28 - -/// Sets the [TechnicalCommittee] and [Council] governance to the given accounts -export function setGovernance(addr: string[]) { - return { - TechnicalCommittee: { Members: addr }, - Council: { Members: addr }, - } -} - -/// Assigns the native tokens to an accounts -export function assignNativeTokensToAccounts(addr: string[], balance: bigint = initialBalanceHDX) { - return { - System: { - Account: addr.map((address) => [[address], { providers: 1, data: { free: balance } }]), - }, - } -} - -/// Assigns KILT tokens to an accounts -export function assignKiltTokensToAccounts(addr: string[], balance: bigint = initialBalanceKILT) { - return { - Tokens: { - Accounts: addr.map((address) => [[address, kiltTokenId], { free: balance }]), - }, - } -} - -/// HydraDX ParaId -export const paraId = 2034 - -/// Omnipool account -export const omnipoolAccount = '7L53bUTBbfuj14UpdCNPwmgzzHSsrsTWBHX5pys32mVWM3C1' - -export async function getContext(): Promise { - return setupContext(options) -} diff --git a/integration-tests/chopsticks/src/network/hydration/index.ts b/integration-tests/chopsticks/src/network/hydration/index.ts new file mode 100644 index 0000000000..81874364bb --- /dev/null +++ b/integration-tests/chopsticks/src/network/hydration/index.ts @@ -0,0 +1,16 @@ +import { Chains } from '../types.js' +import * as Main from './main_network.js' +import * as Test from './test_network.js' + +export const chains: Chains = { + main: { + storage: Main.storage, + getConfig: Main.getSetupOptions, + chainInfo: Main.parachainInfo, + }, + test: { + storage: Test.storage, + getConfig: Test.getSetupOptions, + chainInfo: Test.parachainInfo, + }, +} diff --git a/integration-tests/chopsticks/src/network/hydration/main_network.ts b/integration-tests/chopsticks/src/network/hydration/main_network.ts new file mode 100644 index 0000000000..71079180ed --- /dev/null +++ b/integration-tests/chopsticks/src/network/hydration/main_network.ts @@ -0,0 +1,51 @@ +import type { SetupOption } from '@acala-network/chopsticks-testing' + +import { initialBalanceHDX, initialBalanceKILT, toNumber } from '../../helper/utils.js' +import { SetupConfigParameters } from '../types.js' + +/// Options used to create the Hydration context +export const getSetupOptions = ({ blockNumber, wasmOverride }: SetupConfigParameters) => { + const random = (Math.random() + 1).toString(36).substring(7) + return { + endpoint: process.env.HYDRATION_WS || ['wss://rpc.hydradx.cloud'], + db: `./db/hydration_main_${random}.db.sqlite`, + port: toNumber(process.env.HYDRATION_PORT), + blockNumber, + wasmOverride, + } as SetupOption +} + +export const storage = { + /// Sets the [TechnicalCommittee] and [Council] governance to the given accounts + setGovernance(addr: string[]) { + return { + TechnicalCommittee: { Members: addr }, + Council: { Members: addr }, + } + }, + /// Assigns the native tokens to an accounts + assignNativeTokensToAccounts(addr: string[], balance: bigint = initialBalanceHDX) { + return { + System: { + Account: addr.map((address) => [[address], { providers: 1, data: { free: balance } }]), + }, + } + }, + + /// Assigns KILT tokens to accounts + assignKiltTokensToAccounts(addr: string[], balance: bigint = initialBalanceKILT) { + return { + Tokens: { + Accounts: addr.map((address) => [[address, parachainInfo.kiltTokenId], { free: balance }]), + }, + } + }, +} + +export const parachainInfo = { + // Sibling Sovereign Account + sovereignAccountOnSiblingChains: '5Eg2fntQqFi3EvFWAf71G66Ecjjah26bmFzoANAeHFgj9Lia', + kiltTokenId: 28, + paraId: 2034, + omnipoolAccount: '7L53bUTBbfuj14UpdCNPwmgzzHSsrsTWBHX5pys32mVWM3C1', +} diff --git a/integration-tests/chopsticks/src/network/hydration/test_network.ts b/integration-tests/chopsticks/src/network/hydration/test_network.ts new file mode 100644 index 0000000000..3f06319b34 --- /dev/null +++ b/integration-tests/chopsticks/src/network/hydration/test_network.ts @@ -0,0 +1,51 @@ +import type { SetupOption } from '@acala-network/chopsticks-testing' + +import { initialBalanceHDX, initialBalanceKILT, toNumber } from '../../helper/utils.js' +import { SetupConfigParameters } from '../types.js' + +/// Options used to create the Hydration context +export const getSetupOptions = ({ blockNumber, wasmOverride }: SetupConfigParameters) => { + const random = (Math.random() + 1).toString(36).substring(7) + return { + endpoint: process.env.HYDRATION_TEST_WS || ['wss://paseo-rpc.play.hydration.cloud'], + db: `./db/hydration_test_${random}.db.sqlite`, + port: toNumber(process.env.HYDRATION_TEST_PORT), + blockNumber, + wasmOverride, + } as SetupOption +} + +export const storage = { + /// Sets the [TechnicalCommittee] and [Council] governance to the given accounts + setGovernance(addr: string[]) { + return { + TechnicalCommittee: { Members: addr }, + Council: { Members: addr }, + } + }, + /// Assigns the native tokens to an accounts + assignNativeTokensToAccounts(addr: string[], balance: bigint = initialBalanceHDX) { + return { + System: { + Account: addr.map((address) => [[address], { providers: 1, data: { free: balance } }]), + }, + } + }, + + /// Assigns KILT tokens to accounts + assignKiltTokensToAccounts(addr: string[], balance: bigint = initialBalanceKILT) { + return { + Tokens: { + Accounts: addr.map((address) => [[address, parachainInfo.kiltTokenId], { free: balance }]), + }, + } + }, +} + +export const parachainInfo = { + // Sibling Sovereign Account + sovereignAccountOnSiblingChains: '5Eg2fntQqFi3EvFWAf71G66Ecjjah26bmFzoANAeHFgj9Lia', + kiltTokenId: 28, + paraId: 2034, + omnipoolAccount: '7L53bUTBbfuj14UpdCNPwmgzzHSsrsTWBHX5pys32mVWM3C1', +} diff --git a/integration-tests/chopsticks/src/network/index.ts b/integration-tests/chopsticks/src/network/index.ts new file mode 100644 index 0000000000..685d5c59d2 --- /dev/null +++ b/integration-tests/chopsticks/src/network/index.ts @@ -0,0 +1,94 @@ +import { chains as KiltConfigs } from './kilt/index.js' +import { chains as HydrationConfigs } from './hydration/index.js' +import { chains as PolkadotConfigs } from './polkadot/index.js' +import { chains as AssetHubConfigs } from './assethub/index.js' +import { ChainConfigs } from './types.js' + +/* + * Get an environment variable and throw an error if it is not set. + */ +function getEnvVariable(name: string): string { + const value = process.env[name] + if (value === undefined) { + if (process.env.NODE_ENV === 'test') { + throw new Error(`Error: Environment variable ${name} is not set. Some tests might not work.`) + } + return '' + } + return value +} + +/* + * Object with all the chain configurations. + */ +export const testChains: ChainConfigs = { + kilt: { + getConfig: KiltConfigs.test!.getConfig, + parameters: { + blockNumber: Number(getEnvVariable('SPIRITNET_BLOCK_NUMBER')), + wasmOverride: getEnvVariable('SPIRITNET_WASM_OVERRIDE'), + }, + storage: KiltConfigs.test!.storage, + chainInfo: KiltConfigs.test!.chainInfo, + }, + hydration: { + getConfig: HydrationConfigs.test!.getConfig, + parameters: { + blockNumber: Number(getEnvVariable('HYDRATION_BLOCK_NUMBER')), + }, + storage: HydrationConfigs.test!.storage, + chainInfo: HydrationConfigs.test!.chainInfo, + }, + polkadot: { + getConfig: PolkadotConfigs.test!.getConfig, + parameters: { + blockNumber: Number(getEnvVariable('POLKADOT_BLOCK_NUMBER')), + }, + storage: PolkadotConfigs.test!.storage, + chainInfo: PolkadotConfigs.test!.chainInfo, + }, + assetHub: { + getConfig: AssetHubConfigs.test!.getConfig, + parameters: { + blockNumber: Number(getEnvVariable('ASSETHUB_BLOCK_NUMBER')), + }, + storage: AssetHubConfigs.test!.storage, + chainInfo: AssetHubConfigs.test!.chainInfo, + }, +} + +export const mainChains: ChainConfigs = { + kilt: { + getConfig: KiltConfigs.main!.getConfig, + parameters: { + blockNumber: Number(getEnvVariable('SPIRITNET_BLOCK_NUMBER')), + wasmOverride: getEnvVariable('SPIRITNET_WASM_OVERRIDE'), + }, + storage: KiltConfigs.main!.storage, + chainInfo: KiltConfigs.main!.chainInfo, + }, + hydration: { + getConfig: HydrationConfigs.main!.getConfig, + parameters: { + blockNumber: Number(getEnvVariable('HYDRATION_BLOCK_NUMBER')), + }, + storage: HydrationConfigs.main!.storage, + chainInfo: HydrationConfigs.main!.chainInfo, + }, + polkadot: { + getConfig: PolkadotConfigs.main!.getConfig, + parameters: { + blockNumber: Number(getEnvVariable('POLKADOT_BLOCK_NUMBER')), + }, + storage: PolkadotConfigs.main!.storage, + chainInfo: PolkadotConfigs.main!.chainInfo, + }, + assetHub: { + getConfig: AssetHubConfigs.main!.getConfig, + parameters: { + blockNumber: Number(getEnvVariable('ASSETHUB_BLOCK_NUMBER')), + }, + storage: AssetHubConfigs.main!.storage, + chainInfo: AssetHubConfigs.main!.chainInfo, + }, +} diff --git a/integration-tests/chopsticks/src/network/kilt/index.ts b/integration-tests/chopsticks/src/network/kilt/index.ts new file mode 100644 index 0000000000..81874364bb --- /dev/null +++ b/integration-tests/chopsticks/src/network/kilt/index.ts @@ -0,0 +1,16 @@ +import { Chains } from '../types.js' +import * as Main from './main_network.js' +import * as Test from './test_network.js' + +export const chains: Chains = { + main: { + storage: Main.storage, + getConfig: Main.getSetupOptions, + chainInfo: Main.parachainInfo, + }, + test: { + storage: Test.storage, + getConfig: Test.getSetupOptions, + chainInfo: Test.parachainInfo, + }, +} diff --git a/integration-tests/chopsticks/src/network/kilt/main_network.ts b/integration-tests/chopsticks/src/network/kilt/main_network.ts new file mode 100644 index 0000000000..26b181af0b --- /dev/null +++ b/integration-tests/chopsticks/src/network/kilt/main_network.ts @@ -0,0 +1,129 @@ +import type { SetupOption } from '@acala-network/chopsticks-testing' + +import { initialBalanceDOT, initialBalanceKILT, toNumber } from '../../helper/utils.js' +import { SetupConfigParameters } from '../types.js' + +/// Options used to create the Spiritnet context +export const getSetupOptions = ({ blockNumber = undefined, wasmOverride = undefined }: SetupConfigParameters) => { + const random = (Math.random() + 1).toString(36).substring(7) + return { + endpoint: process.env.SPIRITNET_WS || 'wss://kilt.ibp.network', + db: `./db/spiritnet_main_${random}.db.sqlite`, + port: toNumber(process.env.SPIRITNET_PORT), + wasmOverride, + blockNumber, + } as SetupOption +} + +export const storage = { + /// Assigns the native tokens to an accounts + assignNativeTokensToAccounts(addr: string[], balance: bigint = initialBalanceKILT) { + return { + System: { + Account: addr.map((address) => [[address], { providers: 1, data: { free: balance } }]), + }, + } + }, + + /// Sets the [technicalCommittee] and [council] governance to the given accounts + setGovernance(addr: string[]) { + return { + technicalCommittee: { Members: addr }, + council: { Members: addr }, + } + }, + /// Assigns the relay token to the account. + assignRelayTokensToAccounts(addr: string[], balance: bigint = initialBalanceDOT) { + return { + fungibles: { + account: addr.map((acc) => [ + [{ parents: 1, interior: 'here' }, acc], + { balance: balance, status: 'Liquid', reason: 'Consumer', extra: null }, + ]), + }, + } + }, + /// Pauses the switch pool. Default value are fetched from block 7,896,550 and might break the invariant check for all blocks after that. + // To maintain the invariant, use the pause tx. + pauseSwitch( + remoteAssetCirculatingSupply = '1044350720000000000000', + remoteAssetTotalSupply = '164000000000000000000000', + remoteAssetSovereignTotalBalance = '162955649280000000000000' + ) { + return { + assetSwitchPool1: { + switchPair: { + status: 'Paused', + poolAccount: '4pCvXiDJXzfms5G2Digp474mo3SJSsAWUBuAJpzcuZvvK8dt', + remoteAssetCirculatingSupply, + remoteAssetEd: 1, + remoteAssetId: { + V4: { + parents: 2, + interior: { + X2: [ + { + GlobalConsensus: { + Ethereum: { + chainId: 1, + }, + }, + }, + { + AccountKey20: { + network: null, + key: '0x5d3d01fd6d2ad1169b17918eb4f153c6616288eb', + }, + }, + ], + }, + }, + }, + remoteAssetTotalSupply, + remoteReserveLocation: { + V4: { + parents: 1, + interior: { + X1: [ + { + Parachain: 1000, + }, + ], + }, + }, + }, + remoteXcmFee: { + V4: { + id: { + parents: 1, + interior: 'Here', + }, + fun: { + Fungible: 5000000000, + }, + }, + }, + remoteAssetSovereignTotalBalance, + }, + }, + } + }, + /// Removes the switch pool + removeSwitchPair() { + return { + assetSwitchPool1: { + switchPair: {}, + }, + } + }, +} + +export const parachainInfo = { + /// Spiritnet ParaId + paraId: 2086, + /// Sibling sovereign account + sovereignAccountOnSiblingChains: '5Eg2fnshxV9kofpcNEFE7azHLAjcCtpNkbsH3kkWZasYUVKs', + + // Native token location from Spiritnet perspective. + HERE: { Concrete: { parents: 0, interior: 'Here' } }, +} diff --git a/integration-tests/chopsticks/src/network/kilt/test_network.ts b/integration-tests/chopsticks/src/network/kilt/test_network.ts new file mode 100644 index 0000000000..abbaff5546 --- /dev/null +++ b/integration-tests/chopsticks/src/network/kilt/test_network.ts @@ -0,0 +1,45 @@ +import type { SetupOption } from '@acala-network/chopsticks-testing' + +import { initialBalanceKILT, toNumber } from '../../helper/utils.js' +import { SetupConfigParameters } from '../types.js' + +/// Options used to create the Peregrine context +export const getSetupOptions = ({ blockNumber = undefined, wasmOverride = undefined }: SetupConfigParameters) => { + const random = (Math.random() + 1).toString(36).substring(7) + return { + endpoint: process.env.PEREGRINE_WS || 'wss://peregrine.kilt.io/parachain-public-ws/', + db: `./db/peregrine_main_${random}.db.sqlite`, + port: toNumber(process.env.PEREGRINE_PORT), + wasmOverride, + blockNumber, + } as SetupOption +} + +export const storage = { + /// Assigns the native tokens to an accounts + assignNativeTokensToAccounts(addr: string[], balance: bigint = initialBalanceKILT) { + return { + System: { + Account: addr.map((address) => [[address], { providers: 1, data: { free: balance } }]), + }, + } + }, + + /// Sets the [technicalCommittee] and [council] governance to the given accounts + setGovernance(addr: string[]) { + return { + technicalCommittee: { Members: addr }, + council: { Members: addr }, + } + }, +} + +export const parachainInfo = { + /// Peregrine ParaId + paraId: 2086, + /// Sibling sovereign account + sovereignAccountOnSiblingChains: '5Eg2fnshxV9kofpcNEFE7azHLAjcCtpNkbsH3kkWZasYUVKs', + + // Native token location from Spiritnet perspective. + HERE: { Concrete: { parents: 0, interior: 'Here' } }, +} diff --git a/integration-tests/chopsticks/src/network/peregrine.ts b/integration-tests/chopsticks/src/network/peregrine.ts deleted file mode 100644 index ed38f4b393..0000000000 --- a/integration-tests/chopsticks/src/network/peregrine.ts +++ /dev/null @@ -1,120 +0,0 @@ -import { SetupOption, setupContext } from '@acala-network/chopsticks-testing' - -import type { Config } from './types.js' -import { ROC, initialBalanceKILT, initialBalanceROC, toNumber } from '../utils.js' -import { AssetSwitchSupplyParameters } from '../types.js' - -/// Options used to create the Peregrine context -const options = { - endpoint: process.env.PEREGRINE_WS || 'wss://peregrine.kilt.io', - db: './db/peregrine.db.sqlite', - port: toNumber(process.env.PEREGRINE_PORT) || 9004, - wasmOverride: process.env.PEREGRINE_WASM_OVERRIDE || undefined, -} as SetupOption - -/// Assigns the native tokens to an accounts -export function assignNativeTokensToAccounts(addr: string[], balance: bigint = initialBalanceKILT) { - return { - System: { - Account: addr.map((address) => [[address], { providers: 1, data: { free: balance } }]), - }, - } -} - -export function setSafeXcmVersion4() { - return { - polkadotXcm: { - safeXcmVersion: 4, - }, - } -} - -export function createAndAssignRocs(manager: string, addr: string[], balance: bigint = initialBalanceROC) { - return { - fungibles: { - asset: [ - [ - [ROC_LOCATION], - { - owner: manager, - issuer: manager, - admin: manager, - freezer: manager, - supply: balance * BigInt(addr.length), - deposit: 0, - minBalance: 1, - isSufficient: false, - accounts: addr.length, - sufficients: 0, - approvals: 0, - status: 'Live', - }, - ], - ], - account: addr.map((acc) => [ - [{ parents: 1, interior: 'here' }, acc], - { balance: balance, status: 'Liquid', reason: 'Consumer', extra: null }, - ]), - }, - } -} - -export function setSudoKey(sudoKey: string) { - return { - Sudo: { - key: sudoKey, - }, - } -} - -export function setSwitchPair( - parameters: AssetSwitchSupplyParameters, - remoteAssetId: Record, - remoteXcmFee: Record, - remoteReserveLocation: Record, - poolAccountId: string = initialPoolAccountId, - status: 'Running' | 'Paused' = 'Running' -) { - return { - assetSwitchPool1: { - SwitchPair: { - poolAccountId, - remoteAssetSovereignTotalBalance: parameters.sovereignSupply, - remoteAssetCirculatingSupply: parameters.circulatingSupply, - remoteAssetTotalSupply: parameters.totalSupply, - remoteAssetId, - remoteXcmFee, - remoteReserveLocation, - status, - }, - }, - // the pool account needs at least as much fund to cover the circulating supply. Give him exactly that amount + ED. - System: { - Account: [[[poolAccountId], { providers: 1, data: { free: parameters.circulatingSupply } }]], - }, - } -} - -/// Peregrine ParaId -export const paraId = 2086 -export const PILT = { Concrete: { parents: 0, interior: 'Here' } } -export const ROC_LOCATION = { - parents: 1, - interior: 'Here', -} -// 0.1 ROC as remote fee -export const remoteFee = ROC / BigInt(10) - -/// Sibling sovereign account for other chains -export const sovereignAccountAsSibling = '5Eg2fnshxV9kofpcNEFE7azHLAjcCtpNkbsH3kkWZasYUVKs' -// ED on Peregrine -export const existentialDeposit = BigInt('10000000000000') - -export const initialPoolAccountId = '4nv4phaKc4EcwENdRERuMF79ZSSB5xvnAk3zNySSbVbXhSwS' - -export async function getContext(): Promise { - return setupContext(options) -} - -export const treasuryAccount = '5EYCAe5hitmhtZcXaCrygrqw4kbmJ8bGm15PBuwUdDdQTUgY' -export const parachainStakingRewards = BigInt('760514107536694') diff --git a/integration-tests/chopsticks/src/network/polkadot.ts b/integration-tests/chopsticks/src/network/polkadot.ts deleted file mode 100644 index ebefd9be34..0000000000 --- a/integration-tests/chopsticks/src/network/polkadot.ts +++ /dev/null @@ -1,40 +0,0 @@ -import { setupContext, SetupOption } from '@acala-network/chopsticks-testing' -import type { Config } from './types.js' -import { initialBalanceDOT, toNumber } from '../utils.js' - -/// Options used to create the HydraDx context -export const options: SetupOption = { - endpoint: process.env.POLKADOT_WS || [ - 'wss://rpc.polkadot.io', - 'wss://polkadot-rpc.dwellir.com', - 'wss://rpc.ibp.network/polkadot', - ], - db: './db/polkadot.db.sqlite', - port: toNumber(process.env.POLKADOT_PORT) || 9000, -} - -/// Assigns the native tokens to an accounts -export function assignNativeTokensToAccounts(addr: string[], balance: bigint = initialBalanceDOT) { - return { - System: { - Account: addr.map((address) => [[address], { providers: 1, data: { free: balance } }]), - }, - } -} - -export function removeDisputesAndMessageQueues() { - return { - ParasDisputes: { - // those can makes block building super slow - $removePrefix: ['disputes'], - }, - Dmp: { - // clear existing dmp to avoid impact test result - $removePrefix: ['downwardMessageQueues'], - }, - } -} - -export async function getContext(): Promise { - return setupContext(options) -} diff --git a/integration-tests/chopsticks/src/network/polkadot/index.ts b/integration-tests/chopsticks/src/network/polkadot/index.ts new file mode 100644 index 0000000000..e7f7ca1351 --- /dev/null +++ b/integration-tests/chopsticks/src/network/polkadot/index.ts @@ -0,0 +1,16 @@ +import { Chains } from '../types.js' +import * as Main from './main_network.js' +import * as Test from './test_network.js' + +export const chains: Chains = { + main: { + storage: Main.storage, + getConfig: Main.getSetupOptions, + chainInfo: {}, + }, + test: { + storage: Test.storage, + getConfig: Test.getSetupOptions, + chainInfo: {}, + }, +} diff --git a/integration-tests/chopsticks/src/network/polkadot/main_network.ts b/integration-tests/chopsticks/src/network/polkadot/main_network.ts new file mode 100644 index 0000000000..76c4b25d8c --- /dev/null +++ b/integration-tests/chopsticks/src/network/polkadot/main_network.ts @@ -0,0 +1,44 @@ +import type { SetupOption } from '@acala-network/chopsticks-testing' + +import { initialBalanceDOT, toNumber } from '../../helper/utils.js' +import { SetupConfigParameters } from '../types.js' + +/// Options used to create the Hydration context +export const getSetupOptions = ({ blockNumber = undefined, wasmOverride = undefined }: SetupConfigParameters) => { + const random = (Math.random() + 1).toString(36).substring(7) + return { + endpoint: process.env.POLKADOT_WS || [ + 'wss://rpc.polkadot.io', + 'wss://polkadot-rpc.dwellir.com', + 'wss://rpc.ibp.network/polkadot', + ], + db: `./db/polkadot_main_${random}.db.sqlite`, + port: toNumber(process.env.POLKADOT_PORT), + blockNumber, + wasmOverride, + } as SetupOption +} + +export const storage = { + /// Assigns the native tokens to an accounts + assignNativeTokensToAccounts(addr: string[], balance: bigint = initialBalanceDOT) { + return { + System: { + Account: addr.map((address) => [[address], { providers: 1, data: { free: balance } }]), + }, + } + }, + + removeDisputesAndMessageQueues() { + return { + ParasDisputes: { + // those can makes block building super slow + $removePrefix: ['disputes'], + }, + Dmp: { + // clear existing dmp to avoid impact test result + $removePrefix: ['downwardMessageQueues'], + }, + } + }, +} diff --git a/integration-tests/chopsticks/src/network/polkadot/test_network.ts b/integration-tests/chopsticks/src/network/polkadot/test_network.ts new file mode 100644 index 0000000000..1be1f76713 --- /dev/null +++ b/integration-tests/chopsticks/src/network/polkadot/test_network.ts @@ -0,0 +1,46 @@ +import type { SetupOption } from '@acala-network/chopsticks-testing' + +import { initialBalanceDOT, toNumber } from '../../helper/utils.js' +import { SetupConfigParameters } from '../types.js' + +/// Options used to create the Hydration context +export const getSetupOptions = ({ blockNumber = undefined, wasmOverride = undefined }: SetupConfigParameters) => { + const random = (Math.random() + 1).toString(36).substring(7) + return { + endpoint: process.env.PASEO_WS || ['wss://paseo.rpc.amforc.com', 'wss://rpc.ibp.network/paseo'], + db: `./db/polkadot_test_${random}.db.sqlite`, + port: toNumber(process.env.PASEO_PORT), + blockNumber, + wasmOverride, + } as SetupOption +} + +export const storage = { + /// Assigns the native tokens to an accounts + assignNativeTokensToAccounts(addr: string[], balance: bigint = initialBalanceDOT) { + return { + System: { + Account: addr.map((address) => [[address], { providers: 1, data: { free: balance } }]), + }, + } + }, + assignSudoKey(addr: string) { + return { + Sudo: { + Key: addr, + }, + } + }, + removeDisputesAndMessageQueues() { + return { + ParasDisputes: { + // those can makes block building super slow + $removePrefix: ['disputes'], + }, + Dmp: { + // clear existing dmp to avoid impact test result + $removePrefix: ['downwardMessageQueues'], + }, + } + }, +} diff --git a/integration-tests/chopsticks/src/network/rococo.ts b/integration-tests/chopsticks/src/network/rococo.ts deleted file mode 100644 index 5fde011643..0000000000 --- a/integration-tests/chopsticks/src/network/rococo.ts +++ /dev/null @@ -1,44 +0,0 @@ -import { setupContext, SetupOption } from '@acala-network/chopsticks-testing' -import type { Config } from './types.js' -import { initialBalanceROC, toNumber } from '../utils.js' - -/// Options used to create the HydraDx context -export const options: SetupOption = { - endpoint: process.env.ROCOCO_WS || ['wss://rococo-rpc.polkadot.io'], - db: './db/rococo.db.sqlite', - port: toNumber(process.env.ROCOCO_PORT) || 8999, -} - -/// Assigns the native tokens to an accounts -export function assignNativeTokensToAccounts(addr: string[], balance: bigint = initialBalanceROC) { - return { - System: { - Account: addr.map((address) => [[address], { providers: 1, data: { free: balance } }]), - }, - } -} - -export function setSudoKey(sudo: string) { - return { - Sudo: { - key: sudo, - }, - } -} - -export function removeDisputesAndMessageQueues() { - return { - ParasDisputes: { - // those can makes block building super slow - $removePrefix: ['disputes'], - }, - Dmp: { - // clear existing dmp to avoid impact test result - $removePrefix: ['downwardMessageQueues'], - }, - } -} - -export async function getContext(): Promise { - return setupContext(options) -} diff --git a/integration-tests/chopsticks/src/network/spiritnet.ts b/integration-tests/chopsticks/src/network/spiritnet.ts deleted file mode 100644 index a1530a29dc..0000000000 --- a/integration-tests/chopsticks/src/network/spiritnet.ts +++ /dev/null @@ -1,46 +0,0 @@ -import { setupContext, SetupOption } from '@acala-network/chopsticks-testing' -import type { Config } from './types.js' -import { initialBalanceKILT, toNumber } from '../utils.js' - -/// Options used to create the Spiritnet context -const options: SetupOption = { - endpoint: process.env.SPIRITNET_WS || 'wss://kilt-rpc.dwellir.com', - db: './db/spiritnet.db.sqlite', - port: toNumber(process.env.SPIRITNET_PORT) || 9002, -} - -/// Assigns the native tokens to an accounts -export function assignNativeTokensToAccounts(addr: string[], balance: bigint = initialBalanceKILT) { - return { - System: { - Account: addr.map((address) => [[address], { providers: 1, data: { free: balance } }]), - }, - } -} - -/// Sets the [technicalCommittee] and [council] governance to the given accounts -export function setGovernance(addr: string[]) { - return { - technicalCommittee: { Members: addr }, - council: { Members: addr }, - } -} - -export function XcmPalletSafeVersion3StorageEntry() { - return { - polkadotXcm: { - safeXcmVersion: 3, - }, - } -} - -/// Spiritnet ParaId -export const paraId = 2086 - -/// The sovereign account of HydraDx in Spiritnet -export const hydraDxSovereignAccount = '4qXPdpioJ6D8cgdeYXaukV2Y2oAQUHaX1VnGhdbSRqJn2CBt' - -/// Returns the Spiritnet context for the given options -export async function getContext(): Promise { - return setupContext(options) -} diff --git a/integration-tests/chopsticks/src/network/types.ts b/integration-tests/chopsticks/src/network/types.ts index 0beaed1c3e..3ddf492784 100644 --- a/integration-tests/chopsticks/src/network/types.ts +++ b/integration-tests/chopsticks/src/network/types.ts @@ -1,3 +1,33 @@ -import type { setupContext } from '@acala-network/chopsticks-testing' +import type { SetupOption, setupContext } from '@acala-network/chopsticks-testing' export type Config = Awaited> + +export interface Chain { + getConfig: ({ blockNumber, wasmOverride }: { blockNumber?: number; wasmOverride?: string }) => SetupOption + + // eslint-disable-next-line @typescript-eslint/no-explicit-any + storage: Record Record>> + // eslint-disable-next-line @typescript-eslint/no-explicit-any + chainInfo: Record +} + +export interface Chains { + test?: Chain + main?: Chain +} + +export interface ChainConfig extends Chain { + parameters: { + blockNumber?: number + wasmOverride?: string + } +} + +type chains = 'kilt' | 'polkadot' | 'assetHub' | 'hydration' +/// A Record of all possible chain configurations. +export type ChainConfigs = Record + +export interface SetupConfigParameters { + blockNumber?: number + wasmOverride?: string +} diff --git a/integration-tests/chopsticks/src/network/utils.ts b/integration-tests/chopsticks/src/network/utils.ts index 00fceb46e7..4444a1da17 100644 --- a/integration-tests/chopsticks/src/network/utils.ts +++ b/integration-tests/chopsticks/src/network/utils.ts @@ -1,104 +1,93 @@ -export function getSiblingLocationV3(paraId: number) { - return { - parents: 1, - interior: { - X1: { Parachain: paraId }, - }, - } -} +import { connectParachains, connectVertical } from '@acala-network/chopsticks' +import { setTimeout as setTimeOutPromise } from 'timers/promises' +import { setupContext, SetupOption } from '@acala-network/chopsticks-testing' +import type { Config } from './types.js' +import type { ApiPromise } from '@polkadot/api' -export function getSiblingLocationV4(paraId: number) { - return { - V4: { - parents: 1, - interior: { - X1: [{ Parachain: paraId }], - }, - }, - } +/** + * This function is used to shut down a network composed of multiple chains. + * + * @param {Config[]} chains - An array of chain configurations that make up the network. + * + * @returns {Promise} + * Returns a Promise that resolves when all chains in the network have been successfully shut down. + * + */ +export async function shutDownNetwork(chains: Config[]): Promise { + await setTimeOutPromise(50) + const tearDown = chains.map((chain) => chain?.teardown()) + await Promise.all(tearDown) } - -export function getChildLocation(paraId: number) { - return { - parents: 0, - interior: { - X1: { Parachain: paraId }, - }, - } +const newBlock = async (newBlockConfig: { count: number }, contexts: Config[]) => { + await Promise.all(contexts.map((context) => context.dev.newBlock(newBlockConfig))) } +async function connectNetworks(relayChain: Config, parachains: Config[]) { + await Promise.all(parachains.map((parachain) => connectVertical(relayChain.chain, parachain.chain))) -export function getParentLocation() { - return { - parents: 1, - interior: 'Here', - } -} + await connectParachains(parachains.map((parachain) => parachain.chain)) -export function getAccountLocationV2(addr: string) { - return { - V2: { - parents: 0, - interior: { - X1: { - AccountId32: { - network: 'Any', - id: addr, - }, - }, - }, - }, - } + const newBlockConfig = { count: 2 } + // fixes api runtime disconnect warning + await setTimeOutPromise(50) + // Perform runtime upgrade and establish xcm connections. + await newBlock(newBlockConfig, [relayChain, ...parachains]) } -export function getAccountLocationV3(addr: string) { - return { - V3: { - parents: 0, - interior: { - X1: { - AccountId32: { - id: addr, - }, - }, - }, - }, - } -} +/** + * This function is used to set up a network with a relay chain, a sender, and a receiver. + * + * @param {SetupOption} relayChain - The relay chain option for the network setup. + * @param {SetupOption} parachains - The parachain option for the network setup. + * + * @returns {Promise<{relayChainContext: Config, senderChainContext: Config, receiverChainContext: Config}>} + * An object containing the contexts of the relay chain, sender, and receiver. + */ +export async function setupNetwork( + relayChain: SetupOption, + parachains: SetupOption[] +): Promise<{ relayChainContext: Config; parachainContexts: Config[] }> { + await setTimeOutPromise(50) + const relayChainContext = await setupContext(relayChain) + const parachainContexts = await Promise.all(parachains.map((parachain) => setupContext(parachain))) -export function getAccountLocationV4(addr: string) { - return { - V4: { - parents: 0, - interior: { - X1: [ - { - AccountId32: { - id: addr, - }, - }, - ], - }, - }, - } + await connectNetworks(relayChainContext, parachainContexts) + return { relayChainContext, parachainContexts } } -export function getNativeAssetIdLocationV3(amount: bigint | string) { - return { - id: { Concrete: { parents: 0, interior: 'Here' } }, - fun: { Fungible: amount }, - } +/// Creates a new block for the given context +export async function createBlock(context: Config) { + // fixes api runtime disconnect warning + await setTimeOutPromise(50) + await context.dev.newBlock() } -export function getRelayNativeAssetIdLocationV3(amount: bigint | string) { - return { - id: { Concrete: { parents: 1, interior: 'Here' } }, - fun: { Fungible: amount }, - } +/// sets the storage for the given context. +export async function setStorage(context: Config, storage: Record>) { + await setTimeOutPromise(50) + await context.dev.setStorage(storage) + await createBlock(context) } -export function getRelayNativeAssetIdLocationV4(amount: bigint | string) { - return { - id: { parents: 1, interior: 'Here' }, - fun: { Fungible: amount }, - } +/// Schedules a transaction with root privileges at the given block number. If no block is provided, the transaction will be scheduled for the next block. +export async function scheduleTx({ api }: { api: ApiPromise }, call: string, at = undefined, origin = 'Root') { + const number = at ?? (await api.rpc.chain.getHeader()).number.toNumber() + await api.rpc('dev_setStorage', { + scheduler: { + agenda: [ + [ + [number + 1], + [ + { + call: { + Inline: call, + }, + origin: { + system: origin, + }, + }, + ], + ], + ], + }, + }) } diff --git a/integration-tests/chopsticks/src/setup.ts b/integration-tests/chopsticks/src/setup.ts new file mode 100644 index 0000000000..ae1616f3a0 --- /dev/null +++ b/integration-tests/chopsticks/src/setup.ts @@ -0,0 +1,7 @@ +// peer dependencies can throw unhandled promise rejections. This is a workaround to ignore them. +process.on('unhandledRejection', (reason, promise) => { + // Ignore unhandled promise rejections most likely emitted from peer dependencies + if (!process.env.CI) { + console.warn('Unhandled Rejection:', reason, 'Promise:', promise) + } +}) diff --git a/integration-tests/chopsticks/src/tests/index.ts b/integration-tests/chopsticks/src/tests/index.ts deleted file mode 100644 index ba37c72d67..0000000000 --- a/integration-tests/chopsticks/src/tests/index.ts +++ /dev/null @@ -1,146 +0,0 @@ -import { beforeEach, afterEach } from 'vitest' -import { connectParachains, connectVertical } from '@acala-network/chopsticks' -import { setTimeout } from 'timers/promises' - -import * as SpiritnetConfig from '../network/spiritnet.js' -import * as PolkadotConfig from '../network/polkadot.js' -import * as HydraDxConfig from '../network/hydraDx.js' -import * as AssetHubConfig from '../network/assetHub.js' -import * as RococoConfig from '../network/rococo.js' -import * as BasiliskConfig from '../network/basilisk.js' -import * as PeregrineConfig from '../network/peregrine.js' -import type { Config } from '../network/types.js' - -export let spiritnetContext: Config -export let hydradxContext: Config -export let polkadotContext: Config -export let assethubContext: Config -export let peregrineContext: Config -export let rococoContext: Config -export let basiliskContext: Config - -beforeEach(async () => { - spiritnetContext = await SpiritnetConfig.getContext() - hydradxContext = await HydraDxConfig.getContext() - polkadotContext = await PolkadotConfig.getContext() - assethubContext = await AssetHubConfig.getContext() - rococoContext = await RococoConfig.getContext() - peregrineContext = await PeregrineConfig.getContext() - basiliskContext = await BasiliskConfig.getContext() - - // Setup Polkadot network - await connectVertical(polkadotContext.chain, spiritnetContext.chain) - await connectVertical(polkadotContext.chain, hydradxContext.chain) - await connectVertical(polkadotContext.chain, assethubContext.chain) - await connectParachains([spiritnetContext.chain, hydradxContext.chain, assethubContext.chain]) - - // Setup Rococo network - await connectVertical(rococoContext.chain, assethubContext.chain) - await connectVertical(rococoContext.chain, peregrineContext.chain) - await connectVertical(rococoContext.chain, basiliskContext.chain) - await connectParachains([peregrineContext.chain, basiliskContext.chain, assethubContext.chain]) - - const newBlockConfig = { count: 2 } - // fixes api runtime disconnect warning - await setTimeout(50) - // Perform runtime upgrade and establish xcm connections. - await Promise.all([ - polkadotContext.dev.newBlock(newBlockConfig), - spiritnetContext.dev.newBlock(newBlockConfig), - hydradxContext.dev.newBlock(newBlockConfig), - assethubContext.dev.newBlock(newBlockConfig), - rococoContext.dev.newBlock(newBlockConfig), - peregrineContext.dev.newBlock(newBlockConfig), - basiliskContext.dev.newBlock(newBlockConfig), - ]) -}, 90_000) - -afterEach(async () => { - // fixes api runtime disconnect warning - - try { - await Promise.all([ - spiritnetContext.teardown(), - hydradxContext.teardown(), - polkadotContext.teardown(), - assethubContext.teardown(), - rococoContext.teardown(), - peregrineContext.teardown(), - basiliskContext.teardown(), - ]) - } catch (error) { - if (!(error instanceof TypeError)) { - console.error(error) - } - } - await setTimeout(50) -}) - -export async function getFreeBalanceSpiritnet(account: string): Promise { - const accountInfo = await spiritnetContext.api.query.system.account(account) - return accountInfo.data.free.toBigInt() -} - -export async function getFreeBalancePeregrine(account: string): Promise { - const accountInfo = await peregrineContext.api.query.system.account(account) - return accountInfo.data.free.toBigInt() -} - -export async function getFreeBalancePeregrineAt(account: string, at: number): Promise { - const blockHash = await peregrineContext.api.rpc.chain.getBlockHash(at) - const api = await peregrineContext.api.at(blockHash) - const accountInfo = await api.query.system.account(account) - return accountInfo.data.free.toBigInt() -} - -export async function getCurrentBlockNumber(context: Config): Promise { - const blockNumber = await context.api.query.system.number() - return blockNumber.toNumber() -} - -export async function getFreeRocPeregrine(account: string): Promise { - // eslint-disable-next-line @typescript-eslint/no-explicit-any - const accountInfo: any = await peregrineContext.api.query.fungibles.account( - AssetHubConfig.nativeTokenLocation, - account - ) - if (accountInfo.isNone) { - return BigInt(0) - } - return accountInfo.unwrap().balance.toBigInt() -} - -export async function getFreeRocAssetHub(account: string): Promise { - const accountInfo = await assethubContext.api.query.system.account(account) - return accountInfo.data.free.toBigInt() -} - -export async function getRemoteLockedSupply(): Promise { - // eslint-disable-next-line @typescript-eslint/no-explicit-any - const switchPairInfo: any = await peregrineContext.api.query.assetSwitchPool1.switchPair() - - if (switchPairInfo.isNone) { - return BigInt(0) - } - - return switchPairInfo.unwrap().remoteAssetSovereignTotalBalance.toBigInt() -} - -export async function getFreeEkiltAssetHub(account: string): Promise { - // eslint-disable-next-line @typescript-eslint/no-explicit-any - const accountInfo: any = await assethubContext.api.query.foreignAssets.account( - AssetHubConfig.eKiltLocation, - account - ) - if (accountInfo.isNone) { - return BigInt(0) - } - - return accountInfo.unwrap().balance.toBigInt() -} - -export async function getFreeBalanceHydraDxKilt(account: string): Promise { - // eslint-disable-next-line @typescript-eslint/no-explicit-any - const accountInfo: any = await hydradxContext.api.query.tokens.accounts(account, HydraDxConfig.kiltTokenId) - return accountInfo.free.toBigInt() -} diff --git a/integration-tests/chopsticks/src/tests/switchPallet/__snapshots__/fullFlowSwitch.test.ts.snap b/integration-tests/chopsticks/src/tests/switchPallet/__snapshots__/fullFlowSwitch.test.ts.snap deleted file mode 100644 index f2d53fcf32..0000000000 --- a/integration-tests/chopsticks/src/tests/switchPallet/__snapshots__/fullFlowSwitch.test.ts.snap +++ /dev/null @@ -1,80 +0,0 @@ -// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html - -exports[`Full e2e tests > receiver Peregrine::assetSwitchPool1::[LocalToRemoteSwitchExecuted] 1`] = ` -[ - { - "data": { - "amount": 50000000000000000, - "from": "4seWojfEHrk5YKPahdErazQ3CWEHZYi6NV4gKz5AaejWbRPJ", - "to": { - "V4": { - "interior": { - "X1": [ - { - "AccountId32": { - "id": "(hash)", - "network": null, - }, - }, - ], - }, - "parents": 0, - }, - }, - }, - "method": "LocalToRemoteSwitchExecuted", - "section": "assetSwitchPool1", - }, -] -`; - -exports[`Full e2e tests > sender AssetHub::foreignAssets::[Transferred] 1`] = ` -[ - { - "data": { - "amount": 50000000000000000, - "assetId": { - "interior": { - "X2": [ - { - "GlobalConsensus": { - "Ethereum": { - "chainId": "(rounded 11000000)", - }, - }, - }, - { - "AccountKey20": { - "key": "0x06012c8cf97bead5deae237070f9587f8e7a266d", - "network": null, - }, - }, - ], - }, - "parents": 2, - }, - "from": "15jSz35ugoWTc61xHPoxEkHte4o7UanKCk1gx1dizA8yuNs8", - "to": "13cKp88mpGREFCq8KsJEFjpSBnjFuCNWq6bmD3js7fu4f66e", - }, - "method": "Transferred", - "section": "foreignAssets", - }, -] -`; - -exports[`Full e2e tests > sender Peregrine::fungibles::[Burned] 1`] = ` -[ - { - "data": { - "assetId": { - "interior": "Here", - "parents": 1, - }, - "balance": 1000000000000, - "owner": "4seWojfEHrk5YKPahdErazQ3CWEHZYi6NV4gKz5AaejWbRPJ", - }, - "method": "Burned", - "section": "fungibles", - }, -] -`; diff --git a/integration-tests/chopsticks/src/tests/switchPallet/__snapshots__/pauseSwitch.test.ts.snap b/integration-tests/chopsticks/src/tests/switchPallet/__snapshots__/pauseSwitch.test.ts.snap deleted file mode 100644 index 5463ee5c7c..0000000000 --- a/integration-tests/chopsticks/src/tests/switchPallet/__snapshots__/pauseSwitch.test.ts.snap +++ /dev/null @@ -1,170 +0,0 @@ -// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html - -exports[`Send ROCs while switch paused > receiver Peregrine::messageQueue::[Processed] 1`] = ` -[ - { - "data": { - "id": "(hash)", - "origin": { - "Sibling": 1000, - }, - "success": false, - "weightUsed": { - "proofSize": 0, - "refTime": 600000000, - }, - }, - "method": "Processed", - "section": "messageQueue", - }, -] -`; - -exports[`Send ROCs while switch paused > receiver Peregrine::polkadotXcm::[AssetsTrapped] 1`] = ` -[ - { - "data": { - "assets": { - "V4": [ - { - "fun": { - "Fungible": 1000000000000, - }, - "id": { - "interior": "Here", - "parents": 1, - }, - }, - ], - }, - "hash_": "(hash)", - "origin": { - "interior": { - "X1": [ - { - "Parachain": 1000, - }, - ], - }, - "parents": 1, - }, - }, - "method": "AssetsTrapped", - "section": "polkadotXcm", - }, -] -`; - -exports[`Switch ePILTs against PILTs while paused > receiver Peregrine::messageQueue::[Processed] 1`] = ` -[ - { - "data": { - "id": "(hash)", - "origin": { - "Sibling": 1000, - }, - "success": false, - "weightUsed": { - "proofSize": 0, - "refTime": 600000000, - }, - }, - "method": "Processed", - "section": "messageQueue", - }, - { - "data": { - "id": "(hash)", - "origin": { - "Sibling": 1000, - }, - "success": true, - "weightUsed": { - "proofSize": 0, - "refTime": 400000000, - }, - }, - "method": "Processed", - "section": "messageQueue", - }, -] -`; - -exports[`Switch ePILTs against PILTs while paused > receiver Peregrine::polkadotXcm::[AssetsTrapped] 1`] = ` -[ - { - "data": { - "assets": { - "V4": [ - { - "fun": { - "Fungible": 25000000000000000, - }, - "id": { - "interior": { - "X2": [ - { - "GlobalConsensus": { - "Ethereum": { - "chainId": "(rounded 11000000)", - }, - }, - }, - { - "AccountKey20": { - "key": "0x06012c8cf97bead5deae237070f9587f8e7a266d", - "network": null, - }, - }, - ], - }, - "parents": 2, - }, - }, - ], - }, - "hash_": "(hash)", - "origin": { - "interior": { - "X1": [ - { - "Parachain": 1000, - }, - ], - }, - "parents": 1, - }, - }, - "method": "AssetsTrapped", - "section": "polkadotXcm", - }, -] -`; - -exports[`Switch ePILTs against PILTs while paused > sender Peregrine::assetSwitchPool1::[LocalToRemoteSwitchExecuted] 1`] = ` -[ - { - "data": { - "amount": 50000000000000000, - "from": "4seWojfEHrk5YKPahdErazQ3CWEHZYi6NV4gKz5AaejWbRPJ", - "to": { - "V4": { - "interior": { - "X1": [ - { - "AccountId32": { - "id": "(hash)", - "network": null, - }, - }, - ], - }, - "parents": 0, - }, - }, - }, - "method": "LocalToRemoteSwitchExecuted", - "section": "assetSwitchPool1", - }, -] -`; diff --git a/integration-tests/chopsticks/src/tests/switchPallet/__snapshots__/relayToken.test.ts.snap b/integration-tests/chopsticks/src/tests/switchPallet/__snapshots__/relayToken.test.ts.snap deleted file mode 100644 index ddfd6434f9..0000000000 --- a/integration-tests/chopsticks/src/tests/switchPallet/__snapshots__/relayToken.test.ts.snap +++ /dev/null @@ -1,60 +0,0 @@ -// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html - -exports[`Send DOTs from basilisk 2 Peregrine > receiver Peregrine::messageQueue::[ProcessingFailed] 1`] = ` -[ - { - "data": { - "error": "Unsupported", - "id": "(hash)", - "origin": "Parent", - }, - "method": "ProcessingFailed", - "section": "messageQueue", - }, -] -`; - -exports[`User gets dusted with ROCs > local Peregrine::balances::[Transfer] native asset 1`] = ` -[ - { - "data": { - "amount": "(rounded 100000000000000000)", - "from": "4seWojfEHrk5YKPahdErazQ3CWEHZYi6NV4gKz5AaejWbRPJ", - "to": "4rsmbFBYpVmWE2LHRsSZKxf22a8cbJLxMZqvVGkGkSDmDBcr", - }, - "method": "Transfer", - "section": "balances", - }, -] -`; - -exports[`User gets dusted with ROCs > local balances::fungibles::[DustLost] 1`] = ` -[ - { - "data": { - "account": "4seWojfEHrk5YKPahdErazQ3CWEHZYi6NV4gKz5AaejWbRPJ", - "amount": "(rounded 51000000000)", - }, - "method": "DustLost", - "section": "balances", - }, -] -`; - -exports[`User transfers all of his dots > local Peregrine::fungibles::[Transferred] asset {"parents":1,"interior":"Here"} 1`] = ` -[ - { - "data": { - "amount": 100000000000000, - "assetId": { - "interior": "Here", - "parents": 1, - }, - "from": "4seWojfEHrk5YKPahdErazQ3CWEHZYi6NV4gKz5AaejWbRPJ", - "to": "4rsmbFBYpVmWE2LHRsSZKxf22a8cbJLxMZqvVGkGkSDmDBcr", - }, - "method": "Transferred", - "section": "fungibles", - }, -] -`; diff --git a/integration-tests/chopsticks/src/tests/switchPallet/__snapshots__/switchConfig.test.ts.snap b/integration-tests/chopsticks/src/tests/switchPallet/__snapshots__/switchConfig.test.ts.snap deleted file mode 100644 index fb1339c946..0000000000 --- a/integration-tests/chopsticks/src/tests/switchPallet/__snapshots__/switchConfig.test.ts.snap +++ /dev/null @@ -1,71 +0,0 @@ -// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html - -exports[`Send eKILT from other reserve location > receiver Peregrine::messageQueue::[Processed] 1`] = ` -[ - { - "data": { - "error": "Unsupported", - "id": "(hash)", - "origin": "Parent", - }, - "method": "ProcessingFailed", - "section": "messageQueue", - }, -] -`; - -exports[`Send eKILT while switch Pair does not exist > receiver Peregrine::messageQueue::[Processed] 1`] = `[]`; - -exports[`Switch KILTs against EKILTs no enough DOTs on AH > sender Peregrine::assetSwitchPool1::[LocalToRemoteSwitchExecuted] 1`] = ` -[ - { - "data": { - "amount": 50000000000000000, - "from": "4seWojfEHrk5YKPahdErazQ3CWEHZYi6NV4gKz5AaejWbRPJ", - "to": { - "V4": { - "interior": { - "X1": [ - { - "AccountId32": { - "id": "(hash)", - "network": null, - }, - }, - ], - }, - "parents": 0, - }, - }, - }, - "method": "LocalToRemoteSwitchExecuted", - "section": "assetSwitchPool1", - }, -] -`; - -exports[`Switch KILTs against EKILTs no enough DOTs on AH > sender Peregrine::balances::[Transfer] 1`] = ` -[ - { - "data": { - "amount": 50000000000000000, - "from": "4seWojfEHrk5YKPahdErazQ3CWEHZYi6NV4gKz5AaejWbRPJ", - "to": "4nv4phaKc4EcwENdRERuMF79ZSSB5xvnAk3zNySSbVbXhSwS", - }, - "method": "Transfer", - "section": "balances", - }, -] -`; - -exports[`Switch KILTs against EKILTs no enough DOTs on AH > sender Peregrine::xcmpQueue::[XcmpMessageSent] 1`] = ` -[ - { - "data": { - "messageHash": "(hash)", - }, - "method": "XcmpMessageSent", - "section": "xcmpQueue", - }, -] -`; diff --git a/integration-tests/chopsticks/src/tests/switchPallet/__snapshots__/switchEkiltAgainstKilt.test.ts.snap b/integration-tests/chopsticks/src/tests/switchPallet/__snapshots__/switchEkiltAgainstKilt.test.ts.snap deleted file mode 100644 index 6165544554..0000000000 --- a/integration-tests/chopsticks/src/tests/switchPallet/__snapshots__/switchEkiltAgainstKilt.test.ts.snap +++ /dev/null @@ -1,57 +0,0 @@ -// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html - -exports[`Switch ePILTs against PILTS on Peregrine > receiver Peregrine::assetSwitchPool1::[RemoteToLocalSwitchExecuted] 1`] = ` -[ - { - "data": { - "amount": "(rounded 50000000000000000)", - "to": "4seWojfEHrk5YKPahdErazQ3CWEHZYi6NV4gKz5AaejWbRPJ", - }, - "method": "RemoteToLocalSwitchExecuted", - "section": "assetSwitchPool1", - }, -] -`; - -exports[`Switch ePILTs against PILTS on Peregrine > receiver Peregrine::balances::[Transfer] 1`] = ` -[ - { - "data": { - "amount": "(rounded 50000000000000000)", - "from": "4nv4phaKc4EcwENdRERuMF79ZSSB5xvnAk3zNySSbVbXhSwS", - "to": "4seWojfEHrk5YKPahdErazQ3CWEHZYi6NV4gKz5AaejWbRPJ", - }, - "method": "Transfer", - "section": "balances", - }, - { - "data": { - "amount": "(rounded 35000)", - "from": "4nv4phaKc4EcwENdRERuMF79ZSSB5xvnAk3zNySSbVbXhSwS", - "to": "4qPZ8fv6BjGoGKzfx5LtBFnEUp2b5Q5C1ErrjBNGmoFTLNHG", - }, - "method": "Transfer", - "section": "balances", - }, -] -`; - -exports[`Switch ePILTs against PILTS on Peregrine > receiver Peregrine::messageQueue::[Processed] 1`] = ` -[ - { - "data": { - "id": "(hash)", - "origin": { - "Sibling": 1000, - }, - "success": true, - "weightUsed": { - "proofSize": 0, - "refTime": 1000000000, - }, - }, - "method": "Processed", - "section": "messageQueue", - }, -] -`; diff --git a/integration-tests/chopsticks/src/tests/switchPallet/__snapshots__/switchKiltAgainstEkilt.test.ts.snap b/integration-tests/chopsticks/src/tests/switchPallet/__snapshots__/switchKiltAgainstEkilt.test.ts.snap deleted file mode 100644 index 4fd48a532a..0000000000 --- a/integration-tests/chopsticks/src/tests/switchPallet/__snapshots__/switchKiltAgainstEkilt.test.ts.snap +++ /dev/null @@ -1,55 +0,0 @@ -// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html - -exports[`Switch PILTs against ePILTS on AssetHub > sender Peregrine::assetSwitchPool1::[LocalToRemoteSwitchExecuted] 1`] = ` -[ - { - "data": { - "amount": 50000000000000000, - "from": "4seWojfEHrk5YKPahdErazQ3CWEHZYi6NV4gKz5AaejWbRPJ", - "to": { - "V4": { - "interior": { - "X1": [ - { - "AccountId32": { - "id": "(hash)", - "network": null, - }, - }, - ], - }, - "parents": 0, - }, - }, - }, - "method": "LocalToRemoteSwitchExecuted", - "section": "assetSwitchPool1", - }, -] -`; - -exports[`Switch PILTs against ePILTS on AssetHub > sender Peregrine::balances::[Transfer] 1`] = ` -[ - { - "data": { - "amount": 50000000000000000, - "from": "4seWojfEHrk5YKPahdErazQ3CWEHZYi6NV4gKz5AaejWbRPJ", - "to": "4nv4phaKc4EcwENdRERuMF79ZSSB5xvnAk3zNySSbVbXhSwS", - }, - "method": "Transfer", - "section": "balances", - }, -] -`; - -exports[`Switch PILTs against ePILTS on AssetHub > sender Peregrine::xcmpQueue::[XcmpMessageSent] 1`] = ` -[ - { - "data": { - "messageHash": "(hash)", - }, - "method": "XcmpMessageSent", - "section": "xcmpQueue", - }, -] -`; diff --git a/integration-tests/chopsticks/src/tests/switchPallet/__snapshots__/trappedAssets.test.ts.snap b/integration-tests/chopsticks/src/tests/switchPallet/__snapshots__/trappedAssets.test.ts.snap deleted file mode 100644 index 37b38d58bd..0000000000 --- a/integration-tests/chopsticks/src/tests/switchPallet/__snapshots__/trappedAssets.test.ts.snap +++ /dev/null @@ -1,189 +0,0 @@ -// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html - -exports[`Trapped assets > receiver Peregrine::assetSwitchPool1::[RemoteToLocalSwitchExecuted] 1`] = ` -[ - { - "data": { - "amount": 1000000000000000, - "to": "4seWojfEHrk5YKPahdErazQ3CWEHZYi6NV4gKz5AaejWbRPJ", - }, - "method": "RemoteToLocalSwitchExecuted", - "section": "assetSwitchPool1", - }, -] -`; - -exports[`Trapped assets > receiver Peregrine::messageQueue::[Processed] 1`] = ` -[ - { - "data": { - "id": "(hash)", - "origin": { - "Sibling": 1000, - }, - "success": false, - "weightUsed": { - "proofSize": 0, - "refTime": 600000000, - }, - }, - "method": "Processed", - "section": "messageQueue", - }, -] -`; - -exports[`Trapped assets > receiver Peregrine::messageQueue::[Processed] 2`] = ` -[ - { - "data": { - "id": "(hash)", - "origin": { - "Sibling": 1000, - }, - "success": true, - "weightUsed": { - "proofSize": 0, - "refTime": 400000000, - }, - }, - "method": "Processed", - "section": "messageQueue", - }, - { - "data": { - "id": "(hash)", - "origin": { - "Sibling": 1000, - }, - "success": true, - "weightUsed": { - "proofSize": 0, - "refTime": 1000000000, - }, - }, - "method": "Processed", - "section": "messageQueue", - }, -] -`; - -exports[`Trapped assets > receiver Peregrine::polkadotXcm::[AssetsClaimed] 1`] = ` -[ - { - "data": { - "cost": [], - "destination": { - "interior": { - "X1": [ - { - "Parachain": 1000, - }, - ], - }, - "parents": 1, - }, - "messageId": "(hash)", - }, - "method": "VersionNotifyStarted", - "section": "polkadotXcm", - }, - { - "data": { - "assets": { - "V4": [ - { - "fun": { - "Fungible": 1000000000000000, - }, - "id": { - "interior": { - "X2": [ - { - "GlobalConsensus": { - "Ethereum": { - "chainId": "(rounded 11000000)", - }, - }, - }, - { - "AccountKey20": { - "key": "0x06012c8cf97bead5deae237070f9587f8e7a266d", - "network": null, - }, - }, - ], - }, - "parents": 2, - }, - }, - ], - }, - "hash_": "(hash)", - "origin": { - "interior": { - "X1": [ - { - "Parachain": 1000, - }, - ], - }, - "parents": 1, - }, - }, - "method": "AssetsClaimed", - "section": "polkadotXcm", - }, -] -`; - -exports[`Trapped assets > receiver Peregrine::polkadotXcm::[AssetsTrapped] 1`] = ` -[ - { - "data": { - "assets": { - "V4": [ - { - "fun": { - "Fungible": 1000000000000000, - }, - "id": { - "interior": { - "X2": [ - { - "GlobalConsensus": { - "Ethereum": { - "chainId": "(rounded 11000000)", - }, - }, - }, - { - "AccountKey20": { - "key": "0x06012c8cf97bead5deae237070f9587f8e7a266d", - "network": null, - }, - }, - ], - }, - "parents": 2, - }, - }, - ], - }, - "hash_": "(hash)", - "origin": { - "interior": { - "X1": [ - { - "Parachain": 1000, - }, - ], - }, - "parents": 1, - }, - }, - "method": "AssetsTrapped", - "section": "polkadotXcm", - }, -] -`; diff --git a/integration-tests/chopsticks/src/tests/switchPallet/fullFlow/__snapshots__/index.test.ts.snap b/integration-tests/chopsticks/src/tests/switchPallet/fullFlow/__snapshots__/index.test.ts.snap new file mode 100644 index 0000000000..090de3590f --- /dev/null +++ b/integration-tests/chopsticks/src/tests/switchPallet/fullFlow/__snapshots__/index.test.ts.snap @@ -0,0 +1,444 @@ +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html + +exports[`Switch KILTs full flow > V4 LIVE > Receive foreign funds on foreign chain {"section":"balances","method":"Burned"} 1`] = ` +[ + { + "data": { + "amount": 1000000000, + "who": "13cKp88mpGREFCq8KsJEFjpSBnjFuCNWq6bmD3js7fu4f66e", + }, + "method": "Burned", + "section": "balances", + }, +] +`; + +exports[`Switch KILTs full flow > V4 LIVE > Receive foreign funds on foreign chain {"section":"balances","method":"Minted"} 1`] = ` +[ + { + "data": { + "amount": "(rounded 960000000)", + "who": "15jSz35ugoWTc61xHPoxEkHte4o7UanKCk1gx1dizA8yuNs8", + }, + "method": "Minted", + "section": "balances", + }, +] +`; + +exports[`Switch KILTs full flow > V4 LIVE > Receive native funds on foreign chain {"section":"balances","method":"Burned"} 1`] = ` +[ + { + "data": { + "amount": 5000000000, + "who": "13cKp88mpGREFCq8KsJEFjpSBnjFuCNWq6bmD3js7fu4f66e", + }, + "method": "Burned", + "section": "balances", + }, +] +`; + +exports[`Switch KILTs full flow > V4 LIVE > Receive native funds on foreign chain {"section":"balances","method":"Minted"} 1`] = ` +[ + { + "data": { + "amount": "(rounded 300000000)", + "who": "14xmwinmCEz6oRrFdczHKqHgWNMiCysE2KrA4jXXAAM1Eogk", + }, + "method": "Minted", + "section": "balances", + }, + { + "data": { + "amount": "(rounded 4600000000)", + "who": "15jSz35ugoWTc61xHPoxEkHte4o7UanKCk1gx1dizA8yuNs8", + }, + "method": "Minted", + "section": "balances", + }, +] +`; + +exports[`Switch KILTs full flow > V4 LIVE > Receive native funds on native chain {"section":"assetSwitchPool1","method":"RemoteToLocalSwitchExecuted"} 1`] = ` +[ + { + "data": { + "amount": "(rounded 500000000000000)", + "to": "4seWojfEHrk5YKPahdErazQ3CWEHZYi6NV4gKz5AaejWbRPJ", + }, + "method": "RemoteToLocalSwitchExecuted", + "section": "assetSwitchPool1", + }, +] +`; + +exports[`Switch KILTs full flow > V4 LIVE > Transfer native funds to foreign chain {"section":"assetSwitchPool1","method":"LocalToRemoteSwitchExecuted"} 1`] = ` +[ + { + "data": { + "amount": 1000000000000000, + "from": "4seWojfEHrk5YKPahdErazQ3CWEHZYi6NV4gKz5AaejWbRPJ", + "to": { + "V4": { + "interior": { + "X1": [ + { + "AccountId32": { + "id": "(hash)", + "network": null, + }, + }, + ], + }, + "parents": 0, + }, + }, + }, + "method": "LocalToRemoteSwitchExecuted", + "section": "assetSwitchPool1", + }, +] +`; + +exports[`Switch KILTs full flow > V4 LIVE > Transfer native funds to foreign chain {"section":"fungibles","method":"Burned"} 1`] = ` +[ + { + "data": { + "assetId": { + "interior": "Here", + "parents": 1, + }, + "balance": 5000000000, + "owner": "4seWojfEHrk5YKPahdErazQ3CWEHZYi6NV4gKz5AaejWbRPJ", + }, + "method": "Burned", + "section": "fungibles", + }, +] +`; + +exports[`Switch KILTs full flow > V4 LIVE > Withdraw foreign funds on native chain "fungibles" 1`] = ` +[ + { + "data": { + "assetId": { + "interior": "Here", + "parents": 1, + }, + "balance": 1000000000, + "owner": "4seWojfEHrk5YKPahdErazQ3CWEHZYi6NV4gKz5AaejWbRPJ", + }, + "method": "Burned", + "section": "fungibles", + }, +] +`; + +exports[`Switch KILTs full flow > V4 LIVE > Withdraw foreign funds on native chain {"section":"polkadotXcm","method":"Sent"} 1`] = ` +[ + { + "data": { + "destination": { + "interior": { + "X1": [ + { + "Parachain": 1000, + }, + ], + }, + "parents": 1, + }, + "message": [ + { + "WithdrawAsset": [ + { + "fun": { + "Fungible": 1000000000, + }, + "id": { + "interior": "Here", + "parents": 1, + }, + }, + ], + }, + "ClearOrigin", + { + "BuyExecution": { + "fees": { + "fun": { + "Fungible": 1000000000, + }, + "id": { + "interior": "Here", + "parents": 1, + }, + }, + "weightLimit": "Unlimited", + }, + }, + { + "DepositAsset": { + "assets": { + "Wild": { + "AllCounted": 1, + }, + }, + "beneficiary": { + "interior": { + "X1": [ + { + "AccountId32": { + "id": "(hash)", + "network": null, + }, + }, + ], + }, + "parents": 0, + }, + }, + }, + ], + "messageId": "(hash)", + "origin": { + "interior": { + "X1": [ + { + "AccountId32": { + "id": "(hash)", + "network": "Polkadot", + }, + }, + ], + }, + "parents": 0, + }, + }, + "method": "Sent", + "section": "polkadotXcm", + }, +] +`; + +exports[`Switch KILTs full flow > V4 LIVE > Withdraw native funds on foreign chain {"section":"polkadotXcm","method":"Sent"} 1`] = ` +[ + { + "data": { + "destination": { + "interior": { + "X1": [ + { + "Parachain": "(rounded 2100)", + }, + ], + }, + "parents": 1, + }, + "message": [ + { + "ReserveAssetDeposited": [ + { + "fun": { + "Fungible": 500000000000000, + }, + "id": { + "interior": { + "X2": [ + { + "GlobalConsensus": { + "Ethereum": { + "chainId": 1, + }, + }, + }, + { + "AccountKey20": { + "key": "0x5d3d01fd6d2ad1169b17918eb4f153c6616288eb", + "network": null, + }, + }, + ], + }, + "parents": 2, + }, + }, + ], + }, + "ClearOrigin", + { + "BuyExecution": { + "fees": { + "fun": { + "Fungible": 500000000000000, + }, + "id": { + "interior": { + "X2": [ + { + "GlobalConsensus": { + "Ethereum": { + "chainId": 1, + }, + }, + }, + { + "AccountKey20": { + "key": "0x5d3d01fd6d2ad1169b17918eb4f153c6616288eb", + "network": null, + }, + }, + ], + }, + "parents": 2, + }, + }, + "weightLimit": "Unlimited", + }, + }, + { + "DepositAsset": { + "assets": { + "Wild": "All", + }, + "beneficiary": { + "interior": { + "X1": [ + { + "AccountId32": { + "id": "(hash)", + "network": null, + }, + }, + ], + }, + "parents": 0, + }, + }, + }, + ], + "messageId": "(hash)", + "origin": { + "interior": { + "X1": [ + { + "AccountId32": { + "id": "(hash)", + "network": "Polkadot", + }, + }, + ], + }, + "parents": 0, + }, + }, + "method": "Sent", + "section": "polkadotXcm", + }, +] +`; + +exports[`Switch KILTs full flow > V4 LIVE > receive foreign funds on native chain {"section":"fungibles","method":"Issued"} 1`] = ` +[ + { + "data": { + "amount": "(rounded 10000000000)", + "assetId": { + "interior": "Here", + "parents": 1, + }, + "owner": "4seWojfEHrk5YKPahdErazQ3CWEHZYi6NV4gKz5AaejWbRPJ", + }, + "method": "Issued", + "section": "fungibles", + }, +] +`; + +exports[`Switch KILTs full flow > V4 LIVE > transfer foreign funds from foreign chain {"section":"polkadotXcm","method":"Sent"} 1`] = ` +[ + { + "data": { + "destination": { + "interior": { + "X1": [ + { + "Parachain": "(rounded 2100)", + }, + ], + }, + "parents": 1, + }, + "message": [ + { + "ReserveAssetDeposited": [ + { + "fun": { + "Fungible": 10000000000, + }, + "id": { + "interior": "Here", + "parents": 1, + }, + }, + ], + }, + "ClearOrigin", + { + "BuyExecution": { + "fees": { + "fun": { + "Fungible": 10000000000, + }, + "id": { + "interior": "Here", + "parents": 1, + }, + }, + "weightLimit": "Unlimited", + }, + }, + { + "DepositAsset": { + "assets": { + "Wild": { + "AllCounted": 1, + }, + }, + "beneficiary": { + "interior": { + "X1": [ + { + "AccountId32": { + "id": "(hash)", + "network": null, + }, + }, + ], + }, + "parents": 0, + }, + }, + }, + ], + "messageId": "(hash)", + "origin": { + "interior": { + "X1": [ + { + "AccountId32": { + "id": "(hash)", + "network": "Polkadot", + }, + }, + ], + }, + "parents": 0, + }, + }, + "method": "Sent", + "section": "polkadotXcm", + }, +] +`; diff --git a/integration-tests/chopsticks/src/tests/switchPallet/fullFlow/config.ts b/integration-tests/chopsticks/src/tests/switchPallet/fullFlow/config.ts new file mode 100644 index 0000000000..18b6acdddb --- /dev/null +++ b/integration-tests/chopsticks/src/tests/switchPallet/fullFlow/config.ts @@ -0,0 +1,194 @@ +import type { EventFilter } from '@acala-network/chopsticks-testing' +import type { ApiPromise } from '@polkadot/api' +import type { SubmittableExtrinsic } from '@polkadot/api/types' +import type { KeyringPair } from '@polkadot/keyring/types' + +import { initialBalanceKILT, keysAlice, keysBob } from '../../../helper/utils.js' +import { mainChains } from '../../../network/index.js' +import { tx, query } from '../../../helper/api.js' +import { getXcmMessageV4ToSendEkilt } from '../index.js' +import type { BasicConfig } from '../../types.js' + +interface QueryFunds { + nativeFunds: ({ api }: { api: ApiPromise }, address: string) => Promise + // eslint-disable-next-line @typescript-eslint/no-explicit-any + foreignFunds: ({ api }: { api: ApiPromise }, address: string) => Promise +} + +interface Query { + native: QueryFunds + foreign: QueryFunds +} + +interface Transactions { + native: { + // tx to send the funds from the native chain to the foreign chain + transfer: ({ api }: { api: ApiPromise }, submitter: string, amount: string) => SubmittableExtrinsic<'promise'> + // tx to withdraw the funds from the foreign chain to the native chain + withdraw: ({ api }: { api: ApiPromise }, amount: string) => SubmittableExtrinsic<'promise'> + } + foreign: { + // tx to send the funds from the foreign chain to the native chain + transfer: ( + { api }: { api: ApiPromise }, + beneficiary: string, + amount: string | number + ) => SubmittableExtrinsic<'promise'> + // tx to withdraw the funds from the native chain to the foreign chain + withdraw: ( + { api }: { api: ApiPromise }, + submitter: string, + amount: string | number + ) => SubmittableExtrinsic<'promise'> + } +} + +interface Events { + // events to check after the transaction on the native chain + native: { + // events after transferring the native funds to the foreign chain + transfer: EventFilter[] + // events after transferring the foreign funds from the native chain to the foreign chain + withdraw: EventFilter[] + // events after receiving the native funds from the foreign chain + receive: { + // events after receiving the native funds from the foreign chain + native: EventFilter[] + // events after receiving the foreign funds from the foreign chain + foreign: EventFilter[] + } + } + // events to check after the transaction on the foreign chain + foreign: { + // events after transferring the foreign funds to the native chain + transfer: EventFilter[] + // events after transferring the native funds from the foreign chain to the native chain + withdraw: EventFilter[] + receive: { + // events after receiving the native funds from the native chain on the foreign chain + native: EventFilter[] + // events after receiving the foreign funds from the native chain on the foreign chain + foreign: EventFilter[] + } + } +} + +interface TxContext { + // amount of funds to transfer + balanceToTransfer: { + // amount of native currency to transfer + native: bigint + // amount of foreign currency to transfer + foreign: bigint + } + // transactions to execute + tx: Transactions + // events to check after the transaction + events: Events +} + +interface TestConfiguration { + config: BasicConfig + query: Query + txContext: TxContext + // account to use for the transactions + account: KeyringPair + // Kilt sovereign account used for invariant checks. + sovereignAccount: string +} + +export const testCases: TestConfiguration[] = [ + { + config: { + desc: 'V4 LIVE', + network: { + relay: { option: mainChains.polkadot.getConfig({}), setUpTx: [], storage: {} }, + parachains: [ + { + option: mainChains.kilt.getConfig({}), + storage: mainChains.kilt.storage.assignNativeTokensToAccounts( + [keysAlice.address], + initialBalanceKILT + ), + setUpTx: [], + }, + + { + option: mainChains.assetHub.getConfig({}), + storage: { + // Assign some coins to create the account. + ...mainChains.assetHub.storage.assignNativeTokensToAccountsAsStorage([keysAlice.address]), + // Create the eKilts. + ...mainChains.assetHub.storage.createForeignAsset(keysBob.address), + }, + setUpTx: [], + }, + ], + }, + }, + account: keysAlice, + query: { + native: { + nativeFunds: query.balances, + foreignFunds: query.fungibles(mainChains.assetHub.chainInfo.nativeTokenLocation), + }, + foreign: { + nativeFunds: query.balances, + foreignFunds: query.foreignAssets(mainChains.assetHub.chainInfo.eKiltLocation), + }, + }, + txContext: { + tx: { + native: { + transfer: tx.switchPallet.switchV4(), + withdraw: tx.xcmPallet.transferAssetsUsingTypeAndThenV4( + tx.xcmPallet.parachainV4(1, mainChains.kilt.chainInfo.paraId), + mainChains.assetHub.chainInfo.eKiltLocation, + getXcmMessageV4ToSendEkilt(keysAlice.address) + ), + }, + foreign: { + transfer: tx.xcmPallet.limitedReserveTransferAssetsV4( + mainChains.assetHub.chainInfo.nativeTokenLocation, + tx.xcmPallet.parachainV4(1, mainChains.kilt.chainInfo.paraId) + ), + withdraw: tx.xcmPallet.transferAssetsV4( + tx.xcmPallet.parachainV4(1, mainChains.assetHub.chainInfo.paraId), + mainChains.assetHub.chainInfo.nativeTokenLocation + ), + }, + }, + events: { + native: { + transfer: [ + { section: 'assetSwitchPool1', method: 'LocalToRemoteSwitchExecuted' }, + { section: 'fungibles', method: 'Burned' }, + ], + + receive: { + native: [{ section: 'assetSwitchPool1', method: 'RemoteToLocalSwitchExecuted' }], + foreign: [{ section: 'fungibles', method: 'Issued' }], + }, + withdraw: [{ section: 'polkadotXcm', method: 'Sent' }, 'fungibles'], + }, + + foreign: { + transfer: [{ section: 'polkadotXcm', method: 'Sent' }], + receive: { + foreign: ['foreignAssets', { section: 'messageQueue', method: 'Processed' }], + native: [ + { section: 'balances', method: 'Burned' }, + { section: 'balances', method: 'Minted' }, + ], + }, + withdraw: [{ section: 'polkadotXcm', method: 'Sent' }], + }, + }, + balanceToTransfer: { + native: BigInt(1e15), + foreign: BigInt(1e10), + }, + }, + sovereignAccount: mainChains.kilt.chainInfo.sovereignAccountOnSiblingChains, + }, +] as const diff --git a/integration-tests/chopsticks/src/tests/switchPallet/fullFlow/index.test.ts b/integration-tests/chopsticks/src/tests/switchPallet/fullFlow/index.test.ts new file mode 100644 index 0000000000..cfcc38cc7e --- /dev/null +++ b/integration-tests/chopsticks/src/tests/switchPallet/fullFlow/index.test.ts @@ -0,0 +1,228 @@ +import { describe, beforeEach, it, afterEach } from 'vitest' +import { sendTransaction, withExpect } from '@acala-network/chopsticks-testing' +import type { KeyringPair } from '@polkadot/keyring/types' + +import { createBlock } from '../../../network/utils.js' +import { calculateTxFees, getPaidXcmFees, hexAddress } from '../../../helper/utils.js' +import { testCases } from './config.js' +import { Config } from '../../../network/types.js' +import { checkSwitchPalletInvariant } from '../index.js' +import { spinUpNetwork, tearDownNetwork } from '../../utils.js' + +describe.each(testCases)( + 'Switch KILTs full flow', + + ({ account, query, txContext, config, sovereignAccount }) => { + let nativeContext: Config + let foreignContext: Config + let relayContext: Config + let senderAccount: KeyringPair + const { desc } = config + + // Create the network context + beforeEach(async () => { + const { parachainContexts, relayChainContext } = await spinUpNetwork(config) + nativeContext = parachainContexts[0] + foreignContext = parachainContexts[1] + relayContext = relayChainContext + senderAccount = account + }) + + // Shut down the network + afterEach(async () => await tearDownNetwork([nativeContext, foreignContext, relayContext])) + + it(desc, async ({ expect }) => { + const { checkEvents, checkSystemEvents } = withExpect(expect) + const { tx, balanceToTransfer, events } = txContext + const foreignFundsBeforeTx = await query.foreign.nativeFunds(foreignContext, senderAccount.address) + + //action + // 1. send foreign tokens from foreign chain to native chain + const txSendForeignAsset = tx.foreign.transfer( + foreignContext, + hexAddress(senderAccount.address), + balanceToTransfer.foreign.toString() + ) + + const events1 = await sendTransaction(txSendForeignAsset.signAsync(senderAccount)) + + // process tx + await createBlock(foreignContext) + // process xcm message + await createBlock(nativeContext) + + // check balance movement + const txFees = await calculateTxFees(txSendForeignAsset, senderAccount) + + const foreignFundsAfterTx = await query.foreign.nativeFunds(foreignContext, senderAccount.address) + + const xcmFees = await getPaidXcmFees(foreignContext.api, await events1.events) + + expect(foreignFundsBeforeTx - balanceToTransfer.foreign - txFees - xcmFees).toBe(foreignFundsAfterTx) + + // check events + await Promise.all( + events.foreign.transfer.map((pallet) => + checkEvents(events1, pallet).toMatchSnapshot( + `transfer foreign funds from foreign chain ${JSON.stringify(pallet)}` + ) + ) + ) + + await Promise.all( + events.native.receive.foreign.map((pallet) => + checkSystemEvents(nativeContext, pallet).toMatchSnapshot( + `receive foreign funds on native chain ${JSON.stringify(pallet)}` + ) + ) + ) + + // 2. send native tokens + const nativeBalanceBeforeTx = await query.native.nativeFunds(nativeContext, senderAccount.address) + + // Send funds from native to foreign chainbalanceToTransferBackForeignparaId + const txSendNativeAsset = tx.native.transfer( + nativeContext, + hexAddress(senderAccount.address), + balanceToTransfer.native.toString() + ) + + const events2 = await sendTransaction(txSendNativeAsset.signAsync(senderAccount)) + // process tx + await createBlock(nativeContext) + // process xcm message + await createBlock(foreignContext) + + // check balance movement + + const txFees2 = await calculateTxFees(txSendNativeAsset, senderAccount) + + const nativeBalanceAfterTx = await query.native.nativeFunds(nativeContext, senderAccount.address) + + expect(nativeBalanceBeforeTx - balanceToTransfer.native - txFees2).toBe(nativeBalanceAfterTx) + + // check events + await Promise.all( + events.native.transfer.map((pallet) => + checkEvents(events2, pallet).toMatchSnapshot( + `Transfer native funds to foreign chain ${JSON.stringify(pallet)}` + ) + ) + ) + + await Promise.all( + events.foreign.receive.native.map((pallet) => + checkSystemEvents(foreignContext, pallet).toMatchSnapshot( + `Receive native funds on foreign chain ${JSON.stringify(pallet)}` + ) + ) + ) + + await checkSwitchPalletInvariant( + expect, + nativeContext, + foreignContext, + sovereignAccount, + query.native.nativeFunds, + query.foreign.foreignFunds + ) + + // 3. send native tokens back to sender chain. + const balanceToTransferBack = balanceToTransfer.native / 2n + + const nativeBalanceForeignChainBeforeTx = await query.foreign.foreignFunds( + foreignContext, + hexAddress(senderAccount.address) + ) + + const signedTx3 = tx.native + .withdraw(foreignContext, balanceToTransferBack.toString()) + .signAsync(senderAccount) + + const events3 = await sendTransaction(signedTx3) + + // process tx + await createBlock(foreignContext) + // process xcm message + await createBlock(nativeContext) + + // check balance movement + + const nativeBalanceForeignChainAfterTx = await query.foreign.foreignFunds( + foreignContext, + senderAccount.address + ) + + expect(nativeBalanceForeignChainBeforeTx - balanceToTransferBack).toBe(nativeBalanceForeignChainAfterTx) + + // check events + + await Promise.all( + events.foreign.withdraw.map((pallet) => + checkEvents(events3, pallet).toMatchSnapshot( + `Withdraw native funds on foreign chain ${JSON.stringify(pallet)}` + ) + ) + ) + + await Promise.all( + events.native.receive.native.map((pallet) => + checkSystemEvents(nativeContext, pallet).toMatchSnapshot( + `Receive native funds on native chain ${JSON.stringify(pallet)}` + ) + ) + ) + + // finalize the switch. Create a another block to process the query xcm message + await createBlock(nativeContext) + await checkSwitchPalletInvariant( + expect, + nativeContext, + foreignContext, + sovereignAccount, + query.native.nativeFunds, + query.foreign.foreignFunds + ) + + // 4. send foreign token back + + const balanceToTransferBackForeign = balanceToTransfer.foreign / 10n + + const foreignBalanceBeforeTx = await query.native.foreignFunds(nativeContext, senderAccount.address) + + const signedTx4 = tx.foreign + .withdraw(nativeContext, hexAddress(senderAccount.address), balanceToTransferBackForeign.toString()) + .signAsync(senderAccount) + + const events4 = await sendTransaction(signedTx4) + + // process tx + await createBlock(nativeContext) + + // process xcm message + await createBlock(foreignContext) + + // check balance movement + const foreignBalanceAfterTx = await query.native.foreignFunds(nativeContext, senderAccount.address) + expect(foreignBalanceBeforeTx - balanceToTransferBackForeign).toBe(foreignBalanceAfterTx) + + // check events + + await Promise.all( + events.native.withdraw.map((pallet) => + checkEvents(events4, pallet).toMatchSnapshot( + `Withdraw foreign funds on native chain ${JSON.stringify(pallet)}` + ) + ) + ) + + await Promise.all( + events.foreign.receive.native.map((pallet) => + checkSystemEvents(foreignContext, pallet).toMatchSnapshot( + `Receive foreign funds on foreign chain ${JSON.stringify(pallet)}` + ) + ) + ) + }) + } +) diff --git a/integration-tests/chopsticks/src/tests/switchPallet/fullFlowSwitch.test.ts b/integration-tests/chopsticks/src/tests/switchPallet/fullFlowSwitch.test.ts deleted file mode 100644 index 2792fc9252..0000000000 --- a/integration-tests/chopsticks/src/tests/switchPallet/fullFlowSwitch.test.ts +++ /dev/null @@ -1,181 +0,0 @@ -import { test } from 'vitest' - -import * as PeregrineConfig from '../../network/peregrine.js' -import * as AssetHubConfig from '../../network/assetHub.js' -import { - KILT, - ROC, - getAssetSwitchParameters, - initialBalanceKILT, - initialBalanceROC, - keysAlice, - keysCharlie, -} from '../../utils.js' -import { - peregrineContext, - getFreeBalancePeregrine, - getFreeRocPeregrine, - getFreeEkiltAssetHub, - assethubContext, -} from '../index.js' -import { - checkBalance, - createBlock, - setStorage, - hexAddress, - checkBalanceInRange, - getXcmMessageV4ToSendEkilt, - checkSwitchPalletInvariant, - checkBalanceMovementIncomingSwitch, -} from '../utils.js' -import { getAccountLocationV4, getRelayNativeAssetIdLocationV4, getSiblingLocationV4 } from '../../network/utils.js' -import { sendTransaction, withExpect } from '@acala-network/chopsticks-testing' - -/** - * Full e2e flow between Peregrine and AssetHub. More checks are provided in individual test cases. - * - * 1. Send ROCs from AssetHub to Peregrine - * 2. Switch KILTs on Peregrine - * 3. Send eKILTs back to AssetHub - * 4. Send ROCs back to AssetHub - */ -test('Full e2e tests', async ({ expect }) => { - const { checkEvents } = withExpect(expect) - - // 10 % of relay tokens are used as fees - const feeAmount = (ROC * BigInt(10)) / BigInt(100) - - const remoteAssetId = { V4: AssetHubConfig.eKiltLocation } - const remoteXcmFeeId = { V4: { id: AssetHubConfig.nativeTokenLocation, fun: { Fungible: feeAmount } } } - const remoteReserveLocation = getSiblingLocationV4(AssetHubConfig.paraId) - - await setStorage(peregrineContext, { - ...PeregrineConfig.assignNativeTokensToAccounts([keysAlice.address], initialBalanceKILT), - ...PeregrineConfig.createAndAssignRocs(keysCharlie.address, []), - ...PeregrineConfig.setSafeXcmVersion4(), - }) - - const switchParameters = getAssetSwitchParameters() - - await setStorage( - peregrineContext, - PeregrineConfig.setSwitchPair(switchParameters, remoteAssetId, remoteXcmFeeId, remoteReserveLocation) - ) - - await setStorage(assethubContext, { - ...AssetHubConfig.assignDotTokensToAccountsAsStorage( - [keysAlice.address, PeregrineConfig.sovereignAccountAsSibling], - initialBalanceROC - ), - ...AssetHubConfig.createForeignAsset(keysCharlie.address), - }) - await setStorage( - assethubContext, - AssetHubConfig.assignForeignAssetToAccounts([ - [PeregrineConfig.sovereignAccountAsSibling, switchParameters.sovereignSupply], - ]) - ) - // 1. send ROCs 2 Peregrine - - const peregrineDestination = getSiblingLocationV4(PeregrineConfig.paraId) - const beneficiary = getAccountLocationV4(hexAddress(keysAlice.address)) - const rocAsset = { V4: [getRelayNativeAssetIdLocationV4((ROC * BigInt(2)).toString())] } - - const signedTx1 = assethubContext.api.tx.polkadotXcm - .limitedReserveTransferAssets(peregrineDestination, beneficiary, rocAsset, 0, 'Unlimited') - .signAsync(keysAlice) - - // Send the transaction and create a block0 - await sendTransaction(signedTx1) - await createBlock(assethubContext) - - // process msg. - await createBlock(peregrineContext) - // Alice should have some Rocs on Peregrine - const aliceRocBalance = await getFreeRocPeregrine(keysAlice.address) - expect(aliceRocBalance).toBeGreaterThan(BigInt(0)) - - await checkSwitchPalletInvariant(expect) - - // 2. switch KILTs - const balanceToTransfer = initialBalanceKILT / BigInt(2) - const signedTx2 = peregrineContext.api.tx.assetSwitchPool1 - .switch(balanceToTransfer.toString(), beneficiary) - .signAsync(keysAlice) - - const events1 = await sendTransaction(signedTx2) - - await createBlock(peregrineContext) - await checkEvents(events1, 'assetSwitchPool1').toMatchSnapshot( - 'receiver Peregrine::assetSwitchPool1::[LocalToRemoteSwitchExecuted]' - ) - - await createBlock(assethubContext) - await checkBalance(getFreeEkiltAssetHub, keysAlice.address, expect, balanceToTransfer) - - await checkSwitchPalletInvariant(expect) - - // 3. send eKILTs back - const dest = getSiblingLocationV4(PeregrineConfig.paraId) - const remoteFeeId = { V4: AssetHubConfig.eKiltLocation } - const funds = { - V4: [ - { - id: AssetHubConfig.eKiltLocation, - fun: { Fungible: balanceToTransfer }, - }, - ], - } - - const signedTx3 = assethubContext.api.tx.polkadotXcm - .transferAssetsUsingTypeAndThen( - dest, - funds, - 'LocalReserve', - remoteFeeId, - 'LocalReserve', - getXcmMessageV4ToSendEkilt(keysAlice.address), - 'Unlimited' - ) - .signAsync(keysAlice) - - const events2 = await sendTransaction(signedTx3) - - await createBlock(assethubContext) - await checkBalance(getFreeEkiltAssetHub, keysAlice.address, expect, BigInt(0)) - // assets should move from Sovereign account to user. - await checkEvents(events2, { section: 'foreignAssets', method: 'Transferred' }).toMatchSnapshot( - 'sender AssetHub::foreignAssets::[Transferred]' - ) - - await createBlock(peregrineContext) - await checkBalanceInRange(getFreeBalancePeregrine, keysAlice.address, expect, [ - BigInt(74) * KILT, - BigInt(75) * KILT, - ]) - - await checkSwitchPalletInvariant(expect) - await checkBalanceMovementIncomingSwitch(balanceToTransfer, expect, keysAlice.address) - - // 4. send ROCs back - - const assetHubDestination = getSiblingLocationV4(AssetHubConfig.paraId) - const assets = { V4: [getRelayNativeAssetIdLocationV4(ROC.toString())] } - - const signedTx4 = peregrineContext.api.tx.polkadotXcm - .transferAssets(assetHubDestination, beneficiary, assets, 0, 'Unlimited') - .signAsync(keysAlice) - - const events3 = await sendTransaction(signedTx4) - await createBlock(peregrineContext) - - // The xcm message should be send to AH and the funds should be burned from user. - await checkEvents(events3, 'fungibles').toMatchSnapshot('sender Peregrine::fungibles::[Burned]') - - expect(await getFreeRocPeregrine(keysAlice.address)).toBe(BigInt(899999965317)) - - // Process the message on AH - await createBlock(assethubContext) - - await checkSwitchPalletInvariant(expect) -}, 20_000) diff --git a/integration-tests/chopsticks/src/tests/switchPallet/fungibles/dusted/__snapshots__/index.test.ts.snap b/integration-tests/chopsticks/src/tests/switchPallet/fungibles/dusted/__snapshots__/index.test.ts.snap new file mode 100644 index 0000000000..c8ea680f5a --- /dev/null +++ b/integration-tests/chopsticks/src/tests/switchPallet/fungibles/dusted/__snapshots__/index.test.ts.snap @@ -0,0 +1,28 @@ +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html + +exports[`Dust account > V4 LIVE > Dusted accounts pallet: {"section":"balances","method":"Endowed"} 1`] = ` +[ + { + "data": { + "account": "4rsmbFBYpVmWE2LHRsSZKxf22a8cbJLxMZqvVGkGkSDmDBcr", + "freeBalance": "(rounded 100000000000000000)", + }, + "method": "Endowed", + "section": "balances", + }, +] +`; + +exports[`Dust account > V4 LIVE > Dusted accounts pallet: {"section":"balances","method":"Transfer"} 1`] = ` +[ + { + "data": { + "amount": "(rounded 100000000000000000)", + "from": "4seWojfEHrk5YKPahdErazQ3CWEHZYi6NV4gKz5AaejWbRPJ", + "to": "4rsmbFBYpVmWE2LHRsSZKxf22a8cbJLxMZqvVGkGkSDmDBcr", + }, + "method": "Transfer", + "section": "balances", + }, +] +`; diff --git a/integration-tests/chopsticks/src/tests/switchPallet/fungibles/dusted/config.ts b/integration-tests/chopsticks/src/tests/switchPallet/fungibles/dusted/config.ts new file mode 100644 index 0000000000..c97a2caf4c --- /dev/null +++ b/integration-tests/chopsticks/src/tests/switchPallet/fungibles/dusted/config.ts @@ -0,0 +1,70 @@ +import type { EventFilter } from '@acala-network/chopsticks-testing' +import type { ApiPromise } from '@polkadot/api' +import type { SubmittableExtrinsic } from '@polkadot/api/types' +import type { KeyringPair } from '@polkadot/keyring/types' + +import { initialBalanceDOT, initialBalanceKILT, keysAlice, keysBob } from '../../../../helper/utils.js' +import { mainChains } from '../../../../network/index.js' +import { tx, query } from '../../../../helper/api.js' +import type { BasicConfig } from '../../../types.js' + +interface Query { + native: ({ api }: { api: ApiPromise }, address: string) => Promise + foreign: ({ api }: { api: ApiPromise }, address: string) => Promise +} + +interface TxContext { + balanceToTransfer: bigint + tx: ({ api }: { api: ApiPromise }, destination: string, amount: string) => SubmittableExtrinsic<'promise'> + events: EventFilter[] +} + +interface TestConfiguration { + config: BasicConfig + query: Query + txContext: TxContext + account: { + sender: KeyringPair + receiver: KeyringPair + } +} + +export const testCases: TestConfiguration[] = [ + { + config: { + desc: 'V4 LIVE', + network: { + relay: { option: mainChains.polkadot.getConfig({}), storage: {}, setUpTx: [] }, + parachains: [ + { + option: mainChains.kilt.getConfig({}), + storage: { + ...mainChains.kilt.storage.assignNativeTokensToAccounts( + [keysAlice.address], + initialBalanceKILT + ), + ...mainChains.kilt.storage.assignRelayTokensToAccounts( + [keysAlice.address], + initialBalanceDOT + ), + }, + setUpTx: [], + }, + ], + }, + }, + account: { sender: keysAlice, receiver: keysBob }, + query: { + native: query.balances, + foreign: query.fungibles(mainChains.assetHub.chainInfo.nativeTokenLocation), + }, + txContext: { + tx: tx.balances.transferAllowDeath, + events: [ + { section: 'balances', method: 'Transfer' }, + { section: 'balances', method: 'Endowed' }, + ], + balanceToTransfer: initialBalanceKILT, + }, + }, +] as const diff --git a/integration-tests/chopsticks/src/tests/switchPallet/fungibles/dusted/index.test.ts b/integration-tests/chopsticks/src/tests/switchPallet/fungibles/dusted/index.test.ts new file mode 100644 index 0000000000..c619f2cc60 --- /dev/null +++ b/integration-tests/chopsticks/src/tests/switchPallet/fungibles/dusted/index.test.ts @@ -0,0 +1,70 @@ +import { describe, beforeEach, it, afterEach } from 'vitest' +import { sendTransaction, withExpect } from '@acala-network/chopsticks-testing' +import type { KeyringPair } from '@polkadot/keyring/types' + +import { createBlock } from '../../../../network/utils.js' +import { calculateTxFees, hexAddress } from '../../../../helper/utils.js' +import { testCases } from './config.js' +import { Config } from '../../../../network/types.js' +import { spinUpNetwork, tearDownNetwork } from '../../../utils.js' + +describe.each(testCases)('Dust account', ({ account, query, txContext, config }) => { + let context: Config + let senderAccount: KeyringPair + let receiverAccount: KeyringPair + + const { desc } = config + + // Create the network context + beforeEach(async () => { + const { parachainContexts } = await spinUpNetwork(config) + context = parachainContexts[0] + senderAccount = account.sender + receiverAccount = account.receiver + }) + + // Shut down the network + afterEach(async () => await tearDownNetwork([context])) + + it(desc, async ({ expect }) => { + const { checkSystemEvents } = withExpect(expect) + const { balanceToTransfer, events, tx } = txContext + + // Pre condition checks + const nativeBalance = await query.native(context, senderAccount.address) + const foreignBalance = await query.foreign(context, senderAccount.address) + const receiverNativeBalance = await query.native(context, receiverAccount.address) + + expect(nativeBalance).toBe(balanceToTransfer) + expect(foreignBalance).toBeGreaterThan(0n) + expect(receiverNativeBalance).toBe(0n) + + // action + let rawTx = tx(context, hexAddress(receiverAccount.address), balanceToTransfer.toString()) + const txFees = await calculateTxFees(rawTx, senderAccount) + rawTx = tx(context, hexAddress(receiverAccount.address), (balanceToTransfer - txFees).toString()) + + await sendTransaction(rawTx.signAsync(senderAccount)) + + // process tx + await createBlock(context) + + // post condition checks + + // check balance movement + const nativeBalanceAfter = await query.native(context, senderAccount.address) + const foreignBalanceAfter = await query.foreign(context, senderAccount.address) + const receiverNativeBalanceAfter = await query.native(context, receiverAccount.address) + + expect(nativeBalanceAfter).toBe(0n) + // sender should keep the foreign balance + expect(foreignBalanceAfter).toBeGreaterThan(0n) + expect(receiverNativeBalanceAfter).toBe(balanceToTransfer - txFees) + + await Promise.all( + events.map((pallet) => + checkSystemEvents(context, pallet).toMatchSnapshot(`Dusted accounts pallet: ${JSON.stringify(pallet)}`) + ) + ) + }) +}) diff --git a/integration-tests/chopsticks/src/tests/switchPallet/index.ts b/integration-tests/chopsticks/src/tests/switchPallet/index.ts new file mode 100644 index 0000000000..e15fc9c079 --- /dev/null +++ b/integration-tests/chopsticks/src/tests/switchPallet/index.ts @@ -0,0 +1,191 @@ +import { ExpectStatic } from 'vitest' +import { ApiPromise } from '@polkadot/api' +import { SetupConfig } from '@acala-network/chopsticks-testing' + +import { hexAddress } from '../../helper/utils.js' + +export function getXcmMessageV4ToSendEkilt(address: string) { + return { + V4: [ + { + DepositAsset: { + assets: { Wild: 'All' }, + beneficiary: { + parents: 0, + interior: { + X1: [ + { + AccountId32: { + id: hexAddress(address), + }, + }, + ], + }, + }, + }, + }, + ], + } +} + +export function getDepositXcmMessageV3(assetId: object) { + return (balanceToTransfer: string, receiver: string) => ({ + V3: [ + { + ReserveAssetDeposited: [ + { + id: { Concrete: assetId }, + fun: { Fungible: balanceToTransfer }, + }, + ], + }, + 'ClearOrigin', + { + BuyExecution: { + fees: { + id: { Concrete: assetId }, + fun: { Fungible: balanceToTransfer }, + }, + weightLimit: 'Unlimited', + }, + }, + { + DepositAsset: { + assets: { Wild: 'All' }, + beneficiary: { + parents: 0, + interior: { + X1: { + AccountId32: { + id: hexAddress(receiver), + }, + }, + }, + }, + }, + }, + ], + }) +} + +export function getXcmV4ReclaimMessage(assetId: object) { + return (amount: string, receiver: string) => ({ + V4: [ + { WithdrawAsset: [{ id: { parents: 0, interior: 'Here' }, fun: { Fungible: amount } }] }, + { + BuyExecution: { + weightLimit: 'Unlimited', + fees: { id: { parents: 0, interior: 'Here' }, fun: { Fungible: amount } }, + }, + }, + { + ClaimAsset: { + // Specify xcm version 4 + ticket: { parents: 0, interior: { X1: [{ GeneralIndex: 4 }] } }, + assets: [ + { + id: assetId, + fun: { Fungible: amount }, + }, + ], + }, + }, + { + DepositAsset: { + assets: { Wild: 'All' }, + beneficiary: { + parents: 0, + interior: { + X1: [ + { + AccountId32: { + id: hexAddress(receiver), + }, + }, + ], + }, + }, + }, + }, + ], + }) +} + +export async function checkSwitchPalletInvariant( + expect: ExpectStatic, + nativeContext: SetupConfig, + foreignContext: SetupConfig, + sovereignAccount: string, + queryNativeBalance: ({ api }: { api: ApiPromise }, address: string) => Promise, + queryForeignBalance: ({ api }: { api: ApiPromise }, address: string) => Promise, + deltaStoredSovereignSupply = 0n +) { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + const switchPairInfo: any = await nativeContext.api.query.assetSwitchPool1.switchPair() + if (switchPairInfo.isNone) { + return + } + + // check pool account balance + const switchPoolAccount = switchPairInfo.unwrap().poolAccount + + const poolAccountBalance = await queryNativeBalance(nativeContext, switchPoolAccount) + + const sovereignEKiltSupply = await queryForeignBalance(foreignContext, sovereignAccount) + + const remoteAssetSovereignTotalBalance = switchPairInfo.unwrap().remoteAssetSovereignTotalBalance.toBigInt() + const remoteAssetCirculatingSupply = switchPairInfo.unwrap().remoteAssetCirculatingSupply.toBigInt() + const remoteAssetTotalSupply = switchPairInfo.unwrap().remoteAssetTotalSupply.toBigInt() + + const lockedBalanceFromTotalAndCirculating = remoteAssetTotalSupply - remoteAssetCirculatingSupply + + // Check pool account has enough funds to cover the circulating supply + + // everybody can send funds to the pool account. The pool account should have at least the circulating supply + expect(poolAccountBalance).toBeGreaterThanOrEqual(remoteAssetCirculatingSupply) + expect(remoteAssetSovereignTotalBalance).toBe(lockedBalanceFromTotalAndCirculating) + expect(sovereignEKiltSupply).toBe(remoteAssetSovereignTotalBalance + deltaStoredSovereignSupply) +} + +export async function getPoolAccount({ api }: { api: ApiPromise }) { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + const switchPairInfo: any = await api.query.assetSwitchPool1.switchPair() + if (switchPairInfo.isNone) { + return + } + return switchPairInfo.unwrap().poolAccount +} + +export async function getRemoteLockedSupply({ api }: { api: ApiPromise }): Promise { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + const switchPairInfo: any = await api.query.assetSwitchPool1.switchPair() + + if (switchPairInfo.isNone) { + return 0n + } + + return switchPairInfo.unwrap().remoteAssetSovereignTotalBalance.toBigInt() +} + +export async function getReceivedNativeTokens({ api }: { api: ApiPromise }): Promise { + const events = await api.query.system.events() + + const polkadotFees = events.find((event) => api.events.assetSwitchPool1.RemoteToLocalSwitchExecuted.is(event.event)) + + if (!polkadotFees) { + throw new Error('RemoteToLocalSwitchExecuted event not found') + } + + // eslint-disable-next-line @typescript-eslint/no-explicit-any + return (polkadotFees as any).event.data.amount.toBigInt() +} + +export async function isSwitchPaused({ api }: { api: ApiPromise }): Promise { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + const switchPairInfo: any = await api.query.assetSwitchPool1.switchPair() + if (switchPairInfo.isNone) { + return false + } + + return switchPairInfo.unwrap().status.isPaused +} diff --git a/integration-tests/chopsticks/src/tests/xcm/assetHub/peregrine/__snapshots__/limitedReserveTransferRelayPeregrine.test.ts.snap b/integration-tests/chopsticks/src/tests/switchPallet/pause/sendRelayToken/__snapshots__/index.test.ts.snap similarity index 59% rename from integration-tests/chopsticks/src/tests/xcm/assetHub/peregrine/__snapshots__/limitedReserveTransferRelayPeregrine.test.ts.snap rename to integration-tests/chopsticks/src/tests/switchPallet/pause/sendRelayToken/__snapshots__/index.test.ts.snap index fbfb8c0f04..4de9cbd620 100644 --- a/integration-tests/chopsticks/src/tests/xcm/assetHub/peregrine/__snapshots__/limitedReserveTransferRelayPeregrine.test.ts.snap +++ b/integration-tests/chopsticks/src/tests/switchPallet/pause/sendRelayToken/__snapshots__/index.test.ts.snap @@ -1,65 +1,42 @@ // Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html -exports[`Send DOTs from Relay 2 Peregrine > receiver Peregrine::messageQueue::[ProcessingFailed] 1`] = ` +exports[`Send Relay token while switch paused > V4 LIVE > receive relay chain funds on receiver chain {"section":"polkadotXcm","method":"AssetsTrapped"} 1`] = ` [ { "data": { - "error": "Unsupported", - "id": "(hash)", - "origin": "Parent", - }, - "method": "ProcessingFailed", - "section": "messageQueue", - }, -] -`; - -exports[`Send DOTs from Relay 2 Peregrine > sender Rococo::xcmPallet::[XcmMessageSent] 1`] = ` -[ - { - "data": { - "outcome": { - "Complete": { - "used": { - "proofSize": "(rounded 6200)", - "refTime": "(rounded 300000000)", + "assets": { + "V4": [ + { + "fun": { + "Fungible": 10000000000, + }, + "id": { + "interior": "Here", + "parents": 1, + }, }, - }, + ], }, - }, - "method": "Attempted", - "section": "xcmPallet", - }, - { - "data": { - "fees": [ - { - "fun": { - "Fungible": "(rounded 130000000)", - }, - "id": { - "interior": "Here", - "parents": 0, - }, - }, - ], - "paying": { + "hash_": "(hash)", + "origin": { "interior": { "X1": [ { - "AccountId32": { - "id": "(hash)", - "network": "Rococo", - }, + "Parachain": 1000, }, ], }, - "parents": 0, + "parents": 1, }, }, - "method": "FeesPaid", - "section": "xcmPallet", + "method": "AssetsTrapped", + "section": "polkadotXcm", }, +] +`; + +exports[`Send Relay token while switch paused > V4 LIVE > send funds from relay chain {"section":"polkadotXcm","method":"Sent"} 1`] = ` +[ { "data": { "destination": { @@ -70,14 +47,14 @@ exports[`Send DOTs from Relay 2 Peregrine > sender Rococo::xcmPallet::[XcmMessag }, ], }, - "parents": 0, + "parents": 1, }, "message": [ { "ReserveAssetDeposited": [ { "fun": { - "Fungible": 50000000000000, + "Fungible": 10000000000, }, "id": { "interior": "Here", @@ -91,7 +68,7 @@ exports[`Send DOTs from Relay 2 Peregrine > sender Rococo::xcmPallet::[XcmMessag "BuyExecution": { "fees": { "fun": { - "Fungible": 50000000000000, + "Fungible": 10000000000, }, "id": { "interior": "Here", @@ -131,7 +108,7 @@ exports[`Send DOTs from Relay 2 Peregrine > sender Rococo::xcmPallet::[XcmMessag { "AccountId32": { "id": "(hash)", - "network": "Rococo", + "network": "Polkadot", }, }, ], @@ -140,7 +117,7 @@ exports[`Send DOTs from Relay 2 Peregrine > sender Rococo::xcmPallet::[XcmMessag }, }, "method": "Sent", - "section": "xcmPallet", + "section": "polkadotXcm", }, ] `; diff --git a/integration-tests/chopsticks/src/tests/switchPallet/pause/sendRelayToken/config.ts b/integration-tests/chopsticks/src/tests/switchPallet/pause/sendRelayToken/config.ts new file mode 100644 index 0000000000..f60ba08b62 --- /dev/null +++ b/integration-tests/chopsticks/src/tests/switchPallet/pause/sendRelayToken/config.ts @@ -0,0 +1,91 @@ +import type { EventFilter } from '@acala-network/chopsticks-testing' +import type { ApiPromise } from '@polkadot/api' +import type { SubmittableExtrinsic } from '@polkadot/api/types' +import type { KeyringPair } from '@polkadot/keyring/types' + +import { DOT, initialBalanceKILT, keysAlice } from '../../../../helper/utils.js' +import { mainChains } from '../../../../network/index.js' +import { tx, query } from '../../../../helper/api.js' +import type { BasicConfig } from '../../../types.js' + +interface Query { + sender: ({ api }: { api: ApiPromise }, address: string) => Promise + + receiver: ({ api }: { api: ApiPromise }, address: string) => Promise +} + +interface Events { + // events to check after the transaction on the native chain + sender: EventFilter[] + // events to check after the transaction on the foreign chain + receiver: EventFilter[] +} + +interface TxContext { + // amount of funds to transfer + balanceToTransfer: bigint + // transactions to execute + tx: ({ api }: { api: ApiPromise }, submitter: string, amount: string | number) => SubmittableExtrinsic<'promise'> + // events to check after the transaction + events: Events +} + +interface TestConfiguration { + config: BasicConfig + query: Query + txContext: TxContext + account: KeyringPair +} + +export const testCases: TestConfiguration[] = [ + { + config: { + desc: 'V4 LIVE', + network: { + relay: { option: mainChains.polkadot.getConfig({}), storage: {}, setUpTx: [] }, + parachains: [ + { + option: mainChains.assetHub.getConfig({}), + storage: mainChains.assetHub.storage.assignNativeTokensToAccountsAsStorage([keysAlice.address]), + setUpTx: [], + }, + { + option: mainChains.kilt.getConfig({}), + + storage: mainChains.kilt.storage.assignNativeTokensToAccounts( + [keysAlice.address], + initialBalanceKILT + ), + setUpTx: [tx.switchPallet.pause()], + }, + ], + }, + }, + account: keysAlice, + query: { + sender: query.balances, + receiver: query.fungibles(mainChains.assetHub.chainInfo.nativeTokenLocation), + }, + txContext: { + balanceToTransfer: DOT, + tx: tx.xcmPallet.limitedReserveTransferAssetsV4( + mainChains.assetHub.chainInfo.nativeTokenLocation, + tx.xcmPallet.parachainV4(1, mainChains.kilt.chainInfo.paraId) + ), + events: { + sender: [ + { + section: 'polkadotXcm', + method: 'Sent', + }, + ], + receiver: [ + { + section: 'polkadotXcm', + method: 'AssetsTrapped', + }, + ], + }, + }, + }, +] diff --git a/integration-tests/chopsticks/src/tests/switchPallet/pause/sendRelayToken/index.test.ts b/integration-tests/chopsticks/src/tests/switchPallet/pause/sendRelayToken/index.test.ts new file mode 100644 index 0000000000..5c36539e87 --- /dev/null +++ b/integration-tests/chopsticks/src/tests/switchPallet/pause/sendRelayToken/index.test.ts @@ -0,0 +1,84 @@ +import { describe, beforeEach, test, afterEach } from 'vitest' +import { sendTransaction, withExpect } from '@acala-network/chopsticks-testing' +import type { KeyringPair } from '@polkadot/keyring/types' + +import { createBlock } from '../../../../network/utils.js' +import { calculateTxFees, getPaidXcmFees, hexAddress } from '../../../../helper/utils.js' +import { testCases } from './config.js' +import { Config } from '../../../../network/types.js' +import { isSwitchPaused } from '../../index.js' +import { spinUpNetwork, tearDownNetwork } from '../../../utils.js' + +describe.each(testCases)( + 'Send Relay token while switch paused', + + ({ account, query, txContext, config }) => { + let senderContext: Config + let receiverContext: Config + let relayContext: Config + let senderAccount: KeyringPair + const { desc } = config + + // Create the network context + beforeEach(async () => { + const { parachainContexts, relayChainContext } = await spinUpNetwork(config) + senderContext = parachainContexts[0] + receiverContext = parachainContexts[1] + relayContext = relayChainContext + senderAccount = account + }) + + // Shut down the network + afterEach(async () => await tearDownNetwork([receiverContext, senderContext, relayContext])) + + test(desc, async ({ expect }) => { + const { checkSystemEvents, checkEvents } = withExpect(expect) + const { tx, balanceToTransfer, events } = txContext + + // pre condition checks + const balanceBeforeTx = await query.receiver(receiverContext, hexAddress(senderAccount.address)) + const balanceBeforeTxSender = await query.sender(senderContext, hexAddress(senderAccount.address)) + expect(balanceBeforeTx).toBe(0n) + expect(balanceBeforeTxSender).toBeGreaterThan(0n) + expect(await isSwitchPaused(receiverContext)).toBe(true) + + // action + const rawTx = tx(senderContext, hexAddress(senderAccount.address), balanceToTransfer.toString()) + const events1 = await sendTransaction(rawTx.signAsync(senderAccount)) + + // process tx + await createBlock(senderContext) + // process msg + await createBlock(receiverContext) + + // post condition checks + // check balance movement on sender chain. + const txFees = await calculateTxFees(rawTx, senderAccount) + const xcmFees = await getPaidXcmFees(senderContext.api, await events1.events) + const balanceAfterTxSender = await query.sender(senderContext, hexAddress(senderAccount.address)) + + expect(balanceAfterTxSender).toBe(balanceBeforeTxSender - balanceToTransfer - txFees - xcmFees) + + // Tx should fail on receiver + const balanceAfterTx = await query.receiver(receiverContext, hexAddress(senderAccount.address)) + expect(balanceAfterTx).toBe(0n) + + // check events + await Promise.all( + events.sender.map((pallet) => + checkEvents(events1, pallet).toMatchSnapshot( + `send funds from relay chain ${JSON.stringify(pallet)}` + ) + ) + ) + + await Promise.all( + events.receiver.map((pallet) => + checkSystemEvents(receiverContext, pallet).toMatchSnapshot( + `receive relay chain funds on receiver chain ${JSON.stringify(pallet)}` + ) + ) + ) + }) + } +) diff --git a/integration-tests/chopsticks/src/tests/switchPallet/pause/switchEkilts/__snapshots__/index.test.ts.snap b/integration-tests/chopsticks/src/tests/switchPallet/pause/switchEkilts/__snapshots__/index.test.ts.snap new file mode 100644 index 0000000000..92e76a9a79 --- /dev/null +++ b/integration-tests/chopsticks/src/tests/switchPallet/pause/switchEkilts/__snapshots__/index.test.ts.snap @@ -0,0 +1,169 @@ +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html + +exports[`Switch eKILTs while paused > V4 LIVE > Switch eKILTs receiver chain {"section":"polkadotXcm","method":"AssetsTrapped"} 1`] = ` +[ + { + "data": { + "assets": { + "V4": [ + { + "fun": { + "Fungible": 1000000000000000, + }, + "id": { + "interior": { + "X2": [ + { + "GlobalConsensus": { + "Ethereum": { + "chainId": 1, + }, + }, + }, + { + "AccountKey20": { + "key": "0x5d3d01fd6d2ad1169b17918eb4f153c6616288eb", + "network": null, + }, + }, + ], + }, + "parents": 2, + }, + }, + ], + }, + "hash_": "(hash)", + "origin": { + "interior": { + "X1": [ + { + "Parachain": 1000, + }, + ], + }, + "parents": 1, + }, + }, + "method": "AssetsTrapped", + "section": "polkadotXcm", + }, +] +`; + +exports[`Switch eKILTs while paused > V4 LIVE > Switch eKILTs sender chain {"section":"polkadotXcm","method":"Sent"} 1`] = ` +[ + { + "data": { + "destination": { + "interior": { + "X1": [ + { + "Parachain": "(rounded 2100)", + }, + ], + }, + "parents": 1, + }, + "message": [ + { + "ReserveAssetDeposited": [ + { + "fun": { + "Fungible": 1000000000000000, + }, + "id": { + "interior": { + "X2": [ + { + "GlobalConsensus": { + "Ethereum": { + "chainId": 1, + }, + }, + }, + { + "AccountKey20": { + "key": "0x5d3d01fd6d2ad1169b17918eb4f153c6616288eb", + "network": null, + }, + }, + ], + }, + "parents": 2, + }, + }, + ], + }, + "ClearOrigin", + { + "BuyExecution": { + "fees": { + "fun": { + "Fungible": 1000000000000000, + }, + "id": { + "interior": { + "X2": [ + { + "GlobalConsensus": { + "Ethereum": { + "chainId": 1, + }, + }, + }, + { + "AccountKey20": { + "key": "0x5d3d01fd6d2ad1169b17918eb4f153c6616288eb", + "network": null, + }, + }, + ], + }, + "parents": 2, + }, + }, + "weightLimit": "Unlimited", + }, + }, + { + "DepositAsset": { + "assets": { + "Wild": "All", + }, + "beneficiary": { + "interior": { + "X1": [ + { + "AccountId32": { + "id": "(hash)", + "network": null, + }, + }, + ], + }, + "parents": 0, + }, + }, + }, + ], + "messageId": "(hash)", + "origin": { + "interior": { + "X1": [ + { + "AccountId32": { + "id": "(hash)", + "network": "Polkadot", + }, + }, + ], + }, + "parents": 0, + }, + }, + "method": "Sent", + "section": "polkadotXcm", + }, +] +`; diff --git a/integration-tests/chopsticks/src/tests/switchPallet/pause/switchEkilts/config.ts b/integration-tests/chopsticks/src/tests/switchPallet/pause/switchEkilts/config.ts new file mode 100644 index 0000000000..574ae27ebb --- /dev/null +++ b/integration-tests/chopsticks/src/tests/switchPallet/pause/switchEkilts/config.ts @@ -0,0 +1,92 @@ +import type { EventFilter } from '@acala-network/chopsticks-testing' +import type { ApiPromise } from '@polkadot/api' +import type { SubmittableExtrinsic } from '@polkadot/api/types' +import type { KeyringPair } from '@polkadot/keyring/types' + +import { initialBalanceKILT, keysAlice, KILT } from '../../../../helper/utils.js' +import { mainChains } from '../../../../network/index.js' +import { tx, query } from '../../../../helper/api.js' +import type { BasicConfig } from '../../../types.js' +import { getXcmMessageV4ToSendEkilt } from '../../index.js' + +interface Query { + sender: ({ api }: { api: ApiPromise }, address: string) => Promise + + receiver: ({ api }: { api: ApiPromise }, address: string) => Promise +} + +interface Events { + // events to check after the transaction on the native chain + sender: EventFilter[] + // events to check after the transaction on the foreign chain + receiver: EventFilter[] +} + +interface TxContext { + // amount of funds to transfer + balanceToTransfer: bigint + // transactions to execute + tx: ({ api }: { api: ApiPromise }, amount: string) => SubmittableExtrinsic<'promise'> + // events to check after the transaction + events: Events +} + +interface TestConfiguration { + config: BasicConfig + query: Query + txContext: TxContext + account: KeyringPair + sovereignAccount: string +} + +export const testCases: TestConfiguration[] = [ + { + config: { + desc: 'V4 LIVE', + network: { + relay: { option: mainChains.polkadot.getConfig({}), setUpTx: [], storage: {} }, + parachains: [ + { + option: mainChains.assetHub.getConfig({}), + storage: { + ...mainChains.assetHub.storage.assignNativeTokensToAccountsAsStorage([keysAlice.address]), + ...mainChains.assetHub.storage.assignForeignAssetToAccounts([ + [keysAlice.address, initialBalanceKILT], + ]), + }, + setUpTx: [], + }, + { option: mainChains.kilt.getConfig({}), storage: {}, setUpTx: [tx.switchPallet.pause()] }, + ], + }, + }, + account: keysAlice, + query: { + sender: query.foreignAssets(mainChains.assetHub.chainInfo.eKiltLocation), + receiver: query.balances, + }, + txContext: { + balanceToTransfer: KILT, + tx: tx.xcmPallet.transferAssetsUsingTypeAndThenV4( + tx.xcmPallet.parachainV4(1, mainChains.kilt.chainInfo.paraId), + mainChains.assetHub.chainInfo.eKiltLocation, + getXcmMessageV4ToSendEkilt(keysAlice.address) + ), + events: { + sender: [ + { + section: 'polkadotXcm', + method: 'Sent', + }, + ], + receiver: [ + { + section: 'polkadotXcm', + method: 'AssetsTrapped', + }, + ], + }, + }, + sovereignAccount: mainChains.kilt.chainInfo.sovereignAccountOnSiblingChains, + }, +] diff --git a/integration-tests/chopsticks/src/tests/switchPallet/pause/switchEkilts/index.test.ts b/integration-tests/chopsticks/src/tests/switchPallet/pause/switchEkilts/index.test.ts new file mode 100644 index 0000000000..0efad94105 --- /dev/null +++ b/integration-tests/chopsticks/src/tests/switchPallet/pause/switchEkilts/index.test.ts @@ -0,0 +1,90 @@ +import { describe, beforeEach, it, afterEach } from 'vitest' +import { sendTransaction, withExpect } from '@acala-network/chopsticks-testing' +import type { KeyringPair } from '@polkadot/keyring/types' + +import { createBlock } from '../../../../network/utils.js' +import { hexAddress } from '../../../../helper/utils.js' +import { testCases } from './config.js' +import { Config } from '../../../../network/types.js' +import { checkSwitchPalletInvariant, isSwitchPaused } from '../../index.js' +import { spinUpNetwork, tearDownNetwork } from '../../../utils.js' + +describe.each(testCases)( + 'Switch eKILTs while paused', + + ({ account, query, txContext, config, sovereignAccount }) => { + let senderContext: Config + let receiverContext: Config + let relayContext: Config + let senderAccount: KeyringPair + const { desc } = config + + // Create the network context + beforeEach(async () => { + const { relayChainContext, parachainContexts } = await spinUpNetwork(config) + relayContext = relayChainContext + senderContext = parachainContexts[0] + receiverContext = parachainContexts[1] + senderAccount = account + }) + + // Shut down the network + afterEach(async () => await tearDownNetwork([receiverContext, senderContext, relayContext])) + + it(desc, async ({ expect }) => { + const { checkSystemEvents, checkEvents } = withExpect(expect) + const { tx, balanceToTransfer, events } = txContext + + // pre condition checks + const balanceBeforeTx = await query.receiver(receiverContext, hexAddress(senderAccount.address)) + const balanceBeforeTxSender = await query.sender(senderContext, hexAddress(senderAccount.address)) + expect(balanceBeforeTx).toBe(0n) + expect(balanceBeforeTxSender).toBeGreaterThan(0n) + expect(await isSwitchPaused(receiverContext)).toBe(true) + + // action + const rawTx = tx(senderContext, balanceToTransfer.toString()) + const events1 = await sendTransaction(rawTx.signAsync(senderAccount)) + + // process tx + await createBlock(senderContext) + // process msg + await createBlock(receiverContext) + + // post condition checks + + // check balance movement on sender chain. + const balanceAfterTxSender = await query.sender(senderContext, hexAddress(senderAccount.address)) + expect(balanceAfterTxSender).toBe(balanceBeforeTxSender - balanceToTransfer) + + // Tx should fail on receiver + const balanceAfterTx = await query.receiver(receiverContext, hexAddress(senderAccount.address)) + expect(balanceAfterTx).toBe(0n) + + // check events + await Promise.all( + events.sender.map((pallet) => + checkEvents(events1, pallet).toMatchSnapshot(`Switch eKILTs sender chain ${JSON.stringify(pallet)}`) + ) + ) + + await Promise.all( + events.receiver.map((pallet) => + checkSystemEvents(receiverContext, pallet).toMatchSnapshot( + `Switch eKILTs receiver chain ${JSON.stringify(pallet)}` + ) + ) + ) + + await checkSwitchPalletInvariant( + expect, + receiverContext, + senderContext, + sovereignAccount, + query.receiver, + query.sender, + balanceToTransfer + ) + }) + } +) diff --git a/integration-tests/chopsticks/src/tests/switchPallet/pause/switchKilts/config.ts b/integration-tests/chopsticks/src/tests/switchPallet/pause/switchKilts/config.ts new file mode 100644 index 0000000000..9798cdc439 --- /dev/null +++ b/integration-tests/chopsticks/src/tests/switchPallet/pause/switchKilts/config.ts @@ -0,0 +1,51 @@ +import type { ApiPromise } from '@polkadot/api' +import type { SubmittableExtrinsic } from '@polkadot/api/types' +import type { KeyringPair } from '@polkadot/keyring/types' + +import { initialBalanceKILT, keysAlice, KILT } from '../../../../helper/utils.js' +import { mainChains } from '../../../../network/index.js' +import { tx } from '../../../../helper/api.js' +import type { BasicConfig } from '../../../types.js' + +interface TxContext { + // amount of funds to transfer + balanceToTransfer: bigint + // transactions to execute + tx: ({ api }: { api: ApiPromise }, submitter: string, amount: string) => SubmittableExtrinsic<'promise'> +} + +interface TestConfiguration { + config: BasicConfig + txContext: TxContext + account: KeyringPair +} + +export const testCases: TestConfiguration[] = [ + { + config: { + desc: 'V4 LIVE', + network: { + relay: { option: mainChains.polkadot.getConfig({}), setUpTx: [], storage: {} }, + parachains: [ + { + option: mainChains.kilt.getConfig({}), + storage: { + ...mainChains.kilt.storage.assignNativeTokensToAccounts( + [keysAlice.address], + initialBalanceKILT + ), + ...mainChains.kilt.storage.pauseSwitch(), + }, + setUpTx: [], + }, + { option: mainChains.assetHub.getConfig({}), storage: {}, setUpTx: [] }, + ], + }, + }, + account: keysAlice, + txContext: { + balanceToTransfer: KILT, + tx: tx.switchPallet.switchV4(), + }, + }, +] diff --git a/integration-tests/chopsticks/src/tests/switchPallet/pause/switchKilts/index.test.ts b/integration-tests/chopsticks/src/tests/switchPallet/pause/switchKilts/index.test.ts new file mode 100644 index 0000000000..51eb3d38f9 --- /dev/null +++ b/integration-tests/chopsticks/src/tests/switchPallet/pause/switchKilts/index.test.ts @@ -0,0 +1,47 @@ +import { describe, beforeEach, it, afterEach } from 'vitest' +import type { KeyringPair } from '@polkadot/keyring/types' +import type { DispatchError } from '@polkadot/types/interfaces' + +import { createBlock } from '../../../../network/utils.js' +import { testCases } from './config.js' +import { Config } from '../../../../network/types.js' +import { hexAddress } from '../../../../helper/utils.js' +import { spinUpNetwork, tearDownNetwork } from '../../../utils.js' + +describe.each(testCases)('Switch KILTs while paused', ({ account, txContext, config }) => { + let senderContext: Config + let senderAccount: KeyringPair + const { desc } = config + + // Create the network context + beforeEach(async () => { + const { parachainContexts } = await spinUpNetwork(config) + + senderContext = parachainContexts[0] + senderAccount = account + }) + + // Shut down the network + afterEach(async () => await tearDownNetwork([senderContext])) + + it(desc, async ({ expect }) => { + const { balanceToTransfer, tx } = txContext + let error: DispatchError | undefined + + // This should fail. + await tx(senderContext, hexAddress(senderAccount.address), balanceToTransfer.toString()).signAndSend( + senderAccount, + ({ dispatchError }) => { + error = dispatchError + } + ) + + await createBlock(senderContext) + + if (!error) { + throw new Error('Expected SwitchPairNotEnabled error') + } + + expect(senderContext.api.errors.assetSwitchPool1.SwitchPairNotEnabled.is(error.asModule)).toBe(true) + }) +}) diff --git a/integration-tests/chopsticks/src/tests/switchPallet/pause/withdrawRelayToken/__snapshots__/index.test.ts.snap b/integration-tests/chopsticks/src/tests/switchPallet/pause/withdrawRelayToken/__snapshots__/index.test.ts.snap new file mode 100644 index 0000000000..f18e28874f --- /dev/null +++ b/integration-tests/chopsticks/src/tests/switchPallet/pause/withdrawRelayToken/__snapshots__/index.test.ts.snap @@ -0,0 +1,114 @@ +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html + +exports[`Withdraw relay token while paused > V4 LIVE > Receive relay funds {"section":"balances","method":"Burned"} 1`] = ` +[ + { + "data": { + "amount": 10000000000, + "who": "13cKp88mpGREFCq8KsJEFjpSBnjFuCNWq6bmD3js7fu4f66e", + }, + "method": "Burned", + "section": "balances", + }, +] +`; + +exports[`Withdraw relay token while paused > V4 LIVE > Receive relay funds {"section":"balances","method":"Minted"} 1`] = ` +[ + { + "data": { + "amount": "(rounded 10000000000)", + "who": "15jSz35ugoWTc61xHPoxEkHte4o7UanKCk1gx1dizA8yuNs8", + }, + "method": "Minted", + "section": "balances", + }, +] +`; + +exports[`Withdraw relay token while paused > V4 LIVE > Withdraw relay funds {"section":"polkadotXcm","method":"Sent"} 1`] = ` +[ + { + "data": { + "destination": { + "interior": { + "X1": [ + { + "Parachain": 1000, + }, + ], + }, + "parents": 1, + }, + "message": [ + { + "WithdrawAsset": [ + { + "fun": { + "Fungible": 10000000000, + }, + "id": { + "interior": "Here", + "parents": 1, + }, + }, + ], + }, + "ClearOrigin", + { + "BuyExecution": { + "fees": { + "fun": { + "Fungible": 10000000000, + }, + "id": { + "interior": "Here", + "parents": 1, + }, + }, + "weightLimit": "Unlimited", + }, + }, + { + "DepositAsset": { + "assets": { + "Wild": { + "AllCounted": 1, + }, + }, + "beneficiary": { + "interior": { + "X1": [ + { + "AccountId32": { + "id": "(hash)", + "network": null, + }, + }, + ], + }, + "parents": 0, + }, + }, + }, + ], + "messageId": "(hash)", + "origin": { + "interior": { + "X1": [ + { + "AccountId32": { + "id": "(hash)", + "network": "Polkadot", + }, + }, + ], + }, + "parents": 0, + }, + }, + "method": "Sent", + "section": "polkadotXcm", + }, +] +`; diff --git a/integration-tests/chopsticks/src/tests/switchPallet/pause/withdrawRelayToken/config.ts b/integration-tests/chopsticks/src/tests/switchPallet/pause/withdrawRelayToken/config.ts new file mode 100644 index 0000000000..d80e74d80c --- /dev/null +++ b/integration-tests/chopsticks/src/tests/switchPallet/pause/withdrawRelayToken/config.ts @@ -0,0 +1,94 @@ +import type { EventFilter } from '@acala-network/chopsticks-testing' +import type { ApiPromise } from '@polkadot/api' +import type { SubmittableExtrinsic } from '@polkadot/api/types' +import type { KeyringPair } from '@polkadot/keyring/types' + +import { DOT, initialBalanceKILT, keysAlice } from '../../../../helper/utils.js' +import { mainChains } from '../../../../network/index.js' +import { tx, query } from '../../../../helper/api.js' +import type { BasicConfig } from '../../../types.js' + +interface Query { + sender: ({ api }: { api: ApiPromise }, address: string) => Promise + + receiver: ({ api }: { api: ApiPromise }, address: string) => Promise +} + +interface Events { + // events to check after the transaction on the native chain + sender: EventFilter[] + // events to check after the transaction on the foreign chain + receiver: EventFilter[] +} + +interface TxContext { + // amount of funds to transfer + balanceToTransfer: bigint + // transactions to execute + tx: ({ api }: { api: ApiPromise }, submitter: string, amount: string | number) => SubmittableExtrinsic<'promise'> + // events to check after the transaction + events: Events +} + +interface TestConfiguration { + config: BasicConfig + query: Query + txContext: TxContext + account: KeyringPair +} + +export const testCases: TestConfiguration[] = [ + { + config: { + desc: 'V4 LIVE', + network: { + relay: { option: mainChains.polkadot.getConfig({}), setUpTx: [], storage: {} }, + parachains: [ + { + option: mainChains.kilt.getConfig({}), + storage: { + ...mainChains.kilt.storage.assignNativeTokensToAccounts( + [keysAlice.address], + initialBalanceKILT + ), + ...mainChains.kilt.storage.assignRelayTokensToAccounts([keysAlice.address]), + }, + setUpTx: [tx.switchPallet.pause()], + }, + + { option: mainChains.assetHub.getConfig({}), storage: {}, setUpTx: [] }, + ], + }, + }, + account: keysAlice, + query: { + sender: query.fungibles(mainChains.assetHub.chainInfo.nativeTokenLocation), + receiver: query.balances, + }, + txContext: { + balanceToTransfer: DOT, + tx: tx.xcmPallet.transferAssetsV4( + tx.xcmPallet.parachainV4(1, mainChains.assetHub.chainInfo.paraId), + mainChains.assetHub.chainInfo.nativeTokenLocation + ), + events: { + sender: [ + { + section: 'polkadotXcm', + method: 'Sent', + }, + ], + receiver: [ + { + section: 'balances', + method: 'Burned', + }, + { + section: 'balances', + method: 'Minted', + }, + ], + }, + }, + }, +] diff --git a/integration-tests/chopsticks/src/tests/switchPallet/pause/withdrawRelayToken/index.test.ts b/integration-tests/chopsticks/src/tests/switchPallet/pause/withdrawRelayToken/index.test.ts new file mode 100644 index 0000000000..056a5f9ae3 --- /dev/null +++ b/integration-tests/chopsticks/src/tests/switchPallet/pause/withdrawRelayToken/index.test.ts @@ -0,0 +1,76 @@ +import { describe, beforeEach, it, afterEach } from 'vitest' +import { sendTransaction, withExpect } from '@acala-network/chopsticks-testing' +import type { KeyringPair } from '@polkadot/keyring/types' + +import { createBlock } from '../../../../network/utils.js' +import { hexAddress } from '../../../../helper/utils.js' +import { testCases } from './config.js' +import { Config } from '../../../../network/types.js' +import { isSwitchPaused } from '../../index.js' +import { spinUpNetwork, tearDownNetwork } from '../../../utils.js' + +describe.each(testCases)( + 'Withdraw relay token while paused', + + ({ account, query, txContext, config }) => { + let senderContext: Config + let receiverContext: Config + let relayContext: Config + let senderAccount: KeyringPair + const { desc } = config + + // Create the network context + beforeEach(async () => { + const { relayChainContext, parachainContexts } = await spinUpNetwork(config) + relayContext = relayChainContext + senderContext = parachainContexts[0] + receiverContext = parachainContexts[1] + senderAccount = account + }) + + // Shut down the network + afterEach(async () => tearDownNetwork([receiverContext, senderContext, relayContext])) + + it(desc, async ({ expect }) => { + const { checkSystemEvents, checkEvents } = withExpect(expect) + const { tx, balanceToTransfer, events } = txContext + + // pre condition checks + const balanceBeforeTx = await query.receiver(receiverContext, hexAddress(senderAccount.address)) + const balanceBeforeTxSender = await query.sender(senderContext, hexAddress(senderAccount.address)) + expect(balanceBeforeTx).toBe(0n) + expect(balanceBeforeTxSender).toBeGreaterThan(0n) + expect(await isSwitchPaused(senderContext)).toBe(true) + + // action + const rawTx = tx(senderContext, hexAddress(senderAccount.address), balanceToTransfer.toString()) + const events1 = await sendTransaction(rawTx.signAsync(senderAccount)) + + // process tx + await createBlock(senderContext) + // process msg + await createBlock(receiverContext) + + // post condition checks + // check balance movement on sender chain. + const balanceAfterTxSender = await query.sender(senderContext, hexAddress(senderAccount.address)) + expect(balanceAfterTxSender).toBe(balanceBeforeTxSender - balanceToTransfer) + + const balanceAfterTx = await query.receiver(receiverContext, hexAddress(senderAccount.address)) + expect(balanceAfterTx).toBeGreaterThan(0n) + + // check events + events.sender.map( + async (pallet) => + await checkEvents(events1, pallet).toMatchSnapshot(`Withdraw relay funds ${JSON.stringify(pallet)}`) + ) + + events.receiver.map( + async (pallet) => + await checkSystemEvents(receiverContext, pallet).toMatchSnapshot( + `Receive relay funds ${JSON.stringify(pallet)}` + ) + ) + }) + } +) diff --git a/integration-tests/chopsticks/src/tests/switchPallet/pauseSwitch.test.ts b/integration-tests/chopsticks/src/tests/switchPallet/pauseSwitch.test.ts deleted file mode 100644 index 433bbfe6f4..0000000000 --- a/integration-tests/chopsticks/src/tests/switchPallet/pauseSwitch.test.ts +++ /dev/null @@ -1,399 +0,0 @@ -import { test } from 'vitest' - -import * as PeregrineConfig from '../../network/peregrine.js' -import * as AssetHubConfig from '../../network/assetHub.js' -import { - KILT, - ROC, - getAssetSwitchParameters, - initialBalanceKILT, - initialBalanceROC, - keysAlice, - keysCharlie, -} from '../../utils.js' -import { peregrineContext, getFreeRocPeregrine, getFreeEkiltAssetHub, assethubContext } from '../index.js' -import { - checkBalance, - createBlock, - setStorage, - hexAddress, - getXcmMessageV4ToSendEkilt, - checkSwitchPalletInvariant, -} from '../utils.js' -import { getAccountLocationV4, getRelayNativeAssetIdLocationV4, getSiblingLocationV4 } from '../../network/utils.js' -import { sendTransaction, withExpect } from '@acala-network/chopsticks-testing' - -/** - * These test cases should primarily check the behavior of the switch pair when it is paused. - * Similar to the full end-to-end tests, but after each step, the switch pair is paused. - */ - -// Send ROCs while switch is paused -test('Send ROCs while switch paused', async ({ expect }) => { - const { checkSystemEvents } = withExpect(expect) - - const switchParameters = getAssetSwitchParameters() - - // 10 % of relay tokens are used as fees - const feeAmount = (ROC * BigInt(10)) / BigInt(100) - - const remoteAssetId = { V4: AssetHubConfig.eKiltLocation } - const remoteXcmFeeId = { V4: { id: AssetHubConfig.nativeTokenLocation, fun: { Fungible: feeAmount } } } - const remoteReserveLocation = getSiblingLocationV4(AssetHubConfig.paraId) - - await setStorage(peregrineContext, { - ...PeregrineConfig.assignNativeTokensToAccounts([keysAlice.address], initialBalanceKILT), - ...PeregrineConfig.setSafeXcmVersion4(), - }) - - await setStorage( - peregrineContext, - PeregrineConfig.setSwitchPair( - switchParameters, - remoteAssetId, - remoteXcmFeeId, - remoteReserveLocation, - PeregrineConfig.initialPoolAccountId, - 'Paused' - ) - ) - - await setStorage(assethubContext, { - ...AssetHubConfig.assignDotTokensToAccountsAsStorage( - [keysAlice.address, PeregrineConfig.sovereignAccountAsSibling], - initialBalanceROC - ), - ...AssetHubConfig.createForeignAsset(keysCharlie.address), - }) - - await setStorage( - assethubContext, - AssetHubConfig.assignForeignAssetToAccounts([ - [PeregrineConfig.sovereignAccountAsSibling, switchParameters.sovereignSupply], - ]) - ) - - const peregrineDestination = getSiblingLocationV4(PeregrineConfig.paraId) - const beneficiary1 = getAccountLocationV4(hexAddress(keysAlice.address)) - const rocAsset = { V4: [getRelayNativeAssetIdLocationV4(ROC.toString())] } - - const signedTx1 = assethubContext.api.tx.polkadotXcm - .limitedReserveTransferAssets(peregrineDestination, beneficiary1, rocAsset, 0, 'Unlimited') - .signAsync(keysAlice) - - await sendTransaction(signedTx1) - await createBlock(assethubContext) - - // ... But it should fail on Peregrine - await createBlock(peregrineContext) - const aliceRocBalance = await getFreeRocPeregrine(keysAlice.address) - - await checkSystemEvents(peregrineContext, { section: 'messageQueue', method: 'Processed' }).toMatchSnapshot( - 'receiver Peregrine::messageQueue::[Processed]' - ) - - await checkSystemEvents(peregrineContext, { section: 'polkadotXcm', method: 'AssetsTrapped' }).toMatchSnapshot( - 'receiver Peregrine::polkadotXcm::[AssetsTrapped]' - ) - - expect(aliceRocBalance).toBe(BigInt(0)) - - await checkSwitchPalletInvariant(expect) -}, 30_000) - -/** - * 1. Send Rocs - * 2. pause switch - * 3. switch KILTs - */ -test('Switch PILTs against ePILTs while paused', async ({ expect }) => { - const switchParameters = getAssetSwitchParameters() - - // 10 % of relay tokens are used as fees - const feeAmount = (ROC * BigInt(10)) / BigInt(100) - - const remoteAssetId = { V4: AssetHubConfig.eKiltLocation } - const remoteXcmFeeId = { V4: { id: AssetHubConfig.nativeTokenLocation, fun: { Fungible: feeAmount } } } - const remoteReserveLocation = getSiblingLocationV4(AssetHubConfig.paraId) - - await setStorage(peregrineContext, { - ...PeregrineConfig.assignNativeTokensToAccounts([keysAlice.address], initialBalanceKILT), - ...PeregrineConfig.createAndAssignRocs(keysCharlie.address, []), - ...PeregrineConfig.setSafeXcmVersion4(), - ...PeregrineConfig.setSudoKey(keysAlice.address), - }) - - await setStorage( - peregrineContext, - PeregrineConfig.setSwitchPair(switchParameters, remoteAssetId, remoteXcmFeeId, remoteReserveLocation) - ) - - await setStorage(assethubContext, { - ...AssetHubConfig.assignDotTokensToAccountsAsStorage( - [keysAlice.address, PeregrineConfig.sovereignAccountAsSibling], - initialBalanceROC - ), - ...AssetHubConfig.createForeignAsset(keysCharlie.address), - }) - - await setStorage( - assethubContext, - AssetHubConfig.assignForeignAssetToAccounts([ - [PeregrineConfig.sovereignAccountAsSibling, switchParameters.sovereignSupply], - ]) - ) - - // 1. send ROCs 2 Peregrine - const peregrineDestination = getSiblingLocationV4(PeregrineConfig.paraId) - const beneficiary1 = getAccountLocationV4(hexAddress(keysAlice.address)) - const rocAsset = { V4: [getRelayNativeAssetIdLocationV4(ROC.toString())] } - - const signedTx1 = assethubContext.api.tx.polkadotXcm - .limitedReserveTransferAssets(peregrineDestination, beneficiary1, rocAsset, 0, 'Unlimited') - .signAsync(keysAlice) - - await sendTransaction(signedTx1) - await createBlock(assethubContext) - - // process msg. - await createBlock(peregrineContext) - const aliceRocBalance = await getFreeRocPeregrine(keysAlice.address) - expect(aliceRocBalance).toBeGreaterThan(BigInt(0)) - - // 2. Pause switch pair - await peregrineContext.api.tx.sudo - .sudo(peregrineContext.api.tx.assetSwitchPool1.pauseSwitchPair()) - .signAndSend(keysAlice) - await createBlock(peregrineContext) - - // 3. switch KILTs - const balanceToTransfer = initialBalanceKILT / BigInt(2) - - const beneficiary = getAccountLocationV4(hexAddress(keysAlice.address)) - - let section: string = '' - let errorName: string = '' - - // This should fail. - await peregrineContext.api.tx.assetSwitchPool1 - .switch(balanceToTransfer.toString(), beneficiary) - .signAndSend(keysAlice, ({ dispatchError }) => { - if (dispatchError) { - const decoded = peregrineContext.api.registry.findMetaError(dispatchError.asModule) - section = decoded.section - errorName = decoded.name - } - }) - - await createBlock(peregrineContext) - - expect(section).toBe('assetSwitchPool1') - expect(errorName).toBe('SwitchPairNotEnabled') - - await checkSwitchPalletInvariant(expect) -}, 30_000) - -/** - * 1. Send Rocs - * 2. switch KILTs - * 3. pause switch - * 4. send eKILTs back - */ -test('Switch ePILTs against PILTs while paused', async ({ expect }) => { - const { checkEvents, checkSystemEvents } = withExpect(expect) - - const switchParameters = getAssetSwitchParameters() - - // 10 % of relay tokens are used as fees - const feeAmount = (ROC * BigInt(10)) / BigInt(100) - - const remoteAssetId = { V4: AssetHubConfig.eKiltLocation } - const remoteXcmFeeId = { V4: { id: AssetHubConfig.nativeTokenLocation, fun: { Fungible: feeAmount } } } - const remoteReserveLocation = getSiblingLocationV4(AssetHubConfig.paraId) - - await setStorage(peregrineContext, { - ...PeregrineConfig.assignNativeTokensToAccounts([keysAlice.address], initialBalanceKILT), - ...PeregrineConfig.createAndAssignRocs(keysCharlie.address, []), - ...PeregrineConfig.setSafeXcmVersion4(), - ...PeregrineConfig.setSudoKey(keysAlice.address), - }) - - await setStorage( - peregrineContext, - PeregrineConfig.setSwitchPair(switchParameters, remoteAssetId, remoteXcmFeeId, remoteReserveLocation) - ) - - await setStorage(assethubContext, { - ...AssetHubConfig.assignDotTokensToAccountsAsStorage( - [keysAlice.address, PeregrineConfig.sovereignAccountAsSibling], - initialBalanceROC - ), - ...AssetHubConfig.createForeignAsset(keysCharlie.address), - }) - - await setStorage( - assethubContext, - AssetHubConfig.assignForeignAssetToAccounts([ - [PeregrineConfig.sovereignAccountAsSibling, switchParameters.sovereignSupply], - ]) - ) - - // 1. send ROCs 2 Peregrine - const peregrineDestination = getSiblingLocationV4(PeregrineConfig.paraId) - const beneficiary1 = getAccountLocationV4(hexAddress(keysAlice.address)) - const rocAsset = { V4: [getRelayNativeAssetIdLocationV4(ROC.toString())] } - - const signedTx1 = assethubContext.api.tx.polkadotXcm - .limitedReserveTransferAssets(peregrineDestination, beneficiary1, rocAsset, 0, 'Unlimited') - .signAsync(keysAlice) - await sendTransaction(signedTx1) - - // send msg - await createBlock(assethubContext) - // process msg. - await createBlock(peregrineContext) - - const aliceRocBalance = await getFreeRocPeregrine(keysAlice.address) - expect(aliceRocBalance).toBeGreaterThan(BigInt(0)) - - // 2. switch KILTs - const balanceToTransfer = initialBalanceKILT / BigInt(2) - - const beneficiary = getAccountLocationV4(hexAddress(keysAlice.address)) - - const signedTx2 = peregrineContext.api.tx.assetSwitchPool1 - .switch(balanceToTransfer.toString(), beneficiary) - .signAsync(keysAlice) - - const events2 = await sendTransaction(signedTx2) - - await createBlock(peregrineContext) - - await checkEvents(events2, 'assetSwitchPool1').toMatchSnapshot( - 'sender Peregrine::assetSwitchPool1::[LocalToRemoteSwitchExecuted]' - ) - await createBlock(assethubContext) - - // only check here, if alice received the funds - const balanceAliceEkilt = await getFreeEkiltAssetHub(keysAlice.address) - expect(balanceAliceEkilt).toBe(balanceToTransfer) - - // 3. Pause swap pairs - await peregrineContext.api.tx.sudo - .sudo(peregrineContext.api.tx.assetSwitchPool1.pauseSwitchPair()) - .signAndSend(keysAlice) - await createBlock(peregrineContext) - - // 4. send eKILTs back - const balanceToTransferBack = balanceToTransfer / BigInt(2) - const dest = getSiblingLocationV4(PeregrineConfig.paraId) - const remoteFeeId = { V4: AssetHubConfig.eKiltLocation } - const funds = { - V4: [ - { - id: AssetHubConfig.eKiltLocation, - fun: { Fungible: balanceToTransferBack.toString() }, - }, - ], - } - - const signedTx3 = assethubContext.api.tx.polkadotXcm - .transferAssetsUsingTypeAndThen( - dest, - funds, - 'LocalReserve', - remoteFeeId, - 'LocalReserve', - getXcmMessageV4ToSendEkilt(keysAlice.address), - 'Unlimited' - ) - .signAsync(keysAlice) - - await sendTransaction(signedTx3) - - await createBlock(assethubContext) - - // Tx should not fail on AH. - await checkBalance(getFreeEkiltAssetHub, keysAlice.address, expect, KILT * BigInt(25)) - - // prcess msg - await createBlock(peregrineContext) - - // ... but MSG execution should fail on Peregrine - await checkSystemEvents(peregrineContext, { section: 'messageQueue', method: 'Processed' }).toMatchSnapshot( - 'receiver Peregrine::messageQueue::[Processed]' - ) - await checkSystemEvents(peregrineContext, { section: 'polkadotXcm', method: 'AssetsTrapped' }).toMatchSnapshot( - 'receiver Peregrine::polkadotXcm::[AssetsTrapped]' - ) - - // The msg will not be processed. Therefore, some assets are not moved. We can not do strict checks here. - await checkSwitchPalletInvariant(expect, balanceToTransferBack) -}, 30_000) - -test('Withdraw ROCs while switch is paused', async ({ expect }) => { - await setStorage(peregrineContext, { - ...PeregrineConfig.assignNativeTokensToAccounts([keysAlice.address], initialBalanceKILT), - ...PeregrineConfig.createAndAssignRocs(keysCharlie.address, [keysAlice.address]), - ...PeregrineConfig.setSafeXcmVersion4(), - }) - - const switchParameters = getAssetSwitchParameters() - // 10 % of relay tokens are used as fees - const feeAmount = (ROC * BigInt(10)) / BigInt(100) - - const remoteAssetId = { V4: AssetHubConfig.eKiltLocation } - const remoteXcmFeeId = { V4: { id: AssetHubConfig.nativeTokenLocation, fun: { Fungible: feeAmount } } } - const remoteReserveLocation = getSiblingLocationV4(AssetHubConfig.paraId) - - await setStorage( - peregrineContext, - PeregrineConfig.setSwitchPair( - switchParameters, - remoteAssetId, - remoteXcmFeeId, - remoteReserveLocation, - PeregrineConfig.initialPoolAccountId, - 'Paused' - ) - ) - - await setStorage(assethubContext, { - ...AssetHubConfig.assignDotTokensToAccountsAsStorage( - [PeregrineConfig.sovereignAccountAsSibling], - initialBalanceROC - ), - ...AssetHubConfig.createForeignAsset(keysCharlie.address), - }) - - await setStorage( - assethubContext, - AssetHubConfig.assignForeignAssetToAccounts([ - [PeregrineConfig.sovereignAccountAsSibling, switchParameters.sovereignSupply], - ]) - ) - - let section: string = '' - let errorName: string = '' - - const assetHubDestination = getSiblingLocationV4(AssetHubConfig.paraId) - const assets = { V4: [getRelayNativeAssetIdLocationV4(ROC.toString())] } - const beneficiary = getAccountLocationV4(hexAddress(keysAlice.address)) - - await peregrineContext.api.tx.polkadotXcm - .transferAssets(assetHubDestination, beneficiary, assets, 0, 'Unlimited') - .signAndSend(keysAlice, ({ dispatchError }) => { - if (dispatchError) { - const decoded = peregrineContext.api.registry.findMetaError(dispatchError.asModule) - section = decoded.section - errorName = decoded.name - } - }) - - await createBlock(peregrineContext) - - expect(section).toBe('polkadotXcm') - expect(errorName).toBe('LocalExecutionIncomplete') - - await checkSwitchPalletInvariant(expect) -}, 30_000) diff --git a/integration-tests/chopsticks/src/tests/switchPallet/relayToken.test.ts b/integration-tests/chopsticks/src/tests/switchPallet/relayToken.test.ts deleted file mode 100644 index e4c64cdde3..0000000000 --- a/integration-tests/chopsticks/src/tests/switchPallet/relayToken.test.ts +++ /dev/null @@ -1,172 +0,0 @@ -import { test } from 'vitest' - -import * as PeregrineConfig from '../../network/peregrine.js' -import * as BasiliskConfig from '../../network/basilisk.js' -import * as AssetHubConfig from '../../network/assetHub.js' -import { - getAssetSwitchParameters, - initialBalanceKILT, - initialBalanceROC, - keysAlice, - keysBob, - keysCharlie, - ROC, -} from '../../utils.js' -import { - peregrineContext, - getFreeBalancePeregrine, - getFreeRocPeregrine, - basiliskContext, - rococoContext, - assethubContext, -} from '../index.js' -import { - checkBalance, - createBlock, - setStorage, - hexAddress, - checkBalanceInRange, - checkSwitchPalletInvariant, -} from '../utils.js' -import { sendTransaction, withExpect } from '@acala-network/chopsticks-testing' -import { getSiblingLocationV4 } from '../../network/utils.js' - -test('User transfers all of his dots', async ({ expect }) => { - const { checkEvents } = withExpect(expect) - - // Assign alice some KILTs and ROCs - await setStorage(peregrineContext, { - ...PeregrineConfig.assignNativeTokensToAccounts([keysAlice.address, keysBob.address], initialBalanceKILT), - ...PeregrineConfig.createAndAssignRocs(keysCharlie.address, [keysAlice.address]), - }) - - const signedTx = peregrineContext.api.tx.fungibles - .transfer(PeregrineConfig.ROC_LOCATION, keysBob.address, initialBalanceROC) - .signAsync(keysAlice) - - const events = await sendTransaction(signedTx) - - await createBlock(peregrineContext) - - checkEvents(events, { section: 'fungibles', method: 'Transferred' }).toMatchSnapshot( - `local Peregrine::fungibles::[Transferred] asset ${JSON.stringify(PeregrineConfig.ROC_LOCATION)}` - ) - - await checkBalance(getFreeRocPeregrine, keysAlice.address, expect, BigInt(0)) - - await checkBalance(getFreeRocPeregrine, keysBob.address, expect, initialBalanceROC) - - await checkBalanceInRange(getFreeBalancePeregrine, keysAlice.address, expect, [ - BigInt('99999800999995545'), - initialBalanceKILT, - ]) -}, 20_000) - -test('User gets dusted with ROCs', async ({ expect }) => { - const { checkEvents } = withExpect(expect) - - await setStorage(peregrineContext, { - ...PeregrineConfig.assignNativeTokensToAccounts([keysAlice.address], initialBalanceKILT), - ...PeregrineConfig.createAndAssignRocs(keysCharlie.address, [keysAlice.address]), - }) - - const balanceToTransfer = (initialBalanceKILT * BigInt(999998)) / BigInt(1000000) - - const signedTx = peregrineContext.api.tx.balances - .transferAllowDeath(keysBob.address, balanceToTransfer) - .signAsync(keysAlice) - - const events = await sendTransaction(signedTx) - - await createBlock(peregrineContext) - - checkEvents(events, { section: 'balances', method: 'Transfer' }).toMatchSnapshot( - 'local Peregrine::balances::[Transfer] native asset' - ) - // User should get dusted by this operation - checkEvents(events, { section: 'balances', method: 'DustLost' }).toMatchSnapshot( - 'local balances::fungibles::[DustLost]' - ) - // he should keep his rocs - await checkBalance(getFreeRocPeregrine, keysAlice.address, expect, initialBalanceROC) -}, 20_000) - -test('Send DOTs from basilisk 2 Peregrine', async ({ expect }) => { - const { checkSystemEvents } = withExpect(expect) - - const switchParameters = getAssetSwitchParameters() - - // 10 % of relay tokens are used as fees - const feeAmount = (ROC * BigInt(10)) / BigInt(100) - - const remoteAssetId = { V4: AssetHubConfig.eKiltLocation } - const remoteXcmFeeId = { V4: { id: AssetHubConfig.nativeTokenLocation, fun: { Fungible: feeAmount } } } - const remoteReserveLocation = getSiblingLocationV4(AssetHubConfig.paraId) - - await setStorage(peregrineContext, { - ...PeregrineConfig.assignNativeTokensToAccounts([keysAlice.address], initialBalanceKILT), - ...PeregrineConfig.createAndAssignRocs(keysCharlie.address, []), - ...PeregrineConfig.setSafeXcmVersion4(), - }) - - await setStorage( - peregrineContext, - PeregrineConfig.setSwitchPair(switchParameters, remoteAssetId, remoteXcmFeeId, remoteReserveLocation) - ) - - await setStorage(assethubContext, { - ...AssetHubConfig.createForeignAsset(keysCharlie.address), - }) - - await setStorage( - assethubContext, - AssetHubConfig.assignForeignAssetToAccounts([ - [PeregrineConfig.sovereignAccountAsSibling, switchParameters.sovereignSupply], - ]) - ) - - await setStorage(basiliskContext, { - ...BasiliskConfig.assignNativeTokensToAccounts([keysAlice.address]), - ...BasiliskConfig.assignRocTokensToAccounts([keysAlice.address], initialBalanceROC), - }) - - const balanceToTransfer = initialBalanceROC / BigInt(2) - - const beneficiary = { - V4: { - parents: 1, - interior: { - X2: [ - { Parachain: PeregrineConfig.paraId }, - { - AccountId32: { - id: hexAddress(keysAlice.address), - }, - }, - ], - }, - }, - } - - const signedTx = basiliskContext.api.tx.xTokens - .transfer(BasiliskConfig.dotTokenId, balanceToTransfer, beneficiary, 'Unlimited') - .signAsync(keysAlice) - - await sendTransaction(signedTx) - await createBlock(basiliskContext) - - // FWD the message - await createBlock(rococoContext) - - // Process the message - await createBlock(peregrineContext) - // Barrier blocked execution. No event will be emitted. - await checkSystemEvents(peregrineContext, 'messageQueue').toMatchSnapshot( - 'receiver Peregrine::messageQueue::[ProcessingFailed]' - ) - - // Alice should still have no rocs. - await checkBalance(getFreeRocPeregrine, keysAlice.address, expect, BigInt(0)) - - await checkSwitchPalletInvariant(expect) -}, 20_000) diff --git a/integration-tests/chopsticks/src/tests/switchPallet/switchConfig.test.ts b/integration-tests/chopsticks/src/tests/switchPallet/switchConfig.test.ts deleted file mode 100644 index c042bf1c89..0000000000 --- a/integration-tests/chopsticks/src/tests/switchPallet/switchConfig.test.ts +++ /dev/null @@ -1,228 +0,0 @@ -import { test } from 'vitest' - -import * as PeregrineConfig from '../../network/peregrine.js' -import * as AssetHubConfig from '../../network/assetHub.js' -import * as RococoConfig from '../../network/rococo.js' -import { - KILT, - ROC, - getAssetSwitchParameters, - initialBalanceKILT, - initialBalanceROC, - keysAlice, - keysCharlie, -} from '../../utils.js' -import { peregrineContext, getFreeEkiltAssetHub, assethubContext, getFreeRocAssetHub, rococoContext } from '../index.js' -import { - checkSwitchPalletInvariant, - checkBalance, - createBlock, - setStorage, - hexAddress, - getXcmMessageV4ToSendEkilt, -} from '../utils.js' -import { getAccountLocationV4, getChildLocation, getSiblingLocationV4 } from '../../network/utils.js' -import { sendTransaction, withExpect } from '@acala-network/chopsticks-testing' - -test('Switch KILTs against EKILTs no enough DOTs on AH', async ({ expect }) => { - const { checkEvents } = withExpect(expect) - - const switchParameters = getAssetSwitchParameters() - - // 10 % of relay tokens are used as fees - const feeAmount = (ROC * BigInt(10)) / BigInt(100) - - const remoteAssetId = { V4: AssetHubConfig.eKiltLocation } - const remoteXcmFeeId = { V4: { id: AssetHubConfig.nativeTokenLocation, fun: { Fungible: feeAmount } } } - const remoteReserveLocation = getSiblingLocationV4(AssetHubConfig.paraId) - - await setStorage(peregrineContext, { - ...PeregrineConfig.assignNativeTokensToAccounts([keysAlice.address], initialBalanceKILT), - ...PeregrineConfig.createAndAssignRocs(keysCharlie.address, [keysAlice.address]), - ...PeregrineConfig.setSafeXcmVersion4(), - }) - - await setStorage( - peregrineContext, - PeregrineConfig.setSwitchPair(switchParameters, remoteAssetId, remoteXcmFeeId, remoteReserveLocation) - ) - - await setStorage(assethubContext, { - ...AssetHubConfig.assignDotTokensToAccountsAsStorage( - [PeregrineConfig.sovereignAccountAsSibling], - initialBalanceROC - ), - ...AssetHubConfig.createForeignAsset(keysCharlie.address), - }) - - await setStorage( - assethubContext, - AssetHubConfig.assignForeignAssetToAccounts([ - [PeregrineConfig.sovereignAccountAsSibling, switchParameters.sovereignSupply], - ]) - ) - - const balanceToTransfer = initialBalanceKILT / BigInt(2) - - const beneficiary = getAccountLocationV4(hexAddress(keysAlice.address)) - - const signedTx = peregrineContext.api.tx.assetSwitchPool1 - .switch(balanceToTransfer.toString(), beneficiary) - .signAsync(keysAlice) - - const events = await sendTransaction(signedTx) - - await createBlock(peregrineContext) - - checkEvents(events, 'xcmpQueue').toMatchSnapshot('sender Peregrine::xcmpQueue::[XcmpMessageSent]') - checkEvents(events, 'assetSwitchPool1').toMatchSnapshot( - 'sender Peregrine::assetSwitchPool1::[LocalToRemoteSwitchExecuted]' - ) - checkEvents(events, { section: 'balances', method: 'Transfer' }).toMatchSnapshot( - 'sender Peregrine::balances::[Transfer]' - ) - - // process msg. We don't care about the events. We check only the funds. - await createBlock(assethubContext) - - await checkBalance(getFreeEkiltAssetHub, keysAlice.address, expect, BigInt(0)) - await checkBalance(getFreeRocAssetHub, keysAlice.address, expect, BigInt(0)) - - await checkSwitchPalletInvariant(expect, balanceToTransfer) -}, 20_000) - -test('Send eKILT while switch Pair does not exist', async ({ expect }) => { - const { checkSystemEvents } = withExpect(expect) - - const switchParameters = getAssetSwitchParameters(initialBalanceKILT * BigInt(1000)) - - await setStorage(assethubContext, { - ...AssetHubConfig.assignDotTokensToAccountsAsStorage( - [keysAlice.address, PeregrineConfig.sovereignAccountAsSibling], - initialBalanceROC - ), - ...AssetHubConfig.createForeignAsset(keysCharlie.address), - ...AssetHubConfig.assignForeignAssetToAccounts([[keysAlice.address, switchParameters.circulatingSupply]]), - }) - - const dest = getSiblingLocationV4(PeregrineConfig.paraId) - const remoteFeeId = { V4: AssetHubConfig.eKiltLocation } - - const funds = { - V4: [ - { - id: AssetHubConfig.eKiltLocation, - fun: { Fungible: KILT }, - }, - ], - } - - const signedTx = assethubContext.api.tx.polkadotXcm - .transferAssetsUsingTypeAndThen( - dest, - funds, - 'LocalReserve', - remoteFeeId, - 'LocalReserve', - getXcmMessageV4ToSendEkilt(keysAlice.address), - 'Unlimited' - ) - .signAsync(keysAlice) - - await sendTransaction(signedTx) - // send msg - await createBlock(assethubContext) - - // Will fail on the receiver side - await createBlock(peregrineContext) - await checkSystemEvents(peregrineContext, 'messageQueue').toMatchSnapshot( - 'receiver Peregrine::messageQueue::[Processed]' - ) -}, 20_000) - -test('Send eKILT from other reserve location', async ({ expect }) => { - const { checkSystemEvents } = withExpect(expect) - - const switchParameters = getAssetSwitchParameters() - const feeAmount = (ROC * BigInt(10)) / BigInt(100) - const remoteAssetId = { V4: AssetHubConfig.eKiltLocation } - const remoteXcmFeeId = { V4: { id: AssetHubConfig.nativeTokenLocation, fun: { Fungible: feeAmount } } } - const remoteReserveLocation = getSiblingLocationV4(AssetHubConfig.paraId) - - await setStorage(rococoContext, { - ...RococoConfig.setSudoKey(keysAlice.address), - ...RococoConfig.assignNativeTokensToAccounts([keysAlice.address]), - }) - - await setStorage(assethubContext, { - ...AssetHubConfig.createForeignAsset(keysCharlie.address), - }) - - await setStorage( - assethubContext, - AssetHubConfig.assignForeignAssetToAccounts([ - [PeregrineConfig.sovereignAccountAsSibling, switchParameters.sovereignSupply], - ]) - ) - - await setStorage( - peregrineContext, - PeregrineConfig.setSwitchPair(switchParameters, remoteAssetId, remoteXcmFeeId, remoteReserveLocation) - ) - - const dest = { V3: getChildLocation(PeregrineConfig.paraId) } - - const xcmMessage = { - V3: [ - { - ReserveAssetDeposited: [ - { - id: { Concrete: AssetHubConfig.eKiltLocation }, - fun: { Fungible: initialBalanceKILT }, - }, - ], - }, - 'ClearOrigin', - { - BuyExecution: { - fees: { - id: { Concrete: AssetHubConfig.eKiltLocation }, - fun: { Fungible: initialBalanceKILT }, - }, - weightLimit: 'Unlimited', - }, - }, - { - DepositAsset: { - assets: { Wild: 'All' }, - beneficiary: { - parents: 0, - interior: { - X1: { - AccountId32: { - id: hexAddress(keysAlice.address), - }, - }, - }, - }, - }, - }, - ], - } - - const innerTx = rococoContext.api.tx.xcmPallet.send(dest, xcmMessage) - - const tx = rococoContext.api.tx.sudo.sudo(innerTx).signAsync(keysAlice) - - // send msg - await sendTransaction(tx) - await createBlock(rococoContext) - - await createBlock(peregrineContext) - // We expect the UntrustedReserveLocation error which results in failing the msg. The error will NOT emitted as an event. - await checkSystemEvents(peregrineContext, 'messageQueue').toMatchSnapshot( - 'receiver Peregrine::messageQueue::[Processed]' - ) - - await checkSwitchPalletInvariant(expect) -}, 20_000) diff --git a/integration-tests/chopsticks/src/tests/switchPallet/switchConfig/failingOnReceiver/__snapshots__/index.test.ts.snap b/integration-tests/chopsticks/src/tests/switchPallet/switchConfig/failingOnReceiver/__snapshots__/index.test.ts.snap new file mode 100644 index 0000000000..b10ac6e4b2 --- /dev/null +++ b/integration-tests/chopsticks/src/tests/switchPallet/switchConfig/failingOnReceiver/__snapshots__/index.test.ts.snap @@ -0,0 +1,77 @@ +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html + +exports[`Switch KILTs while receiver can not handle them > V4 LIVE > Switch on native chain: "assetSwitchPool1" 1`] = ` +[ + { + "data": { + "amount": 1000000000000000, + "from": "4seWojfEHrk5YKPahdErazQ3CWEHZYi6NV4gKz5AaejWbRPJ", + "to": { + "V4": { + "interior": { + "X1": [ + { + "AccountId32": { + "id": "(hash)", + "network": null, + }, + }, + ], + }, + "parents": 0, + }, + }, + }, + "method": "LocalToRemoteSwitchExecuted", + "section": "assetSwitchPool1", + }, +] +`; + +exports[`Switch KILTs while receiver can not handle them > V4 LIVE > Switch on receiver chain: {"section":"messageQueue","method":"Processed"} 1`] = ` +[ + { + "data": { + "id": "(hash)", + "origin": { + "Sibling": "(rounded 2100)", + }, + "success": false, + "weightUsed": { + "proofSize": "(rounded 24000)", + "refTime": "(rounded 1500000000)", + }, + }, + "method": "Processed", + "section": "messageQueue", + }, +] +`; + +exports[`Switch KILTs while receiver can not handle them > V4 LIVE > assetSwitchPool1 Finalization 1`] = ` +[ + { + "data": { + "amount": 1000000000000000, + "from": "4seWojfEHrk5YKPahdErazQ3CWEHZYi6NV4gKz5AaejWbRPJ", + "to": { + "V4": { + "interior": { + "X1": [ + { + "AccountId32": { + "id": "(hash)", + "network": null, + }, + }, + ], + }, + "parents": 0, + }, + }, + }, + "method": "LocalToRemoteSwitchReverted", + "section": "assetSwitchPool1", + }, +] +`; diff --git a/integration-tests/chopsticks/src/tests/switchPallet/switchConfig/failingOnReceiver/config.ts b/integration-tests/chopsticks/src/tests/switchPallet/switchConfig/failingOnReceiver/config.ts new file mode 100644 index 0000000000..45e528ab32 --- /dev/null +++ b/integration-tests/chopsticks/src/tests/switchPallet/switchConfig/failingOnReceiver/config.ts @@ -0,0 +1,84 @@ +import type { EventFilter } from '@acala-network/chopsticks-testing' +import type { ApiPromise } from '@polkadot/api' +import type { SubmittableExtrinsic } from '@polkadot/api/types' +import type { KeyringPair } from '@polkadot/keyring/types' + +import { keysAlice, KILT } from '../../../../helper/utils.js' +import { mainChains } from '../../../../network/index.js' +import { tx, query } from '../../../../helper/api.js' +import type { BasicConfig } from '../../../types.js' + +interface Query { + sender: ({ api }: { api: ApiPromise }, address: string) => Promise + + receiver: ({ api }: { api: ApiPromise }, address: string) => Promise +} + +interface Events { + // events to check after the transaction on the native chain + sender: EventFilter[] + // events to check after the transaction on the foreign chain + receiver: EventFilter[] +} + +interface TxContext { + // amount of funds to transfer + balanceToTransfer: bigint + // transactions to execute + tx: ({ api }: { api: ApiPromise }, acc: string, amount: string) => SubmittableExtrinsic<'promise'> + // events to check after the transaction + events: Events +} + +interface TestConfiguration { + config: BasicConfig + query: Query + txContext: TxContext + account: KeyringPair + sovereignAccount: string +} + +export const testCases: TestConfiguration[] = [ + { + config: { + desc: 'V4 LIVE', + network: { + relay: { option: mainChains.polkadot.getConfig({}), storage: {}, setUpTx: [] }, + parachains: [ + { + option: mainChains.kilt.getConfig({}), + setUpTx: [], + storage: { + ...mainChains.kilt.storage.assignNativeTokensToAccounts([keysAlice.address]), + ...mainChains.kilt.storage.assignRelayTokensToAccounts([keysAlice.address]), + }, + }, + { + option: mainChains.assetHub.getConfig({}), + setUpTx: [], + storage: {}, + }, + ], + }, + }, + account: keysAlice, + query: { + sender: query.balances, + receiver: query.foreignAssets(mainChains.assetHub.chainInfo.eKiltLocation), + }, + txContext: { + balanceToTransfer: KILT, + tx: tx.switchPallet.switchV4(), + events: { + sender: ['assetSwitchPool1'], + receiver: [ + { + section: 'messageQueue', + method: 'Processed', + }, + ], + }, + }, + sovereignAccount: mainChains.kilt.chainInfo.sovereignAccountOnSiblingChains, + }, +] diff --git a/integration-tests/chopsticks/src/tests/switchPallet/switchConfig/failingOnReceiver/index.test.ts b/integration-tests/chopsticks/src/tests/switchPallet/switchConfig/failingOnReceiver/index.test.ts new file mode 100644 index 0000000000..a4d74afc5f --- /dev/null +++ b/integration-tests/chopsticks/src/tests/switchPallet/switchConfig/failingOnReceiver/index.test.ts @@ -0,0 +1,96 @@ +import { describe, beforeEach, it, afterEach } from 'vitest' +import { sendTransaction, withExpect } from '@acala-network/chopsticks-testing' +import type { KeyringPair } from '@polkadot/keyring/types' + +import { createBlock } from '../../../../network/utils.js' +import { calculateTxFees, hexAddress } from '../../../../helper/utils.js' +import { testCases } from './config.js' +import type { Config } from '../../../../network/types.js' +import { checkSwitchPalletInvariant } from '../../index.js' +import { spinUpNetwork, tearDownNetwork } from '../../../utils.js' + +describe.each(testCases)( + 'Switch KILTs while receiver can not handle them', + + ({ account, query, txContext, config, sovereignAccount }) => { + let senderContext: Config + let receiverContext: Config + let relayContext: Config + let senderAccount: KeyringPair + const { desc } = config + + // Create the network context + beforeEach(async () => { + const { parachainContexts, relayChainContext } = await spinUpNetwork(config) + relayContext = relayChainContext + senderContext = parachainContexts[0] + receiverContext = parachainContexts[1] + senderAccount = account + }) + + // Shut down the network + afterEach(async () => await tearDownNetwork([receiverContext, senderContext, relayContext])) + + it(desc, async ({ expect }) => { + const { checkSystemEvents, checkEvents } = withExpect(expect) + const { tx, balanceToTransfer, events } = txContext + + //pre condition checks + const balanceBeforeTx = await query.receiver(receiverContext, hexAddress(senderAccount.address)) + const balanceBeforeTxSender = await query.sender(senderContext, hexAddress(senderAccount.address)) + expect(balanceBeforeTx).toBe(0n) + expect(balanceBeforeTxSender).toBeGreaterThan(0n) + + // action + const rawTx = tx(senderContext, hexAddress(senderAccount.address), balanceToTransfer.toString()) + const events1 = await sendTransaction(rawTx.signAsync(senderAccount)) + + // process tx + await createBlock(senderContext) + // process msg + await createBlock(receiverContext) + + // post condition checks + // check balance movement on sender chain. + const txFees = await calculateTxFees(rawTx, senderAccount) + const balanceAfterTxSender = await query.sender(senderContext, hexAddress(senderAccount.address)) + expect(balanceAfterTxSender).toBe(balanceBeforeTxSender - balanceToTransfer - txFees) + + // Tx should fail on receiver + const balanceAfterTx = await query.receiver(receiverContext, hexAddress(senderAccount.address)) + + expect(balanceAfterTx).toBe(0n) + + // check events + await Promise.all( + events.sender.map((pallet) => + checkEvents(events1, pallet).toMatchSnapshot(`Switch on native chain: ${JSON.stringify(pallet)}`) + ) + ) + + await Promise.all( + events.receiver.map((pallet) => + checkSystemEvents(receiverContext, pallet).toMatchSnapshot( + `Switch on receiver chain: ${JSON.stringify(pallet)}` + ) + ) + ) + + // finalize switch + await createBlock(senderContext) + await checkSystemEvents(senderContext, 'assetSwitchPool1').toMatchSnapshot('assetSwitchPool1 Finalization') + + const balanceAfterFinalization = await query.sender(senderContext, hexAddress(senderAccount.address)) + expect(balanceAfterFinalization).toBe(balanceBeforeTxSender - txFees) + + await checkSwitchPalletInvariant( + expect, + senderContext, + receiverContext, + sovereignAccount, + query.sender, + query.receiver + ) + }) + } +) diff --git a/integration-tests/chopsticks/src/tests/switchPallet/switchConfig/noSwitchPair/__snapshots__/index.test.ts.snap b/integration-tests/chopsticks/src/tests/switchPallet/switchConfig/noSwitchPair/__snapshots__/index.test.ts.snap new file mode 100644 index 0000000000..7649bb1ee4 --- /dev/null +++ b/integration-tests/chopsticks/src/tests/switchPallet/switchConfig/noSwitchPair/__snapshots__/index.test.ts.snap @@ -0,0 +1,138 @@ +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html + +exports[`Switch eKILTs while no pair set > V4 LIVE > Switch eKILTs on receiver chain: {"section":"messageQueue","method":"Processed"} 1`] = ` +[ + { + "data": { + "id": "(hash)", + "origin": { + "Sibling": 1000, + }, + "success": false, + "weightUsed": { + "proofSize": 0, + "refTime": 200000000, + }, + }, + "method": "Processed", + "section": "messageQueue", + }, +] +`; + +exports[`Switch eKILTs while no pair set > V4 LIVE > Switch eKILTs on sender chain: {"section":"polkadotXcm","method":"Sent"} 1`] = ` +[ + { + "data": { + "destination": { + "interior": { + "X1": [ + { + "Parachain": "(rounded 2100)", + }, + ], + }, + "parents": 1, + }, + "message": [ + { + "ReserveAssetDeposited": [ + { + "fun": { + "Fungible": 1000000000000000, + }, + "id": { + "interior": { + "X2": [ + { + "GlobalConsensus": { + "Ethereum": { + "chainId": 1, + }, + }, + }, + { + "AccountKey20": { + "key": "0x5d3d01fd6d2ad1169b17918eb4f153c6616288eb", + "network": null, + }, + }, + ], + }, + "parents": 2, + }, + }, + ], + }, + "ClearOrigin", + { + "BuyExecution": { + "fees": { + "fun": { + "Fungible": 1000000000000000, + }, + "id": { + "interior": { + "X2": [ + { + "GlobalConsensus": { + "Ethereum": { + "chainId": 1, + }, + }, + }, + { + "AccountKey20": { + "key": "0x5d3d01fd6d2ad1169b17918eb4f153c6616288eb", + "network": null, + }, + }, + ], + }, + "parents": 2, + }, + }, + "weightLimit": "Unlimited", + }, + }, + { + "DepositAsset": { + "assets": { + "Wild": "All", + }, + "beneficiary": { + "interior": { + "X1": [ + { + "AccountId32": { + "id": "(hash)", + "network": null, + }, + }, + ], + }, + "parents": 0, + }, + }, + }, + ], + "messageId": "(hash)", + "origin": { + "interior": { + "X1": [ + { + "AccountId32": { + "id": "(hash)", + "network": "Polkadot", + }, + }, + ], + }, + "parents": 0, + }, + }, + "method": "Sent", + "section": "polkadotXcm", + }, +] +`; diff --git a/integration-tests/chopsticks/src/tests/switchPallet/switchConfig/noSwitchPair/config.ts b/integration-tests/chopsticks/src/tests/switchPallet/switchConfig/noSwitchPair/config.ts new file mode 100644 index 0000000000..78b49df482 --- /dev/null +++ b/integration-tests/chopsticks/src/tests/switchPallet/switchConfig/noSwitchPair/config.ts @@ -0,0 +1,96 @@ +import type { EventFilter } from '@acala-network/chopsticks-testing' +import type { ApiPromise } from '@polkadot/api' +import type { SubmittableExtrinsic } from '@polkadot/api/types' +import type { KeyringPair } from '@polkadot/keyring/types' + +import { initialBalanceKILT, keysAlice, KILT } from '../../../../helper/utils.js' +import { mainChains } from '../../../../network/index.js' +import { tx, query } from '../../../../helper/api.js' +import type { BasicConfig } from '../../../types.js' +import { getXcmMessageV4ToSendEkilt } from '../../index.js' + +interface Query { + sender: ({ api }: { api: ApiPromise }, address: string) => Promise + + receiver: ({ api }: { api: ApiPromise }, address: string) => Promise +} + +interface Events { + sender: EventFilter[] + + receiver: EventFilter[] +} + +/** + * Context for the transaction to switch funds between chains. + */ +interface TxContext { + // amount of funds to transfer + balanceToTransfer: bigint + // transactions to execute + tx: ({ api }: { api: ApiPromise }, amount: string) => SubmittableExtrinsic<'promise'> + // events to check after the transaction + events: Events +} + +interface TestConfiguration { + config: BasicConfig + query: Query + txContext: TxContext + account: KeyringPair +} + +export const testCases: TestConfiguration[] = [ + { + config: { + desc: 'V4 LIVE', + network: { + relay: { option: mainChains.polkadot.getConfig({}), storage: {}, setUpTx: [] }, + parachains: [ + { + option: mainChains.assetHub.getConfig({}), + storage: { + ...mainChains.assetHub.storage.assignNativeTokensToAccountsAsStorage([keysAlice.address]), + ...mainChains.assetHub.storage.assignForeignAssetToAccounts([ + [keysAlice.address, initialBalanceKILT], + ]), + }, + setUpTx: [], + }, + { + option: mainChains.kilt.getConfig({}), + setUpTx: [], + storage: mainChains.kilt.storage.removeSwitchPair(), + }, + ], + }, + }, + account: keysAlice, + query: { + sender: query.foreignAssets(mainChains.assetHub.chainInfo.eKiltLocation), + receiver: query.balances, + }, + txContext: { + balanceToTransfer: KILT, + tx: tx.xcmPallet.transferAssetsUsingTypeAndThenV4( + tx.xcmPallet.parachainV4(1, mainChains.kilt.chainInfo.paraId), + mainChains.assetHub.chainInfo.eKiltLocation, + getXcmMessageV4ToSendEkilt(keysAlice.address) + ), + events: { + sender: [ + { + section: 'polkadotXcm', + method: 'Sent', + }, + ], + receiver: [ + { + section: 'messageQueue', + method: 'Processed', + }, + ], + }, + }, + }, +] diff --git a/integration-tests/chopsticks/src/tests/switchPallet/switchConfig/noSwitchPair/index.test.ts b/integration-tests/chopsticks/src/tests/switchPallet/switchConfig/noSwitchPair/index.test.ts new file mode 100644 index 0000000000..73e23be026 --- /dev/null +++ b/integration-tests/chopsticks/src/tests/switchPallet/switchConfig/noSwitchPair/index.test.ts @@ -0,0 +1,77 @@ +import { describe, beforeEach, it, afterEach } from 'vitest' +import { sendTransaction, withExpect } from '@acala-network/chopsticks-testing' +import type { KeyringPair } from '@polkadot/keyring/types' + +import { createBlock } from '../../../../network/utils.js' +import { hexAddress } from '../../../../helper/utils.js' +import { testCases } from './config.js' +import type { Config } from '../../../../network/types.js' +import { spinUpNetwork, tearDownNetwork } from '../../../utils.js' + +describe.each(testCases)( + 'Switch eKILTs while no pair set', + + ({ account, query, txContext, config }) => { + let senderContext: Config + let receiverContext: Config + let relayContext: Config + let senderAccount: KeyringPair + const { desc } = config + + // Create the network context + beforeEach(async () => { + const { relayChainContext, parachainContexts } = await spinUpNetwork(config) + relayContext = relayChainContext + senderContext = parachainContexts[0] + receiverContext = parachainContexts[1] + senderAccount = account + }) + + // Shut down the network + afterEach(async () => await tearDownNetwork([receiverContext, senderContext, relayContext])) + + it(desc, async ({ expect }) => { + const { checkSystemEvents, checkEvents } = withExpect(expect) + const { tx, balanceToTransfer, events } = txContext + + // pre condition checks + const balanceBeforeTx = await query.receiver(receiverContext, hexAddress(senderAccount.address)) + const balanceBeforeTxSender = await query.sender(senderContext, hexAddress(senderAccount.address)) + expect(balanceBeforeTx).toBe(0n) + expect(balanceBeforeTxSender).toBeGreaterThan(0n) + + // action + const rawTx = tx(senderContext, balanceToTransfer.toString()) + const events1 = await sendTransaction(rawTx.signAsync(senderAccount)) + + // process tx + await createBlock(senderContext) + // process msg + await createBlock(receiverContext) + + // post condition checks + // check balance movement on sender chain. + const balanceAfterTxSender = await query.sender(senderContext, hexAddress(senderAccount.address)) + expect(balanceAfterTxSender).toBe(balanceBeforeTxSender - balanceToTransfer) + + // Tx should fail on receiver + const balanceAfterTx = await query.receiver(receiverContext, hexAddress(senderAccount.address)) + expect(balanceAfterTx).toBe(0n) + + // check events + events.sender.map( + async (pallet) => + await checkEvents(events1, pallet).toMatchSnapshot( + `Switch eKILTs on sender chain: ${JSON.stringify(pallet)}` + ) + ) + + events.receiver.map( + async (pallet) => + await checkSystemEvents(receiverContext, pallet).toMatchSnapshot( + `Switch eKILTs on receiver chain: ${JSON.stringify(pallet)}` + ) + ) + }) + } +) diff --git a/integration-tests/chopsticks/src/tests/switchPallet/switchConfig/otherReserveLocation/__snapshots__/index.test.ts.snap b/integration-tests/chopsticks/src/tests/switchPallet/switchConfig/otherReserveLocation/__snapshots__/index.test.ts.snap new file mode 100644 index 0000000000..82557e2c79 --- /dev/null +++ b/integration-tests/chopsticks/src/tests/switchPallet/switchConfig/otherReserveLocation/__snapshots__/index.test.ts.snap @@ -0,0 +1,123 @@ +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html + +exports[`Switch other reserve location > V4 LIVE > Switch eKILTs from untrusted location receiver: {"section":"messageQueue","method":"ProcessingFailed"} 1`] = ` +[ + { + "data": { + "error": "Unsupported", + "id": "(hash)", + "origin": "Parent", + }, + "method": "ProcessingFailed", + "section": "messageQueue", + }, +] +`; + +exports[`Switch other reserve location > V4 LIVE > Switch eKILTs from untrusted location sender: {"section":"xcmPallet","method":"Sent"} 1`] = ` +[ + { + "data": { + "destination": { + "interior": { + "X1": [ + { + "Parachain": "(rounded 2100)", + }, + ], + }, + "parents": 0, + }, + "message": [ + { + "ReserveAssetDeposited": [ + { + "fun": { + "Fungible": 1000000000000000, + }, + "id": { + "interior": { + "X2": [ + { + "GlobalConsensus": { + "Ethereum": { + "chainId": 1, + }, + }, + }, + { + "AccountKey20": { + "key": "0x5d3d01fd6d2ad1169b17918eb4f153c6616288eb", + "network": null, + }, + }, + ], + }, + "parents": 2, + }, + }, + ], + }, + "ClearOrigin", + { + "BuyExecution": { + "fees": { + "fun": { + "Fungible": 1000000000000000, + }, + "id": { + "interior": { + "X2": [ + { + "GlobalConsensus": { + "Ethereum": { + "chainId": 1, + }, + }, + }, + { + "AccountKey20": { + "key": "0x5d3d01fd6d2ad1169b17918eb4f153c6616288eb", + "network": null, + }, + }, + ], + }, + "parents": 2, + }, + }, + "weightLimit": "Unlimited", + }, + }, + { + "DepositAsset": { + "assets": { + "Wild": "All", + }, + "beneficiary": { + "interior": { + "X1": [ + { + "AccountId32": { + "id": "(hash)", + "network": null, + }, + }, + ], + }, + "parents": 0, + }, + }, + }, + ], + "messageId": "(hash)", + "origin": { + "interior": "Here", + "parents": 0, + }, + }, + "method": "Sent", + "section": "xcmPallet", + }, +] +`; diff --git a/integration-tests/chopsticks/src/tests/switchPallet/switchConfig/otherReserveLocation/config.ts b/integration-tests/chopsticks/src/tests/switchPallet/switchConfig/otherReserveLocation/config.ts new file mode 100644 index 0000000000..3b3246ff1a --- /dev/null +++ b/integration-tests/chopsticks/src/tests/switchPallet/switchConfig/otherReserveLocation/config.ts @@ -0,0 +1,75 @@ +import type { EventFilter } from '@acala-network/chopsticks-testing' +import type { ApiPromise } from '@polkadot/api' +import type { SubmittableExtrinsic } from '@polkadot/api/types' +import type { KeyringPair } from '@polkadot/keyring/types' + +import { keysAlice, KILT } from '../../../../helper/utils.js' +import { mainChains } from '../../../../network/index.js' +import { tx, query } from '../../../../helper/api.js' +import type { BasicConfig } from '../../../types.js' +import { getDepositXcmMessageV3 } from '../../index.js' + +interface Query { + receiver: ({ api }: { api: ApiPromise }, address: string) => Promise +} + +interface Events { + // events to check after the transaction on the native chain + sender: EventFilter[] + // events to check after the transaction on the foreign chain + receiver: EventFilter[] +} + +interface TxContext { + // amount of funds to transfer + balanceToTransfer: bigint + // transactions to execute + tx: ({ api }: { api: ApiPromise }, xcmMessage: object) => SubmittableExtrinsic<'promise'> + // the xcm message to send + message: (amount: string, receiver: string) => object + // events to check after the transaction + events: Events +} + +interface TestConfiguration { + config: BasicConfig + query: Query + txContext: TxContext + account: KeyringPair +} + +// Test pairs for limited reserve transfers +export const testCases: TestConfiguration[] = [ + { + config: { + desc: 'V4 LIVE', + network: { + relay: { option: mainChains.polkadot.getConfig({}), storage: {}, setUpTx: [] }, + parachains: [{ option: mainChains.kilt.getConfig({}), setUpTx: [], storage: {} }], + }, + }, + account: keysAlice, + query: { + receiver: query.balances, + }, + txContext: { + balanceToTransfer: KILT, + message: getDepositXcmMessageV3(mainChains.assetHub.chainInfo.eKiltLocation), + tx: tx.xcmPallet.send(tx.xcmPallet.parachainV3(0, mainChains.kilt.chainInfo.paraId)), + events: { + sender: [ + { + section: 'xcmPallet', + method: 'Sent', + }, + ], + receiver: [ + { + section: 'messageQueue', + method: 'ProcessingFailed', + }, + ], + }, + }, + }, +] diff --git a/integration-tests/chopsticks/src/tests/switchPallet/switchConfig/otherReserveLocation/index.test.ts b/integration-tests/chopsticks/src/tests/switchPallet/switchConfig/otherReserveLocation/index.test.ts new file mode 100644 index 0000000000..080b2a93e5 --- /dev/null +++ b/integration-tests/chopsticks/src/tests/switchPallet/switchConfig/otherReserveLocation/index.test.ts @@ -0,0 +1,69 @@ +import { describe, beforeEach, it, afterEach } from 'vitest' +import { withExpect } from '@acala-network/chopsticks-testing' +import type { KeyringPair } from '@polkadot/keyring/types' + +import { createBlock, scheduleTx } from '../../../../network/utils.js' +import { hexAddress, keysAlice } from '../../../../helper/utils.js' +import { testCases } from './config.js' +import type { Config } from '../../../../network/types.js' +import { spinUpNetwork, tearDownNetwork } from '../../../utils.js' + +describe.each(testCases)( + 'Switch other reserve location', + + ({ account, query, txContext, config }) => { + let receiverContext: Config + let relayContext: Config + let senderAccount: KeyringPair + const { desc } = config + + // Create the network context + beforeEach(async () => { + const { parachainContexts, relayChainContext } = await spinUpNetwork(config) + + relayContext = relayChainContext + receiverContext = parachainContexts[0] + senderAccount = account + }) + + // Shut down the network + afterEach(async () => await tearDownNetwork([receiverContext, relayContext])) + + it(desc, async ({ expect }) => { + const { checkSystemEvents } = withExpect(expect) + const { tx, balanceToTransfer, events, message } = txContext + + // precondition checks + const balanceBeforeTx = await query.receiver(receiverContext, hexAddress(senderAccount.address)) + expect(balanceBeforeTx).toBe(0n) + + // action + // schedule tx + const rawTx = tx(relayContext, message(balanceToTransfer.toString(), keysAlice.address)) + await scheduleTx(relayContext, rawTx.method.toHex()) + // process tx + await createBlock(relayContext) + // process msg + await createBlock(receiverContext) + + // post condition checks + const balanceAfterTx = await query.receiver(receiverContext, hexAddress(senderAccount.address)) + expect(balanceAfterTx).toBe(0n) + + // check events + events.sender.map( + async (pallet) => + await checkSystemEvents(relayContext, pallet).toMatchSnapshot( + `Switch eKILTs from untrusted location sender: ${JSON.stringify(pallet)}` + ) + ) + + events.receiver.map( + async (pallet) => + await checkSystemEvents(receiverContext, pallet).toMatchSnapshot( + `Switch eKILTs from untrusted location receiver: ${JSON.stringify(pallet)}` + ) + ) + }) + } +) diff --git a/integration-tests/chopsticks/src/tests/switchPallet/switchEkiltAgainstKilt.test.ts b/integration-tests/chopsticks/src/tests/switchPallet/switchEkiltAgainstKilt.test.ts deleted file mode 100644 index 4c3567659d..0000000000 --- a/integration-tests/chopsticks/src/tests/switchPallet/switchEkiltAgainstKilt.test.ts +++ /dev/null @@ -1,133 +0,0 @@ -import { test } from 'vitest' -import { sendTransaction, withExpect } from '@acala-network/chopsticks-testing' - -import * as PeregrineConfig from '../../network/peregrine.js' -import * as AssetHubConfig from '../../network/assetHub.js' -import { KILT, ROC, getAssetSwitchParameters, initialBalanceROC, keysAlice, keysCharlie } from '../../utils.js' -import { - peregrineContext, - getFreeBalancePeregrine, - getFreeRocPeregrine, - getFreeEkiltAssetHub, - assethubContext, - getRemoteLockedSupply, -} from '../index.js' -import { - checkSwitchPalletInvariant, - checkBalance, - createBlock, - setStorage, - getXcmMessageV4ToSendEkilt, - checkBalanceInRange, - checkBalanceMovementIncomingSwitch, -} from '../utils.js' -import { getSiblingLocationV4 } from '../../network/utils.js' - -test('Switch ePILTs against PILTS on Peregrine', async ({ expect }) => { - const { checkSystemEvents } = withExpect(expect) - - const switchParameters = getAssetSwitchParameters() - // alice has the whole circulating supply. - const fundsAlice = switchParameters.circulatingSupply - const feeAmount = (ROC * BigInt(10)) / BigInt(100) - - const remoteAssetId = { V4: AssetHubConfig.eKiltLocation } - const remoteXcmFeeId = { V4: { id: AssetHubConfig.nativeTokenLocation, fun: { Fungible: feeAmount } } } - const remoteReserveLocation = getSiblingLocationV4(AssetHubConfig.paraId) - - await setStorage(peregrineContext, { - ...PeregrineConfig.createAndAssignRocs(keysCharlie.address, [keysAlice.address], initialBalanceROC), - ...PeregrineConfig.setSwitchPair(switchParameters, remoteAssetId, remoteXcmFeeId, remoteReserveLocation), - ...PeregrineConfig.setSafeXcmVersion4(), - }) - - await setStorage(assethubContext, { - ...AssetHubConfig.assignDotTokensToAccountsAsStorage( - [keysAlice.address, PeregrineConfig.sovereignAccountAsSibling], - initialBalanceROC - ), - ...AssetHubConfig.createForeignAsset(keysCharlie.address), - }) - - await setStorage( - assethubContext, - AssetHubConfig.assignForeignAssetToAccounts([ - [PeregrineConfig.sovereignAccountAsSibling, switchParameters.sovereignSupply], - [keysAlice.address, fundsAlice], - ]) - ) - - // check initial balance of Alice on Spiritnet. Alice should have 0 KILT - await checkBalance(getFreeBalancePeregrine, keysAlice.address, expect, BigInt(0)) - await checkBalance(getFreeRocPeregrine, keysAlice.address, expect, initialBalanceROC) - await checkBalance(getFreeEkiltAssetHub, keysAlice.address, expect, switchParameters.circulatingSupply) - - const initialBalancePoolAccount = await getFreeBalancePeregrine(PeregrineConfig.initialPoolAccountId) - const initialBalanceSovereignAccount = await getFreeEkiltAssetHub(PeregrineConfig.sovereignAccountAsSibling) - const initialRemoteLockedSupply = await getRemoteLockedSupply() - - // 50 PILTS - const balanceToTransfer = BigInt('50000000000000000') - - const dest = getSiblingLocationV4(PeregrineConfig.paraId) - - const remoteFeeId = { V4: AssetHubConfig.eKiltLocation } - - const funds = { - V4: [ - { - id: AssetHubConfig.eKiltLocation, - fun: { Fungible: balanceToTransfer.toString() }, - }, - ], - } - - const signedTx = assethubContext.api.tx.polkadotXcm.transferAssetsUsingTypeAndThen( - dest, - funds, - 'LocalReserve', - remoteFeeId, - 'LocalReserve', - getXcmMessageV4ToSendEkilt(keysAlice.address), - 'Unlimited' - ) - - // send msg - await sendTransaction(signedTx.signAsync(keysAlice)) - await createBlock(assethubContext) - - // check balance. Alice should have 50 ePILTs less - const freeBalanceAlice = await getFreeEkiltAssetHub(keysAlice.address) - expect(freeBalanceAlice).toBe(fundsAlice - balanceToTransfer) - - // the sovereign account should have 50 more PILTs - const balanceSovereignAccountAfterTx = await getFreeEkiltAssetHub(PeregrineConfig.sovereignAccountAsSibling) - expect(balanceSovereignAccountAfterTx).eq(initialBalanceSovereignAccount + balanceToTransfer) - - await createBlock(peregrineContext) - - checkSystemEvents(peregrineContext, 'messageQueue').toMatchSnapshot('receiver Peregrine::messageQueue::[Processed]') - checkSystemEvents(peregrineContext, 'assetSwitchPool1').toMatchSnapshot( - 'receiver Peregrine::assetSwitchPool1::[RemoteToLocalSwitchExecuted]' - ) - checkSystemEvents(peregrineContext, { section: 'balances', method: 'Transfer' }).toMatchSnapshot( - 'receiver Peregrine::balances::[Transfer]' - ) - - // Alice should have some coins now. Calculating the exact amount is not easy. Since fees are taken by xcm. - checkBalanceInRange(getFreeBalancePeregrine, keysAlice.address, expect, [ - balanceToTransfer - KILT, - balanceToTransfer, - ]) - - // Pool account should have less locked PILTs - const freeBalancePoolAccount = await getFreeBalancePeregrine(PeregrineConfig.initialPoolAccountId) - expect(initialBalancePoolAccount - balanceToTransfer).toBe(freeBalancePoolAccount) - - // remote locked supply should have increased by the amount of the transferred PILTs - const remoteLockedSupply = await getRemoteLockedSupply() - expect(remoteLockedSupply).toBe(initialRemoteLockedSupply + balanceToTransfer) - - await checkSwitchPalletInvariant(expect) - await checkBalanceMovementIncomingSwitch(balanceToTransfer, expect, keysAlice.address) -}, 20_000) diff --git a/integration-tests/chopsticks/src/tests/switchPallet/switchEkilts/__snapshots__/index.test.ts.snap b/integration-tests/chopsticks/src/tests/switchPallet/switchEkilts/__snapshots__/index.test.ts.snap new file mode 100644 index 0000000000..2729a0bd8e --- /dev/null +++ b/integration-tests/chopsticks/src/tests/switchPallet/switchEkilts/__snapshots__/index.test.ts.snap @@ -0,0 +1,165 @@ +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html + +exports[`Switch EKILTs > V4 LIVE > Switch eKILTs receiver {"section":"assetSwitchPool1","method":"RemoteToLocalSwitchExecuted"} 1`] = ` +[ + { + "data": { + "amount": "(rounded 1000000000000000)", + "to": "4seWojfEHrk5YKPahdErazQ3CWEHZYi6NV4gKz5AaejWbRPJ", + }, + "method": "RemoteToLocalSwitchExecuted", + "section": "assetSwitchPool1", + }, +] +`; + +exports[`Switch EKILTs > V4 LIVE > Switch eKILTs sender {"section":"foreignAssets","method":"Transferred"} 1`] = ` +[ + { + "data": { + "amount": 1000000000000000, + "assetId": { + "interior": { + "X2": [ + { + "GlobalConsensus": { + "Ethereum": { + "chainId": 1, + }, + }, + }, + { + "AccountKey20": { + "key": "0x5d3d01fd6d2ad1169b17918eb4f153c6616288eb", + "network": null, + }, + }, + ], + }, + "parents": 2, + }, + "from": "15jSz35ugoWTc61xHPoxEkHte4o7UanKCk1gx1dizA8yuNs8", + "to": "13cKp88mpGREFCq8KsJEFjpSBnjFuCNWq6bmD3js7fu4f66e", + }, + "method": "Transferred", + "section": "foreignAssets", + }, +] +`; + +exports[`Switch EKILTs > V4 LIVE > Switch eKILTs sender {"section":"polkadotXcm","method":"Sent"} 1`] = ` +[ + { + "data": { + "destination": { + "interior": { + "X1": [ + { + "Parachain": "(rounded 2100)", + }, + ], + }, + "parents": 1, + }, + "message": [ + { + "ReserveAssetDeposited": [ + { + "fun": { + "Fungible": 1000000000000000, + }, + "id": { + "interior": { + "X2": [ + { + "GlobalConsensus": { + "Ethereum": { + "chainId": 1, + }, + }, + }, + { + "AccountKey20": { + "key": "0x5d3d01fd6d2ad1169b17918eb4f153c6616288eb", + "network": null, + }, + }, + ], + }, + "parents": 2, + }, + }, + ], + }, + "ClearOrigin", + { + "BuyExecution": { + "fees": { + "fun": { + "Fungible": 1000000000000000, + }, + "id": { + "interior": { + "X2": [ + { + "GlobalConsensus": { + "Ethereum": { + "chainId": 1, + }, + }, + }, + { + "AccountKey20": { + "key": "0x5d3d01fd6d2ad1169b17918eb4f153c6616288eb", + "network": null, + }, + }, + ], + }, + "parents": 2, + }, + }, + "weightLimit": "Unlimited", + }, + }, + { + "DepositAsset": { + "assets": { + "Wild": "All", + }, + "beneficiary": { + "interior": { + "X1": [ + { + "AccountId32": { + "id": "(hash)", + "network": null, + }, + }, + ], + }, + "parents": 0, + }, + }, + }, + ], + "messageId": "(hash)", + "origin": { + "interior": { + "X1": [ + { + "AccountId32": { + "id": "(hash)", + "network": "Polkadot", + }, + }, + ], + }, + "parents": 0, + }, + }, + "method": "Sent", + "section": "polkadotXcm", + }, +] +`; diff --git a/integration-tests/chopsticks/src/tests/switchPallet/switchEkilts/config.ts b/integration-tests/chopsticks/src/tests/switchPallet/switchEkilts/config.ts new file mode 100644 index 0000000000..77241c11da --- /dev/null +++ b/integration-tests/chopsticks/src/tests/switchPallet/switchEkilts/config.ts @@ -0,0 +1,94 @@ +import type { EventFilter } from '@acala-network/chopsticks-testing' +import type { ApiPromise } from '@polkadot/api' +import type { SubmittableExtrinsic } from '@polkadot/api/types' +import type { KeyringPair } from '@polkadot/keyring/types' + +import { initialBalanceKILT, keysAlice } from '../../../helper/utils.js' +import { mainChains } from '../../../network/index.js' +import { tx, query } from '../../../helper/api.js' +import { getXcmMessageV4ToSendEkilt } from '../index.js' +import type { BasicConfig, SovereignAccount } from '../../types.js' + +interface Query { + sender: ({ api }: { api: ApiPromise }, address: string) => Promise + + receiver: ({ api }: { api: ApiPromise }, address: string) => Promise +} + +interface Events { + sender: EventFilter[] + + receiver: EventFilter[] +} + +interface TxContext { + // amount of funds to transfer + balanceToTransfer: bigint + // transactions to execute + tx: ({ api }: { api: ApiPromise }, amount: string) => SubmittableExtrinsic<'promise'> + // events to check after the transaction + events: Events +} + +interface TestConfiguration { + config: BasicConfig + query: Query + txContext: TxContext + account: KeyringPair + sovereignAccount: SovereignAccount +} + +export const testCases: TestConfiguration[] = [ + { + config: { + desc: 'V4 LIVE', + network: { + relay: { option: mainChains.polkadot.getConfig({}), setUpTx: [], storage: {} }, + parachains: [ + { + option: mainChains.assetHub.getConfig({}), + storage: { + // Assign some coins to create the account. + ...mainChains.assetHub.storage.assignNativeTokensToAccountsAsStorage([keysAlice.address]), + // Assign the foreign asset to the account + ...mainChains.assetHub.storage.assignForeignAssetToAccounts([ + [keysAlice.address, initialBalanceKILT], + ]), + }, + setUpTx: [], + }, + { + option: mainChains.kilt.getConfig({}), + storage: {}, + setUpTx: [], + }, + ], + }, + }, + account: keysAlice, + query: { + sender: query.foreignAssets(mainChains.assetHub.chainInfo.eKiltLocation), + receiver: query.balances, + }, + txContext: { + tx: tx.xcmPallet.transferAssetsUsingTypeAndThenV4( + tx.xcmPallet.parachainV4(1, mainChains.kilt.chainInfo.paraId), + mainChains.assetHub.chainInfo.eKiltLocation, + getXcmMessageV4ToSendEkilt(keysAlice.address) + ), + events: { + sender: [ + { section: 'foreignAssets', method: 'Transferred' }, + { section: 'polkadotXcm', method: 'Sent' }, + ], + + receiver: [{ section: 'assetSwitchPool1', method: 'RemoteToLocalSwitchExecuted' }], + }, + balanceToTransfer: BigInt(1e15), + }, + sovereignAccount: { + sender: mainChains.kilt.chainInfo.sovereignAccountOnSiblingChains, + receiver: mainChains.assetHub.chainInfo.sovereignAccountOnSiblingChains, + }, + }, +] as const diff --git a/integration-tests/chopsticks/src/tests/switchPallet/switchEkilts/index.test.ts b/integration-tests/chopsticks/src/tests/switchPallet/switchEkilts/index.test.ts new file mode 100644 index 0000000000..df9ac84d87 --- /dev/null +++ b/integration-tests/chopsticks/src/tests/switchPallet/switchEkilts/index.test.ts @@ -0,0 +1,108 @@ +import { describe, beforeEach, it, afterEach } from 'vitest' +import { sendTransaction, withExpect } from '@acala-network/chopsticks-testing' +import type { KeyringPair } from '@polkadot/keyring/types' + +import { createBlock } from '../../../network/utils.js' +import { hexAddress } from '../../../helper/utils.js' +import { testCases } from './config.js' +import type { Config } from '../../../network/types.js' +import { checkSwitchPalletInvariant, getPoolAccount, getReceivedNativeTokens, getRemoteLockedSupply } from '../index.js' +import { spinUpNetwork, tearDownNetwork } from '../../utils.js' + +describe.each(testCases)( + 'Switch EKILTs', + + ({ account, query, txContext, config, sovereignAccount }) => { + let senderContext: Config + let receiverContext: Config + let relayContext: Config + let senderAccount: KeyringPair + const { desc } = config + + // Create the network context + beforeEach(async () => { + const { parachainContexts, relayChainContext } = await spinUpNetwork(config) + + relayContext = relayChainContext + senderContext = parachainContexts[0] + receiverContext = parachainContexts[1] + senderAccount = account + }) + + // Shut down the network + afterEach(async () => await tearDownNetwork([receiverContext, senderContext, relayContext])) + + it(desc, { timeout: 10000 }, async ({ expect }) => { + const { checkEvents, checkSystemEvents } = withExpect(expect) + + const poolAccount = await getPoolAccount(receiverContext) + + // pre condition checks + const initialRemoteLockedSupply = await getRemoteLockedSupply(receiverContext) + const initialBalanceReceiverChain = await query.receiver(receiverContext, hexAddress(senderAccount.address)) + const initialBalanceSenderChain = await query.sender(senderContext, hexAddress(senderAccount.address)) + const initialBalancePoolAccount = await query.receiver(receiverContext, poolAccount) + const initialBalanceSovereignAccount = await query.sender(senderContext, sovereignAccount.sender) + const initialBalanceUserSenderChain = await query.sender(senderContext, hexAddress(senderAccount.address)) + const initialBalanceUserReceiverChain = await query.receiver( + receiverContext, + hexAddress(senderAccount.address) + ) + expect(initialBalanceReceiverChain).toBe(0n) + expect(initialBalanceSenderChain).toBeGreaterThan(0n) + + // action + const { balanceToTransfer, events, tx } = txContext + const signedTx = tx(senderContext, balanceToTransfer.toString()).signAsync(senderAccount) + const eventsResult = await sendTransaction(signedTx) + + // process tx + await createBlock(senderContext) + // process xcm message + await createBlock(receiverContext) + + // post condition checks + const remoteLockedSupply = await getRemoteLockedSupply(receiverContext) + const balanceSovereignAccount = await query.sender(senderContext, sovereignAccount.sender) + const balanceSenderChain = await query.sender(senderContext, hexAddress(senderAccount.address)) + const balancePoolAccount = await query.receiver(receiverContext, poolAccount) + const balanceUserReceiverChain = await query.receiver(receiverContext, hexAddress(senderAccount.address)) + const receivedFunds = await getReceivedNativeTokens(receiverContext) + + expect(initialBalanceSovereignAccount + balanceToTransfer).toBe(balanceSovereignAccount) + expect(initialBalanceUserSenderChain - balanceToTransfer).toBe(balanceSenderChain) + + expect(balancePoolAccount + balanceToTransfer).toBe(initialBalancePoolAccount) + expect(balanceUserReceiverChain - receivedFunds).toBe(initialBalanceUserReceiverChain) + + expect(remoteLockedSupply).toBe(initialRemoteLockedSupply + balanceToTransfer) + + // check events + await Promise.all( + events.sender.map( + async (pallet) => + await checkEvents(eventsResult, pallet).toMatchSnapshot( + `Switch eKILTs sender ${JSON.stringify(pallet)}` + ) + ) + ) + + await Promise.all( + events.receiver.map((pallet) => + checkSystemEvents(receiverContext, pallet).toMatchSnapshot( + `Switch eKILTs receiver ${JSON.stringify(pallet)}` + ) + ) + ) + + checkSwitchPalletInvariant( + expect, + receiverContext, + senderContext, + sovereignAccount.sender, + query.receiver, + query.sender + ) + }) + } +) diff --git a/integration-tests/chopsticks/src/tests/switchPallet/switchKiltAgainstEkilt.test.ts b/integration-tests/chopsticks/src/tests/switchPallet/switchKiltAgainstEkilt.test.ts deleted file mode 100644 index 7ead648161..0000000000 --- a/integration-tests/chopsticks/src/tests/switchPallet/switchKiltAgainstEkilt.test.ts +++ /dev/null @@ -1,129 +0,0 @@ -import { test } from 'vitest' -import { sendTransaction, withExpect } from '@acala-network/chopsticks-testing' - -import * as PeregrineConfig from '../../network/peregrine.js' -import * as AssetHubConfig from '../../network/assetHub.js' -import { - getAssetSwitchParameters, - initialBalanceKILT, - initialBalanceROC, - keysAlice, - keysCharlie, - ROC, -} from '../../utils.js' -import { - peregrineContext, - getFreeBalancePeregrine, - getFreeRocPeregrine, - getFreeEkiltAssetHub, - assethubContext, - getFreeRocAssetHub, - getRemoteLockedSupply, -} from '../index.js' -import { checkSwitchPalletInvariant, checkBalance, createBlock, setStorage, hexAddress } from '../utils.js' -import { getAccountLocationV4, getSiblingLocationV4 } from '../../network/utils.js' - -test('Switch PILTs against ePILTS on AssetHub', async ({ expect }) => { - const { checkEvents } = withExpect(expect) - - const switchParameters = getAssetSwitchParameters() - const feeAmount = (ROC * BigInt(10)) / BigInt(100) - - const remoteAssetId = { V4: AssetHubConfig.eKiltLocation } - const remoteXcmFeeId = { V4: { id: AssetHubConfig.nativeTokenLocation, fun: { Fungible: feeAmount } } } - const remoteReserveLocation = getSiblingLocationV4(AssetHubConfig.paraId) - - // Assign alice some KILT and ROC tokens - await setStorage(peregrineContext, { - ...PeregrineConfig.assignNativeTokensToAccounts([keysAlice.address], initialBalanceKILT), - ...PeregrineConfig.createAndAssignRocs(keysCharlie.address, [keysAlice.address], initialBalanceROC), - ...PeregrineConfig.setSafeXcmVersion4(), - }) - - await setStorage( - peregrineContext, - PeregrineConfig.setSwitchPair(switchParameters, remoteAssetId, remoteXcmFeeId, remoteReserveLocation) - ) - - await setStorage(assethubContext, { - ...AssetHubConfig.assignDotTokensToAccountsAsStorage( - [keysAlice.address, PeregrineConfig.sovereignAccountAsSibling], - initialBalanceROC - ), - ...AssetHubConfig.createForeignAsset(keysCharlie.address), - }) - - await setStorage( - assethubContext, - AssetHubConfig.assignForeignAssetToAccounts([ - [PeregrineConfig.sovereignAccountAsSibling, switchParameters.sovereignSupply], - ]) - ) - - // check initial balance of Alice on Spiritnet - await checkBalance(getFreeBalancePeregrine, keysAlice.address, expect, initialBalanceKILT) - await checkBalance(getFreeRocPeregrine, keysAlice.address, expect, initialBalanceROC) - - // Alice should have NO eKILT on AH - await checkBalance(getFreeEkiltAssetHub, keysAlice.address, expect, BigInt(0)) - - // initial balance of the pool account and sovereign account - const initialBalancePoolAccount = await getFreeBalancePeregrine(PeregrineConfig.initialPoolAccountId) - const initialBalanceSovereignAccount = await getFreeEkiltAssetHub(PeregrineConfig.sovereignAccountAsSibling) - const initialBalanceRocSovereignAccount = await getFreeRocAssetHub(PeregrineConfig.sovereignAccountAsSibling) - const initialRemoteLockedSupply = await getRemoteLockedSupply() - - // 50 PILTS - const balanceToTransfer = BigInt('50000000000000000') - - const beneficiary = getAccountLocationV4(hexAddress(keysAlice.address)) - - const signedTx = peregrineContext.api.tx.assetSwitchPool1.switch(balanceToTransfer.toString(), beneficiary) - const fees = (await signedTx.paymentInfo(keysAlice)).partialFee.toBigInt() - - const events = await sendTransaction(signedTx.signAsync(keysAlice)) - - await createBlock(peregrineContext) - - await checkEvents(events, 'xcmpQueue').toMatchSnapshot('sender Peregrine::xcmpQueue::[XcmpMessageSent]') - await checkEvents(events, 'assetSwitchPool1').toMatchSnapshot( - 'sender Peregrine::assetSwitchPool1::[LocalToRemoteSwitchExecuted]' - ) - await checkEvents(events, { section: 'balances', method: 'Transfer' }).toMatchSnapshot( - 'sender Peregrine::balances::[Transfer]' - ) - - // check balance. Alice had 50 PILts - const freeBalanceAlice = await getFreeBalancePeregrine(keysAlice.address) - expect(freeBalanceAlice).toBe(initialBalanceKILT - balanceToTransfer - fees) - - // check balance Alice. Some fees should have been paid with her rocs: - const freeRocBalanceAlice = await getFreeRocPeregrine(keysAlice.address) - expect(freeRocBalanceAlice).eq(initialBalanceROC - BigInt(PeregrineConfig.remoteFee)) - - // the Switch pool account should have 50 more PILTs - const balancePoolAccountAfterTx = await getFreeBalancePeregrine(PeregrineConfig.initialPoolAccountId) - expect(balancePoolAccountAfterTx).eq(initialBalancePoolAccount + balanceToTransfer) - - // process the msg - await createBlock(assethubContext) - - // alice should have the exact transferred amount of eKILT. Fees are paid by sovereign account - const freeBalanceAliceAssetHub = await getFreeEkiltAssetHub(keysAlice.address) - expect(freeBalanceAliceAssetHub).eq(balanceToTransfer) - - // sovereign account should have less eKILT by the amount of the transferred PILTs - const freeBalanceSovereignAccount = await getFreeEkiltAssetHub(PeregrineConfig.sovereignAccountAsSibling) - expect(initialBalanceSovereignAccount - balanceToTransfer).eq(freeBalanceSovereignAccount) - - // sovereign account should have paid the fees. Calculating the fees is not simple in context of XCM. - // We just check that the balance has decreased - const freeRocsSovereignAccount = await getFreeRocAssetHub(PeregrineConfig.sovereignAccountAsSibling) - expect(freeRocsSovereignAccount).toBeLessThan(initialBalanceRocSovereignAccount) - - // remote locked supply should have decreased by the amount of the transferred PILTs - const remoteLockedSupply = await getRemoteLockedSupply() - expect(remoteLockedSupply).eq(initialRemoteLockedSupply - balanceToTransfer) - - await checkSwitchPalletInvariant(expect) -}, 20_000) diff --git a/integration-tests/chopsticks/src/tests/switchPallet/switchKilts/__snapshots__/index.test.ts.snap b/integration-tests/chopsticks/src/tests/switchPallet/switchKilts/__snapshots__/index.test.ts.snap new file mode 100644 index 0000000000..b55719c983 --- /dev/null +++ b/integration-tests/chopsticks/src/tests/switchPallet/switchKilts/__snapshots__/index.test.ts.snap @@ -0,0 +1,118 @@ +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html + +exports[`Switch KILTs > V4 LIVE > AssetSwitchPool1 Finalization 1`] = ` +[ + { + "data": { + "amount": 1000000000000000, + "from": "4seWojfEHrk5YKPahdErazQ3CWEHZYi6NV4gKz5AaejWbRPJ", + "to": { + "V4": { + "interior": { + "X1": [ + { + "AccountId32": { + "id": "(hash)", + "network": null, + }, + }, + ], + }, + "parents": 0, + }, + }, + }, + "method": "LocalToRemoteSwitchFinalized", + "section": "assetSwitchPool1", + }, +] +`; + +exports[`Switch KILTs > V4 LIVE > Switch KILTs receiver chain: "foreignAssets" 1`] = ` +[ + { + "data": { + "assetId": { + "interior": { + "X2": [ + { + "GlobalConsensus": { + "Ethereum": { + "chainId": 1, + }, + }, + }, + { + "AccountKey20": { + "key": "0x5d3d01fd6d2ad1169b17918eb4f153c6616288eb", + "network": null, + }, + }, + ], + }, + "parents": 2, + }, + "balance": 1000000000000000, + "owner": "13cKp88mpGREFCq8KsJEFjpSBnjFuCNWq6bmD3js7fu4f66e", + }, + "method": "Burned", + "section": "foreignAssets", + }, + { + "data": { + "amount": 1000000000000000, + "assetId": { + "interior": { + "X2": [ + { + "GlobalConsensus": { + "Ethereum": { + "chainId": 1, + }, + }, + }, + { + "AccountKey20": { + "key": "0x5d3d01fd6d2ad1169b17918eb4f153c6616288eb", + "network": null, + }, + }, + ], + }, + "parents": 2, + }, + "owner": "15jSz35ugoWTc61xHPoxEkHte4o7UanKCk1gx1dizA8yuNs8", + }, + "method": "Issued", + "section": "foreignAssets", + }, +] +`; + +exports[`Switch KILTs > V4 LIVE > Switch KILTs sender chain: {"section":"assetSwitchPool1","method":"LocalToRemoteSwitchExecuted"} 1`] = ` +[ + { + "data": { + "amount": 1000000000000000, + "from": "4seWojfEHrk5YKPahdErazQ3CWEHZYi6NV4gKz5AaejWbRPJ", + "to": { + "V4": { + "interior": { + "X1": [ + { + "AccountId32": { + "id": "(hash)", + "network": null, + }, + }, + ], + }, + "parents": 0, + }, + }, + }, + "method": "LocalToRemoteSwitchExecuted", + "section": "assetSwitchPool1", + }, +] +`; diff --git a/integration-tests/chopsticks/src/tests/switchPallet/switchKilts/config.ts b/integration-tests/chopsticks/src/tests/switchPallet/switchKilts/config.ts new file mode 100644 index 0000000000..4e2deec2a6 --- /dev/null +++ b/integration-tests/chopsticks/src/tests/switchPallet/switchKilts/config.ts @@ -0,0 +1,91 @@ +import type { EventFilter } from '@acala-network/chopsticks-testing' +import type { ApiPromise } from '@polkadot/api' +import type { SubmittableExtrinsic } from '@polkadot/api/types' +import type { KeyringPair } from '@polkadot/keyring/types' + +import { keysAlice } from '../../../helper/utils.js' +import { mainChains } from '../../../network/index.js' +import { tx, query } from '../../../helper/api.js' +import type { BasicConfig, SovereignAccount } from '../../types.js' + +interface Query { + sender: ({ api }: { api: ApiPromise }, address: string) => Promise + + receiver: ({ api }: { api: ApiPromise }, address: string) => Promise +} + +interface Events { + // events to check after the transaction on the native chain + sender: EventFilter[] + // events to check after the transaction on the foreign chain + receiver: EventFilter[] +} + +interface TxContext { + // amount of funds to transfer + balanceToTransfer: bigint + // transactions to execute + tx: ( + { + api, + }: { + api: ApiPromise + }, + acc: string, + amount: string + ) => SubmittableExtrinsic<'promise'> + // events to check after the transaction + events: Events +} + +interface TestConfiguration { + config: BasicConfig + query: Query + txContext: TxContext + account: KeyringPair + sovereignAccount: SovereignAccount +} + +export const testCases: TestConfiguration[] = [ + { + config: { + desc: 'V4 LIVE', + network: { + relay: { option: mainChains.polkadot.getConfig({}), storage: {}, setUpTx: [] }, + parachains: [ + { + option: mainChains.kilt.getConfig({}), + setUpTx: [], + storage: { + // Assign some coins to create the account. + ...mainChains.kilt.storage.assignNativeTokensToAccounts([keysAlice.address]), + ...mainChains.kilt.storage.assignRelayTokensToAccounts([keysAlice.address]), + }, + }, + { + option: mainChains.assetHub.getConfig({}), + setUpTx: [], + storage: mainChains.assetHub.storage.assignNativeTokensToAccountsAsStorage([keysAlice.address]), + }, + ], + }, + }, + account: keysAlice, + query: { + sender: query.balances, + receiver: query.foreignAssets(mainChains.assetHub.chainInfo.eKiltLocation), + }, + txContext: { + tx: tx.switchPallet.switchV4(), + events: { + receiver: ['foreignAssets'], + sender: [{ section: 'assetSwitchPool1', method: 'LocalToRemoteSwitchExecuted' }], + }, + balanceToTransfer: BigInt(1e15), + }, + sovereignAccount: { + sender: mainChains.assetHub.chainInfo.sovereignAccountOnSiblingChains, + receiver: mainChains.kilt.chainInfo.sovereignAccountOnSiblingChains, + }, + }, +] as const diff --git a/integration-tests/chopsticks/src/tests/switchPallet/switchKilts/index.test.ts b/integration-tests/chopsticks/src/tests/switchPallet/switchKilts/index.test.ts new file mode 100644 index 0000000000..cdc001ed88 --- /dev/null +++ b/integration-tests/chopsticks/src/tests/switchPallet/switchKilts/index.test.ts @@ -0,0 +1,104 @@ +import { describe, beforeEach, it, afterEach } from 'vitest' +import { sendTransaction, withExpect } from '@acala-network/chopsticks-testing' +import type { KeyringPair } from '@polkadot/keyring/types' + +import { createBlock } from '../../../network/utils.js' +import { calculateTxFees, hexAddress } from '../../../helper/utils.js' +import { testCases } from './config.js' +import { Config } from '../../../network/types.js' +import { checkSwitchPalletInvariant, getPoolAccount, getRemoteLockedSupply } from '../index.js' +import { spinUpNetwork, tearDownNetwork } from '../../utils.js' + +describe.each(testCases)( + 'Switch KILTs', + + ({ account, query, txContext, config, sovereignAccount }) => { + let senderContext: Config + let receiverContext: Config + let relayContext: Config + let senderAccount: KeyringPair + const { desc } = config + + // Create the network context + beforeEach(async () => { + const { parachainContexts, relayChainContext } = await spinUpNetwork(config) + + relayContext = relayChainContext + senderContext = parachainContexts[0] + receiverContext = parachainContexts[1] + senderAccount = account + }) + + // Shut down the network + afterEach(async () => await tearDownNetwork([receiverContext, senderContext, relayContext])) + + it(desc, async ({ expect }) => { + const { checkEvents, checkSystemEvents } = withExpect(expect) + + const poolAccount = await getPoolAccount(senderContext) + + // pre condition checks + const initialRemoteLockedSupply = await getRemoteLockedSupply(senderContext) + const initialBalanceReceiverChain = await query.receiver(receiverContext, hexAddress(senderAccount.address)) + const initialBalanceSenderChain = await query.sender(senderContext, hexAddress(senderAccount.address)) + const initialBalancePoolAccount = await query.sender(senderContext, poolAccount) + const initialBalanceUserSenderChain = await query.sender(senderContext, hexAddress(senderAccount.address)) + + expect(initialBalanceReceiverChain).toBe(0n) + expect(initialBalanceSenderChain).toBeGreaterThan(0n) + + // action + const { balanceToTransfer, events, tx } = txContext + const rawTx = tx(senderContext, hexAddress(senderAccount.address), balanceToTransfer.toString()) + const eventsResult = await sendTransaction(rawTx.signAsync(senderAccount)) + + // process tx + await createBlock(senderContext) + // process xcm message + await createBlock(receiverContext) + + // check balance movement + const txFees = await calculateTxFees(rawTx, senderAccount) + const remoteLockedSupply = await getRemoteLockedSupply(senderContext) + const balanceSenderChain = await query.sender(senderContext, hexAddress(senderAccount.address)) + const balancePoolAccount = await query.sender(senderContext, poolAccount) + const balanceUserReceiverChain = await query.receiver(receiverContext, hexAddress(senderAccount.address)) + + // post condition checks + expect(initialBalanceUserSenderChain - balanceToTransfer - txFees).toBe(balanceSenderChain) + expect(initialBalancePoolAccount).toBe(balancePoolAccount - balanceToTransfer) + expect(balanceUserReceiverChain).toBeGreaterThan(0n) + expect(remoteLockedSupply).toBe(initialRemoteLockedSupply - balanceToTransfer) + + // check events + await Promise.all( + events.sender.map((pallet) => + checkEvents(eventsResult, pallet).toMatchSnapshot( + `Switch KILTs sender chain: ${JSON.stringify(pallet)}` + ) + ) + ) + + await Promise.all( + events.receiver.map((pallet) => + checkSystemEvents(receiverContext, pallet).toMatchSnapshot( + `Switch KILTs receiver chain: ${JSON.stringify(pallet)}` + ) + ) + ) + + // finalize switch + await createBlock(senderContext) + await checkSystemEvents(senderContext, 'assetSwitchPool1').toMatchSnapshot('AssetSwitchPool1 Finalization') + + await checkSwitchPalletInvariant( + expect, + senderContext, + receiverContext, + sovereignAccount.receiver, + query.sender, + query.receiver + ) + }) + } +) diff --git a/integration-tests/chopsticks/src/tests/switchPallet/trappedAssets.test.ts b/integration-tests/chopsticks/src/tests/switchPallet/trappedAssets.test.ts deleted file mode 100644 index 03bb70e879..0000000000 --- a/integration-tests/chopsticks/src/tests/switchPallet/trappedAssets.test.ts +++ /dev/null @@ -1,209 +0,0 @@ -import { test } from 'vitest' -import { sendTransaction, withExpect } from '@acala-network/chopsticks-testing' - -import * as PeregrineConfig from '../../network/peregrine.js' -import * as AssetHubConfig from '../../network/assetHub.js' -import * as RococoConfig from '../../network/rococo.js' -import { - KILT, - ROC, - getAssetSwitchParameters, - initialBalanceKILT, - initialBalanceROC, - keysAlice, - keysCharlie, -} from '../../utils.js' -import { peregrineContext, assethubContext, rococoContext } from '../index.js' -import { - createBlock, - setStorage, - hexAddress, - getXcmMessageV4ToSendEkilt, - checkSwitchPalletInvariant, -} from '../utils.js' -import { getChildLocation, getSiblingLocationV4 } from '../../network/utils.js' - -/** - * 1. send eKILTs to peregrine while switch is paused - * 2. enable switch pair again - * 3. reclaim the assets - */ -test('Trapped assets', async ({ expect }) => { - const { checkSystemEvents } = withExpect(expect) - const switchPairParameters = getAssetSwitchParameters() - const feeAmount = (ROC * BigInt(10)) / BigInt(100) - const remoteAssetId = { V4: AssetHubConfig.eKiltLocation } - const remoteXcmFeeId = { V4: { id: AssetHubConfig.nativeTokenLocation, fun: { Fungible: feeAmount } } } - const remoteReserveLocation = getSiblingLocationV4(AssetHubConfig.paraId) - - await setStorage(peregrineContext, { - ...PeregrineConfig.createAndAssignRocs(keysCharlie.address, [ - keysAlice.address, - AssetHubConfig.sovereignAccountOnSiblingChains, - ]), - ...PeregrineConfig.setSafeXcmVersion4(), - ...PeregrineConfig.assignNativeTokensToAccounts( - [keysAlice.address, AssetHubConfig.sovereignAccountOnSiblingChains], - initialBalanceKILT - ), - ...PeregrineConfig.setSudoKey(keysAlice.address), - }) - - // pause switch pair - await setStorage( - peregrineContext, - PeregrineConfig.setSwitchPair( - switchPairParameters, - remoteAssetId, - remoteXcmFeeId, - remoteReserveLocation, - PeregrineConfig.initialPoolAccountId, - 'Paused' - ) - ) - - await setStorage(rococoContext, { - ...RococoConfig.setSudoKey(keysAlice.address), - ...RococoConfig.assignNativeTokensToAccounts([keysAlice.address], initialBalanceROC), - }) - - await setStorage(assethubContext, { - ...AssetHubConfig.assignDotTokensToAccountsAsStorage( - [keysAlice.address, PeregrineConfig.sovereignAccountAsSibling], - initialBalanceROC - ), - ...AssetHubConfig.createForeignAsset(keysCharlie.address), - }) - - await setStorage( - assethubContext, - AssetHubConfig.assignForeignAssetToAccounts([ - [PeregrineConfig.sovereignAccountAsSibling, switchPairParameters.sovereignSupply], - [keysAlice.address, switchPairParameters.circulatingSupply], - ]) - ) - - // 1. send the coin and force a trap - const dest = getSiblingLocationV4(PeregrineConfig.paraId) - const remoteFeeId = { v4: AssetHubConfig.eKiltLocation } - - const funds = { - v4: [ - { - id: AssetHubConfig.eKiltLocation, - fun: { Fungible: KILT.toString() }, - }, - ], - } - - const signedTx = assethubContext.api.tx.polkadotXcm - .transferAssetsUsingTypeAndThen( - dest, - funds, - 'LocalReserve', - remoteFeeId, - 'LocalReserve', - getXcmMessageV4ToSendEkilt(keysAlice.address), - 'Unlimited' - ) - .signAsync(keysAlice) - - // send msg - await sendTransaction(signedTx) - await createBlock(assethubContext) - - // Process msg. Fails on receiver side. - await createBlock(peregrineContext) - await checkSystemEvents(peregrineContext, 'messageQueue').toMatchSnapshot( - 'receiver Peregrine::messageQueue::[Processed]' - ) - await checkSystemEvents(peregrineContext, 'polkadotXcm').toMatchSnapshot( - 'receiver Peregrine::polkadotXcm::[AssetsTrapped]' - ) - - // 2. enable switch pair again - await peregrineContext.api.tx.sudo - .sudo(peregrineContext.api.tx.assetSwitchPool1.resumeSwitchPair()) - .signAndSend(keysAlice) - - //3. reclaim msg - const reclaimMsg = [ - { WithdrawAsset: [{ id: { parents: 0, interior: 'Here' }, fun: { Fungible: KILT } }] }, - { - BuyExecution: { - weightLimit: 'Unlimited', - fees: { id: { parents: 0, interior: 'Here' }, fun: { Fungible: KILT } }, - }, - }, - { - ClaimAsset: { - // Specify xcm version 4 - ticket: { parents: 0, interior: { X1: [{ GeneralIndex: 4 }] } }, - assets: [ - { - id: AssetHubConfig.eKiltLocation, - fun: { Fungible: KILT.toString() }, - }, - ], - }, - }, - { - DepositAsset: { - assets: { Wild: 'All' }, - beneficiary: { - parents: 0, - interior: { - X1: [ - { - AccountId32: { - id: hexAddress(keysAlice.address), - }, - }, - ], - }, - }, - }, - }, - ] - - const peregrineDestination = getSiblingLocationV4(PeregrineConfig.paraId) - const transactExtrinsic = assethubContext.api.tx.polkadotXcm.send(peregrineDestination, { V4: reclaimMsg }) - const assetHubDestination = getChildLocation(AssetHubConfig.paraId) - - const transactMessage = [ - { UnpaidExecution: { weightLimit: 'Unlimited' } }, - { - Transact: { - originKind: 'SuperUser', - requireWeightAtMost: { refTime: '1000000000', proofSize: '65527' }, - call: { - encoded: transactExtrinsic.method.toHex(), - }, - }, - }, - ] - - const relayTx = rococoContext.api.tx.xcmPallet.send({ V3: assetHubDestination }, { V3: transactMessage }) - const reclaimTx = rococoContext.api.tx.sudo.sudo(relayTx).signAsync(keysAlice) - - // send msg - await sendTransaction(reclaimTx) - await createBlock(rococoContext) - - // forwards the msg. - await createBlock(assethubContext) - - // Assets should be reclaimed now. Check the events. - await createBlock(peregrineContext) - await checkSystemEvents(peregrineContext, 'messageQueue').toMatchSnapshot( - 'receiver Peregrine::messageQueue::[Processed]' - ) - await checkSystemEvents(peregrineContext, 'polkadotXcm').toMatchSnapshot( - 'receiver Peregrine::polkadotXcm::[AssetsClaimed]' - ) - await checkSystemEvents(peregrineContext, 'assetSwitchPool1').toMatchSnapshot( - 'receiver Peregrine::assetSwitchPool1::[RemoteToLocalSwitchExecuted]' - ) - - await checkSwitchPalletInvariant(expect) -}, 20_000) diff --git a/integration-tests/chopsticks/src/tests/switchPallet/trappedAssets/__snapshots__/index.test.ts.snap b/integration-tests/chopsticks/src/tests/switchPallet/trappedAssets/__snapshots__/index.test.ts.snap new file mode 100644 index 0000000000..8bc516ea03 --- /dev/null +++ b/integration-tests/chopsticks/src/tests/switchPallet/trappedAssets/__snapshots__/index.test.ts.snap @@ -0,0 +1,395 @@ +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html + +exports[`Reclaim trapped assets > V4 LIVE > AssetsTrapped event on receiver chain 1`] = ` +[ + { + "data": { + "assets": { + "V4": [ + { + "fun": { + "Fungible": 1000000000000000, + }, + "id": { + "interior": { + "X2": [ + { + "GlobalConsensus": { + "Ethereum": { + "chainId": 1, + }, + }, + }, + { + "AccountKey20": { + "key": "0x5d3d01fd6d2ad1169b17918eb4f153c6616288eb", + "network": null, + }, + }, + ], + }, + "parents": 2, + }, + }, + ], + }, + "hash_": "(hash)", + "origin": { + "interior": { + "X1": [ + { + "Parachain": 1000, + }, + ], + }, + "parents": 1, + }, + }, + "method": "AssetsTrapped", + "section": "polkadotXcm", + }, +] +`; + +exports[`Reclaim trapped assets > V4 LIVE > Switch eKILTs sender chain: {"section":"polkadotXcm","method":"Sent"} 1`] = ` +[ + { + "data": { + "destination": { + "interior": { + "X1": [ + { + "Parachain": "(rounded 2100)", + }, + ], + }, + "parents": 1, + }, + "message": [ + { + "ReserveAssetDeposited": [ + { + "fun": { + "Fungible": 1000000000000000, + }, + "id": { + "interior": { + "X2": [ + { + "GlobalConsensus": { + "Ethereum": { + "chainId": 1, + }, + }, + }, + { + "AccountKey20": { + "key": "0x5d3d01fd6d2ad1169b17918eb4f153c6616288eb", + "network": null, + }, + }, + ], + }, + "parents": 2, + }, + }, + ], + }, + "ClearOrigin", + { + "BuyExecution": { + "fees": { + "fun": { + "Fungible": 1000000000000000, + }, + "id": { + "interior": { + "X2": [ + { + "GlobalConsensus": { + "Ethereum": { + "chainId": 1, + }, + }, + }, + { + "AccountKey20": { + "key": "0x5d3d01fd6d2ad1169b17918eb4f153c6616288eb", + "network": null, + }, + }, + ], + }, + "parents": 2, + }, + }, + "weightLimit": "Unlimited", + }, + }, + { + "DepositAsset": { + "assets": { + "Wild": "All", + }, + "beneficiary": { + "interior": { + "X1": [ + { + "AccountId32": { + "id": "(hash)", + "network": null, + }, + }, + ], + }, + "parents": 0, + }, + }, + }, + ], + "messageId": "(hash)", + "origin": { + "interior": { + "X1": [ + { + "AccountId32": { + "id": "(hash)", + "network": "Polkadot", + }, + }, + ], + }, + "parents": 0, + }, + }, + "method": "Sent", + "section": "polkadotXcm", + }, +] +`; + +exports[`Reclaim trapped assets > V4 LIVE > reclaim trapped assets receiver chain: {"section":"assetSwitchPool1","method":"RemoteToLocalSwitchExecuted"} 1`] = ` +[ + { + "data": { + "amount": 1000000000000000, + "to": "4seWojfEHrk5YKPahdErazQ3CWEHZYi6NV4gKz5AaejWbRPJ", + }, + "method": "RemoteToLocalSwitchExecuted", + "section": "assetSwitchPool1", + }, +] +`; + +exports[`Reclaim trapped assets > V4 LIVE > reclaim trapped assets receiver chain: {"section":"polkadotXcm","method":"AssetsClaimed"} 1`] = ` +[ + { + "data": { + "assets": { + "V4": [ + { + "fun": { + "Fungible": 1000000000000000, + }, + "id": { + "interior": { + "X2": [ + { + "GlobalConsensus": { + "Ethereum": { + "chainId": 1, + }, + }, + }, + { + "AccountKey20": { + "key": "0x5d3d01fd6d2ad1169b17918eb4f153c6616288eb", + "network": null, + }, + }, + ], + }, + "parents": 2, + }, + }, + ], + }, + "hash_": "(hash)", + "origin": { + "interior": { + "X1": [ + { + "Parachain": 1000, + }, + ], + }, + "parents": 1, + }, + }, + "method": "AssetsClaimed", + "section": "polkadotXcm", + }, +] +`; + +exports[`Reclaim trapped assets > V4 LIVE > reclaim xcm message on relay chain 1`] = ` +[ + { + "data": { + "destination": { + "interior": { + "X1": [ + { + "Parachain": 1000, + }, + ], + }, + "parents": 0, + }, + "message": [ + { + "UnpaidExecution": { + "checkOrigin": null, + "weightLimit": "Unlimited", + }, + }, + { + "Transact": { + "call": { + "encoded": "(hash)", + }, + "originKind": "Superuser", + "requireWeightAtMost": { + "proofSize": "(rounded 66000)", + "refTime": 1000000000, + }, + }, + }, + ], + "messageId": "(hash)", + "origin": { + "interior": "Here", + "parents": 0, + }, + }, + "method": "Sent", + "section": "xcmPallet", + }, +] +`; + +exports[`Reclaim trapped assets > V4 LIVE > reclaim xcm message on sender chain 1`] = ` +[ + { + "data": { + "destination": { + "interior": { + "X1": [ + { + "Parachain": "(rounded 2100)", + }, + ], + }, + "parents": 1, + }, + "message": [ + { + "WithdrawAsset": [ + { + "fun": { + "Fungible": 1000000000000000, + }, + "id": { + "interior": "Here", + "parents": 0, + }, + }, + ], + }, + { + "BuyExecution": { + "fees": { + "fun": { + "Fungible": 1000000000000000, + }, + "id": { + "interior": "Here", + "parents": 0, + }, + }, + "weightLimit": "Unlimited", + }, + }, + { + "ClaimAsset": { + "assets": [ + { + "fun": { + "Fungible": 1000000000000000, + }, + "id": { + "interior": { + "X2": [ + { + "GlobalConsensus": { + "Ethereum": { + "chainId": 1, + }, + }, + }, + { + "AccountKey20": { + "key": "0x5d3d01fd6d2ad1169b17918eb4f153c6616288eb", + "network": null, + }, + }, + ], + }, + "parents": 2, + }, + }, + ], + "ticket": { + "interior": { + "X1": [ + { + "GeneralIndex": 4, + }, + ], + }, + "parents": 0, + }, + }, + }, + { + "DepositAsset": { + "assets": { + "Wild": "All", + }, + "beneficiary": { + "interior": { + "X1": [ + { + "AccountId32": { + "id": "(hash)", + "network": null, + }, + }, + ], + }, + "parents": 0, + }, + }, + }, + ], + "messageId": "(hash)", + "origin": { + "interior": "Here", + "parents": 0, + }, + }, + "method": "Sent", + "section": "polkadotXcm", + }, +] +`; diff --git a/integration-tests/chopsticks/src/tests/switchPallet/trappedAssets/config.ts b/integration-tests/chopsticks/src/tests/switchPallet/trappedAssets/config.ts new file mode 100644 index 0000000000..1178e10acf --- /dev/null +++ b/integration-tests/chopsticks/src/tests/switchPallet/trappedAssets/config.ts @@ -0,0 +1,120 @@ +import type { EventFilter } from '@acala-network/chopsticks-testing' +import type { ApiPromise } from '@polkadot/api' +import type { SubmittableExtrinsic } from '@polkadot/api/types' +import type { KeyringPair } from '@polkadot/keyring/types' + +import { initialBalanceKILT, keysAlice, KILT } from '../../../helper/utils.js' +import { mainChains, testChains } from '../../../network/index.js' +import { tx, query } from '../../../helper/api.js' +import type { BasicConfig } from '../../types.js' +import { getXcmV4ReclaimMessage, getXcmMessageV4ToSendEkilt } from '../index.js' + +interface Query { + sender: ({ api }: { api: ApiPromise }, address: string) => Promise + receiver: ({ api }: { api: ApiPromise }, address: string) => Promise +} + +interface Events { + sender: EventFilter[] + receiver: EventFilter[] +} + +interface TxContext { + // amount of funds to transfer + balanceToTransfer: bigint + // transactions to execute + tx: ({ api }: { api: ApiPromise }, amount: string) => SubmittableExtrinsic<'promise'> + // events to check after the transaction + events: Events + getXcmMessage: (amount: string, receiver: string) => object + reclaimTx: ({ api }: { api: ApiPromise }, xcmMessage: object) => SubmittableExtrinsic<'promise'> + // the relative location of the sender from the relay chain + senderLocation: object +} + +interface TestConfiguration { + config: BasicConfig + query: Query + txContext: TxContext + account: KeyringPair + sovereignAccount: string +} + +export const testCases: TestConfiguration[] = [ + { + config: { + desc: 'V4 LIVE', + network: { + // For this test, the relay chain is not important. By using the test chain, we can + // dispatch calls with sudo rights. TODO: Scheduling the calls is somehow not possible. + relay: { + option: testChains.polkadot.getConfig({}), + setUpTx: [], + storage: { + ...testChains.polkadot.storage.assignNativeTokensToAccounts([keysAlice.address]), + ...testChains.polkadot.storage.assignSudoKey(keysAlice.address), + }, + }, + parachains: [ + { + option: mainChains.assetHub.getConfig({}), + setUpTx: [], + storage: { + ...mainChains.assetHub.storage.assignNativeTokensToAccountsAsStorage([keysAlice.address]), + ...mainChains.assetHub.storage.assignForeignAssetToAccounts([ + [keysAlice.address, initialBalanceKILT], + ]), + }, + }, + { + option: mainChains.kilt.getConfig({}), + setUpTx: [tx.switchPallet.pause()], + storage: mainChains.kilt.storage.assignNativeTokensToAccounts([ + mainChains.assetHub.chainInfo.sovereignAccountOnSiblingChains, + ]), + }, + ], + }, + }, + account: keysAlice, + query: { + sender: query.foreignAssets(mainChains.assetHub.chainInfo.eKiltLocation), + receiver: query.balances, + }, + txContext: { + balanceToTransfer: KILT, + tx: tx.xcmPallet.transferAssetsUsingTypeAndThenV4( + tx.xcmPallet.parachainV4(1, mainChains.kilt.chainInfo.paraId), + mainChains.assetHub.chainInfo.eKiltLocation, + getXcmMessageV4ToSendEkilt(keysAlice.address) + ), + getXcmMessage: getXcmV4ReclaimMessage(mainChains.assetHub.chainInfo.eKiltLocation), + reclaimTx: tx.xcmPallet.send(tx.xcmPallet.parachainV4(1, mainChains.kilt.chainInfo.paraId)), + senderLocation: { + parents: 0, + interior: { + X1: { Parachain: mainChains.assetHub.chainInfo.paraId }, + }, + }, + events: { + sender: [ + { + section: 'polkadotXcm', + method: 'Sent', + }, + ], + receiver: [ + { + section: 'polkadotXcm', + method: 'AssetsClaimed', + }, + { + section: 'assetSwitchPool1', + method: 'RemoteToLocalSwitchExecuted', + }, + ], + }, + }, + sovereignAccount: mainChains.kilt.chainInfo.sovereignAccountOnSiblingChains, + }, +] diff --git a/integration-tests/chopsticks/src/tests/switchPallet/trappedAssets/index.test.ts b/integration-tests/chopsticks/src/tests/switchPallet/trappedAssets/index.test.ts new file mode 100644 index 0000000000..a43304f202 --- /dev/null +++ b/integration-tests/chopsticks/src/tests/switchPallet/trappedAssets/index.test.ts @@ -0,0 +1,140 @@ +import { describe, beforeEach, it, afterEach } from 'vitest' +import { sendTransaction, withExpect } from '@acala-network/chopsticks-testing' +import type { KeyringPair } from '@polkadot/keyring/types' + +import { createBlock, scheduleTx } from '../../../network/utils.js' +import { hexAddress } from '../../../helper/utils.js' +import { testCases } from './config.js' +import type { Config } from '../../../network/types.js' +import { tx as txApi } from '../../../helper/api.js' +import { checkSwitchPalletInvariant, isSwitchPaused } from '../index.js' +import { spinUpNetwork, tearDownNetwork } from '../../utils.js' + +describe.each(testCases)( + 'Reclaim trapped assets', + + ({ account, query, txContext, config, sovereignAccount }) => { + let senderContext: Config + let receiverContext: Config + let relayContext: Config + let senderAccount: KeyringPair + const { desc } = config + + // Create the network context + beforeEach(async () => { + const { parachainContexts, relayChainContext } = await spinUpNetwork(config) + + relayContext = relayChainContext + senderContext = parachainContexts[0] + receiverContext = parachainContexts[1] + senderAccount = account + }) + + // Shut down the network + afterEach(async () => await tearDownNetwork([receiverContext, senderContext, relayContext])) + + it(desc, async ({ expect }) => { + const { checkSystemEvents, checkEvents } = withExpect(expect) + + const { tx, balanceToTransfer, events, reclaimTx, getXcmMessage, senderLocation } = txContext + + // precondition checks + const balanceBeforeTx = await query.receiver(receiverContext, hexAddress(senderAccount.address)) + const balanceBeforeTxSender = await query.sender(senderContext, hexAddress(senderAccount.address)) + expect(balanceBeforeTx).toBe(0n) + expect(balanceBeforeTxSender).toBeGreaterThan(0n) + expect(await isSwitchPaused(receiverContext)).toBe(true) + + // action + const rawTx = tx(senderContext, balanceToTransfer.toString()) + const events1 = await sendTransaction(rawTx.signAsync(senderAccount)) + + // process tx + await createBlock(senderContext) + // process msg + await createBlock(receiverContext) + + // check balance movement on sender chain. + const balanceAfterTxSender = await query.sender(senderContext, hexAddress(senderAccount.address)) + expect(balanceAfterTxSender).toBe(balanceBeforeTxSender - balanceToTransfer) + + // Tx should fail on receiver + const balanceAfterTx = await query.receiver(receiverContext, hexAddress(senderAccount.address)) + expect(balanceAfterTx).toBe(0n) + + // check events + await Promise.all( + events.sender.map((pallet) => + checkEvents(events1, pallet).toMatchSnapshot( + `Switch eKILTs sender chain: ${JSON.stringify(pallet)}` + ) + ) + ) + + await checkSystemEvents(receiverContext, 'polkadotXcm').toMatchSnapshot( + 'AssetsTrapped event on receiver chain' + ) + + // enable the switch pair again + const resumeTx = txApi.switchPallet.resume()(receiverContext) + scheduleTx(receiverContext, resumeTx.method.toHex()) + // process scheduled tx + await createBlock(receiverContext) + + // create reclaim Tx + const xcmMessage = getXcmMessage(balanceToTransfer.toString(), senderAccount.address) + const rawReclaimTx = reclaimTx(senderContext, xcmMessage) + + // create reclaim message for relay chain + const transactMessage = [ + { UnpaidExecution: { weightLimit: 'Unlimited' } }, + { + Transact: { + originKind: 'SuperUser', + requireWeightAtMost: { refTime: '1000000000', proofSize: '65527' }, + call: { + encoded: rawReclaimTx.method.toHex(), + }, + }, + }, + ] + + // TODO: make relay reclaim tx configurable in the config + const reclaimTxRelay = relayContext.api.tx.xcmPallet.send({ V3: senderLocation }, { V3: transactMessage }) + await sendTransaction(relayContext.api.tx.sudo.sudo(reclaimTxRelay).signAsync(senderAccount)) + // process tx + await createBlock(relayContext) + + // post condition checks + + // check if the tx was successful + await checkSystemEvents(relayContext, 'xcmPallet').toMatchSnapshot('reclaim xcm message on relay chain') + + // process and send message on sender chain. + await createBlock(senderContext) + + // check if the tx was successful + await checkSystemEvents(senderContext, 'polkadotXcm').toMatchSnapshot('reclaim xcm message on sender chain') + // process message receiver chain + await createBlock(receiverContext) + + // check events + await Promise.all( + events.receiver.map((pallet) => + checkSystemEvents(receiverContext, pallet).toMatchSnapshot( + `reclaim trapped assets receiver chain: ${JSON.stringify(pallet)}` + ) + ) + ) + + await checkSwitchPalletInvariant( + expect, + receiverContext, + senderContext, + sovereignAccount, + query.receiver, + query.sender + ) + }) + } +) diff --git a/integration-tests/chopsticks/src/tests/template/config.ts b/integration-tests/chopsticks/src/tests/template/config.ts new file mode 100644 index 0000000000..18f25922ad --- /dev/null +++ b/integration-tests/chopsticks/src/tests/template/config.ts @@ -0,0 +1,34 @@ +import type { ApiPromise } from '@polkadot/api' +import type { SubmittableExtrinsic } from '@polkadot/api/types' +import type { BasicConfig } from '../types.js' +import type { KeyringPair } from '@polkadot/keyring/types' +import { mainChains } from '../../network/index.js' +import { keysAlice } from '../../helper/utils.js' +import { tx } from '../../helper/api.js' + +interface TxContext { + // transactions to execute + tx: ({ api }: { api: ApiPromise }, submitter: string, amount: string) => SubmittableExtrinsic<'promise'> +} + +interface TestConfiguration { + config: BasicConfig + txContext: TxContext + account: KeyringPair +} + +export const testCases: TestConfiguration[] = [ + { + config: { + desc: 'TEMPLATE', + network: { + parachains: [], + relay: { option: mainChains.polkadot.getConfig({}), setUpTx: [], storage: {} }, + }, + }, + account: keysAlice, + txContext: { + tx: tx.balances.transferAllowDeath, + }, + }, +] diff --git a/integration-tests/chopsticks/src/tests/template/index.test.ts b/integration-tests/chopsticks/src/tests/template/index.test.ts new file mode 100644 index 0000000000..fccd62e4b7 --- /dev/null +++ b/integration-tests/chopsticks/src/tests/template/index.test.ts @@ -0,0 +1,26 @@ +import { describe, beforeEach, it, afterEach } from 'vitest' +import type { KeyringPair } from '@polkadot/keyring/types' + +import { testCases } from './config.js' +import type { Config } from '../../network/types.js' +import { spinUpNetwork, tearDownNetwork } from '../utils.js' + +describe.skip.each(testCases)('TEMPLATE', ({ account, config }) => { + let senderContext: Config + let senderAccount: KeyringPair + const { desc } = config + + // Create the network context + beforeEach(async () => { + const { relayChainContext } = await spinUpNetwork(config) + senderContext = relayChainContext + senderAccount = account + }) + + // Shut down the network + afterEach(async () => await tearDownNetwork([senderContext])) + + it(desc, async ({ expect }) => { + expect(senderAccount).toBeTruthy() + }) +}) diff --git a/integration-tests/chopsticks/src/tests/types.ts b/integration-tests/chopsticks/src/tests/types.ts new file mode 100644 index 0000000000..5015eb56c8 --- /dev/null +++ b/integration-tests/chopsticks/src/tests/types.ts @@ -0,0 +1,49 @@ +import type { ApiPromise } from '@polkadot/api' +import type { SubmittableExtrinsic } from '@polkadot/api/types' +import type { KeyringPair } from '@polkadot/keyring/types' +import type { SetupOption, EventFilter } from '@acala-network/chopsticks-testing' + +export type Storage = Record> + +export type SetUpTx = ({ api }: { api: ApiPromise }) => SubmittableExtrinsic<'promise'> + +export interface ChainConfig { + option: SetupOption + storage: Storage + setUpTx: SetUpTx[] +} + +export interface Accounts { + senderAccount: KeyringPair + receiverAccount: KeyringPair +} +export interface NetworkSetupOption { + parachains: ChainConfig[] + relay: ChainConfig +} + +export interface BasicTxContext { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + tx: ({ api }: { api: ApiPromise }, submitter: string, ...args: any[]) => SubmittableExtrinsic<'promise'> + pallets: { + sender: EventFilter[] + receiver: EventFilter[] + } +} + +export interface BasicConfig { + desc: string + network: NetworkSetupOption +} + +export interface SovereignAccount { + sender: string + receiver: string +} + +export interface BasicXcmTestConfiguration { + config: BasicConfig + accounts: Accounts + sovereignAccount: SovereignAccount + txContext: BasicTxContext +} diff --git a/integration-tests/chopsticks/src/tests/utils.ts b/integration-tests/chopsticks/src/tests/utils.ts index b9fcc85ef6..83cbcc47ec 100644 --- a/integration-tests/chopsticks/src/tests/utils.ts +++ b/integration-tests/chopsticks/src/tests/utils.ts @@ -1,138 +1,49 @@ -import { ExpectStatic } from 'vitest' -import { setTimeout } from 'timers/promises' -import { u8aToHex } from '@polkadot/util' -import { decodeAddress } from '@polkadot/util-crypto' - -import { Config } from '../network/types.js' -import { - getCurrentBlockNumber, - getFreeBalancePeregrine, - getFreeBalancePeregrineAt, - getFreeEkiltAssetHub, - peregrineContext, -} from './index.js' -import * as PeregrineConfig from '../network/peregrine.js' - -/// Creates a new block for the given context -export async function createBlock(context: Config) { - // fixes api runtime disconnect warning - await setTimeout(50) - await context.dev.newBlock() -} - -/// sets the storage for the given context. -// eslint-disable-next-line @typescript-eslint/no-explicit-any -export async function setStorage(context: Config, storage: { [key: string]: any }) { - await context.dev.setStorage(storage) - await createBlock(context) -} - -/// checks the balance of an account and expects it to be the given amount -export async function checkBalance( - getFreeBalanceFunction: (account: string) => Promise, - account: string, - expect: ExpectStatic, - expectedAmount = BigInt(0) -) { - const balance = await getFreeBalanceFunction(account) - expect(balance).eq(BigInt(expectedAmount)) -} - -/// checks the balance of an account and expects it to be in the given range -export async function checkBalanceInRange( - getFreeBalanceFunction: (account: string) => Promise, - account: string, - expect: ExpectStatic, - expectedRange: [bigint, bigint] -) { - const balance = await getFreeBalanceFunction(account) - expect(balance >= expectedRange[0]) - expect(balance <= expectedRange[1]) -} +import { SetupConfig } from '@acala-network/chopsticks-testing' + +import { createBlock, scheduleTx, setStorage, setupNetwork, shutDownNetwork } from '../network/utils.js' +import { BasicConfig } from './types.js' + +export async function spinUpNetwork({ network }: BasicConfig) { + const { parachains, relay } = network + const parachainOptions = parachains.map((parachain) => parachain.option) + const { parachainContexts, relayChainContext } = await setupNetwork(relay.option, parachainOptions) + + await setStorage(relayChainContext, relay.storage) + await Promise.all( + relay.setUpTx.map(async (tx) => { + const rawTx = tx(relayChainContext) + await scheduleTx(relayChainContext, rawTx.method.toHex()) + await createBlock(relayChainContext) + }) + ) -export function hexAddress(addr: string) { - return u8aToHex(decodeAddress(addr)) -} + await Promise.all( + parachains.map(async (parachain, index) => { + // fetch the right context + const currentContext = parachainContexts[index] + // set the storage + await setStorage(currentContext, parachain.storage) + + // schedule txs. + await Promise.all( + parachain.setUpTx.map(async (tx) => { + const rawTx = tx(currentContext) + await scheduleTx(currentContext, rawTx.method.toHex()) + await createBlock(currentContext) + }) + ) + }) + ) -export function getXcmMessageV4ToSendEkilt(address: string) { - return { - V4: [ - { - DepositAsset: { - assets: { Wild: 'All' }, - beneficiary: { - parents: 0, - interior: { - X1: [ - { - AccountId32: { - id: hexAddress(address), - }, - }, - ], - }, - }, - }, - }, - ], - } + return { parachainContexts, relayChainContext } } -// Delta represents the amount of trapped assets on the KILT side -export async function checkSwitchPalletInvariant(expect: ExpectStatic, deltaStoredSovereignSupply = BigInt(0)) { - // eslint-disable-next-line @typescript-eslint/no-explicit-any - const switchPairInfo: any = await peregrineContext.api.query.assetSwitchPool1.switchPair() - if (switchPairInfo.isNone) { - return +export async function tearDownNetwork(chains: SetupConfig[]) { + try { + await shutDownNetwork(chains) + } catch (error) { + if (!(error instanceof TypeError)) { + console.error(error) + } } - - // check pool account balance - const switchPoolAccount = switchPairInfo.unwrap().poolAccount - - const poolAccountBalance = await getFreeBalancePeregrine(switchPoolAccount) - - const sovereignEKiltSupply = await getFreeEkiltAssetHub(PeregrineConfig.sovereignAccountAsSibling) - - const remoteAssetSovereignTotalBalance = switchPairInfo.unwrap().remoteAssetSovereignTotalBalance.toBigInt() - const remoteAssetCirculatingSupply = switchPairInfo.unwrap().remoteAssetCirculatingSupply.toBigInt() - const remoteAssetTotalSupply = switchPairInfo.unwrap().remoteAssetTotalSupply.toBigInt() - - const lockedBalanceFromTotalAndCirculating = remoteAssetTotalSupply - remoteAssetCirculatingSupply - - // Check pool account has enough funds to cover the circulating supply - - expect(poolAccountBalance).toBe(remoteAssetCirculatingSupply) - expect(remoteAssetSovereignTotalBalance).toBe(lockedBalanceFromTotalAndCirculating) - expect(sovereignEKiltSupply).toBe(remoteAssetSovereignTotalBalance + deltaStoredSovereignSupply) -} - -export async function checkBalanceMovementIncomingSwitch( - transferredBalance: bigint, - expect: ExpectStatic, - receiver: string, - deltaBlockNumber = 1 -) { - const currentBlockNumber = await getCurrentBlockNumber(peregrineContext) - - // the inital balance before the incoming switch - const initialBalanceTreasury = await getFreeBalancePeregrineAt( - PeregrineConfig.treasuryAccount, - currentBlockNumber - deltaBlockNumber - ) - const initialBalanceReciver = await getFreeBalancePeregrineAt(receiver, currentBlockNumber - deltaBlockNumber) - - // Current balance - const currentBalanceReciever = await getFreeBalancePeregrine(receiver) - const currentBalanceTreasury = await getFreeBalancePeregrine(PeregrineConfig.treasuryAccount) - - // deltas of the balance between receiver and treasury - const deltaReceivedBalance = currentBalanceReciever - initialBalanceReciver - - // remove staking rewards - const deltaTreasuryBalance = - currentBalanceTreasury - - initialBalanceTreasury - - PeregrineConfig.parachainStakingRewards * BigInt(deltaBlockNumber) - - expect(deltaReceivedBalance + deltaTreasuryBalance).toBe(transferredBalance) } diff --git a/integration-tests/chopsticks/src/tests/xcm/assetHub/peregrine/__snapshots__/initiateWithdrawAssetsFromPeregrineAssetHub.test.ts.snap b/integration-tests/chopsticks/src/tests/xcm/assetHub/peregrine/__snapshots__/initiateWithdrawAssetsFromPeregrineAssetHub.test.ts.snap deleted file mode 100644 index 5d0e6b2113..0000000000 --- a/integration-tests/chopsticks/src/tests/xcm/assetHub/peregrine/__snapshots__/initiateWithdrawAssetsFromPeregrineAssetHub.test.ts.snap +++ /dev/null @@ -1,210 +0,0 @@ -// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html - -exports[`Initiate withdraw assets Peregrine Account Alice -> AH Account Alice > receiver AssetHub::balances::Burned 1`] = ` -[ - { - "data": { - "amount": 1000000000000, - "who": "13cKp88mpGREFCq8KsJEFjpSBnjFuCNWq6bmD3js7fu4f66e", - }, - "method": "Burned", - "section": "balances", - }, -] -`; - -exports[`Initiate withdraw assets Peregrine Account Alice -> AH Account Alice > receiver AssetHub::balances::Endowed 1`] = ` -[ - { - "data": { - "account": "15jSz35ugoWTc61xHPoxEkHte4o7UanKCk1gx1dizA8yuNs8", - "freeBalance": "(rounded 1000000000000)", - }, - "method": "Endowed", - "section": "balances", - }, -] -`; - -exports[`Initiate withdraw assets Peregrine Account Alice -> AH Account Alice > receiver AssetHub::balances::Minted 1`] = ` -[ - { - "data": { - "amount": "(rounded 1000000000000)", - "who": "15jSz35ugoWTc61xHPoxEkHte4o7UanKCk1gx1dizA8yuNs8", - }, - "method": "Minted", - "section": "balances", - }, -] -`; - -exports[`Initiate withdraw assets Peregrine Account Alice -> AH Account Alice > receiver AssetHub::messageQueue::Processed 1`] = ` -[ - { - "data": { - "id": "(hash)", - "origin": { - "Sibling": "(rounded 2100)", - }, - "success": true, - "weightUsed": { - "proofSize": "(rounded 7200)", - "refTime": "(rounded 320000000)", - }, - }, - "method": "Processed", - "section": "messageQueue", - }, -] -`; - -exports[`Initiate withdraw assets Peregrine Account Alice -> AH Account Alice > sender Peregrine::fungibles::[Burned] 1`] = ` -[ - { - "data": { - "assetId": { - "interior": "Here", - "parents": 1, - }, - "balance": 1000000000000, - "owner": "4seWojfEHrk5YKPahdErazQ3CWEHZYi6NV4gKz5AaejWbRPJ", - }, - "method": "Burned", - "section": "fungibles", - }, -] -`; - -exports[`Initiate withdraw assets Peregrine Account Alice -> AH Account Alice > sender Peregrine::polkadotXcm::[FeesPaid,Attempted,Sent] 1`] = ` -[ - { - "data": { - "outcome": { - "Complete": { - "used": { - "proofSize": 0, - "refTime": 400000000, - }, - }, - }, - }, - "method": "Attempted", - "section": "polkadotXcm", - }, - { - "data": { - "fees": [], - "paying": { - "interior": { - "X1": [ - { - "AccountId32": { - "id": "(hash)", - "network": null, - }, - }, - ], - }, - "parents": 0, - }, - }, - "method": "FeesPaid", - "section": "polkadotXcm", - }, - { - "data": { - "destination": { - "interior": { - "X1": [ - { - "Parachain": 1000, - }, - ], - }, - "parents": 1, - }, - "message": [ - { - "WithdrawAsset": [ - { - "fun": { - "Fungible": 1000000000000, - }, - "id": { - "interior": "Here", - "parents": 1, - }, - }, - ], - }, - "ClearOrigin", - { - "BuyExecution": { - "fees": { - "fun": { - "Fungible": 1000000000000, - }, - "id": { - "interior": "Here", - "parents": 1, - }, - }, - "weightLimit": "Unlimited", - }, - }, - { - "DepositAsset": { - "assets": { - "Wild": { - "AllCounted": 1, - }, - }, - "beneficiary": { - "interior": { - "X1": [ - { - "AccountId32": { - "id": "(hash)", - "network": null, - }, - }, - ], - }, - "parents": 0, - }, - }, - }, - ], - "messageId": "(hash)", - "origin": { - "interior": { - "X1": [ - { - "AccountId32": { - "id": "(hash)", - "network": null, - }, - }, - ], - }, - "parents": 0, - }, - }, - "method": "Sent", - "section": "polkadotXcm", - }, -] -`; - -exports[`Initiate withdraw assets Peregrine Account Alice -> AH Account Alice > sender Peregrine::xcmpQueue::[XcmMessageSent] 1`] = ` -[ - { - "data": { - "messageHash": "(hash)", - }, - "method": "XcmpMessageSent", - "section": "xcmpQueue", - }, -] -`; diff --git a/integration-tests/chopsticks/src/tests/xcm/assetHub/peregrine/__snapshots__/limitedReserveTransferAssetHubPeregrine.test.ts.snap b/integration-tests/chopsticks/src/tests/xcm/assetHub/peregrine/__snapshots__/limitedReserveTransferAssetHubPeregrine.test.ts.snap deleted file mode 100644 index ca561a26af..0000000000 --- a/integration-tests/chopsticks/src/tests/xcm/assetHub/peregrine/__snapshots__/limitedReserveTransferAssetHubPeregrine.test.ts.snap +++ /dev/null @@ -1,194 +0,0 @@ -// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html - -exports[`Limited Reserve V4 Transfers from AssetHub Account Alice -> Peregrine Account Bob > receiver Peregrine::fungibles::[Issued] 1`] = ` -[ - { - "data": { - "amount": "(rounded 1000000000000)", - "assetId": { - "interior": "Here", - "parents": 1, - }, - "owner": "4rsmbFBYpVmWE2LHRsSZKxf22a8cbJLxMZqvVGkGkSDmDBcr", - }, - "method": "Issued", - "section": "fungibles", - }, -] -`; - -exports[`Limited Reserve V4 Transfers from AssetHub Account Alice -> Peregrine Account Bob > receiver Peregrine::messageQueue::[Processed] 1`] = ` -[ - { - "data": { - "id": "(hash)", - "origin": { - "Sibling": 1000, - }, - "success": true, - "weightUsed": { - "proofSize": 0, - "refTime": 1000000000, - }, - }, - "method": "Processed", - "section": "messageQueue", - }, -] -`; - -exports[`Limited Reserve V4 Transfers from AssetHub Account Alice -> Peregrine Account Bob > sender AssetHub::balances::[Withdraw] 1`] = ` -[ - { - "data": { - "amount": "(rounded 24000000)", - "who": "15jSz35ugoWTc61xHPoxEkHte4o7UanKCk1gx1dizA8yuNs8", - }, - "method": "Withdraw", - "section": "balances", - }, -] -`; - -exports[`Limited Reserve V4 Transfers from AssetHub Account Alice -> Peregrine Account Bob > sender AssetHub::polkadotXcm::[FeesPaid,Attempted,Sent] 1`] = ` -[ - { - "data": { - "outcome": { - "Complete": { - "used": { - "proofSize": "(rounded 6200)", - "refTime": "(rounded 290000000)", - }, - }, - }, - }, - "method": "Attempted", - "section": "polkadotXcm", - }, - { - "data": { - "fees": [ - { - "fun": { - "Fungible": "(rounded 310000000)", - }, - "id": { - "interior": "Here", - "parents": 1, - }, - }, - ], - "paying": { - "interior": { - "X1": [ - { - "AccountId32": { - "id": "(hash)", - "network": "Polkadot", - }, - }, - ], - }, - "parents": 0, - }, - }, - "method": "FeesPaid", - "section": "polkadotXcm", - }, - { - "data": { - "destination": { - "interior": { - "X1": [ - { - "Parachain": "(rounded 2100)", - }, - ], - }, - "parents": 1, - }, - "message": [ - { - "ReserveAssetDeposited": [ - { - "fun": { - "Fungible": 1000000000000, - }, - "id": { - "interior": "Here", - "parents": 1, - }, - }, - ], - }, - "ClearOrigin", - { - "BuyExecution": { - "fees": { - "fun": { - "Fungible": 1000000000000, - }, - "id": { - "interior": "Here", - "parents": 1, - }, - }, - "weightLimit": "Unlimited", - }, - }, - { - "DepositAsset": { - "assets": { - "Wild": { - "AllCounted": 1, - }, - }, - "beneficiary": { - "interior": { - "X1": [ - { - "AccountId32": { - "id": "(hash)", - "network": null, - }, - }, - ], - }, - "parents": 0, - }, - }, - }, - ], - "messageId": "(hash)", - "origin": { - "interior": { - "X1": [ - { - "AccountId32": { - "id": "(hash)", - "network": "Polkadot", - }, - }, - ], - }, - "parents": 0, - }, - }, - "method": "Sent", - "section": "polkadotXcm", - }, -] -`; - -exports[`Limited Reserve V4 Transfers from AssetHub Account Alice -> Peregrine Account Bob > sender AssetHub::xcmpQueue::[XcmMessageSent] 1`] = ` -[ - { - "data": { - "messageHash": "(hash)", - }, - "method": "XcmpMessageSent", - "section": "xcmpQueue", - }, -] -`; diff --git a/integration-tests/chopsticks/src/tests/xcm/assetHub/peregrine/initiateWithdrawAssetsFromPeregrineAssetHub.test.ts b/integration-tests/chopsticks/src/tests/xcm/assetHub/peregrine/initiateWithdrawAssetsFromPeregrineAssetHub.test.ts deleted file mode 100644 index 67551b688a..0000000000 --- a/integration-tests/chopsticks/src/tests/xcm/assetHub/peregrine/initiateWithdrawAssetsFromPeregrineAssetHub.test.ts +++ /dev/null @@ -1,103 +0,0 @@ -/* eslint-disable @typescript-eslint/no-unused-vars */ -import { test } from 'vitest' -import { sendTransaction, withExpect } from '@acala-network/chopsticks-testing' - -import * as PeregrineConfig from '../../../../network/peregrine.js' -import * as AssetHubConfig from '../../../../network/assetHub.js' -import { - ROC, - getAssetSwitchParameters, - initialBalanceKILT, - initialBalanceROC, - keysAlice, - keysCharlie, -} from '../../../../utils.js' -import { peregrineContext, assethubContext, getFreeRocPeregrine, getFreeRocAssetHub } from '../../../index.js' -import { - getAccountLocationV4, - getRelayNativeAssetIdLocationV4, - getSiblingLocationV4, -} from '../../../../network/utils.js' -import { checkBalanceInRange, createBlock, hexAddress, setStorage } from '../../../utils.js' - -test('Initiate withdraw assets Peregrine Account Alice -> AH Account Alice', async ({ expect }) => { - const { checkEvents, checkSystemEvents } = withExpect(expect) - const feeAmount = (ROC * BigInt(10)) / BigInt(100) - const remoteAssetId = { V4: AssetHubConfig.eKiltLocation } - const remoteXcmFeeId = { V4: { id: AssetHubConfig.nativeTokenLocation, fun: { Fungible: feeAmount } } } - const remoteReserveLocation = getSiblingLocationV4(AssetHubConfig.paraId) - - await setStorage(peregrineContext, { - ...PeregrineConfig.assignNativeTokensToAccounts([keysAlice.address], initialBalanceKILT), - ...PeregrineConfig.createAndAssignRocs(keysCharlie.address, [keysAlice.address]), - ...PeregrineConfig.setSafeXcmVersion4(), - }) - - const switchParameters = getAssetSwitchParameters() - - await setStorage( - peregrineContext, - PeregrineConfig.setSwitchPair(switchParameters, remoteAssetId, remoteXcmFeeId, remoteReserveLocation) - ) - - await setStorage(assethubContext, { - ...AssetHubConfig.assignDotTokensToAccountsAsStorage( - [PeregrineConfig.sovereignAccountAsSibling], - initialBalanceROC - ), - }) - - // check initial state - const balanceAliceRocPeregrineBeforeTx = await getFreeRocPeregrine(keysAlice.address) - const balanceAliceRocAssetHubBeforeTx = await getFreeRocAssetHub(keysAlice.address) - const balanceSovereignAccountAssetHubBeforeTx = await getFreeRocAssetHub(PeregrineConfig.sovereignAccountAsSibling) - - expect(balanceAliceRocPeregrineBeforeTx).toBe(initialBalanceROC) - expect(balanceAliceRocAssetHubBeforeTx).toBe(BigInt(0)) - expect(balanceSovereignAccountAssetHubBeforeTx).toBe(initialBalanceROC) - - const assetHubDestination = getSiblingLocationV4(AssetHubConfig.paraId) - // We send 1 ROC - const assets = { V4: [getRelayNativeAssetIdLocationV4(ROC.toString())] } - const beneficiary = getAccountLocationV4(hexAddress(keysAlice.address)) - - const signedTx4 = peregrineContext.api.tx.polkadotXcm - .transferAssets(assetHubDestination, beneficiary, assets, 0, 'Unlimited') - .signAsync(keysAlice) - - const events4 = await sendTransaction(signedTx4) - await createBlock(peregrineContext) - - // The xcm message should be send to AH and the funds should be burned from user. - await checkEvents(events4, 'fungibles').toMatchSnapshot('sender Peregrine::fungibles::[Burned]') - await checkEvents(events4, 'xcmpQueue').toMatchSnapshot('sender Peregrine::xcmpQueue::[XcmMessageSent]') - await checkEvents(events4, 'polkadotXcm').toMatchSnapshot( - 'sender Peregrine::polkadotXcm::[FeesPaid,Attempted,Sent]' - ) - - // Alice funds after the transaction - const balanceAliceRocPeregrineAfterTx = await getFreeRocPeregrine(keysAlice.address) - expect(balanceAliceRocPeregrineAfterTx).toBe(initialBalanceROC - ROC) - - // The funds should be burned from Sovereign account and minted to user. - await createBlock(assethubContext) - await checkSystemEvents(assethubContext, { section: 'balances', method: 'Burned' }).toMatchSnapshot( - 'receiver AssetHub::balances::Burned' - ) - await checkSystemEvents(assethubContext, { section: 'balances', method: 'Minted' }).toMatchSnapshot( - 'receiver AssetHub::balances::Minted' - ) - await checkSystemEvents(assethubContext, { section: 'balances', method: 'Endowed' }).toMatchSnapshot( - 'receiver AssetHub::balances::Endowed' - ) - await checkSystemEvents(assethubContext, { section: 'messageQueue', method: 'Processed' }).toMatchSnapshot( - 'receiver AssetHub::messageQueue::Processed' - ) - - // state sovereign account - const balanceSovereignAccountAssetHubAfterTx = await getFreeRocAssetHub(PeregrineConfig.sovereignAccountAsSibling) - expect(balanceSovereignAccountAssetHubAfterTx).toBe(initialBalanceROC - ROC) - - // state alice on asset hub - await checkBalanceInRange(getFreeRocPeregrine, keysAlice.address, expect, [BigInt(999999964195), ROC]) -}, 20_000) diff --git a/integration-tests/chopsticks/src/tests/xcm/assetHub/peregrine/limitedReserveTransferAssetHubPeregrine.test.ts b/integration-tests/chopsticks/src/tests/xcm/assetHub/peregrine/limitedReserveTransferAssetHubPeregrine.test.ts deleted file mode 100644 index f19db9037b..0000000000 --- a/integration-tests/chopsticks/src/tests/xcm/assetHub/peregrine/limitedReserveTransferAssetHubPeregrine.test.ts +++ /dev/null @@ -1,104 +0,0 @@ -import { test } from 'vitest' -import { sendTransaction, withExpect } from '@acala-network/chopsticks-testing' - -import * as PeregrineConfig from '../../../../network/peregrine.js' -import * as AssetHubConfig from '../../../../network/assetHub.js' -import { - ROC, - getAssetSwitchParameters, - initialBalanceKILT, - initialBalanceROC, - keysAlice, - keysBob, - keysCharlie, -} from '../../../../utils.js' -import { peregrineContext, assethubContext, getFreeRocPeregrine, getFreeRocAssetHub } from '../../../index.js' -import { - getAccountLocationV4, - getRelayNativeAssetIdLocationV4, - getSiblingLocationV4, -} from '../../../../network/utils.js' -import { checkBalance, checkBalanceInRange, createBlock, hexAddress, setStorage } from '../../../utils.js' - -const ROC_ASSET_V4 = { V4: [getRelayNativeAssetIdLocationV4(ROC)] } - -test('Limited Reserve V4 Transfers from AssetHub Account Alice -> Peregrine Account Bob', async ({ expect }) => { - const { checkEvents, checkSystemEvents } = withExpect(expect) - const feeAmount = (ROC * BigInt(10)) / BigInt(100) - const remoteAssetId = { V4: AssetHubConfig.eKiltLocation } - const remoteXcmFeeId = { V4: { id: AssetHubConfig.nativeTokenLocation, fun: { Fungible: feeAmount } } } - const remoteReserveLocation = getSiblingLocationV4(AssetHubConfig.paraId) - - // Assign alice some KILT tokens to create the account - await setStorage(peregrineContext, { - ...PeregrineConfig.createAndAssignRocs(keysCharlie.address, []), - ...PeregrineConfig.assignNativeTokensToAccounts([keysBob.address], initialBalanceKILT), - }) - - await setStorage( - peregrineContext, - PeregrineConfig.setSwitchPair(getAssetSwitchParameters(), remoteAssetId, remoteXcmFeeId, remoteReserveLocation) - ) - - // Give Alice some Rocs - await setStorage( - assethubContext, - AssetHubConfig.assignDotTokensToAccountsAsStorage([keysAlice.address], initialBalanceROC) - ) - - const peregrineSovereignAccountBalanceBeforeTx = await getFreeRocAssetHub(PeregrineConfig.sovereignAccountAsSibling) - - // Bob should have no ROCs on Peregrine - await checkBalance(getFreeRocPeregrine, keysBob.address, expect, BigInt(0)) - - // Alice should some ROCs on AH - await checkBalance(getFreeRocAssetHub, keysAlice.address, expect, initialBalanceROC) - - const bobAddress = hexAddress(keysBob.address) - const peregrineDestination = getSiblingLocationV4(PeregrineConfig.paraId) - const beneficiary = getAccountLocationV4(bobAddress) - - const signedTx = assethubContext.api.tx.polkadotXcm - .limitedReserveTransferAssets(peregrineDestination, beneficiary, ROC_ASSET_V4, 0, 'Unlimited') - .signAsync(keysAlice) - - const events = await sendTransaction(signedTx) - - // Check sender state - await createBlock(assethubContext) - - // Check events sender - checkEvents(events, 'xcmpQueue').toMatchSnapshot('sender AssetHub::xcmpQueue::[XcmMessageSent]') - checkEvents(events, 'polkadotXcm').toMatchSnapshot('sender AssetHub::polkadotXcm::[FeesPaid,Attempted,Sent]') - checkEvents(events, { section: 'balances', method: 'Withdraw' }).toMatchSnapshot( - 'sender AssetHub::balances::[Withdraw]' - ) - - // check balance. The sovereign account should hold one additional ROC. - await checkBalance( - getFreeRocAssetHub, - PeregrineConfig.sovereignAccountAsSibling, - expect, - peregrineSovereignAccountBalanceBeforeTx + ROC - ) - - // check balance sender - // Equal to `initialBalanceKILT - KILT` - tx fees - await checkBalanceInRange(getFreeRocAssetHub, keysAlice.address, expect, [ - BigInt('98999830999996'), - BigInt('98999830999996'), - ]) - - // Check receiver state - await createBlock(peregrineContext) - - // Check events receiver - checkSystemEvents(peregrineContext, { section: 'fungibles', method: 'Issued' }).toMatchSnapshot( - 'receiver Peregrine::fungibles::[Issued]' - ) - checkSystemEvents(peregrineContext, 'messageQueue').toMatchSnapshot('receiver Peregrine::messageQueue::[Processed]') - - // check balance receiver - // check balance. Equal to `KILT` - tx fees - await checkBalanceInRange(getFreeRocPeregrine, bobAddress, expect, [BigInt(999999964195), BigInt(999999964296)]) -}, 20_000) diff --git a/integration-tests/chopsticks/src/tests/xcm/assetHub/peregrine/limitedReserveTransferRelayPeregrine.test.ts b/integration-tests/chopsticks/src/tests/xcm/assetHub/peregrine/limitedReserveTransferRelayPeregrine.test.ts deleted file mode 100644 index ca3c7a560c..0000000000 --- a/integration-tests/chopsticks/src/tests/xcm/assetHub/peregrine/limitedReserveTransferRelayPeregrine.test.ts +++ /dev/null @@ -1,75 +0,0 @@ -import { test } from 'vitest' -import { sendTransaction, withExpect } from '@acala-network/chopsticks-testing' - -import * as PeregrineConfig from '../../../../network/peregrine.js' -import * as RococoConfig from '../../../../network/rococo.js' -import * as AssetHubConfig from '../../../../network/assetHub.js' -import { - getAssetSwitchParameters, - initialBalanceKILT, - initialBalanceROC, - keysAlice, - keysCharlie, - ROC, -} from '../../../../utils.js' -import { peregrineContext, getFreeBalancePeregrine, getFreeRocPeregrine, rococoContext } from '../../../index.js' -import { checkBalance, createBlock, setStorage, hexAddress } from '../../../utils.js' -import { - getAccountLocationV3, - getChildLocation, - getNativeAssetIdLocationV3, - getSiblingLocationV4, -} from '../../../../network/utils.js' - -test('Send DOTs from Relay 2 Peregrine', async ({ expect }) => { - const { checkEvents, checkSystemEvents } = withExpect(expect) - - const feeAmount = (ROC * BigInt(10)) / BigInt(100) - const remoteAssetId = { V4: AssetHubConfig.eKiltLocation } - const remoteXcmFeeId = { V4: { id: AssetHubConfig.nativeTokenLocation, fun: { Fungible: feeAmount } } } - const remoteReserveLocation = getSiblingLocationV4(AssetHubConfig.paraId) - - await setStorage(peregrineContext, { - ...PeregrineConfig.assignNativeTokensToAccounts([keysAlice.address], initialBalanceKILT), - ...PeregrineConfig.createAndAssignRocs(keysCharlie.address, []), - ...PeregrineConfig.setSafeXcmVersion4(), - }) - - await setStorage( - peregrineContext, - PeregrineConfig.setSwitchPair(getAssetSwitchParameters(), remoteAssetId, remoteXcmFeeId, remoteReserveLocation) - ) - - await setStorage(rococoContext, RococoConfig.assignNativeTokensToAccounts([keysAlice.address])) - - await checkBalance(getFreeBalancePeregrine, keysAlice.address, expect, initialBalanceKILT) - await checkBalance(getFreeRocPeregrine, keysAlice.address, expect, BigInt(0)) - - const balanceToTransfer = initialBalanceROC / BigInt(2) - - const aliceAddress = hexAddress(keysAlice.address) - const hydraDxDestination = { V3: getChildLocation(PeregrineConfig.paraId) } - const beneficiary = getAccountLocationV3(aliceAddress) - const assetToTransfer = { V3: [getNativeAssetIdLocationV3(balanceToTransfer)] } - - const signedTx = rococoContext.api.tx.xcmPallet - .limitedReserveTransferAssets(hydraDxDestination, beneficiary, assetToTransfer, 0, 'Unlimited') - .signAsync(keysAlice) - - const events = await sendTransaction(signedTx) - - await createBlock(rococoContext) - - checkEvents(events, 'xcmPallet').toMatchSnapshot('sender Rococo::xcmPallet::[XcmMessageSent]') - - await createBlock(peregrineContext) - - // Barrier will block execution. No event will be emitted. - await checkSystemEvents(peregrineContext, { - section: 'messageQueue', - method: 'ProcessingFailed', - }).toMatchSnapshot('receiver Peregrine::messageQueue::[ProcessingFailed]') - - // Alice should still have no balance - await checkBalance(getFreeRocPeregrine, keysAlice.address, expect, BigInt(0)) -}, 20_00000) diff --git a/integration-tests/chopsticks/src/tests/xcm/assetHub/spiritnet/__snapshots__/limitedReserveTransferAssetHubSpiritnet.test.ts.snap b/integration-tests/chopsticks/src/tests/xcm/assetHub/spiritnet/__snapshots__/limitedReserveTransferAssetHubSpiritnet.test.ts.snap deleted file mode 100644 index 32545fecb3..0000000000 --- a/integration-tests/chopsticks/src/tests/xcm/assetHub/spiritnet/__snapshots__/limitedReserveTransferAssetHubSpiritnet.test.ts.snap +++ /dev/null @@ -1,194 +0,0 @@ -// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html - -exports[`Limited Reserve Transfers from AH Account Alice -> Spiritnet Account Alice > receiver spiritnet::XcmpQueue::[Fail] asset {"V3":[{"id":{"Concrete":{"parents":2,"interior":{"X1":{"GlobalConsensus":"Kusama"}}}},"fun":{"Fungible":"10000000000"}}]} 1`] = ` -[ - { - "data": { - "error": "UntrustedReserveLocation", - "messageHash": "(hash)", - "messageId": "(hash)", - "weight": { - "proofSize": 0, - "refTime": 200000000, - }, - }, - "method": "Fail", - "section": "xcmpQueue", - }, -] -`; - -exports[`Limited Reserve Transfers from AH Account Alice -> Spiritnet Account Alice > sender assetHub::foreignAssets::[Transferred] asset {"V3":[{"id":{"Concrete":{"parents":2,"interior":{"X1":{"GlobalConsensus":"Kusama"}}}},"fun":{"Fungible":"10000000000"}}]} 1`] = ` -[ - { - "data": { - "amount": 10000000000, - "assetId": { - "interior": { - "X1": { - "GlobalConsensus": "Kusama", - }, - }, - "parents": 2, - }, - "from": "15jSz35ugoWTc61xHPoxEkHte4o7UanKCk1gx1dizA8yuNs8", - "to": "13cKp88mpGREFCq8KsJEFjpSBnjFuCNWq6bmD3js7fu4f66e", - }, - "method": "Transferred", - "section": "foreignAssets", - }, -] -`; - -exports[`Limited Reserve Transfers from AH Account Alice -> Spiritnet Account Alice > sender assetHub::polkadotXcm::[Sent,FeesPaid,Attempted] asset {"V3":[{"id":{"Concrete":{"parents":2,"interior":{"X1":{"GlobalConsensus":"Kusama"}}}},"fun":{"Fungible":"10000000000"}}]} 1`] = ` -[ - { - "data": { - "outcome": { - "Complete": { - "used": { - "proofSize": "(rounded 6200)", - "refTime": "(rounded 290000000)", - }, - }, - }, - }, - "method": "Attempted", - "section": "polkadotXcm", - }, - { - "data": { - "fees": [ - { - "fun": { - "Fungible": 310000000, - }, - "id": { - "interior": "Here", - "parents": 1, - }, - }, - ], - "paying": { - "interior": { - "X1": [ - { - "AccountId32": { - "id": "(hash)", - "network": "Polkadot", - }, - }, - ], - }, - "parents": 0, - }, - }, - "method": "FeesPaid", - "section": "polkadotXcm", - }, - { - "data": { - "destination": { - "interior": { - "X1": [ - { - "Parachain": "(rounded 2100)", - }, - ], - }, - "parents": 1, - }, - "message": [ - { - "ReserveAssetDeposited": [ - { - "fun": { - "Fungible": 10000000000, - }, - "id": { - "interior": { - "X1": [ - { - "GlobalConsensus": "Kusama", - }, - ], - }, - "parents": 2, - }, - }, - ], - }, - "ClearOrigin", - { - "BuyExecution": { - "fees": { - "fun": { - "Fungible": 10000000000, - }, - "id": { - "interior": { - "X1": [ - { - "GlobalConsensus": "Kusama", - }, - ], - }, - "parents": 2, - }, - }, - "weightLimit": "Unlimited", - }, - }, - { - "DepositAsset": { - "assets": { - "Wild": "All", - }, - "beneficiary": { - "interior": { - "X1": [ - { - "AccountId32": { - "id": "(hash)", - "network": null, - }, - }, - ], - }, - "parents": 0, - }, - }, - }, - ], - "messageId": "(hash)", - "origin": { - "interior": { - "X1": [ - { - "AccountId32": { - "id": "(hash)", - "network": "Polkadot", - }, - }, - ], - }, - "parents": 0, - }, - }, - "method": "Sent", - "section": "polkadotXcm", - }, -] -`; - -exports[`Limited Reserve Transfers from AH Account Alice -> Spiritnet Account Alice > sender assetHub::xcmpQueue::[XcmpMessageSent] asset {"V3":[{"id":{"Concrete":{"parents":2,"interior":{"X1":{"GlobalConsensus":"Kusama"}}}},"fun":{"Fungible":"10000000000"}}]} 1`] = ` -[ - { - "data": { - "messageHash": "(hash)", - }, - "method": "XcmpMessageSent", - "section": "xcmpQueue", - }, -] -`; diff --git a/integration-tests/chopsticks/src/tests/xcm/assetHub/spiritnet/__snapshots__/limitedReserveTransferSpiritnetAssetHub.test.ts.snap b/integration-tests/chopsticks/src/tests/xcm/assetHub/spiritnet/__snapshots__/limitedReserveTransferSpiritnetAssetHub.test.ts.snap deleted file mode 100644 index 1f82d5925e..0000000000 --- a/integration-tests/chopsticks/src/tests/xcm/assetHub/spiritnet/__snapshots__/limitedReserveTransferSpiritnetAssetHub.test.ts.snap +++ /dev/null @@ -1,63 +0,0 @@ -// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html - -exports[`Limited Reserve Transfers from Spiritnet Account Alice -> AH Account Alice > receiver assetHub::messageQueue::[Processed] asset {"V3":[{"id":{"Concrete":{"parents":0,"interior":"Here"}},"fun":{"Fungible":"1000000000000000"}}]} 1`] = ` -[ - { - "data": { - "id": "(hash)", - "origin": { - "Sibling": "(rounded 2100)", - }, - "success": false, - "weightUsed": { - "proofSize": "(rounded 1500)", - "refTime": "(rounded 29000000)", - }, - }, - "method": "Processed", - "section": "messageQueue", - }, -] -`; - -exports[`Limited Reserve Transfers from Spiritnet Account Alice -> AH Account Alice > sender spiritnet::balances::[Withdraw] asset {"V3":[{"id":{"Concrete":{"parents":0,"interior":"Here"}},"fun":{"Fungible":"1000000000000000"}}]} 1`] = ` -[ - { - "data": { - "amount": "(rounded 170000000000)", - "who": "4seWojfEHrk5YKPahdErazQ3CWEHZYi6NV4gKz5AaejWbRPJ", - }, - "method": "Withdraw", - "section": "balances", - }, -] -`; - -exports[`Limited Reserve Transfers from Spiritnet Account Alice -> AH Account Alice > sender spiritnet::polkadotXcm::[Attempted] asset {"V3":[{"id":{"Concrete":{"parents":0,"interior":"Here"}},"fun":{"Fungible":"1000000000000000"}}]} 1`] = ` -[ - { - "data": { - "outcome": { - "Complete": { - "proofSize": 0, - "refTime": 400000000, - }, - }, - }, - "method": "Attempted", - "section": "polkadotXcm", - }, -] -`; - -exports[`Limited Reserve Transfers from Spiritnet Account Alice -> AH Account Alice > sender spiritnet::xcmpQueue::[XcmpMessageSent] asset {"V3":[{"id":{"Concrete":{"parents":0,"interior":"Here"}},"fun":{"Fungible":"1000000000000000"}}]} 1`] = ` -[ - { - "data": { - "messageHash": "(hash)", - }, - "method": "XcmpMessageSent", - "section": "xcmpQueue", - }, -] -`; diff --git a/integration-tests/chopsticks/src/tests/xcm/assetHub/spiritnet/__snapshots__/teleportTransferAssetHubSpiritnet.test.ts.snap b/integration-tests/chopsticks/src/tests/xcm/assetHub/spiritnet/__snapshots__/teleportTransferAssetHubSpiritnet.test.ts.snap deleted file mode 100644 index 05b7ce97bd..0000000000 --- a/integration-tests/chopsticks/src/tests/xcm/assetHub/spiritnet/__snapshots__/teleportTransferAssetHubSpiritnet.test.ts.snap +++ /dev/null @@ -1,193 +0,0 @@ -// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html - -exports[`Teleport Transfers from AH Account Alice -> Spiritnet Account Alice > receiver spiritnet::xcmpQueue::[Fail] asset {"V3":[{"id":{"Concrete":{"parents":2,"interior":{"X1":{"GlobalConsensus":"Kusama"}}}},"fun":{"Fungible":"10000000000"}}]} 1`] = ` -[ - { - "data": { - "error": "UntrustedTeleportLocation", - "messageHash": "(hash)", - "messageId": "(hash)", - "weight": { - "proofSize": 0, - "refTime": 200000000, - }, - }, - "method": "Fail", - "section": "xcmpQueue", - }, -] -`; - -exports[`Teleport Transfers from AH Account Alice -> Spiritnet Account Alice > sender assetHub::foreignAssets::[Burned] asset {"V3":[{"id":{"Concrete":{"parents":2,"interior":{"X1":{"GlobalConsensus":"Kusama"}}}},"fun":{"Fungible":"10000000000"}}]} 1`] = ` -[ - { - "data": { - "assetId": { - "interior": { - "X1": { - "GlobalConsensus": "Kusama", - }, - }, - "parents": 2, - }, - "balance": 10000000000, - "owner": "15jSz35ugoWTc61xHPoxEkHte4o7UanKCk1gx1dizA8yuNs8", - }, - "method": "Burned", - "section": "foreignAssets", - }, -] -`; - -exports[`Teleport Transfers from AH Account Alice -> Spiritnet Account Alice > sender assetHub::polkadotXcm::[Attempted,FeesPaid,Sent] asset {"V3":[{"id":{"Concrete":{"parents":2,"interior":{"X1":{"GlobalConsensus":"Kusama"}}}},"fun":{"Fungible":"10000000000"}}]} 1`] = ` -[ - { - "data": { - "outcome": { - "Complete": { - "used": { - "proofSize": "(rounded 3600)", - "refTime": "(rounded 180000000)", - }, - }, - }, - }, - "method": "Attempted", - "section": "polkadotXcm", - }, - { - "data": { - "fees": [ - { - "fun": { - "Fungible": 310000000, - }, - "id": { - "interior": "Here", - "parents": 1, - }, - }, - ], - "paying": { - "interior": { - "X1": [ - { - "AccountId32": { - "id": "(hash)", - "network": "Polkadot", - }, - }, - ], - }, - "parents": 0, - }, - }, - "method": "FeesPaid", - "section": "polkadotXcm", - }, - { - "data": { - "destination": { - "interior": { - "X1": [ - { - "Parachain": "(rounded 2100)", - }, - ], - }, - "parents": 1, - }, - "message": [ - { - "ReceiveTeleportedAsset": [ - { - "fun": { - "Fungible": 10000000000, - }, - "id": { - "interior": { - "X1": [ - { - "GlobalConsensus": "Kusama", - }, - ], - }, - "parents": 2, - }, - }, - ], - }, - "ClearOrigin", - { - "BuyExecution": { - "fees": { - "fun": { - "Fungible": 10000000000, - }, - "id": { - "interior": { - "X1": [ - { - "GlobalConsensus": "Kusama", - }, - ], - }, - "parents": 2, - }, - }, - "weightLimit": "Unlimited", - }, - }, - { - "DepositAsset": { - "assets": { - "Wild": "All", - }, - "beneficiary": { - "interior": { - "X1": [ - { - "AccountId32": { - "id": "(hash)", - "network": null, - }, - }, - ], - }, - "parents": 0, - }, - }, - }, - ], - "messageId": "(hash)", - "origin": { - "interior": { - "X1": [ - { - "AccountId32": { - "id": "(hash)", - "network": "Polkadot", - }, - }, - ], - }, - "parents": 0, - }, - }, - "method": "Sent", - "section": "polkadotXcm", - }, -] -`; - -exports[`Teleport Transfers from AH Account Alice -> Spiritnet Account Alice > sender assetHub::xcmpQueue::[XcmpMessageSent] asset {"V3":[{"id":{"Concrete":{"parents":2,"interior":{"X1":{"GlobalConsensus":"Kusama"}}}},"fun":{"Fungible":"10000000000"}}]} 1`] = ` -[ - { - "data": { - "messageHash": "(hash)", - }, - "method": "XcmpMessageSent", - "section": "xcmpQueue", - }, -] -`; diff --git a/integration-tests/chopsticks/src/tests/xcm/assetHub/spiritnet/__snapshots__/teleportTransferSpiritnetAssetHub.test.ts.snap b/integration-tests/chopsticks/src/tests/xcm/assetHub/spiritnet/__snapshots__/teleportTransferSpiritnetAssetHub.test.ts.snap deleted file mode 100644 index e3c05f88b0..0000000000 --- a/integration-tests/chopsticks/src/tests/xcm/assetHub/spiritnet/__snapshots__/teleportTransferSpiritnetAssetHub.test.ts.snap +++ /dev/null @@ -1,3 +0,0 @@ -// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html - -exports[`Teleport assets from Spiritnet Account Alice -> AH Account Alice 1`] = `[RpcError: 1010: {"invalid":{"exhaustsResources":null}}]`; diff --git a/integration-tests/chopsticks/src/tests/xcm/assetHub/spiritnet/limitedReserveTransferAssetHubSpiritnet.test.ts b/integration-tests/chopsticks/src/tests/xcm/assetHub/spiritnet/limitedReserveTransferAssetHubSpiritnet.test.ts deleted file mode 100644 index d2bfda700d..0000000000 --- a/integration-tests/chopsticks/src/tests/xcm/assetHub/spiritnet/limitedReserveTransferAssetHubSpiritnet.test.ts +++ /dev/null @@ -1,77 +0,0 @@ -import { test } from 'vitest' -import { sendTransaction, withExpect } from '@acala-network/chopsticks-testing' - -import * as SpiritnetConfig from '../../../../network/spiritnet.js' -import * as AssetHubConfig from '../../../../network/assetHub.js' -import { DOT, keysAlice } from '../../../../utils.js' -import { spiritnetContext, assethubContext } from '../../../index.js' -import { getSiblingLocationV3 } from '../../../../network/utils.js' -import { createBlock, hexAddress, setStorage } from '../../../utils.js' - -test('Limited Reserve Transfers from AH Account Alice -> Spiritnet Account Alice', async ({ expect }) => { - const { checkEvents, checkSystemEvents } = withExpect(expect) - - // Assign alice some KSM - await setStorage(assethubContext, { - ...AssetHubConfig.assignDotTokensToAccountsAsStorage([keysAlice.address]), - ...AssetHubConfig.assignKSMtoAccounts([keysAlice.address]), - }) - - const spiritnetDestination = { V3: getSiblingLocationV3(SpiritnetConfig.paraId) } - const KSMAsset = { V3: [{ id: { Concrete: AssetHubConfig.KSMAssetLocation }, fun: { Fungible: DOT.toString() } }] } - const remoteFeeId = { V3: { Concrete: AssetHubConfig.KSMAssetLocation } } - const xcmMessage = { - V3: [ - { - DepositAsset: { - assets: { Wild: 'All' }, - beneficiary: { - parents: 0, - interior: { - X1: { - AccountId32: { - id: hexAddress(keysAlice.address), - }, - }, - }, - }, - }, - }, - ], - } - - // Otherwise the it is tried to route the msg over KSM. - const signedTx = assethubContext.api.tx.polkadotXcm - .transferAssetsUsingTypeAndThen( - spiritnetDestination, - KSMAsset, - 'LocalReserve', - remoteFeeId, - 'LocalReserve', - xcmMessage, - 'Unlimited' - ) - .signAsync(keysAlice) - - const events = await sendTransaction(signedTx) - await createBlock(assethubContext) - - // MSG should still be send. - await checkEvents(events, 'xcmpQueue').toMatchSnapshot( - `sender assetHub::xcmpQueue::[XcmpMessageSent] asset ${JSON.stringify(KSMAsset)}` - ) - await checkEvents(events, 'polkadotXcm').toMatchSnapshot( - `sender assetHub::polkadotXcm::[Sent,FeesPaid,Attempted] asset ${JSON.stringify(KSMAsset)} ` - ) - await checkEvents(events, 'foreignAssets').toMatchSnapshot( - `sender assetHub::foreignAssets::[Transferred] asset ${JSON.stringify(KSMAsset)}` - ) - - // ... But should fail on receiver side. - await createBlock(spiritnetContext) - - // we expect to have the UntrustedReserveLocation error - await checkSystemEvents(spiritnetContext, 'xcmpQueue').toMatchSnapshot( - `receiver spiritnet::XcmpQueue::[Fail] asset ${JSON.stringify(KSMAsset)}` - ) -}, 20_000) diff --git a/integration-tests/chopsticks/src/tests/xcm/assetHub/spiritnet/limitedReserveTransferSpiritnetAssetHub.test.ts b/integration-tests/chopsticks/src/tests/xcm/assetHub/spiritnet/limitedReserveTransferSpiritnetAssetHub.test.ts deleted file mode 100644 index fc8a6e3d1e..0000000000 --- a/integration-tests/chopsticks/src/tests/xcm/assetHub/spiritnet/limitedReserveTransferSpiritnetAssetHub.test.ts +++ /dev/null @@ -1,67 +0,0 @@ -import { test } from 'vitest' -import { sendTransaction, withExpect } from '@acala-network/chopsticks-testing' - -import * as SpiritnetConfig from '../../../../network/spiritnet.js' -import * as AssetHubConfig from '../../../../network/assetHub.js' -import { KILT, initialBalanceKILT, keysAlice } from '../../../../utils.js' -import { spiritnetContext, assethubContext, getFreeBalanceSpiritnet } from '../../../index.js' -import { getAccountLocationV3, getNativeAssetIdLocationV3, getSiblingLocationV3 } from '../../../../network/utils.js' -import { checkBalance, createBlock, hexAddress, setStorage } from '../../../utils.js' - -test('Limited Reserve Transfers from Spiritnet Account Alice -> AH Account Alice', async ({ expect }) => { - const { checkEvents, checkSystemEvents } = withExpect(expect) - - // Assign alice some KILT tokens - await setStorage(spiritnetContext, { - ...SpiritnetConfig.assignNativeTokensToAccounts([keysAlice.address], initialBalanceKILT), - ...SpiritnetConfig.XcmPalletSafeVersion3StorageEntry(), - }) - - // Balance of the AH sovereign account before the transfer - const assetHubSovereignAccountBalance = await getFreeBalanceSpiritnet( - AssetHubConfig.sovereignAccountOnSiblingChains - ) - - // check initial balance of Alice on Spiritnet - await checkBalance(getFreeBalanceSpiritnet, keysAlice.address, expect, initialBalanceKILT) - - const aliceAddress = hexAddress(keysAlice.address) - const assetHubDestination = { V3: getSiblingLocationV3(AssetHubConfig.paraId) } - const beneficiary = getAccountLocationV3(aliceAddress) - const kiltAsset = { V3: [getNativeAssetIdLocationV3(KILT.toString())] } - - const signedTx = spiritnetContext.api.tx.polkadotXcm - .limitedReserveTransferAssets(assetHubDestination, beneficiary, kiltAsset, 0, 'Unlimited') - .signAsync(keysAlice) - - const events = await sendTransaction(signedTx) - - // Check sender state - await createBlock(spiritnetContext) - - // Check events sender - await checkEvents(events, 'xcmpQueue').toMatchSnapshot( - `sender spiritnet::xcmpQueue::[XcmpMessageSent] asset ${JSON.stringify(kiltAsset)}` - ) - await checkEvents(events, 'polkadotXcm').toMatchSnapshot( - `sender spiritnet::polkadotXcm::[Attempted] asset ${JSON.stringify(kiltAsset)}` - ) - await checkEvents(events, { section: 'balances', method: 'Withdraw' }).toMatchSnapshot( - `sender spiritnet::balances::[Withdraw] asset ${JSON.stringify(kiltAsset)}` - ) - - // check balance. The sovereign account should hold one additional KILT. - await checkBalance( - getFreeBalanceSpiritnet, - AssetHubConfig.sovereignAccountOnSiblingChains, - expect, - assetHubSovereignAccountBalance + KILT - ) - - await createBlock(assethubContext) - - // MSG processing will fail on AH. - await checkSystemEvents(assethubContext, 'messageQueue').toMatchSnapshot( - `receiver assetHub::messageQueue::[Processed] asset ${JSON.stringify(kiltAsset)}` - ) -}, 20_000) diff --git a/integration-tests/chopsticks/src/tests/xcm/assetHub/spiritnet/teleportTransferAssetHubSpiritnet.test.ts b/integration-tests/chopsticks/src/tests/xcm/assetHub/spiritnet/teleportTransferAssetHubSpiritnet.test.ts deleted file mode 100644 index 7c9e2a3910..0000000000 --- a/integration-tests/chopsticks/src/tests/xcm/assetHub/spiritnet/teleportTransferAssetHubSpiritnet.test.ts +++ /dev/null @@ -1,77 +0,0 @@ -import { test } from 'vitest' -import { sendTransaction, withExpect } from '@acala-network/chopsticks-testing' - -import * as SpiritnetConfig from '../../../../network/spiritnet.js' -import * as AssetHubConfig from '../../../../network/assetHub.js' -import { DOT, keysAlice } from '../../../../utils.js' -import { spiritnetContext, assethubContext } from '../../../index.js' -import { getSiblingLocationV3 } from '../../../../network/utils.js' -import { createBlock, hexAddress, setStorage } from '../../../utils.js' - -test('Teleport Transfers from AH Account Alice -> Spiritnet Account Alice', async ({ expect }) => { - const { checkEvents, checkSystemEvents } = withExpect(expect) - - // Assign alice some KSM - await setStorage(assethubContext, { - ...AssetHubConfig.assignDotTokensToAccountsAsStorage([keysAlice.address]), - ...AssetHubConfig.assignKSMtoAccounts([keysAlice.address]), - }) - - const spiritnetDestination = { V3: getSiblingLocationV3(SpiritnetConfig.paraId) } - const KSMAsset = { V3: [{ id: { Concrete: AssetHubConfig.KSMAssetLocation }, fun: { Fungible: DOT.toString() } }] } - const remoteFeeId = { V3: { Concrete: AssetHubConfig.KSMAssetLocation } } - const xcmMessage = { - V3: [ - { - DepositAsset: { - assets: { Wild: 'All' }, - beneficiary: { - parents: 0, - interior: { - X1: { - AccountId32: { - id: hexAddress(keysAlice.address), - }, - }, - }, - }, - }, - }, - ], - } - - // Otherwise the it is tried to route the msg over KSM. - const signedTx = assethubContext.api.tx.polkadotXcm - .transferAssetsUsingTypeAndThen( - spiritnetDestination, - KSMAsset, - 'Teleport', - remoteFeeId, - 'Teleport', - xcmMessage, - 'Unlimited' - ) - .signAsync(keysAlice) - - const events = await sendTransaction(signedTx) - await createBlock(assethubContext) - - // MSG should still be send. - await checkEvents(events, 'xcmpQueue').toMatchSnapshot( - `sender assetHub::xcmpQueue::[XcmpMessageSent] asset ${JSON.stringify(KSMAsset)}` - ) - await checkEvents(events, 'polkadotXcm').toMatchSnapshot( - `sender assetHub::polkadotXcm::[Attempted,FeesPaid,Sent] asset ${JSON.stringify(KSMAsset)}` - ) - await checkEvents(events, 'foreignAssets').toMatchSnapshot( - `sender assetHub::foreignAssets::[Burned] asset ${JSON.stringify(KSMAsset)}` - ) - - // ... But should fail on receiver side. - await createBlock(spiritnetContext) - - // we expect to have the UntrustedTeleportLocation error - await checkSystemEvents(spiritnetContext, 'xcmpQueue').toMatchSnapshot( - `receiver spiritnet::xcmpQueue::[Fail] asset ${JSON.stringify(KSMAsset)}` - ) -}, 20_000) diff --git a/integration-tests/chopsticks/src/tests/xcm/assetHub/spiritnet/teleportTransferSpiritnetAssetHub.test.ts b/integration-tests/chopsticks/src/tests/xcm/assetHub/spiritnet/teleportTransferSpiritnetAssetHub.test.ts deleted file mode 100644 index 2f3c5980e5..0000000000 --- a/integration-tests/chopsticks/src/tests/xcm/assetHub/spiritnet/teleportTransferSpiritnetAssetHub.test.ts +++ /dev/null @@ -1,34 +0,0 @@ -import { test } from 'vitest' - -import * as SpiritnetConfig from '../../../../network/spiritnet.js' -import * as AssetHubConfig from '../../../../network/assetHub.js' -import { KILT, initialBalanceKILT, keysAlice } from '../../../../utils.js' -import { spiritnetContext, getFreeBalanceSpiritnet } from '../../../index.js' -import { getAccountLocationV3, getNativeAssetIdLocationV3, getSiblingLocationV3 } from '../../../../network/utils.js' -import { checkBalance, createBlock, hexAddress, setStorage } from '../../../utils.js' - -test('Teleport assets from Spiritnet Account Alice -> AH Account Alice', async ({ expect }) => { - // Assign alice some KILT tokens - await setStorage(spiritnetContext, { - ...SpiritnetConfig.assignNativeTokensToAccounts([keysAlice.address], initialBalanceKILT), - ...SpiritnetConfig.XcmPalletSafeVersion3StorageEntry(), - }) - - // check initial balance of Alice on Spiritnet - await checkBalance(getFreeBalanceSpiritnet, keysAlice.address, expect, initialBalanceKILT) - - const aliceAddress = hexAddress(keysAlice.address) - const assetHubDestination = { V3: getSiblingLocationV3(AssetHubConfig.paraId) } - const beneficiary = getAccountLocationV3(aliceAddress) - const kiltAsset = { V3: [getNativeAssetIdLocationV3(KILT)] } - - // Teleportation should exhaust resources. This is intended until isTeleport is enabled in the XCM config. - await expect(async () => { - await spiritnetContext.api.tx.polkadotXcm - .teleportAssets(assetHubDestination, beneficiary, kiltAsset, 0) - .signAndSend(keysAlice) - await createBlock(spiritnetContext) - }).rejects.toThrowErrorMatchingSnapshot() - - // Check sender state -}, 20_000) diff --git a/integration-tests/chopsticks/src/tests/xcm/hydration/__snapshots__/limitedReserveTransferSpiritnetHydraDxV2.test.ts.snap b/integration-tests/chopsticks/src/tests/xcm/hydration/__snapshots__/limitedReserveTransferSpiritnetHydraDxV2.test.ts.snap deleted file mode 100644 index 4aae740e41..0000000000 --- a/integration-tests/chopsticks/src/tests/xcm/hydration/__snapshots__/limitedReserveTransferSpiritnetHydraDxV2.test.ts.snap +++ /dev/null @@ -1,86 +0,0 @@ -// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html - -exports[`Limited Reserve V2 Transfers from Spiritnet Account Alice -> HydraDx Account Alice > receiver events currencies 1`] = ` -[ - { - "data": { - "amount": "(rounded 1000000000000000)", - "currencyId": 28, - "who": "7NL1GYCJu8cFSnWBLwET2X3fMdodw8T75zuxi59hA2bhdjQq", - }, - "method": "Deposited", - "section": "currencies", - }, - { - "data": { - "amount": "(rounded 3200000000000)", - "currencyId": 28, - "who": "7L53bUTBopuwFt3mKUfmkzgGLayYa1Yvn1hAg9v5UMrQzTfh", - }, - "method": "Deposited", - "section": "currencies", - }, -] -`; - -exports[`Limited Reserve V2 Transfers from Spiritnet Account Alice -> HydraDx Account Alice > receiver events xcmpQueue 1`] = ` -[ - { - "data": { - "id": "(hash)", - "origin": { - "Sibling": "(rounded 2100)", - }, - "success": true, - "weightUsed": { - "proofSize": 0, - "refTime": 400000000, - }, - }, - "method": "Processed", - "section": "messageQueue", - }, -] -`; - -exports[`Limited Reserve V2 Transfers from Spiritnet Account Alice -> HydraDx Account Alice > sender events Balances 1`] = ` -[ - { - "data": { - "amount": "(rounded 170000000000)", - "who": "4seWojfEHrk5YKPahdErazQ3CWEHZYi6NV4gKz5AaejWbRPJ", - }, - "method": "Withdraw", - "section": "balances", - }, -] -`; - -exports[`Limited Reserve V2 Transfers from Spiritnet Account Alice -> HydraDx Account Alice > sender events xcm pallet 1`] = ` -[ - { - "data": { - "outcome": { - "Complete": { - "proofSize": 0, - "refTime": 400000000, - }, - }, - }, - "method": "Attempted", - "section": "polkadotXcm", - }, -] -`; - -exports[`Limited Reserve V2 Transfers from Spiritnet Account Alice -> HydraDx Account Alice > sender events xcm queue pallet 1`] = ` -[ - { - "data": { - "messageHash": "(hash)", - }, - "method": "XcmpMessageSent", - "section": "xcmpQueue", - }, -] -`; diff --git a/integration-tests/chopsticks/src/tests/xcm/hydration/__snapshots__/limitedReserveTransferSpiritnetHydraDxV3.test.ts.snap b/integration-tests/chopsticks/src/tests/xcm/hydration/__snapshots__/limitedReserveTransferSpiritnetHydraDxV3.test.ts.snap deleted file mode 100644 index cd07dfd9b0..0000000000 --- a/integration-tests/chopsticks/src/tests/xcm/hydration/__snapshots__/limitedReserveTransferSpiritnetHydraDxV3.test.ts.snap +++ /dev/null @@ -1,86 +0,0 @@ -// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html - -exports[`Limited Reserve V3 Transfers from Spiritnet Account Alice -> HydraDx Account Alice > receiver events currencies 1`] = ` -[ - { - "data": { - "amount": "(rounded 1000000000000000)", - "currencyId": 28, - "who": "7NL1GYCJu8cFSnWBLwET2X3fMdodw8T75zuxi59hA2bhdjQq", - }, - "method": "Deposited", - "section": "currencies", - }, - { - "data": { - "amount": "(rounded 3200000000000)", - "currencyId": 28, - "who": "7L53bUTBopuwFt3mKUfmkzgGLayYa1Yvn1hAg9v5UMrQzTfh", - }, - "method": "Deposited", - "section": "currencies", - }, -] -`; - -exports[`Limited Reserve V3 Transfers from Spiritnet Account Alice -> HydraDx Account Alice > receiver events xcmpQueue 1`] = ` -[ - { - "data": { - "id": "(hash)", - "origin": { - "Sibling": "(rounded 2100)", - }, - "success": true, - "weightUsed": { - "proofSize": 0, - "refTime": 400000000, - }, - }, - "method": "Processed", - "section": "messageQueue", - }, -] -`; - -exports[`Limited Reserve V3 Transfers from Spiritnet Account Alice -> HydraDx Account Alice > sender events Balances 1`] = ` -[ - { - "data": { - "amount": "(rounded 170000000000)", - "who": "4seWojfEHrk5YKPahdErazQ3CWEHZYi6NV4gKz5AaejWbRPJ", - }, - "method": "Withdraw", - "section": "balances", - }, -] -`; - -exports[`Limited Reserve V3 Transfers from Spiritnet Account Alice -> HydraDx Account Alice > sender events xcm pallet 1`] = ` -[ - { - "data": { - "outcome": { - "Complete": { - "proofSize": 0, - "refTime": 400000000, - }, - }, - }, - "method": "Attempted", - "section": "polkadotXcm", - }, -] -`; - -exports[`Limited Reserve V3 Transfers from Spiritnet Account Alice -> HydraDx Account Alice > sender events xcm queue pallet 1`] = ` -[ - { - "data": { - "messageHash": "(hash)", - }, - "method": "XcmpMessageSent", - "section": "xcmpQueue", - }, -] -`; diff --git a/integration-tests/chopsticks/src/tests/xcm/hydration/__snapshots__/limitedReseveTransferHydraDxSpiritnet.test.ts.snap b/integration-tests/chopsticks/src/tests/xcm/hydration/__snapshots__/limitedReseveTransferHydraDxSpiritnet.test.ts.snap deleted file mode 100644 index 2e2b13824a..0000000000 --- a/integration-tests/chopsticks/src/tests/xcm/hydration/__snapshots__/limitedReseveTransferHydraDxSpiritnet.test.ts.snap +++ /dev/null @@ -1,129 +0,0 @@ -// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html - -exports[`Limited Reserve Transfers from HydraDx Account Alice -> Spiritnet Account Alice > receiver events Balances 1`] = ` -[ - { - "data": { - "amount": 1000000000000000, - "who": "4qXPdpioJ6D8cgdeYXaukV2Y2oAQUHaX1VnGhdbSRqJn2CBt", - }, - "method": "Withdraw", - "section": "balances", - }, -] -`; - -exports[`Limited Reserve Transfers from HydraDx Account Alice -> Spiritnet Account Alice > receiver events Balances 2`] = ` -[ - { - "data": { - "account": "4seWojfEHrk5YKPahdErazQ3CWEHZYi6NV4gKz5AaejWbRPJ", - "freeBalance": "(rounded 1000000000000000)", - }, - "method": "Endowed", - "section": "balances", - }, -] -`; - -exports[`Limited Reserve Transfers from HydraDx Account Alice -> Spiritnet Account Alice > receiver events xcmpQueue 1`] = ` -[ - { - "data": { - "messageHash": "(hash)", - "messageId": "(hash)", - "weight": { - "proofSize": 0, - "refTime": 800000000, - }, - }, - "method": "Success", - "section": "xcmpQueue", - }, -] -`; - -exports[`Limited Reserve Transfers from HydraDx Account Alice -> Spiritnet Account Alice > sender events currencies 1`] = ` -[ - { - "data": { - "amount": "(rounded 450000000000)", - "currencyId": 0, - "who": "7NL1GYCJu8cFSnWBLwET2X3fMdodw8T75zuxi59hA2bhdjQq", - }, - "method": "Withdrawn", - "section": "currencies", - }, - { - "data": { - "amount": 1000000000000000, - "currencyId": 28, - "who": "7NL1GYCJu8cFSnWBLwET2X3fMdodw8T75zuxi59hA2bhdjQq", - }, - "method": "Withdrawn", - "section": "currencies", - }, -] -`; - -exports[`Limited Reserve Transfers from HydraDx Account Alice -> Spiritnet Account Alice > sender events currencies 2`] = ` -[ - { - "data": { - "assets": [ - { - "fun": { - "Fungible": 1000000000000000, - }, - "id": { - "interior": { - "X1": [ - { - "Parachain": "(rounded 2100)", - }, - ], - }, - "parents": 1, - }, - }, - ], - "dest": { - "interior": { - "X2": [ - { - "Parachain": "(rounded 2100)", - }, - { - "AccountId32": { - "id": "(hash)", - "network": null, - }, - }, - ], - }, - "parents": 1, - }, - "fee": { - "fun": { - "Fungible": 1000000000000000, - }, - "id": { - "interior": { - "X1": [ - { - "Parachain": "(rounded 2100)", - }, - ], - }, - "parents": 1, - }, - }, - "sender": "7NL1GYCJu8cFSnWBLwET2X3fMdodw8T75zuxi59hA2bhdjQq", - }, - "method": "TransferredAssets", - "section": "xTokens", - }, -] -`; - -exports[`Limited Reserve Transfers from HydraDx Account Alice -> Spiritnet Account Alice > sender events xcm queue pallet 1`] = `[]`; diff --git a/integration-tests/chopsticks/src/tests/xcm/hydration/limitedReserveTransferSpiritnetHydraDxV2.test.ts b/integration-tests/chopsticks/src/tests/xcm/hydration/limitedReserveTransferSpiritnetHydraDxV2.test.ts deleted file mode 100644 index 9de60e4f52..0000000000 --- a/integration-tests/chopsticks/src/tests/xcm/hydration/limitedReserveTransferSpiritnetHydraDxV2.test.ts +++ /dev/null @@ -1,82 +0,0 @@ -import { test } from 'vitest' -import { sendTransaction, withExpect } from '@acala-network/chopsticks-testing' - -import * as SpiritnetConfig from '../../../network/spiritnet.js' -import * as HydraDxConfig from '../../../network/hydraDx.js' -import { KILT, initialBalanceKILT, keysAlice } from '../../../utils.js' -import { spiritnetContext, hydradxContext, getFreeBalanceSpiritnet, getFreeBalanceHydraDxKilt } from '../../index.js' -import { getAccountLocationV2, getNativeAssetIdLocationV3, getSiblingLocationV3 } from '../../../network/utils.js' -import { checkBalance, checkBalanceInRange, createBlock, hexAddress, setStorage } from '../../utils.js' - -// native asset location is the same for V2 and V3 -const KILT_ASSET_V2 = { V2: [getNativeAssetIdLocationV3(KILT)] } - -test('Limited Reserve V2 Transfers from Spiritnet Account Alice -> HydraDx Account Alice', async ({ expect }) => { - const { checkEvents, checkSystemEvents } = withExpect(expect) - - // Assign alice some KILT tokens - await setStorage( - spiritnetContext, - SpiritnetConfig.assignNativeTokensToAccounts([keysAlice.address], initialBalanceKILT) - ) - - // Balance of the hydraDx sovereign account before the transfer - const hydraDxSovereignAccountBalanceBeforeTransfer = await getFreeBalanceSpiritnet( - SpiritnetConfig.hydraDxSovereignAccount - ) - - // check initial balance of Alice on Spiritnet - await checkBalance(getFreeBalanceSpiritnet, keysAlice.address, expect, initialBalanceKILT) - - // Alice should have NO KILT on HydraDx - await checkBalance(getFreeBalanceHydraDxKilt, keysAlice.address, expect, BigInt(0)) - - const aliceAddress = hexAddress(keysAlice.address) - const hydraDxDestination = { V2: getSiblingLocationV3(HydraDxConfig.paraId) } - const beneficiary = getAccountLocationV2(aliceAddress) - - const signedTx = spiritnetContext.api.tx.polkadotXcm - .limitedReserveTransferAssets(hydraDxDestination, beneficiary, KILT_ASSET_V2, 0, 'Unlimited') - .signAsync(keysAlice) - - const events = await sendTransaction(signedTx) - - // Check sender state - await createBlock(spiritnetContext) - - // Check events sender - checkEvents(events, 'xcmpQueue').toMatchSnapshot('sender events xcm queue pallet') - checkEvents(events, 'polkadotXcm').toMatchSnapshot('sender events xcm pallet') - checkEvents(events, { section: 'balances', method: 'Withdraw' }).toMatchSnapshot('sender events Balances') - - // check balance. The sovereign account should hold one additional KILT. - await checkBalance( - getFreeBalanceSpiritnet, - SpiritnetConfig.hydraDxSovereignAccount, - expect, - hydraDxSovereignAccountBalanceBeforeTransfer + KILT - ) - - // check balance sender - // Equal to `initialBalanceKILT - KILT` - tx fees - await checkBalanceInRange(getFreeBalanceSpiritnet, keysAlice.address, expect, [ - BigInt('98999830999996320'), - BigInt('98999830999996321'), - ]) - - // Check receiver state - await createBlock(hydradxContext) - - // Check events receiver - checkSystemEvents(hydradxContext, { section: 'currencies', method: 'Deposited' }).toMatchSnapshot( - 'receiver events currencies' - ) - checkSystemEvents(hydradxContext, 'messageQueue').toMatchSnapshot('receiver events xcmpQueue') - - // check balance receiver - // check balance. Equal to `KILT` - tx fees - await checkBalanceInRange(getFreeBalanceHydraDxKilt, aliceAddress, expect, [ - BigInt(996349465529793), - BigInt(996349465529796), - ]) -}, 20_000) diff --git a/integration-tests/chopsticks/src/tests/xcm/hydration/limitedReserveTransferSpiritnetHydraDxV3.test.ts b/integration-tests/chopsticks/src/tests/xcm/hydration/limitedReserveTransferSpiritnetHydraDxV3.test.ts deleted file mode 100644 index a82c3908fa..0000000000 --- a/integration-tests/chopsticks/src/tests/xcm/hydration/limitedReserveTransferSpiritnetHydraDxV3.test.ts +++ /dev/null @@ -1,80 +0,0 @@ -import { test } from 'vitest' -import { sendTransaction, withExpect } from '@acala-network/chopsticks-testing' - -import * as SpiritnetConfig from '../../../network/spiritnet.js' -import * as HydraDxConfig from '../../../network/hydraDx.js' -import { KILT, initialBalanceKILT, keysAlice } from '../../../utils.js' -import { spiritnetContext, hydradxContext, getFreeBalanceSpiritnet, getFreeBalanceHydraDxKilt } from '../../index.js' -import { getAccountLocationV3, getNativeAssetIdLocationV3, getSiblingLocationV3 } from '../../../network/utils.js' -import { checkBalance, checkBalanceInRange, createBlock, hexAddress, setStorage } from '../../utils.js' - -const KILT_ASSET_V3 = { V3: [getNativeAssetIdLocationV3(KILT)] } - -test('Limited Reserve V3 Transfers from Spiritnet Account Alice -> HydraDx Account Alice', async ({ expect }) => { - const { checkEvents, checkSystemEvents } = withExpect(expect) - - // Assign alice some KILT tokens - await setStorage( - spiritnetContext, - SpiritnetConfig.assignNativeTokensToAccounts([keysAlice.address], initialBalanceKILT) - ) - - // Balance of the hydraDx sovereign account before the transfer - const hydraDxSovereignAccountBalanceBeforeTransfer = await getFreeBalanceSpiritnet( - SpiritnetConfig.hydraDxSovereignAccount - ) - - // check initial balance of Alice on Spiritnet - await checkBalance(getFreeBalanceSpiritnet, keysAlice.address, expect, initialBalanceKILT) - // Alice should have NO KILT on HydraDx - await checkBalance(getFreeBalanceHydraDxKilt, keysAlice.address, expect, BigInt(0)) - - const aliceAddress = hexAddress(keysAlice.address) - const hydraDxDestination = { V3: getSiblingLocationV3(HydraDxConfig.paraId) } - const beneficiary = getAccountLocationV3(aliceAddress) - - const signedTx = spiritnetContext.api.tx.polkadotXcm - .limitedReserveTransferAssets(hydraDxDestination, beneficiary, KILT_ASSET_V3, 0, 'Unlimited') - .signAsync(keysAlice) - - const events = await sendTransaction(signedTx) - - // Check sender state - await createBlock(spiritnetContext) - - // Check events sender - checkEvents(events, 'xcmpQueue').toMatchSnapshot('sender events xcm queue pallet') - checkEvents(events, 'polkadotXcm').toMatchSnapshot('sender events xcm pallet') - checkEvents(events, { section: 'balances', method: 'Withdraw' }).toMatchSnapshot('sender events Balances') - - // check balance. The sovereign account should hold one additional KILT. - await checkBalance( - getFreeBalanceSpiritnet, - SpiritnetConfig.hydraDxSovereignAccount, - expect, - hydraDxSovereignAccountBalanceBeforeTransfer + KILT - ) - - // check balance sender - // Equal to `initialBalanceKILT - KILT` - tx fees - await checkBalanceInRange(getFreeBalanceSpiritnet, keysAlice.address, expect, [ - BigInt('98999830999996320'), - BigInt('98999830999996321'), - ]) - - // Check receiver state - await createBlock(hydradxContext) - - // Check events receiver - checkSystemEvents(hydradxContext, { section: 'currencies', method: 'Deposited' }).toMatchSnapshot( - 'receiver events currencies' - ) - checkSystemEvents(hydradxContext, 'messageQueue').toMatchSnapshot('receiver events xcmpQueue') - - // check balance receiver - // check balance. Equal to `KILT` - tx fees - await checkBalanceInRange(getFreeBalanceHydraDxKilt, aliceAddress, expect, [ - BigInt(996349465529793), - BigInt(996349465529796), - ]) -}, 20_000) diff --git a/integration-tests/chopsticks/src/tests/xcm/hydration/limitedReseveTransferHydraDxSpiritnet.test.ts b/integration-tests/chopsticks/src/tests/xcm/hydration/limitedReseveTransferHydraDxSpiritnet.test.ts deleted file mode 100644 index b16c066947..0000000000 --- a/integration-tests/chopsticks/src/tests/xcm/hydration/limitedReseveTransferHydraDxSpiritnet.test.ts +++ /dev/null @@ -1,87 +0,0 @@ -import { test } from 'vitest' -import { sendTransaction, withExpect } from '@acala-network/chopsticks-testing' - -import * as HydraDxConfig from '../../../network/hydraDx.js' -import * as SpiritnetConfig from '../../../network/spiritnet.js' -import { KILT, initialBalanceHDX, initialBalanceKILT, keysAlice } from '../../../utils.js' -import { getFreeBalanceHydraDxKilt, getFreeBalanceSpiritnet, hydradxContext, spiritnetContext } from '../../index.js' -import { checkBalance, createBlock, hexAddress, setStorage, checkBalanceInRange } from '../../utils.js' - -const aliceLocation = { - V3: { - parents: 1, - interior: { - X2: [ - { Parachain: SpiritnetConfig.paraId }, - { - AccountId32: { - id: hexAddress(keysAlice.address), - }, - }, - ], - }, - }, -} - -test('Limited Reserve Transfers from HydraDx Account Alice -> Spiritnet Account Alice', async ({ expect }) => { - const { checkEvents, checkSystemEvents } = withExpect(expect) - - // assign initial balance to Alice. Alice also needs to have some HDX, otherwise the account gets dusted - const config = { - ...HydraDxConfig.assignKiltTokensToAccounts([keysAlice.address], initialBalanceKILT), - ...HydraDxConfig.assignNativeTokensToAccounts([keysAlice.address], initialBalanceHDX), - } - - // Set storage - await setStorage(hydradxContext, config) - - const hydraDxSovereignAccountBalanceBeforeTransfer = await getFreeBalanceSpiritnet( - SpiritnetConfig.hydraDxSovereignAccount - ) - - // check initial balance of alice - await checkBalance(getFreeBalanceHydraDxKilt, keysAlice.address, expect, initialBalanceKILT) - - const signedTx = hydradxContext.api.tx.xTokens - .transfer(HydraDxConfig.kiltTokenId, KILT, aliceLocation, 'Unlimited') - .signAsync(keysAlice) - - const events = await sendTransaction(signedTx) - - // Check sender state - await createBlock(hydradxContext) - - // Check events sender - checkEvents(events, 'messageQueue').toMatchSnapshot('sender events xcm queue pallet') - checkEvents(events, { section: 'currencies', method: 'Withdrawn' }).toMatchSnapshot('sender events currencies') - checkEvents(events, 'xTokens').toMatchSnapshot('sender events currencies') - - // Check balance - await checkBalance(getFreeBalanceHydraDxKilt, keysAlice.address, expect, initialBalanceKILT - KILT) - - // Check receiver state - await createBlock(spiritnetContext) - - // check events receiver - checkSystemEvents(spiritnetContext, 'xcmpQueue').toMatchSnapshot('receiver events xcmpQueue') - checkSystemEvents(spiritnetContext, { section: 'balances', method: 'Withdraw' }).toMatchSnapshot( - 'receiver events Balances' - ) - checkSystemEvents(spiritnetContext, { section: 'balances', method: 'Endowed' }).toMatchSnapshot( - 'receiver events Balances' - ) - - // Check balance receiver - await checkBalance( - getFreeBalanceSpiritnet, - SpiritnetConfig.hydraDxSovereignAccount, - expect, - hydraDxSovereignAccountBalanceBeforeTransfer - KILT - ) - - // Alice receives a bit less since the tx fees has to be paid. - await checkBalanceInRange(getFreeBalanceSpiritnet, keysAlice.address, expect, [ - BigInt('999999999971174'), - BigInt('999999999976345'), - ]) -}, 20_000) diff --git a/integration-tests/chopsticks/src/tests/xcm/initiateWithdrawAsset/__snapshots__/index.test.ts.snap b/integration-tests/chopsticks/src/tests/xcm/initiateWithdrawAsset/__snapshots__/index.test.ts.snap new file mode 100644 index 0000000000..294edfb3bd --- /dev/null +++ b/integration-tests/chopsticks/src/tests/xcm/initiateWithdrawAsset/__snapshots__/index.test.ts.snap @@ -0,0 +1,25 @@ +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html + +exports[`Withdraw Asset > Hydration -> KILT DEV > receiver events {"section":"system","method":"NewAccount"} 1`] = ` +[ + { + "data": { + "account": "4rsmbFBYpVmWE2LHRsSZKxf22a8cbJLxMZqvVGkGkSDmDBcr", + }, + "method": "NewAccount", + "section": "system", + }, +] +`; + +exports[`Withdraw Asset > Hydration -> KILT live > receiver events {"section":"system","method":"NewAccount"} 1`] = ` +[ + { + "data": { + "account": "4rsmbFBYpVmWE2LHRsSZKxf22a8cbJLxMZqvVGkGkSDmDBcr", + }, + "method": "NewAccount", + "section": "system", + }, +] +`; diff --git a/integration-tests/chopsticks/src/tests/xcm/initiateWithdrawAsset/config.ts b/integration-tests/chopsticks/src/tests/xcm/initiateWithdrawAsset/config.ts new file mode 100644 index 0000000000..168c8ec985 --- /dev/null +++ b/integration-tests/chopsticks/src/tests/xcm/initiateWithdrawAsset/config.ts @@ -0,0 +1,149 @@ +import { initialBalanceHDX, initialBalanceKILT, keysAlice, keysBob } from '../../../helper/utils.js' +import { tx, query } from '../../../helper/api.js' +import { mainChains } from '../../../network/index.js' + +import type { ApiPromise } from '@polkadot/api' +import type { BasicConfig, BasicXcmTestConfiguration, BasicTxContext } from '../../types.js' +import type { SubmittableExtrinsic } from '@polkadot/api/types' + +interface Config extends BasicConfig { + // The received balance can be different in each block due to dynamic fee calculation. + // Precision is used to compare the balances with a certain precision. + precision: bigint +} + +interface Query { + sender: ({ api }: { api: ApiPromise }, address: string) => Promise + receiver: ({ api }: { api: ApiPromise }, address: string) => Promise +} + +interface TxContext extends BasicTxContext { + balanceToTransfer: bigint + tx: ({ api }: { api: ApiPromise }, submitter: string, amount: string | number) => SubmittableExtrinsic<'promise'> +} + +/* + * Configuration for the WithdrawAssets test extends the BasicXcmTestConfiguration + **/ +interface WithdrawAssetTestConfiguration extends BasicXcmTestConfiguration { + config: Config + query: Query + txContext: TxContext +} +// Test pairs for WithdrawAssets +export const testPairsWithdrawAssets: WithdrawAssetTestConfiguration[] = [ + { + config: { + desc: 'Hydration -> KILT live', + precision: 96n, + network: { + relay: { option: mainChains.polkadot.getConfig({}), storage: {}, setUpTx: [] }, + // sender, receiver + parachains: [ + { + option: mainChains.hydration.getConfig({}), + storage: { + ...mainChains.hydration.storage.assignKiltTokensToAccounts( + [keysAlice.address], + initialBalanceKILT + ), + ...mainChains.hydration.storage.assignNativeTokensToAccounts( + [keysAlice.address], + initialBalanceHDX + ), + }, + setUpTx: [], + }, + + { + option: mainChains.kilt.getConfig({}), + storage: {}, + setUpTx: [], + }, + ], + }, + }, + + accounts: { + senderAccount: keysAlice, + receiverAccount: keysBob, + }, + query: { + sender: query.tokens(mainChains.hydration.chainInfo.kiltTokenId), + receiver: query.balances, + }, + txContext: { + tx: tx.xtokens.transfer( + mainChains.hydration.chainInfo.kiltTokenId, + tx.xtokens.parachainV3(mainChains.kilt.chainInfo.paraId) + ), + pallets: { + sender: [], + receiver: [{ section: 'system', method: 'NewAccount' }], + }, + balanceToTransfer: BigInt(1e15), + }, + + sovereignAccount: { + sender: mainChains.kilt.chainInfo.sovereignAccountOnSiblingChains, + receiver: mainChains.hydration.chainInfo.sovereignAccountOnSiblingChains, + }, + }, + { + config: { + desc: 'Hydration -> KILT DEV', + precision: 96n, + network: { + relay: { option: mainChains.polkadot.getConfig({}), storage: {}, setUpTx: [] }, + // sender, receiver + parachains: [ + { + option: mainChains.hydration.getConfig({}), + storage: { + ...mainChains.hydration.storage.assignKiltTokensToAccounts( + [keysAlice.address], + initialBalanceKILT + ), + ...mainChains.hydration.storage.assignNativeTokensToAccounts( + [keysAlice.address], + initialBalanceHDX + ), + }, + setUpTx: [], + }, + + { + option: mainChains.kilt.getConfig(mainChains.kilt.parameters), + storage: {}, + setUpTx: [], + }, + ], + }, + }, + + accounts: { + senderAccount: keysAlice, + receiverAccount: keysBob, + }, + query: { + sender: query.tokens(mainChains.hydration.chainInfo.kiltTokenId), + receiver: query.balances, + }, + txContext: { + tx: tx.xtokens.transfer( + mainChains.hydration.chainInfo.kiltTokenId, + tx.xtokens.parachainV3(mainChains.kilt.chainInfo.paraId) + ), + pallets: { + sender: [], + receiver: [{ section: 'system', method: 'NewAccount' }], + }, + balanceToTransfer: BigInt(1e15), + }, + + sovereignAccount: { + sender: mainChains.kilt.chainInfo.sovereignAccountOnSiblingChains, + receiver: mainChains.hydration.chainInfo.sovereignAccountOnSiblingChains, + }, + }, +] as const diff --git a/integration-tests/chopsticks/src/tests/xcm/initiateWithdrawAsset/index.test.ts b/integration-tests/chopsticks/src/tests/xcm/initiateWithdrawAsset/index.test.ts new file mode 100644 index 0000000000..45bfa47fbd --- /dev/null +++ b/integration-tests/chopsticks/src/tests/xcm/initiateWithdrawAsset/index.test.ts @@ -0,0 +1,118 @@ +import { describe, beforeEach, it, afterEach } from 'vitest' +import { sendTransaction, withExpect } from '@acala-network/chopsticks-testing' +import type { KeyringPair } from '@polkadot/keyring/types' + +import { createBlock } from '../../../network/utils.js' +import { hexAddress, validateBalanceWithPrecision } from '../../../helper/utils.js' +import { testPairsWithdrawAssets } from './config.js' +import { Config } from '../../../network/types.js' +import { spinUpNetwork, tearDownNetwork } from '../../utils.js' + +describe.each(testPairsWithdrawAssets)( + 'Withdraw Asset', + + ({ accounts, query, sovereignAccount, txContext, config }) => { + let senderContext: Config + let receiverContext: Config + let relayContext: Config + let senderAccount: KeyringPair + let receiverAccount: KeyringPair + const { desc, precision } = config + + // Create the network context + beforeEach(async () => { + const { parachainContexts, relayChainContext } = await spinUpNetwork(config) + + relayContext = relayChainContext + senderContext = parachainContexts[0] + receiverContext = parachainContexts[1] + + const { senderAccount: a, receiverAccount: b } = accounts + senderAccount = a + receiverAccount = b + }) + + // Shut down the network + afterEach(async () => await tearDownNetwork([receiverContext, senderContext, relayContext])) + + it(desc, async ({ expect }) => { + const { checkEvents, checkSystemEvents } = withExpect(expect) + const { pallets, tx, balanceToTransfer } = txContext + + // precondition checks + // Balance of the sovereign account before the transfer + const senderSovereignAccountBalanceBeforeTransfer = await query.receiver( + receiverContext, + sovereignAccount.receiver + ) + + const balanceSenderBeforeTransfer = await query.sender(senderContext, senderAccount.address) + const initialBalanceReceiver = await query.receiver(receiverContext, receiverAccount.address) + // Check initial balance receiver should be zero + expect(initialBalanceReceiver).toBe(0n) + + // action + const signedTx = tx( + senderContext, + hexAddress(receiverAccount.address), + balanceToTransfer.toString() + ).signAsync(senderAccount) + + const events = await sendTransaction(signedTx) + + // check sender state + await createBlock(senderContext) + + // post condition checks + + Promise.all( + pallets.sender.map((pallet) => + checkEvents(events, pallet) + .redact({ number: 1 }) + .toMatchSnapshot(`sender events ${JSON.stringify(pallet)}`) + ) + ) + + const balanceSenderAfterTransfer = await query.sender(senderContext, senderAccount.address) + const removedBalance = -balanceToTransfer + + validateBalanceWithPrecision( + balanceSenderBeforeTransfer, + balanceSenderAfterTransfer, + removedBalance, + expect, + precision + ) + + // check receiver state + await createBlock(receiverContext) + + const senderSovereignAccountBalanceAfterTransfer = await query.receiver( + receiverContext, + sovereignAccount.receiver + ) + + expect(senderSovereignAccountBalanceAfterTransfer).toBe( + senderSovereignAccountBalanceBeforeTransfer - balanceToTransfer + ) + + await Promise.all( + pallets.receiver.map((pallet) => + checkSystemEvents(receiverContext, pallet) + .redact({ number: 1 }) + .toMatchSnapshot(`receiver events ${JSON.stringify(pallet)}`) + ) + ) + + const balanceReceiverAfterTransfer = await query.receiver(receiverContext, receiverAccount.address) + + validateBalanceWithPrecision( + initialBalanceReceiver, + balanceReceiverAfterTransfer, + balanceToTransfer, + expect, + precision + ) + }) + } +) diff --git a/integration-tests/chopsticks/src/tests/xcm/limitedReserveTransfer/config.ts b/integration-tests/chopsticks/src/tests/xcm/limitedReserveTransfer/config.ts new file mode 100644 index 0000000000..290632653a --- /dev/null +++ b/integration-tests/chopsticks/src/tests/xcm/limitedReserveTransfer/config.ts @@ -0,0 +1,223 @@ +import { initialBalanceKILT, keysAlice, keysBob } from '../../../helper/utils.js' +import { mainChains } from '../../../network/index.js' +import { tx, query } from '../../../helper/api.js' + +import type { ApiPromise } from '@polkadot/api' +import type { BasicConfig, BasicXcmTestConfiguration, BasicTxContext } from '../../types.js' +import type { SubmittableExtrinsic } from '@polkadot/api/types' + +interface Config extends BasicConfig { + // The received balance can be different in each block due to dynamic fee calculation. + // Precision is used to compare the balances with a certain precision. + precision: bigint +} + +interface Query { + sender: ({ api }: { api: ApiPromise }, address: string) => Promise + receiver: ({ api }: { api: ApiPromise }, address: string) => Promise +} + +interface TxContext extends BasicTxContext { + balanceToTransfer: bigint + tx: ({ api }: { api: ApiPromise }, submitter: string, amount: string | number) => SubmittableExtrinsic<'promise'> +} + +/* + * Configuration for the LimitedReserveTransfer test extends the BasicXcmTestConfiguration + **/ +interface LimitedReserveTestConfiguration extends BasicXcmTestConfiguration { + config: Config + query: Query + txContext: TxContext +} + +// Test pairs for limited reserve transfers +export const testPairsLimitedReserveTransfers: LimitedReserveTestConfiguration[] = [ + { + config: { + desc: 'Kilt -> Hydration live V2', + precision: 96n, + network: { + // sender, receiver + parachains: [ + { + option: mainChains.kilt.getConfig({}), + storage: mainChains.kilt.storage.assignNativeTokensToAccounts( + [keysAlice.address], + initialBalanceKILT + ), + setUpTx: [], + }, + { option: mainChains.hydration.getConfig({}), setUpTx: [], storage: {} }, + ], + relay: { option: mainChains.polkadot.getConfig({}), storage: {}, setUpTx: [] }, + }, + }, + + accounts: { + senderAccount: keysAlice, + receiverAccount: keysBob, + }, + query: { + sender: query.balances, + receiver: query.tokens(mainChains.hydration.chainInfo.kiltTokenId), + }, + txContext: { + tx: tx.xcmPallet.limitedReserveTransferAssetsV2( + mainChains.kilt.chainInfo.KILT, + tx.xcmPallet.parachainV2(1, mainChains.hydration.chainInfo.paraId) + ), + pallets: { + sender: [], + receiver: [], + }, + balanceToTransfer: BigInt(1e15), + }, + + sovereignAccount: { + sender: mainChains.hydration.chainInfo.sovereignAccountOnSiblingChains, + receiver: mainChains.kilt.chainInfo.sovereignAccountOnSiblingChains, + }, + }, + + { + config: { + desc: 'Kilt -> Hydration live V3', + precision: 96n, + network: { + // sender, receiver + parachains: [ + { + option: mainChains.kilt.getConfig({}), + storage: mainChains.kilt.storage.assignNativeTokensToAccounts( + [keysAlice.address], + initialBalanceKILT + ), + setUpTx: [], + }, + { option: mainChains.hydration.getConfig({}), setUpTx: [], storage: {} }, + ], + relay: { option: mainChains.polkadot.getConfig({}), storage: {}, setUpTx: [] }, + }, + }, + + accounts: { + senderAccount: keysAlice, + receiverAccount: keysBob, + }, + query: { + sender: query.balances, + receiver: query.tokens(mainChains.hydration.chainInfo.kiltTokenId), + }, + txContext: { + tx: tx.xcmPallet.limitedReserveTransferAssetsV3( + mainChains.kilt.chainInfo.KILT, + tx.xcmPallet.parachainV3(1, mainChains.hydration.chainInfo.paraId) + ), + pallets: { + sender: [], + receiver: [], + }, + balanceToTransfer: BigInt(1e15), + }, + + sovereignAccount: { + sender: mainChains.hydration.chainInfo.sovereignAccountOnSiblingChains, + receiver: mainChains.kilt.chainInfo.sovereignAccountOnSiblingChains, + }, + }, + + { + config: { + desc: 'Kilt DEV -> Hydration live v3', + precision: 96n, + network: { + // sender, receiver + parachains: [ + { + option: mainChains.kilt.getConfig({}), + storage: mainChains.kilt.storage.assignNativeTokensToAccounts( + [keysAlice.address], + initialBalanceKILT + ), + setUpTx: [], + }, + { option: mainChains.hydration.getConfig({}), setUpTx: [], storage: {} }, + ], + relay: { option: mainChains.polkadot.getConfig({}), storage: {}, setUpTx: [] }, + }, + }, + + accounts: { + senderAccount: keysAlice, + receiverAccount: keysBob, + }, + query: { + sender: query.balances, + receiver: query.tokens(mainChains.hydration.chainInfo.kiltTokenId), + }, + txContext: { + tx: tx.xcmPallet.limitedReserveTransferAssetsV3( + mainChains.kilt.chainInfo.KILT, + tx.xcmPallet.parachainV3(1, mainChains.hydration.chainInfo.paraId) + ), + pallets: { + sender: [], + receiver: [], + }, + balanceToTransfer: BigInt(1e15), + }, + + sovereignAccount: { + sender: mainChains.hydration.chainInfo.sovereignAccountOnSiblingChains, + receiver: mainChains.kilt.chainInfo.sovereignAccountOnSiblingChains, + }, + }, + + { + config: { + desc: 'Kilt DEV -> Hydration live v2', + precision: 96n, + network: { + // sender, receiver + parachains: [ + { + option: mainChains.kilt.getConfig({}), + storage: mainChains.kilt.storage.assignNativeTokensToAccounts( + [keysAlice.address], + initialBalanceKILT + ), + setUpTx: [], + }, + { option: mainChains.hydration.getConfig({}), setUpTx: [], storage: {} }, + ], + relay: { option: mainChains.polkadot.getConfig({}), storage: {}, setUpTx: [] }, + }, + }, + + accounts: { + senderAccount: keysAlice, + receiverAccount: keysBob, + }, + query: { + sender: query.balances, + receiver: query.tokens(mainChains.hydration.chainInfo.kiltTokenId), + }, + txContext: { + tx: tx.xcmPallet.limitedReserveTransferAssetsV2( + mainChains.kilt.chainInfo.KILT, + tx.xcmPallet.parachainV2(1, mainChains.hydration.chainInfo.paraId) + ), + pallets: { + sender: [], + receiver: [], + }, + balanceToTransfer: BigInt(1e15), + }, + + sovereignAccount: { + sender: mainChains.hydration.chainInfo.sovereignAccountOnSiblingChains, + receiver: mainChains.kilt.chainInfo.sovereignAccountOnSiblingChains, + }, + }, +] as const diff --git a/integration-tests/chopsticks/src/tests/xcm/limitedReserveTransfer/index.test.ts b/integration-tests/chopsticks/src/tests/xcm/limitedReserveTransfer/index.test.ts new file mode 100644 index 0000000000..6f3895097c --- /dev/null +++ b/integration-tests/chopsticks/src/tests/xcm/limitedReserveTransfer/index.test.ts @@ -0,0 +1,115 @@ +import { describe, beforeEach, it, afterEach } from 'vitest' +import type { KeyringPair } from '@polkadot/keyring/types' +import { sendTransaction, withExpect } from '@acala-network/chopsticks-testing' + +import { createBlock } from '../../../network/utils.js' +import { validateBalanceWithPrecision, hexAddress } from '../../../helper/utils.js' +import { testPairsLimitedReserveTransfers } from './config.js' +import { Config } from '../../../network/types.js' +import { spinUpNetwork, tearDownNetwork } from '../../utils.js' + +describe.each(testPairsLimitedReserveTransfers)( + 'Limited Reserve Transfers', + ({ accounts, query, sovereignAccount, txContext, config }) => { + let senderContext: Config + let receiverContext: Config + let relayContext: Config + let senderAccount: KeyringPair + let receiverAccount: KeyringPair + const { desc, precision } = config + + beforeEach(async () => { + const { parachainContexts, relayChainContext } = await spinUpNetwork(config) + relayContext = relayChainContext + senderContext = parachainContexts[0] + receiverContext = parachainContexts[1] + const { senderAccount: a, receiverAccount: b } = accounts + senderAccount = a + receiverAccount = b + }) + + // Shut down the network + afterEach(async () => await tearDownNetwork([receiverContext, senderContext, relayContext])) + + it(desc, async ({ expect }) => { + const { checkEvents, checkSystemEvents } = withExpect(expect) + const { pallets, tx, balanceToTransfer } = txContext + + // precondition checks + + // Balance of the sovereign account before the transfer + const receiverSovereignAccountBalanceBeforeTransfer = await query.sender( + senderContext, + sovereignAccount.sender + ) + + const initialBalanceSender = await query.sender(senderContext, senderAccount.address) + const initialBalanceReceiver = await query.receiver(receiverContext, receiverAccount.address) + + // Check initial balance receiver should be zero + expect(initialBalanceReceiver).toBe(0n) + + // action + const signedTx = tx( + senderContext, + hexAddress(receiverAccount.address), + balanceToTransfer.toString() + ).signAsync(senderAccount) + + const events = await sendTransaction(signedTx) + + // check sender state + await createBlock(senderContext) + + // post condition checks + + await Promise.all( + pallets.sender.map((pallet) => + checkEvents(events, pallet) + .redact({ number: 1 }) + .toMatchSnapshot(`sender events ${JSON.stringify(pallet)}`) + ) + ) + + const balanceSenderAfterTransfer = await query.sender(senderContext, senderAccount.address) + const receiverSovereignAccountBalanceAfterTransfer = await query.sender( + senderContext, + sovereignAccount.sender + ) + expect(receiverSovereignAccountBalanceAfterTransfer).toBe( + receiverSovereignAccountBalanceBeforeTransfer + balanceToTransfer + ) + + const removedBalance = -balanceToTransfer + + validateBalanceWithPrecision( + initialBalanceSender, + balanceSenderAfterTransfer, + removedBalance, + expect, + precision + ) + + // check receiver state + await createBlock(receiverContext) + + await Promise.all( + pallets.receiver.map((pallet) => + checkSystemEvents(receiverContext, pallet) + .redact({ number: 1 }) + .toMatchSnapshot(`receiver events ${JSON.stringify(pallet)}`) + ) + ) + + const balanceReceiverAfterTransfer = await query.receiver(receiverContext, receiverAccount.address) + + validateBalanceWithPrecision( + initialBalanceReceiver, + balanceReceiverAfterTransfer, + balanceToTransfer, + expect, + precision + ) + }) + } +) diff --git a/integration-tests/chopsticks/src/types.ts b/integration-tests/chopsticks/src/types.ts deleted file mode 100644 index 99274a644c..0000000000 --- a/integration-tests/chopsticks/src/types.ts +++ /dev/null @@ -1,5 +0,0 @@ -export interface AssetSwitchSupplyParameters { - circulatingSupply: bigint - sovereignSupply: bigint - totalSupply: bigint -} diff --git a/integration-tests/chopsticks/src/utils.ts b/integration-tests/chopsticks/src/utils.ts deleted file mode 100644 index deb7ba87e7..0000000000 --- a/integration-tests/chopsticks/src/utils.ts +++ /dev/null @@ -1,36 +0,0 @@ -import { Keyring } from '@polkadot/keyring' - -import { AssetSwitchSupplyParameters } from './types.js' - -const keyring = new Keyring({ type: 'ed25519', ss58Format: 38 }) - -export const keysAlice = keyring.addFromUri('//alice', undefined, 'ed25519') -export const keysBob = keyring.addFromUri('//bob', undefined, 'ed25519') -export const keysCharlie = keyring.addFromUri('//charlie', undefined, 'ed25519') - -export function toNumber(value: string | undefined): number | undefined { - if (value === undefined) { - return undefined - } - - return Number(value) -} - -export function getAssetSwitchParameters( - totalSupply: bigint = BigInt('100000000000000000000'), - ratioCirculating: bigint = BigInt(10) -): AssetSwitchSupplyParameters { - const circulatingSupply = (totalSupply * ratioCirculating) / BigInt(100) - const sovereignSupply = totalSupply - circulatingSupply - return { circulatingSupply, sovereignSupply, totalSupply } -} - -export const KILT = BigInt(1e15) -export const DOT = BigInt(1e10) -export const HDX = BigInt(1e12) -export const ROC = BigInt(1e12) - -export const initialBalanceKILT = BigInt(100) * KILT -export const initialBalanceDOT = BigInt(100) * DOT -export const initialBalanceHDX = BigInt(100) * HDX -export const initialBalanceROC = BigInt(100) * ROC diff --git a/integration-tests/chopsticks/src/vitest.config.ts b/integration-tests/chopsticks/src/vitest.config.ts new file mode 100644 index 0000000000..dd7a0807b3 --- /dev/null +++ b/integration-tests/chopsticks/src/vitest.config.ts @@ -0,0 +1,14 @@ +import { defineConfig } from 'vite' + +export default defineConfig({ + test: { + maxWorkers: process.env.CI ? 4 : 10, + minWorkers: process.env.CI ? 1 : 5, + hideSkippedTests: true, + retry: process.env.CI ? 3 : 0, + setupFiles: './src/setup.ts', + hookTimeout: process.env.CI ? 120_000 : 40_000, + testTimeout: process.env.CI ? 60_000 : 20_000, + teardownTimeout: process.env.CI ? 60_000 : 10_000, + }, +}) diff --git a/integration-tests/chopsticks/tsconfig.json b/integration-tests/chopsticks/tsconfig.json index 564aeea5f9..0927e571d2 100644 --- a/integration-tests/chopsticks/tsconfig.json +++ b/integration-tests/chopsticks/tsconfig.json @@ -1,7 +1,7 @@ { "compilerOptions": { - "target": "es2016", - "lib": ["es2019"], + "target": "es2020", + "lib": ["es2020"], "module": "NodeNext", "rootDir": "src", "esModuleInterop": true, diff --git a/integration-tests/chopsticks/yarn.lock b/integration-tests/chopsticks/yarn.lock index e6eb16805e..1780e58286 100644 --- a/integration-tests/chopsticks/yarn.lock +++ b/integration-tests/chopsticks/yarn.lock @@ -2,352 +2,339 @@ # yarn lockfile v1 -"@aashutoshrathi/word-wrap@^1.2.3": - version "1.2.6" - resolved "https://registry.yarnpkg.com/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz#bd9154aec9983f77b3a034ecaa015c2e4201f6cf" - integrity sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA== - -"@acala-network/chopsticks-core@0.12.2": - version "0.12.2" - resolved "https://registry.yarnpkg.com/@acala-network/chopsticks-core/-/chopsticks-core-0.12.2.tgz#31f163eb328b0600eddc0925c83684c4262ddd74" - integrity sha512-OwiBPtCcwrDrvINX8YJPQ2LOMUKwdJeLq0dBxeXabgaDeQWZHfgTPlI6U0/VEbp+UnRIkxr+WESHJYI69wseDQ== - dependencies: - "@acala-network/chopsticks-executor" "0.12.2" - "@polkadot/rpc-provider" "^11.2.1" - "@polkadot/types" "^11.2.1" - "@polkadot/types-codec" "^11.2.1" - "@polkadot/types-known" "^11.2.1" - "@polkadot/util" "^12.6.2" - "@polkadot/util-crypto" "^12.6.2" +"@acala-network/chopsticks-core@1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@acala-network/chopsticks-core/-/chopsticks-core-1.0.1.tgz#96895e2c2554c01a2aa954ddee0ac9bfde0b92a8" + integrity sha512-7HE38P090PNWiRVRItVBCWt92K3bIz0S0v+0M21Hz8waTlWavilGgN6Jsua1ZndydRgZl0Y3/rLPgqVHzoNDzA== + dependencies: + "@acala-network/chopsticks-executor" "1.0.1" + "@polkadot/rpc-provider" "^14.0.1" + "@polkadot/types" "^14.0.1" + "@polkadot/types-codec" "^14.0.1" + "@polkadot/types-known" "^14.0.1" + "@polkadot/util" "^13.2.2" + "@polkadot/util-crypto" "^13.2.2" comlink "^4.4.1" eventemitter3 "^5.0.1" lodash "^4.17.21" - lru-cache "^10.2.0" - pino "^8.19.0" - pino-pretty "^11.0.0" + lru-cache "^11.0.1" + pino "^9.5.0" + pino-pretty "^11.3.0" rxjs "^7.8.1" - zod "^3.22.4" + zod "^3.23.8" -"@acala-network/chopsticks-db@0.12.2": - version "0.12.2" - resolved "https://registry.yarnpkg.com/@acala-network/chopsticks-db/-/chopsticks-db-0.12.2.tgz#b34217074a41267e199984ef27a9bbad256972e2" - integrity sha512-ViyFr9GcQpKqf0leJ/T4hJcatgjLbQOktytgBeIOu27TcTjhZjKPBBl+2cyREk6H9AQlO5fZjCQzwkqoNP1zyg== +"@acala-network/chopsticks-db@1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@acala-network/chopsticks-db/-/chopsticks-db-1.0.1.tgz#a8d976e4df05aa218d36fb1f9ea3f0cbe5e9fcc2" + integrity sha512-opkTTB8mjjaeo7NmBrCJr/g1e9o4CRZ0u3LJNAxHGsSC19Yp5t41caVBhgks6K9rhrm1C4GboQKA5aDYyUie8g== dependencies: - "@acala-network/chopsticks-core" "0.12.2" - "@polkadot/util" "^12.6.2" + "@acala-network/chopsticks-core" "1.0.1" + "@polkadot/util" "^13.2.2" idb "^8.0.0" sqlite3 "^5.1.7" typeorm "^0.3.20" -"@acala-network/chopsticks-executor@0.12.2": - version "0.12.2" - resolved "https://registry.yarnpkg.com/@acala-network/chopsticks-executor/-/chopsticks-executor-0.12.2.tgz#135cf0dd014906a181a2b93d53b6fd8073e4ff30" - integrity sha512-Xby/ixWCXj5lDtp/tPbnyMX//qnzbO/jLzna/zcBzprplE/l4UGd+VX8OTV2dXTBnaLIoLP1kPTLB0L7K0tI3Q== - dependencies: - "@polkadot/util" "^12.6.2" - "@polkadot/wasm-util" "^7.3.2" - -"@acala-network/chopsticks-testing@0.12.2": - version "0.12.2" - resolved "https://registry.yarnpkg.com/@acala-network/chopsticks-testing/-/chopsticks-testing-0.12.2.tgz#f3d02e53bf477da1b663092df0cc04c8ab8f62ac" - integrity sha512-S4ef/WuUbLN/FKLOoLRXsc0pNYtES9CU91fPGyJ7nYEb15Z/kcdy4JQI9QSwUGRkHX4U0SY6XkI232Hpi8ijAw== - dependencies: - "@acala-network/chopsticks-utils" "0.12.2" - "@polkadot/api" "^11.2.1" - "@polkadot/types" "^11.2.1" - -"@acala-network/chopsticks-utils@0.12.2": - version "0.12.2" - resolved "https://registry.yarnpkg.com/@acala-network/chopsticks-utils/-/chopsticks-utils-0.12.2.tgz#e3fe3c22677d1f1ab5d4a60b0d2742c1ee8e2204" - integrity sha512-hdmjYS+FEJ4sVnP72PYz3QM5qU53wiT+uiddqNX1QdC0xyStEm7KFzfIp/hfaWtqp3L1Sn3yJ9i3X7sjED1IzQ== - dependencies: - "@acala-network/chopsticks" "0.12.2" - "@polkadot/api" "^11.2.1" - "@polkadot/api-base" "^11.2.1" - "@polkadot/keyring" "^12.6.2" - "@polkadot/types" "^11.2.1" - "@polkadot/util" "^12.6.2" - -"@acala-network/chopsticks@0.12.2": - version "0.12.2" - resolved "https://registry.yarnpkg.com/@acala-network/chopsticks/-/chopsticks-0.12.2.tgz#0b11d6fbe8502ee9c6eb7901eea17686cf2157ee" - integrity sha512-/4D1CsBF8aKEy6DKMvdGAmE3+DzdNlXtg+Qc+W97Lyv/m68fv60HiOi0E5I3+jV4fq+VSuLKHGrMyJJh2/sRRg== - dependencies: - "@acala-network/chopsticks-core" "0.12.2" - "@acala-network/chopsticks-db" "0.12.2" - "@pnpm/npm-conf" "^2.2.2" - "@polkadot/api" "^11.2.1" - "@polkadot/api-augment" "^11.2.1" - "@polkadot/rpc-provider" "^11.2.1" - "@polkadot/types" "^11.2.1" - "@polkadot/util" "^12.6.2" - "@polkadot/util-crypto" "^12.6.2" - axios "^1.6.8" +"@acala-network/chopsticks-executor@1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@acala-network/chopsticks-executor/-/chopsticks-executor-1.0.1.tgz#c4586398520f40c23fd75b926eb2a1b361ea5ce2" + integrity sha512-aJjFhhG+KQU7C/VlJSRXzPQ4B+j0xJRtYk5oJUSY5Dxo6tnVRAEzQbxcB8dhBobDJH5Q/+5aQbyY0CLIUcACSg== + dependencies: + "@polkadot/util" "^13.2.2" + "@polkadot/wasm-util" "^7.4.1" + +"@acala-network/chopsticks-testing@1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@acala-network/chopsticks-testing/-/chopsticks-testing-1.0.1.tgz#fd8edd5046fc426e57766148455a9554213cc598" + integrity sha512-FiAKod/3yhlCTi7kxJpZt+gKVjpZm1mrg4/np3tNwNvSMxi9Achf3A1YyW2BAl5K5HxfJUcuGDedB14AFOPrsA== + dependencies: + "@acala-network/chopsticks-utils" "1.0.1" + "@polkadot/api" "^14.0.1" + "@polkadot/types" "^14.0.1" + +"@acala-network/chopsticks-utils@1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@acala-network/chopsticks-utils/-/chopsticks-utils-1.0.1.tgz#055060585f556a5b49547ae6f0f1a6d850b846a0" + integrity sha512-9LcEL3JH9bbROVtvx/kDArtSoA7vAKa/lrHE8FL+Wlto6r4YhpGyEILIjE9001PVFZXgSJVomwENZf/xz8k/Aw== + dependencies: + "@acala-network/chopsticks" "1.0.1" + "@acala-network/chopsticks-core" "1.0.1" + "@polkadot/api" "^14.0.1" + "@polkadot/api-base" "^14.0.1" + "@polkadot/keyring" "^13.2.2" + "@polkadot/types" "^14.0.1" + "@polkadot/util" "^13.2.2" + +"@acala-network/chopsticks@1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@acala-network/chopsticks/-/chopsticks-1.0.1.tgz#4ba785d05b22b5ee5b31e6141a0df3d760972c83" + integrity sha512-kY5BmOwF6/+VO2uh5NSdIb3qIoCKinZbKDiGCiITld0qQaBTnfHa8kmabaAvTmd/sNjHDW03v5cVXOxHm0668A== + dependencies: + "@acala-network/chopsticks-core" "1.0.1" + "@acala-network/chopsticks-db" "1.0.1" + "@pnpm/npm-conf" "^2.3.1" + "@polkadot/api" "^14.0.1" + "@polkadot/api-augment" "^14.0.1" + "@polkadot/rpc-provider" "^14.0.1" + "@polkadot/types" "^14.0.1" + "@polkadot/util" "^13.2.2" + "@polkadot/util-crypto" "^13.2.2" + axios "^1.7.7" comlink "^4.4.1" dotenv "^16.4.5" global-agent "^3.0.0" js-yaml "^4.1.0" jsondiffpatch "^0.5.0" lodash "^4.17.21" - ws "^8.16.0" + ws "^8.18.0" yargs "^17.7.2" - zod "^3.22.4" - -"@babel/runtime@^7.23.2": - version "7.24.4" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.24.4.tgz#de795accd698007a66ba44add6cc86542aff1edd" - integrity sha512-dkxf7+hn8mFBwKjs9bvBlArzLVxVbS8usaPUDd5p2a9JCL9tB8OaOVN1isD4+Xyk4ns89/xeOmbQvgdK7IIVdA== - dependencies: - regenerator-runtime "^0.14.0" - -"@cspotcode/source-map-support@^0.8.0": - version "0.8.1" - resolved "https://registry.yarnpkg.com/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz#00629c35a688e05a88b1cda684fb9d5e73f000a1" - integrity sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw== - dependencies: - "@jridgewell/trace-mapping" "0.3.9" - -"@esbuild/aix-ppc64@0.19.12": - version "0.19.12" - resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.19.12.tgz#d1bc06aedb6936b3b6d313bf809a5a40387d2b7f" - integrity sha512-bmoCYyWdEL3wDQIVbcyzRyeKLgk2WtWLTWz1ZIAZF/EGbNOwSA6ew3PftJ1PqMiOOGu0OyFMzG53L0zqIpPeNA== - -"@esbuild/aix-ppc64@0.20.2": - version "0.20.2" - resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.20.2.tgz#a70f4ac11c6a1dfc18b8bbb13284155d933b9537" - integrity sha512-D+EBOJHXdNZcLJRBkhENNG8Wji2kgc9AZ9KiPr1JuZjsNtyHzrsfLRrY0tk2H2aoFu6RANO1y1iPPUCDYWkb5g== - -"@esbuild/android-arm64@0.19.12": - version "0.19.12" - resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.19.12.tgz#7ad65a36cfdb7e0d429c353e00f680d737c2aed4" - integrity sha512-P0UVNGIienjZv3f5zq0DP3Nt2IE/3plFzuaS96vihvD0Hd6H/q4WXUGpCxD/E8YrSXfNyRPbpTq+T8ZQioSuPA== - -"@esbuild/android-arm64@0.20.2": - version "0.20.2" - resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.20.2.tgz#db1c9202a5bc92ea04c7b6840f1bbe09ebf9e6b9" - integrity sha512-mRzjLacRtl/tWU0SvD8lUEwb61yP9cqQo6noDZP/O8VkwafSYwZ4yWy24kan8jE/IMERpYncRt2dw438LP3Xmg== - -"@esbuild/android-arm@0.19.12": - version "0.19.12" - resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.19.12.tgz#b0c26536f37776162ca8bde25e42040c203f2824" - integrity sha512-qg/Lj1mu3CdQlDEEiWrlC4eaPZ1KztwGJ9B6J+/6G+/4ewxJg7gqj8eVYWvao1bXrqGiW2rsBZFSX3q2lcW05w== - -"@esbuild/android-arm@0.20.2": - version "0.20.2" - resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.20.2.tgz#3b488c49aee9d491c2c8f98a909b785870d6e995" - integrity sha512-t98Ra6pw2VaDhqNWO2Oph2LXbz/EJcnLmKLGBJwEwXX/JAN83Fym1rU8l0JUWK6HkIbWONCSSatf4sf2NBRx/w== - -"@esbuild/android-x64@0.19.12": - version "0.19.12" - resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.19.12.tgz#cb13e2211282012194d89bf3bfe7721273473b3d" - integrity sha512-3k7ZoUW6Q6YqhdhIaq/WZ7HwBpnFBlW905Fa4s4qWJyiNOgT1dOqDiVAQFwBH7gBRZr17gLrlFCRzF6jFh7Kew== - -"@esbuild/android-x64@0.20.2": - version "0.20.2" - resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.20.2.tgz#3b1628029e5576249d2b2d766696e50768449f98" - integrity sha512-btzExgV+/lMGDDa194CcUQm53ncxzeBrWJcncOBxuC6ndBkKxnHdFJn86mCIgTELsooUmwUm9FkhSp5HYu00Rg== - -"@esbuild/darwin-arm64@0.19.12": - version "0.19.12" - resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.19.12.tgz#cbee41e988020d4b516e9d9e44dd29200996275e" - integrity sha512-B6IeSgZgtEzGC42jsI+YYu9Z3HKRxp8ZT3cqhvliEHovq8HSX2YX8lNocDn79gCKJXOSaEot9MVYky7AKjCs8g== - -"@esbuild/darwin-arm64@0.20.2": - version "0.20.2" - resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.20.2.tgz#6e8517a045ddd86ae30c6608c8475ebc0c4000bb" - integrity sha512-4J6IRT+10J3aJH3l1yzEg9y3wkTDgDk7TSDFX+wKFiWjqWp/iCfLIYzGyasx9l0SAFPT1HwSCR+0w/h1ES/MjA== - -"@esbuild/darwin-x64@0.19.12": - version "0.19.12" - resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.19.12.tgz#e37d9633246d52aecf491ee916ece709f9d5f4cd" - integrity sha512-hKoVkKzFiToTgn+41qGhsUJXFlIjxI/jSYeZf3ugemDYZldIXIxhvwN6erJGlX4t5h417iFuheZ7l+YVn05N3A== - -"@esbuild/darwin-x64@0.20.2": - version "0.20.2" - resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.20.2.tgz#90ed098e1f9dd8a9381695b207e1cff45540a0d0" - integrity sha512-tBcXp9KNphnNH0dfhv8KYkZhjc+H3XBkF5DKtswJblV7KlT9EI2+jeA8DgBjp908WEuYll6pF+UStUCfEpdysA== - -"@esbuild/freebsd-arm64@0.19.12": - version "0.19.12" - resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.12.tgz#1ee4d8b682ed363b08af74d1ea2b2b4dbba76487" - integrity sha512-4aRvFIXmwAcDBw9AueDQ2YnGmz5L6obe5kmPT8Vd+/+x/JMVKCgdcRwH6APrbpNXsPz+K653Qg8HB/oXvXVukA== - -"@esbuild/freebsd-arm64@0.20.2": - version "0.20.2" - resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.20.2.tgz#d71502d1ee89a1130327e890364666c760a2a911" - integrity sha512-d3qI41G4SuLiCGCFGUrKsSeTXyWG6yem1KcGZVS+3FYlYhtNoNgYrWcvkOoaqMhwXSMrZRl69ArHsGJ9mYdbbw== - -"@esbuild/freebsd-x64@0.19.12": - version "0.19.12" - resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.19.12.tgz#37a693553d42ff77cd7126764b535fb6cc28a11c" - integrity sha512-EYoXZ4d8xtBoVN7CEwWY2IN4ho76xjYXqSXMNccFSx2lgqOG/1TBPW0yPx1bJZk94qu3tX0fycJeeQsKovA8gg== - -"@esbuild/freebsd-x64@0.20.2": - version "0.20.2" - resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.20.2.tgz#aa5ea58d9c1dd9af688b8b6f63ef0d3d60cea53c" - integrity sha512-d+DipyvHRuqEeM5zDivKV1KuXn9WeRX6vqSqIDgwIfPQtwMP4jaDsQsDncjTDDsExT4lR/91OLjRo8bmC1e+Cw== - -"@esbuild/linux-arm64@0.19.12": - version "0.19.12" - resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.19.12.tgz#be9b145985ec6c57470e0e051d887b09dddb2d4b" - integrity sha512-EoTjyYyLuVPfdPLsGVVVC8a0p1BFFvtpQDB/YLEhaXyf/5bczaGeN15QkR+O4S5LeJ92Tqotve7i1jn35qwvdA== - -"@esbuild/linux-arm64@0.20.2": - version "0.20.2" - resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.20.2.tgz#055b63725df678379b0f6db9d0fa85463755b2e5" - integrity sha512-9pb6rBjGvTFNira2FLIWqDk/uaf42sSyLE8j1rnUpuzsODBq7FvpwHYZxQ/It/8b+QOS1RYfqgGFNLRI+qlq2A== - -"@esbuild/linux-arm@0.19.12": - version "0.19.12" - resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.19.12.tgz#207ecd982a8db95f7b5279207d0ff2331acf5eef" - integrity sha512-J5jPms//KhSNv+LO1S1TX1UWp1ucM6N6XuL6ITdKWElCu8wXP72l9MM0zDTzzeikVyqFE6U8YAV9/tFyj0ti+w== - -"@esbuild/linux-arm@0.20.2": - version "0.20.2" - resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.20.2.tgz#76b3b98cb1f87936fbc37f073efabad49dcd889c" - integrity sha512-VhLPeR8HTMPccbuWWcEUD1Az68TqaTYyj6nfE4QByZIQEQVWBB8vup8PpR7y1QHL3CpcF6xd5WVBU/+SBEvGTg== - -"@esbuild/linux-ia32@0.19.12": - version "0.19.12" - resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.19.12.tgz#d0d86b5ca1562523dc284a6723293a52d5860601" - integrity sha512-Thsa42rrP1+UIGaWz47uydHSBOgTUnwBwNq59khgIwktK6x60Hivfbux9iNR0eHCHzOLjLMLfUMLCypBkZXMHA== - -"@esbuild/linux-ia32@0.20.2": - version "0.20.2" - resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.20.2.tgz#c0e5e787c285264e5dfc7a79f04b8b4eefdad7fa" - integrity sha512-o10utieEkNPFDZFQm9CoP7Tvb33UutoJqg3qKf1PWVeeJhJw0Q347PxMvBgVVFgouYLGIhFYG0UGdBumROyiig== - -"@esbuild/linux-loong64@0.19.12": - version "0.19.12" - resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.19.12.tgz#9a37f87fec4b8408e682b528391fa22afd952299" - integrity sha512-LiXdXA0s3IqRRjm6rV6XaWATScKAXjI4R4LoDlvO7+yQqFdlr1Bax62sRwkVvRIrwXxvtYEHHI4dm50jAXkuAA== - -"@esbuild/linux-loong64@0.20.2": - version "0.20.2" - resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.20.2.tgz#a6184e62bd7cdc63e0c0448b83801001653219c5" - integrity sha512-PR7sp6R/UC4CFVomVINKJ80pMFlfDfMQMYynX7t1tNTeivQ6XdX5r2XovMmha/VjR1YN/HgHWsVcTRIMkymrgQ== - -"@esbuild/linux-mips64el@0.19.12": - version "0.19.12" - resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.19.12.tgz#4ddebd4e6eeba20b509d8e74c8e30d8ace0b89ec" - integrity sha512-fEnAuj5VGTanfJ07ff0gOA6IPsvrVHLVb6Lyd1g2/ed67oU1eFzL0r9WL7ZzscD+/N6i3dWumGE1Un4f7Amf+w== - -"@esbuild/linux-mips64el@0.20.2": - version "0.20.2" - resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.20.2.tgz#d08e39ce86f45ef8fc88549d29c62b8acf5649aa" - integrity sha512-4BlTqeutE/KnOiTG5Y6Sb/Hw6hsBOZapOVF6njAESHInhlQAghVVZL1ZpIctBOoTFbQyGW+LsVYZ8lSSB3wkjA== - -"@esbuild/linux-ppc64@0.19.12": - version "0.19.12" - resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.19.12.tgz#adb67dadb73656849f63cd522f5ecb351dd8dee8" - integrity sha512-nYJA2/QPimDQOh1rKWedNOe3Gfc8PabU7HT3iXWtNUbRzXS9+vgB0Fjaqr//XNbd82mCxHzik2qotuI89cfixg== - -"@esbuild/linux-ppc64@0.20.2": - version "0.20.2" - resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.20.2.tgz#8d252f0b7756ffd6d1cbde5ea67ff8fd20437f20" - integrity sha512-rD3KsaDprDcfajSKdn25ooz5J5/fWBylaaXkuotBDGnMnDP1Uv5DLAN/45qfnf3JDYyJv/ytGHQaziHUdyzaAg== - -"@esbuild/linux-riscv64@0.19.12": - version "0.19.12" - resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.19.12.tgz#11bc0698bf0a2abf8727f1c7ace2112612c15adf" - integrity sha512-2MueBrlPQCw5dVJJpQdUYgeqIzDQgw3QtiAHUC4RBz9FXPrskyyU3VI1hw7C0BSKB9OduwSJ79FTCqtGMWqJHg== - -"@esbuild/linux-riscv64@0.20.2": - version "0.20.2" - resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.20.2.tgz#19f6dcdb14409dae607f66ca1181dd4e9db81300" - integrity sha512-snwmBKacKmwTMmhLlz/3aH1Q9T8v45bKYGE3j26TsaOVtjIag4wLfWSiZykXzXuE1kbCE+zJRmwp+ZbIHinnVg== - -"@esbuild/linux-s390x@0.19.12": - version "0.19.12" - resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.19.12.tgz#e86fb8ffba7c5c92ba91fc3b27ed5a70196c3cc8" - integrity sha512-+Pil1Nv3Umes4m3AZKqA2anfhJiVmNCYkPchwFJNEJN5QxmTs1uzyy4TvmDrCRNT2ApwSari7ZIgrPeUx4UZDg== - -"@esbuild/linux-s390x@0.20.2": - version "0.20.2" - resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.20.2.tgz#3c830c90f1a5d7dd1473d5595ea4ebb920988685" - integrity sha512-wcWISOobRWNm3cezm5HOZcYz1sKoHLd8VL1dl309DiixxVFoFe/o8HnwuIwn6sXre88Nwj+VwZUvJf4AFxkyrQ== - -"@esbuild/linux-x64@0.19.12": - version "0.19.12" - resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.19.12.tgz#5f37cfdc705aea687dfe5dfbec086a05acfe9c78" - integrity sha512-B71g1QpxfwBvNrfyJdVDexenDIt1CiDN1TIXLbhOw0KhJzE78KIFGX6OJ9MrtC0oOqMWf+0xop4qEU8JrJTwCg== - -"@esbuild/linux-x64@0.20.2": - version "0.20.2" - resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.20.2.tgz#86eca35203afc0d9de0694c64ec0ab0a378f6fff" - integrity sha512-1MdwI6OOTsfQfek8sLwgyjOXAu+wKhLEoaOLTjbijk6E2WONYpH9ZU2mNtR+lZ2B4uwr+usqGuVfFT9tMtGvGw== - -"@esbuild/netbsd-x64@0.19.12": - version "0.19.12" - resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.19.12.tgz#29da566a75324e0d0dd7e47519ba2f7ef168657b" - integrity sha512-3ltjQ7n1owJgFbuC61Oj++XhtzmymoCihNFgT84UAmJnxJfm4sYCiSLTXZtE00VWYpPMYc+ZQmB6xbSdVh0JWA== - -"@esbuild/netbsd-x64@0.20.2": - version "0.20.2" - resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.20.2.tgz#e771c8eb0e0f6e1877ffd4220036b98aed5915e6" - integrity sha512-K8/DhBxcVQkzYc43yJXDSyjlFeHQJBiowJ0uVL6Tor3jGQfSGHNNJcWxNbOI8v5k82prYqzPuwkzHt3J1T1iZQ== - -"@esbuild/openbsd-x64@0.19.12": - version "0.19.12" - resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.19.12.tgz#306c0acbdb5a99c95be98bdd1d47c916e7dc3ff0" - integrity sha512-RbrfTB9SWsr0kWmb9srfF+L933uMDdu9BIzdA7os2t0TXhCRjrQyCeOt6wVxr79CKD4c+p+YhCj31HBkYcXebw== - -"@esbuild/openbsd-x64@0.20.2": - version "0.20.2" - resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.20.2.tgz#9a795ae4b4e37e674f0f4d716f3e226dd7c39baf" - integrity sha512-eMpKlV0SThJmmJgiVyN9jTPJ2VBPquf6Kt/nAoo6DgHAoN57K15ZghiHaMvqjCye/uU4X5u3YSMgVBI1h3vKrQ== - -"@esbuild/sunos-x64@0.19.12": - version "0.19.12" - resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.19.12.tgz#0933eaab9af8b9b2c930236f62aae3fc593faf30" - integrity sha512-HKjJwRrW8uWtCQnQOz9qcU3mUZhTUQvi56Q8DPTLLB+DawoiQdjsYq+j+D3s9I8VFtDr+F9CjgXKKC4ss89IeA== - -"@esbuild/sunos-x64@0.20.2": - version "0.20.2" - resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.20.2.tgz#7df23b61a497b8ac189def6e25a95673caedb03f" - integrity sha512-2UyFtRC6cXLyejf/YEld4Hajo7UHILetzE1vsRcGL3earZEW77JxrFjH4Ez2qaTiEfMgAXxfAZCm1fvM/G/o8w== - -"@esbuild/win32-arm64@0.19.12": - version "0.19.12" - resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.19.12.tgz#773bdbaa1971b36db2f6560088639ccd1e6773ae" - integrity sha512-URgtR1dJnmGvX864pn1B2YUYNzjmXkuJOIqG2HdU62MVS4EHpU2946OZoTMnRUHklGtJdJZ33QfzdjGACXhn1A== - -"@esbuild/win32-arm64@0.20.2": - version "0.20.2" - resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.20.2.tgz#f1ae5abf9ca052ae11c1bc806fb4c0f519bacf90" - integrity sha512-GRibxoawM9ZCnDxnP3usoUDO9vUkpAxIIZ6GQI+IlVmr5kP3zUq+l17xELTHMWTWzjxa2guPNyrpq1GWmPvcGQ== - -"@esbuild/win32-ia32@0.19.12": - version "0.19.12" - resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.19.12.tgz#000516cad06354cc84a73f0943a4aa690ef6fd67" - integrity sha512-+ZOE6pUkMOJfmxmBZElNOx72NKpIa/HFOMGzu8fqzQJ5kgf6aTGrcJaFsNiVMH4JKpMipyK+7k0n2UXN7a8YKQ== - -"@esbuild/win32-ia32@0.20.2": - version "0.20.2" - resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.20.2.tgz#241fe62c34d8e8461cd708277813e1d0ba55ce23" - integrity sha512-HfLOfn9YWmkSKRQqovpnITazdtquEW8/SoHW7pWpuEeguaZI4QnCRW6b+oZTztdBnZOS2hqJ6im/D5cPzBTTlQ== - -"@esbuild/win32-x64@0.19.12": - version "0.19.12" - resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.19.12.tgz#c57c8afbb4054a3ab8317591a0b7320360b444ae" - integrity sha512-T1QyPSDCyMXaO3pzBkF96E8xMkiRYbUEZADd29SyPGabqxMViNoii+NcK7eWJAEoU6RZyEm5lVSIjTmcdoB9HA== - -"@esbuild/win32-x64@0.20.2": - version "0.20.2" - resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.20.2.tgz#9c907b21e30a52db959ba4f80bb01a0cc403d5cc" - integrity sha512-N49X4lJX27+l9jbLKSqZ6bKNjzQvHaT8IIFUy+YIqmXQdjYCToGWwOItDrfby14c78aDd5NHQl29xingXfCdLQ== + zod "^3.23.8" + +"@esbuild/aix-ppc64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz#c7184a326533fcdf1b8ee0733e21c713b975575f" + integrity sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ== + +"@esbuild/aix-ppc64@0.23.1": + version "0.23.1" + resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.23.1.tgz#51299374de171dbd80bb7d838e1cfce9af36f353" + integrity sha512-6VhYk1diRqrhBAqpJEdjASR/+WVRtfjpqKuNw11cLiaWpAT/Uu+nokB+UJnevzy/P9C/ty6AOe0dwueMrGh/iQ== + +"@esbuild/android-arm64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz#09d9b4357780da9ea3a7dfb833a1f1ff439b4052" + integrity sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A== + +"@esbuild/android-arm64@0.23.1": + version "0.23.1" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.23.1.tgz#58565291a1fe548638adb9c584237449e5e14018" + integrity sha512-xw50ipykXcLstLeWH7WRdQuysJqejuAGPd30vd1i5zSyKK3WE+ijzHmLKxdiCMtH1pHz78rOg0BKSYOSB/2Khw== + +"@esbuild/android-arm@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.21.5.tgz#9b04384fb771926dfa6d7ad04324ecb2ab9b2e28" + integrity sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg== + +"@esbuild/android-arm@0.23.1": + version "0.23.1" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.23.1.tgz#5eb8c652d4c82a2421e3395b808e6d9c42c862ee" + integrity sha512-uz6/tEy2IFm9RYOyvKl88zdzZfwEfKZmnX9Cj1BHjeSGNuGLuMD1kR8y5bteYmwqKm1tj8m4cb/aKEorr6fHWQ== + +"@esbuild/android-x64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.21.5.tgz#29918ec2db754cedcb6c1b04de8cd6547af6461e" + integrity sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA== + +"@esbuild/android-x64@0.23.1": + version "0.23.1" + resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.23.1.tgz#ae19d665d2f06f0f48a6ac9a224b3f672e65d517" + integrity sha512-nlN9B69St9BwUoB+jkyU090bru8L0NA3yFvAd7k8dNsVH8bi9a8cUAUSEcEEgTp2z3dbEDGJGfP6VUnkQnlReg== + +"@esbuild/darwin-arm64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz#e495b539660e51690f3928af50a76fb0a6ccff2a" + integrity sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ== + +"@esbuild/darwin-arm64@0.23.1": + version "0.23.1" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.23.1.tgz#05b17f91a87e557b468a9c75e9d85ab10c121b16" + integrity sha512-YsS2e3Wtgnw7Wq53XXBLcV6JhRsEq8hkfg91ESVadIrzr9wO6jJDMZnCQbHm1Guc5t/CdDiFSSfWP58FNuvT3Q== + +"@esbuild/darwin-x64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz#c13838fa57372839abdddc91d71542ceea2e1e22" + integrity sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw== + +"@esbuild/darwin-x64@0.23.1": + version "0.23.1" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.23.1.tgz#c58353b982f4e04f0d022284b8ba2733f5ff0931" + integrity sha512-aClqdgTDVPSEGgoCS8QDG37Gu8yc9lTHNAQlsztQ6ENetKEO//b8y31MMu2ZaPbn4kVsIABzVLXYLhCGekGDqw== + +"@esbuild/freebsd-arm64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz#646b989aa20bf89fd071dd5dbfad69a3542e550e" + integrity sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g== + +"@esbuild/freebsd-arm64@0.23.1": + version "0.23.1" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.23.1.tgz#f9220dc65f80f03635e1ef96cfad5da1f446f3bc" + integrity sha512-h1k6yS8/pN/NHlMl5+v4XPfikhJulk4G+tKGFIOwURBSFzE8bixw1ebjluLOjfwtLqY0kewfjLSrO6tN2MgIhA== + +"@esbuild/freebsd-x64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz#aa615cfc80af954d3458906e38ca22c18cf5c261" + integrity sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ== + +"@esbuild/freebsd-x64@0.23.1": + version "0.23.1" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.23.1.tgz#69bd8511fa013b59f0226d1609ac43f7ce489730" + integrity sha512-lK1eJeyk1ZX8UklqFd/3A60UuZ/6UVfGT2LuGo3Wp4/z7eRTRYY+0xOu2kpClP+vMTi9wKOfXi2vjUpO1Ro76g== + +"@esbuild/linux-arm64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz#70ac6fa14f5cb7e1f7f887bcffb680ad09922b5b" + integrity sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q== + +"@esbuild/linux-arm64@0.23.1": + version "0.23.1" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.23.1.tgz#8050af6d51ddb388c75653ef9871f5ccd8f12383" + integrity sha512-/93bf2yxencYDnItMYV/v116zff6UyTjo4EtEQjUBeGiVpMmffDNUyD9UN2zV+V3LRV3/on4xdZ26NKzn6754g== + +"@esbuild/linux-arm@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz#fc6fd11a8aca56c1f6f3894f2bea0479f8f626b9" + integrity sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA== + +"@esbuild/linux-arm@0.23.1": + version "0.23.1" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.23.1.tgz#ecaabd1c23b701070484990db9a82f382f99e771" + integrity sha512-CXXkzgn+dXAPs3WBwE+Kvnrf4WECwBdfjfeYHpMeVxWE0EceB6vhWGShs6wi0IYEqMSIzdOF1XjQ/Mkm5d7ZdQ== + +"@esbuild/linux-ia32@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz#3271f53b3f93e3d093d518d1649d6d68d346ede2" + integrity sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg== + +"@esbuild/linux-ia32@0.23.1": + version "0.23.1" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.23.1.tgz#3ed2273214178109741c09bd0687098a0243b333" + integrity sha512-VTN4EuOHwXEkXzX5nTvVY4s7E/Krz7COC8xkftbbKRYAl96vPiUssGkeMELQMOnLOJ8k3BY1+ZY52tttZnHcXQ== + +"@esbuild/linux-loong64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz#ed62e04238c57026aea831c5a130b73c0f9f26df" + integrity sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg== + +"@esbuild/linux-loong64@0.23.1": + version "0.23.1" + resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.23.1.tgz#a0fdf440b5485c81b0fbb316b08933d217f5d3ac" + integrity sha512-Vx09LzEoBa5zDnieH8LSMRToj7ir/Jeq0Gu6qJ/1GcBq9GkfoEAoXvLiW1U9J1qE/Y/Oyaq33w5p2ZWrNNHNEw== + +"@esbuild/linux-mips64el@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz#e79b8eb48bf3b106fadec1ac8240fb97b4e64cbe" + integrity sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg== + +"@esbuild/linux-mips64el@0.23.1": + version "0.23.1" + resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.23.1.tgz#e11a2806346db8375b18f5e104c5a9d4e81807f6" + integrity sha512-nrFzzMQ7W4WRLNUOU5dlWAqa6yVeI0P78WKGUo7lg2HShq/yx+UYkeNSE0SSfSure0SqgnsxPvmAUu/vu0E+3Q== + +"@esbuild/linux-ppc64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz#5f2203860a143b9919d383ef7573521fb154c3e4" + integrity sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w== + +"@esbuild/linux-ppc64@0.23.1": + version "0.23.1" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.23.1.tgz#06a2744c5eaf562b1a90937855b4d6cf7c75ec96" + integrity sha512-dKN8fgVqd0vUIjxuJI6P/9SSSe/mB9rvA98CSH2sJnlZ/OCZWO1DJvxj8jvKTfYUdGfcq2dDxoKaC6bHuTlgcw== + +"@esbuild/linux-riscv64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz#07bcafd99322d5af62f618cb9e6a9b7f4bb825dc" + integrity sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA== + +"@esbuild/linux-riscv64@0.23.1": + version "0.23.1" + resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.23.1.tgz#65b46a2892fc0d1af4ba342af3fe0fa4a8fe08e7" + integrity sha512-5AV4Pzp80fhHL83JM6LoA6pTQVWgB1HovMBsLQ9OZWLDqVY8MVobBXNSmAJi//Csh6tcY7e7Lny2Hg1tElMjIA== + +"@esbuild/linux-s390x@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz#b7ccf686751d6a3e44b8627ababc8be3ef62d8de" + integrity sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A== + +"@esbuild/linux-s390x@0.23.1": + version "0.23.1" + resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.23.1.tgz#e71ea18c70c3f604e241d16e4e5ab193a9785d6f" + integrity sha512-9ygs73tuFCe6f6m/Tb+9LtYxWR4c9yg7zjt2cYkjDbDpV/xVn+68cQxMXCjUpYwEkze2RcU/rMnfIXNRFmSoDw== + +"@esbuild/linux-x64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz#6d8f0c768e070e64309af8004bb94e68ab2bb3b0" + integrity sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ== + +"@esbuild/linux-x64@0.23.1": + version "0.23.1" + resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.23.1.tgz#d47f97391e80690d4dfe811a2e7d6927ad9eed24" + integrity sha512-EV6+ovTsEXCPAp58g2dD68LxoP/wK5pRvgy0J/HxPGB009omFPv3Yet0HiaqvrIrgPTBuC6wCH1LTOY91EO5hQ== + +"@esbuild/netbsd-x64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz#bbe430f60d378ecb88decb219c602667387a6047" + integrity sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg== + +"@esbuild/netbsd-x64@0.23.1": + version "0.23.1" + resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.23.1.tgz#44e743c9778d57a8ace4b72f3c6b839a3b74a653" + integrity sha512-aevEkCNu7KlPRpYLjwmdcuNz6bDFiE7Z8XC4CPqExjTvrHugh28QzUXVOZtiYghciKUacNktqxdpymplil1beA== + +"@esbuild/openbsd-arm64@0.23.1": + version "0.23.1" + resolved "https://registry.yarnpkg.com/@esbuild/openbsd-arm64/-/openbsd-arm64-0.23.1.tgz#05c5a1faf67b9881834758c69f3e51b7dee015d7" + integrity sha512-3x37szhLexNA4bXhLrCC/LImN/YtWis6WXr1VESlfVtVeoFJBRINPJ3f0a/6LV8zpikqoUg4hyXw0sFBt5Cr+Q== + +"@esbuild/openbsd-x64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz#99d1cf2937279560d2104821f5ccce220cb2af70" + integrity sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow== + +"@esbuild/openbsd-x64@0.23.1": + version "0.23.1" + resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.23.1.tgz#2e58ae511bacf67d19f9f2dcd9e8c5a93f00c273" + integrity sha512-aY2gMmKmPhxfU+0EdnN+XNtGbjfQgwZj43k8G3fyrDM/UdZww6xrWxmDkuz2eCZchqVeABjV5BpildOrUbBTqA== + +"@esbuild/sunos-x64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz#08741512c10d529566baba837b4fe052c8f3487b" + integrity sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg== + +"@esbuild/sunos-x64@0.23.1": + version "0.23.1" + resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.23.1.tgz#adb022b959d18d3389ac70769cef5a03d3abd403" + integrity sha512-RBRT2gqEl0IKQABT4XTj78tpk9v7ehp+mazn2HbUeZl1YMdaGAQqhapjGTCe7uw7y0frDi4gS0uHzhvpFuI1sA== + +"@esbuild/win32-arm64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz#675b7385398411240735016144ab2e99a60fc75d" + integrity sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A== + +"@esbuild/win32-arm64@0.23.1": + version "0.23.1" + resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.23.1.tgz#84906f50c212b72ec360f48461d43202f4c8b9a2" + integrity sha512-4O+gPR5rEBe2FpKOVyiJ7wNDPA8nGzDuJ6gN4okSA1gEOYZ67N8JPk58tkWtdtPeLz7lBnY6I5L3jdsr3S+A6A== + +"@esbuild/win32-ia32@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz#1bfc3ce98aa6ca9a0969e4d2af72144c59c1193b" + integrity sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA== + +"@esbuild/win32-ia32@0.23.1": + version "0.23.1" + resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.23.1.tgz#5e3eacc515820ff729e90d0cb463183128e82fac" + integrity sha512-BcaL0Vn6QwCwre3Y717nVHZbAa4UBEigzFm6VdsVdT/MbZ38xoj1X9HPkZhbmaBGUD1W8vxAfffbDe8bA6AKnQ== + +"@esbuild/win32-x64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz#acad351d582d157bb145535db2a6ff53dd514b5c" + integrity sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw== + +"@esbuild/win32-x64@0.23.1": + version "0.23.1" + resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.23.1.tgz#81fd50d11e2c32b2d6241470e3185b70c7b30699" + integrity sha512-BHpFFeslkWrXWyUPnbKm+xYYVYruCinGcftSBaa8zoF9hZO4BcSCFUvHVTtzpIY6YzUnYtuEhZ+C9iEXjxnasg== "@eslint-community/eslint-utils@^4.1.2", "@eslint-community/eslint-utils@^4.2.0", "@eslint-community/eslint-utils@^4.4.0": - version "4.4.0" - resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz#a23514e8fb9af1269d5f7788aa556798d61c6b59" - integrity sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA== + version "4.4.1" + resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.4.1.tgz#d1145bf2c20132d6400495d6df4bf59362fd9d56" + integrity sha512-s3O3waFUrMV8P/XaF/+ZTp1X9XBZW1a4B97ZnjQF2KYWaFD2A8KyFBsrsfSjEmjn3RGWAIuvlneuZm3CUK3jbA== dependencies: - eslint-visitor-keys "^3.3.0" + eslint-visitor-keys "^3.4.3" -"@eslint-community/regexpp@^4.10.0", "@eslint-community/regexpp@^4.6.0", "@eslint-community/regexpp@^4.6.1": - version "4.10.0" - resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.10.0.tgz#548f6de556857c8bb73bbee70c35dc82a2e74d63" - integrity sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA== +"@eslint-community/regexpp@^4.10.0", "@eslint-community/regexpp@^4.11.0", "@eslint-community/regexpp@^4.6.1": + version "4.12.1" + resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.12.1.tgz#cfc6cffe39df390a3841cde2abccf92eaa7ae0e0" + integrity sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ== "@eslint/eslintrc@^2.1.4": version "2.1.4" @@ -364,22 +351,22 @@ minimatch "^3.1.2" strip-json-comments "^3.1.1" -"@eslint/js@8.57.0": - version "8.57.0" - resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.57.0.tgz#a5417ae8427873f1dd08b70b3574b453e67b5f7f" - integrity sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g== +"@eslint/js@8.57.1": + version "8.57.1" + resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.57.1.tgz#de633db3ec2ef6a3c89e2f19038063e8a122e2c2" + integrity sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q== "@gar/promisify@^1.0.1": version "1.1.3" resolved "https://registry.yarnpkg.com/@gar/promisify/-/promisify-1.1.3.tgz#555193ab2e3bb3b6adc3d551c9c030d9e860daf6" integrity sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw== -"@humanwhocodes/config-array@^0.11.14": - version "0.11.14" - resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.11.14.tgz#d78e481a039f7566ecc9660b4ea7fe6b1fec442b" - integrity sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg== +"@humanwhocodes/config-array@^0.13.0": + version "0.13.0" + resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.13.0.tgz#fb907624df3256d04b9aa2df50d7aa97ec648748" + integrity sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw== dependencies: - "@humanwhocodes/object-schema" "^2.0.2" + "@humanwhocodes/object-schema" "^2.0.3" debug "^4.3.1" minimatch "^3.0.5" @@ -388,10 +375,10 @@ resolved "https://registry.yarnpkg.com/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz#af5b2691a22b44be847b0ca81641c5fb6ad0172c" integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA== -"@humanwhocodes/object-schema@^2.0.2": - version "2.0.2" - resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-2.0.2.tgz#d9fae00a2d5cb40f92cfe64b47ad749fbc38f917" - integrity sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw== +"@humanwhocodes/object-schema@^2.0.3": + version "2.0.3" + resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz#4a2868d75d6d6963e423bcf90b7fd1be343409d3" + integrity sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA== "@isaacs/cliui@^8.0.2": version "8.0.2" @@ -405,42 +392,22 @@ wrap-ansi "^8.1.0" wrap-ansi-cjs "npm:wrap-ansi@^7.0.0" -"@jest/schemas@^29.6.3": - version "29.6.3" - resolved "https://registry.yarnpkg.com/@jest/schemas/-/schemas-29.6.3.tgz#430b5ce8a4e0044a7e3819663305a7b3091c8e03" - integrity sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA== - dependencies: - "@sinclair/typebox" "^0.27.8" - -"@jridgewell/resolve-uri@^3.0.3": - version "3.1.2" - resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz#7a0ee601f60f99a20c7c7c5ff0c80388c1189bd6" - integrity sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw== - -"@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.15": - version "1.4.15" - resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz#d7c6e6755c78567a951e04ab52ef0fd26de59f32" - integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== - -"@jridgewell/trace-mapping@0.3.9": - version "0.3.9" - resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz#6534fd5933a53ba7cbf3a17615e273a0d1273ff9" - integrity sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ== - dependencies: - "@jridgewell/resolve-uri" "^3.0.3" - "@jridgewell/sourcemap-codec" "^1.4.10" +"@jridgewell/sourcemap-codec@^1.5.0": + version "1.5.0" + resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz#3188bcb273a414b0d215fd22a58540b989b9409a" + integrity sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ== "@noble/curves@^1.3.0": - version "1.4.0" - resolved "https://registry.yarnpkg.com/@noble/curves/-/curves-1.4.0.tgz#f05771ef64da724997f69ee1261b2417a49522d6" - integrity sha512-p+4cb332SFCrReJkCYe8Xzm0OWi4Jji5jVdIZRL/PmacmDkFNw6MrrV+gGpiPxLHbV+zKFRywUWbaseT+tZRXg== + version "1.8.0" + resolved "https://registry.yarnpkg.com/@noble/curves/-/curves-1.8.0.tgz#fe035a23959e6aeadf695851b51a87465b5ba8f7" + integrity sha512-j84kjAbzEnQHaSIhRPUmB3/eVXu2k3dKPl2LOrR8fSOIL+89U+7lV117EWHtq/GHM3ReGHM46iRBdZfpc4HRUQ== dependencies: - "@noble/hashes" "1.4.0" + "@noble/hashes" "1.7.0" -"@noble/hashes@1.4.0", "@noble/hashes@^1.3.1", "@noble/hashes@^1.3.3": - version "1.4.0" - resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.4.0.tgz#45814aa329f30e4fe0ba49426f49dfccdd066426" - integrity sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg== +"@noble/hashes@1.7.0", "@noble/hashes@^1.3.1", "@noble/hashes@^1.3.3": + version "1.7.0" + resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.7.0.tgz#5d9e33af2c7d04fee35de1519b80c958b2e35e39" + integrity sha512-HXydb0DgzTpDPwbVeDGCG1gIu7X6+AuU6Zl6av/E/KG8LMsvPntvq+w17CHRpKBmN6Ybdrt1eP3k4cj8DJa78w== "@nodelib/fs.scandir@2.1.5": version "2.1.5" @@ -501,678 +468,509 @@ dependencies: graceful-fs "4.2.10" -"@pnpm/npm-conf@^2.2.2": - version "2.2.2" - resolved "https://registry.yarnpkg.com/@pnpm/npm-conf/-/npm-conf-2.2.2.tgz#0058baf1c26cbb63a828f0193795401684ac86f0" - integrity sha512-UA91GwWPhFExt3IizW6bOeY/pQ0BkuNwKjk9iQW9KqxluGCrg4VenZ0/L+2Y0+ZOtme72EVvg6v0zo3AMQRCeA== +"@pnpm/npm-conf@^2.3.1": + version "2.3.1" + resolved "https://registry.yarnpkg.com/@pnpm/npm-conf/-/npm-conf-2.3.1.tgz#bb375a571a0bd63ab0a23bece33033c683e9b6b0" + integrity sha512-c83qWb22rNRuB0UaVCI0uRPNRr8Z0FWnEIvT47jiHAmOIUHbBOg5XvV7pM5x+rKn9HRpjxquDbXYSXr3fAKFcw== dependencies: "@pnpm/config.env-replace" "^1.1.0" "@pnpm/network.ca-file" "^1.0.1" config-chain "^1.1.11" -"@polkadot-api/client@0.0.1-492c132563ea6b40ae1fc5470dec4cd18768d182.1.0": - version "0.0.1-492c132563ea6b40ae1fc5470dec4cd18768d182.1.0" - resolved "https://registry.yarnpkg.com/@polkadot-api/client/-/client-0.0.1-492c132563ea6b40ae1fc5470dec4cd18768d182.1.0.tgz#5d6b863f63f5c6ecd4183fcf0c5c84dd349f7627" - integrity sha512-0fqK6pUKcGHSG2pBvY+gfSS+1mMdjd/qRygAcKI5d05tKsnZLRnmhb9laDguKmGEIB0Bz9vQqNK3gIN/cfvVwg== - dependencies: - "@polkadot-api/metadata-builders" "0.0.1-492c132563ea6b40ae1fc5470dec4cd18768d182.1.0" - "@polkadot-api/substrate-bindings" "0.0.1-492c132563ea6b40ae1fc5470dec4cd18768d182.1.0" - "@polkadot-api/substrate-client" "0.0.1-492c132563ea6b40ae1fc5470dec4cd18768d182.1.0" - "@polkadot-api/utils" "0.0.1-492c132563ea6b40ae1fc5470dec4cd18768d182.1.0" - -"@polkadot-api/json-rpc-provider-proxy@0.0.1": - version "0.0.1" - resolved "https://registry.yarnpkg.com/@polkadot-api/json-rpc-provider-proxy/-/json-rpc-provider-proxy-0.0.1.tgz#bb5c943642cdf0ec7bc48c0a2647558b9fcd7bdb" - integrity sha512-gmVDUP8LpCH0BXewbzqXF2sdHddq1H1q+XrAW2of+KZj4woQkIGBRGTJHeBEVHe30EB+UejR1N2dT4PO/RvDdg== +"@polka/url@^1.0.0-next.24": + version "1.0.0-next.28" + resolved "https://registry.yarnpkg.com/@polka/url/-/url-1.0.0-next.28.tgz#d45e01c4a56f143ee69c54dd6b12eade9e270a73" + integrity sha512-8LduaNlMZGwdZ6qWrKlfa+2M4gahzFkprZiAt2TF8uS0qQgBizKXpXURqvTJ4WtmupWxaLqjRb2UCTe72mu+Aw== -"@polkadot-api/json-rpc-provider-proxy@0.0.1-492c132563ea6b40ae1fc5470dec4cd18768d182.1.0": - version "0.0.1-492c132563ea6b40ae1fc5470dec4cd18768d182.1.0" - resolved "https://registry.yarnpkg.com/@polkadot-api/json-rpc-provider-proxy/-/json-rpc-provider-proxy-0.0.1-492c132563ea6b40ae1fc5470dec4cd18768d182.1.0.tgz#cc28fb801db6a47824261a709ab924ec6951eb96" - integrity sha512-0hZ8vtjcsyCX8AyqP2sqUHa1TFFfxGWmlXJkit0Nqp9b32MwZqn5eaUAiV2rNuEpoglKOdKnkGtUF8t5MoodKw== +"@polkadot-api/json-rpc-provider-proxy@^0.1.0": + version "0.1.0" + resolved "https://registry.yarnpkg.com/@polkadot-api/json-rpc-provider-proxy/-/json-rpc-provider-proxy-0.1.0.tgz#6e191f28e7d0fbbe8b540fc51d12a0adaeba297e" + integrity sha512-8GSFE5+EF73MCuLQm8tjrbCqlgclcHBSRaswvXziJ0ZW7iw3UEMsKkkKvELayWyBuOPa2T5i1nj6gFOeIsqvrg== -"@polkadot-api/json-rpc-provider@0.0.1": +"@polkadot-api/json-rpc-provider@0.0.1", "@polkadot-api/json-rpc-provider@^0.0.1": version "0.0.1" resolved "https://registry.yarnpkg.com/@polkadot-api/json-rpc-provider/-/json-rpc-provider-0.0.1.tgz#333645d40ccd9bccfd1f32503f17e4e63e76e297" integrity sha512-/SMC/l7foRjpykLTUTacIH05H3mr9ip8b5xxfwXlVezXrNVLp3Cv0GX6uItkKd+ZjzVPf3PFrDF2B2/HLSNESA== -"@polkadot-api/json-rpc-provider@0.0.1-492c132563ea6b40ae1fc5470dec4cd18768d182.1.0": - version "0.0.1-492c132563ea6b40ae1fc5470dec4cd18768d182.1.0" - resolved "https://registry.yarnpkg.com/@polkadot-api/json-rpc-provider/-/json-rpc-provider-0.0.1-492c132563ea6b40ae1fc5470dec4cd18768d182.1.0.tgz#2f71bfb192d28dd4c400ef8b1c5f934c676950f3" - integrity sha512-EaUS9Fc3wsiUr6ZS43PQqaRScW7kM6DYbuM/ou0aYjm8N9MBqgDbGm2oL6RE1vAVmOfEuHcXZuZkhzWtyvQUtA== - -"@polkadot-api/metadata-builders@0.0.1": - version "0.0.1" - resolved "https://registry.yarnpkg.com/@polkadot-api/metadata-builders/-/metadata-builders-0.0.1.tgz#a76b48febef9ea72be8273d889e2677101045a05" - integrity sha512-GCI78BHDzXAF/L2pZD6Aod/yl82adqQ7ftNmKg51ixRL02JpWUA+SpUKTJE5MY1p8kiJJIo09P2um24SiJHxNA== - dependencies: - "@polkadot-api/substrate-bindings" "0.0.1" - "@polkadot-api/utils" "0.0.1" - -"@polkadot-api/metadata-builders@0.0.1-492c132563ea6b40ae1fc5470dec4cd18768d182.1.0": - version "0.0.1-492c132563ea6b40ae1fc5470dec4cd18768d182.1.0" - resolved "https://registry.yarnpkg.com/@polkadot-api/metadata-builders/-/metadata-builders-0.0.1-492c132563ea6b40ae1fc5470dec4cd18768d182.1.0.tgz#085db2a3c7b100626b2fae3be35a32a24ea7714f" - integrity sha512-BD7rruxChL1VXt0icC2gD45OtT9ofJlql0qIllHSRYgama1CR2Owt+ApInQxB+lWqM+xNOznZRpj8CXNDvKIMg== - dependencies: - "@polkadot-api/substrate-bindings" "0.0.1-492c132563ea6b40ae1fc5470dec4cd18768d182.1.0" - "@polkadot-api/utils" "0.0.1-492c132563ea6b40ae1fc5470dec4cd18768d182.1.0" - -"@polkadot-api/observable-client@0.1.0": - version "0.1.0" - resolved "https://registry.yarnpkg.com/@polkadot-api/observable-client/-/observable-client-0.1.0.tgz#472045ea06a2bc4bccdc2db5c063eadcbf6f5351" - integrity sha512-GBCGDRztKorTLna/unjl/9SWZcRmvV58o9jwU2Y038VuPXZcr01jcw/1O3x+yeAuwyGzbucI/mLTDa1QoEml3A== +"@polkadot-api/metadata-builders@0.3.2": + version "0.3.2" + resolved "https://registry.yarnpkg.com/@polkadot-api/metadata-builders/-/metadata-builders-0.3.2.tgz#007f158c9e0546cf79ba440befc0c753ab1a6629" + integrity sha512-TKpfoT6vTb+513KDzMBTfCb/ORdgRnsS3TDFpOhAhZ08ikvK+hjHMt5plPiAX/OWkm1Wc9I3+K6W0hX5Ab7MVg== dependencies: - "@polkadot-api/metadata-builders" "0.0.1" - "@polkadot-api/substrate-bindings" "0.0.1" - "@polkadot-api/substrate-client" "0.0.1" - "@polkadot-api/utils" "0.0.1" + "@polkadot-api/substrate-bindings" "0.6.0" + "@polkadot-api/utils" "0.1.0" -"@polkadot-api/substrate-bindings@0.0.1": - version "0.0.1" - resolved "https://registry.yarnpkg.com/@polkadot-api/substrate-bindings/-/substrate-bindings-0.0.1.tgz#c4b7f4d6c3672d2c15cbc6c02964f014b73cbb0b" - integrity sha512-bAe7a5bOPnuFVmpv7y4BBMRpNTnMmE0jtTqRUw/+D8ZlEHNVEJQGr4wu3QQCl7k1GnSV1wfv3mzIbYjErEBocg== +"@polkadot-api/observable-client@^0.3.0": + version "0.3.2" + resolved "https://registry.yarnpkg.com/@polkadot-api/observable-client/-/observable-client-0.3.2.tgz#fd91efee350595a6e0ecfd3f294cc80de86c0cf7" + integrity sha512-HGgqWgEutVyOBXoGOPp4+IAq6CNdK/3MfQJmhCJb8YaJiaK4W6aRGrdQuQSTPHfERHCARt9BrOmEvTXAT257Ug== dependencies: - "@noble/hashes" "^1.3.1" - "@polkadot-api/utils" "0.0.1" - "@scure/base" "^1.1.1" - scale-ts "^1.6.0" + "@polkadot-api/metadata-builders" "0.3.2" + "@polkadot-api/substrate-bindings" "0.6.0" + "@polkadot-api/utils" "0.1.0" -"@polkadot-api/substrate-bindings@0.0.1-492c132563ea6b40ae1fc5470dec4cd18768d182.1.0": - version "0.0.1-492c132563ea6b40ae1fc5470dec4cd18768d182.1.0" - resolved "https://registry.yarnpkg.com/@polkadot-api/substrate-bindings/-/substrate-bindings-0.0.1-492c132563ea6b40ae1fc5470dec4cd18768d182.1.0.tgz#f836a554a9ead6fb6356079c725cd53f87238932" - integrity sha512-N4vdrZopbsw8k57uG58ofO7nLXM4Ai7835XqakN27MkjXMp5H830A1KJE0L9sGQR7ukOCDEIHHcwXVrzmJ/PBg== +"@polkadot-api/substrate-bindings@0.6.0": + version "0.6.0" + resolved "https://registry.yarnpkg.com/@polkadot-api/substrate-bindings/-/substrate-bindings-0.6.0.tgz#889b0c3ba19dc95282286506bf6e370a43ce119a" + integrity sha512-lGuhE74NA1/PqdN7fKFdE5C1gNYX357j1tWzdlPXI0kQ7h3kN0zfxNOpPUN7dIrPcOFZ6C0tRRVrBylXkI6xPw== dependencies: "@noble/hashes" "^1.3.1" - "@polkadot-api/utils" "0.0.1-492c132563ea6b40ae1fc5470dec4cd18768d182.1.0" + "@polkadot-api/utils" "0.1.0" "@scure/base" "^1.1.1" scale-ts "^1.6.0" -"@polkadot-api/substrate-client@0.0.1": - version "0.0.1" - resolved "https://registry.yarnpkg.com/@polkadot-api/substrate-client/-/substrate-client-0.0.1.tgz#0e8010a0abe2fb47d6fa7ab94e45e1d0de083314" - integrity sha512-9Bg9SGc3AwE+wXONQoW8GC00N3v6lCZLW74HQzqB6ROdcm5VAHM4CB/xRzWSUF9CXL78ugiwtHx3wBcpx4H4Wg== - -"@polkadot-api/substrate-client@0.0.1-492c132563ea6b40ae1fc5470dec4cd18768d182.1.0": - version "0.0.1-492c132563ea6b40ae1fc5470dec4cd18768d182.1.0" - resolved "https://registry.yarnpkg.com/@polkadot-api/substrate-client/-/substrate-client-0.0.1-492c132563ea6b40ae1fc5470dec4cd18768d182.1.0.tgz#55ae463f4143495e328465dd16b03e71663ef4c4" - integrity sha512-lcdvd2ssUmB1CPzF8s2dnNOqbrDa+nxaaGbuts+Vo8yjgSKwds2Lo7Oq+imZN4VKW7t9+uaVcKFLMF7PdH0RWw== - -"@polkadot-api/utils@0.0.1": - version "0.0.1" - resolved "https://registry.yarnpkg.com/@polkadot-api/utils/-/utils-0.0.1.tgz#908b22becac705149d7cc946532143d0fb003bfc" - integrity sha512-3j+pRmlF9SgiYDabSdZsBSsN5XHbpXOAce1lWj56IEEaFZVjsiCaxDOA7C9nCcgfVXuvnbxqqEGQvnY+QfBAUw== - -"@polkadot-api/utils@0.0.1-492c132563ea6b40ae1fc5470dec4cd18768d182.1.0": - version "0.0.1-492c132563ea6b40ae1fc5470dec4cd18768d182.1.0" - resolved "https://registry.yarnpkg.com/@polkadot-api/utils/-/utils-0.0.1-492c132563ea6b40ae1fc5470dec4cd18768d182.1.0.tgz#759698dcf948745ea37cc5ab6abd49a00f1b0c31" - integrity sha512-0CYaCjfLQJTCRCiYvZ81OncHXEKPzAexCMoVloR+v2nl/O2JRya/361MtPkeNLC6XBoaEgLAG9pWQpH3WePzsw== - -"@polkadot/api-augment@10.12.4": - version "10.12.4" - resolved "https://registry.yarnpkg.com/@polkadot/api-augment/-/api-augment-10.12.4.tgz#cbf03b97d60c204d05cb2478e6f862e68877cd71" - integrity sha512-ZKKeA8OnB1kkqBlvMhTw7QpPsRxpf/OE2UGhuCabQmU+MysYaWTPGssqAFEBqUZ+iyvTk83s+ssoMlXxdIhblA== - dependencies: - "@polkadot/api-base" "10.12.4" - "@polkadot/rpc-augment" "10.12.4" - "@polkadot/types" "10.12.4" - "@polkadot/types-augment" "10.12.4" - "@polkadot/types-codec" "10.12.4" - "@polkadot/util" "^12.6.2" - tslib "^2.6.2" - -"@polkadot/api-augment@11.3.1", "@polkadot/api-augment@^11.2.1": - version "11.3.1" - resolved "https://registry.yarnpkg.com/@polkadot/api-augment/-/api-augment-11.3.1.tgz#c7deeac438b017613e244c25505216a9d4c3977e" - integrity sha512-Yj+6rb6h0WwY3yJ+UGhjGW+tyMRFUMsKQuGw+eFsXdjiNU9UoXsAqA2dG7Q1F+oeX/g+y2gLGBezNoCwbl6HfA== - dependencies: - "@polkadot/api-base" "11.3.1" - "@polkadot/rpc-augment" "11.3.1" - "@polkadot/types" "11.3.1" - "@polkadot/types-augment" "11.3.1" - "@polkadot/types-codec" "11.3.1" - "@polkadot/util" "^12.6.2" - tslib "^2.6.2" - -"@polkadot/api-base@10.12.4": - version "10.12.4" - resolved "https://registry.yarnpkg.com/@polkadot/api-base/-/api-base-10.12.4.tgz#a4bcb69097e177ad2a2e67e89857244f34931e0b" - integrity sha512-e9s5rW9KgR+xs3sTI3B38KKQnd+D0WZ3PyNm66Q9aqIZDgDmpe9LIdmKfrqsX/rH74132Fq90mt3aN//DpwgBg== - dependencies: - "@polkadot/rpc-core" "10.12.4" - "@polkadot/types" "10.12.4" - "@polkadot/util" "^12.6.2" - rxjs "^7.8.1" - tslib "^2.6.2" - -"@polkadot/api-base@11.3.1", "@polkadot/api-base@^11.2.1": - version "11.3.1" - resolved "https://registry.yarnpkg.com/@polkadot/api-base/-/api-base-11.3.1.tgz#6c74c88d4a4b3d22344bb8715a135493f5a3dd33" - integrity sha512-b8UkNL00NN7+3QaLCwL5cKg+7YchHoKCAhwKusWHNBZkkO6Oo2BWilu0dZkPJOyqV9P389Kbd9+oH+SKs9u2VQ== +"@polkadot-api/substrate-client@^0.1.2": + version "0.1.4" + resolved "https://registry.yarnpkg.com/@polkadot-api/substrate-client/-/substrate-client-0.1.4.tgz#7a808e5cb85ecb9fa2b3a43945090a6c807430ce" + integrity sha512-MljrPobN0ZWTpn++da9vOvt+Ex+NlqTlr/XT7zi9sqPtDJiQcYl+d29hFAgpaeTqbeQKZwz3WDE9xcEfLE8c5A== dependencies: - "@polkadot/rpc-core" "11.3.1" - "@polkadot/types" "11.3.1" - "@polkadot/util" "^12.6.2" - rxjs "^7.8.1" - tslib "^2.6.2" + "@polkadot-api/json-rpc-provider" "0.0.1" + "@polkadot-api/utils" "0.1.0" -"@polkadot/api-derive@10.12.4": - version "10.12.4" - resolved "https://registry.yarnpkg.com/@polkadot/api-derive/-/api-derive-10.12.4.tgz#a3b4cc3eb685dd3255d36e534f6810af668a5b45" - integrity sha512-V5DogVPWoMw8U6V5hCkxDZP2qpashLUruyWVDcGhQmMb0f5d5PG/dPlZ3CzvAars6G2ypJ8ciSNKDdApP5JWaQ== - dependencies: - "@polkadot/api" "10.12.4" - "@polkadot/api-augment" "10.12.4" - "@polkadot/api-base" "10.12.4" - "@polkadot/rpc-core" "10.12.4" - "@polkadot/types" "10.12.4" - "@polkadot/types-codec" "10.12.4" - "@polkadot/util" "^12.6.2" - "@polkadot/util-crypto" "^12.6.2" +"@polkadot-api/utils@0.1.0": + version "0.1.0" + resolved "https://registry.yarnpkg.com/@polkadot-api/utils/-/utils-0.1.0.tgz#d36937cdc465c2ea302f3278cf53157340ab33a0" + integrity sha512-MXzWZeuGxKizPx2Xf/47wx9sr/uxKw39bVJUptTJdsaQn/TGq+z310mHzf1RCGvC1diHM8f593KrnDgc9oNbJA== + +"@polkadot/api-augment@14.3.1", "@polkadot/api-augment@^14.0.1": + version "14.3.1" + resolved "https://registry.yarnpkg.com/@polkadot/api-augment/-/api-augment-14.3.1.tgz#8de4ae7cda79f0ad506a3c18ebeba16207428f7f" + integrity sha512-PE6DW+8kRhbnGKn7qCF7yM6eEt/kqrY8bh1i0RZcPY9QgwXW4bZZrtMK4WssX6Z70NTEoOW6xHYIjc7gFZuz8g== + dependencies: + "@polkadot/api-base" "14.3.1" + "@polkadot/rpc-augment" "14.3.1" + "@polkadot/types" "14.3.1" + "@polkadot/types-augment" "14.3.1" + "@polkadot/types-codec" "14.3.1" + "@polkadot/util" "^13.2.3" + tslib "^2.8.0" + +"@polkadot/api-base@14.3.1", "@polkadot/api-base@^14.0.1": + version "14.3.1" + resolved "https://registry.yarnpkg.com/@polkadot/api-base/-/api-base-14.3.1.tgz#ae83cf98d273b35e718c0122b22b1a88af4d266c" + integrity sha512-GZT6rTpT3HYZ/C3rLPjoX3rX3DOxNG/zgts+jKjNrCumAeZkVq5JErKIX8/3f2TVaE2Kbqniy3d1TH/AL4HBPA== + dependencies: + "@polkadot/rpc-core" "14.3.1" + "@polkadot/types" "14.3.1" + "@polkadot/util" "^13.2.3" rxjs "^7.8.1" - tslib "^2.6.2" - -"@polkadot/api-derive@11.3.1": - version "11.3.1" - resolved "https://registry.yarnpkg.com/@polkadot/api-derive/-/api-derive-11.3.1.tgz#3617655b6dab56d5beb8efbf7383ab457370df35" - integrity sha512-9dopzrh4cRuft1nANmBvMY/hEhFDu0VICMTOGxQLOl8NMfcOFPTLAN0JhSBUoicGZhV+c4vpv01NBx/7/IL1HA== - dependencies: - "@polkadot/api" "11.3.1" - "@polkadot/api-augment" "11.3.1" - "@polkadot/api-base" "11.3.1" - "@polkadot/rpc-core" "11.3.1" - "@polkadot/types" "11.3.1" - "@polkadot/types-codec" "11.3.1" - "@polkadot/util" "^12.6.2" - "@polkadot/util-crypto" "^12.6.2" + tslib "^2.8.0" + +"@polkadot/api-derive@14.3.1": + version "14.3.1" + resolved "https://registry.yarnpkg.com/@polkadot/api-derive/-/api-derive-14.3.1.tgz#86391944a0ff04b4e6d6576252db45886f9635de" + integrity sha512-PhqUEJCY54vXtIaoYqGUtJY06wHd/K0cBmBz9yCLxp8UZkLoGWhfJRTruI25Jnucf9awS5cZKYqbsoDrL09Oqg== + dependencies: + "@polkadot/api" "14.3.1" + "@polkadot/api-augment" "14.3.1" + "@polkadot/api-base" "14.3.1" + "@polkadot/rpc-core" "14.3.1" + "@polkadot/types" "14.3.1" + "@polkadot/types-codec" "14.3.1" + "@polkadot/util" "^13.2.3" + "@polkadot/util-crypto" "^13.2.3" rxjs "^7.8.1" - tslib "^2.6.2" - -"@polkadot/api@10.12.4", "@polkadot/api@^10.11.2": - version "10.12.4" - resolved "https://registry.yarnpkg.com/@polkadot/api/-/api-10.12.4.tgz#eeec23a45a26d173b5717e1b840d2d2fb19a9fc7" - integrity sha512-bCWF1ciMqvy2XusHRk2AGKgOmod2dk/4WqQu43F8OSUXuazDOXeYJgJTv/oDznU6xQASW7awntp3JpSvsxviaA== - dependencies: - "@polkadot/api-augment" "10.12.4" - "@polkadot/api-base" "10.12.4" - "@polkadot/api-derive" "10.12.4" - "@polkadot/keyring" "^12.6.2" - "@polkadot/rpc-augment" "10.12.4" - "@polkadot/rpc-core" "10.12.4" - "@polkadot/rpc-provider" "10.12.4" - "@polkadot/types" "10.12.4" - "@polkadot/types-augment" "10.12.4" - "@polkadot/types-codec" "10.12.4" - "@polkadot/types-create" "10.12.4" - "@polkadot/types-known" "10.12.4" - "@polkadot/util" "^12.6.2" - "@polkadot/util-crypto" "^12.6.2" + tslib "^2.8.0" + +"@polkadot/api@14.3.1", "@polkadot/api@^14.0.1", "@polkadot/api@^14.3.1": + version "14.3.1" + resolved "https://registry.yarnpkg.com/@polkadot/api/-/api-14.3.1.tgz#629a111283949428541db09fe38d135829e28bc4" + integrity sha512-ZBKSXEVJa1S1bnmpnA7KT/fX3sJDIJOdVD9Hp3X+G73yvXzuK5k1Mn5z9bD/AcMs/HAGcbuYU+b9+b9IByH9YQ== + dependencies: + "@polkadot/api-augment" "14.3.1" + "@polkadot/api-base" "14.3.1" + "@polkadot/api-derive" "14.3.1" + "@polkadot/keyring" "^13.2.3" + "@polkadot/rpc-augment" "14.3.1" + "@polkadot/rpc-core" "14.3.1" + "@polkadot/rpc-provider" "14.3.1" + "@polkadot/types" "14.3.1" + "@polkadot/types-augment" "14.3.1" + "@polkadot/types-codec" "14.3.1" + "@polkadot/types-create" "14.3.1" + "@polkadot/types-known" "14.3.1" + "@polkadot/util" "^13.2.3" + "@polkadot/util-crypto" "^13.2.3" eventemitter3 "^5.0.1" rxjs "^7.8.1" - tslib "^2.6.2" - -"@polkadot/api@11.3.1", "@polkadot/api@^11.2.1": - version "11.3.1" - resolved "https://registry.yarnpkg.com/@polkadot/api/-/api-11.3.1.tgz#6092aea8147ea03873b3f383cceae0390a67f71d" - integrity sha512-q4kFIIHTLvKxM24b0Eo8hJevsPMme+aITJGrDML9BgdZYTRN14+cu5nXiCsQvaEamdyYj+uCXWe2OV9X7pPxsA== - dependencies: - "@polkadot/api-augment" "11.3.1" - "@polkadot/api-base" "11.3.1" - "@polkadot/api-derive" "11.3.1" - "@polkadot/keyring" "^12.6.2" - "@polkadot/rpc-augment" "11.3.1" - "@polkadot/rpc-core" "11.3.1" - "@polkadot/rpc-provider" "11.3.1" - "@polkadot/types" "11.3.1" - "@polkadot/types-augment" "11.3.1" - "@polkadot/types-codec" "11.3.1" - "@polkadot/types-create" "11.3.1" - "@polkadot/types-known" "11.3.1" - "@polkadot/util" "^12.6.2" - "@polkadot/util-crypto" "^12.6.2" - eventemitter3 "^5.0.1" + tslib "^2.8.0" + +"@polkadot/keyring@^13.2.2", "@polkadot/keyring@^13.2.3": + version "13.3.1" + resolved "https://registry.yarnpkg.com/@polkadot/keyring/-/keyring-13.3.1.tgz#ad02047ffa3a73f4ba268ae504e520a6856ac55d" + integrity sha512-PT3uG9MqciPyoEz/f23RRMSlht77fo1hZaA1Vbcs1Rz7h7qFC0+7jFI9Ak30EJh9V0I2YugfzqAe3NjjyDxlvw== + dependencies: + "@polkadot/util" "13.3.1" + "@polkadot/util-crypto" "13.3.1" + tslib "^2.8.0" + +"@polkadot/networks@13.3.1", "@polkadot/networks@^13.2.3": + version "13.3.1" + resolved "https://registry.yarnpkg.com/@polkadot/networks/-/networks-13.3.1.tgz#2ef94e2b74a44da22e4c56ca952b1db7b041f330" + integrity sha512-g/0OmCMUrbbW4RQ/xajTYd2SMJvFKY4kmMvpxtNN57hWQpY7c5oDXSz57jGH2uwvcBWeDfaNokcS+9hJL1RBcA== + dependencies: + "@polkadot/util" "13.3.1" + "@substrate/ss58-registry" "^1.51.0" + tslib "^2.8.0" + +"@polkadot/rpc-augment@14.3.1": + version "14.3.1" + resolved "https://registry.yarnpkg.com/@polkadot/rpc-augment/-/rpc-augment-14.3.1.tgz#08aca86bbb90358c94575f1494f111ed25af2a35" + integrity sha512-Z8Hp8fFHwFCiTX0bBCDqCZ4U26wLIJl1NRSjJTsAr+SS68pYZBDGCwhKztpKGqndk1W1akRUaxrkGqYdIFmspQ== + dependencies: + "@polkadot/rpc-core" "14.3.1" + "@polkadot/types" "14.3.1" + "@polkadot/types-codec" "14.3.1" + "@polkadot/util" "^13.2.3" + tslib "^2.8.0" + +"@polkadot/rpc-core@14.3.1": + version "14.3.1" + resolved "https://registry.yarnpkg.com/@polkadot/rpc-core/-/rpc-core-14.3.1.tgz#db80a8af15c90323c76e66f1c48fcc41988cab15" + integrity sha512-FV2NPhFwFxmX8LqibDcGc6IKTBqmvwr7xwF2OA60Br4cX+AQzMSVpFlfQcETll+0M+LnRhqGKGkP0EQWXaSowA== + dependencies: + "@polkadot/rpc-augment" "14.3.1" + "@polkadot/rpc-provider" "14.3.1" + "@polkadot/types" "14.3.1" + "@polkadot/util" "^13.2.3" rxjs "^7.8.1" - tslib "^2.6.2" - -"@polkadot/keyring@^12.6.2": - version "12.6.2" - resolved "https://registry.yarnpkg.com/@polkadot/keyring/-/keyring-12.6.2.tgz#6067e6294fee23728b008ac116e7e9db05cecb9b" - integrity sha512-O3Q7GVmRYm8q7HuB3S0+Yf/q/EB2egKRRU3fv9b3B7V+A52tKzA+vIwEmNVaD1g5FKW9oB97rmpggs0zaKFqHw== - dependencies: - "@polkadot/util" "12.6.2" - "@polkadot/util-crypto" "12.6.2" - tslib "^2.6.2" - -"@polkadot/networks@12.6.2", "@polkadot/networks@^12.6.2": - version "12.6.2" - resolved "https://registry.yarnpkg.com/@polkadot/networks/-/networks-12.6.2.tgz#791779fee1d86cc5b6cd371858eea9b7c3f8720d" - integrity sha512-1oWtZm1IvPWqvMrldVH6NI2gBoCndl5GEwx7lAuQWGr7eNL+6Bdc5K3Z9T0MzFvDGoi2/CBqjX9dRKo39pDC/w== - dependencies: - "@polkadot/util" "12.6.2" - "@substrate/ss58-registry" "^1.44.0" - tslib "^2.6.2" - -"@polkadot/rpc-augment@10.12.4": - version "10.12.4" - resolved "https://registry.yarnpkg.com/@polkadot/rpc-augment/-/rpc-augment-10.12.4.tgz#b41d88119aee801738b350d55bdab129f88fd5cd" - integrity sha512-GELqgtpoxmvFdXREYhrTGAFJ+xnQp8IYHFFtixfLM3SeV/F5FF0T7c1jSJ4PlEgK1tYg/KQ/DLl21fF7aWaInA== - dependencies: - "@polkadot/rpc-core" "10.12.4" - "@polkadot/types" "10.12.4" - "@polkadot/types-codec" "10.12.4" - "@polkadot/util" "^12.6.2" - tslib "^2.6.2" - -"@polkadot/rpc-augment@11.3.1": - version "11.3.1" - resolved "https://registry.yarnpkg.com/@polkadot/rpc-augment/-/rpc-augment-11.3.1.tgz#b589ef5b7ab578cf274077604543071ce9889301" - integrity sha512-2PaDcKNju4QYQpxwVkWbRU3M0t340nMX9cMo+8awgvgL1LliV/fUDZueMKLuSS910JJMTPQ7y2pK4eQgMt08gQ== - dependencies: - "@polkadot/rpc-core" "11.3.1" - "@polkadot/types" "11.3.1" - "@polkadot/types-codec" "11.3.1" - "@polkadot/util" "^12.6.2" - tslib "^2.6.2" - -"@polkadot/rpc-core@10.12.4": - version "10.12.4" - resolved "https://registry.yarnpkg.com/@polkadot/rpc-core/-/rpc-core-10.12.4.tgz#ecb5500335e6e202d0551356928289725321cf7c" - integrity sha512-OtOW3AQyvDR+0G7VylfwEyE5XnYhHrcRtGULT9NzjZTVHnDFghNIYoDcu6ucHBuMsvx5mbyaXsRtWDDZdr4trw== - dependencies: - "@polkadot/rpc-augment" "10.12.4" - "@polkadot/rpc-provider" "10.12.4" - "@polkadot/types" "10.12.4" - "@polkadot/util" "^12.6.2" - rxjs "^7.8.1" - tslib "^2.6.2" - -"@polkadot/rpc-core@11.3.1": - version "11.3.1" - resolved "https://registry.yarnpkg.com/@polkadot/rpc-core/-/rpc-core-11.3.1.tgz#c23e23ee5c403c4edb207d603ae4dc16e69bc710" - integrity sha512-KKNepsDd/mpmXcA6v/h14eFFPEzLGd7nrvx2UUXUxoZ0Fq2MH1hplP3s93k1oduNY/vOXJR2K9S4dKManA6GVQ== - dependencies: - "@polkadot/rpc-augment" "11.3.1" - "@polkadot/rpc-provider" "11.3.1" - "@polkadot/types" "11.3.1" - "@polkadot/util" "^12.6.2" - rxjs "^7.8.1" - tslib "^2.6.2" - -"@polkadot/rpc-provider@10.12.4": - version "10.12.4" - resolved "https://registry.yarnpkg.com/@polkadot/rpc-provider/-/rpc-provider-10.12.4.tgz#91fc29064e9d8152d8fec8fbf401b5be7ab3716e" - integrity sha512-awXLK28nt6BvOwoTnOVPtz+Qu5sx40Al1yb5lzKG6jYFQrEmqrENufHNOCLU3Uspfqmc6eJmNluZOmVtJKDCPg== - dependencies: - "@polkadot/keyring" "^12.6.2" - "@polkadot/types" "10.12.4" - "@polkadot/types-support" "10.12.4" - "@polkadot/util" "^12.6.2" - "@polkadot/util-crypto" "^12.6.2" - "@polkadot/x-fetch" "^12.6.2" - "@polkadot/x-global" "^12.6.2" - "@polkadot/x-ws" "^12.6.2" + tslib "^2.8.0" + +"@polkadot/rpc-provider@14.3.1", "@polkadot/rpc-provider@^14.0.1": + version "14.3.1" + resolved "https://registry.yarnpkg.com/@polkadot/rpc-provider/-/rpc-provider-14.3.1.tgz#a7247bd6f59c6a597fcc88c5ddb95e44296d5a66" + integrity sha512-NF/Z/7lzT+jp5LZzC49g+YIjRzXVI0hFag3+B+4zh6E/kKADdF59EHj2Im4LDhRGOnEO9AE4H6/UjNEbZ94JtA== + dependencies: + "@polkadot/keyring" "^13.2.3" + "@polkadot/types" "14.3.1" + "@polkadot/types-support" "14.3.1" + "@polkadot/util" "^13.2.3" + "@polkadot/util-crypto" "^13.2.3" + "@polkadot/x-fetch" "^13.2.3" + "@polkadot/x-global" "^13.2.3" + "@polkadot/x-ws" "^13.2.3" eventemitter3 "^5.0.1" mock-socket "^9.3.1" - nock "^13.5.0" - tslib "^2.6.2" + nock "^13.5.5" + tslib "^2.8.0" optionalDependencies: - "@substrate/connect" "0.8.8" - -"@polkadot/rpc-provider@11.3.1", "@polkadot/rpc-provider@^11.2.1": - version "11.3.1" - resolved "https://registry.yarnpkg.com/@polkadot/rpc-provider/-/rpc-provider-11.3.1.tgz#1d1289bf42d065b5f04f9baa46ef90d96940819e" - integrity sha512-pqERChoHo45hd3WAgW8UuzarRF+G/o/eXEbl0PXLubiayw4X4qCmIzmtntUcKYgxGNcYGZaG87ZU8OjN97m6UA== - dependencies: - "@polkadot/keyring" "^12.6.2" - "@polkadot/types" "11.3.1" - "@polkadot/types-support" "11.3.1" - "@polkadot/util" "^12.6.2" - "@polkadot/util-crypto" "^12.6.2" - "@polkadot/x-fetch" "^12.6.2" - "@polkadot/x-global" "^12.6.2" - "@polkadot/x-ws" "^12.6.2" - eventemitter3 "^5.0.1" - mock-socket "^9.3.1" - nock "^13.5.0" - tslib "^2.6.2" - optionalDependencies: - "@substrate/connect" "0.8.10" - -"@polkadot/types-augment@10.12.4": - version "10.12.4" - resolved "https://registry.yarnpkg.com/@polkadot/types-augment/-/types-augment-10.12.4.tgz#e396b9a0a9bf428a4352cbb36ecf3a5ebc696e19" - integrity sha512-BS7uMd5WzbpcXimYcbwQGJFjsZikVW1XXPS3FHAkcdPOKm1qWZ/r3V18XH9G4DKj0O0s4VrdVTl0nMcOZurKKg== - dependencies: - "@polkadot/types" "10.12.4" - "@polkadot/types-codec" "10.12.4" - "@polkadot/util" "^12.6.2" - tslib "^2.6.2" - -"@polkadot/types-augment@11.3.1": - version "11.3.1" - resolved "https://registry.yarnpkg.com/@polkadot/types-augment/-/types-augment-11.3.1.tgz#1f7f553f0ca6eb8fbc0306901edc045fe18729e1" - integrity sha512-eR3HVpvUmB3v7q2jTWVmVfAVfb1/kuNn7ij94Zqadg/fuUq0pKqIOKwkUj3OxRM3A/5BnW3MbgparjKD3r+fyw== - dependencies: - "@polkadot/types" "11.3.1" - "@polkadot/types-codec" "11.3.1" - "@polkadot/util" "^12.6.2" - tslib "^2.6.2" - -"@polkadot/types-codec@10.12.4": - version "10.12.4" - resolved "https://registry.yarnpkg.com/@polkadot/types-codec/-/types-codec-10.12.4.tgz#21052005bb448814d0d16230c1835a81f601e450" - integrity sha512-8SEwgQT+JfmI62C9MZisA/1oQFuQW1OySvZFZlSqkaoRooK+JMl7Sp9fnRhCuiHMiz08YO4lX16O+aAu0/bmmw== - dependencies: - "@polkadot/util" "^12.6.2" - "@polkadot/x-bigint" "^12.6.2" - tslib "^2.6.2" - -"@polkadot/types-codec@11.3.1", "@polkadot/types-codec@^11.2.1": - version "11.3.1" - resolved "https://registry.yarnpkg.com/@polkadot/types-codec/-/types-codec-11.3.1.tgz#2767cf482cd49afdd5dce9701615f68ec59cec5e" - integrity sha512-i7IiiuuL+Z/jFoKTA9xeh4wGQnhnNNjMT0+1ohvlOvnFsoKZKFQQOaDPPntGJVL1JDCV+KjkN2uQKZSeW8tguQ== - dependencies: - "@polkadot/util" "^12.6.2" - "@polkadot/x-bigint" "^12.6.2" - tslib "^2.6.2" - -"@polkadot/types-create@10.12.4": - version "10.12.4" - resolved "https://registry.yarnpkg.com/@polkadot/types-create/-/types-create-10.12.4.tgz#f271a9625ab9d533f41e10ad1ffac7a9d7a910f1" - integrity sha512-K3a6q+q+as/FfxrbXgFdgK8aqrsUgAkH5c0KQS+nt6xMs+Yf2ctpqiLPOjOEVEw8kHRpYtjx1db8Namegk51ig== - dependencies: - "@polkadot/types-codec" "10.12.4" - "@polkadot/util" "^12.6.2" - tslib "^2.6.2" - -"@polkadot/types-create@11.3.1": - version "11.3.1" - resolved "https://registry.yarnpkg.com/@polkadot/types-create/-/types-create-11.3.1.tgz#3ac2c8283f61555f9e572ca30e3485b95a0a54e2" - integrity sha512-pBXtpz5FehcRJ6j5MzFUIUN8ZWM7z6HbqK1GxBmYbJVRElcGcOg7a/rL2pQVphU0Rx1E8bSO4thzGf4wUxSX7w== - dependencies: - "@polkadot/types-codec" "11.3.1" - "@polkadot/util" "^12.6.2" - tslib "^2.6.2" - -"@polkadot/types-known@10.12.4": - version "10.12.4" - resolved "https://registry.yarnpkg.com/@polkadot/types-known/-/types-known-10.12.4.tgz#5a2c002a0af405a11f11ee93c3b2bb95788db03d" - integrity sha512-fiS26ep9QwHIUn/N0X9R3DIFP8ar4cEG/oJyxs5uBNtIEiAZdWucEZAZFxJnNp6Lib0PGYaz9T9ph0+UbnKKEg== - dependencies: - "@polkadot/networks" "^12.6.2" - "@polkadot/types" "10.12.4" - "@polkadot/types-codec" "10.12.4" - "@polkadot/types-create" "10.12.4" - "@polkadot/util" "^12.6.2" - tslib "^2.6.2" - -"@polkadot/types-known@11.3.1", "@polkadot/types-known@^11.2.1": - version "11.3.1" - resolved "https://registry.yarnpkg.com/@polkadot/types-known/-/types-known-11.3.1.tgz#fc34ed29ac2474db6b66805a15d12008226346bb" - integrity sha512-3BIof7u6tn9bk3ZCIxA07iNoQ3uj4+vn3DTOjCKECozkRlt6V+kWRvqh16Hc0SHMg/QjcMb2fIu/WZhka1McUQ== - dependencies: - "@polkadot/networks" "^12.6.2" - "@polkadot/types" "11.3.1" - "@polkadot/types-codec" "11.3.1" - "@polkadot/types-create" "11.3.1" - "@polkadot/util" "^12.6.2" - tslib "^2.6.2" - -"@polkadot/types-support@10.12.4": - version "10.12.4" - resolved "https://registry.yarnpkg.com/@polkadot/types-support/-/types-support-10.12.4.tgz#e59db00e2d7665d2a32d5f8c18d548ad2b10e1bd" - integrity sha512-uK0AoxzbuFEwlR3eoTKdWuZxAKYOn2B67Xo+swwRL0/VTZvEc6mGnFUd1RfVM+cWKfH3eqwKQCYhjvFRlOkA8g== - dependencies: - "@polkadot/util" "^12.6.2" - tslib "^2.6.2" - -"@polkadot/types-support@11.3.1": - version "11.3.1" - resolved "https://registry.yarnpkg.com/@polkadot/types-support/-/types-support-11.3.1.tgz#dee02a67784baa13177fe9957f5d8d62e8a7e570" - integrity sha512-jTFz1GKyF7nI29yIOq4v0NiWTOf5yX4HahJNeFD8TcxoLhF+6tH/XXqrUXJEfbaTlSrRWiW1LZYlb+snctqKHA== - dependencies: - "@polkadot/util" "^12.6.2" - tslib "^2.6.2" - -"@polkadot/types@10.12.4": - version "10.12.4" - resolved "https://registry.yarnpkg.com/@polkadot/types/-/types-10.12.4.tgz#6c26c81fd523c1b75e53eccf676f3d8697358699" - integrity sha512-KJfxAdOyA/ZmGzRpRWojZx6hOU4iFHiwmerAZQzxELMCUCSsAd4joiXWQX7leSrlJCvvk8/VecnXGTqRe8jtGw== - dependencies: - "@polkadot/keyring" "^12.6.2" - "@polkadot/types-augment" "10.12.4" - "@polkadot/types-codec" "10.12.4" - "@polkadot/types-create" "10.12.4" - "@polkadot/util" "^12.6.2" - "@polkadot/util-crypto" "^12.6.2" + "@substrate/connect" "0.8.11" + +"@polkadot/types-augment@14.3.1": + version "14.3.1" + resolved "https://registry.yarnpkg.com/@polkadot/types-augment/-/types-augment-14.3.1.tgz#d41c20ee51f07d5e753096509e387fa508cfd028" + integrity sha512-SC4M6TBlgCglNz+gRbvfoVRDz0Vyeev6v0HeAdw0H6ayEW4BXUdo5bFr0092bdS5uTrEPgiSyUry5TJs2KoXig== + dependencies: + "@polkadot/types" "14.3.1" + "@polkadot/types-codec" "14.3.1" + "@polkadot/util" "^13.2.3" + tslib "^2.8.0" + +"@polkadot/types-codec@14.3.1", "@polkadot/types-codec@^14.0.1": + version "14.3.1" + resolved "https://registry.yarnpkg.com/@polkadot/types-codec/-/types-codec-14.3.1.tgz#891fce0b1a0d69c6c4e1112393d88447fae8d374" + integrity sha512-3y3RBGd+8ebscGbNUOjqUjnRE7hgicgid5LtofHK3O1EDcJQJnYBDkJ7fOAi96CDgHsg+f2FWWkBWEPgpOQoMQ== + dependencies: + "@polkadot/util" "^13.2.3" + "@polkadot/x-bigint" "^13.2.3" + tslib "^2.8.0" + +"@polkadot/types-create@14.3.1": + version "14.3.1" + resolved "https://registry.yarnpkg.com/@polkadot/types-create/-/types-create-14.3.1.tgz#e410ff71fce4d8d49a1411943d1a9d26f98a866d" + integrity sha512-F4EBvF3Zvym0xrkAA5Yz01IAVMepMV3w2Dwd0C9IygEAQ5sYLLPHmf72/aXn+Ag+bSyT2wlJHpDc+nEBXNQ3Gw== + dependencies: + "@polkadot/types-codec" "14.3.1" + "@polkadot/util" "^13.2.3" + tslib "^2.8.0" + +"@polkadot/types-known@14.3.1", "@polkadot/types-known@^14.0.1": + version "14.3.1" + resolved "https://registry.yarnpkg.com/@polkadot/types-known/-/types-known-14.3.1.tgz#593976ef8926cacefdf97a3cc313a227d4489baa" + integrity sha512-58b3Yc7+sxwNjs8axmrA9OCgnxmEKIq7XCH2VxSgLqTeqbohVtxwUSCW/l8NPrq1nxzj4J2sopu0PPg8/++q4g== + dependencies: + "@polkadot/networks" "^13.2.3" + "@polkadot/types" "14.3.1" + "@polkadot/types-codec" "14.3.1" + "@polkadot/types-create" "14.3.1" + "@polkadot/util" "^13.2.3" + tslib "^2.8.0" + +"@polkadot/types-support@14.3.1": + version "14.3.1" + resolved "https://registry.yarnpkg.com/@polkadot/types-support/-/types-support-14.3.1.tgz#29107b1e92d0d8b33e152856e17ba40f8768b918" + integrity sha512-MfVe4iIOJIfBr+gj8Lu8gwIvhnO6gDbG5LeaKAjY6vS6Oh0y5Ztr8NdMIl8ccSpoyt3LqIXjfApeGzHiLzr6bw== + dependencies: + "@polkadot/util" "^13.2.3" + tslib "^2.8.0" + +"@polkadot/types@14.3.1", "@polkadot/types@^14.0.1": + version "14.3.1" + resolved "https://registry.yarnpkg.com/@polkadot/types/-/types-14.3.1.tgz#ea1698f59750e74169314239272777fd6a732a19" + integrity sha512-O748XgCLDQYxS5nQ6TJSqW88oC4QNIoNVlWZC2Qq4SmEXuSzaNHQwSVtdyPRJCCc4Oi1DCQvGui4O+EukUl7HA== + dependencies: + "@polkadot/keyring" "^13.2.3" + "@polkadot/types-augment" "14.3.1" + "@polkadot/types-codec" "14.3.1" + "@polkadot/types-create" "14.3.1" + "@polkadot/util" "^13.2.3" + "@polkadot/util-crypto" "^13.2.3" rxjs "^7.8.1" - tslib "^2.6.2" + tslib "^2.8.0" -"@polkadot/types@11.3.1", "@polkadot/types@^11.2.1": - version "11.3.1" - resolved "https://registry.yarnpkg.com/@polkadot/types/-/types-11.3.1.tgz#bab61b701218158099e3f548d20efc27cbf1287f" - integrity sha512-5c7uRFXQTT11Awi6T0yFIdAfD6xGDAOz06Kp7M5S9OGNZY28wSPk5x6BYfNphWPaIBmHHewYJB5qmnrdYQAWKQ== - dependencies: - "@polkadot/keyring" "^12.6.2" - "@polkadot/types-augment" "11.3.1" - "@polkadot/types-codec" "11.3.1" - "@polkadot/types-create" "11.3.1" - "@polkadot/util" "^12.6.2" - "@polkadot/util-crypto" "^12.6.2" - rxjs "^7.8.1" - tslib "^2.6.2" - -"@polkadot/util-crypto@12.6.2", "@polkadot/util-crypto@^12.6.2": - version "12.6.2" - resolved "https://registry.yarnpkg.com/@polkadot/util-crypto/-/util-crypto-12.6.2.tgz#d2d51010e8e8ca88951b7d864add797dad18bbfc" - integrity sha512-FEWI/dJ7wDMNN1WOzZAjQoIcCP/3vz3wvAp5QQm+lOrzOLj0iDmaIGIcBkz8HVm3ErfSe/uKP0KS4jgV/ib+Mg== +"@polkadot/util-crypto@13.3.1", "@polkadot/util-crypto@^13.2.2", "@polkadot/util-crypto@^13.2.3": + version "13.3.1" + resolved "https://registry.yarnpkg.com/@polkadot/util-crypto/-/util-crypto-13.3.1.tgz#b7a705aa2760ecd48e66c0f49bef11cd3cb322af" + integrity sha512-FU6yf3IY++DKlf0eqO9/obe2y1zuZ5rbqRs75fyOME/5VXio1fA3GIpW7aFphyneFRd78G8QLh8kn0oIwBGMNg== dependencies: "@noble/curves" "^1.3.0" "@noble/hashes" "^1.3.3" - "@polkadot/networks" "12.6.2" - "@polkadot/util" "12.6.2" - "@polkadot/wasm-crypto" "^7.3.2" - "@polkadot/wasm-util" "^7.3.2" - "@polkadot/x-bigint" "12.6.2" - "@polkadot/x-randomvalues" "12.6.2" - "@scure/base" "^1.1.5" - tslib "^2.6.2" - -"@polkadot/util@12.6.2", "@polkadot/util@^12.6.2": - version "12.6.2" - resolved "https://registry.yarnpkg.com/@polkadot/util/-/util-12.6.2.tgz#9396eff491221e1f0fd28feac55fc16ecd61a8dc" - integrity sha512-l8TubR7CLEY47240uki0TQzFvtnxFIO7uI/0GoWzpYD/O62EIAMRsuY01N4DuwgKq2ZWD59WhzsLYmA5K6ksdw== - dependencies: - "@polkadot/x-bigint" "12.6.2" - "@polkadot/x-global" "12.6.2" - "@polkadot/x-textdecoder" "12.6.2" - "@polkadot/x-textencoder" "12.6.2" - "@types/bn.js" "^5.1.5" + "@polkadot/networks" "13.3.1" + "@polkadot/util" "13.3.1" + "@polkadot/wasm-crypto" "^7.4.1" + "@polkadot/wasm-util" "^7.4.1" + "@polkadot/x-bigint" "13.3.1" + "@polkadot/x-randomvalues" "13.3.1" + "@scure/base" "^1.1.7" + tslib "^2.8.0" + +"@polkadot/util@13.3.1", "@polkadot/util@^13.2.2", "@polkadot/util@^13.2.3": + version "13.3.1" + resolved "https://registry.yarnpkg.com/@polkadot/util/-/util-13.3.1.tgz#654b84fd553e7d977007885c23aae98e4ff18114" + integrity sha512-5crLP/rUZOJzuo/W8t73J8PxpibJ5vrxY57rR6V+mIpCZd1ORiw0wxeHcV5F9Adpn7yJyuGBwxPbueNR5Rr1Zw== + dependencies: + "@polkadot/x-bigint" "13.3.1" + "@polkadot/x-global" "13.3.1" + "@polkadot/x-textdecoder" "13.3.1" + "@polkadot/x-textencoder" "13.3.1" + "@types/bn.js" "^5.1.6" bn.js "^5.2.1" - tslib "^2.6.2" - -"@polkadot/wasm-bridge@7.3.2": - version "7.3.2" - resolved "https://registry.yarnpkg.com/@polkadot/wasm-bridge/-/wasm-bridge-7.3.2.tgz#e1b01906b19e06cbca3d94f10f5666f2ae0baadc" - integrity sha512-AJEXChcf/nKXd5Q/YLEV5dXQMle3UNT7jcXYmIffZAo/KI394a+/24PaISyQjoNC0fkzS1Q8T5pnGGHmXiVz2g== - dependencies: - "@polkadot/wasm-util" "7.3.2" - tslib "^2.6.2" - -"@polkadot/wasm-crypto-asmjs@7.3.2": - version "7.3.2" - resolved "https://registry.yarnpkg.com/@polkadot/wasm-crypto-asmjs/-/wasm-crypto-asmjs-7.3.2.tgz#c6d41bc4b48b5359d57a24ca3066d239f2d70a34" - integrity sha512-QP5eiUqUFur/2UoF2KKKYJcesc71fXhQFLT3D4ZjG28Mfk2ZPI0QNRUfpcxVQmIUpV5USHg4geCBNuCYsMm20Q== - dependencies: - tslib "^2.6.2" - -"@polkadot/wasm-crypto-init@7.3.2": - version "7.3.2" - resolved "https://registry.yarnpkg.com/@polkadot/wasm-crypto-init/-/wasm-crypto-init-7.3.2.tgz#7e1fe79ba978fb0a4a0f74a92d976299d38bc4b8" - integrity sha512-FPq73zGmvZtnuJaFV44brze3Lkrki3b4PebxCy9Fplw8nTmisKo9Xxtfew08r0njyYh+uiJRAxPCXadkC9sc8g== - dependencies: - "@polkadot/wasm-bridge" "7.3.2" - "@polkadot/wasm-crypto-asmjs" "7.3.2" - "@polkadot/wasm-crypto-wasm" "7.3.2" - "@polkadot/wasm-util" "7.3.2" - tslib "^2.6.2" - -"@polkadot/wasm-crypto-wasm@7.3.2": - version "7.3.2" - resolved "https://registry.yarnpkg.com/@polkadot/wasm-crypto-wasm/-/wasm-crypto-wasm-7.3.2.tgz#44e08ed5cf6499ce4a3aa7247071a5d01f6a74f4" - integrity sha512-15wd0EMv9IXs5Abp1ZKpKKAVyZPhATIAHfKsyoWCEFDLSOA0/K0QGOxzrAlsrdUkiKZOq7uzSIgIDgW8okx2Mw== - dependencies: - "@polkadot/wasm-util" "7.3.2" - tslib "^2.6.2" - -"@polkadot/wasm-crypto@^7.3.2": - version "7.3.2" - resolved "https://registry.yarnpkg.com/@polkadot/wasm-crypto/-/wasm-crypto-7.3.2.tgz#61bbcd9e591500705c8c591e6aff7654bdc8afc9" - integrity sha512-+neIDLSJ6jjVXsjyZ5oLSv16oIpwp+PxFqTUaZdZDoA2EyFRQB8pP7+qLsMNk+WJuhuJ4qXil/7XiOnZYZ+wxw== - dependencies: - "@polkadot/wasm-bridge" "7.3.2" - "@polkadot/wasm-crypto-asmjs" "7.3.2" - "@polkadot/wasm-crypto-init" "7.3.2" - "@polkadot/wasm-crypto-wasm" "7.3.2" - "@polkadot/wasm-util" "7.3.2" - tslib "^2.6.2" - -"@polkadot/wasm-util@7.3.2", "@polkadot/wasm-util@^7.3.2": - version "7.3.2" - resolved "https://registry.yarnpkg.com/@polkadot/wasm-util/-/wasm-util-7.3.2.tgz#4fe6370d2b029679b41a5c02cd7ebf42f9b28de1" - integrity sha512-bmD+Dxo1lTZyZNxbyPE380wd82QsX+43mgCm40boyKrRppXEyQmWT98v/Poc7chLuskYb6X8IQ6lvvK2bGR4Tg== - dependencies: - tslib "^2.6.2" - -"@polkadot/x-bigint@12.6.2", "@polkadot/x-bigint@^12.6.2": - version "12.6.2" - resolved "https://registry.yarnpkg.com/@polkadot/x-bigint/-/x-bigint-12.6.2.tgz#59b7a615f205ae65e1ac67194aefde94d3344580" - integrity sha512-HSIk60uFPX4GOFZSnIF7VYJz7WZA7tpFJsne7SzxOooRwMTWEtw3fUpFy5cYYOeLh17/kHH1Y7SVcuxzVLc74Q== - dependencies: - "@polkadot/x-global" "12.6.2" - tslib "^2.6.2" - -"@polkadot/x-fetch@^12.6.2": - version "12.6.2" - resolved "https://registry.yarnpkg.com/@polkadot/x-fetch/-/x-fetch-12.6.2.tgz#b1bca028db90263bafbad2636c18d838d842d439" - integrity sha512-8wM/Z9JJPWN1pzSpU7XxTI1ldj/AfC8hKioBlUahZ8gUiJaOF7K9XEFCrCDLis/A1BoOu7Ne6WMx/vsJJIbDWw== - dependencies: - "@polkadot/x-global" "12.6.2" + tslib "^2.8.0" + +"@polkadot/wasm-bridge@7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@polkadot/wasm-bridge/-/wasm-bridge-7.4.1.tgz#dd59ebb7c425657aad64b1430e8455d14d935059" + integrity sha512-tdkJaV453tezBxhF39r4oeG0A39sPKGDJmN81LYLf+Fihb7astzwju+u75BRmDrHZjZIv00un3razJEWCxze6g== + dependencies: + "@polkadot/wasm-util" "7.4.1" + tslib "^2.7.0" + +"@polkadot/wasm-crypto-asmjs@7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@polkadot/wasm-crypto-asmjs/-/wasm-crypto-asmjs-7.4.1.tgz#5d36f3f498077f826f2bbe742070574606e673e9" + integrity sha512-pwU8QXhUW7IberyHJIQr37IhbB6DPkCG5FhozCiNTq4vFBsFPjm9q8aZh7oX1QHQaiAZa2m2/VjIVE+FHGbvHQ== + dependencies: + tslib "^2.7.0" + +"@polkadot/wasm-crypto-init@7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@polkadot/wasm-crypto-init/-/wasm-crypto-init-7.4.1.tgz#88bc61c9473a7c39d9fafb27cd631215b053b836" + integrity sha512-AVka33+f7MvXEEIGq5U0dhaA2SaXMXnxVCQyhJTaCnJ5bRDj0Xlm3ijwDEQUiaDql7EikbkkRtmlvs95eSUWYQ== + dependencies: + "@polkadot/wasm-bridge" "7.4.1" + "@polkadot/wasm-crypto-asmjs" "7.4.1" + "@polkadot/wasm-crypto-wasm" "7.4.1" + "@polkadot/wasm-util" "7.4.1" + tslib "^2.7.0" + +"@polkadot/wasm-crypto-wasm@7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@polkadot/wasm-crypto-wasm/-/wasm-crypto-wasm-7.4.1.tgz#73d08f59aaf51ed70563c0099e7852fdeda03649" + integrity sha512-PE1OAoupFR0ZOV2O8tr7D1FEUAwaggzxtfs3Aa5gr+yxlSOaWUKeqsOYe1KdrcjmZVV3iINEAXxgrbzCmiuONg== + dependencies: + "@polkadot/wasm-util" "7.4.1" + tslib "^2.7.0" + +"@polkadot/wasm-crypto@^7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@polkadot/wasm-crypto/-/wasm-crypto-7.4.1.tgz#6d5f94d28bf92ef234b94d55b0d1f4299cbbb7b7" + integrity sha512-kHN/kF7hYxm1y0WeFLWeWir6oTzvcFmR4N8fJJokR+ajYbdmrafPN+6iLgQVbhZnDdxyv9jWDuRRsDnBx8tPMQ== + dependencies: + "@polkadot/wasm-bridge" "7.4.1" + "@polkadot/wasm-crypto-asmjs" "7.4.1" + "@polkadot/wasm-crypto-init" "7.4.1" + "@polkadot/wasm-crypto-wasm" "7.4.1" + "@polkadot/wasm-util" "7.4.1" + tslib "^2.7.0" + +"@polkadot/wasm-util@7.4.1", "@polkadot/wasm-util@^7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@polkadot/wasm-util/-/wasm-util-7.4.1.tgz#e8cea38a3b752efdef55080bb1da795ac71c5136" + integrity sha512-RAcxNFf3zzpkr+LX/ItAsvj+QyM56TomJ0xjUMo4wKkHjwsxkz4dWJtx5knIgQz/OthqSDMR59VNEycQeNuXzA== + dependencies: + tslib "^2.7.0" + +"@polkadot/x-bigint@13.3.1", "@polkadot/x-bigint@^13.2.3": + version "13.3.1" + resolved "https://registry.yarnpkg.com/@polkadot/x-bigint/-/x-bigint-13.3.1.tgz#2a24633e002fbdde6ca4f2ac9d33b927db583245" + integrity sha512-ewc708a7LUdrT92v9DsSAIbcJQBn3aR9/LavF/iyMOq5lZJyPXDSjAnskfMs818R3RLCrKVKfs+aKkxt2eqo8g== + dependencies: + "@polkadot/x-global" "13.3.1" + tslib "^2.8.0" + +"@polkadot/x-fetch@^13.2.3": + version "13.3.1" + resolved "https://registry.yarnpkg.com/@polkadot/x-fetch/-/x-fetch-13.3.1.tgz#27ee462567193d0832d132a5d6a84229fe740e88" + integrity sha512-J+HM42j0KGqdC/eo7vmsdLPz74MR7+0My4km6TG9HGjKqqztwygtenpopPod2SbRnL4nHiEG0wZzpVOW6HN2gw== + dependencies: + "@polkadot/x-global" "13.3.1" node-fetch "^3.3.2" - tslib "^2.6.2" - -"@polkadot/x-global@12.6.2", "@polkadot/x-global@^12.6.2": - version "12.6.2" - resolved "https://registry.yarnpkg.com/@polkadot/x-global/-/x-global-12.6.2.tgz#31d4de1c3d4c44e4be3219555a6d91091decc4ec" - integrity sha512-a8d6m+PW98jmsYDtAWp88qS4dl8DyqUBsd0S+WgyfSMtpEXu6v9nXDgPZgwF5xdDvXhm+P0ZfVkVTnIGrScb5g== - dependencies: - tslib "^2.6.2" - -"@polkadot/x-randomvalues@12.6.2": - version "12.6.2" - resolved "https://registry.yarnpkg.com/@polkadot/x-randomvalues/-/x-randomvalues-12.6.2.tgz#13fe3619368b8bf5cb73781554859b5ff9d900a2" - integrity sha512-Vr8uG7rH2IcNJwtyf5ebdODMcr0XjoCpUbI91Zv6AlKVYOGKZlKLYJHIwpTaKKB+7KPWyQrk4Mlym/rS7v9feg== - dependencies: - "@polkadot/x-global" "12.6.2" - tslib "^2.6.2" + tslib "^2.8.0" + +"@polkadot/x-global@13.3.1", "@polkadot/x-global@^13.2.3": + version "13.3.1" + resolved "https://registry.yarnpkg.com/@polkadot/x-global/-/x-global-13.3.1.tgz#2537b834ecb239a7fb92004491ddff102f3ebee9" + integrity sha512-861TeIw49a3JvkwlUWrddfG+JaUqtFZDsemYxxZIjjcRJLrKOsoKNqHbiHi2OPrwlX8PwAA/wc5I9Q4XRQ7KEg== + dependencies: + tslib "^2.8.0" + +"@polkadot/x-randomvalues@13.3.1": + version "13.3.1" + resolved "https://registry.yarnpkg.com/@polkadot/x-randomvalues/-/x-randomvalues-13.3.1.tgz#63b1251f3fb6643daf31917bc2e14277e6145101" + integrity sha512-GIb0au3vIX2U/DRH0PRckM+1I4EIbU8PLX1roGJgN1MAYKWiylJTKPVoBMafMM87o8qauOevJ46uYB/qlfbiWg== + dependencies: + "@polkadot/x-global" "13.3.1" + tslib "^2.8.0" + +"@polkadot/x-textdecoder@13.3.1": + version "13.3.1" + resolved "https://registry.yarnpkg.com/@polkadot/x-textdecoder/-/x-textdecoder-13.3.1.tgz#eb50c2c52d0de9257ebd4623c4098e929e7aa3a6" + integrity sha512-g2R9O1p0ZsNDhZ3uEBZh6fQaVLlo3yFr0YNqt15v7e9lBI4APvTJ202EINlo2jB5lz/R438/BdjEA3AL+0zUtQ== + dependencies: + "@polkadot/x-global" "13.3.1" + tslib "^2.8.0" + +"@polkadot/x-textencoder@13.3.1": + version "13.3.1" + resolved "https://registry.yarnpkg.com/@polkadot/x-textencoder/-/x-textencoder-13.3.1.tgz#203a208b03a1336446777c0cc76bf35cf8e685d5" + integrity sha512-DnHLUdoKDYxekfxopuUuPB+j5Mu7Jemejcduu5gz3/89GP/sYPAu0CAVbq9B+hK1yGjBBj31eA4wkAV1oktYmg== + dependencies: + "@polkadot/x-global" "13.3.1" + tslib "^2.8.0" + +"@polkadot/x-ws@^13.2.3": + version "13.3.1" + resolved "https://registry.yarnpkg.com/@polkadot/x-ws/-/x-ws-13.3.1.tgz#05b0664991e24ffd62f5af91c9280dcb544c0613" + integrity sha512-ytqkC7FwVs4BlzNFAmPMFp+xD1KIdMMP/mvCSOrnxjlsyM5DVGop4x4c2ZgDUBmrFqmIiVkWDfMIZeOxui2OLQ== + dependencies: + "@polkadot/x-global" "13.3.1" + tslib "^2.8.0" + ws "^8.18.0" + +"@rollup/rollup-android-arm-eabi@4.30.1": + version "4.30.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.30.1.tgz#14c737dc19603a096568044eadaa60395eefb809" + integrity sha512-pSWY+EVt3rJ9fQ3IqlrEUtXh3cGqGtPDH1FQlNZehO2yYxCHEX1SPsz1M//NXwYfbTlcKr9WObLnJX9FsS9K1Q== + +"@rollup/rollup-android-arm64@4.30.1": + version "4.30.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.30.1.tgz#9d81ea54fc5650eb4ebbc0a7d84cee331bfa30ad" + integrity sha512-/NA2qXxE3D/BRjOJM8wQblmArQq1YoBVJjrjoTSBS09jgUisq7bqxNHJ8kjCHeV21W/9WDGwJEWSN0KQ2mtD/w== + +"@rollup/rollup-darwin-arm64@4.30.1": + version "4.30.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.30.1.tgz#29448cb1370cf678b50743d2e392be18470abc23" + integrity sha512-r7FQIXD7gB0WJ5mokTUgUWPl0eYIH0wnxqeSAhuIwvnnpjdVB8cRRClyKLQr7lgzjctkbp5KmswWszlwYln03Q== + +"@rollup/rollup-darwin-x64@4.30.1": + version "4.30.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.30.1.tgz#0ca99741c3ed096700557a43bb03359450c7857d" + integrity sha512-x78BavIwSH6sqfP2xeI1hd1GpHL8J4W2BXcVM/5KYKoAD3nNsfitQhvWSw+TFtQTLZ9OmlF+FEInEHyubut2OA== + +"@rollup/rollup-freebsd-arm64@4.30.1": + version "4.30.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.30.1.tgz#233f8e4c2f54ad9b719cd9645887dcbd12b38003" + integrity sha512-HYTlUAjbO1z8ywxsDFWADfTRfTIIy/oUlfIDmlHYmjUP2QRDTzBuWXc9O4CXM+bo9qfiCclmHk1x4ogBjOUpUQ== + +"@rollup/rollup-freebsd-x64@4.30.1": + version "4.30.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.30.1.tgz#dfba762a023063dc901610722995286df4a48360" + integrity sha512-1MEdGqogQLccphhX5myCJqeGNYTNcmTyaic9S7CG3JhwuIByJ7J05vGbZxsizQthP1xpVx7kd3o31eOogfEirw== + +"@rollup/rollup-linux-arm-gnueabihf@4.30.1": + version "4.30.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.30.1.tgz#b9da54171726266c5ef4237f462a85b3c3cf6ac9" + integrity sha512-PaMRNBSqCx7K3Wc9QZkFx5+CX27WFpAMxJNiYGAXfmMIKC7jstlr32UhTgK6T07OtqR+wYlWm9IxzennjnvdJg== + +"@rollup/rollup-linux-arm-musleabihf@4.30.1": + version "4.30.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.30.1.tgz#b9db69b3f85f5529eb992936d8f411ee6d04297b" + integrity sha512-B8Rcyj9AV7ZlEFqvB5BubG5iO6ANDsRKlhIxySXcF1axXYUyqwBok+XZPgIYGBgs7LDXfWfifxhw0Ik57T0Yug== + +"@rollup/rollup-linux-arm64-gnu@4.30.1": + version "4.30.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.30.1.tgz#2550cf9bb4d47d917fd1ab4af756d7bbc3ee1528" + integrity sha512-hqVyueGxAj3cBKrAI4aFHLV+h0Lv5VgWZs9CUGqr1z0fZtlADVV1YPOij6AhcK5An33EXaxnDLmJdQikcn5NEw== + +"@rollup/rollup-linux-arm64-musl@4.30.1": + version "4.30.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.30.1.tgz#9d06b26d286c7dded6336961a2f83e48330e0c80" + integrity sha512-i4Ab2vnvS1AE1PyOIGp2kXni69gU2DAUVt6FSXeIqUCPIR3ZlheMW3oP2JkukDfu3PsexYRbOiJrY+yVNSk9oA== + +"@rollup/rollup-linux-loongarch64-gnu@4.30.1": + version "4.30.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.30.1.tgz#e957bb8fee0c8021329a34ca8dfa825826ee0e2e" + integrity sha512-fARcF5g296snX0oLGkVxPmysetwUk2zmHcca+e9ObOovBR++9ZPOhqFUM61UUZ2EYpXVPN1redgqVoBB34nTpQ== + +"@rollup/rollup-linux-powerpc64le-gnu@4.30.1": + version "4.30.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.30.1.tgz#e8585075ddfb389222c5aada39ea62d6d2511ccc" + integrity sha512-GLrZraoO3wVT4uFXh67ElpwQY0DIygxdv0BNW9Hkm3X34wu+BkqrDrkcsIapAY+N2ATEbvak0XQ9gxZtCIA5Rw== + +"@rollup/rollup-linux-riscv64-gnu@4.30.1": + version "4.30.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.30.1.tgz#7d0d40cee7946ccaa5a4e19a35c6925444696a9e" + integrity sha512-0WKLaAUUHKBtll0wvOmh6yh3S0wSU9+yas923JIChfxOaaBarmb/lBKPF0w/+jTVozFnOXJeRGZ8NvOxvk/jcw== + +"@rollup/rollup-linux-s390x-gnu@4.30.1": + version "4.30.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.30.1.tgz#c2dcd8a4b08b2f2778eceb7a5a5dfde6240ebdea" + integrity sha512-GWFs97Ruxo5Bt+cvVTQkOJ6TIx0xJDD/bMAOXWJg8TCSTEK8RnFeOeiFTxKniTc4vMIaWvCplMAFBt9miGxgkA== + +"@rollup/rollup-linux-x64-gnu@4.30.1": + version "4.30.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.30.1.tgz#183637d91456877cb83d0a0315eb4788573aa588" + integrity sha512-UtgGb7QGgXDIO+tqqJ5oZRGHsDLO8SlpE4MhqpY9Llpzi5rJMvrK6ZGhsRCST2abZdBqIBeXW6WPD5fGK5SDwg== + +"@rollup/rollup-linux-x64-musl@4.30.1": + version "4.30.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.30.1.tgz#036a4c860662519f1f9453807547fd2a11d5bb01" + integrity sha512-V9U8Ey2UqmQsBT+xTOeMzPzwDzyXmnAoO4edZhL7INkwQcaW1Ckv3WJX3qrrp/VHaDkEWIBWhRwP47r8cdrOow== + +"@rollup/rollup-win32-arm64-msvc@4.30.1": + version "4.30.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.30.1.tgz#51cad812456e616bfe4db5238fb9c7497e042a52" + integrity sha512-WabtHWiPaFF47W3PkHnjbmWawnX/aE57K47ZDT1BXTS5GgrBUEpvOzq0FI0V/UYzQJgdb8XlhVNH8/fwV8xDjw== + +"@rollup/rollup-win32-ia32-msvc@4.30.1": + version "4.30.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.30.1.tgz#661c8b3e4cd60f51deaa39d153aac4566e748e5e" + integrity sha512-pxHAU+Zv39hLUTdQQHUVHf4P+0C47y/ZloorHpzs2SXMRqeAWmGghzAhfOlzFHHwjvgokdFAhC4V+6kC1lRRfw== + +"@rollup/rollup-win32-x64-msvc@4.30.1": + version "4.30.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.30.1.tgz#73bf1885ff052b82fbb0f82f8671f73c36e9137c" + integrity sha512-D6qjsXGcvhTjv0kI4fU8tUuBDF/Ueee4SVX79VfNDXZa64TfCW1Slkb6Z7O1p7vflqZjcmOVdZlqf8gvJxc6og== + +"@rtsao/scc@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@rtsao/scc/-/scc-1.1.0.tgz#927dd2fae9bc3361403ac2c7a00c32ddce9ad7e8" + integrity sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g== -"@polkadot/x-textdecoder@12.6.2": - version "12.6.2" - resolved "https://registry.yarnpkg.com/@polkadot/x-textdecoder/-/x-textdecoder-12.6.2.tgz#b86da0f8e8178f1ca31a7158257e92aea90b10e4" - integrity sha512-M1Bir7tYvNappfpFWXOJcnxUhBUFWkUFIdJSyH0zs5LmFtFdbKAeiDXxSp2Swp5ddOZdZgPac294/o2TnQKN1w== - dependencies: - "@polkadot/x-global" "12.6.2" - tslib "^2.6.2" +"@scure/base@^1.1.1", "@scure/base@^1.1.7": + version "1.2.1" + resolved "https://registry.yarnpkg.com/@scure/base/-/base-1.2.1.tgz#dd0b2a533063ca612c17aa9ad26424a2ff5aa865" + integrity sha512-DGmGtC8Tt63J5GfHgfl5CuAXh96VF/LD8K9Hr/Gv0J2lAoRGlPOMpqMpMbCTOoOJMZCk2Xt+DskdDyn6dEFdzQ== -"@polkadot/x-textencoder@12.6.2": - version "12.6.2" - resolved "https://registry.yarnpkg.com/@polkadot/x-textencoder/-/x-textencoder-12.6.2.tgz#81d23bd904a2c36137a395c865c5fefa21abfb44" - integrity sha512-4N+3UVCpI489tUJ6cv3uf0PjOHvgGp9Dl+SZRLgFGt9mvxnvpW/7+XBADRMtlG4xi5gaRK7bgl5bmY6OMDsNdw== - dependencies: - "@polkadot/x-global" "12.6.2" - tslib "^2.6.2" +"@sec-ant/readable-stream@^0.4.1": + version "0.4.1" + resolved "https://registry.yarnpkg.com/@sec-ant/readable-stream/-/readable-stream-0.4.1.tgz#60de891bb126abfdc5410fdc6166aca065f10a0c" + integrity sha512-831qok9r2t8AlxLko40y2ebgSDhenenCatLVeW/uBtnHPyhHOvG0C7TvfgecV+wHzIm5KUICgzmVpWS+IMEAeg== -"@polkadot/x-ws@^12.6.2": - version "12.6.2" - resolved "https://registry.yarnpkg.com/@polkadot/x-ws/-/x-ws-12.6.2.tgz#b99094d8e53a03be1de903d13ba59adaaabc767a" - integrity sha512-cGZWo7K5eRRQCRl2LrcyCYsrc3lRbTlixZh3AzgU8uX4wASVGRlNWi/Hf4TtHNe1ExCDmxabJzdIsABIfrr7xw== - dependencies: - "@polkadot/x-global" "12.6.2" - tslib "^2.6.2" - ws "^8.15.1" - -"@rollup/rollup-android-arm-eabi@4.13.0": - version "4.13.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.13.0.tgz#b98786c1304b4ff8db3a873180b778649b5dff2b" - integrity sha512-5ZYPOuaAqEH/W3gYsRkxQATBW3Ii1MfaT4EQstTnLKViLi2gLSQmlmtTpGucNP3sXEpOiI5tdGhjdE111ekyEg== - -"@rollup/rollup-android-arm64@4.13.0": - version "4.13.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.13.0.tgz#8833679af11172b1bf1ab7cb3bad84df4caf0c9e" - integrity sha512-BSbaCmn8ZadK3UAQdlauSvtaJjhlDEjS5hEVVIN3A4bbl3X+otyf/kOJV08bYiRxfejP3DXFzO2jz3G20107+Q== - -"@rollup/rollup-darwin-arm64@4.13.0": - version "4.13.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.13.0.tgz#ef02d73e0a95d406e0eb4fd61a53d5d17775659b" - integrity sha512-Ovf2evVaP6sW5Ut0GHyUSOqA6tVKfrTHddtmxGQc1CTQa1Cw3/KMCDEEICZBbyppcwnhMwcDce9ZRxdWRpVd6g== - -"@rollup/rollup-darwin-x64@4.13.0": - version "4.13.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.13.0.tgz#3ce5b9bcf92b3341a5c1c58a3e6bcce0ea9e7455" - integrity sha512-U+Jcxm89UTK592vZ2J9st9ajRv/hrwHdnvyuJpa5A2ngGSVHypigidkQJP+YiGL6JODiUeMzkqQzbCG3At81Gg== - -"@rollup/rollup-linux-arm-gnueabihf@4.13.0": - version "4.13.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.13.0.tgz#3d3d2c018bdd8e037c6bfedd52acfff1c97e4be4" - integrity sha512-8wZidaUJUTIR5T4vRS22VkSMOVooG0F4N+JSwQXWSRiC6yfEsFMLTYRFHvby5mFFuExHa/yAp9juSphQQJAijQ== - -"@rollup/rollup-linux-arm64-gnu@4.13.0": - version "4.13.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.13.0.tgz#5fc8cc978ff396eaa136d7bfe05b5b9138064143" - integrity sha512-Iu0Kno1vrD7zHQDxOmvweqLkAzjxEVqNhUIXBsZ8hu8Oak7/5VTPrxOEZXYC1nmrBVJp0ZcL2E7lSuuOVaE3+w== - -"@rollup/rollup-linux-arm64-musl@4.13.0": - version "4.13.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.13.0.tgz#f2ae7d7bed416ffa26d6b948ac5772b520700eef" - integrity sha512-C31QrW47llgVyrRjIwiOwsHFcaIwmkKi3PCroQY5aVq4H0A5v/vVVAtFsI1nfBngtoRpeREvZOkIhmRwUKkAdw== - -"@rollup/rollup-linux-riscv64-gnu@4.13.0": - version "4.13.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.13.0.tgz#303d57a328ee9a50c85385936f31cf62306d30b6" - integrity sha512-Oq90dtMHvthFOPMl7pt7KmxzX7E71AfyIhh+cPhLY9oko97Zf2C9tt/XJD4RgxhaGeAraAXDtqxvKE1y/j35lA== - -"@rollup/rollup-linux-x64-gnu@4.13.0": - version "4.13.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.13.0.tgz#f672f6508f090fc73f08ba40ff76c20b57424778" - integrity sha512-yUD/8wMffnTKuiIsl6xU+4IA8UNhQ/f1sAnQebmE/lyQ8abjsVyDkyRkWop0kdMhKMprpNIhPmYlCxgHrPoXoA== - -"@rollup/rollup-linux-x64-musl@4.13.0": - version "4.13.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.13.0.tgz#d2f34b1b157f3e7f13925bca3288192a66755a89" - integrity sha512-9RyNqoFNdF0vu/qqX63fKotBh43fJQeYC98hCaf89DYQpv+xu0D8QFSOS0biA7cGuqJFOc1bJ+m2rhhsKcw1hw== - -"@rollup/rollup-win32-arm64-msvc@4.13.0": - version "4.13.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.13.0.tgz#8ffecc980ae4d9899eb2f9c4ae471a8d58d2da6b" - integrity sha512-46ue8ymtm/5PUU6pCvjlic0z82qWkxv54GTJZgHrQUuZnVH+tvvSP0LsozIDsCBFO4VjJ13N68wqrKSeScUKdA== - -"@rollup/rollup-win32-ia32-msvc@4.13.0": - version "4.13.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.13.0.tgz#a7505884f415662e088365b9218b2b03a88fc6f2" - integrity sha512-P5/MqLdLSlqxbeuJ3YDeX37srC8mCflSyTrUsgbU1c/U9j6l2g2GiIdYaGD9QjdMQPMSgYm7hgg0551wHyIluw== - -"@rollup/rollup-win32-x64-msvc@4.13.0": - version "4.13.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.13.0.tgz#6abd79db7ff8d01a58865ba20a63cfd23d9e2a10" - integrity sha512-UKXUQNbO3DOhzLRwHSpa0HnhhCgNODvfoPWv2FCXme8N/ANFfhIPMGuOT+QuKd16+B5yxZ0HdpNlqPvTMS1qfw== - -"@scure/base@^1.1.1", "@scure/base@^1.1.5": - version "1.1.7" - resolved "https://registry.yarnpkg.com/@scure/base/-/base-1.1.7.tgz#fe973311a5c6267846aa131bc72e96c5d40d2b30" - integrity sha512-PPNYBslrLNNUQ/Yad37MHYsNQtK67EhWb6WtSvNLLPo7SdVZgkUjD6Dg+5On7zNwmskf8OX7I7Nx5oN+MIWE0g== - -"@sinclair/typebox@^0.27.8": - version "0.27.8" - resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.27.8.tgz#6667fac16c436b5434a387a34dedb013198f6e6e" - integrity sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA== +"@sindresorhus/merge-streams@^4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@sindresorhus/merge-streams/-/merge-streams-4.0.0.tgz#abb11d99aeb6d27f1b563c38147a72d50058e339" + integrity sha512-tlqY9xq5ukxTUZBmoOp+m61cqwQD5pHJtFY3Mn8CA8ps6yghLH/Hw8UPdqg4OLmFW3IFlcXnQNmo/dh8HzXYIQ== "@sqltools/formatter@^1.2.5": version "1.2.5" @@ -1180,112 +978,59 @@ integrity sha512-Uy0+khmZqUrUGm5dmMqVlnvufZRSK0FbYzVgp0UMstm+F5+W2/jnEEQyc9vo1ZR/E5ZI/B1WjjoTqBqwJL6Krw== "@substrate/connect-extension-protocol@^2.0.0": - version "2.0.0" - resolved "https://registry.yarnpkg.com/@substrate/connect-extension-protocol/-/connect-extension-protocol-2.0.0.tgz#badaa6e6b5f7c7d56987d778f4944ddb83cd9ea7" - integrity sha512-nKu8pDrE3LNCEgJjZe1iGXzaD6OSIDD4Xzz/yo4KO9mQ6LBvf49BVrt4qxBFGL6++NneLiWUZGoh+VSd4PyVIg== - -"@substrate/connect-known-chains@^1.1.1": - version "1.1.6" - resolved "https://registry.yarnpkg.com/@substrate/connect-known-chains/-/connect-known-chains-1.1.6.tgz#2627d329b82b46c7d745752c48c73e1b8ce6ac81" - integrity sha512-JwtdGbnK3ZqrY1qp3Ifr/p648sp9hG0Q715h4nRghnqZJnMQIiLKaFkcLnvrAiYQD3zNTYDztHidy5Q/u0TcbQ== - -"@substrate/connect-known-chains@^1.1.4": - version "1.1.8" - resolved "https://registry.yarnpkg.com/@substrate/connect-known-chains/-/connect-known-chains-1.1.8.tgz#ab54100c9fd102212b819231477393adc435e83a" - integrity sha512-W0Cpnk//LoMTu5BGDCRRg5NHFR2aZ9OJtLGSgRyq1RP39dQGpoVZIgNC6z+SWRzlmOz3gIgkUCwGvOKVt2BabA== + version "2.2.1" + resolved "https://registry.yarnpkg.com/@substrate/connect-extension-protocol/-/connect-extension-protocol-2.2.1.tgz#f36ae92166bdd5e4c55f8cdf149ab238f95eb26b" + integrity sha512-GoafTgm/Jey9E4Xlj4Z5ZBt/H4drH2CNq8VrAro80rtoznrXnFDNVivLQzZN0Xaj2g8YXSn9pC9Oc9IovYZJXw== -"@substrate/connect@0.8.10": - version "0.8.10" - resolved "https://registry.yarnpkg.com/@substrate/connect/-/connect-0.8.10.tgz#810b6589f848828aa840c731a1f36b84fe0e5956" - integrity sha512-DIyQ13DDlXqVFnLV+S6/JDgiGowVRRrh18kahieJxhgvzcWicw5eLc6jpfQ0moVVLBYkO7rctB5Wreldwpva8w== - dependencies: - "@substrate/connect-extension-protocol" "^2.0.0" - "@substrate/connect-known-chains" "^1.1.4" - "@substrate/light-client-extension-helpers" "^0.0.6" - smoldot "2.0.22" +"@substrate/connect-known-chains@^1.1.5": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@substrate/connect-known-chains/-/connect-known-chains-1.9.0.tgz#c0878ac2e83bfc2270cbeeaa3cd23596bde0cf84" + integrity sha512-R7yE0kIRUnvNlMiYramQ+dQwSY0ZpqRJ1mK8hLKlvCbEMqjSFa0n/WYYG6/bst9nNA1O6OZLWpvMso6yhENe3A== -"@substrate/connect@0.8.8": - version "0.8.8" - resolved "https://registry.yarnpkg.com/@substrate/connect/-/connect-0.8.8.tgz#80879f2241e2bd4f24a9aa25d7997fd91a5e68e3" - integrity sha512-zwaxuNEVI9bGt0rT8PEJiXOyebLIo6QN1SyiAHRPBOl6g3Sy0KKdSN8Jmyn++oXhVRD8aIe75/V8ZkS81T+BPQ== +"@substrate/connect@0.8.11": + version "0.8.11" + resolved "https://registry.yarnpkg.com/@substrate/connect/-/connect-0.8.11.tgz#983ec69a05231636e217b573b8130a6b942af69f" + integrity sha512-ofLs1PAO9AtDdPbdyTYj217Pe+lBfTLltdHDs3ds8no0BseoLeAGxpz1mHfi7zB4IxI3YyAiLjH6U8cw4pj4Nw== dependencies: "@substrate/connect-extension-protocol" "^2.0.0" - "@substrate/connect-known-chains" "^1.1.1" - "@substrate/light-client-extension-helpers" "^0.0.4" - smoldot "2.0.22" - -"@substrate/light-client-extension-helpers@^0.0.4": - version "0.0.4" - resolved "https://registry.yarnpkg.com/@substrate/light-client-extension-helpers/-/light-client-extension-helpers-0.0.4.tgz#a5958d5c1aac7df69f55bd90991aa935500f8124" - integrity sha512-vfKcigzL0SpiK+u9sX6dq2lQSDtuFLOxIJx2CKPouPEHIs8C+fpsufn52r19GQn+qDhU8POMPHOVoqLktj8UEA== - dependencies: - "@polkadot-api/client" "0.0.1-492c132563ea6b40ae1fc5470dec4cd18768d182.1.0" - "@polkadot-api/json-rpc-provider" "0.0.1-492c132563ea6b40ae1fc5470dec4cd18768d182.1.0" - "@polkadot-api/json-rpc-provider-proxy" "0.0.1-492c132563ea6b40ae1fc5470dec4cd18768d182.1.0" - "@polkadot-api/substrate-client" "0.0.1-492c132563ea6b40ae1fc5470dec4cd18768d182.1.0" - "@substrate/connect-extension-protocol" "^2.0.0" - "@substrate/connect-known-chains" "^1.1.1" - rxjs "^7.8.1" + "@substrate/connect-known-chains" "^1.1.5" + "@substrate/light-client-extension-helpers" "^1.0.0" + smoldot "2.0.26" -"@substrate/light-client-extension-helpers@^0.0.6": - version "0.0.6" - resolved "https://registry.yarnpkg.com/@substrate/light-client-extension-helpers/-/light-client-extension-helpers-0.0.6.tgz#bec1c7997241226db50b44ad85a992b4348d21c3" - integrity sha512-girltEuxQ1BvkJWmc8JJlk4ZxnlGXc/wkLcNguhY+UoDEMBK0LsdtfzQKIfrIehi4QdeSBlFEFBoI4RqPmsZzA== +"@substrate/light-client-extension-helpers@^1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@substrate/light-client-extension-helpers/-/light-client-extension-helpers-1.0.0.tgz#7b60368c57e06e5cf798c6557422d12e6d81f1ff" + integrity sha512-TdKlni1mBBZptOaeVrKnusMg/UBpWUORNDv5fdCaJklP4RJiFOzBCrzC+CyVI5kQzsXBisZ+2pXm+rIjS38kHg== dependencies: - "@polkadot-api/json-rpc-provider" "0.0.1" - "@polkadot-api/json-rpc-provider-proxy" "0.0.1" - "@polkadot-api/observable-client" "0.1.0" - "@polkadot-api/substrate-client" "0.0.1" + "@polkadot-api/json-rpc-provider" "^0.0.1" + "@polkadot-api/json-rpc-provider-proxy" "^0.1.0" + "@polkadot-api/observable-client" "^0.3.0" + "@polkadot-api/substrate-client" "^0.1.2" "@substrate/connect-extension-protocol" "^2.0.0" - "@substrate/connect-known-chains" "^1.1.4" + "@substrate/connect-known-chains" "^1.1.5" rxjs "^7.8.1" -"@substrate/ss58-registry@^1.44.0": - version "1.48.0" - resolved "https://registry.yarnpkg.com/@substrate/ss58-registry/-/ss58-registry-1.48.0.tgz#b50b577b491274dbab55711d2e933456637e73d0" - integrity sha512-lE9TGgtd93fTEIoHhSdtvSFBoCsvTbqiCvQIMvX4m6BO/hESywzzTzTFMVP1doBwDDMAN4lsMfIM3X3pdmt7kQ== +"@substrate/ss58-registry@^1.51.0": + version "1.51.0" + resolved "https://registry.yarnpkg.com/@substrate/ss58-registry/-/ss58-registry-1.51.0.tgz#39e0341eb4069c2d3e684b93f0d8cb0bec572383" + integrity sha512-TWDurLiPxndFgKjVavCniytBIw+t4ViOi7TYp9h/D0NMmkEc9klFTo+827eyEJ0lELpqO207Ey7uGxUa+BS1jQ== "@tootallnate/once@1": version "1.1.2" resolved "https://registry.yarnpkg.com/@tootallnate/once/-/once-1.1.2.tgz#ccb91445360179a04e7fe6aff78c00ffc1eeaf82" integrity sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw== -"@tsconfig/node10@^1.0.7": - version "1.0.10" - resolved "https://registry.yarnpkg.com/@tsconfig/node10/-/node10-1.0.10.tgz#b7ebd3adfa7750628d100594f6726b054d2c33b2" - integrity sha512-PiaIWIoPvO6qm6t114ropMCagj6YAF24j9OkCA2mJDXFnlionEwhsBCJ8yek4aib575BI3OkART/90WsgHgLWw== - -"@tsconfig/node12@^1.0.7": - version "1.0.11" - resolved "https://registry.yarnpkg.com/@tsconfig/node12/-/node12-1.0.11.tgz#ee3def1f27d9ed66dac6e46a295cffb0152e058d" - integrity sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag== - -"@tsconfig/node14@^1.0.0": - version "1.0.3" - resolved "https://registry.yarnpkg.com/@tsconfig/node14/-/node14-1.0.3.tgz#e4386316284f00b98435bf40f72f75a09dabf6c1" - integrity sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow== - -"@tsconfig/node16@^1.0.2": - version "1.0.4" - resolved "https://registry.yarnpkg.com/@tsconfig/node16/-/node16-1.0.4.tgz#0b92dcc0cc1c81f6f306a381f28e31b1a56536e9" - integrity sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA== - -"@types/bn.js@^5.1.5": - version "5.1.5" - resolved "https://registry.yarnpkg.com/@types/bn.js/-/bn.js-5.1.5.tgz#2e0dacdcce2c0f16b905d20ff87aedbc6f7b4bf0" - integrity sha512-V46N0zwKRF5Q00AZ6hWtN0T8gGmDUaUzLWQvHFo5yThtVwK/VCenFY3wXVbOvNfajEpsTfQM4IN9k/d6gUVX3A== +"@types/bn.js@^5.1.6": + version "5.1.6" + resolved "https://registry.yarnpkg.com/@types/bn.js/-/bn.js-5.1.6.tgz#9ba818eec0c85e4d3c679518428afdf611d03203" + integrity sha512-Xh8vSwUeMKeYYrj3cX4lGQgFSF/N03r+tv4AiLl1SucqV+uTQpxRcnM8AkXKHwYP9ZPXOYXRr2KPXpVlIvqh9w== dependencies: "@types/node" "*" -"@types/estree@1.0.5", "@types/estree@^1.0.0": - version "1.0.5" - resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.5.tgz#a6ce3e556e00fd9895dd872dd172ad0d4bd687f4" - integrity sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw== - -"@types/json-schema@^7.0.15": - version "7.0.15" - resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.15.tgz#596a1747233694d50f6ad8a7869fcb6f56cf5841" - integrity sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA== +"@types/estree@1.0.6", "@types/estree@^1.0.0": + version "1.0.6" + resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.6.tgz#628effeeae2064a1b4e79f78e81d87b7e5fc7b50" + integrity sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw== "@types/json5@^0.0.29": version "0.0.29" @@ -1293,39 +1038,32 @@ integrity sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ== "@types/node@*": - version "20.14.7" - resolved "https://registry.yarnpkg.com/@types/node/-/node-20.14.7.tgz#342cada27f97509eb8eb2dbc003edf21ce8ab5a8" - integrity sha512-uTr2m2IbJJucF3KUxgnGOZvYbN0QgkGyWxG6973HCpMYFy2KfcgYuIwkJQMQkt1VbBMlvWRbpshFTLxnxCZjKQ== + version "22.10.5" + resolved "https://registry.yarnpkg.com/@types/node/-/node-22.10.5.tgz#95af89a3fb74a2bb41ef9927f206e6472026e48b" + integrity sha512-F8Q+SeGimwOo86fiovQh8qiXfFEh2/ocYv7tU5pJ3EXMSSxk1Joj5wefpFK2fHTf/N6HKGSxIDBT9f3gCxXPkQ== dependencies: - undici-types "~5.26.4" + undici-types "~6.20.0" "@types/node@^20.11.30": - version "20.11.30" - resolved "https://registry.yarnpkg.com/@types/node/-/node-20.11.30.tgz#9c33467fc23167a347e73834f788f4b9f399d66f" - integrity sha512-dHM6ZxwlmuZaRmUPfv1p+KrdD1Dci04FbdEm/9wEMouFqxYoFl5aMkt0VMAUtYRQDyYvD41WJLukhq/ha3YuTw== + version "20.17.12" + resolved "https://registry.yarnpkg.com/@types/node/-/node-20.17.12.tgz#ee3b7d25a522fd95608c1b3f02921c97b93fcbd6" + integrity sha512-vo/wmBgMIiEA23A/knMfn/cf37VnuF52nZh5ZoW0GWt4e4sxNquibrMRJ7UQsA06+MBx9r/H1jsI9grYjQCQlw== dependencies: - undici-types "~5.26.4" - -"@types/semver@^7.5.8": - version "7.5.8" - resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.5.8.tgz#8268a8c57a3e4abd25c165ecd36237db7948a55e" - integrity sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ== + undici-types "~6.19.2" "@typescript-eslint/eslint-plugin@^7.7.0": - version "7.7.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.7.0.tgz#bf34a02f221811505b8bf2f31060c8560c1bb0a3" - integrity sha512-GJWR0YnfrKnsRoluVO3PRb9r5aMZriiMMM/RHj5nnTrBy1/wIgk76XCtCKcnXGjpZQJQRFtGV9/0JJ6n30uwpQ== + version "7.18.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.18.0.tgz#b16d3cf3ee76bf572fdf511e79c248bdec619ea3" + integrity sha512-94EQTWZ40mzBc42ATNIBimBEDltSJ9RQHCC8vc/PDbxi4k8dVwUAv4o98dk50M1zB+JGFxp43FP7f8+FP8R6Sw== dependencies: "@eslint-community/regexpp" "^4.10.0" - "@typescript-eslint/scope-manager" "7.7.0" - "@typescript-eslint/type-utils" "7.7.0" - "@typescript-eslint/utils" "7.7.0" - "@typescript-eslint/visitor-keys" "7.7.0" - debug "^4.3.4" + "@typescript-eslint/scope-manager" "7.18.0" + "@typescript-eslint/type-utils" "7.18.0" + "@typescript-eslint/utils" "7.18.0" + "@typescript-eslint/visitor-keys" "7.18.0" graphemer "^1.4.0" ignore "^5.3.1" natural-compare "^1.4.0" - semver "^7.6.0" ts-api-utils "^1.3.0" "@typescript-eslint/parser@^6.4.0": @@ -1340,14 +1078,14 @@ debug "^4.3.4" "@typescript-eslint/parser@^7.7.0": - version "7.7.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-7.7.0.tgz#6b1b3ce76c5de002c43af8ae933613b0f2b4bcc6" - integrity sha512-fNcDm3wSwVM8QYL4HKVBggdIPAy9Q41vcvC/GtDobw3c4ndVT3K6cqudUmjHPw8EAp4ufax0o58/xvWaP2FmTg== - dependencies: - "@typescript-eslint/scope-manager" "7.7.0" - "@typescript-eslint/types" "7.7.0" - "@typescript-eslint/typescript-estree" "7.7.0" - "@typescript-eslint/visitor-keys" "7.7.0" + version "7.18.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-7.18.0.tgz#83928d0f1b7f4afa974098c64b5ce6f9051f96a0" + integrity sha512-4Z+L8I2OqhZV8qA132M4wNL30ypZGYOQVBfMgxDH/K5UX0PNqTu1c6za9ST5r9+tavvHiTWmBnKzpCJ/GlVFtg== + dependencies: + "@typescript-eslint/scope-manager" "7.18.0" + "@typescript-eslint/types" "7.18.0" + "@typescript-eslint/typescript-estree" "7.18.0" + "@typescript-eslint/visitor-keys" "7.18.0" debug "^4.3.4" "@typescript-eslint/scope-manager@6.21.0": @@ -1358,21 +1096,21 @@ "@typescript-eslint/types" "6.21.0" "@typescript-eslint/visitor-keys" "6.21.0" -"@typescript-eslint/scope-manager@7.7.0": - version "7.7.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-7.7.0.tgz#3f0db079b275bb8b0cb5be7613fb3130cfb5de77" - integrity sha512-/8INDn0YLInbe9Wt7dK4cXLDYp0fNHP5xKLHvZl3mOT5X17rK/YShXaiNmorl+/U4VKCVIjJnx4Ri5b0y+HClw== +"@typescript-eslint/scope-manager@7.18.0": + version "7.18.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-7.18.0.tgz#c928e7a9fc2c0b3ed92ab3112c614d6bd9951c83" + integrity sha512-jjhdIE/FPF2B7Z1uzc6i3oWKbGcHb87Qw7AWj6jmEqNOfDFbJWtjt/XfwCpvNkpGWlcJaog5vTR+VV8+w9JflA== dependencies: - "@typescript-eslint/types" "7.7.0" - "@typescript-eslint/visitor-keys" "7.7.0" + "@typescript-eslint/types" "7.18.0" + "@typescript-eslint/visitor-keys" "7.18.0" -"@typescript-eslint/type-utils@7.7.0": - version "7.7.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-7.7.0.tgz#36792ff4209a781b058de61631a48df17bdefbc5" - integrity sha512-bOp3ejoRYrhAlnT/bozNQi3nio9tIgv3U5C0mVDdZC7cpcQEDZXvq8inrHYghLVwuNABRqrMW5tzAv88Vy77Sg== +"@typescript-eslint/type-utils@7.18.0": + version "7.18.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-7.18.0.tgz#2165ffaee00b1fbbdd2d40aa85232dab6998f53b" + integrity sha512-XL0FJXuCLaDuX2sYqZUUSOJ2sG5/i1AAze+axqmLnSkNEVMVYLF+cbwlB2w8D1tinFuSikHmFta+P+HOofrLeA== dependencies: - "@typescript-eslint/typescript-estree" "7.7.0" - "@typescript-eslint/utils" "7.7.0" + "@typescript-eslint/typescript-estree" "7.18.0" + "@typescript-eslint/utils" "7.18.0" debug "^4.3.4" ts-api-utils "^1.3.0" @@ -1381,10 +1119,10 @@ resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-6.21.0.tgz#205724c5123a8fef7ecd195075fa6e85bac3436d" integrity sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg== -"@typescript-eslint/types@7.7.0": - version "7.7.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-7.7.0.tgz#23af4d24bf9ce15d8d301236e3e3014143604f27" - integrity sha512-G01YPZ1Bd2hn+KPpIbrAhEWOn5lQBrjxkzHkWvP6NucMXFtfXoevK82hzQdpfuQYuhkvFDeQYbzXCjR1z9Z03w== +"@typescript-eslint/types@7.18.0": + version "7.18.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-7.18.0.tgz#b90a57ccdea71797ffffa0321e744f379ec838c9" + integrity sha512-iZqi+Ds1y4EDYUtlOOC+aUmxnE9xS/yCigkjA7XpTKV6nCBd3Hp/PRGGmdwnfkV2ThMyYldP1wRpm/id99spTQ== "@typescript-eslint/typescript-estree@6.21.0": version "6.21.0" @@ -1400,13 +1138,13 @@ semver "^7.5.4" ts-api-utils "^1.0.1" -"@typescript-eslint/typescript-estree@7.7.0": - version "7.7.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-7.7.0.tgz#b5dd6383b4c6a852d7b256a37af971e8982be97f" - integrity sha512-8p71HQPE6CbxIBy2kWHqM1KGrC07pk6RJn40n0DSc6bMOBBREZxSDJ+BmRzc8B5OdaMh1ty3mkuWRg4sCFiDQQ== +"@typescript-eslint/typescript-estree@7.18.0": + version "7.18.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-7.18.0.tgz#b5868d486c51ce8f312309ba79bdb9f331b37931" + integrity sha512-aP1v/BSPnnyhMHts8cf1qQ6Q1IFwwRvAQGRvBFkWlo3/lH29OXA3Pts+c10nxRxIBrDnoMqzhgdwVe5f2D6OzA== dependencies: - "@typescript-eslint/types" "7.7.0" - "@typescript-eslint/visitor-keys" "7.7.0" + "@typescript-eslint/types" "7.18.0" + "@typescript-eslint/visitor-keys" "7.18.0" debug "^4.3.4" globby "^11.1.0" is-glob "^4.0.3" @@ -1414,18 +1152,15 @@ semver "^7.6.0" ts-api-utils "^1.3.0" -"@typescript-eslint/utils@7.7.0": - version "7.7.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-7.7.0.tgz#3d2b6606a60ac34f3c625facfb3b3ab7e126f58d" - integrity sha512-LKGAXMPQs8U/zMRFXDZOzmMKgFv3COlxUQ+2NMPhbqgVm6R1w+nU1i4836Pmxu9jZAuIeyySNrN/6Rc657ggig== +"@typescript-eslint/utils@7.18.0": + version "7.18.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-7.18.0.tgz#bca01cde77f95fc6a8d5b0dbcbfb3d6ca4be451f" + integrity sha512-kK0/rNa2j74XuHVcoCZxdFBMF+aq/vH83CXAOHieC+2Gis4mF8jJXT5eAfyD3K0sAxtPuwxaIOIOvhwzVDt/kw== dependencies: "@eslint-community/eslint-utils" "^4.4.0" - "@types/json-schema" "^7.0.15" - "@types/semver" "^7.5.8" - "@typescript-eslint/scope-manager" "7.7.0" - "@typescript-eslint/types" "7.7.0" - "@typescript-eslint/typescript-estree" "7.7.0" - semver "^7.6.0" + "@typescript-eslint/scope-manager" "7.18.0" + "@typescript-eslint/types" "7.18.0" + "@typescript-eslint/typescript-estree" "7.18.0" "@typescript-eslint/visitor-keys@6.21.0": version "6.21.0" @@ -1435,62 +1170,90 @@ "@typescript-eslint/types" "6.21.0" eslint-visitor-keys "^3.4.1" -"@typescript-eslint/visitor-keys@7.7.0": - version "7.7.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-7.7.0.tgz#950148cf1ac11562a2d903fdf7acf76714a2dc9e" - integrity sha512-h0WHOj8MhdhY8YWkzIF30R379y0NqyOHExI9N9KCzvmu05EgG4FumeYa3ccfKUSphyWkWQE1ybVrgz/Pbam6YA== +"@typescript-eslint/visitor-keys@7.18.0": + version "7.18.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-7.18.0.tgz#0564629b6124d67607378d0f0332a0495b25e7d7" + integrity sha512-cDF0/Gf81QpY3xYyJKDV14Zwdmid5+uuENhjH2EqFaF0ni+yAyq/LzMaIJdhNJXZI7uLzwIlA+V7oWoyn6Curg== dependencies: - "@typescript-eslint/types" "7.7.0" + "@typescript-eslint/types" "7.18.0" eslint-visitor-keys "^3.4.3" "@ungap/structured-clone@^1.2.0": - version "1.2.0" - resolved "https://registry.yarnpkg.com/@ungap/structured-clone/-/structured-clone-1.2.0.tgz#756641adb587851b5ccb3e095daf27ae581c8406" - integrity sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ== + version "1.2.1" + resolved "https://registry.yarnpkg.com/@ungap/structured-clone/-/structured-clone-1.2.1.tgz#28fa185f67daaf7b7a1a8c1d445132c5d979f8bd" + integrity sha512-fEzPV3hSkSMltkw152tJKNARhOupqbH96MZWyRjNaYZOMIzbrTeQDG+MTc6Mr2pgzFQzFxAfmhGDNP5QK++2ZA== -"@vitest/expect@1.4.0": - version "1.4.0" - resolved "https://registry.yarnpkg.com/@vitest/expect/-/expect-1.4.0.tgz#d64e17838a20007fecd252397f9b96a1ca81bfb0" - integrity sha512-Jths0sWCJZ8BxjKe+p+eKsoqev1/T8lYcrjavEaz8auEJ4jAVY0GwW3JKmdVU4mmNPLPHixh4GNXP7GFtAiDHA== +"@vitest/expect@2.1.8": + version "2.1.8" + resolved "https://registry.yarnpkg.com/@vitest/expect/-/expect-2.1.8.tgz#13fad0e8d5a0bf0feb675dcf1d1f1a36a1773bc1" + integrity sha512-8ytZ/fFHq2g4PJVAtDX57mayemKgDR6X3Oa2Foro+EygiOJHUXhCqBAAKQYYajZpFoIfvBCF1j6R6IYRSIUFuw== dependencies: - "@vitest/spy" "1.4.0" - "@vitest/utils" "1.4.0" - chai "^4.3.10" + "@vitest/spy" "2.1.8" + "@vitest/utils" "2.1.8" + chai "^5.1.2" + tinyrainbow "^1.2.0" -"@vitest/runner@1.4.0": - version "1.4.0" - resolved "https://registry.yarnpkg.com/@vitest/runner/-/runner-1.4.0.tgz#907c2d17ad5975b70882c25ab7a13b73e5a28da9" - integrity sha512-EDYVSmesqlQ4RD2VvWo3hQgTJ7ZrFQ2VSJdfiJiArkCerDAGeyF1i6dHkmySqk573jLp6d/cfqCN+7wUB5tLgg== +"@vitest/mocker@2.1.8": + version "2.1.8" + resolved "https://registry.yarnpkg.com/@vitest/mocker/-/mocker-2.1.8.tgz#51dec42ac244e949d20009249e033e274e323f73" + integrity sha512-7guJ/47I6uqfttp33mgo6ga5Gr1VnL58rcqYKyShoRK9ebu8T5Rs6HN3s1NABiBeVTdWNrwUMcHH54uXZBN4zA== dependencies: - "@vitest/utils" "1.4.0" - p-limit "^5.0.0" - pathe "^1.1.1" + "@vitest/spy" "2.1.8" + estree-walker "^3.0.3" + magic-string "^0.30.12" -"@vitest/snapshot@1.4.0": - version "1.4.0" - resolved "https://registry.yarnpkg.com/@vitest/snapshot/-/snapshot-1.4.0.tgz#2945b3fb53767a3f4f421919e93edfef2935b8bd" - integrity sha512-saAFnt5pPIA5qDGxOHxJ/XxhMFKkUSBJmVt5VgDsAqPTX6JP326r5C/c9UuCMPoXNzuudTPsYDZCoJ5ilpqG2A== +"@vitest/pretty-format@2.1.8", "@vitest/pretty-format@^2.1.8": + version "2.1.8" + resolved "https://registry.yarnpkg.com/@vitest/pretty-format/-/pretty-format-2.1.8.tgz#88f47726e5d0cf4ba873d50c135b02e4395e2bca" + integrity sha512-9HiSZ9zpqNLKlbIDRWOnAWqgcA7xu+8YxXSekhr0Ykab7PAYFkhkwoqVArPOtJhPmYeE2YHgKZlj3CP36z2AJQ== dependencies: - magic-string "^0.30.5" - pathe "^1.1.1" - pretty-format "^29.7.0" + tinyrainbow "^1.2.0" -"@vitest/spy@1.4.0": - version "1.4.0" - resolved "https://registry.yarnpkg.com/@vitest/spy/-/spy-1.4.0.tgz#cf953c93ae54885e801cbe6b408a547ae613f26c" - integrity sha512-Ywau/Qs1DzM/8Uc+yA77CwSegizMlcgTJuYGAi0jujOteJOUf1ujunHThYo243KG9nAyWT3L9ifPYZ5+As/+6Q== +"@vitest/runner@2.1.8": + version "2.1.8" + resolved "https://registry.yarnpkg.com/@vitest/runner/-/runner-2.1.8.tgz#b0e2dd29ca49c25e9323ea2a45a5125d8729759f" + integrity sha512-17ub8vQstRnRlIU5k50bG+QOMLHRhYPAna5tw8tYbj+jzjcspnwnwtPtiOlkuKC4+ixDPTuLZiqiWWQ2PSXHVg== dependencies: - tinyspy "^2.2.0" + "@vitest/utils" "2.1.8" + pathe "^1.1.2" -"@vitest/utils@1.4.0": - version "1.4.0" - resolved "https://registry.yarnpkg.com/@vitest/utils/-/utils-1.4.0.tgz#ea6297e0d329f9ff0a106f4e1f6daf3ff6aad3f0" - integrity sha512-mx3Yd1/6e2Vt/PUC98DcqTirtfxUyAZ32uK82r8rZzbtBeBo+nqgnjx/LvqQdWsrvNtm14VmurNgcf4nqY5gJg== +"@vitest/snapshot@2.1.8": + version "2.1.8" + resolved "https://registry.yarnpkg.com/@vitest/snapshot/-/snapshot-2.1.8.tgz#d5dc204f4b95dc8b5e468b455dfc99000047d2de" + integrity sha512-20T7xRFbmnkfcmgVEz+z3AU/3b0cEzZOt/zmnvZEctg64/QZbSDJEVm9fLnnlSi74KibmRsO9/Qabi+t0vCRPg== dependencies: - diff-sequences "^29.6.3" - estree-walker "^3.0.3" - loupe "^2.3.7" - pretty-format "^29.7.0" + "@vitest/pretty-format" "2.1.8" + magic-string "^0.30.12" + pathe "^1.1.2" + +"@vitest/spy@2.1.8": + version "2.1.8" + resolved "https://registry.yarnpkg.com/@vitest/spy/-/spy-2.1.8.tgz#bc41af3e1e6a41ae3b67e51f09724136b88fa447" + integrity sha512-5swjf2q95gXeYPevtW0BLk6H8+bPlMb4Vw/9Em4hFxDcaOxS+e0LOX4yqNxoHzMR2akEB2xfpnWUzkZokmgWDg== + dependencies: + tinyspy "^3.0.2" + +"@vitest/ui@2.1.8": + version "2.1.8" + resolved "https://registry.yarnpkg.com/@vitest/ui/-/ui-2.1.8.tgz#4a4d88e20bcced4c8710826cd4e2795f5ec1f0a1" + integrity sha512-5zPJ1fs0ixSVSs5+5V2XJjXLmNzjugHRyV11RqxYVR+oMcogZ9qTuSfKW+OcTV0JeFNznI83BNylzH6SSNJ1+w== + dependencies: + "@vitest/utils" "2.1.8" + fflate "^0.8.2" + flatted "^3.3.1" + pathe "^1.1.2" + sirv "^3.0.0" + tinyglobby "^0.2.10" + tinyrainbow "^1.2.0" + +"@vitest/utils@2.1.8": + version "2.1.8" + resolved "https://registry.yarnpkg.com/@vitest/utils/-/utils-2.1.8.tgz#f8ef85525f3362ebd37fd25d268745108d6ae388" + integrity sha512-dwSoui6djdwbfFmIgbIjX2ZhIoG7Ex/+xpxyiEgIGzjliY8xGkcpITKTlp6B4MgtGkF2ilvm97cPM96XZaAgcA== + dependencies: + "@vitest/pretty-format" "2.1.8" + loupe "^3.1.2" + tinyrainbow "^1.2.0" abbrev@1: version "1.1.1" @@ -1509,15 +1272,10 @@ acorn-jsx@^5.3.2: resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== -acorn-walk@^8.1.1, acorn-walk@^8.3.2: - version "8.3.2" - resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.3.2.tgz#7703af9415f1b6db9315d6895503862e231d34aa" - integrity sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A== - -acorn@^8.11.3, acorn@^8.4.1, acorn@^8.9.0: - version "8.11.3" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.11.3.tgz#71e0b14e13a4ec160724b38fb7b0f233b1b81d7a" - integrity sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg== +acorn@^8.9.0: + version "8.14.0" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.14.0.tgz#063e2c70cac5fb4f6467f0b11152e04c682795b0" + integrity sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA== agent-base@6, agent-base@^6.0.2: version "6.0.2" @@ -1527,9 +1285,9 @@ agent-base@6, agent-base@^6.0.2: debug "4" agentkeepalive@^4.1.3: - version "4.5.0" - resolved "https://registry.yarnpkg.com/agentkeepalive/-/agentkeepalive-4.5.0.tgz#2673ad1389b3c418c5a20c5d7364f93ca04be923" - integrity sha512-5GG/5IbQQpC9FpkRGsSvZI5QYeSCzlJHdpBQntCsuTOxhKD8lqKhrleg2Yi7yvMIf82Ycmmqln9U8V9qwEiJew== + version "4.6.0" + resolved "https://registry.yarnpkg.com/agentkeepalive/-/agentkeepalive-4.6.0.tgz#35f73e94b3f40bf65f105219c623ad19c136ea6a" + integrity sha512-kja8j7PjmncONqaTsB8fQ+wE2mSU2DJ9D4XKoJ5PFWIdRMa6SLSN1ff4mOr4jCbfRSsxR4keIiySJU0N9T5hIQ== dependencies: humanize-ms "^1.2.1" @@ -1557,9 +1315,9 @@ ansi-regex@^5.0.1: integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== ansi-regex@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-6.0.1.tgz#3183e38fae9a65d7cb5e53945cd5897d0260a06a" - integrity sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA== + version "6.1.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-6.1.0.tgz#95ec409c69619d6cb1b8b34f14b660ef28ebd654" + integrity sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA== ansi-styles@^4.0.0, ansi-styles@^4.1.0: version "4.3.0" @@ -1568,11 +1326,6 @@ ansi-styles@^4.0.0, ansi-styles@^4.1.0: dependencies: color-convert "^2.0.1" -ansi-styles@^5.0.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-5.2.0.tgz#07449690ad45777d1924ac2abb2fc8895dba836b" - integrity sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA== - ansi-styles@^6.1.0: version "6.2.1" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-6.2.1.tgz#0e62320cf99c21afff3b3012192546aacbfb05c5" @@ -1601,32 +1354,25 @@ are-we-there-yet@^3.0.0: delegates "^1.0.0" readable-stream "^3.6.0" -arg@^4.1.0: - version "4.1.3" - resolved "https://registry.yarnpkg.com/arg/-/arg-4.1.3.tgz#269fc7ad5b8e42cb63c896d5666017261c144089" - integrity sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA== - argparse@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== -aria-query@^5.3.0: - version "5.3.0" - resolved "https://registry.yarnpkg.com/aria-query/-/aria-query-5.3.0.tgz#650c569e41ad90b51b3d7df5e5eed1c7549c103e" - integrity sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A== - dependencies: - dequal "^2.0.3" +aria-query@^5.3.2: + version "5.3.2" + resolved "https://registry.yarnpkg.com/aria-query/-/aria-query-5.3.2.tgz#93f81a43480e33a338f19163a3d10a50c01dcd59" + integrity sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw== -array-buffer-byte-length@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz#1e5583ec16763540a27ae52eed99ff899223568f" - integrity sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg== +array-buffer-byte-length@^1.0.1, array-buffer-byte-length@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz#384d12a37295aec3769ab022ad323a18a51ccf8b" + integrity sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw== dependencies: - call-bind "^1.0.5" - is-array-buffer "^3.0.4" + call-bound "^1.0.3" + is-array-buffer "^3.0.5" -array-includes@^3.1.6, array-includes@^3.1.7: +array-includes@^3.1.6, array-includes@^3.1.8: version "3.1.8" resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.8.tgz#5e370cbe172fdd5dd6530c1d4aadda25281ba97d" integrity sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ== @@ -1643,7 +1389,7 @@ array-union@^2.1.0: resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== -array.prototype.findlastindex@^1.2.3: +array.prototype.findlastindex@^1.2.5: version "1.2.5" resolved "https://registry.yarnpkg.com/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.5.tgz#8c35a755c72908719453f87145ca011e39334d0d" integrity sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ== @@ -1656,43 +1402,42 @@ array.prototype.findlastindex@^1.2.3: es-shim-unscopables "^1.0.2" array.prototype.flat@^1.3.1, array.prototype.flat@^1.3.2: - version "1.3.2" - resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz#1476217df8cff17d72ee8f3ba06738db5b387d18" - integrity sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA== + version "1.3.3" + resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.3.3.tgz#534aaf9e6e8dd79fb6b9a9917f839ef1ec63afe5" + integrity sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg== dependencies: - call-bind "^1.0.2" - define-properties "^1.2.0" - es-abstract "^1.22.1" - es-shim-unscopables "^1.0.0" + call-bind "^1.0.8" + define-properties "^1.2.1" + es-abstract "^1.23.5" + es-shim-unscopables "^1.0.2" array.prototype.flatmap@^1.3.2: - version "1.3.2" - resolved "https://registry.yarnpkg.com/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz#c9a7c6831db8e719d6ce639190146c24bbd3e527" - integrity sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ== + version "1.3.3" + resolved "https://registry.yarnpkg.com/array.prototype.flatmap/-/array.prototype.flatmap-1.3.3.tgz#712cc792ae70370ae40586264629e33aab5dd38b" + integrity sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg== dependencies: - call-bind "^1.0.2" - define-properties "^1.2.0" - es-abstract "^1.22.1" - es-shim-unscopables "^1.0.0" + call-bind "^1.0.8" + define-properties "^1.2.1" + es-abstract "^1.23.5" + es-shim-unscopables "^1.0.2" -arraybuffer.prototype.slice@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz#097972f4255e41bc3425e37dc3f6421cf9aefde6" - integrity sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A== +arraybuffer.prototype.slice@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.4.tgz#9d760d84dbdd06d0cbf92c8849615a1a7ab3183c" + integrity sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ== dependencies: array-buffer-byte-length "^1.0.1" - call-bind "^1.0.5" + call-bind "^1.0.8" define-properties "^1.2.1" - es-abstract "^1.22.3" - es-errors "^1.2.1" - get-intrinsic "^1.2.3" + es-abstract "^1.23.5" + es-errors "^1.3.0" + get-intrinsic "^1.2.6" is-array-buffer "^3.0.4" - is-shared-array-buffer "^1.0.2" -assertion-error@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/assertion-error/-/assertion-error-1.1.0.tgz#e60b6b0e8f301bd97e5375215bda406c85118c0b" - integrity sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw== +assertion-error@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/assertion-error/-/assertion-error-2.0.1.tgz#f641a196b335690b1070bf00b6e7593fec190bf7" + integrity sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA== ast-types-flow@^0.0.8: version "0.0.8" @@ -1716,26 +1461,24 @@ available-typed-arrays@^1.0.7: dependencies: possible-typed-array-names "^1.0.0" -axe-core@=4.7.0: - version "4.7.0" - resolved "https://registry.yarnpkg.com/axe-core/-/axe-core-4.7.0.tgz#34ba5a48a8b564f67e103f0aa5768d76e15bbbbf" - integrity sha512-M0JtH+hlOL5pLQwHOLNYZaXuhqmvS8oExsqB1SBYgA4Dk7u/xx+YdGHXaK5pyUfed5mYXdlYiphWq3G8cRi5JQ== +axe-core@^4.10.0: + version "4.10.2" + resolved "https://registry.yarnpkg.com/axe-core/-/axe-core-4.10.2.tgz#85228e3e1d8b8532a27659b332e39b7fa0e022df" + integrity sha512-RE3mdQ7P3FRSe7eqCWoeQ/Z9QXrtniSjp1wUjt5nRC3WIpz5rSCve6o3fsZ2aCpJtrZjSZgjwXAoTO5k4tEI0w== -axios@^1.6.8: - version "1.7.2" - resolved "https://registry.yarnpkg.com/axios/-/axios-1.7.2.tgz#b625db8a7051fbea61c35a3cbb3a1daa7b9c7621" - integrity sha512-2A8QhOMrbomlDuiLeK9XibIBzuHeRcqqNOHp0Cyp5EoJ1IFDh+XZH3A6BkXtv0K4gFGCI0Y4BM7B1wOEi0Rmgw== +axios@^1.7.7: + version "1.7.9" + resolved "https://registry.yarnpkg.com/axios/-/axios-1.7.9.tgz#d7d071380c132a24accda1b2cfc1535b79ec650a" + integrity sha512-LhLcE7Hbiryz8oMDdDptSrWowmB4Bl6RCt6sIJKpRB4XtVf0iEgewX3au/pJqm+Py1kCASkb/FFKjxQaLtxJvw== dependencies: follow-redirects "^1.15.6" form-data "^4.0.0" proxy-from-env "^1.1.0" -axobject-query@^3.2.1: - version "3.2.1" - resolved "https://registry.yarnpkg.com/axobject-query/-/axobject-query-3.2.1.tgz#39c378a6e3b06ca679f29138151e45b2b32da62a" - integrity sha512-jsyHu61e6N4Vbz/v18DHwWYKK0bSWLqn47eeDSKPB7m8tqMHF9YJ+mhIk2lVteyZrY8tnSj/jHOv4YiTCuCJgg== - dependencies: - dequal "^2.0.3" +axobject-query@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/axobject-query/-/axobject-query-4.1.0.tgz#28768c76d0e3cff21bc62a9e2d0b6ac30042a1ee" + integrity sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ== balanced-match@^1.0.0: version "1.0.2" @@ -1788,12 +1531,12 @@ brace-expansion@^2.0.1: dependencies: balanced-match "^1.0.0" -braces@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" - integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== +braces@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.3.tgz#490332f40919452272d55a8480adc0c441358789" + integrity sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA== dependencies: - fill-range "^7.0.1" + fill-range "^7.1.1" buffer@^5.5.0: version "5.7.1" @@ -1817,9 +1560,9 @@ builtin-modules@^3.3.0: integrity sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw== builtins@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/builtins/-/builtins-5.0.1.tgz#87f6db9ab0458be728564fa81d876d8d74552fa9" - integrity sha512-qwVpFEHNfhYJIzNRBvd2C1kyo6jz3ZSMPyyuR47OPdiKWlbYnZNyDWuyR175qDnAJLiCo5fBBqPb3RiXgWlkOQ== + version "5.1.0" + resolved "https://registry.yarnpkg.com/builtins/-/builtins-5.1.0.tgz#6d85eeb360c4ebc166c3fdef922a15aa7316a5e8" + integrity sha512-SW9lzGTLvWTP1AY8xeAMZimqDrIaSdLQUcVr9DMef51niJ022Ri87SwRRKYm4A6iHfkPaiVUu/Duw2Wc4J7kKg== dependencies: semver "^7.0.0" @@ -1852,34 +1595,47 @@ cacache@^15.2.0: tar "^6.0.2" unique-filename "^1.1.1" -call-bind@^1.0.2, call-bind@^1.0.5, call-bind@^1.0.6, call-bind@^1.0.7: - version "1.0.7" - resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.7.tgz#06016599c40c56498c18769d2730be242b6fa3b9" - integrity sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w== +call-bind-apply-helpers@^1.0.0, call-bind-apply-helpers@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.1.tgz#32e5892e6361b29b0b545ba6f7763378daca2840" + integrity sha512-BhYE+WDaywFg2TBWYNXAE+8B1ATnThNBqXHP5nQu0jWJdVvY2hvkpyB3qOmtmDePiS5/BDQ8wASEWGMWRG148g== dependencies: - es-define-property "^1.0.0" es-errors "^1.3.0" function-bind "^1.1.2" + +call-bind@^1.0.7, call-bind@^1.0.8: + version "1.0.8" + resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.8.tgz#0736a9660f537e3388826f440d5ec45f744eaa4c" + integrity sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww== + dependencies: + call-bind-apply-helpers "^1.0.0" + es-define-property "^1.0.0" get-intrinsic "^1.2.4" - set-function-length "^1.2.1" + set-function-length "^1.2.2" + +call-bound@^1.0.2, call-bound@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/call-bound/-/call-bound-1.0.3.tgz#41cfd032b593e39176a71533ab4f384aa04fd681" + integrity sha512-YTd+6wGlNlPxSuri7Y6X8tY2dmm12UMH66RpKMhiX6rsk5wXXnYgbUcOt8kiS31/AjfoTOvCsE+w8nZQLQnzHA== + dependencies: + call-bind-apply-helpers "^1.0.1" + get-intrinsic "^1.2.6" callsites@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== -chai@^4.3.10: - version "4.4.1" - resolved "https://registry.yarnpkg.com/chai/-/chai-4.4.1.tgz#3603fa6eba35425b0f2ac91a009fe924106e50d1" - integrity sha512-13sOfMv2+DWduEU+/xbun3LScLoqN17nBeTLUsmDfKdoiC1fr0n9PU4guu4AhRcOVFk/sW8LyZWHuhWtQZiF+g== +chai@^5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/chai/-/chai-5.1.2.tgz#3afbc340b994ae3610ca519a6c70ace77ad4378d" + integrity sha512-aGtmf24DW6MLHHG5gCx4zaI3uBq3KRtxeVs0DjFH6Z0rDNbsvTxFASFvdj79pxjxZ8/5u3PIiN3IwEIQkiiuPw== dependencies: - assertion-error "^1.1.0" - check-error "^1.0.3" - deep-eql "^4.1.3" - get-func-name "^2.0.2" - loupe "^2.3.6" - pathval "^1.1.1" - type-detect "^4.0.8" + assertion-error "^2.0.1" + check-error "^2.1.1" + deep-eql "^5.0.1" + loupe "^3.1.0" + pathval "^2.0.0" chalk@^3.0.0: version "3.0.0" @@ -1897,12 +1653,10 @@ chalk@^4.0.0, chalk@^4.1.2: ansi-styles "^4.1.0" supports-color "^7.1.0" -check-error@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/check-error/-/check-error-1.0.3.tgz#a6502e4312a7ee969f646e83bb3ddd56281bd694" - integrity sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg== - dependencies: - get-func-name "^2.0.2" +check-error@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/check-error/-/check-error-2.1.1.tgz#87eb876ae71ee388fa0471fe423f494be1d96ccc" + integrity sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw== chownr@^1.1.1: version "1.1.4" @@ -1979,9 +1733,14 @@ combined-stream@^1.0.8: delayed-stream "~1.0.0" comlink@^4.4.1: - version "4.4.1" - resolved "https://registry.yarnpkg.com/comlink/-/comlink-4.4.1.tgz#e568b8e86410b809e8600eb2cf40c189371ef981" - integrity sha512-+1dlx0aY5Jo1vHy/tSsIGpSkN4tS9rZSW8FIhG0JH/crs9wwweswIo/POr451r7bZww3hFbPAKnTpimzL/mm4Q== + version "4.4.2" + resolved "https://registry.yarnpkg.com/comlink/-/comlink-4.4.2.tgz#cbbcd82742fbebc06489c28a183eedc5c60a2bca" + integrity sha512-OxGdvBmJuNKSCMO4NTl1L47VRp6xn2wG4F/2hYzB6tiCb709otOxtEYCSvK80PtjODfXXZu8ds+Nw5kVCjqd2g== + +commander@^13.1.0: + version "13.1.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-13.1.0.tgz#776167db68c78f38dcce1f9b8d7b8b9a488abf46" + integrity sha512-/rFeCpNJQbhSZjGVwO9RFV3xPqbnERS8MmIQzCtD/zl6gpJuV/bMLuN92oG3F7d8oDEHHRrujSXNUr8fpjntKw== concat-map@0.0.1: version "0.0.1" @@ -2006,15 +1765,10 @@ console-control-strings@^1.1.0: resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" integrity sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ== -create-require@^1.1.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/create-require/-/create-require-1.1.1.tgz#c1d7e8f1e5f6cfc9ff65f9cd352d37348756c333" - integrity sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ== - cross-spawn@^7.0.0, cross-spawn@^7.0.2, cross-spawn@^7.0.3: - version "7.0.3" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" - integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== + version "7.0.6" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.6.tgz#8a58fe78f00dcd70c370451759dfbfaf03e8ee9f" + integrity sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA== dependencies: path-key "^3.1.0" shebang-command "^2.0.0" @@ -2030,30 +1784,30 @@ data-uri-to-buffer@^4.0.0: resolved "https://registry.yarnpkg.com/data-uri-to-buffer/-/data-uri-to-buffer-4.0.1.tgz#d8feb2b2881e6a4f58c2e08acfd0e2834e26222e" integrity sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A== -data-view-buffer@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/data-view-buffer/-/data-view-buffer-1.0.1.tgz#8ea6326efec17a2e42620696e671d7d5a8bc66b2" - integrity sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA== +data-view-buffer@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/data-view-buffer/-/data-view-buffer-1.0.2.tgz#211a03ba95ecaf7798a8c7198d79536211f88570" + integrity sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ== dependencies: - call-bind "^1.0.6" + call-bound "^1.0.3" es-errors "^1.3.0" - is-data-view "^1.0.1" + is-data-view "^1.0.2" -data-view-byte-length@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/data-view-byte-length/-/data-view-byte-length-1.0.1.tgz#90721ca95ff280677eb793749fce1011347669e2" - integrity sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ== +data-view-byte-length@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/data-view-byte-length/-/data-view-byte-length-1.0.2.tgz#9e80f7ca52453ce3e93d25a35318767ea7704735" + integrity sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ== dependencies: - call-bind "^1.0.7" + call-bound "^1.0.3" es-errors "^1.3.0" - is-data-view "^1.0.1" + is-data-view "^1.0.2" -data-view-byte-offset@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/data-view-byte-offset/-/data-view-byte-offset-1.0.0.tgz#5e0bbfb4828ed2d1b9b400cd8a7d119bca0ff18a" - integrity sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA== +data-view-byte-offset@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/data-view-byte-offset/-/data-view-byte-offset-1.0.1.tgz#068307f9b71ab76dbbe10291389e020856606191" + integrity sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ== dependencies: - call-bind "^1.0.6" + call-bound "^1.0.2" es-errors "^1.3.0" is-data-view "^1.0.1" @@ -2063,16 +1817,16 @@ dateformat@^4.6.3: integrity sha512-2P0p0pFGzHS5EMnhdxQi7aJN+iMheud0UhG4dlE1DLAlvL8JHjJJTX/CSm4JXwV0Ka5nGk3zC5mcb5bUQUxxMA== dayjs@^1.11.9: - version "1.11.11" - resolved "https://registry.yarnpkg.com/dayjs/-/dayjs-1.11.11.tgz#dfe0e9d54c5f8b68ccf8ca5f72ac603e7e5ed59e" - integrity sha512-okzr3f11N6WuqYtZSvm+F776mB41wRZMhKP+hc34YdW+KmtYYK9iqvHSwo2k9FEH3fhGXvOPV6yz2IcSrfRUDg== + version "1.11.13" + resolved "https://registry.yarnpkg.com/dayjs/-/dayjs-1.11.13.tgz#92430b0139055c3ebb60150aa13e860a4b5a366c" + integrity sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg== -debug@4, debug@^4.1.0, debug@^4.3.3, debug@^4.3.4: - version "4.3.5" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.5.tgz#e83444eceb9fedd4a1da56d671ae2446a01a6e1e" - integrity sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg== +debug@4, debug@^4.1.0, debug@^4.3.1, debug@^4.3.2, debug@^4.3.3, debug@^4.3.4, debug@^4.3.7: + version "4.4.0" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.4.0.tgz#2b3f2aea2ffeb776477460267377dc8710faba8a" + integrity sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA== dependencies: - ms "2.1.2" + ms "^2.1.3" debug@^3.2.7: version "3.2.7" @@ -2081,13 +1835,6 @@ debug@^3.2.7: dependencies: ms "^2.1.1" -debug@^4.3.1, debug@^4.3.2: - version "4.3.4" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" - integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== - dependencies: - ms "2.1.2" - decompress-response@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-6.0.0.tgz#ca387612ddb7e104bd16d85aab00d5ecf09c66fc" @@ -2095,12 +1842,10 @@ decompress-response@^6.0.0: dependencies: mimic-response "^3.1.0" -deep-eql@^4.1.3: - version "4.1.3" - resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-4.1.3.tgz#7c7775513092f7df98d8df9996dd085eb668cc6d" - integrity sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw== - dependencies: - type-detect "^4.0.0" +deep-eql@^5.0.1: + version "5.0.2" + resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-5.0.2.tgz#4b756d8d770a9257300825d52a2c2cff99c3a341" + integrity sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q== deep-extend@^0.6.0: version "0.6.0" @@ -2121,7 +1866,7 @@ define-data-property@^1.0.1, define-data-property@^1.1.4: es-errors "^1.3.0" gopd "^1.0.1" -define-properties@^1.1.3, define-properties@^1.2.0, define-properties@^1.2.1: +define-properties@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.2.1.tgz#10781cc616eb951a80a034bafcaa7377f6af2b6c" integrity sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg== @@ -2140,11 +1885,6 @@ delegates@^1.0.0: resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" integrity sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ== -dequal@^2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/dequal/-/dequal-2.0.3.tgz#2644214f1997d39ed0ee0ece72335490a7ac67be" - integrity sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA== - detect-libc@^2.0.0: version "2.0.3" resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-2.0.3.tgz#f0cd503b40f9939b894697d19ad50895e30cf700" @@ -2160,16 +1900,6 @@ diff-match-patch@^1.0.0: resolved "https://registry.yarnpkg.com/diff-match-patch/-/diff-match-patch-1.0.5.tgz#abb584d5f10cd1196dfc55aa03701592ae3f7b37" integrity sha512-IayShXAgj/QMXgB0IWmKx+rOPuGMhqm5w6jvFxmVenXKIzRqTAAsbBPT3kWQeGANj3jGgvcvv4yK6SxqYmikgw== -diff-sequences@^29.6.3: - version "29.6.3" - resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-29.6.3.tgz#4deaf894d11407c51efc8418012f9e70b84ea921" - integrity sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q== - -diff@^4.0.1: - version "4.0.2" - resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d" - integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== - dir-glob@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" @@ -2192,9 +1922,18 @@ doctrine@^3.0.0: esutils "^2.0.2" dotenv@^16.0.3, dotenv@^16.4.5: - version "16.4.5" - resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-16.4.5.tgz#cdd3b3b604cb327e286b4762e13502f717cb099f" - integrity sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg== + version "16.4.7" + resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-16.4.7.tgz#0e20c5b82950140aa99be360a8a5f52335f53c26" + integrity sha512-47qPchRCykZC03FhkYAhrvwU4xDBFIj1QPqaarj6mdM/hgUzfPHcpkHJOn3mJAufFeeAxAzeGsr5X0M4k6fLZQ== + +dunder-proto@^1.0.0, dunder-proto@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/dunder-proto/-/dunder-proto-1.0.1.tgz#d7ae667e1dc83482f8b70fd0f6eefc50da30f58a" + integrity sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A== + dependencies: + call-bind-apply-helpers "^1.0.1" + es-errors "^1.3.0" + gopd "^1.2.0" eastasianwidth@^0.2.0: version "0.2.0" @@ -2235,141 +1974,77 @@ err-code@^2.0.2: resolved "https://registry.yarnpkg.com/err-code/-/err-code-2.0.3.tgz#23c2f3b756ffdfc608d30e27c9a941024807e7f9" integrity sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA== -es-abstract@^1.22.1, es-abstract@^1.22.3, es-abstract@^1.23.0, es-abstract@^1.23.2: - version "1.23.2" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.23.2.tgz#693312f3940f967b8dd3eebacb590b01712622e0" - integrity sha512-60s3Xv2T2p1ICykc7c+DNDPLDMm9t4QxCOUU0K9JxiLjM3C1zB9YVdN7tjxrFd4+AkZ8CdX1ovUga4P2+1e+/w== +es-abstract@^1.23.2, es-abstract@^1.23.3, es-abstract@^1.23.5, es-abstract@^1.23.9: + version "1.23.9" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.23.9.tgz#5b45994b7de78dada5c1bebf1379646b32b9d606" + integrity sha512-py07lI0wjxAC/DcfK1S6G7iANonniZwTISvdPzk9hzeH0IZIshbuuFxLIU96OyF89Yb9hiqWn8M/bY83KY5vzA== dependencies: - array-buffer-byte-length "^1.0.1" - arraybuffer.prototype.slice "^1.0.3" + array-buffer-byte-length "^1.0.2" + arraybuffer.prototype.slice "^1.0.4" available-typed-arrays "^1.0.7" - call-bind "^1.0.7" - data-view-buffer "^1.0.1" - data-view-byte-length "^1.0.1" - data-view-byte-offset "^1.0.0" - es-define-property "^1.0.0" + call-bind "^1.0.8" + call-bound "^1.0.3" + data-view-buffer "^1.0.2" + data-view-byte-length "^1.0.2" + data-view-byte-offset "^1.0.1" + es-define-property "^1.0.1" es-errors "^1.3.0" es-object-atoms "^1.0.0" - es-set-tostringtag "^2.0.3" - es-to-primitive "^1.2.1" - function.prototype.name "^1.1.6" - get-intrinsic "^1.2.4" - get-symbol-description "^1.0.2" - globalthis "^1.0.3" - gopd "^1.0.1" + es-set-tostringtag "^2.1.0" + es-to-primitive "^1.3.0" + function.prototype.name "^1.1.8" + get-intrinsic "^1.2.7" + get-proto "^1.0.0" + get-symbol-description "^1.1.0" + globalthis "^1.0.4" + gopd "^1.2.0" has-property-descriptors "^1.0.2" - has-proto "^1.0.3" - has-symbols "^1.0.3" + has-proto "^1.2.0" + has-symbols "^1.1.0" hasown "^2.0.2" - internal-slot "^1.0.7" - is-array-buffer "^3.0.4" + internal-slot "^1.1.0" + is-array-buffer "^3.0.5" is-callable "^1.2.7" - is-data-view "^1.0.1" - is-negative-zero "^2.0.3" - is-regex "^1.1.4" - is-shared-array-buffer "^1.0.3" - is-string "^1.0.7" - is-typed-array "^1.1.13" - is-weakref "^1.0.2" - object-inspect "^1.13.1" + is-data-view "^1.0.2" + is-regex "^1.2.1" + is-shared-array-buffer "^1.0.4" + is-string "^1.1.1" + is-typed-array "^1.1.15" + is-weakref "^1.1.0" + math-intrinsics "^1.1.0" + object-inspect "^1.13.3" object-keys "^1.1.1" - object.assign "^4.1.5" - regexp.prototype.flags "^1.5.2" - safe-array-concat "^1.1.2" - safe-regex-test "^1.0.3" - string.prototype.trim "^1.2.9" - string.prototype.trimend "^1.0.8" - string.prototype.trimstart "^1.0.7" - typed-array-buffer "^1.0.2" - typed-array-byte-length "^1.0.1" - typed-array-byte-offset "^1.0.2" - typed-array-length "^1.0.5" - unbox-primitive "^1.0.2" - which-typed-array "^1.1.15" - -es-abstract@^1.23.1: - version "1.23.3" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.23.3.tgz#8f0c5a35cd215312573c5a27c87dfd6c881a0aa0" - integrity sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A== - dependencies: - array-buffer-byte-length "^1.0.1" - arraybuffer.prototype.slice "^1.0.3" - available-typed-arrays "^1.0.7" - call-bind "^1.0.7" - data-view-buffer "^1.0.1" - data-view-byte-length "^1.0.1" - data-view-byte-offset "^1.0.0" - es-define-property "^1.0.0" - es-errors "^1.3.0" - es-object-atoms "^1.0.0" - es-set-tostringtag "^2.0.3" - es-to-primitive "^1.2.1" - function.prototype.name "^1.1.6" - get-intrinsic "^1.2.4" - get-symbol-description "^1.0.2" - globalthis "^1.0.3" - gopd "^1.0.1" - has-property-descriptors "^1.0.2" - has-proto "^1.0.3" - has-symbols "^1.0.3" - hasown "^2.0.2" - internal-slot "^1.0.7" - is-array-buffer "^3.0.4" - is-callable "^1.2.7" - is-data-view "^1.0.1" - is-negative-zero "^2.0.3" - is-regex "^1.1.4" - is-shared-array-buffer "^1.0.3" - is-string "^1.0.7" - is-typed-array "^1.1.13" - is-weakref "^1.0.2" - object-inspect "^1.13.1" - object-keys "^1.1.1" - object.assign "^4.1.5" - regexp.prototype.flags "^1.5.2" - safe-array-concat "^1.1.2" - safe-regex-test "^1.0.3" - string.prototype.trim "^1.2.9" - string.prototype.trimend "^1.0.8" + object.assign "^4.1.7" + own-keys "^1.0.1" + regexp.prototype.flags "^1.5.3" + safe-array-concat "^1.1.3" + safe-push-apply "^1.0.0" + safe-regex-test "^1.1.0" + set-proto "^1.0.0" + string.prototype.trim "^1.2.10" + string.prototype.trimend "^1.0.9" string.prototype.trimstart "^1.0.8" - typed-array-buffer "^1.0.2" - typed-array-byte-length "^1.0.1" - typed-array-byte-offset "^1.0.2" - typed-array-length "^1.0.6" - unbox-primitive "^1.0.2" - which-typed-array "^1.1.15" - -es-define-property@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/es-define-property/-/es-define-property-1.0.0.tgz#c7faefbdff8b2696cf5f46921edfb77cc4ba3845" - integrity sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ== - dependencies: - get-intrinsic "^1.2.4" + typed-array-buffer "^1.0.3" + typed-array-byte-length "^1.0.3" + typed-array-byte-offset "^1.0.4" + typed-array-length "^1.0.7" + unbox-primitive "^1.1.0" + which-typed-array "^1.1.18" + +es-define-property@^1.0.0, es-define-property@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/es-define-property/-/es-define-property-1.0.1.tgz#983eb2f9a6724e9303f61addf011c72e09e0b0fa" + integrity sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g== -es-errors@^1.2.1, es-errors@^1.3.0: +es-errors@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/es-errors/-/es-errors-1.3.0.tgz#05f75a25dab98e4fb1dcd5e1472c0546d5057c8f" integrity sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw== -es-iterator-helpers@^1.0.15: - version "1.0.18" - resolved "https://registry.yarnpkg.com/es-iterator-helpers/-/es-iterator-helpers-1.0.18.tgz#4d3424f46b24df38d064af6fbbc89274e29ea69d" - integrity sha512-scxAJaewsahbqTYrGKJihhViaM6DDZDDoucfvzNbK0pOren1g/daDQ3IAhzn+1G14rBG7w+i5N+qul60++zlKA== - dependencies: - call-bind "^1.0.7" - define-properties "^1.2.1" - es-abstract "^1.23.0" - es-errors "^1.3.0" - es-set-tostringtag "^2.0.3" - function-bind "^1.1.2" - get-intrinsic "^1.2.4" - globalthis "^1.0.3" - has-property-descriptors "^1.0.2" - has-proto "^1.0.3" - has-symbols "^1.0.3" - internal-slot "^1.0.7" - iterator.prototype "^1.1.2" - safe-array-concat "^1.1.2" +es-module-lexer@^1.5.4: + version "1.6.0" + resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-1.6.0.tgz#da49f587fd9e68ee2404fe4e256c0c7d3a81be21" + integrity sha512-qqnD1yMU6tk/jnaMosogGySTZP8YtUgAffA9nMN+E/rjxcfRQ6IEk7IiozUjgxKoFHBGjTLnrHB/YC45r/59EQ== es-object-atoms@^1.0.0: version "1.0.0" @@ -2378,108 +2053,110 @@ es-object-atoms@^1.0.0: dependencies: es-errors "^1.3.0" -es-set-tostringtag@^2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz#8bb60f0a440c2e4281962428438d58545af39777" - integrity sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ== +es-set-tostringtag@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz#f31dbbe0c183b00a6d26eb6325c810c0fd18bd4d" + integrity sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA== dependencies: - get-intrinsic "^1.2.4" + es-errors "^1.3.0" + get-intrinsic "^1.2.6" has-tostringtag "^1.0.2" - hasown "^2.0.1" + hasown "^2.0.2" -es-shim-unscopables@^1.0.0, es-shim-unscopables@^1.0.2: +es-shim-unscopables@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz#1f6942e71ecc7835ed1c8a83006d8771a63a3763" integrity sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw== dependencies: hasown "^2.0.0" -es-to-primitive@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a" - integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA== +es-to-primitive@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.3.0.tgz#96c89c82cc49fd8794a24835ba3e1ff87f214e18" + integrity sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g== dependencies: - is-callable "^1.1.4" - is-date-object "^1.0.1" - is-symbol "^1.0.2" + is-callable "^1.2.7" + is-date-object "^1.0.5" + is-symbol "^1.0.4" es6-error@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/es6-error/-/es6-error-4.1.1.tgz#9e3af407459deed47e9a91f9b885a84eb05c561d" integrity sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg== -esbuild@^0.20.1: - version "0.20.2" - resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.20.2.tgz#9d6b2386561766ee6b5a55196c6d766d28c87ea1" - integrity sha512-WdOOppmUNU+IbZ0PaDiTst80zjnrOkyJNHoKupIcVyU8Lvla3Ugx94VzkQ32Ijqd7UhHJy75gNWDMUekcrSJ6g== +esbuild@^0.21.3: + version "0.21.5" + resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.21.5.tgz#9ca301b120922959b766360d8ac830da0d02997d" + integrity sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw== optionalDependencies: - "@esbuild/aix-ppc64" "0.20.2" - "@esbuild/android-arm" "0.20.2" - "@esbuild/android-arm64" "0.20.2" - "@esbuild/android-x64" "0.20.2" - "@esbuild/darwin-arm64" "0.20.2" - "@esbuild/darwin-x64" "0.20.2" - "@esbuild/freebsd-arm64" "0.20.2" - "@esbuild/freebsd-x64" "0.20.2" - "@esbuild/linux-arm" "0.20.2" - "@esbuild/linux-arm64" "0.20.2" - "@esbuild/linux-ia32" "0.20.2" - "@esbuild/linux-loong64" "0.20.2" - "@esbuild/linux-mips64el" "0.20.2" - "@esbuild/linux-ppc64" "0.20.2" - "@esbuild/linux-riscv64" "0.20.2" - "@esbuild/linux-s390x" "0.20.2" - "@esbuild/linux-x64" "0.20.2" - "@esbuild/netbsd-x64" "0.20.2" - "@esbuild/openbsd-x64" "0.20.2" - "@esbuild/sunos-x64" "0.20.2" - "@esbuild/win32-arm64" "0.20.2" - "@esbuild/win32-ia32" "0.20.2" - "@esbuild/win32-x64" "0.20.2" - -esbuild@~0.19.10: - version "0.19.12" - resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.19.12.tgz#dc82ee5dc79e82f5a5c3b4323a2a641827db3e04" - integrity sha512-aARqgq8roFBj054KvQr5f1sFu0D65G+miZRCuJyJ0G13Zwx7vRar5Zhn2tkQNzIXcBrNVsv/8stehpj+GAjgbg== + "@esbuild/aix-ppc64" "0.21.5" + "@esbuild/android-arm" "0.21.5" + "@esbuild/android-arm64" "0.21.5" + "@esbuild/android-x64" "0.21.5" + "@esbuild/darwin-arm64" "0.21.5" + "@esbuild/darwin-x64" "0.21.5" + "@esbuild/freebsd-arm64" "0.21.5" + "@esbuild/freebsd-x64" "0.21.5" + "@esbuild/linux-arm" "0.21.5" + "@esbuild/linux-arm64" "0.21.5" + "@esbuild/linux-ia32" "0.21.5" + "@esbuild/linux-loong64" "0.21.5" + "@esbuild/linux-mips64el" "0.21.5" + "@esbuild/linux-ppc64" "0.21.5" + "@esbuild/linux-riscv64" "0.21.5" + "@esbuild/linux-s390x" "0.21.5" + "@esbuild/linux-x64" "0.21.5" + "@esbuild/netbsd-x64" "0.21.5" + "@esbuild/openbsd-x64" "0.21.5" + "@esbuild/sunos-x64" "0.21.5" + "@esbuild/win32-arm64" "0.21.5" + "@esbuild/win32-ia32" "0.21.5" + "@esbuild/win32-x64" "0.21.5" + +esbuild@~0.23.0: + version "0.23.1" + resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.23.1.tgz#40fdc3f9265ec0beae6f59824ade1bd3d3d2dab8" + integrity sha512-VVNz/9Sa0bs5SELtn3f7qhJCDPCF5oMEl5cO9/SSinpE9hbPVvxbd572HH5AKiP7WD8INO53GgfDDhRjkylHEg== optionalDependencies: - "@esbuild/aix-ppc64" "0.19.12" - "@esbuild/android-arm" "0.19.12" - "@esbuild/android-arm64" "0.19.12" - "@esbuild/android-x64" "0.19.12" - "@esbuild/darwin-arm64" "0.19.12" - "@esbuild/darwin-x64" "0.19.12" - "@esbuild/freebsd-arm64" "0.19.12" - "@esbuild/freebsd-x64" "0.19.12" - "@esbuild/linux-arm" "0.19.12" - "@esbuild/linux-arm64" "0.19.12" - "@esbuild/linux-ia32" "0.19.12" - "@esbuild/linux-loong64" "0.19.12" - "@esbuild/linux-mips64el" "0.19.12" - "@esbuild/linux-ppc64" "0.19.12" - "@esbuild/linux-riscv64" "0.19.12" - "@esbuild/linux-s390x" "0.19.12" - "@esbuild/linux-x64" "0.19.12" - "@esbuild/netbsd-x64" "0.19.12" - "@esbuild/openbsd-x64" "0.19.12" - "@esbuild/sunos-x64" "0.19.12" - "@esbuild/win32-arm64" "0.19.12" - "@esbuild/win32-ia32" "0.19.12" - "@esbuild/win32-x64" "0.19.12" + "@esbuild/aix-ppc64" "0.23.1" + "@esbuild/android-arm" "0.23.1" + "@esbuild/android-arm64" "0.23.1" + "@esbuild/android-x64" "0.23.1" + "@esbuild/darwin-arm64" "0.23.1" + "@esbuild/darwin-x64" "0.23.1" + "@esbuild/freebsd-arm64" "0.23.1" + "@esbuild/freebsd-x64" "0.23.1" + "@esbuild/linux-arm" "0.23.1" + "@esbuild/linux-arm64" "0.23.1" + "@esbuild/linux-ia32" "0.23.1" + "@esbuild/linux-loong64" "0.23.1" + "@esbuild/linux-mips64el" "0.23.1" + "@esbuild/linux-ppc64" "0.23.1" + "@esbuild/linux-riscv64" "0.23.1" + "@esbuild/linux-s390x" "0.23.1" + "@esbuild/linux-x64" "0.23.1" + "@esbuild/netbsd-x64" "0.23.1" + "@esbuild/openbsd-arm64" "0.23.1" + "@esbuild/openbsd-x64" "0.23.1" + "@esbuild/sunos-x64" "0.23.1" + "@esbuild/win32-arm64" "0.23.1" + "@esbuild/win32-ia32" "0.23.1" + "@esbuild/win32-x64" "0.23.1" escalade@^3.1.1: - version "3.1.2" - resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.2.tgz#54076e9ab29ea5bf3d8f1ed62acffbb88272df27" - integrity sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA== + version "3.2.0" + resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.2.0.tgz#011a3f69856ba189dffa7dc8fcce99d2a87903e5" + integrity sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA== escape-string-regexp@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== -eslint-compat-utils@^0.5.0: - version "0.5.0" - resolved "https://registry.yarnpkg.com/eslint-compat-utils/-/eslint-compat-utils-0.5.0.tgz#f7b2eb2befec25a370fac76934d3f9189f312a65" - integrity sha512-dc6Y8tzEcSYZMHa+CMPLi/hyo1FzNeonbhJL7Ol0ccuKQkwopJcJBA9YL/xmMTLU1eKigXo9vj9nALElWYSowg== +eslint-compat-utils@^0.5.1: + version "0.5.1" + resolved "https://registry.yarnpkg.com/eslint-compat-utils/-/eslint-compat-utils-0.5.1.tgz#7fc92b776d185a70c4070d03fd26fde3d59652e4" + integrity sha512-3z3vFexKIEnjHE3zCMRo6fn/e44U7T1khUjg+Hp0ZQMCigh28rALD0nPFBcGZuiLC5rLZa2ubQHDRln09JfU2Q== dependencies: semver "^7.5.4" @@ -2529,66 +2206,67 @@ eslint-import-resolver-node@^0.3.9: is-core-module "^2.13.0" resolve "^1.22.4" -eslint-module-utils@^2.8.0: - version "2.8.1" - resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.8.1.tgz#52f2404300c3bd33deece9d7372fb337cc1d7c34" - integrity sha512-rXDXR3h7cs7dy9RNpUlQf80nX31XWJEyGq1tRMo+6GsO5VmTe4UTwtmonAD4ZkAsrfMVDA2wlGJ3790Ys+D49Q== +eslint-module-utils@^2.12.0: + version "2.12.0" + resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.12.0.tgz#fe4cfb948d61f49203d7b08871982b65b9af0b0b" + integrity sha512-wALZ0HFoytlyh/1+4wuZ9FJCD/leWHQzzrxJ8+rebyReSLk7LApMyd3WJaLVoN+D5+WIdJyDK1c6JnE65V4Zyg== dependencies: debug "^3.2.7" eslint-plugin-es-x@^7.5.0: - version "7.6.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-es-x/-/eslint-plugin-es-x-7.6.0.tgz#ccee7a4556c0f816d1ae88fd0eea21540e8ccd65" - integrity sha512-I0AmeNgevgaTR7y2lrVCJmGYF0rjoznpDvqV/kIkZSZbZ8Rw3eu4cGlvBBULScfkSOCzqKbff5LR4CNrV7mZHA== + version "7.8.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-es-x/-/eslint-plugin-es-x-7.8.0.tgz#a207aa08da37a7923f2a9599e6d3eb73f3f92b74" + integrity sha512-7Ds8+wAAoV3T+LAKeu39Y5BzXCrGKrcISfgKEqTS4BDN8SFEDQd0S43jiQ8vIa3wUKD07qitZdfzlenSi8/0qQ== dependencies: "@eslint-community/eslint-utils" "^4.1.2" - "@eslint-community/regexpp" "^4.6.0" - eslint-compat-utils "^0.5.0" + "@eslint-community/regexpp" "^4.11.0" + eslint-compat-utils "^0.5.1" eslint-plugin-import@^2.25.2: - version "2.29.1" - resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.29.1.tgz#d45b37b5ef5901d639c15270d74d46d161150643" - integrity sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw== + version "2.31.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.31.0.tgz#310ce7e720ca1d9c0bb3f69adfd1c6bdd7d9e0e7" + integrity sha512-ixmkI62Rbc2/w8Vfxyh1jQRTdRTF52VxwRVHl/ykPAmqG+Nb7/kNn+byLP0LxPgI7zWA16Jt82SybJInmMia3A== dependencies: - array-includes "^3.1.7" - array.prototype.findlastindex "^1.2.3" + "@rtsao/scc" "^1.1.0" + array-includes "^3.1.8" + array.prototype.findlastindex "^1.2.5" array.prototype.flat "^1.3.2" array.prototype.flatmap "^1.3.2" debug "^3.2.7" doctrine "^2.1.0" eslint-import-resolver-node "^0.3.9" - eslint-module-utils "^2.8.0" - hasown "^2.0.0" - is-core-module "^2.13.1" + eslint-module-utils "^2.12.0" + hasown "^2.0.2" + is-core-module "^2.15.1" is-glob "^4.0.3" minimatch "^3.1.2" - object.fromentries "^2.0.7" - object.groupby "^1.0.1" - object.values "^1.1.7" + object.fromentries "^2.0.8" + object.groupby "^1.0.3" + object.values "^1.2.0" semver "^6.3.1" + string.prototype.trimend "^1.0.8" tsconfig-paths "^3.15.0" eslint-plugin-jsx-a11y@^6.8.0: - version "6.8.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.8.0.tgz#2fa9c701d44fcd722b7c771ec322432857fcbad2" - integrity sha512-Hdh937BS3KdwwbBaKd5+PLCOmYY6U4f2h9Z2ktwtNKvIdIEu137rjYbcb9ApSbVJfWxANNuiKTD/9tOKjK9qOA== + version "6.10.2" + resolved "https://registry.yarnpkg.com/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.10.2.tgz#d2812bb23bf1ab4665f1718ea442e8372e638483" + integrity sha512-scB3nz4WmG75pV8+3eRUQOHZlNSUhFNq37xnpgRkCCELU3XMvXAxLk1eqWWyE22Ki4Q01Fnsw9BA3cJHDPgn2Q== dependencies: - "@babel/runtime" "^7.23.2" - aria-query "^5.3.0" - array-includes "^3.1.7" + aria-query "^5.3.2" + array-includes "^3.1.8" array.prototype.flatmap "^1.3.2" ast-types-flow "^0.0.8" - axe-core "=4.7.0" - axobject-query "^3.2.1" + axe-core "^4.10.0" + axobject-query "^4.1.0" damerau-levenshtein "^1.0.8" emoji-regex "^9.2.2" - es-iterator-helpers "^1.0.15" - hasown "^2.0.0" + hasown "^2.0.2" jsx-ast-utils "^3.3.5" language-tags "^1.0.9" minimatch "^3.1.2" - object.entries "^1.1.7" - object.fromentries "^2.0.7" + object.fromentries "^2.0.8" + safe-regex-test "^1.0.3" + string.prototype.includes "^2.0.1" "eslint-plugin-n@^15.0.0 || ^16.0.0 ": version "16.6.2" @@ -2608,17 +2286,17 @@ eslint-plugin-jsx-a11y@^6.8.0: semver "^7.5.3" eslint-plugin-prettier@^5.1.3: - version "5.1.3" - resolved "https://registry.yarnpkg.com/eslint-plugin-prettier/-/eslint-plugin-prettier-5.1.3.tgz#17cfade9e732cef32b5f5be53bd4e07afd8e67e1" - integrity sha512-C9GCVAs4Eq7ZC/XFQHITLiHJxQngdtraXaM+LoUFoFp/lHNl2Zn8f3WQbe9HvTBBQ9YnKFB0/2Ajdqwo5D1EAw== + version "5.2.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-prettier/-/eslint-plugin-prettier-5.2.1.tgz#d1c8f972d8f60e414c25465c163d16f209411f95" + integrity sha512-gH3iR3g4JfF+yYPaJYkN7jEl9QbweL/YfkoRlNnuIEHEz1vHVlCmWOS+eGGiRuzHQXdJFCOTxRgvju9b8VUmrw== dependencies: prettier-linter-helpers "^1.0.0" - synckit "^0.8.6" + synckit "^0.9.1" eslint-plugin-promise@^6.0.0: - version "6.1.1" - resolved "https://registry.yarnpkg.com/eslint-plugin-promise/-/eslint-plugin-promise-6.1.1.tgz#269a3e2772f62875661220631bd4dafcb4083816" - integrity sha512-tjqWDwVZQo7UIPMeDReOpUgHCmCiH+ePnVT+5zVapL0uuHnegBUs2smM13CzOs2Xb5+MHMRFTs9v24yjba4Oig== + version "6.6.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-promise/-/eslint-plugin-promise-6.6.0.tgz#acd3fd7d55cead7a10f92cf698f36c0aafcd717a" + integrity sha512-57Zzfw8G6+Gq7axm2Pdo3gW/Rx3h9Yywgn61uE/3elTCOePEHVrn2i5CdfBwA1BLK0Q0WqctICIUSqXZW/VprQ== eslint-scope@^7.2.2: version "7.2.2" @@ -2628,21 +2306,21 @@ eslint-scope@^7.2.2: esrecurse "^4.3.0" estraverse "^5.2.0" -eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.1, eslint-visitor-keys@^3.4.3: +eslint-visitor-keys@^3.4.1, eslint-visitor-keys@^3.4.3: version "3.4.3" resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz#0cd72fe8550e3c2eae156a96a4dddcd1c8ac5800" integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag== eslint@^8.0.1: - version "8.57.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.57.0.tgz#c786a6fd0e0b68941aaf624596fb987089195668" - integrity sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ== + version "8.57.1" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.57.1.tgz#7df109654aba7e3bbe5c8eae533c5e461d3c6ca9" + integrity sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA== dependencies: "@eslint-community/eslint-utils" "^4.2.0" "@eslint-community/regexpp" "^4.6.1" "@eslint/eslintrc" "^2.1.4" - "@eslint/js" "8.57.0" - "@humanwhocodes/config-array" "^0.11.14" + "@eslint/js" "8.57.1" + "@humanwhocodes/config-array" "^0.13.0" "@humanwhocodes/module-importer" "^1.0.1" "@nodelib/fs.walk" "^1.2.8" "@ungap/structured-clone" "^1.2.0" @@ -2687,9 +2365,9 @@ espree@^9.6.0, espree@^9.6.1: eslint-visitor-keys "^3.4.1" esquery@^1.4.2: - version "1.5.0" - resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.5.0.tgz#6ce17738de8577694edd7361c57182ac8cb0db0b" - integrity sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg== + version "1.6.0" + resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.6.0.tgz#91419234f804d852a82dceec3e16cdc22cf9dae7" + integrity sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg== dependencies: estraverse "^5.1.0" @@ -2732,26 +2410,34 @@ events@^3.3.0: resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400" integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== -execa@^8.0.1: - version "8.0.1" - resolved "https://registry.yarnpkg.com/execa/-/execa-8.0.1.tgz#51f6a5943b580f963c3ca9c6321796db8cc39b8c" - integrity sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg== +execa@^9.5.2: + version "9.5.2" + resolved "https://registry.yarnpkg.com/execa/-/execa-9.5.2.tgz#a4551034ee0795e241025d2f987dab3f4242dff2" + integrity sha512-EHlpxMCpHWSAh1dgS6bVeoLAXGnJNdR93aabr4QCGbzOM73o5XmRfM/e5FUqsw3aagP8S8XEWUWFAxnRBnAF0Q== dependencies: + "@sindresorhus/merge-streams" "^4.0.0" cross-spawn "^7.0.3" - get-stream "^8.0.1" - human-signals "^5.0.0" - is-stream "^3.0.0" - merge-stream "^2.0.0" - npm-run-path "^5.1.0" - onetime "^6.0.0" + figures "^6.1.0" + get-stream "^9.0.0" + human-signals "^8.0.0" + is-plain-obj "^4.1.0" + is-stream "^4.0.1" + npm-run-path "^6.0.0" + pretty-ms "^9.0.0" signal-exit "^4.1.0" - strip-final-newline "^3.0.0" + strip-final-newline "^4.0.0" + yoctocolors "^2.0.0" expand-template@^2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/expand-template/-/expand-template-2.0.3.tgz#6e14b3fcee0f3a6340ecb57d2e8918692052a47c" integrity sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg== +expect-type@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/expect-type/-/expect-type-1.1.0.tgz#a146e414250d13dfc49eafcfd1344a4060fa4c75" + integrity sha512-bFi65yM+xZgk+u/KRIpekdSYkTB5W1pEf0Lt8Q8Msh7b+eQ7LXVtIB1Bkm4fvclDEL1b2CZkMhv2mOeF8tMdkA== + fast-copy@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/fast-copy/-/fast-copy-3.0.2.tgz#59c68f59ccbcac82050ba992e0d5c389097c9d35" @@ -2768,15 +2454,15 @@ fast-diff@^1.1.2: integrity sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw== fast-glob@^3.2.9: - version "3.3.2" - resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.2.tgz#a904501e57cfdd2ffcded45e99a54fef55e46129" - integrity sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow== + version "3.3.3" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.3.tgz#d06d585ce8dba90a16b0505c543c3ccfb3aeb818" + integrity sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg== dependencies: "@nodelib/fs.stat" "^2.0.2" "@nodelib/fs.walk" "^1.2.3" glob-parent "^5.1.2" merge2 "^1.3.0" - micromatch "^4.0.4" + micromatch "^4.0.8" fast-json-stable-stringify@^2.0.0: version "2.1.0" @@ -2799,12 +2485,17 @@ fast-safe-stringify@^2.1.1: integrity sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA== fastq@^1.6.0: - version "1.17.1" - resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.17.1.tgz#2a523f07a4e7b1e81a42b91b8bf2254107753b47" - integrity sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w== + version "1.18.0" + resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.18.0.tgz#d631d7e25faffea81887fe5ea8c9010e1b36fee0" + integrity sha512-QKHXPW0hD8g4UET03SdOdunzSouc9N4AuHdsX8XNcTsuz+yYFILVNIX4l9yHABMhiEI9Db0JTTIpu0wB+Y1QQw== dependencies: reusify "^1.0.4" +fdir@^6.4.2: + version "6.4.2" + resolved "https://registry.yarnpkg.com/fdir/-/fdir-6.4.2.tgz#ddaa7ce1831b161bc3657bb99cb36e1622702689" + integrity sha512-KnhMXsKSPZlAhp7+IjUkRZKPb4fUyccpDrdFXbi4QL1qkmFh9kVY09Yox+n4MaOb3lHZ1Tv829C3oaaXoMYPDQ== + fetch-blob@^3.1.2, fetch-blob@^3.1.4: version "3.2.0" resolved "https://registry.yarnpkg.com/fetch-blob/-/fetch-blob-3.2.0.tgz#f09b8d4bbd45adc6f0c20b7e787e793e309dcce9" @@ -2813,6 +2504,18 @@ fetch-blob@^3.1.2, fetch-blob@^3.1.4: node-domexception "^1.0.0" web-streams-polyfill "^3.0.3" +fflate@^0.8.2: + version "0.8.2" + resolved "https://registry.yarnpkg.com/fflate/-/fflate-0.8.2.tgz#fc8631f5347812ad6028bbe4a2308b2792aa1dea" + integrity sha512-cPJU47OaAoCbg0pBvzsgpTPhmhqI5eJjh/JIu8tPj5q+T7iLvW/JAYUqmE7KOB4R1ZyEhzBaIQpQpardBF5z8A== + +figures@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/figures/-/figures-6.1.0.tgz#935479f51865fa7479f6fa94fc6fc7ac14e62c4a" + integrity sha512-d+l3qxjSesT4V7v2fh+QnmFnUWv9lSpjarhShNTgBOfA0ttejbQUAlHLitbjkoRiDulW0OPoQPYIGhIC8ohejg== + dependencies: + is-unicode-supported "^2.0.0" + file-entry-cache@^6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027" @@ -2825,10 +2528,10 @@ file-uri-to-path@1.0.0: resolved "https://registry.yarnpkg.com/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz#553a7b8446ff6f684359c445f1e37a05dacc33dd" integrity sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw== -fill-range@^7.0.1: - version "7.0.1" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" - integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== +fill-range@^7.1.1: + version "7.1.1" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.1.1.tgz#44265d3cac07e3ea7dc247516380643754a05292" + integrity sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg== dependencies: to-regex-range "^5.0.1" @@ -2849,15 +2552,15 @@ flat-cache@^3.0.4: keyv "^4.5.3" rimraf "^3.0.2" -flatted@^3.2.9: - version "3.3.1" - resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.3.1.tgz#21db470729a6734d4997002f439cb308987f567a" - integrity sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw== +flatted@^3.2.9, flatted@^3.3.1: + version "3.3.2" + resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.3.2.tgz#adba1448a9841bec72b42c532ea23dbbedef1a27" + integrity sha512-AiwGJM8YcNOaobumgtng+6NHuOqC3A7MixFeDafM3X9cIUM+xUXoS5Vfgf+OihAYe20fxqNM9yPBXJzRtZ/4eA== follow-redirects@^1.15.6: - version "1.15.6" - resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.6.tgz#7f815c0cda4249c74ff09e95ef97c23b5fd0399b" - integrity sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA== + version "1.15.9" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.9.tgz#a604fa10e443bf98ca94228d9eebcc2e8a2c8ee1" + integrity sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ== for-each@^0.3.3: version "0.3.3" @@ -2867,17 +2570,17 @@ for-each@^0.3.3: is-callable "^1.1.3" foreground-child@^3.1.0: - version "3.2.1" - resolved "https://registry.yarnpkg.com/foreground-child/-/foreground-child-3.2.1.tgz#767004ccf3a5b30df39bed90718bab43fe0a59f7" - integrity sha512-PXUUyLqrR2XCWICfv6ukppP96sdFwWbNEnfEMt7jNsISjMsvaLNinAHNDYyvkyU+SZG2BTSbT5NjG+vZslfGTA== + version "3.3.0" + resolved "https://registry.yarnpkg.com/foreground-child/-/foreground-child-3.3.0.tgz#0ac8644c06e431439f8561db8ecf29a7b5519c77" + integrity sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg== dependencies: cross-spawn "^7.0.0" signal-exit "^4.0.1" form-data@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.0.tgz#93919daeaf361ee529584b9b31664dc12c9fa452" - integrity sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww== + version "4.0.1" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.1.tgz#ba1076daaaa5bfd7e99c1a6cb02aa0a5cff90d48" + integrity sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw== dependencies: asynckit "^0.4.0" combined-stream "^1.0.8" @@ -2917,15 +2620,17 @@ function-bind@^1.1.2: resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c" integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== -function.prototype.name@^1.1.5, function.prototype.name@^1.1.6: - version "1.1.6" - resolved "https://registry.yarnpkg.com/function.prototype.name/-/function.prototype.name-1.1.6.tgz#cdf315b7d90ee77a4c6ee216c3c3362da07533fd" - integrity sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg== +function.prototype.name@^1.1.6, function.prototype.name@^1.1.8: + version "1.1.8" + resolved "https://registry.yarnpkg.com/function.prototype.name/-/function.prototype.name-1.1.8.tgz#e68e1df7b259a5c949eeef95cdbde53edffabb78" + integrity sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q== dependencies: - call-bind "^1.0.2" - define-properties "^1.2.0" - es-abstract "^1.22.1" + call-bind "^1.0.8" + call-bound "^1.0.3" + define-properties "^1.2.1" functions-have-names "^1.2.3" + hasown "^2.0.2" + is-callable "^1.2.7" functions-have-names@^1.2.3: version "1.2.3" @@ -2951,40 +2656,51 @@ get-caller-file@^2.0.5: resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== -get-func-name@^2.0.1, get-func-name@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/get-func-name/-/get-func-name-2.0.2.tgz#0d7cf20cd13fda808669ffa88f4ffc7a3943fc41" - integrity sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ== - -get-intrinsic@^1.1.3, get-intrinsic@^1.2.1, get-intrinsic@^1.2.3, get-intrinsic@^1.2.4: - version "1.2.4" - resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.4.tgz#e385f5a4b5227d449c3eabbad05494ef0abbeadd" - integrity sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ== +get-intrinsic@^1.2.4, get-intrinsic@^1.2.5, get-intrinsic@^1.2.6, get-intrinsic@^1.2.7: + version "1.2.7" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.7.tgz#dcfcb33d3272e15f445d15124bc0a216189b9044" + integrity sha512-VW6Pxhsrk0KAOqs3WEd0klDiF/+V7gQOpAvY1jVU/LHmaD/kQO4523aiJuikX/QAKYiW6x8Jh+RJej1almdtCA== dependencies: + call-bind-apply-helpers "^1.0.1" + es-define-property "^1.0.1" es-errors "^1.3.0" + es-object-atoms "^1.0.0" function-bind "^1.1.2" - has-proto "^1.0.1" - has-symbols "^1.0.3" - hasown "^2.0.0" + get-proto "^1.0.0" + gopd "^1.2.0" + has-symbols "^1.1.0" + hasown "^2.0.2" + math-intrinsics "^1.1.0" -get-stream@^8.0.1: - version "8.0.1" - resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-8.0.1.tgz#def9dfd71742cd7754a7761ed43749a27d02eca2" - integrity sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA== +get-proto@^1.0.0, get-proto@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/get-proto/-/get-proto-1.0.1.tgz#150b3f2743869ef3e851ec0c49d15b1d14d00ee1" + integrity sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g== + dependencies: + dunder-proto "^1.0.1" + es-object-atoms "^1.0.0" -get-symbol-description@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/get-symbol-description/-/get-symbol-description-1.0.2.tgz#533744d5aa20aca4e079c8e5daf7fd44202821f5" - integrity sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg== +get-stream@^9.0.0: + version "9.0.1" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-9.0.1.tgz#95157d21df8eb90d1647102b63039b1df60ebd27" + integrity sha512-kVCxPF3vQM/N0B1PmoqVUqgHP+EeVjmZSQn+1oCRPxd2P21P2F19lIgbR3HBosbB1PUhOAoctJnfEn2GbN2eZA== dependencies: - call-bind "^1.0.5" + "@sec-ant/readable-stream" "^0.4.1" + is-stream "^4.0.1" + +get-symbol-description@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/get-symbol-description/-/get-symbol-description-1.1.0.tgz#7bdd54e0befe8ffc9f3b4e203220d9f1e881b6ee" + integrity sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg== + dependencies: + call-bound "^1.0.3" es-errors "^1.3.0" - get-intrinsic "^1.2.4" + get-intrinsic "^1.2.6" -get-tsconfig@^4.7.0, get-tsconfig@^4.7.2: - version "4.7.3" - resolved "https://registry.yarnpkg.com/get-tsconfig/-/get-tsconfig-4.7.3.tgz#0498163d98f7b58484dd4906999c0c9d5f103f83" - integrity sha512-ZvkrzoUA0PQZM6fy6+/Hce561s+faD1rsNwhnO5FelNjyy7EMGJ3Rz1AQ8GYDWjhRs/7dBLOEJvhK8MiEJOAFg== +get-tsconfig@^4.7.0, get-tsconfig@^4.7.5: + version "4.8.1" + resolved "https://registry.yarnpkg.com/get-tsconfig/-/get-tsconfig-4.8.1.tgz#8995eb391ae6e1638d251118c7b56de7eb425471" + integrity sha512-k9PN+cFBmaLWtVz29SkUoqU5O0slLuHJXt/2P+tMVFT+phsSGXGkp9t3rQIqdz0e+06EHNGs3oM6ZX1s2zHxRg== dependencies: resolve-pkg-maps "^1.0.0" @@ -3008,9 +2724,9 @@ glob-parent@^6.0.2: is-glob "^4.0.3" glob@^10.3.10: - version "10.4.2" - resolved "https://registry.yarnpkg.com/glob/-/glob-10.4.2.tgz#bed6b95dade5c1f80b4434daced233aee76160e5" - integrity sha512-GwMlUF6PkPo3Gk21UxkCohOv0PLcIXVtKyLlpEI28R/cO/4eNOdmLk3CMW1wROV/WR/EsZOWAfBbBOqYvs88/w== + version "10.4.5" + resolved "https://registry.yarnpkg.com/glob/-/glob-10.4.5.tgz#f4d9f0b90ffdbab09c9d77f5f29b4262517b0956" + integrity sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg== dependencies: foreground-child "^3.1.0" jackspeak "^3.1.2" @@ -3050,7 +2766,7 @@ globals@^13.19.0, globals@^13.24.0: dependencies: type-fest "^0.20.2" -globalthis@^1.0.1: +globalthis@^1.0.1, globalthis@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/globalthis/-/globalthis-1.0.4.tgz#7430ed3a975d97bfb59bcce41f5cabbafa651236" integrity sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ== @@ -3058,13 +2774,6 @@ globalthis@^1.0.1: define-properties "^1.2.1" gopd "^1.0.1" -globalthis@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/globalthis/-/globalthis-1.0.3.tgz#5852882a52b80dc301b0660273e1ed082f0b6ccf" - integrity sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA== - dependencies: - define-properties "^1.1.3" - globby@^11.1.0: version "11.1.0" resolved "https://registry.yarnpkg.com/globby/-/globby-11.1.0.tgz#bd4be98bb042f83d796f7e3811991fbe82a0d34b" @@ -3077,12 +2786,10 @@ globby@^11.1.0: merge2 "^1.4.1" slash "^3.0.0" -gopd@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.0.1.tgz#29ff76de69dac7489b7c0918a5788e56477c332c" - integrity sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA== - dependencies: - get-intrinsic "^1.1.3" +gopd@^1.0.1, gopd@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.2.0.tgz#89f56b8217bdbc8802bd299df6d7f1081d7e51a1" + integrity sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg== graceful-fs@4.2.10: version "4.2.10" @@ -3099,10 +2806,10 @@ graphemer@^1.4.0: resolved "https://registry.yarnpkg.com/graphemer/-/graphemer-1.4.0.tgz#fb2f1d55e0e3a1849aeffc90c4fa0dd53a0e66c6" integrity sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag== -has-bigints@^1.0.1, has-bigints@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.2.tgz#0871bd3e3d51626f6ca0966668ba35d5602d6eaa" - integrity sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ== +has-bigints@^1.0.2: + version "1.1.0" + resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.1.0.tgz#28607e965ac967e03cd2a2c70a2636a1edad49fe" + integrity sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg== has-flag@^4.0.0: version "4.0.0" @@ -3116,17 +2823,19 @@ has-property-descriptors@^1.0.0, has-property-descriptors@^1.0.2: dependencies: es-define-property "^1.0.0" -has-proto@^1.0.1, has-proto@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/has-proto/-/has-proto-1.0.3.tgz#b31ddfe9b0e6e9914536a6ab286426d0214f77fd" - integrity sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q== +has-proto@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/has-proto/-/has-proto-1.2.0.tgz#5de5a6eabd95fdffd9818b43055e8065e39fe9d5" + integrity sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ== + dependencies: + dunder-proto "^1.0.0" -has-symbols@^1.0.2, has-symbols@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" - integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== +has-symbols@^1.0.3, has-symbols@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.1.0.tgz#fc9c6a783a084951d0b971fe1018de813707a338" + integrity sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ== -has-tostringtag@^1.0.0, has-tostringtag@^1.0.2: +has-tostringtag@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.2.tgz#2cdc42d40bef2e5b4eeab7c01a73c54ce7ab5abc" integrity sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw== @@ -3138,7 +2847,7 @@ has-unicode@^2.0.1: resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" integrity sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ== -hasown@^2.0.0, hasown@^2.0.1, hasown@^2.0.2: +hasown@^2.0.0, hasown@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.2.tgz#003eaf91be7adc372e84ec59dc37252cedb80003" integrity sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ== @@ -3177,10 +2886,10 @@ https-proxy-agent@^5.0.0: agent-base "6" debug "4" -human-signals@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-5.0.0.tgz#42665a284f9ae0dade3ba41ebc37eb4b852f3a28" - integrity sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ== +human-signals@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-8.0.0.tgz#2d3d63481c7c2319f0373428b01ffe30da6df852" + integrity sha512-/1/GPCpDUCCYwlERiYjxoczfP0zfvZMU/OWgQPMya9AbAE24vseigFdhAMObpc8Q4lc/kjutPfUddDYyAmejnA== humanize-ms@^1.2.1: version "1.2.1" @@ -3197,9 +2906,9 @@ iconv-lite@^0.6.2: safer-buffer ">= 2.1.2 < 3.0.0" idb@^8.0.0: - version "8.0.0" - resolved "https://registry.yarnpkg.com/idb/-/idb-8.0.0.tgz#33d7ed894ed36e23bcb542fb701ad579bfaad41f" - integrity sha512-l//qvlAKGmQO31Qn7xdzagVPPaHTxXx199MhrAFuVBTPqydcPYBWjkrbv4Y0ktB+GmWOiwHl237UUOrLmQxLvw== + version "8.0.1" + resolved "https://registry.yarnpkg.com/idb/-/idb-8.0.1.tgz#15e8be673413d6caf4beefacf086c8902d785e1e" + integrity sha512-EkBCzUZSdhJV8PxMSbeEV//xguVKZu9hZZulM+2gHXI0t2hGVU3eYE6/XnH77DS6FM2FY8wl17aDcu9vXpvLWQ== ieee754@^1.1.13, ieee754@^1.2.1: version "1.2.1" @@ -3207,9 +2916,9 @@ ieee754@^1.1.13, ieee754@^1.2.1: integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== ignore@^5.2.0, ignore@^5.2.4, ignore@^5.3.1: - version "5.3.1" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.1.tgz#5073e554cd42c5b33b394375f538b8593e34d4ef" - integrity sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw== + version "5.3.2" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.2.tgz#3cd40e729f3643fd87cb04e50bf0eb722bc596f5" + integrity sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g== import-fresh@^3.2.1: version "3.3.0" @@ -3252,14 +2961,14 @@ ini@^1.3.4, ini@~1.3.0: resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== -internal-slot@^1.0.7: - version "1.0.7" - resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.7.tgz#c06dcca3ed874249881007b0a5523b172a190802" - integrity sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g== +internal-slot@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.1.0.tgz#1eac91762947d2f7056bc838d93e13b2e9604961" + integrity sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw== dependencies: es-errors "^1.3.0" - hasown "^2.0.0" - side-channel "^1.0.4" + hasown "^2.0.2" + side-channel "^1.1.0" ip-address@^9.0.5: version "9.0.5" @@ -3269,35 +2978,39 @@ ip-address@^9.0.5: jsbn "1.1.0" sprintf-js "^1.1.3" -is-array-buffer@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/is-array-buffer/-/is-array-buffer-3.0.4.tgz#7a1f92b3d61edd2bc65d24f130530ea93d7fae98" - integrity sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw== +is-array-buffer@^3.0.4, is-array-buffer@^3.0.5: + version "3.0.5" + resolved "https://registry.yarnpkg.com/is-array-buffer/-/is-array-buffer-3.0.5.tgz#65742e1e687bd2cc666253068fd8707fe4d44280" + integrity sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A== dependencies: - call-bind "^1.0.2" - get-intrinsic "^1.2.1" + call-bind "^1.0.8" + call-bound "^1.0.3" + get-intrinsic "^1.2.6" is-async-function@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/is-async-function/-/is-async-function-2.0.0.tgz#8e4418efd3e5d3a6ebb0164c05ef5afb69aa9646" - integrity sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA== + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-async-function/-/is-async-function-2.1.0.tgz#1d1080612c493608e93168fc4458c245074c06a6" + integrity sha512-GExz9MtyhlZyXYLxzlJRj5WUCE661zhDa1Yna52CN57AJsymh+DvXXjyveSioqSRdxvUrdKdvqB1b5cVKsNpWQ== dependencies: - has-tostringtag "^1.0.0" + call-bound "^1.0.3" + get-proto "^1.0.1" + has-tostringtag "^1.0.2" + safe-regex-test "^1.1.0" -is-bigint@^1.0.1: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.0.4.tgz#08147a1875bc2b32005d41ccd8291dffc6691df3" - integrity sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg== +is-bigint@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.1.0.tgz#dda7a3445df57a42583db4228682eba7c4170672" + integrity sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ== dependencies: - has-bigints "^1.0.1" + has-bigints "^1.0.2" -is-boolean-object@^1.1.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.1.2.tgz#5c6dc200246dd9321ae4b885a114bb1f75f63719" - integrity sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA== +is-boolean-object@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.2.1.tgz#c20d0c654be05da4fbc23c562635c019e93daf89" + integrity sha512-l9qO6eFlUETHtuihLcYOaLKByJ1f+N4kthcU9YjHy3N+B3hWv0y/2Nd0mu/7lTFnRQHTrSdXF50HQ3bl5fEnng== dependencies: - call-bind "^1.0.2" - has-tostringtag "^1.0.0" + call-bound "^1.0.2" + has-tostringtag "^1.0.2" is-builtin-module@^3.2.1: version "3.2.1" @@ -3306,43 +3019,46 @@ is-builtin-module@^3.2.1: dependencies: builtin-modules "^3.3.0" -is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.7: +is-callable@^1.1.3, is-callable@^1.2.7: version "1.2.7" resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055" integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== -is-core-module@^2.12.1, is-core-module@^2.13.0, is-core-module@^2.13.1: - version "2.13.1" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.13.1.tgz#ad0d7532c6fea9da1ebdc82742d74525c6273384" - integrity sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw== +is-core-module@^2.12.1, is-core-module@^2.13.0, is-core-module@^2.15.1, is-core-module@^2.16.0: + version "2.16.1" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.16.1.tgz#2a98801a849f43e2add644fbb6bc6229b19a4ef4" + integrity sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w== dependencies: - hasown "^2.0.0" + hasown "^2.0.2" -is-data-view@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-data-view/-/is-data-view-1.0.1.tgz#4b4d3a511b70f3dc26d42c03ca9ca515d847759f" - integrity sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w== +is-data-view@^1.0.1, is-data-view@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-data-view/-/is-data-view-1.0.2.tgz#bae0a41b9688986c2188dda6657e56b8f9e63b8e" + integrity sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw== dependencies: + call-bound "^1.0.2" + get-intrinsic "^1.2.6" is-typed-array "^1.1.13" -is-date-object@^1.0.1, is-date-object@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.5.tgz#0841d5536e724c25597bf6ea62e1bd38298df31f" - integrity sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ== +is-date-object@^1.0.5, is-date-object@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.1.0.tgz#ad85541996fc7aa8b2729701d27b7319f95d82f7" + integrity sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg== dependencies: - has-tostringtag "^1.0.0" + call-bound "^1.0.2" + has-tostringtag "^1.0.2" is-extglob@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== -is-finalizationregistry@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-finalizationregistry/-/is-finalizationregistry-1.0.2.tgz#c8749b65f17c133313e661b1289b95ad3dbd62e6" - integrity sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw== +is-finalizationregistry@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/is-finalizationregistry/-/is-finalizationregistry-1.1.1.tgz#eefdcdc6c94ddd0674d9c85887bf93f944a97c90" + integrity sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg== dependencies: - call-bind "^1.0.2" + call-bound "^1.0.3" is-fullwidth-code-point@^3.0.0: version "3.0.0" @@ -3350,11 +3066,14 @@ is-fullwidth-code-point@^3.0.0: integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== is-generator-function@^1.0.10: - version "1.0.10" - resolved "https://registry.yarnpkg.com/is-generator-function/-/is-generator-function-1.0.10.tgz#f1558baf1ac17e0deea7c0415c438351ff2b3c72" - integrity sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A== + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-generator-function/-/is-generator-function-1.1.0.tgz#bf3eeda931201394f57b5dba2800f91a238309ca" + integrity sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ== dependencies: - has-tostringtag "^1.0.0" + call-bound "^1.0.3" + get-proto "^1.0.0" + has-tostringtag "^1.0.2" + safe-regex-test "^1.1.0" is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3: version "4.0.3" @@ -3373,17 +3092,13 @@ is-map@^2.0.3: resolved "https://registry.yarnpkg.com/is-map/-/is-map-2.0.3.tgz#ede96b7fe1e270b3c4465e3a465658764926d62e" integrity sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw== -is-negative-zero@^2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.3.tgz#ced903a027aca6381b777a5743069d7376a49747" - integrity sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw== - -is-number-object@^1.0.4: - version "1.0.7" - resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.7.tgz#59d50ada4c45251784e9904f5246c742f07a42fc" - integrity sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ== +is-number-object@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.1.1.tgz#144b21e95a1bc148205dcc2814a9134ec41b2541" + integrity sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw== dependencies: - has-tostringtag "^1.0.0" + call-bound "^1.0.3" + has-tostringtag "^1.0.2" is-number@^7.0.0: version "7.0.0" @@ -3395,71 +3110,86 @@ is-path-inside@^3.0.3: resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283" integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== -is-regex@^1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.4.tgz#eef5663cd59fa4c0ae339505323df6854bb15958" - integrity sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg== +is-plain-obj@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-4.1.0.tgz#d65025edec3657ce032fd7db63c97883eaed71f0" + integrity sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg== + +is-regex@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.2.1.tgz#76d70a3ed10ef9be48eb577887d74205bf0cad22" + integrity sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g== dependencies: - call-bind "^1.0.2" - has-tostringtag "^1.0.0" + call-bound "^1.0.2" + gopd "^1.2.0" + has-tostringtag "^1.0.2" + hasown "^2.0.2" is-set@^2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/is-set/-/is-set-2.0.3.tgz#8ab209ea424608141372ded6e0cb200ef1d9d01d" integrity sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg== -is-shared-array-buffer@^1.0.2, is-shared-array-buffer@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz#1237f1cba059cdb62431d378dcc37d9680181688" - integrity sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg== +is-shared-array-buffer@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.4.tgz#9b67844bd9b7f246ba0708c3a93e34269c774f6f" + integrity sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A== dependencies: - call-bind "^1.0.7" + call-bound "^1.0.3" -is-stream@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-3.0.0.tgz#e6bfd7aa6bef69f4f472ce9bb681e3e57b4319ac" - integrity sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA== +is-stream@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-4.0.1.tgz#375cf891e16d2e4baec250b85926cffc14720d9b" + integrity sha512-Dnz92NInDqYckGEUJv689RbRiTSEHCQ7wOVeALbkOz999YpqT46yMRIGtSNl2iCL1waAZSx40+h59NV/EwzV/A== -is-string@^1.0.5, is-string@^1.0.7: - version "1.0.7" - resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.7.tgz#0dd12bf2006f255bb58f695110eff7491eebc0fd" - integrity sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg== +is-string@^1.0.7, is-string@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.1.1.tgz#92ea3f3d5c5b6e039ca8677e5ac8d07ea773cbb9" + integrity sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA== dependencies: - has-tostringtag "^1.0.0" + call-bound "^1.0.3" + has-tostringtag "^1.0.2" -is-symbol@^1.0.2, is-symbol@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.4.tgz#a6dac93b635b063ca6872236de88910a57af139c" - integrity sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg== +is-symbol@^1.0.4, is-symbol@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.1.1.tgz#f47761279f532e2b05a7024a7506dbbedacd0634" + integrity sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w== dependencies: - has-symbols "^1.0.2" + call-bound "^1.0.2" + has-symbols "^1.1.0" + safe-regex-test "^1.1.0" -is-typed-array@^1.1.13: - version "1.1.13" - resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.13.tgz#d6c5ca56df62334959322d7d7dd1cca50debe229" - integrity sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw== +is-typed-array@^1.1.13, is-typed-array@^1.1.14, is-typed-array@^1.1.15: + version "1.1.15" + resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.15.tgz#4bfb4a45b61cee83a5a46fba778e4e8d59c0ce0b" + integrity sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ== dependencies: - which-typed-array "^1.1.14" + which-typed-array "^1.1.16" + +is-unicode-supported@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-2.1.0.tgz#09f0ab0de6d3744d48d265ebb98f65d11f2a9b3a" + integrity sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ== is-weakmap@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/is-weakmap/-/is-weakmap-2.0.2.tgz#bf72615d649dfe5f699079c54b83e47d1ae19cfd" integrity sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w== -is-weakref@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-weakref/-/is-weakref-1.0.2.tgz#9529f383a9338205e89765e0392efc2f100f06f2" - integrity sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ== +is-weakref@^1.0.2, is-weakref@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-weakref/-/is-weakref-1.1.0.tgz#47e3472ae95a63fa9cf25660bcf0c181c39770ef" + integrity sha512-SXM8Nwyys6nT5WP6pltOwKytLV7FqQ4UiibxVmW+EIosHcmCqkkjViTb5SNssDlkCiEYRP1/pdWUKVvZBmsR2Q== dependencies: - call-bind "^1.0.2" + call-bound "^1.0.2" is-weakset@^2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/is-weakset/-/is-weakset-2.0.3.tgz#e801519df8c0c43e12ff2834eead84ec9e624007" - integrity sha512-LvIm3/KWzS9oRFHugab7d+M/GcBXuXX5xZkzPmN+NxihdQlZUQ4dWuSV1xR/sq6upL1TJEDrfBgRepHFdBtSNQ== + version "2.0.4" + resolved "https://registry.yarnpkg.com/is-weakset/-/is-weakset-2.0.4.tgz#c9f5deb0bc1906c6d6f1027f284ddf459249daca" + integrity sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ== dependencies: - call-bind "^1.0.7" - get-intrinsic "^1.2.4" + call-bound "^1.0.3" + get-intrinsic "^1.2.6" isarray@^2.0.5: version "2.0.5" @@ -3471,21 +3201,10 @@ isexe@^2.0.0: resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== -iterator.prototype@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/iterator.prototype/-/iterator.prototype-1.1.2.tgz#5e29c8924f01916cb9335f1ff80619dcff22b0c0" - integrity sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w== - dependencies: - define-properties "^1.2.1" - get-intrinsic "^1.2.1" - has-symbols "^1.0.3" - reflect.getprototypeof "^1.0.4" - set-function-name "^2.0.1" - jackspeak@^3.1.2: - version "3.4.0" - resolved "https://registry.yarnpkg.com/jackspeak/-/jackspeak-3.4.0.tgz#a75763ff36ad778ede6a156d8ee8b124de445b4a" - integrity sha512-JVYhQnN59LVPFCEcVa2C3CrEKYacvjRfqIQl+h8oi91aLYQVWRYbxjPcv1bUiUy/kLmQaANrYfNMCO3kuEDHfw== + version "3.4.3" + resolved "https://registry.yarnpkg.com/jackspeak/-/jackspeak-3.4.3.tgz#8833a9d89ab4acde6188942bd1c53b6390ed5a8a" + integrity sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw== dependencies: "@isaacs/cliui" "^8.0.2" optionalDependencies: @@ -3496,11 +3215,6 @@ joycon@^3.1.1: resolved "https://registry.yarnpkg.com/joycon/-/joycon-3.1.1.tgz#bce8596d6ae808f8b68168f5fc69280996894f03" integrity sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw== -js-tokens@^8.0.2: - version "8.0.3" - resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-8.0.3.tgz#1c407ec905643603b38b6be6977300406ec48775" - integrity sha512-UfJMcSJc+SEXEl9lH/VLHSZbThQyLpw1vLO1Lb+j4RWDvG3N2f7yj3PVQA3cmkTBNldJ9eFnM+xEXxHIXrYiJw== - js-yaml@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" @@ -3540,11 +3254,6 @@ json5@^1.0.2: dependencies: minimist "^1.2.0" -jsonc-parser@^3.2.0: - version "3.2.1" - resolved "https://registry.yarnpkg.com/jsonc-parser/-/jsonc-parser-3.2.1.tgz#031904571ccf929d7670ee8c547545081cb37f1a" - integrity sha512-AilxAyFOAcK5wA1+LeaySVBrHsGQvUFCDWXKpZjzaL0PqW+xfBOttn8GNtWKFWqneyMZj41MWF9Kl6iPWLwgOA== - jsondiffpatch@^0.5.0: version "0.5.0" resolved "https://registry.yarnpkg.com/jsondiffpatch/-/jsondiffpatch-0.5.0.tgz#f9795416022685a3ba7eced11a338c5cb0cf66f4" @@ -3571,9 +3280,9 @@ keyv@^4.5.3: json-buffer "3.0.1" language-subtag-registry@^0.3.20: - version "0.3.22" - resolved "https://registry.yarnpkg.com/language-subtag-registry/-/language-subtag-registry-0.3.22.tgz#2e1500861b2e457eba7e7ae86877cbd08fa1fd1d" - integrity sha512-tN0MCzyWnoz/4nHS6uxdlFWoUZT7ABptwKPQ52Ea7URk6vll88bWBVhodtnlfEuCcKWNGoc+uGbw1cwa9IKh/w== + version "0.3.23" + resolved "https://registry.yarnpkg.com/language-subtag-registry/-/language-subtag-registry-0.3.23.tgz#23529e04d9e3b74679d70142df3fd2eb6ec572e7" + integrity sha512-0K65Lea881pHotoGEa5gDlMxt3pctLi2RplBb7Ezh4rRdLEOtgi7n4EwK9lamnUCkKBqaeKRVebTq6BAxSkpXQ== language-tags@^1.0.9: version "1.0.9" @@ -3590,14 +3299,6 @@ levn@^0.4.1: prelude-ls "^1.2.1" type-check "~0.4.0" -local-pkg@^0.5.0: - version "0.5.0" - resolved "https://registry.yarnpkg.com/local-pkg/-/local-pkg-0.5.0.tgz#093d25a346bae59a99f80e75f6e9d36d7e8c925c" - integrity sha512-ok6z3qlYyCDS4ZEU27HaU6x/xZa9Whf8jD4ptH5UZTQYZVYeb9bnZ3ojVhiJNLiXK1Hfc0GNbLXcmZ5plLDDBg== - dependencies: - mlly "^1.4.2" - pkg-types "^1.0.3" - locate-path@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" @@ -3615,17 +3316,20 @@ lodash@^4.17.21: resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== -loupe@^2.3.6, loupe@^2.3.7: - version "2.3.7" - resolved "https://registry.yarnpkg.com/loupe/-/loupe-2.3.7.tgz#6e69b7d4db7d3ab436328013d37d1c8c3540c697" - integrity sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA== - dependencies: - get-func-name "^2.0.1" +loupe@^3.1.0, loupe@^3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/loupe/-/loupe-3.1.2.tgz#c86e0696804a02218f2206124c45d8b15291a240" + integrity sha512-23I4pFZHmAemUnz8WZXbYRSKYj801VDaNv9ETuMh7IrMc7VuVVSo+Z9iLE3ni30+U48iDWfi30d3twAXBYmnCg== lru-cache@^10.2.0: - version "10.2.2" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-10.2.2.tgz#48206bc114c1252940c41b25b41af5b545aca878" - integrity sha512-9hp3Vp2/hFQUiIwKo8XCeFVnrg8Pk3TYNPIR7tJADKi5YfcF7vEaK7avFHTlSy3kOKYaJQaalfEo6YuXdceBOQ== + version "10.4.3" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-10.4.3.tgz#410fc8a17b70e598013df257c2446b7f3383f119" + integrity sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ== + +lru-cache@^11.0.1: + version "11.0.2" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-11.0.2.tgz#fbd8e7cf8211f5e7e5d91905c415a3f55755ca39" + integrity sha512-123qHRfJBmo2jXDbo/a5YOQrJoHF/GNQTLzQ5+IdK5pWpceK17yRc6ozlWd25FxvGKQbIUs91fDFkXmDHTKcyA== lru-cache@^6.0.0: version "6.0.0" @@ -3634,17 +3338,12 @@ lru-cache@^6.0.0: dependencies: yallist "^4.0.0" -magic-string@^0.30.5: - version "0.30.8" - resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.30.8.tgz#14e8624246d2bedba70d5462aa99ac9681844613" - integrity sha512-ISQTe55T2ao7XtlAStud6qwYPZjE4GK1S/BeVPus4jrq6JuOnQ00YKQC581RWhR122W7msZV263KzVeLoqidyQ== +magic-string@^0.30.12: + version "0.30.17" + resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.30.17.tgz#450a449673d2460e5bbcfba9a61916a1714c7453" + integrity sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA== dependencies: - "@jridgewell/sourcemap-codec" "^1.4.15" - -make-error@^1.1.1: - version "1.3.6" - resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" - integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== + "@jridgewell/sourcemap-codec" "^1.5.0" make-fetch-happen@^9.1.0: version "9.1.0" @@ -3675,22 +3374,22 @@ matcher@^3.0.0: dependencies: escape-string-regexp "^4.0.0" -merge-stream@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" - integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== +math-intrinsics@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/math-intrinsics/-/math-intrinsics-1.1.0.tgz#a0dd74be81e2aa5c2f27e65ce283605ee4e2b7f9" + integrity sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g== merge2@^1.3.0, merge2@^1.4.1: version "1.4.1" resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== -micromatch@^4.0.4: - version "4.0.5" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.5.tgz#bc8999a7cbbf77cdc89f132f6e467051b49090c6" - integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA== +micromatch@^4.0.8: + version "4.0.8" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.8.tgz#d66fa18f3a47076789320b9b1af32bd86d9fa202" + integrity sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA== dependencies: - braces "^3.0.2" + braces "^3.0.3" picomatch "^2.3.1" mime-db@1.52.0: @@ -3705,11 +3404,6 @@ mime-types@^2.1.12: dependencies: mime-db "1.52.0" -mimic-fn@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-4.0.0.tgz#60a90550d5cb0b239cca65d893b1a53b29871ecc" - integrity sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw== - mimic-response@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-3.1.0.tgz#2d1d59af9c1b129815accc2c46a022a5ce1fa3c9" @@ -3730,9 +3424,9 @@ minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2: brace-expansion "^1.1.7" minimatch@^9.0.4: - version "9.0.4" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.4.tgz#8e49c731d1749cbec05050ee5145147b32496a51" - integrity sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw== + version "9.0.5" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.5.tgz#d74f9dd6b57d83d8e98cfb82133b03978bc929e5" + integrity sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow== dependencies: brace-expansion "^2.0.1" @@ -3820,27 +3514,17 @@ mkdirp@^2.1.3: resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-2.1.6.tgz#964fbcb12b2d8c5d6fbc62a963ac95a273e2cc19" integrity sha512-+hEnITedc8LAtIP9u3HJDFIdcLV2vXP33sqLLIzkv1Db1zO/1OxbvYf0Y1OC/S/Qo5dxHXepofhmxL02PsKe+A== -mlly@^1.2.0, mlly@^1.4.2: - version "1.6.1" - resolved "https://registry.yarnpkg.com/mlly/-/mlly-1.6.1.tgz#0983067dc3366d6314fc5e12712884e6978d028f" - integrity sha512-vLgaHvaeunuOXHSmEbZ9izxPx3USsk8KCQ8iC+aTlp5sKRSoZvwhHh5L9VbKSaVC6sJDqbyohIS76E2VmHIPAA== - dependencies: - acorn "^8.11.3" - pathe "^1.1.2" - pkg-types "^1.0.3" - ufo "^1.3.2" - mock-socket@^9.3.1: version "9.3.1" resolved "https://registry.yarnpkg.com/mock-socket/-/mock-socket-9.3.1.tgz#24fb00c2f573c84812aa4a24181bb025de80cc8e" integrity sha512-qxBgB7Qa2sEQgHFjj0dSigq7fX4k6Saisd5Nelwp2q8mlbAFh5dHV9JTTlF8viYJLSSWgMCZFUom8PJcMNBoJw== -ms@2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" - integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== +mrmime@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/mrmime/-/mrmime-2.0.0.tgz#151082a6e06e59a9a39b46b3e14d5cfe92b3abb4" + integrity sha512-eu38+hdgojoyq63s+yTpN4XMBdt5l8HhMhc4VKLO9KM5caLIBvUm4thi7fFaxyTmCKeNnXZ5pAlBwCUnhA09uw== -ms@^2.0.0, ms@^2.1.1: +ms@^2.0.0, ms@^2.1.1, ms@^2.1.3: version "2.1.3" resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== @@ -3855,9 +3539,9 @@ mz@^2.4.0: thenify-all "^1.0.0" nanoid@^3.3.7: - version "3.3.7" - resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.7.tgz#d0c301a691bc8d54efa0a2226ccf3fe2fd656bd8" - integrity sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g== + version "3.3.8" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.8.tgz#b1be3030bee36aaff18bacb375e5cce521684baf" + integrity sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w== napi-build-utils@^1.0.1: version "1.0.2" @@ -3870,30 +3554,30 @@ natural-compare@^1.4.0: integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== negotiator@^0.6.2: - version "0.6.3" - resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd" - integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg== + version "0.6.4" + resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.4.tgz#777948e2452651c570b712dd01c23e262713fff7" + integrity sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w== -nock@^13.5.0: - version "13.5.4" - resolved "https://registry.yarnpkg.com/nock/-/nock-13.5.4.tgz#8918f0addc70a63736170fef7106a9721e0dc479" - integrity sha512-yAyTfdeNJGGBFxWdzSKCBYxs5FxLbCg5X5Q4ets974hcQzG1+qCxvIyOo4j2Ry6MUlhWVMX4OoYDefAIIwupjw== +nock@^13.5.5: + version "13.5.6" + resolved "https://registry.yarnpkg.com/nock/-/nock-13.5.6.tgz#5e693ec2300bbf603b61dae6df0225673e6c4997" + integrity sha512-o2zOYiCpzRqSzPj0Zt/dQ/DqZeYoaQ7TUonc/xUPjCGl9WeHpNbxgVvOquXYAaJzI0M9BXV3HTzG0p8IUAbBTQ== dependencies: debug "^4.1.0" json-stringify-safe "^5.0.1" propagate "^2.0.0" node-abi@^3.3.0: - version "3.65.0" - resolved "https://registry.yarnpkg.com/node-abi/-/node-abi-3.65.0.tgz#ca92d559388e1e9cab1680a18c1a18757cdac9d3" - integrity sha512-ThjYBfoDNr08AWx6hGaRbfPwxKV9kVzAzOzlLKbk2CuqXE2xnCh+cbAGnwM3t8Lq4v9rUB7VfondlkBckcJrVA== + version "3.71.0" + resolved "https://registry.yarnpkg.com/node-abi/-/node-abi-3.71.0.tgz#52d84bbcd8575efb71468fbaa1f9a49b2c242038" + integrity sha512-SZ40vRiy/+wRTf21hxkkEjPJZpARzUMVcJoQse2EF8qkUWbbO2z7vd5oA/H6bVH6SZQ5STGcu0KRDS7biNRfxw== dependencies: semver "^7.3.5" node-addon-api@^7.0.0: - version "7.1.0" - resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-7.1.0.tgz#71f609369379c08e251c558527a107107b5e0fdb" - integrity sha512-mNcltoe1R8o7STTegSOHdnJNN7s5EUvhoS7ShnTHDyOSd+8H+UdWODq6qSv67PjC8Zc5JRT8+oLAMCr0SIXw7g== + version "7.1.1" + resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-7.1.1.tgz#1aba6693b0f255258a049d621329329322aad558" + integrity sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ== node-domexception@^1.0.0: version "1.0.0" @@ -3932,12 +3616,13 @@ nopt@^5.0.0: dependencies: abbrev "1" -npm-run-path@^5.1.0: - version "5.3.0" - resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-5.3.0.tgz#e23353d0ebb9317f174e93417e4a4d82d0249e9f" - integrity sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ== +npm-run-path@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-6.0.0.tgz#25cfdc4eae04976f3349c0b1afc089052c362537" + integrity sha512-9qny7Z9DsQU8Ou39ERsPU4OZQlSTP47ShQzuKZ6PRXpYLtIFgl/DEBYEXKlvcEa+9tHVcK8CF81Y2V72qaZhWA== dependencies: path-key "^4.0.0" + unicorn-magic "^0.3.0" npmlog@^6.0.0: version "6.0.2" @@ -3954,27 +3639,29 @@ object-assign@^4.0.1: resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== -object-inspect@^1.13.1: - version "1.13.1" - resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.1.tgz#b96c6109324ccfef6b12216a956ca4dc2ff94bc2" - integrity sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ== +object-inspect@^1.13.3: + version "1.13.3" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.3.tgz#f14c183de51130243d6d18ae149375ff50ea488a" + integrity sha512-kDCGIbxkDSXE3euJZZXzc6to7fCrKHNI/hSRQnRuQ+BWjFNzZwiFF8fj/6o2t2G9/jTj8PSIYTfCLelLZEeRpA== object-keys@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== -object.assign@^4.1.2, object.assign@^4.1.4, object.assign@^4.1.5: - version "4.1.5" - resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.5.tgz#3a833f9ab7fdb80fc9e8d2300c803d216d8fdbb0" - integrity sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ== +object.assign@^4.1.2, object.assign@^4.1.4, object.assign@^4.1.7: + version "4.1.7" + resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.7.tgz#8c14ca1a424c6a561b0bb2a22f66f5049a945d3d" + integrity sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw== dependencies: - call-bind "^1.0.5" + call-bind "^1.0.8" + call-bound "^1.0.3" define-properties "^1.2.1" - has-symbols "^1.0.3" + es-object-atoms "^1.0.0" + has-symbols "^1.1.0" object-keys "^1.1.1" -object.entries@^1.1.5, object.entries@^1.1.7: +object.entries@^1.1.5: version "1.1.8" resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.8.tgz#bffe6f282e01f4d17807204a24f8edd823599c41" integrity sha512-cmopxi8VwRIAw/fkijJohSfpef5PdN0pMQJN6VC/ZKvn0LIknWD8KtgY6KlQdEc4tIjcQ3HxSMmnvtzIscdaYQ== @@ -3983,7 +3670,7 @@ object.entries@^1.1.5, object.entries@^1.1.7: define-properties "^1.2.1" es-object-atoms "^1.0.0" -object.fromentries@^2.0.7: +object.fromentries@^2.0.8: version "2.0.8" resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.8.tgz#f7195d8a9b97bd95cbc1999ea939ecd1a2b00c65" integrity sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ== @@ -3993,7 +3680,7 @@ object.fromentries@^2.0.7: es-abstract "^1.23.2" es-object-atoms "^1.0.0" -object.groupby@^1.0.1: +object.groupby@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/object.groupby/-/object.groupby-1.0.3.tgz#9b125c36238129f6f7b61954a1e7176148d5002e" integrity sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ== @@ -4002,12 +3689,13 @@ object.groupby@^1.0.1: define-properties "^1.2.1" es-abstract "^1.23.2" -object.values@^1.1.6, object.values@^1.1.7: - version "1.2.0" - resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.2.0.tgz#65405a9d92cee68ac2d303002e0b8470a4d9ab1b" - integrity sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ== +object.values@^1.1.6, object.values@^1.2.0: + version "1.2.1" + resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.2.1.tgz#deed520a50809ff7f75a7cfd4bc64c7a038c6216" + integrity sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA== dependencies: - call-bind "^1.0.7" + call-bind "^1.0.8" + call-bound "^1.0.3" define-properties "^1.2.1" es-object-atoms "^1.0.0" @@ -4023,24 +3711,26 @@ once@^1.3.0, once@^1.3.1, once@^1.4.0: dependencies: wrappy "1" -onetime@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/onetime/-/onetime-6.0.0.tgz#7c24c18ed1fd2e9bca4bd26806a33613c77d34b4" - integrity sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ== - dependencies: - mimic-fn "^4.0.0" - optionator@^0.9.3: - version "0.9.3" - resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.3.tgz#007397d44ed1872fdc6ed31360190f81814e2c64" - integrity sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg== + version "0.9.4" + resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.4.tgz#7ea1c1a5d91d764fb282139c88fe11e182a3a734" + integrity sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g== dependencies: - "@aashutoshrathi/word-wrap" "^1.2.3" deep-is "^0.1.3" fast-levenshtein "^2.0.6" levn "^0.4.1" prelude-ls "^1.2.1" type-check "^0.4.0" + word-wrap "^1.2.5" + +own-keys@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/own-keys/-/own-keys-1.0.1.tgz#e4006910a2bf913585289676eebd6f390cf51358" + integrity sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg== + dependencies: + get-intrinsic "^1.2.6" + object-keys "^1.1.1" + safe-push-apply "^1.0.0" p-limit@^3.0.2: version "3.1.0" @@ -4049,13 +3739,6 @@ p-limit@^3.0.2: dependencies: yocto-queue "^0.1.0" -p-limit@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-5.0.0.tgz#6946d5b7140b649b7a33a027d89b4c625b3a5985" - integrity sha512-/Eaoq+QyLSiXQ4lyYV23f14mZRQcXnxfHrN0vCai+ak9G0pp9iEQukIIZq5NccEvwRB8PUnZT0KsOoDCINS1qQ== - dependencies: - yocto-queue "^1.0.0" - p-locate@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" @@ -4071,9 +3754,9 @@ p-map@^4.0.0: aggregate-error "^3.0.0" package-json-from-dist@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/package-json-from-dist/-/package-json-from-dist-1.0.0.tgz#e501cd3094b278495eb4258d4c9f6d5ac3019f00" - integrity sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw== + version "1.0.1" + resolved "https://registry.yarnpkg.com/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz#4f1471a010827a86f94cfd9b0727e36d267de505" + integrity sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw== parent-module@^1.0.0: version "1.0.1" @@ -4082,6 +3765,11 @@ parent-module@^1.0.0: dependencies: callsites "^3.0.0" +parse-ms@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/parse-ms/-/parse-ms-4.0.0.tgz#c0c058edd47c2a590151a718990533fd62803df4" + integrity sha512-TXfryirbmq34y8QBwgqCVLi+8oA3oWx2eAnSn62ITyEhEYaWRlVZ2DvMM9eZbMs/RfxPu/PK/aBLyGj4IrqMHw== + parse5-htmlparser2-tree-adapter@^6.0.0: version "6.0.1" resolved "https://registry.yarnpkg.com/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-6.0.1.tgz#2cdf9ad823321140370d4dbf5d3e92c7c8ddc6e6" @@ -4137,38 +3825,42 @@ path-type@^4.0.0: resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== -pathe@^1.1.0, pathe@^1.1.1, pathe@^1.1.2: +pathe@^1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/pathe/-/pathe-1.1.2.tgz#6c4cb47a945692e48a1ddd6e4094d170516437ec" integrity sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ== -pathval@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/pathval/-/pathval-1.1.1.tgz#8534e77a77ce7ac5a2512ea21e0fdb8fcf6c3d8d" - integrity sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ== +pathval@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/pathval/-/pathval-2.0.0.tgz#7e2550b422601d4f6b8e26f1301bc8f15a741a25" + integrity sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA== -picocolors@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" - integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== +picocolors@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.1.1.tgz#3d321af3eab939b083c8f929a1d12cda81c26b6b" + integrity sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA== picomatch@^2.3.1: version "2.3.1" resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== -pino-abstract-transport@^1.0.0, pino-abstract-transport@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/pino-abstract-transport/-/pino-abstract-transport-1.2.0.tgz#97f9f2631931e242da531b5c66d3079c12c9d1b5" - integrity sha512-Guhh8EZfPCfH+PMXAb6rKOjGQEoy0xlAIn+irODG5kgfYV+BQ0rGYYWTIel3P5mmyXqkYkPmdIkywsn6QKUR1Q== +picomatch@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-4.0.2.tgz#77c742931e8f3b8820946c76cd0c1f13730d1dab" + integrity sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg== + +pino-abstract-transport@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/pino-abstract-transport/-/pino-abstract-transport-2.0.0.tgz#de241578406ac7b8a33ce0d77ae6e8a0b3b68a60" + integrity sha512-F63x5tizV6WCh4R6RHyi2Ml+M70DNRXt/+HANowMflpgGFMAym/VKm6G7ZOQRjqN7XbGxK1Lg9t6ZrtzOaivMw== dependencies: - readable-stream "^4.0.0" split2 "^4.0.0" -pino-pretty@^11.0.0: - version "11.2.1" - resolved "https://registry.yarnpkg.com/pino-pretty/-/pino-pretty-11.2.1.tgz#de9a42ff8ea7b26da93506bb9e49d0b566c5ae96" - integrity sha512-O05NuD9tkRasFRWVaF/uHLOvoRDFD7tb5VMertr78rbsYFjYp48Vg3477EshVAF5eZaEw+OpDl/tu+B0R5o+7g== +pino-pretty@^11.3.0: + version "11.3.0" + resolved "https://registry.yarnpkg.com/pino-pretty/-/pino-pretty-11.3.0.tgz#390b3be044cf3d2e9192c7d19d44f6b690468f2e" + integrity sha512-oXwn7ICywaZPHmu3epHGU2oJX4nPmKvHvB/bwrJHlGcbEWaVcotkpyVHMKLKmiVryWYByNp0jpgAcXpFJDXJzA== dependencies: colorette "^2.0.7" dateformat "^4.6.3" @@ -4178,57 +3870,48 @@ pino-pretty@^11.0.0: joycon "^3.1.1" minimist "^1.2.6" on-exit-leak-free "^2.1.0" - pino-abstract-transport "^1.0.0" + pino-abstract-transport "^2.0.0" pump "^3.0.0" readable-stream "^4.0.0" secure-json-parse "^2.4.0" sonic-boom "^4.0.1" strip-json-comments "^3.1.1" -pino-std-serializers@^6.0.0: - version "6.2.2" - resolved "https://registry.yarnpkg.com/pino-std-serializers/-/pino-std-serializers-6.2.2.tgz#d9a9b5f2b9a402486a5fc4db0a737570a860aab3" - integrity sha512-cHjPPsE+vhj/tnhCy/wiMh3M3z3h/j15zHQX+S9GkTBgqJuTuJzYJ4gUyACLhDaJ7kk9ba9iRDmbH2tJU03OiA== +pino-std-serializers@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/pino-std-serializers/-/pino-std-serializers-7.0.0.tgz#7c625038b13718dbbd84ab446bd673dc52259e3b" + integrity sha512-e906FRY0+tV27iq4juKzSYPbUj2do2X2JX4EzSca1631EB2QJQUqGbDuERal7LCtOpxl6x3+nvo9NPZcmjkiFA== -pino@^8.19.0: - version "8.21.0" - resolved "https://registry.yarnpkg.com/pino/-/pino-8.21.0.tgz#e1207f3675a2722940d62da79a7a55a98409f00d" - integrity sha512-ip4qdzjkAyDDZklUaZkcRFb2iA118H9SgRh8yzTkSQK8HilsOJF7rSY8HoW5+I0M46AZgX/pxbprf2vvzQCE0Q== +pino@^9.5.0: + version "9.6.0" + resolved "https://registry.yarnpkg.com/pino/-/pino-9.6.0.tgz#6bc628159ba0cc81806d286718903b7fc6b13169" + integrity sha512-i85pKRCt4qMjZ1+L7sy2Ag4t1atFcdbEt76+7iRJn1g2BvsnRMGu9p8pivl9fs63M2kF/A0OacFZhTub+m/qMg== dependencies: atomic-sleep "^1.0.0" fast-redact "^3.1.1" on-exit-leak-free "^2.1.0" - pino-abstract-transport "^1.2.0" - pino-std-serializers "^6.0.0" - process-warning "^3.0.0" + pino-abstract-transport "^2.0.0" + pino-std-serializers "^7.0.0" + process-warning "^4.0.0" quick-format-unescaped "^4.0.3" real-require "^0.2.0" safe-stable-stringify "^2.3.1" - sonic-boom "^3.7.0" - thread-stream "^2.6.0" - -pkg-types@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/pkg-types/-/pkg-types-1.0.3.tgz#988b42ab19254c01614d13f4f65a2cfc7880f868" - integrity sha512-nN7pYi0AQqJnoLPC9eHFQ8AcyaixBUOwvqc5TDnIKCMEE6I0y8P7OKA7fPexsXGCGxQDl/cmrLAp26LhcwxZ4A== - dependencies: - jsonc-parser "^3.2.0" - mlly "^1.2.0" - pathe "^1.1.0" + sonic-boom "^4.0.1" + thread-stream "^3.0.0" possible-typed-array-names@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz#89bb63c6fada2c3e90adc4a647beeeb39cc7bf8f" integrity sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q== -postcss@^8.4.36: - version "8.4.38" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.38.tgz#b387d533baf2054288e337066d81c6bee9db9e0e" - integrity sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A== +postcss@^8.4.43: + version "8.4.49" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.49.tgz#4ea479048ab059ab3ae61d082190fabfd994fe19" + integrity sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA== dependencies: nanoid "^3.3.7" - picocolors "^1.0.0" - source-map-js "^1.2.0" + picocolors "^1.1.1" + source-map-js "^1.2.1" prebuild-install@^7.1.1: version "7.1.2" @@ -4261,23 +3944,21 @@ prettier-linter-helpers@^1.0.0: fast-diff "^1.1.2" prettier@^3.2.5: - version "3.2.5" - resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.2.5.tgz#e52bc3090586e824964a8813b09aba6233b28368" - integrity sha512-3/GWa9aOC0YeD7LUfvOG2NiDyhOWRvt1k+rcKhOuYnMY24iiCphgneUfJDyFXd6rZCAnuLBv6UeAULtrhT/F4A== + version "3.4.2" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.4.2.tgz#a5ce1fb522a588bf2b78ca44c6e6fe5aa5a2b13f" + integrity sha512-e9MewbtFo+Fevyuxn/4rrcDAaq0IYxPGLvObpQjiZBMAzB9IGmzlnG9RZy3FFas+eBMu2vA0CszMeduow5dIuQ== -pretty-format@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-29.7.0.tgz#ca42c758310f365bfa71a0bda0a807160b776812" - integrity sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ== +pretty-ms@^9.0.0: + version "9.2.0" + resolved "https://registry.yarnpkg.com/pretty-ms/-/pretty-ms-9.2.0.tgz#e14c0aad6493b69ed63114442a84133d7e560ef0" + integrity sha512-4yf0QO/sllf/1zbZWYnvWw3NxCQwLXKzIj0G849LSufP15BXKM0rbD2Z3wVnkMfjdn/CB0Dpp444gYAACdsplg== dependencies: - "@jest/schemas" "^29.6.3" - ansi-styles "^5.0.0" - react-is "^18.0.0" + parse-ms "^4.0.0" -process-warning@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/process-warning/-/process-warning-3.0.0.tgz#96e5b88884187a1dce6f5c3166d611132058710b" - integrity sha512-mqn0kFRl0EoqhnL0GQ0veqFHyIN1yig9RHh/InzORTUiZHFRAur+aMtRkELNwGs9aNwKS6tg/An4NYBPGwvtzQ== +process-warning@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/process-warning/-/process-warning-4.0.1.tgz#5c1db66007c67c756e4e09eb170cdece15da32fb" + integrity sha512-3c2LzQ3rY9d0hc1emcsHhfT9Jwz0cChib/QN89oME2R451w5fy3f0afAhERFZAwrbDU43wk12d0ORBpDVME50Q== process@^0.11.10: version "0.11.10" @@ -4313,9 +3994,9 @@ proxy-from-env@^1.1.0: integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg== pump@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" - integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== + version "3.0.2" + resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.2.tgz#836f3edd6bc2ee599256c924ffe0d88573ddcbf8" + integrity sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw== dependencies: end-of-stream "^1.1.0" once "^1.3.1" @@ -4345,11 +4026,6 @@ rc@^1.2.7: minimist "^1.2.0" strip-json-comments "~2.0.1" -react-is@^18.0.0: - version "18.2.0" - resolved "https://registry.yarnpkg.com/react-is/-/react-is-18.2.0.tgz#199431eeaaa2e09f86427efbb4f1473edb47609b" - integrity sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w== - readable-stream@^3.1.1, readable-stream@^3.4.0, readable-stream@^3.6.0: version "3.6.2" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967" @@ -4360,9 +4036,9 @@ readable-stream@^3.1.1, readable-stream@^3.4.0, readable-stream@^3.6.0: util-deprecate "^1.0.1" readable-stream@^4.0.0: - version "4.5.2" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-4.5.2.tgz#9e7fc4c45099baeed934bff6eb97ba6cf2729e09" - integrity sha512-yjavECdqeZ3GLXNgRXgeQEdz9fvDDkNKyHnbHRFtOr7/LcfgBcmct7t/ET+HaCTqfh06OzoAxrkN/IfjJBVe+g== + version "4.7.0" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-4.7.0.tgz#cedbd8a1146c13dfff8dab14068028d58c15ac91" + integrity sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg== dependencies: abort-controller "^3.0.0" buffer "^6.0.3" @@ -4380,33 +4056,31 @@ reflect-metadata@^0.2.1: resolved "https://registry.yarnpkg.com/reflect-metadata/-/reflect-metadata-0.2.2.tgz#400c845b6cba87a21f2c65c4aeb158f4fa4d9c5b" integrity sha512-urBwgfrvVP/eAyXx4hluJivBKzuEbSQs9rKWCrCkbSxNv8mxPcUZKeuoF3Uy4mJl3Lwprp6yy5/39VWigZ4K6Q== -reflect.getprototypeof@^1.0.4: - version "1.0.6" - resolved "https://registry.yarnpkg.com/reflect.getprototypeof/-/reflect.getprototypeof-1.0.6.tgz#3ab04c32a8390b770712b7a8633972702d278859" - integrity sha512-fmfw4XgoDke3kdI6h4xcUz1dG8uaiv5q9gcEwLS4Pnth2kxT+GZ7YehS1JTMGBQmtV7Y4GFGbs2re2NqhdozUg== +reflect.getprototypeof@^1.0.6, reflect.getprototypeof@^1.0.9: + version "1.0.10" + resolved "https://registry.yarnpkg.com/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz#c629219e78a3316d8b604c765ef68996964e7bf9" + integrity sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw== dependencies: - call-bind "^1.0.7" + call-bind "^1.0.8" define-properties "^1.2.1" - es-abstract "^1.23.1" + es-abstract "^1.23.9" es-errors "^1.3.0" - get-intrinsic "^1.2.4" - globalthis "^1.0.3" - which-builtin-type "^1.1.3" - -regenerator-runtime@^0.14.0: - version "0.14.1" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz#356ade10263f685dda125100cd862c1db895327f" - integrity sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw== + es-object-atoms "^1.0.0" + get-intrinsic "^1.2.7" + get-proto "^1.0.1" + which-builtin-type "^1.2.1" -regexp.prototype.flags@^1.5.2: - version "1.5.2" - resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz#138f644a3350f981a858c44f6bb1a61ff59be334" - integrity sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw== +regexp.prototype.flags@^1.5.3: + version "1.5.4" + resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz#1ad6c62d44a259007e55b3970e00f746efbcaa19" + integrity sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA== dependencies: - call-bind "^1.0.6" + call-bind "^1.0.8" define-properties "^1.2.1" es-errors "^1.3.0" - set-function-name "^2.0.1" + get-proto "^1.0.1" + gopd "^1.2.0" + set-function-name "^2.0.2" require-directory@^2.1.1: version "2.1.1" @@ -4424,11 +4098,11 @@ resolve-pkg-maps@^1.0.0: integrity sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw== resolve@^1.22.2, resolve@^1.22.4: - version "1.22.8" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.8.tgz#b6c87a9f2aa06dfab52e3d70ac8cde321fa5a48d" - integrity sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw== + version "1.22.10" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.10.tgz#b663e83ffb09bbf2386944736baae803029b8b39" + integrity sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w== dependencies: - is-core-module "^2.13.0" + is-core-module "^2.16.0" path-parse "^1.0.7" supports-preserve-symlinks-flag "^1.0.0" @@ -4461,26 +4135,32 @@ roarr@^2.15.3: semver-compare "^1.0.0" sprintf-js "^1.1.2" -rollup@^4.13.0: - version "4.13.0" - resolved "https://registry.yarnpkg.com/rollup/-/rollup-4.13.0.tgz#dd2ae144b4cdc2ea25420477f68d4937a721237a" - integrity sha512-3YegKemjoQnYKmsBlOHfMLVPPA5xLkQ8MHLLSw/fBrFaVkEayL51DilPpNNLq1exr98F2B1TzrV0FUlN3gWRPg== +rollup@^4.20.0: + version "4.30.1" + resolved "https://registry.yarnpkg.com/rollup/-/rollup-4.30.1.tgz#d5c3d066055259366cdc3eb6f1d051c5d6afaf74" + integrity sha512-mlJ4glW020fPuLi7DkM/lN97mYEZGWeqBnrljzN0gs7GLctqX3lNWxKQ7Gl712UAX+6fog/L3jh4gb7R6aVi3w== dependencies: - "@types/estree" "1.0.5" + "@types/estree" "1.0.6" optionalDependencies: - "@rollup/rollup-android-arm-eabi" "4.13.0" - "@rollup/rollup-android-arm64" "4.13.0" - "@rollup/rollup-darwin-arm64" "4.13.0" - "@rollup/rollup-darwin-x64" "4.13.0" - "@rollup/rollup-linux-arm-gnueabihf" "4.13.0" - "@rollup/rollup-linux-arm64-gnu" "4.13.0" - "@rollup/rollup-linux-arm64-musl" "4.13.0" - "@rollup/rollup-linux-riscv64-gnu" "4.13.0" - "@rollup/rollup-linux-x64-gnu" "4.13.0" - "@rollup/rollup-linux-x64-musl" "4.13.0" - "@rollup/rollup-win32-arm64-msvc" "4.13.0" - "@rollup/rollup-win32-ia32-msvc" "4.13.0" - "@rollup/rollup-win32-x64-msvc" "4.13.0" + "@rollup/rollup-android-arm-eabi" "4.30.1" + "@rollup/rollup-android-arm64" "4.30.1" + "@rollup/rollup-darwin-arm64" "4.30.1" + "@rollup/rollup-darwin-x64" "4.30.1" + "@rollup/rollup-freebsd-arm64" "4.30.1" + "@rollup/rollup-freebsd-x64" "4.30.1" + "@rollup/rollup-linux-arm-gnueabihf" "4.30.1" + "@rollup/rollup-linux-arm-musleabihf" "4.30.1" + "@rollup/rollup-linux-arm64-gnu" "4.30.1" + "@rollup/rollup-linux-arm64-musl" "4.30.1" + "@rollup/rollup-linux-loongarch64-gnu" "4.30.1" + "@rollup/rollup-linux-powerpc64le-gnu" "4.30.1" + "@rollup/rollup-linux-riscv64-gnu" "4.30.1" + "@rollup/rollup-linux-s390x-gnu" "4.30.1" + "@rollup/rollup-linux-x64-gnu" "4.30.1" + "@rollup/rollup-linux-x64-musl" "4.30.1" + "@rollup/rollup-win32-arm64-msvc" "4.30.1" + "@rollup/rollup-win32-ia32-msvc" "4.30.1" + "@rollup/rollup-win32-x64-msvc" "4.30.1" fsevents "~2.3.2" run-parallel@^1.1.9: @@ -4497,14 +4177,15 @@ rxjs@^7.8.1: dependencies: tslib "^2.1.0" -safe-array-concat@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/safe-array-concat/-/safe-array-concat-1.1.2.tgz#81d77ee0c4e8b863635227c721278dd524c20edb" - integrity sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q== +safe-array-concat@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/safe-array-concat/-/safe-array-concat-1.1.3.tgz#c9e54ec4f603b0bbb8e7e5007a5ee7aecd1538c3" + integrity sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q== dependencies: - call-bind "^1.0.7" - get-intrinsic "^1.2.4" - has-symbols "^1.0.3" + call-bind "^1.0.8" + call-bound "^1.0.2" + get-intrinsic "^1.2.6" + has-symbols "^1.1.0" isarray "^2.0.5" safe-buffer@^5.0.1, safe-buffer@~5.2.0: @@ -4512,19 +4193,27 @@ safe-buffer@^5.0.1, safe-buffer@~5.2.0: resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== -safe-regex-test@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/safe-regex-test/-/safe-regex-test-1.0.3.tgz#a5b4c0f06e0ab50ea2c395c14d8371232924c377" - integrity sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw== +safe-push-apply@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/safe-push-apply/-/safe-push-apply-1.0.0.tgz#01850e981c1602d398c85081f360e4e6d03d27f5" + integrity sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA== + dependencies: + es-errors "^1.3.0" + isarray "^2.0.5" + +safe-regex-test@^1.0.3, safe-regex-test@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/safe-regex-test/-/safe-regex-test-1.1.0.tgz#7f87dfb67a3150782eaaf18583ff5d1711ac10c1" + integrity sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw== dependencies: - call-bind "^1.0.6" + call-bound "^1.0.2" es-errors "^1.3.0" - is-regex "^1.1.4" + is-regex "^1.2.1" safe-stable-stringify@^2.3.1: - version "2.4.3" - resolved "https://registry.yarnpkg.com/safe-stable-stringify/-/safe-stable-stringify-2.4.3.tgz#138c84b6f6edb3db5f8ef3ef7115b8f55ccbf886" - integrity sha512-e2bDA2WJT0wxseVd4lsDP4+3ONX6HpMXQa1ZhFQ7SU+GjvORCmShbCMltrtIDfkYhVHrOcPtj+KhmDBdPdZD1g== + version "2.5.0" + resolved "https://registry.yarnpkg.com/safe-stable-stringify/-/safe-stable-stringify-2.5.0.tgz#4ca2f8e385f2831c432a719b108a3bf7af42a1dd" + integrity sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA== "safer-buffer@>= 2.1.2 < 3.0.0": version "2.1.2" @@ -4532,9 +4221,9 @@ safe-stable-stringify@^2.3.1: integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== scale-ts@^1.6.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/scale-ts/-/scale-ts-1.6.0.tgz#e9641093c5a9e50f964ddb1607139034e3e932e9" - integrity sha512-Ja5VCjNZR8TGKhUumy9clVVxcDpM+YFjAnkMuwQy68Hixio3VRRvWdE3g8T/yC+HXA0ZDQl2TGyUmtmbcVl40Q== + version "1.6.1" + resolved "https://registry.yarnpkg.com/scale-ts/-/scale-ts-1.6.1.tgz#45151e156d6c04792223c39d8e7484ce926445f2" + integrity sha512-PBMc2AWc6wSEqJYBDPcyCLUj9/tMKnLX70jLOSndMtcUoLQucP/DM0vnQo1wJAYjTrQiq8iG9rD0q6wFzgjH7g== secure-json-parse@^2.4.0: version "2.7.0" @@ -4551,17 +4240,10 @@ semver@^6.3.0, semver@^6.3.1: resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== -semver@^7.0.0, semver@^7.5.3, semver@^7.5.4, semver@^7.6.0: - version "7.6.0" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.0.tgz#1a46a4db4bffcccd97b743b5005c8325f23d4e2d" - integrity sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg== - dependencies: - lru-cache "^6.0.0" - -semver@^7.3.2, semver@^7.3.5: - version "7.6.2" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.2.tgz#1e3b34759f896e8f14d6134732ce798aeb0c6e13" - integrity sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w== +semver@^7.0.0, semver@^7.3.2, semver@^7.3.5, semver@^7.5.3, semver@^7.5.4, semver@^7.6.0: + version "7.6.3" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.3.tgz#980f7b5550bc175fb4dc09403085627f9eb33143" + integrity sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A== serialize-error@^7.0.1: version "7.0.1" @@ -4575,7 +4257,7 @@ set-blocking@^2.0.0: resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" integrity sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw== -set-function-length@^1.2.1: +set-function-length@^1.2.2: version "1.2.2" resolved "https://registry.yarnpkg.com/set-function-length/-/set-function-length-1.2.2.tgz#aac72314198eaed975cf77b2c3b6b880695e5449" integrity sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg== @@ -4587,7 +4269,7 @@ set-function-length@^1.2.1: gopd "^1.0.1" has-property-descriptors "^1.0.2" -set-function-name@^2.0.1: +set-function-name@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/set-function-name/-/set-function-name-2.0.2.tgz#16a705c5a0dc2f5e638ca96d8a8cd4e1c2b90985" integrity sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ== @@ -4597,6 +4279,15 @@ set-function-name@^2.0.1: functions-have-names "^1.2.3" has-property-descriptors "^1.0.2" +set-proto@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/set-proto/-/set-proto-1.0.0.tgz#0760dbcff30b2d7e801fd6e19983e56da337565e" + integrity sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw== + dependencies: + dunder-proto "^1.0.1" + es-errors "^1.3.0" + es-object-atoms "^1.0.0" + sha.js@^2.4.11: version "2.4.11" resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.11.tgz#37a5cf0b81ecbc6943de109ba2960d1b26584ae7" @@ -4617,15 +4308,45 @@ shebang-regex@^3.0.0: resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== -side-channel@^1.0.4: - version "1.0.6" - resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.6.tgz#abd25fb7cd24baf45466406b1096b7831c9215f2" - integrity sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA== +side-channel-list@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/side-channel-list/-/side-channel-list-1.0.0.tgz#10cb5984263115d3b7a0e336591e290a830af8ad" + integrity sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA== dependencies: - call-bind "^1.0.7" es-errors "^1.3.0" - get-intrinsic "^1.2.4" - object-inspect "^1.13.1" + object-inspect "^1.13.3" + +side-channel-map@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/side-channel-map/-/side-channel-map-1.0.1.tgz#d6bb6b37902c6fef5174e5f533fab4c732a26f42" + integrity sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA== + dependencies: + call-bound "^1.0.2" + es-errors "^1.3.0" + get-intrinsic "^1.2.5" + object-inspect "^1.13.3" + +side-channel-weakmap@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz#11dda19d5368e40ce9ec2bdc1fb0ecbc0790ecea" + integrity sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A== + dependencies: + call-bound "^1.0.2" + es-errors "^1.3.0" + get-intrinsic "^1.2.5" + object-inspect "^1.13.3" + side-channel-map "^1.0.1" + +side-channel@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.1.0.tgz#c3fcff9c4da932784873335ec9765fa94ff66bc9" + integrity sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw== + dependencies: + es-errors "^1.3.0" + object-inspect "^1.13.3" + side-channel-list "^1.0.0" + side-channel-map "^1.0.1" + side-channel-weakmap "^1.0.2" siginfo@^2.0.0: version "2.0.0" @@ -4656,6 +4377,15 @@ simple-get@^4.0.0: once "^1.3.1" simple-concat "^1.0.0" +sirv@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/sirv/-/sirv-3.0.0.tgz#f8d90fc528f65dff04cb597a88609d4e8a4361ce" + integrity sha512-BPwJGUeDaDCHihkORDchNyyTvWFhcusy1XMmhEVTQTwGeybFbp8YEmB+njbPnth1FibULBSBVwCQni25XlCUDg== + dependencies: + "@polka/url" "^1.0.0-next.24" + mrmime "^2.0.0" + totalist "^3.0.0" + slash@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" @@ -4666,10 +4396,10 @@ smart-buffer@^4.2.0: resolved "https://registry.yarnpkg.com/smart-buffer/-/smart-buffer-4.2.0.tgz#6e1d71fa4f18c05f7d0ff216dd16a481d0e8d9ae" integrity sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg== -smoldot@2.0.22: - version "2.0.22" - resolved "https://registry.yarnpkg.com/smoldot/-/smoldot-2.0.22.tgz#1e924d2011a31c57416e79a2b97a460f462a31c7" - integrity sha512-B50vRgTY6v3baYH6uCgL15tfaag5tcS2o/P5q1OiXcKGv1axZDfz2dzzMuIkVpyMR2ug11F6EAtQlmYBQd292g== +smoldot@2.0.26: + version "2.0.26" + resolved "https://registry.yarnpkg.com/smoldot/-/smoldot-2.0.26.tgz#0e64c7fcd26240fbe4c8d6b6e4b9a9aca77e00f6" + integrity sha512-F+qYmH4z2s2FK+CxGj8moYcd1ekSIKH8ywkdqlOz88Dat35iB1DIYL11aILN46YSGMzQW/lbJNS307zBSDN5Ig== dependencies: ws "^8.8.1" @@ -4690,24 +4420,17 @@ socks@^2.6.2: ip-address "^9.0.5" smart-buffer "^4.2.0" -sonic-boom@^3.7.0: - version "3.8.1" - resolved "https://registry.yarnpkg.com/sonic-boom/-/sonic-boom-3.8.1.tgz#d5ba8c4e26d6176c9a1d14d549d9ff579a163422" - integrity sha512-y4Z8LCDBuum+PBP3lSV7RHrXscqksve/bi0as7mhwVnBW+/wUqKT/2Kb7um8yqcFy0duYbbPxzt89Zy2nOCaxg== - dependencies: - atomic-sleep "^1.0.0" - sonic-boom@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/sonic-boom/-/sonic-boom-4.0.1.tgz#515b7cef2c9290cb362c4536388ddeece07aed30" - integrity sha512-hTSD/6JMLyT4r9zeof6UtuBDpjJ9sO08/nmS5djaA9eozT9oOlNdpXSnzcgj4FTqpk3nkLrs61l4gip9r1HCrQ== + version "4.2.0" + resolved "https://registry.yarnpkg.com/sonic-boom/-/sonic-boom-4.2.0.tgz#e59a525f831210fa4ef1896428338641ac1c124d" + integrity sha512-INb7TM37/mAcsGmc9hyyI6+QR3rR1zVRu36B0NeGXKnOOLiZOfER5SA+N7X7k3yUYRzLWafduTDvJAfDswwEww== dependencies: atomic-sleep "^1.0.0" -source-map-js@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.2.0.tgz#16b809c162517b5b8c3e7dcd315a2a5c2612b2af" - integrity sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg== +source-map-js@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.2.1.tgz#1ce5650fddd87abc099eda37dcff024c2667ae46" + integrity sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA== split2@^4.0.0: version "4.2.0" @@ -4743,10 +4466,10 @@ stackback@0.0.2: resolved "https://registry.yarnpkg.com/stackback/-/stackback-0.0.2.tgz#1ac8a0d9483848d1695e418b6d031a3c3ce68e3b" integrity sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw== -std-env@^3.5.0: - version "3.7.0" - resolved "https://registry.yarnpkg.com/std-env/-/std-env-3.7.0.tgz#c9f7386ced6ecf13360b6c6c55b8aaa4ef7481d2" - integrity sha512-JPbdCEQLj1w5GilpiHAx3qJvFndqybBysA3qUOnznweH4QbNYUsW/ea8QzSrnh0vNsezMMw5bcVool8lM0gwzg== +std-env@^3.8.0: + version "3.8.0" + resolved "https://registry.yarnpkg.com/std-env/-/std-env-3.8.0.tgz#b56ffc1baf1a29dcc80a3bdf11d7fca7c315e7d5" + integrity sha512-Bc3YwwCB+OzldMxOXJIIvC6cPRWr/LxOp48CdQTOkPyk/t4JWWJbrilwBd7RJzKV8QW7tJkcgAmeuLLJugl5/w== "string-width-cjs@npm:string-width@^4.2.0": version "4.2.3" @@ -4775,26 +4498,39 @@ string-width@^5.0.1, string-width@^5.1.2: emoji-regex "^9.2.2" strip-ansi "^7.0.1" -string.prototype.trim@^1.2.9: - version "1.2.9" - resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz#b6fa326d72d2c78b6df02f7759c73f8f6274faa4" - integrity sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw== +string.prototype.includes@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/string.prototype.includes/-/string.prototype.includes-2.0.1.tgz#eceef21283640761a81dbe16d6c7171a4edf7d92" + integrity sha512-o7+c9bW6zpAdJHTtujeePODAhkuicdAryFsfVKwA+wGw89wJ4GTY484WTucM9hLtDEOpOvI+aHnzqnC5lHp4Rg== dependencies: call-bind "^1.0.7" define-properties "^1.2.1" - es-abstract "^1.23.0" + es-abstract "^1.23.3" + +string.prototype.trim@^1.2.10: + version "1.2.10" + resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.2.10.tgz#40b2dd5ee94c959b4dcfb1d65ce72e90da480c81" + integrity sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA== + dependencies: + call-bind "^1.0.8" + call-bound "^1.0.2" + define-data-property "^1.1.4" + define-properties "^1.2.1" + es-abstract "^1.23.5" es-object-atoms "^1.0.0" + has-property-descriptors "^1.0.2" -string.prototype.trimend@^1.0.8: - version "1.0.8" - resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.8.tgz#3651b8513719e8a9f48de7f2f77640b26652b229" - integrity sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ== +string.prototype.trimend@^1.0.8, string.prototype.trimend@^1.0.9: + version "1.0.9" + resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.9.tgz#62e2731272cd285041b36596054e9f66569b6942" + integrity sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ== dependencies: - call-bind "^1.0.7" + call-bind "^1.0.8" + call-bound "^1.0.2" define-properties "^1.2.1" es-object-atoms "^1.0.0" -string.prototype.trimstart@^1.0.7, string.prototype.trimstart@^1.0.8: +string.prototype.trimstart@^1.0.8: version "1.0.8" resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz#7ee834dda8c7c17eff3118472bb35bfedaa34dde" integrity sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg== @@ -4836,10 +4572,10 @@ strip-bom@^3.0.0: resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" integrity sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA== -strip-final-newline@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-3.0.0.tgz#52894c313fbff318835280aed60ff71ebf12b8fd" - integrity sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw== +strip-final-newline@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-4.0.0.tgz#35a369ec2ac43df356e3edd5dcebb6429aa1fa5c" + integrity sha512-aulFJcD6YK8V1G7iRB5tigAP4TsHBZZrOV8pjV++zdUwmeV8uzbY7yn6h9MswN62adStNZFuCIx4haBnRuMDaw== strip-json-comments@^3.1.1: version "3.1.1" @@ -4851,13 +4587,6 @@ strip-json-comments@~2.0.1: resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" integrity sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ== -strip-literal@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/strip-literal/-/strip-literal-2.0.0.tgz#5d063580933e4e03ebb669b12db64d2200687527" - integrity sha512-f9vHgsCWBq2ugHAkGMiiYY+AYG0D/cbloKKg0nhaaaSNsujdGIpVXCNsrJpCKr5M0f4aI31mr13UjY6GAuXCKA== - dependencies: - js-tokens "^8.0.2" - supports-color@^7.1.0: version "7.2.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" @@ -4870,10 +4599,10 @@ supports-preserve-symlinks-flag@^1.0.0: resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== -synckit@^0.8.6: - version "0.8.8" - resolved "https://registry.yarnpkg.com/synckit/-/synckit-0.8.8.tgz#fe7fe446518e3d3d49f5e429f443cf08b6edfcd7" - integrity sha512-HwOKAP7Wc5aRGYdKH+dw0PRRpbO841v2DENBtjnR5HFWoiNByAl7vrx3p0G/rCyYXQsrxqtX48TImFtPcIHSpQ== +synckit@^0.9.1: + version "0.9.2" + resolved "https://registry.yarnpkg.com/synckit/-/synckit-0.9.2.tgz#a3a935eca7922d48b9e7d6c61822ee6c3ae4ec62" + integrity sha512-vrozgXDQwYO72vHjUb/HnFbQx1exDjoKzqx23aXEg2a9VIg2TSFZ8FmeZpTjUCFMYw7mpX4BE2SFu8wI7asYsw== dependencies: "@pkgr/core" "^0.1.0" tslib "^2.6.2" @@ -4930,27 +4659,45 @@ thenify-all@^1.0.0: dependencies: any-promise "^1.0.0" -thread-stream@^2.6.0: - version "2.7.0" - resolved "https://registry.yarnpkg.com/thread-stream/-/thread-stream-2.7.0.tgz#d8a8e1b3fd538a6cca8ce69dbe5d3d097b601e11" - integrity sha512-qQiRWsU/wvNolI6tbbCKd9iKaTnCXsTwVxhhKM6nctPdujTyztjlbUkUTUymidWcMnZ5pWR0ej4a0tjsW021vw== +thread-stream@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/thread-stream/-/thread-stream-3.1.0.tgz#4b2ef252a7c215064507d4ef70c05a5e2d34c4f1" + integrity sha512-OqyPZ9u96VohAyMfJykzmivOrY2wfMSf3C5TtFJVgN+Hm6aj+voFhlK+kZEIv2FBh1X6Xp3DlnCOfEQ3B2J86A== dependencies: real-require "^0.2.0" -tinybench@^2.5.1: - version "2.6.0" - resolved "https://registry.yarnpkg.com/tinybench/-/tinybench-2.6.0.tgz#1423284ee22de07c91b3752c048d2764714b341b" - integrity sha512-N8hW3PG/3aOoZAN5V/NSAEDz0ZixDSSt5b/a05iqtpgfLWMSVuCo7w0k2vVvEjdrIoeGqZzweX2WlyioNIHchA== +tinybench@^2.9.0: + version "2.9.0" + resolved "https://registry.yarnpkg.com/tinybench/-/tinybench-2.9.0.tgz#103c9f8ba6d7237a47ab6dd1dcff77251863426b" + integrity sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg== -tinypool@^0.8.2: - version "0.8.3" - resolved "https://registry.yarnpkg.com/tinypool/-/tinypool-0.8.3.tgz#e17d0a5315a7d425f875b05f7af653c225492d39" - integrity sha512-Ud7uepAklqRH1bvwy22ynrliC7Dljz7Tm8M/0RBUW+YRa4YHhZ6e4PpgE+fu1zr/WqB1kbeuVrdfeuyIBpy4tw== +tinyexec@^0.3.1: + version "0.3.2" + resolved "https://registry.yarnpkg.com/tinyexec/-/tinyexec-0.3.2.tgz#941794e657a85e496577995c6eef66f53f42b3d2" + integrity sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA== -tinyspy@^2.2.0: - version "2.2.1" - resolved "https://registry.yarnpkg.com/tinyspy/-/tinyspy-2.2.1.tgz#117b2342f1f38a0dbdcc73a50a454883adf861d1" - integrity sha512-KYad6Vy5VDWV4GH3fjpseMQ/XU2BhIYP7Vzd0LG44qRWm/Yt2WCOTicFdvmgo6gWaqooMQCawTtILVQJupKu7A== +tinyglobby@^0.2.10: + version "0.2.10" + resolved "https://registry.yarnpkg.com/tinyglobby/-/tinyglobby-0.2.10.tgz#e712cf2dc9b95a1f5c5bbd159720e15833977a0f" + integrity sha512-Zc+8eJlFMvgatPZTl6A9L/yht8QqdmUNtURHaKZLmKBE12hNPSrqNkUp2cs3M/UKmNVVAMFQYSjYIVHDjW5zew== + dependencies: + fdir "^6.4.2" + picomatch "^4.0.2" + +tinypool@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/tinypool/-/tinypool-1.0.2.tgz#706193cc532f4c100f66aa00b01c42173d9051b2" + integrity sha512-al6n+QEANGFOMf/dmUMsuS5/r9B06uwlyNjZZql/zv8J7ybHCgoihBNORZCY2mzUuAnomQa2JdhyHKzZxPCrFA== + +tinyrainbow@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/tinyrainbow/-/tinyrainbow-1.2.0.tgz#5c57d2fc0fb3d1afd78465c33ca885d04f02abb5" + integrity sha512-weEDEq7Z5eTHPDh4xjX789+fHfF+P8boiFB+0vbWzpbnbsEr/GRaohi/uMKxg8RZMXnl1ItAi/IUHWMsjDV7kQ== + +tinyspy@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/tinyspy/-/tinyspy-3.0.2.tgz#86dd3cf3d737b15adcf17d7887c84a75201df20a" + integrity sha512-n1cw8k1k0x4pgA2+9XrOkFydTerNcJ1zWCO5Nn9scWHTD+5tp8dghT2x1uduQePZTZgd3Tupf+x9BxJjeJi77Q== to-regex-range@^5.0.1: version "5.0.1" @@ -4959,29 +4706,15 @@ to-regex-range@^5.0.1: dependencies: is-number "^7.0.0" +totalist@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/totalist/-/totalist-3.0.1.tgz#ba3a3d600c915b1a97872348f79c127475f6acf8" + integrity sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ== + ts-api-utils@^1.0.1, ts-api-utils@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/ts-api-utils/-/ts-api-utils-1.3.0.tgz#4b490e27129f1e8e686b45cc4ab63714dc60eea1" - integrity sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ== - -ts-node@^10.9.2: - version "10.9.2" - resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-10.9.2.tgz#70f021c9e185bccdca820e26dc413805c101c71f" - integrity sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ== - dependencies: - "@cspotcode/source-map-support" "^0.8.0" - "@tsconfig/node10" "^1.0.7" - "@tsconfig/node12" "^1.0.7" - "@tsconfig/node14" "^1.0.0" - "@tsconfig/node16" "^1.0.2" - acorn "^8.4.1" - acorn-walk "^8.1.1" - arg "^4.1.0" - create-require "^1.1.0" - diff "^4.0.1" - make-error "^1.1.1" - v8-compile-cache-lib "^3.0.1" - yn "3.1.1" + version "1.4.3" + resolved "https://registry.yarnpkg.com/ts-api-utils/-/ts-api-utils-1.4.3.tgz#bfc2215fe6528fecab2b0fba570a2e8a4263b064" + integrity sha512-i3eMG77UTMD0hZhgRS562pv83RC6ukSAC2GMNWc+9dieh/+jDM5u5YG+NHX6VNDRHQcHwmsTHctP9LhbC3WxVw== tsconfig-paths@^3.15.0: version "3.15.0" @@ -4993,18 +4726,18 @@ tsconfig-paths@^3.15.0: minimist "^1.2.6" strip-bom "^3.0.0" -tslib@^2.1.0, tslib@^2.5.0, tslib@^2.6.2: - version "2.6.3" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.3.tgz#0438f810ad7a9edcde7a241c3d80db693c8cbfe0" - integrity sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ== +tslib@^2.1.0, tslib@^2.5.0, tslib@^2.6.2, tslib@^2.7.0, tslib@^2.8.0: + version "2.8.1" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.8.1.tgz#612efe4ed235d567e8aba5f2a5fab70280ade83f" + integrity sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w== -tsx@^4.7.1: - version "4.7.1" - resolved "https://registry.yarnpkg.com/tsx/-/tsx-4.7.1.tgz#27af6cbf4e1cdfcb9b5425b1c61bb7e668eb5e84" - integrity sha512-8d6VuibXHtlN5E3zFkgY8u4DX7Y3Z27zvvPKVmLon/D4AjuKzarkUBTLDBgj9iTQ0hg5xM7c/mYiRVM+HETf0g== +tsx@^4.19.2: + version "4.19.2" + resolved "https://registry.yarnpkg.com/tsx/-/tsx-4.19.2.tgz#2d7814783440e0ae42354d0417d9c2989a2ae92c" + integrity sha512-pOUl6Vo2LUq/bSa8S5q7b91cgNSjctn9ugq/+Mvow99qW6x/UZYwzxy/3NmqoT66eHYfCVvFvACC58UBPFf28g== dependencies: - esbuild "~0.19.10" - get-tsconfig "^4.7.2" + esbuild "~0.23.0" + get-tsconfig "^4.7.5" optionalDependencies: fsevents "~2.3.3" @@ -5022,11 +4755,6 @@ type-check@^0.4.0, type-check@~0.4.0: dependencies: prelude-ls "^1.2.1" -type-detect@^4.0.0, type-detect@^4.0.8: - version "4.0.8" - resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" - integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== - type-fest@^0.13.1: version "0.13.1" resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.13.1.tgz#0172cb5bce80b0bd542ea348db50c7e21834d934" @@ -5037,49 +4765,50 @@ type-fest@^0.20.2: resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== -typed-array-buffer@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz#1867c5d83b20fcb5ccf32649e5e2fc7424474ff3" - integrity sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ== +typed-array-buffer@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz#a72395450a4869ec033fd549371b47af3a2ee536" + integrity sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw== dependencies: - call-bind "^1.0.7" + call-bound "^1.0.3" es-errors "^1.3.0" - is-typed-array "^1.1.13" + is-typed-array "^1.1.14" -typed-array-byte-length@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz#d92972d3cff99a3fa2e765a28fcdc0f1d89dec67" - integrity sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw== +typed-array-byte-length@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/typed-array-byte-length/-/typed-array-byte-length-1.0.3.tgz#8407a04f7d78684f3d252aa1a143d2b77b4160ce" + integrity sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg== dependencies: - call-bind "^1.0.7" + call-bind "^1.0.8" for-each "^0.3.3" - gopd "^1.0.1" - has-proto "^1.0.3" - is-typed-array "^1.1.13" + gopd "^1.2.0" + has-proto "^1.2.0" + is-typed-array "^1.1.14" -typed-array-byte-offset@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz#f9ec1acb9259f395093e4567eb3c28a580d02063" - integrity sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA== +typed-array-byte-offset@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/typed-array-byte-offset/-/typed-array-byte-offset-1.0.4.tgz#ae3698b8ec91a8ab945016108aef00d5bff12355" + integrity sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ== dependencies: available-typed-arrays "^1.0.7" - call-bind "^1.0.7" + call-bind "^1.0.8" for-each "^0.3.3" - gopd "^1.0.1" - has-proto "^1.0.3" - is-typed-array "^1.1.13" + gopd "^1.2.0" + has-proto "^1.2.0" + is-typed-array "^1.1.15" + reflect.getprototypeof "^1.0.9" -typed-array-length@^1.0.5, typed-array-length@^1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/typed-array-length/-/typed-array-length-1.0.6.tgz#57155207c76e64a3457482dfdc1c9d1d3c4c73a3" - integrity sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g== +typed-array-length@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/typed-array-length/-/typed-array-length-1.0.7.tgz#ee4deff984b64be1e118b0de8c9c877d5ce73d3d" + integrity sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg== dependencies: call-bind "^1.0.7" for-each "^0.3.3" gopd "^1.0.1" - has-proto "^1.0.3" is-typed-array "^1.1.13" possible-typed-array-names "^1.0.0" + reflect.getprototypeof "^1.0.6" typeorm@^0.3.20: version "0.3.20" @@ -5103,29 +4832,34 @@ typeorm@^0.3.20: yargs "^17.6.2" typescript@*: - version "5.4.3" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.4.3.tgz#5c6fedd4c87bee01cd7a528a30145521f8e0feff" - integrity sha512-KrPd3PKaCLr78MalgiwJnA25Nm8HAmdwN3mYUYZgG/wizIo9EainNVQI9/yDavtVFRN2h3k8uf3GLHuhDMgEHg== + version "5.7.3" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.7.3.tgz#919b44a7dbb8583a9b856d162be24a54bf80073e" + integrity sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw== -ufo@^1.3.2: - version "1.5.3" - resolved "https://registry.yarnpkg.com/ufo/-/ufo-1.5.3.tgz#3325bd3c977b6c6cd3160bf4ff52989adc9d3344" - integrity sha512-Y7HYmWaFwPUmkoQCUIAYpKqkOf+SbVj/2fJJZ4RJMCfZp0rTGwRbzQD+HghfnhKOjL9E01okqz+ncJskGYfBNw== - -unbox-primitive@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.2.tgz#29032021057d5e6cdbd08c5129c226dff8ed6f9e" - integrity sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw== +unbox-primitive@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.1.0.tgz#8d9d2c9edeea8460c7f35033a88867944934d1e2" + integrity sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw== dependencies: - call-bind "^1.0.2" + call-bound "^1.0.3" has-bigints "^1.0.2" - has-symbols "^1.0.3" - which-boxed-primitive "^1.0.2" + has-symbols "^1.1.0" + which-boxed-primitive "^1.1.1" + +undici-types@~6.19.2: + version "6.19.8" + resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-6.19.8.tgz#35111c9d1437ab83a7cdc0abae2f26d88eda0a02" + integrity sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw== + +undici-types@~6.20.0: + version "6.20.0" + resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-6.20.0.tgz#8171bf22c1f588d1554d55bf204bc624af388433" + integrity sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg== -undici-types@~5.26.4: - version "5.26.5" - resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-5.26.5.tgz#bcd539893d00b56e964fd2657a4866b221a65617" - integrity sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA== +unicorn-magic@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/unicorn-magic/-/unicorn-magic-0.3.0.tgz#4efd45c85a69e0dd576d25532fbfa22aa5c8a104" + integrity sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA== unique-filename@^1.1.1: version "1.1.1" @@ -5158,94 +4892,90 @@ uuid@^9.0.0: resolved "https://registry.yarnpkg.com/uuid/-/uuid-9.0.1.tgz#e188d4c8853cc722220392c424cd637f32293f30" integrity sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA== -v8-compile-cache-lib@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz#6336e8d71965cb3d35a1bbb7868445a7c05264bf" - integrity sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg== - -vite-node@1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/vite-node/-/vite-node-1.4.0.tgz#265529d60570ca695ceb69391f87f92847934ad8" - integrity sha512-VZDAseqjrHgNd4Kh8icYHWzTKSCZMhia7GyHfhtzLW33fZlG9SwsB6CEhgyVOWkJfJ2pFLrp/Gj1FSfAiqH9Lw== +vite-node@2.1.8: + version "2.1.8" + resolved "https://registry.yarnpkg.com/vite-node/-/vite-node-2.1.8.tgz#9495ca17652f6f7f95ca7c4b568a235e0c8dbac5" + integrity sha512-uPAwSr57kYjAUux+8E2j0q0Fxpn8M9VoyfGiRI8Kfktz9NcYMCenwY5RnZxnF1WTu3TGiYipirIzacLL3VVGFg== dependencies: cac "^6.7.14" - debug "^4.3.4" - pathe "^1.1.1" - picocolors "^1.0.0" + debug "^4.3.7" + es-module-lexer "^1.5.4" + pathe "^1.1.2" vite "^5.0.0" vite@^5.0.0: - version "5.2.6" - resolved "https://registry.yarnpkg.com/vite/-/vite-5.2.6.tgz#fc2ce309e0b4871e938cb0aca3b96c422c01f222" - integrity sha512-FPtnxFlSIKYjZ2eosBQamz4CbyrTizbZ3hnGJlh/wMtCrlp1Hah6AzBLjGI5I2urTfNnpovpHdrL6YRuBOPnCA== + version "5.4.11" + resolved "https://registry.yarnpkg.com/vite/-/vite-5.4.11.tgz#3b415cd4aed781a356c1de5a9ebafb837715f6e5" + integrity sha512-c7jFQRklXua0mTzneGW9QVyxFjUgwcihC4bXEtujIo2ouWCe1Ajt/amn2PCxYnhYfd5k09JX3SB7OYWFKYqj8Q== dependencies: - esbuild "^0.20.1" - postcss "^8.4.36" - rollup "^4.13.0" + esbuild "^0.21.3" + postcss "^8.4.43" + rollup "^4.20.0" optionalDependencies: fsevents "~2.3.3" -vitest@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/vitest/-/vitest-1.4.0.tgz#f5c812aaf5023818b89b7fc667fa45327396fece" - integrity sha512-gujzn0g7fmwf83/WzrDTnncZt2UiXP41mHuFYFrdwaLRVQ6JYQEiME2IfEjU3vcFL3VKa75XhI3lFgn+hfVsQw== - dependencies: - "@vitest/expect" "1.4.0" - "@vitest/runner" "1.4.0" - "@vitest/snapshot" "1.4.0" - "@vitest/spy" "1.4.0" - "@vitest/utils" "1.4.0" - acorn-walk "^8.3.2" - chai "^4.3.10" - debug "^4.3.4" - execa "^8.0.1" - local-pkg "^0.5.0" - magic-string "^0.30.5" - pathe "^1.1.1" - picocolors "^1.0.0" - std-env "^3.5.0" - strip-literal "^2.0.0" - tinybench "^2.5.1" - tinypool "^0.8.2" +vitest@^2.1.8: + version "2.1.8" + resolved "https://registry.yarnpkg.com/vitest/-/vitest-2.1.8.tgz#2e6a00bc24833574d535c96d6602fb64163092fa" + integrity sha512-1vBKTZskHw/aosXqQUlVWWlGUxSJR8YtiyZDJAFeW2kPAeX6S3Sool0mjspO+kXLuxVWlEDDowBAeqeAQefqLQ== + dependencies: + "@vitest/expect" "2.1.8" + "@vitest/mocker" "2.1.8" + "@vitest/pretty-format" "^2.1.8" + "@vitest/runner" "2.1.8" + "@vitest/snapshot" "2.1.8" + "@vitest/spy" "2.1.8" + "@vitest/utils" "2.1.8" + chai "^5.1.2" + debug "^4.3.7" + expect-type "^1.1.0" + magic-string "^0.30.12" + pathe "^1.1.2" + std-env "^3.8.0" + tinybench "^2.9.0" + tinyexec "^0.3.1" + tinypool "^1.0.1" + tinyrainbow "^1.2.0" vite "^5.0.0" - vite-node "1.4.0" - why-is-node-running "^2.2.2" + vite-node "2.1.8" + why-is-node-running "^2.3.0" web-streams-polyfill@^3.0.3: version "3.3.3" resolved "https://registry.yarnpkg.com/web-streams-polyfill/-/web-streams-polyfill-3.3.3.tgz#2073b91a2fdb1fbfbd401e7de0ac9f8214cecb4b" integrity sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw== -which-boxed-primitive@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz#13757bc89b209b049fe5d86430e21cf40a89a8e6" - integrity sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg== +which-boxed-primitive@^1.1.0, which-boxed-primitive@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz#d76ec27df7fa165f18d5808374a5fe23c29b176e" + integrity sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA== dependencies: - is-bigint "^1.0.1" - is-boolean-object "^1.1.0" - is-number-object "^1.0.4" - is-string "^1.0.5" - is-symbol "^1.0.3" + is-bigint "^1.1.0" + is-boolean-object "^1.2.1" + is-number-object "^1.1.1" + is-string "^1.1.1" + is-symbol "^1.1.1" -which-builtin-type@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/which-builtin-type/-/which-builtin-type-1.1.3.tgz#b1b8443707cc58b6e9bf98d32110ff0c2cbd029b" - integrity sha512-YmjsSMDBYsM1CaFiayOVT06+KJeXf0o5M/CAd4o1lTadFAtacTUM49zoYxr/oroopFDfhvN6iEcBxUyc3gvKmw== +which-builtin-type@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/which-builtin-type/-/which-builtin-type-1.2.1.tgz#89183da1b4907ab089a6b02029cc5d8d6574270e" + integrity sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q== dependencies: - function.prototype.name "^1.1.5" - has-tostringtag "^1.0.0" + call-bound "^1.0.2" + function.prototype.name "^1.1.6" + has-tostringtag "^1.0.2" is-async-function "^2.0.0" - is-date-object "^1.0.5" - is-finalizationregistry "^1.0.2" + is-date-object "^1.1.0" + is-finalizationregistry "^1.1.0" is-generator-function "^1.0.10" - is-regex "^1.1.4" + is-regex "^1.2.1" is-weakref "^1.0.2" isarray "^2.0.5" - which-boxed-primitive "^1.0.2" - which-collection "^1.0.1" - which-typed-array "^1.1.9" + which-boxed-primitive "^1.1.0" + which-collection "^1.0.2" + which-typed-array "^1.1.16" -which-collection@^1.0.1: +which-collection@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/which-collection/-/which-collection-1.0.2.tgz#627ef76243920a107e7ce8e96191debe4b16c2a0" integrity sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw== @@ -5255,15 +4985,16 @@ which-collection@^1.0.1: is-weakmap "^2.0.2" is-weakset "^2.0.3" -which-typed-array@^1.1.14, which-typed-array@^1.1.15, which-typed-array@^1.1.9: - version "1.1.15" - resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.15.tgz#264859e9b11a649b388bfaaf4f767df1f779b38d" - integrity sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA== +which-typed-array@^1.1.16, which-typed-array@^1.1.18: + version "1.1.18" + resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.18.tgz#df2389ebf3fbb246a71390e90730a9edb6ce17ad" + integrity sha512-qEcY+KJYlWyLH9vNbsr6/5j59AXk5ni5aakf8ldzBvGde6Iz4sxZGkJyWSAueTG7QhOvNRYb1lDdFmL5Td0QKA== dependencies: available-typed-arrays "^1.0.7" - call-bind "^1.0.7" + call-bind "^1.0.8" + call-bound "^1.0.3" for-each "^0.3.3" - gopd "^1.0.1" + gopd "^1.2.0" has-tostringtag "^1.0.2" which@^2.0.1, which@^2.0.2: @@ -5273,10 +5004,10 @@ which@^2.0.1, which@^2.0.2: dependencies: isexe "^2.0.0" -why-is-node-running@^2.2.2: - version "2.2.2" - resolved "https://registry.yarnpkg.com/why-is-node-running/-/why-is-node-running-2.2.2.tgz#4185b2b4699117819e7154594271e7e344c9973e" - integrity sha512-6tSwToZxTOcotxHeA+qGCq1mVzKR3CwcJGmVcY+QE8SHy6TnpFnh8PAvPNHYr7EcuVeG0QSMxtYCuO1ta/G/oA== +why-is-node-running@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/why-is-node-running/-/why-is-node-running-2.3.0.tgz#a3f69a97107f494b3cdc3bdddd883a7d65cebf04" + integrity sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w== dependencies: siginfo "^2.0.0" stackback "0.0.2" @@ -5288,6 +5019,11 @@ wide-align@^1.1.5: dependencies: string-width "^1.0.2 || 2 || 3 || 4" +word-wrap@^1.2.5: + version "1.2.5" + resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.5.tgz#d2c45c6dd4fbce621a66f136cbe328afd0410b34" + integrity sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA== + "wrap-ansi-cjs@npm:wrap-ansi@^7.0.0": version "7.0.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" @@ -5320,10 +5056,10 @@ wrappy@1: resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== -ws@^8.15.1, ws@^8.16.0, ws@^8.8.1: - version "8.17.1" - resolved "https://registry.yarnpkg.com/ws/-/ws-8.17.1.tgz#9293da530bb548febc95371d90f9c878727d919b" - integrity sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ== +ws@^8.18.0, ws@^8.8.1: + version "8.18.0" + resolved "https://registry.yarnpkg.com/ws/-/ws-8.18.0.tgz#0d7505a6eafe2b0e712d232b42279f53bc289bbc" + integrity sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw== y18n@^5.0.5: version "5.0.8" @@ -5371,22 +5107,17 @@ yargs@^17.6.2, yargs@^17.7.2: y18n "^5.0.5" yargs-parser "^21.1.1" -yn@3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50" - integrity sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q== - yocto-queue@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== -yocto-queue@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-1.0.0.tgz#7f816433fb2cbc511ec8bf7d263c3b58a1a3c251" - integrity sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g== +yoctocolors@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/yoctocolors/-/yoctocolors-2.1.1.tgz#e0167474e9fbb9e8b3ecca738deaa61dd12e56fc" + integrity sha512-GQHQqAopRhwU8Kt1DDM8NjibDXHC8eoh1erhGAJPEyveY9qqVeXvVikNKrDz69sHowPMorbPUrH/mx8c50eiBQ== -zod@^3.22.4: - version "3.23.8" - resolved "https://registry.yarnpkg.com/zod/-/zod-3.23.8.tgz#e37b957b5d52079769fb8097099b592f0ef4067d" - integrity sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g== +zod@^3.23.8: + version "3.24.1" + resolved "https://registry.yarnpkg.com/zod/-/zod-3.24.1.tgz#27445c912738c8ad1e9de1bea0359fa44d9d35ee" + integrity sha512-muH7gBL9sI1nciMZV67X5fTKKBLtwpZ5VBp1vsOQzj1MhrBZ4wlVCm3gedKZWLp0Oyel8sIGfeiz54Su+OVT+A==